102
109
item = (SPItem *) object;
104
111
/* Item dialog */
105
w = gtk_menu_item_new_with_mnemonic(_("Object _Properties"));
106
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
107
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_properties), item);
112
w = gtk_menu_item_new_with_mnemonic(_("_Object Properties..."));
113
g_object_set_data(G_OBJECT(w), "desktop", desktop);
114
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_properties), item);
108
115
gtk_widget_show(w);
109
gtk_menu_append(GTK_MENU(m), w);
116
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
111
118
w = gtk_menu_item_new();
112
119
gtk_widget_show(w);
113
gtk_menu_append(GTK_MENU(m), w);
120
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
114
121
/* Select item */
115
122
w = gtk_menu_item_new_with_mnemonic(_("_Select This"));
116
123
if (sp_desktop_selection(desktop)->includes(item)) {
117
124
gtk_widget_set_sensitive(w, FALSE);
119
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
120
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_select_this), item);
126
g_object_set_data(G_OBJECT(w), "desktop", desktop);
127
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_select_this), item);
122
129
gtk_widget_show(w);
123
gtk_menu_append(GTK_MENU(m), w);
130
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
124
131
/* Create link */
125
132
w = gtk_menu_item_new_with_mnemonic(_("_Create Link"));
126
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
127
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_item_create_link), item);
133
g_object_set_data(G_OBJECT(w), "desktop", desktop);
134
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_create_link), item);
128
135
gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
129
136
gtk_widget_show(w);
130
gtk_menu_append(GTK_MENU(m), w);
137
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
132
139
w = gtk_menu_item_new_with_mnemonic(_("Set Mask"));
133
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
134
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_set_mask), item);
140
g_object_set_data(G_OBJECT(w), "desktop", desktop);
141
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_mask), item);
135
142
if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
136
143
gtk_widget_set_sensitive(w, FALSE);
138
145
gtk_widget_set_sensitive(w, TRUE);
140
147
gtk_widget_show(w);
141
gtk_menu_append(GTK_MENU(m), w);
148
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
142
149
/* Release mask */
143
150
w = gtk_menu_item_new_with_mnemonic(_("Release Mask"));
144
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
145
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_release_mask), item);
151
g_object_set_data(G_OBJECT(w), "desktop", desktop);
152
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_mask), item);
146
153
if (item && item->mask_ref && item->mask_ref->getObject()) {
147
154
gtk_widget_set_sensitive(w, TRUE);
149
156
gtk_widget_set_sensitive(w, FALSE);
151
158
gtk_widget_show(w);
152
gtk_menu_append(GTK_MENU(m), w);
159
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
154
w = gtk_menu_item_new_with_mnemonic(_("Set Clip"));
155
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
156
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_set_clip), item);
161
w = gtk_menu_item_new_with_mnemonic(_("Set _Clip"));
162
g_object_set_data(G_OBJECT(w), "desktop", desktop);
163
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_clip), item);
157
164
if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
158
165
gtk_widget_set_sensitive(w, FALSE);
160
167
gtk_widget_set_sensitive(w, TRUE);
162
169
gtk_widget_show(w);
163
gtk_menu_append(GTK_MENU(m), w);
170
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
164
171
/* Release Clip */
165
w = gtk_menu_item_new_with_mnemonic(_("Release Clip"));
166
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
167
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_release_clip), item);
172
w = gtk_menu_item_new_with_mnemonic(_("Release C_lip"));
173
g_object_set_data(G_OBJECT(w), "desktop", desktop);
174
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_clip), item);
168
175
if (item && item->clip_ref && item->clip_ref->getObject()) {
169
176
gtk_widget_set_sensitive(w, TRUE);
171
178
gtk_widget_set_sensitive(w, FALSE);
173
180
gtk_widget_show(w);
174
gtk_menu_append(GTK_MENU(m), w);
181
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
266
273
g_assert(SP_IS_ITEM(item));
267
274
g_assert(!SP_IS_ANCHOR(item));
269
SPDesktop *desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
276
SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
270
277
g_return_if_fail(desktop != NULL);
272
Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc());
279
Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
273
280
Inkscape::XML::Node *repr = xml_doc->createElement("svg:a");
274
SP_OBJECT_REPR(SP_OBJECT_PARENT(item))->addChild(repr, SP_OBJECT_REPR(item));
275
SPObject *object = SP_OBJECT_DOCUMENT(item)->getObjectByRepr(repr);
281
item->parent->getRepr()->addChild(repr, item->getRepr());
282
SPObject *object = item->document->getObjectByRepr(repr);
276
283
g_return_if_fail(SP_IS_ANCHOR(object));
278
const char *id = SP_OBJECT_REPR(item)->attribute("id");
279
Inkscape::XML::Node *child = SP_OBJECT_REPR(item)->duplicate(xml_doc);
280
SP_OBJECT(item)->deleteObject(false);
285
const char *id = item->getRepr()->attribute("id");
286
Inkscape::XML::Node *child = item->getRepr()->duplicate(xml_doc);
287
item->deleteObject(false);
281
288
repr->addChild(child, NULL);
282
289
child->setAttribute("id", id);
284
291
Inkscape::GC::release(repr);
285
292
Inkscape::GC::release(child);
287
sp_document_done(SP_OBJECT_DOCUMENT(object), SP_VERB_NONE,
294
DocumentUndo::done(object->document, SP_VERB_NONE,
290
297
sp_object_attributes_dialog(object, "SPAnchor");
343
350
item = (SPItem *) object;
345
352
/* Link dialog */
346
w = gtk_menu_item_new_with_mnemonic(_("Link _Properties"));
347
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
348
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_properties), item);
353
w = gtk_menu_item_new_with_mnemonic(_("Link _Properties..."));
354
g_object_set_data(G_OBJECT(w), "desktop", desktop);
355
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_properties), item);
349
356
gtk_widget_show(w);
350
gtk_menu_append(GTK_MENU(m), w);
357
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
351
358
/* Select item */
352
359
w = gtk_menu_item_new_with_mnemonic(_("_Follow Link"));
353
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_follow), item);
360
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_follow), item);
354
361
gtk_widget_show(w);
355
gtk_menu_append(GTK_MENU(m), w);
362
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
356
363
/* Reset transformations */
357
364
w = gtk_menu_item_new_with_mnemonic(_("_Remove Link"));
358
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
359
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_anchor_link_remove), item);
365
g_object_set_data(G_OBJECT(w), "desktop", desktop);
366
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_remove), item);
360
367
gtk_widget_show(w);
361
gtk_menu_append(GTK_MENU(m), w);
368
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
365
372
sp_anchor_link_properties(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
367
sp_object_attributes_dialog(SP_OBJECT(anchor), "Link");
374
sp_object_attributes_dialog(anchor, "Link");
404
411
/* Link dialog */
405
w = gtk_menu_item_new_with_mnemonic(_("Image _Properties"));
406
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
407
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_image_image_properties), item);
412
w = gtk_menu_item_new_with_mnemonic(_("Image _Properties..."));
413
g_object_set_data(G_OBJECT(w), "desktop", desktop);
414
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_properties), item);
408
415
gtk_widget_show(w);
409
gtk_menu_append(GTK_MENU(m), w);
416
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
411
418
w = gtk_menu_item_new_with_mnemonic(_("Edit Externally..."));
412
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
413
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_image_image_edit), item);
419
g_object_set_data(G_OBJECT(w), "desktop", desktop);
420
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_edit), item);
414
421
gtk_widget_show(w);
415
gtk_menu_append(GTK_MENU(m), w);
416
Inkscape::XML::Node *ir = SP_OBJECT_REPR(object);
422
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
423
Inkscape::XML::Node *ir = object->getRepr();
417
424
const gchar *href = ir->attribute("xlink:href");
418
425
if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
419
426
gtk_widget_set_sensitive( w, FALSE );
449
449
static void sp_image_image_edit(GtkMenuItem *menuitem, SPAnchor *anchor)
451
SPObject* obj = SP_OBJECT(anchor);
452
Inkscape::XML::Node *ir = SP_OBJECT_REPR(obj);
451
SPObject* obj = anchor;
452
Inkscape::XML::Node *ir = obj->getRepr();
453
453
const gchar *href = ir->attribute("xlink:href");
455
455
GError* errThing = 0;
456
gchar* editorBin = getImageEditorName();
457
gchar const* args[] = {editorBin, href, 0};
458
g_spawn_async(0, // working dir
459
const_cast<gchar **>(args),
456
Glib::ustring cmdline = getImageEditorName();
457
Glib::ustring fullname;
460
// g_spawn_command_line_sync parsing is done according to Unix shell rules,
461
// not Windows command interpreter rules. Thus we need to enclose the
462
// executable path with sigle quotes.
463
int index = cmdline.find(".exe");
464
if ( index < 0 ) index = cmdline.find(".bat");
465
if ( index < 0 ) index = cmdline.find(".com");
467
Glib::ustring editorBin = cmdline.substr(0, index + 4).c_str();
468
Glib::ustring args = cmdline.substr(index + 4, cmdline.length()).c_str();
469
editorBin.insert(0, "'");
470
editorBin.append("'");
472
cmdline.append(args);
474
// Enclose the whole command line if no executable path can be extracted.
475
cmdline.insert(0, "'");
480
if (strncmp (href,"file:",5) == 0) {
481
// URI to filename conversion
482
fullname = g_filename_from_uri(href, NULL, NULL);
484
fullname.append(href);
487
cmdline.append(" '");
488
cmdline.append(fullname.c_str());
491
//printf("##Command line: %s\n", cmdline.c_str());
493
g_spawn_command_line_async(cmdline.c_str(),
466
496
if ( errThing ) {
467
497
g_warning("Problem launching editor (%d). %s", errThing->code, errThing->message);
468
SPDesktop *desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
498
SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
469
499
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, errThing->message);
470
500
g_error_free(errThing);
505
/* Fill and Stroke entry */
508
sp_fill_settings(GtkMenuItem *menuitem, SPItem *item)
512
g_assert(SP_IS_ITEM(item));
514
desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
515
g_return_if_fail(desktop != NULL);
517
if (sp_desktop_selection(desktop)->isEmpty()) {
518
sp_desktop_selection(desktop)->set(item);
521
desktop->_dlg_mgr->showDialog("FillAndStroke");
479
sp_shape_fill_settings(GtkMenuItem *menuitem, SPItem *item)
483
g_assert(SP_IS_ITEM(item));
485
desktop = (SPDesktop*)gtk_object_get_data(GTK_OBJECT(menuitem), "desktop");
486
g_return_if_fail(desktop != NULL);
488
if (sp_desktop_selection(desktop)->isEmpty()) {
489
sp_desktop_selection(desktop)->set(item);
492
desktop->_dlg_mgr->showDialog("FillAndStroke");
496
527
sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
501
532
item = (SPItem *) object;
503
534
/* Item dialog */
504
w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke"));
505
gtk_object_set_data(GTK_OBJECT(w), "desktop", desktop);
506
gtk_signal_connect(GTK_OBJECT(w), "activate", GTK_SIGNAL_FUNC(sp_shape_fill_settings), item);
508
gtk_menu_append(GTK_MENU(m), w);
535
w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
536
g_object_set_data(G_OBJECT(w), "desktop", desktop);
537
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
539
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
542
/* Edit Text entry */
545
sp_text_settings(GtkMenuItem *menuitem, SPItem *item)
549
g_assert(SP_IS_ITEM(item));
551
desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
552
g_return_if_fail(desktop != NULL);
554
if (sp_desktop_selection(desktop)->isEmpty()) {
555
sp_desktop_selection(desktop)->set(item);
558
sp_text_edit_dialog();
561
/* Spellcheck entry */
564
sp_spellcheck_settings(GtkMenuItem *menuitem, SPItem *item)
568
g_assert(SP_IS_ITEM(item));
570
desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
571
g_return_if_fail(desktop != NULL);
573
if (sp_desktop_selection(desktop)->isEmpty()) {
574
sp_desktop_selection(desktop)->set(item);
577
sp_spellcheck_dialog();
583
sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
588
item = (SPItem *) object;
590
/* Fill and Stroke dialog */
591
w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
592
g_object_set_data(G_OBJECT(w), "desktop", desktop);
593
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
595
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
597
/* Edit Text dialog */
598
w = gtk_menu_item_new_with_mnemonic(_("_Text and Font..."));
599
g_object_set_data(G_OBJECT(w), "desktop", desktop);
600
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_text_settings), item);
602
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
604
/* Spellcheck dialog */
605
w = gtk_menu_item_new_with_mnemonic(_("Check Spellin_g..."));
606
g_object_set_data(G_OBJECT(w), "desktop", desktop);
607
g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_spellcheck_settings), item);
609
gtk_menu_shell_append(GTK_MENU_SHELL(m), w);