1 #define __SP_VERBS_C__
2 /**
3 * \file verbs.cpp
4 *
5 * \brief Actions for inkscape
6 *
7 * This file implements routines necessary to deal with verbs. A verb
8 * is a numeric identifier used to retrieve standard SPActions for particular
9 * views.
10 */
12 /*
13 * Authors:
14 * Lauris Kaplinski <lauris@kaplinski.com>
15 * Ted Gould <ted@gould.cx>
16 * MenTaLguY <mental@rydia.net>
17 * David Turner <novalis@gnu.org>
18 * bulia byak <buliabyak@users.sf.net>
19 *
20 * Copyright (C) 2006 Johan Engelen <johan@shouraizou.nl>
21 * Copyright (C) (date unspecified) Authors
22 * This code is in public domain.
23 */
28 #include <gtk/gtkstock.h>
30 #ifdef HAVE_CONFIG_H
31 # include "config.h"
32 #endif
34 #include "helper/action.h"
36 #include <gtkmm/messagedialog.h>
37 #include <gtkmm/filechooserdialog.h>
38 #include <gtkmm/stock.h>
40 #include "dialogs/text-edit.h"
41 #include "dialogs/xml-tree.h"
42 #include "dialogs/object-properties.h"
43 #include "dialogs/item-properties.h"
44 #include "dialogs/find.h"
45 #include "dialogs/layer-properties.h"
46 #include "dialogs/clonetiler.h"
47 #include "dialogs/iconpreview.h"
48 #include "dialogs/extensions.h"
49 #include "dialogs/swatches.h"
50 #include "dialogs/layers-panel.h"
51 #include "dialogs/input.h"
53 #ifdef WITH_INKBOARD
54 #include "jabber_whiteboard/session-manager.h"
55 #endif
57 #include "extension/effect.h"
59 #include "tools-switch.h"
60 #include "inkscape-private.h"
61 #include "file.h"
62 #include "help.h"
63 #include "document.h"
64 #include "desktop.h"
65 #include "message-stack.h"
66 #include "desktop-handles.h"
67 #include "selection-chemistry.h"
68 #include "path-chemistry.h"
69 #include "text-chemistry.h"
70 #include "ui/dialog/dialog-manager.h"
71 #include "ui/dialog/inkscape-preferences.h"
72 #include "interface.h"
73 #include "prefs-utils.h"
74 #include "splivarot.h"
75 #include "sp-namedview.h"
76 #include "sp-flowtext.h"
77 #include "layer-fns.h"
78 #include "node-context.h"
79 #include "select-context.h"
80 #include "seltrans.h"
81 #include "gradient-context.h"
82 #include "shape-editor.h"
83 #include "draw-context.h"
86 /**
87 * \brief Return the name without underscores and ellipsis, for use in dialog
88 * titles, etc. Allocated memory must be freed by caller.
89 */
90 gchar *
91 sp_action_get_title(SPAction const *action)
92 {
93 char const *src = action->name;
94 gchar *ret = g_new(gchar, strlen(src) + 1);
95 unsigned ri = 0;
97 for (unsigned si = 0 ; ; si++) {
98 int const c = src[si];
99 if ( c != '_' && c != '.' ) {
100 ret[ri] = c;
101 ri++;
102 if (c == '\0') {
103 return ret;
104 }
105 }
106 }
108 } // end of sp_action_get_title()
111 namespace Inkscape {
113 /// \todo !!!FIXME:: kill this, use DialogManager instead!!!
115 class PanelDialog : public Inkscape::UI::Dialog::Dialog
116 {
117 public:
118 PanelDialog(char const *prefs_path, int const verb_num) : Dialog(prefs_path, verb_num) {}
119 /*
120 virtual Glib::ustring getName() const {return "foo";}
121 virtual Glib::ustring getDesc() const {return "bar";}
122 */
123 };
125 /** \brief Utility function to get a panel displayed. */
126 static void show_panel( Inkscape::UI::Widget::Panel &panel, char const *prefs_path, int const verb_num )
127 {
128 Gtk::Container *container = panel.get_toplevel();
129 if ( &panel == container ) { // safe check?
130 //g_message("Creating new dialog to hold it");
131 PanelDialog *dia = new PanelDialog(prefs_path, verb_num);
132 Gtk::VBox *mainVBox = dia->get_vbox();
133 mainVBox->pack_start(panel);
134 dia->show_all_children();
135 dia->read_geometry();
136 dia->present();
137 } else {
138 PanelDialog *dia = dynamic_cast<PanelDialog*>(container);
139 if ( dia ) {
140 //g_message("Found an existing dialog");
141 dia->read_geometry();
142 dia->present();
143 } else {
144 g_message("Failed to find an existing dialog");
145 }
146 }
147 }
149 /** \brief A class to encompass all of the verbs which deal with
150 file operations. */
151 class FileVerb : public Verb {
152 private:
153 static void perform(SPAction *action, void *mydata, void *otherdata);
154 static SPActionEventVector vector;
155 protected:
156 virtual SPAction *make_action(Inkscape::UI::View::View *view);
157 public:
158 /** \brief Use the Verb initializer with the same parameters. */
159 FileVerb(unsigned int const code,
160 gchar const *id,
161 gchar const *name,
162 gchar const *tip,
163 gchar const *image) :
164 Verb(code, id, name, tip, image)
165 { }
166 }; /* FileVerb class */
168 /** \brief A class to encompass all of the verbs which deal with
169 edit operations. */
170 class EditVerb : public Verb {
171 private:
172 static void perform(SPAction *action, void *mydata, void *otherdata);
173 static SPActionEventVector vector;
174 protected:
175 virtual SPAction *make_action(Inkscape::UI::View::View *view);
176 public:
177 /** \brief Use the Verb initializer with the same parameters. */
178 EditVerb(unsigned int const code,
179 gchar const *id,
180 gchar const *name,
181 gchar const *tip,
182 gchar const *image) :
183 Verb(code, id, name, tip, image)
184 { }
185 }; /* EditVerb class */
187 /** \brief A class to encompass all of the verbs which deal with
188 selection operations. */
189 class SelectionVerb : public Verb {
190 private:
191 static void perform(SPAction *action, void *mydata, void *otherdata);
192 static SPActionEventVector vector;
193 protected:
194 virtual SPAction *make_action(Inkscape::UI::View::View *view);
195 public:
196 /** \brief Use the Verb initializer with the same parameters. */
197 SelectionVerb(unsigned int const code,
198 gchar const *id,
199 gchar const *name,
200 gchar const *tip,
201 gchar const *image) :
202 Verb(code, id, name, tip, image)
203 { }
204 }; /* SelectionVerb class */
206 /** \brief A class to encompass all of the verbs which deal with
207 layer operations. */
208 class LayerVerb : public Verb {
209 private:
210 static void perform(SPAction *action, void *mydata, void *otherdata);
211 static SPActionEventVector vector;
212 protected:
213 virtual SPAction *make_action(Inkscape::UI::View::View *view);
214 public:
215 /** \brief Use the Verb initializer with the same parameters. */
216 LayerVerb(unsigned int const code,
217 gchar const *id,
218 gchar const *name,
219 gchar const *tip,
220 gchar const *image) :
221 Verb(code, id, name, tip, image)
222 { }
223 }; /* LayerVerb class */
225 /** \brief A class to encompass all of the verbs which deal with
226 operations related to objects. */
227 class ObjectVerb : public Verb {
228 private:
229 static void perform(SPAction *action, void *mydata, void *otherdata);
230 static SPActionEventVector vector;
231 protected:
232 virtual SPAction *make_action(Inkscape::UI::View::View *view);
233 public:
234 /** \brief Use the Verb initializer with the same parameters. */
235 ObjectVerb(unsigned int const code,
236 gchar const *id,
237 gchar const *name,
238 gchar const *tip,
239 gchar const *image) :
240 Verb(code, id, name, tip, image)
241 { }
242 }; /* ObjectVerb class */
244 /** \brief A class to encompass all of the verbs which deal with
245 operations relative to context. */
246 class ContextVerb : public Verb {
247 private:
248 static void perform(SPAction *action, void *mydata, void *otherdata);
249 static SPActionEventVector vector;
250 protected:
251 virtual SPAction *make_action(Inkscape::UI::View::View *view);
252 public:
253 /** \brief Use the Verb initializer with the same parameters. */
254 ContextVerb(unsigned int const code,
255 gchar const *id,
256 gchar const *name,
257 gchar const *tip,
258 gchar const *image) :
259 Verb(code, id, name, tip, image)
260 { }
261 }; /* ContextVerb class */
263 /** \brief A class to encompass all of the verbs which deal with
264 zoom operations. */
265 class ZoomVerb : public Verb {
266 private:
267 static void perform(SPAction *action, void *mydata, void *otherdata);
268 static SPActionEventVector vector;
269 protected:
270 virtual SPAction *make_action(Inkscape::UI::View::View *view);
271 public:
272 /** \brief Use the Verb initializer with the same parameters. */
273 ZoomVerb(unsigned int const code,
274 gchar const *id,
275 gchar const *name,
276 gchar const *tip,
277 gchar const *image) :
278 Verb(code, id, name, tip, image)
279 { }
280 }; /* ZoomVerb class */
283 /** \brief A class to encompass all of the verbs which deal with
284 dialog operations. */
285 class DialogVerb : public Verb {
286 private:
287 static void perform(SPAction *action, void *mydata, void *otherdata);
288 static SPActionEventVector vector;
289 protected:
290 virtual SPAction *make_action(Inkscape::UI::View::View *view);
291 public:
292 /** \brief Use the Verb initializer with the same parameters. */
293 DialogVerb(unsigned int const code,
294 gchar const *id,
295 gchar const *name,
296 gchar const *tip,
297 gchar const *image) :
298 Verb(code, id, name, tip, image)
299 { }
300 }; /* DialogVerb class */
302 /** \brief A class to encompass all of the verbs which deal with
303 help operations. */
304 class HelpVerb : public Verb {
305 private:
306 static void perform(SPAction *action, void *mydata, void *otherdata);
307 static SPActionEventVector vector;
308 protected:
309 virtual SPAction *make_action(Inkscape::UI::View::View *view);
310 public:
311 /** \brief Use the Verb initializer with the same parameters. */
312 HelpVerb(unsigned int const code,
313 gchar const *id,
314 gchar const *name,
315 gchar const *tip,
316 gchar const *image) :
317 Verb(code, id, name, tip, image)
318 { }
319 }; /* HelpVerb class */
321 /** \brief A class to encompass all of the verbs which deal with
322 tutorial operations. */
323 class TutorialVerb : public Verb {
324 private:
325 static void perform(SPAction *action, void *mydata, void *otherdata);
326 static SPActionEventVector vector;
327 protected:
328 virtual SPAction *make_action(Inkscape::UI::View::View *view);
329 public:
330 /** \brief Use the Verb initializer with the same parameters. */
331 TutorialVerb(unsigned int const code,
332 gchar const *id,
333 gchar const *name,
334 gchar const *tip,
335 gchar const *image) :
336 Verb(code, id, name, tip, image)
337 { }
338 }; /* TutorialVerb class */
340 /** \brief A class to encompass all of the verbs which deal with
341 text operations. */
342 class TextVerb : public Verb {
343 private:
344 static void perform(SPAction *action, void *mydata, void *otherdata);
345 static SPActionEventVector vector;
346 protected:
347 virtual SPAction *make_action(Inkscape::UI::View::View *view);
348 public:
349 /** \brief Use the Verb initializer with the same parameters. */
350 TextVerb(unsigned int const code,
351 gchar const *id,
352 gchar const *name,
353 gchar const *tip,
354 gchar const *image) :
355 Verb(code, id, name, tip, image)
356 { }
357 }; //TextVerb : public Verb
359 Verb::VerbTable Verb::_verbs;
360 Verb::VerbIDTable Verb::_verb_ids;
362 /** \brief Create a verb without a code.
364 This function calls the other constructor for all of the parameters,
365 but generates the code. It is important to READ THE OTHER DOCUMENTATION
366 it has important details in it. To generate the code a static is
367 used which starts at the last static value: \c SP_VERB_LAST. For
368 each call it is incremented. The list of allocated verbs is kept
369 in the \c _verbs hashtable which is indexed by the \c code.
370 */
371 Verb::Verb(gchar const *id, gchar const *name, gchar const *tip, gchar const *image) :
372 _actions(NULL), _id(id), _name(name), _tip(tip), _image(image)
373 {
374 static int count = SP_VERB_LAST;
376 count++;
377 _code = count;
378 _verbs.insert(VerbTable::value_type(count, this));
379 _verb_ids.insert(VerbIDTable::value_type(_id, this));
381 return;
382 }
384 /** \brief Destroy a verb.
386 The only allocated variable is the _actions variable. If it has
387 been allocated it is deleted.
388 */
389 Verb::~Verb(void)
390 {
391 /// \todo all the actions need to be cleaned up first.
392 if (_actions != NULL) {
393 delete _actions;
394 }
396 return;
397 }
399 /** \brief Verbs are no good without actions. This is a place holder
400 for a function that every subclass should write. Most
401 can be written using \c make_action_helper.
402 \param view Which view the action should be created for.
403 \return NULL to represent error (this function shouldn't ever be called)
404 */
405 SPAction *
406 Verb::make_action(Inkscape::UI::View::View *view)
407 {
408 //std::cout << "make_action" << std::endl;
409 return NULL;
410 }
412 /** \brief Create an action for a \c FileVerb
413 \param view Which view the action should be created for
414 \return The built action.
416 Calls \c make_action_helper with the \c vector.
417 */
418 SPAction *
419 FileVerb::make_action(Inkscape::UI::View::View *view)
420 {
421 //std::cout << "fileverb: make_action: " << &vector << std::endl;
422 return make_action_helper(view, &vector);
423 }
425 /** \brief Create an action for a \c EditVerb
426 \param view Which view the action should be created for
427 \return The built action.
429 Calls \c make_action_helper with the \c vector.
430 */
431 SPAction *
432 EditVerb::make_action(Inkscape::UI::View::View *view)
433 {
434 //std::cout << "editverb: make_action: " << &vector << std::endl;
435 return make_action_helper(view, &vector);
436 }
438 /** \brief Create an action for a \c SelectionVerb
439 \param view Which view the action should be created for
440 \return The built action.
442 Calls \c make_action_helper with the \c vector.
443 */
444 SPAction *
445 SelectionVerb::make_action(Inkscape::UI::View::View *view)
446 {
447 return make_action_helper(view, &vector);
448 }
450 /** \brief Create an action for a \c LayerVerb
451 \param view Which view the action should be created for
452 \return The built action.
454 Calls \c make_action_helper with the \c vector.
455 */
456 SPAction *
457 LayerVerb::make_action(Inkscape::UI::View::View *view)
458 {
459 return make_action_helper(view, &vector);
460 }
462 /** \brief Create an action for a \c ObjectVerb
463 \param view Which view the action should be created for
464 \return The built action.
466 Calls \c make_action_helper with the \c vector.
467 */
468 SPAction *
469 ObjectVerb::make_action(Inkscape::UI::View::View *view)
470 {
471 return make_action_helper(view, &vector);
472 }
474 /** \brief Create an action for a \c ContextVerb
475 \param view Which view the action should be created for
476 \return The built action.
478 Calls \c make_action_helper with the \c vector.
479 */
480 SPAction *
481 ContextVerb::make_action(Inkscape::UI::View::View *view)
482 {
483 return make_action_helper(view, &vector);
484 }
486 /** \brief Create an action for a \c ZoomVerb
487 \param view Which view the action should be created for
488 \return The built action.
490 Calls \c make_action_helper with the \c vector.
491 */
492 SPAction *
493 ZoomVerb::make_action(Inkscape::UI::View::View *view)
494 {
495 return make_action_helper(view, &vector);
496 }
498 /** \brief Create an action for a \c DialogVerb
499 \param view Which view the action should be created for
500 \return The built action.
502 Calls \c make_action_helper with the \c vector.
503 */
504 SPAction *
505 DialogVerb::make_action(Inkscape::UI::View::View *view)
506 {
507 return make_action_helper(view, &vector);
508 }
510 /** \brief Create an action for a \c HelpVerb
511 \param view Which view the action should be created for
512 \return The built action.
514 Calls \c make_action_helper with the \c vector.
515 */
516 SPAction *
517 HelpVerb::make_action(Inkscape::UI::View::View *view)
518 {
519 return make_action_helper(view, &vector);
520 }
522 /** \brief Create an action for a \c TutorialVerb
523 \param view Which view the action should be created for
524 \return The built action.
526 Calls \c make_action_helper with the \c vector.
527 */
528 SPAction *
529 TutorialVerb::make_action(Inkscape::UI::View::View *view)
530 {
531 return make_action_helper(view, &vector);
532 }
534 /** \brief Create an action for a \c TextVerb
535 \param view Which view the action should be created for
536 \return The built action.
538 Calls \c make_action_helper with the \c vector.
539 */
540 SPAction *
541 TextVerb::make_action(Inkscape::UI::View::View *view)
542 {
543 return make_action_helper(view, &vector);
544 }
546 /** \brief A quick little convience function to make building actions
547 a little bit easier.
548 \param view Which view the action should be created for.
549 \param vector The function vector for the verb.
550 \return The created action.
552 This function does a couple of things. The most obvious is that
553 it allocates and creates the action. When it does this it
554 translates the \c _name and \c _tip variables. This allows them
555 to be staticly allocated easily, and get translated in the end. Then,
556 if the action gets crated, a listener is added to the action with
557 the vector that is passed in.
558 */
559 SPAction *
560 Verb::make_action_helper(Inkscape::UI::View::View *view, SPActionEventVector *vector, void *in_pntr)
561 {
562 SPAction *action;
564 //std::cout << "Adding action: " << _code << std::endl;
565 action = sp_action_new(view, _id, _(_name),
566 _(_tip), _image, this);
568 if (action != NULL) {
569 if (in_pntr == NULL) {
570 nr_active_object_add_listener(
571 (NRActiveObject *) action,
572 (NRObjectEventVector *) vector,
573 sizeof(SPActionEventVector),
574 reinterpret_cast<void *>(_code)
575 );
576 } else {
577 nr_active_object_add_listener(
578 (NRActiveObject *) action,
579 (NRObjectEventVector *) vector,
580 sizeof(SPActionEventVector),
581 in_pntr
582 );
583 }
584 }
586 return action;
587 }
589 /** \brief A function to get an action if it exists, or otherwise to
590 build it.
591 \param view The view which this action would relate to
592 \return The action, or NULL if there is an error.
594 This function will get the action for a given view for this verb. It
595 will create the verb if it can't be found in the ActionTable. Also,
596 if the \c ActionTable has not been created, it gets created by this
597 function.
599 If the action is created, it's sensitivity must be determined. The
600 default for a new action is that it is sensitive. If the value in
601 \c _default_sensitive is \c false, then the sensitivity must be
602 removed. Also, if the view being created is based on the same
603 document as a view already created, the sensitivity should be the
604 same as views on that document. A view with the same document is
605 looked for, and the sensitivity is matched. Unfortunately, this is
606 currently a linear search.
607 */
608 SPAction *
609 Verb::get_action(Inkscape::UI::View::View *view)
610 {
611 SPAction *action = NULL;
613 if ( _actions == NULL ) {
614 _actions = new ActionTable;
615 }
616 ActionTable::iterator action_found = _actions->find(view);
618 if (action_found != _actions->end()) {
619 action = action_found->second;
620 } else {
621 action = this->make_action(view);
623 // if (action == NULL) printf("Hmm, NULL in %s\n", _name);
624 if (action == NULL) printf("Hmm, NULL in %s\n", _name);
625 if (!_default_sensitive) {
626 sp_action_set_sensitive(action, 0);
627 } else {
628 for (ActionTable::iterator cur_action = _actions->begin();
629 cur_action != _actions->end() && view != NULL;
630 cur_action++) {
631 if (cur_action->first != NULL && cur_action->first->doc() == view->doc()) {
632 sp_action_set_sensitive(action, cur_action->second->sensitive);
633 break;
634 }
635 }
636 }
638 _actions->insert(ActionTable::value_type(view, action));
639 }
641 return action;
642 }
644 void
645 Verb::sensitive(SPDocument *in_doc, bool in_sensitive)
646 {
647 // printf("Setting sensitivity of \"%s\" to %d\n", _name, in_sensitive);
648 if (_actions != NULL) {
649 for (ActionTable::iterator cur_action = _actions->begin();
650 cur_action != _actions->end();
651 cur_action++) {
652 if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) {
653 sp_action_set_sensitive(cur_action->second, in_sensitive ? 1 : 0);
654 }
655 }
656 }
658 if (in_doc == NULL) {
659 _default_sensitive = in_sensitive;
660 }
662 return;
663 }
666 void
667 Verb::name(SPDocument *in_doc, Glib::ustring in_name)
668 {
669 if (_actions != NULL) {
670 for (ActionTable::iterator cur_action = _actions->begin();
671 cur_action != _actions->end();
672 cur_action++) {
673 if (in_doc == NULL || (cur_action->first != NULL && cur_action->first->doc() == in_doc)) {
674 sp_action_set_name(cur_action->second, in_name);
675 }
676 }
677 }
678 }
680 /** \brief A function to remove the action associated with a view.
681 \param view Which view's actions should be removed.
682 \return None
684 This function looks for the action in \c _actions. If it is
685 found then it is unreferenced and the entry in the action
686 table is erased.
687 */
688 void
689 Verb::delete_view(Inkscape::UI::View::View *view)
690 {
691 if (_actions == NULL) return;
692 if (_actions->empty()) return;
694 #if 0
695 static int count = 0;
696 std::cout << count++ << std::endl;
697 #endif
699 ActionTable::iterator action_found = _actions->find(view);
701 if (action_found != _actions->end()) {
702 SPAction *action = action_found->second;
703 nr_object_unref(NR_OBJECT(action));
704 _actions->erase(action_found);
705 }
707 return;
708 }
710 /** \brief A function to delete a view from all verbs
711 \param view Which view's actions should be removed.
712 \return None
714 This function first looks through _base_verbs and deteles
715 the view from all of those views. If \c _verbs is not empty
716 then all of the entries in that table have all of the views
717 deleted also.
718 */
719 void
720 Verb::delete_all_view(Inkscape::UI::View::View *view)
721 {
722 for (int i = 0; i <= SP_VERB_LAST; i++) {
723 if (_base_verbs[i])
724 _base_verbs[i]->delete_view(view);
725 }
727 if (!_verbs.empty()) {
728 for (VerbTable::iterator thisverb = _verbs.begin();
729 thisverb != _verbs.end(); thisverb++) {
730 Inkscape::Verb *verbpntr = thisverb->second;
731 // std::cout << "Delete In Verb: " << verbpntr->_name << std::endl;
732 verbpntr->delete_view(view);
733 }
734 }
736 return;
737 }
739 /** \brief A function to turn a \c code into a Verb for dynamically
740 created Verbs.
741 \param code What code is being looked for
742 \return The found Verb of NULL if none is found.
744 This function basically just looks through the \c _verbs hash
745 table. STL does all the work.
746 */
747 Verb *
748 Verb::get_search(unsigned int code)
749 {
750 Verb *verb = NULL;
751 VerbTable::iterator verb_found = _verbs.find(code);
753 if (verb_found != _verbs.end()) {
754 verb = verb_found->second;
755 }
757 return verb;
758 }
760 /** \brief Find a Verb using it's ID
761 \param id Which id to search for
763 This function uses the \c _verb_ids has table to find the
764 verb by it's id. Should be much faster than previous
765 implementations.
766 */
767 Verb *
768 Verb::getbyid(gchar const *id)
769 {
770 Verb *verb = NULL;
771 VerbIDTable::iterator verb_found = _verb_ids.find(id);
773 if (verb_found != _verb_ids.end()) {
774 verb = verb_found->second;
775 }
777 if (verb == NULL)
778 printf("Unable to find: %s\n", id);
780 return verb;
781 }
783 /** \brief Decode the verb code and take appropriate action */
784 void
785 FileVerb::perform(SPAction *action, void *data, void *pdata)
786 {
787 #if 0
788 /* These aren't used, but are here to remind people not to use
789 the CURRENT_DOCUMENT macros unless they really have to. */
790 Inkscape::UI::View::View *current_view = sp_action_get_view(action);
791 SPDocument *current_document = current_view->doc();
792 #endif
794 SPDesktop *desktop = dynamic_cast<SPDesktop*>(sp_action_get_view(action));
795 g_assert(desktop != NULL);
796 Gtk::Window *parent = desktop->getToplevel();
797 g_assert(parent != NULL);
799 switch ((long) data) {
800 case SP_VERB_FILE_NEW:
801 sp_file_new_default();
802 break;
803 case SP_VERB_FILE_OPEN:
804 sp_file_open_dialog(*parent, NULL, NULL);
805 break;
806 case SP_VERB_FILE_REVERT:
807 sp_file_revert_dialog();
808 break;
809 case SP_VERB_FILE_SAVE:
810 sp_file_save(*parent, NULL, NULL);
811 break;
812 case SP_VERB_FILE_SAVE_AS:
813 sp_file_save_as(*parent, NULL, NULL);
814 break;
815 case SP_VERB_FILE_SAVE_A_COPY:
816 sp_file_save_a_copy(*parent, NULL, NULL);
817 break;
818 case SP_VERB_FILE_PRINT:
819 sp_file_print();
820 break;
821 case SP_VERB_FILE_VACUUM:
822 sp_file_vacuum();
823 break;
824 case SP_VERB_FILE_PRINT_DIRECT:
825 sp_file_print_direct();
826 break;
827 case SP_VERB_FILE_PRINT_PREVIEW:
828 sp_file_print_preview(NULL, NULL);
829 break;
830 case SP_VERB_FILE_IMPORT:
831 sp_file_import(*parent);
832 break;
833 case SP_VERB_FILE_EXPORT:
834 sp_file_export_dialog(NULL);
835 break;
836 case SP_VERB_FILE_NEXT_DESKTOP:
837 inkscape_switch_desktops_next();
838 break;
839 case SP_VERB_FILE_PREV_DESKTOP:
840 inkscape_switch_desktops_prev();
841 break;
842 case SP_VERB_FILE_CLOSE_VIEW:
843 sp_ui_close_view(NULL);
844 break;
845 case SP_VERB_FILE_QUIT:
846 sp_file_exit();
847 break;
848 default:
849 break;
850 }
853 } // end of sp_verb_action_file_perform()
855 /** \brief Decode the verb code and take appropriate action */
856 void
857 EditVerb::perform(SPAction *action, void *data, void *pdata)
858 {
859 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
860 if (!dt)
861 return;
862 SPEventContext *ec = dt->event_context;
864 switch (reinterpret_cast<std::size_t>(data)) {
865 case SP_VERB_EDIT_UNDO:
866 sp_undo(dt, sp_desktop_document(dt));
867 break;
868 case SP_VERB_EDIT_REDO:
869 sp_redo(dt, sp_desktop_document(dt));
870 break;
871 case SP_VERB_EDIT_CUT:
872 sp_selection_cut();
873 break;
874 case SP_VERB_EDIT_COPY:
875 sp_selection_copy();
876 break;
877 case SP_VERB_EDIT_PASTE:
878 sp_selection_paste(false);
879 break;
880 case SP_VERB_EDIT_PASTE_STYLE:
881 sp_selection_paste_style();
882 break;
883 case SP_VERB_EDIT_PASTE_SIZE:
884 sp_selection_paste_size(true, true);
885 break;
886 case SP_VERB_EDIT_PASTE_SIZE_X:
887 sp_selection_paste_size(true, false);
888 break;
889 case SP_VERB_EDIT_PASTE_SIZE_Y:
890 sp_selection_paste_size(false, true);
891 break;
892 case SP_VERB_EDIT_PASTE_SIZE_SEPARATELY:
893 sp_selection_paste_size_separately(true, true);
894 break;
895 case SP_VERB_EDIT_PASTE_SIZE_SEPARATELY_X:
896 sp_selection_paste_size_separately(true, false);
897 break;
898 case SP_VERB_EDIT_PASTE_SIZE_SEPARATELY_Y:
899 sp_selection_paste_size_separately(false, true);
900 break;
901 case SP_VERB_EDIT_PASTE_IN_PLACE:
902 sp_selection_paste(true);
903 break;
904 case SP_VERB_EDIT_DELETE:
905 sp_selection_delete();
906 break;
907 case SP_VERB_EDIT_DUPLICATE:
908 sp_selection_duplicate();
909 break;
910 case SP_VERB_EDIT_CLONE:
911 sp_selection_clone();
912 break;
913 case SP_VERB_EDIT_UNLINK_CLONE:
914 sp_selection_unlink();
915 break;
916 case SP_VERB_EDIT_CLONE_ORIGINAL:
917 sp_select_clone_original();
918 break;
919 case SP_VERB_EDIT_TILE:
920 sp_selection_tile();
921 break;
922 case SP_VERB_EDIT_UNTILE:
923 sp_selection_untile();
924 break;
925 case SP_VERB_EDIT_CLEAR_ALL:
926 sp_edit_clear_all();
927 break;
928 case SP_VERB_EDIT_SELECT_ALL:
929 if (tools_isactive(dt, TOOLS_NODES)) {
930 SP_NODE_CONTEXT(ec)->shape_editor->select_all_from_subpath(false);
931 } else {
932 sp_edit_select_all();
933 }
934 break;
935 case SP_VERB_EDIT_INVERT:
936 if (tools_isactive(dt, TOOLS_NODES)) {
937 SP_NODE_CONTEXT(ec)->shape_editor->select_all_from_subpath(true);
938 } else {
939 sp_edit_invert();
940 }
941 break;
942 case SP_VERB_EDIT_SELECT_ALL_IN_ALL_LAYERS:
943 if (tools_isactive(dt, TOOLS_NODES)) {
944 SP_NODE_CONTEXT(ec)->shape_editor->select_all(false);
945 } else {
946 sp_edit_select_all_in_all_layers();
947 }
948 break;
949 case SP_VERB_EDIT_INVERT_IN_ALL_LAYERS:
950 if (tools_isactive(dt, TOOLS_NODES)) {
951 SP_NODE_CONTEXT(ec)->shape_editor->select_all(true);
952 } else {
953 sp_edit_invert_in_all_layers();
954 }
955 break;
957 case SP_VERB_EDIT_SELECT_NEXT:
958 if (tools_isactive(dt, TOOLS_NODES)) {
959 SP_NODE_CONTEXT(ec)->shape_editor->select_next();
960 } else if (tools_isactive(dt, TOOLS_GRADIENT)) {
961 sp_gradient_context_select_next (ec);
962 } else {
963 sp_selection_item_next();
964 }
965 break;
966 case SP_VERB_EDIT_SELECT_PREV:
967 if (tools_isactive(dt, TOOLS_NODES)) {
968 SP_NODE_CONTEXT(ec)->shape_editor->select_prev();
969 } else if (tools_isactive(dt, TOOLS_GRADIENT)) {
970 sp_gradient_context_select_prev (ec);
971 } else {
972 sp_selection_item_prev();
973 }
974 break;
976 case SP_VERB_EDIT_DESELECT:
977 if (tools_isactive(dt, TOOLS_NODES)) {
978 SP_NODE_CONTEXT(ec)->shape_editor->deselect();
979 } else {
980 sp_desktop_selection(dt)->clear();
981 }
982 break;
983 default:
984 break;
985 }
987 } // end of sp_verb_action_edit_perform()
989 /** \brief Decode the verb code and take appropriate action */
990 void
991 SelectionVerb::perform(SPAction *action, void *data, void *pdata)
992 {
993 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
995 if (!dt)
996 return;
998 switch (reinterpret_cast<std::size_t>(data)) {
999 case SP_VERB_SELECTION_TO_FRONT:
1000 sp_selection_raise_to_top();
1001 break;
1002 case SP_VERB_SELECTION_TO_BACK:
1003 sp_selection_lower_to_bottom();
1004 break;
1005 case SP_VERB_SELECTION_RAISE:
1006 sp_selection_raise();
1007 break;
1008 case SP_VERB_SELECTION_LOWER:
1009 sp_selection_lower();
1010 break;
1011 case SP_VERB_SELECTION_GROUP:
1012 sp_selection_group();
1013 break;
1014 case SP_VERB_SELECTION_UNGROUP:
1015 sp_selection_ungroup();
1016 break;
1018 case SP_VERB_SELECTION_TEXTTOPATH:
1019 text_put_on_path();
1020 break;
1021 case SP_VERB_SELECTION_TEXTFROMPATH:
1022 text_remove_from_path();
1023 break;
1024 case SP_VERB_SELECTION_REMOVE_KERNS:
1025 text_remove_all_kerns();
1026 break;
1028 case SP_VERB_SELECTION_UNION:
1029 sp_selected_path_union();
1030 break;
1031 case SP_VERB_SELECTION_INTERSECT:
1032 sp_selected_path_intersect();
1033 break;
1034 case SP_VERB_SELECTION_DIFF:
1035 sp_selected_path_diff();
1036 break;
1037 case SP_VERB_SELECTION_SYMDIFF:
1038 sp_selected_path_symdiff();
1039 break;
1041 case SP_VERB_SELECTION_CUT:
1042 sp_selected_path_cut();
1043 break;
1044 case SP_VERB_SELECTION_SLICE:
1045 sp_selected_path_slice();
1046 break;
1048 case SP_VERB_SELECTION_OFFSET:
1049 sp_selected_path_offset();
1050 break;
1051 case SP_VERB_SELECTION_OFFSET_SCREEN:
1052 sp_selected_path_offset_screen(1);
1053 break;
1054 case SP_VERB_SELECTION_OFFSET_SCREEN_10:
1055 sp_selected_path_offset_screen(10);
1056 break;
1057 case SP_VERB_SELECTION_INSET:
1058 sp_selected_path_inset();
1059 break;
1060 case SP_VERB_SELECTION_INSET_SCREEN:
1061 sp_selected_path_inset_screen(1);
1062 break;
1063 case SP_VERB_SELECTION_INSET_SCREEN_10:
1064 sp_selected_path_inset_screen(10);
1065 break;
1066 case SP_VERB_SELECTION_DYNAMIC_OFFSET:
1067 sp_selected_path_create_offset_object_zero();
1068 tools_switch_current(TOOLS_NODES);
1069 break;
1070 case SP_VERB_SELECTION_LINKED_OFFSET:
1071 sp_selected_path_create_updating_offset_object_zero();
1072 tools_switch_current(TOOLS_NODES);
1073 break;
1075 case SP_VERB_SELECTION_OUTLINE:
1076 sp_selected_path_outline();
1077 break;
1078 case SP_VERB_SELECTION_SIMPLIFY:
1079 sp_selected_path_simplify();
1080 break;
1081 case SP_VERB_SELECTION_REVERSE:
1082 sp_selected_path_reverse();
1083 break;
1084 case SP_VERB_SELECTION_TRACE:
1085 dt->_dlg_mgr->showDialog("Trace");
1086 break;
1087 case SP_VERB_SELECTION_CREATE_BITMAP:
1088 sp_selection_create_bitmap_copy();
1089 break;
1091 case SP_VERB_SELECTION_COMBINE:
1092 sp_selected_path_combine();
1093 break;
1094 case SP_VERB_SELECTION_BREAK_APART:
1095 sp_selected_path_break_apart();
1096 break;
1097 case SP_VERB_SELECTION_GRIDTILE:
1098 dt->_dlg_mgr->showDialog("TileDialog");
1099 break;
1100 default:
1101 break;
1102 }
1104 } // end of sp_verb_action_selection_perform()
1106 /** \brief Decode the verb code and take appropriate action */
1107 void
1108 LayerVerb::perform(SPAction *action, void *data, void *pdata)
1109 {
1110 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1111 unsigned int verb = reinterpret_cast<std::size_t>(data);
1113 if ( !dt || !dt->currentLayer() ) {
1114 return;
1115 }
1117 switch (verb) {
1118 case SP_VERB_LAYER_NEW: {
1119 Inkscape::UI::Dialogs::LayerPropertiesDialog::showCreate(dt, dt->currentLayer());
1120 break;
1121 }
1122 case SP_VERB_LAYER_RENAME: {
1123 Inkscape::UI::Dialogs::LayerPropertiesDialog::showRename(dt, dt->currentLayer());
1124 break;
1125 }
1126 case SP_VERB_LAYER_NEXT: {
1127 SPObject *next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer());
1128 if (next) {
1129 dt->setCurrentLayer(next);
1130 sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_NEXT,
1131 _("Move to next layer"));
1132 dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Moved to next layer."));
1133 } else {
1134 dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot move past last layer."));
1135 }
1136 break;
1137 }
1138 case SP_VERB_LAYER_PREV: {
1139 SPObject *prev=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer());
1140 if (prev) {
1141 dt->setCurrentLayer(prev);
1142 sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_PREV,
1143 _("Move to previous layer"));
1144 dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Moved to previous layer."));
1145 } else {
1146 dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot move past first layer."));
1147 }
1148 break;
1149 }
1150 case SP_VERB_LAYER_MOVE_TO_NEXT: {
1151 sp_selection_to_next_layer();
1152 break;
1153 }
1154 case SP_VERB_LAYER_MOVE_TO_PREV: {
1155 sp_selection_to_prev_layer();
1156 break;
1157 }
1158 case SP_VERB_LAYER_TO_TOP:
1159 case SP_VERB_LAYER_TO_BOTTOM:
1160 case SP_VERB_LAYER_RAISE:
1161 case SP_VERB_LAYER_LOWER: {
1162 if ( dt->currentLayer() == dt->currentRoot() ) {
1163 dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer."));
1164 return;
1165 }
1167 SPItem *layer=SP_ITEM(dt->currentLayer());
1168 g_return_if_fail(layer != NULL);
1170 SPObject *old_pos=SP_OBJECT_NEXT(layer);
1172 switch (verb) {
1173 case SP_VERB_LAYER_TO_TOP:
1174 layer->raiseToTop();
1175 break;
1176 case SP_VERB_LAYER_TO_BOTTOM:
1177 layer->lowerToBottom();
1178 break;
1179 case SP_VERB_LAYER_RAISE:
1180 layer->raiseOne();
1181 break;
1182 case SP_VERB_LAYER_LOWER:
1183 layer->lowerOne();
1184 break;
1185 }
1187 if ( SP_OBJECT_NEXT(layer) != old_pos ) {
1188 char const *message = NULL;
1189 Glib::ustring description = "";
1190 switch (verb) {
1191 case SP_VERB_LAYER_TO_TOP:
1192 message = g_strdup_printf(_("Raised layer <b>%s</b>."), layer->defaultLabel());
1193 description = _("Layer to top");
1194 break;
1195 case SP_VERB_LAYER_RAISE:
1196 message = g_strdup_printf(_("Raised layer <b>%s</b>."), layer->defaultLabel());
1197 description = _("Raise layer");
1198 break;
1199 case SP_VERB_LAYER_TO_BOTTOM:
1200 message = g_strdup_printf(_("Lowered layer <b>%s</b>."), layer->defaultLabel());
1201 description = _("Layer to bottom");
1202 break;
1203 case SP_VERB_LAYER_LOWER:
1204 message = g_strdup_printf(_("Lowered layer <b>%s</b>."), layer->defaultLabel());
1205 description = _("Lower layer");
1206 break;
1207 };
1208 sp_document_done(sp_desktop_document(dt), verb, description);
1209 if (message) {
1210 dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, message);
1211 g_free((void *) message);
1212 }
1213 } else {
1214 dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Cannot move layer any further."));
1215 }
1217 break;
1218 }
1219 case SP_VERB_LAYER_DELETE: {
1220 if ( dt->currentLayer() != dt->currentRoot() ) {
1221 sp_desktop_selection(dt)->clear();
1222 SPObject *old_layer=dt->currentLayer();
1224 sp_object_ref(old_layer, NULL);
1225 SPObject *survivor=Inkscape::next_layer(dt->currentRoot(), old_layer);
1226 if (!survivor) {
1227 survivor = Inkscape::previous_layer(dt->currentRoot(), old_layer);
1228 }
1230 /* Deleting the old layer before switching layers is a hack to trigger the
1231 * listeners of the deletion event (as happens when old_layer is deleted using the
1232 * xml editor). See
1233 * http://sourceforge.net/tracker/index.php?func=detail&aid=1339397&group_id=93438&atid=604306
1234 */
1235 old_layer->deleteObject();
1236 sp_object_unref(old_layer, NULL);
1237 if (survivor) {
1238 dt->setCurrentLayer(survivor);
1239 }
1241 sp_document_done(sp_desktop_document(dt), SP_VERB_LAYER_DELETE,
1242 _("Delete layer"));
1244 // TRANSLATORS: this means "The layer has been deleted."
1245 dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Deleted layer."));
1246 } else {
1247 dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer."));
1248 }
1249 break;
1250 }
1251 }
1253 return;
1254 } // end of sp_verb_action_layer_perform()
1256 /** \brief Decode the verb code and take appropriate action */
1257 void
1258 ObjectVerb::perform( SPAction *action, void *data, void *pdata )
1259 {
1260 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1261 if (!dt)
1262 return;
1264 SPEventContext *ec = dt->event_context;
1266 Inkscape::Selection *sel = sp_desktop_selection(dt);
1268 if (sel->isEmpty())
1269 return;
1271 NR::Maybe<NR::Rect> bbox = sel->bounds();
1272 if (!bbox) {
1273 return;
1274 }
1275 // If the rotation center of the selection is visible, choose it as reference point
1276 // for horizontal and vertical flips. Otherwise, take the center of the bounding box.
1277 NR::Point center;
1278 if (tools_isactive(dt, TOOLS_SELECT) && sel->center() && SP_SELECT_CONTEXT(ec)->_seltrans->centerIsVisible())
1279 center = *sel->center();
1280 else
1281 center = bbox->midpoint();
1283 switch (reinterpret_cast<std::size_t>(data)) {
1284 case SP_VERB_OBJECT_ROTATE_90_CW:
1285 sp_selection_rotate_90_cw();
1286 break;
1287 case SP_VERB_OBJECT_ROTATE_90_CCW:
1288 sp_selection_rotate_90_ccw();
1289 break;
1290 case SP_VERB_OBJECT_FLATTEN:
1291 sp_selection_remove_transform();
1292 break;
1293 case SP_VERB_OBJECT_TO_CURVE:
1294 sp_selected_path_to_curves();
1295 break;
1296 case SP_VERB_OBJECT_FLOW_TEXT:
1297 text_flow_into_shape();
1298 break;
1299 case SP_VERB_OBJECT_UNFLOW_TEXT:
1300 text_unflow();
1301 break;
1302 case SP_VERB_OBJECT_FLOWTEXT_TO_TEXT:
1303 flowtext_to_text();
1304 break;
1305 case SP_VERB_OBJECT_FLIP_HORIZONTAL:
1306 // When working with the node tool ...
1307 if (tools_isactive(dt, TOOLS_NODES)) {
1308 Inkscape::NodePath::Node *active_node = Inkscape::NodePath::Path::active_node;
1310 // ... and one of the nodes is currently mouseovered ...
1311 if (active_node) {
1313 // ... flip the selected nodes about that node
1314 SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::X, active_node->pos);
1315 } else {
1317 // ... or else about the center of their bounding box.
1318 SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::X);
1319 }
1321 // When working with the selector tool, flip the selection about its rotation center
1322 // (if it is visible) or about the center of the bounding box.
1323 } else {
1324 sp_selection_scale_relative(sel, center, NR::scale(-1.0, 1.0));
1325 }
1326 sp_document_done(sp_desktop_document(dt), SP_VERB_OBJECT_FLIP_HORIZONTAL,
1327 _("Flip horizontally"));
1328 break;
1329 case SP_VERB_OBJECT_FLIP_VERTICAL:
1330 // The behaviour is analogous to flipping horizontally
1331 if (tools_isactive(dt, TOOLS_NODES)) {
1332 Inkscape::NodePath::Node *active_node = Inkscape::NodePath::Path::active_node;
1333 if (active_node) {
1334 SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::Y, active_node->pos);
1335 } else {
1336 SP_NODE_CONTEXT(ec)->shape_editor->flip(NR::Y);
1337 }
1338 } else {
1339 sp_selection_scale_relative(sel, center, NR::scale(1.0, -1.0));
1340 }
1341 sp_document_done(sp_desktop_document(dt), SP_VERB_OBJECT_FLIP_VERTICAL,
1342 _("Flip vertically"));
1343 break;
1344 case SP_VERB_OBJECT_SET_MASK:
1345 sp_selection_set_mask(false, false);
1346 break;
1347 case SP_VERB_OBJECT_UNSET_MASK:
1348 sp_selection_unset_mask(false);
1349 break;
1350 case SP_VERB_OBJECT_SET_CLIPPATH:
1351 sp_selection_set_mask(true, false);
1352 break;
1353 case SP_VERB_OBJECT_UNSET_CLIPPATH:
1354 sp_selection_unset_mask(true);
1355 break;
1356 default:
1357 break;
1358 }
1360 } // end of sp_verb_action_object_perform()
1362 /** \brief Decode the verb code and take appropriate action */
1363 void
1364 ContextVerb::perform(SPAction *action, void *data, void *pdata)
1365 {
1366 SPDesktop *dt;
1367 sp_verb_t verb;
1368 int vidx;
1370 dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1372 if (!dt)
1373 return;
1375 verb = (sp_verb_t)GPOINTER_TO_INT((gpointer)data);
1377 /** \todo !!! hopefully this can go away soon and actions can look after
1378 * themselves
1379 */
1380 for (vidx = SP_VERB_CONTEXT_SELECT; vidx <= SP_VERB_CONTEXT_PAINTBUCKET_PREFS; vidx++)
1381 {
1382 SPAction *tool_action= get((sp_verb_t)vidx)->get_action(dt);
1383 if (tool_action) {
1384 sp_action_set_active(tool_action, vidx == (int)verb);
1385 }
1386 }
1388 switch (verb) {
1389 case SP_VERB_CONTEXT_SELECT:
1390 tools_switch_current(TOOLS_SELECT);
1391 break;
1392 case SP_VERB_CONTEXT_NODE:
1393 tools_switch_current(TOOLS_NODES);
1394 break;
1395 case SP_VERB_CONTEXT_RECT:
1396 tools_switch_current(TOOLS_SHAPES_RECT);
1397 break;
1398 case SP_VERB_CONTEXT_3DBOX:
1399 tools_switch_current(TOOLS_SHAPES_3DBOX);
1400 break;
1401 case SP_VERB_CONTEXT_ARC:
1402 tools_switch_current(TOOLS_SHAPES_ARC);
1403 break;
1404 case SP_VERB_CONTEXT_STAR:
1405 tools_switch_current(TOOLS_SHAPES_STAR);
1406 break;
1407 case SP_VERB_CONTEXT_SPIRAL:
1408 tools_switch_current(TOOLS_SHAPES_SPIRAL);
1409 break;
1410 case SP_VERB_CONTEXT_PENCIL:
1411 tools_switch_current(TOOLS_FREEHAND_PENCIL);
1412 break;
1413 case SP_VERB_CONTEXT_PEN:
1414 tools_switch_current(TOOLS_FREEHAND_PEN);
1415 break;
1416 case SP_VERB_CONTEXT_CALLIGRAPHIC:
1417 tools_switch_current(TOOLS_CALLIGRAPHIC);
1418 break;
1419 case SP_VERB_CONTEXT_TEXT:
1420 tools_switch_current(TOOLS_TEXT);
1421 break;
1422 case SP_VERB_CONTEXT_GRADIENT:
1423 tools_switch_current(TOOLS_GRADIENT);
1424 break;
1425 case SP_VERB_CONTEXT_ZOOM:
1426 tools_switch_current(TOOLS_ZOOM);
1427 break;
1428 case SP_VERB_CONTEXT_DROPPER:
1429 tools_switch_current(TOOLS_DROPPER);
1430 break;
1431 case SP_VERB_CONTEXT_CONNECTOR:
1432 tools_switch_current (TOOLS_CONNECTOR);
1433 break;
1434 case SP_VERB_CONTEXT_PAINTBUCKET:
1435 tools_switch_current(TOOLS_PAINTBUCKET);
1436 break;
1438 case SP_VERB_CONTEXT_SELECT_PREFS:
1439 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SELECTOR);
1440 dt->_dlg_mgr->showDialog("InkscapePreferences");
1441 break;
1442 case SP_VERB_CONTEXT_NODE_PREFS:
1443 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_NODE);
1444 dt->_dlg_mgr->showDialog("InkscapePreferences");
1445 break;
1446 case SP_VERB_CONTEXT_RECT_PREFS:
1447 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_RECT);
1448 dt->_dlg_mgr->showDialog("InkscapePreferences");
1449 break;
1450 case SP_VERB_CONTEXT_3DBOX_PREFS:
1451 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_3DBOX);
1452 dt->_dlg_mgr->showDialog("InkscapePreferences");
1453 break;
1454 case SP_VERB_CONTEXT_ARC_PREFS:
1455 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_ELLIPSE);
1456 dt->_dlg_mgr->showDialog("InkscapePreferences");
1457 break;
1458 case SP_VERB_CONTEXT_STAR_PREFS:
1459 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_STAR);
1460 dt->_dlg_mgr->showDialog("InkscapePreferences");
1461 break;
1462 case SP_VERB_CONTEXT_SPIRAL_PREFS:
1463 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_SHAPES_SPIRAL);
1464 dt->_dlg_mgr->showDialog("InkscapePreferences");
1465 break;
1466 case SP_VERB_CONTEXT_PENCIL_PREFS:
1467 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_PENCIL);
1468 dt->_dlg_mgr->showDialog("InkscapePreferences");
1469 break;
1470 case SP_VERB_CONTEXT_PEN_PREFS:
1471 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_PEN);
1472 dt->_dlg_mgr->showDialog("InkscapePreferences");
1473 break;
1474 case SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS:
1475 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_CALLIGRAPHY);
1476 dt->_dlg_mgr->showDialog("InkscapePreferences");
1477 break;
1478 case SP_VERB_CONTEXT_TEXT_PREFS:
1479 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_TEXT);
1480 dt->_dlg_mgr->showDialog("InkscapePreferences");
1481 break;
1482 case SP_VERB_CONTEXT_GRADIENT_PREFS:
1483 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_GRADIENT);
1484 dt->_dlg_mgr->showDialog("InkscapePreferences");
1485 break;
1486 case SP_VERB_CONTEXT_ZOOM_PREFS:
1487 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_ZOOM);
1488 dt->_dlg_mgr->showDialog("InkscapePreferences");
1489 break;
1490 case SP_VERB_CONTEXT_DROPPER_PREFS:
1491 prefs_set_int_attribute("dialogs.preferences", "page", PREFS_PAGE_TOOLS_DROPPER);
1492 dt->_dlg_mgr->showDialog("InkscapePreferences");
1493 break;
1494 case SP_VERB_CONTEXT_CONNECTOR_PREFS:
1495 prefs_set_int_attribute ("dialogs.preferences", "page", PREFS_PAGE_TOOLS_CONNECTOR);
1496 dt->_dlg_mgr->showDialog("InkscapePreferences");
1497 break;
1498 case SP_VERB_CONTEXT_PAINTBUCKET_PREFS:
1499 prefs_set_int_attribute ("dialogs.preferences", "page", PREFS_PAGE_TOOLS_PAINTBUCKET);
1500 dt->_dlg_mgr->showDialog("InkscapePreferences");
1501 break;
1503 default:
1504 break;
1505 }
1507 } // end of sp_verb_action_ctx_perform()
1509 /** \brief Decode the verb code and take appropriate action */
1510 void
1511 TextVerb::perform(SPAction *action, void *data, void *pdata)
1512 {
1513 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1514 if (!dt)
1515 return;
1517 SPDocument *doc = sp_desktop_document(dt);
1518 (void)doc;
1519 Inkscape::XML::Node *repr = SP_OBJECT_REPR(dt->namedview);
1520 (void)repr;
1521 }
1523 /** \brief Decode the verb code and take appropriate action */
1524 void
1525 ZoomVerb::perform(SPAction *action, void *data, void *pdata)
1526 {
1527 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1528 if (!dt)
1529 return;
1530 SPEventContext *ec = dt->event_context;
1532 SPDocument *doc = sp_desktop_document(dt);
1534 Inkscape::XML::Node *repr = SP_OBJECT_REPR(dt->namedview);
1536 gdouble zoom_inc =
1537 prefs_get_double_attribute_limited( "options.zoomincrement",
1538 "value", 1.414213562, 1.01, 10 );
1540 switch (GPOINTER_TO_INT(data)) {
1541 case SP_VERB_ZOOM_IN:
1542 {
1543 // While drawing with the pen/pencil tool, zoom towards the end of the unfinished path
1544 if (tools_isactive(dt, TOOLS_FREEHAND_PENCIL) || tools_isactive(dt, TOOLS_FREEHAND_PEN)) {
1545 SPCurve *rc = SP_DRAW_CONTEXT(ec)->red_curve;
1546 if (sp_curve_last_bpath(rc)) {
1547 NR::Point const zoom_to (sp_curve_last_point(rc));
1548 dt->zoom_relative_keep_point(zoom_to, zoom_inc);
1549 break;
1550 }
1551 }
1553 NR::Rect const d = dt->get_display_area();
1554 dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], zoom_inc);
1555 break;
1556 }
1557 case SP_VERB_ZOOM_OUT:
1558 {
1559 // While drawing with the pen/pencil tool, zoom away from the end of the unfinished path
1560 if (tools_isactive(dt, TOOLS_FREEHAND_PENCIL) || tools_isactive(dt, TOOLS_FREEHAND_PEN)) {
1561 SPCurve *rc = SP_DRAW_CONTEXT(ec)->red_curve;
1562 if (sp_curve_last_bpath(rc)) {
1563 NR::Point const zoom_to (sp_curve_last_point(rc));
1564 dt->zoom_relative_keep_point(zoom_to, 1 / zoom_inc);
1565 break;
1566 }
1567 }
1569 NR::Rect const d = dt->get_display_area();
1570 dt->zoom_relative( d.midpoint()[NR::X], d.midpoint()[NR::Y], 1 / zoom_inc );
1571 break;
1572 }
1573 case SP_VERB_ZOOM_1_1:
1574 {
1575 NR::Rect const d = dt->get_display_area();
1576 dt->zoom_absolute( d.midpoint()[NR::X], d.midpoint()[NR::Y], 1.0 );
1577 break;
1578 }
1579 case SP_VERB_ZOOM_1_2:
1580 {
1581 NR::Rect const d = dt->get_display_area();
1582 dt->zoom_absolute( d.midpoint()[NR::X], d.midpoint()[NR::Y], 0.5);
1583 break;
1584 }
1585 case SP_VERB_ZOOM_2_1:
1586 {
1587 NR::Rect const d = dt->get_display_area();
1588 dt->zoom_absolute( d.midpoint()[NR::X], d.midpoint()[NR::Y], 2.0 );
1589 break;
1590 }
1591 case SP_VERB_ZOOM_PAGE:
1592 dt->zoom_page();
1593 break;
1594 case SP_VERB_ZOOM_PAGE_WIDTH:
1595 dt->zoom_page_width();
1596 break;
1597 case SP_VERB_ZOOM_DRAWING:
1598 dt->zoom_drawing();
1599 break;
1600 case SP_VERB_ZOOM_SELECTION:
1601 dt->zoom_selection();
1602 break;
1603 case SP_VERB_ZOOM_NEXT:
1604 dt->next_zoom();
1605 break;
1606 case SP_VERB_ZOOM_PREV:
1607 dt->prev_zoom();
1608 break;
1609 case SP_VERB_TOGGLE_RULERS:
1610 dt->toggleRulers();
1611 break;
1612 case SP_VERB_TOGGLE_SCROLLBARS:
1613 dt->toggleScrollbars();
1614 break;
1615 case SP_VERB_TOGGLE_GUIDES:
1616 sp_namedview_toggle_guides(doc, repr);
1617 break;
1618 case SP_VERB_TOGGLE_GRID:
1619 dt->toggleGrid();
1620 break;
1621 #ifdef HAVE_GTK_WINDOW_FULLSCREEN
1622 case SP_VERB_FULLSCREEN:
1623 dt->fullscreen();
1624 break;
1625 #endif /* HAVE_GTK_WINDOW_FULLSCREEN */
1626 case SP_VERB_VIEW_NEW:
1627 sp_ui_new_view();
1628 break;
1629 case SP_VERB_VIEW_NEW_PREVIEW:
1630 sp_ui_new_view_preview();
1631 break;
1632 case SP_VERB_VIEW_MODE_NORMAL:
1633 dt->setDisplayModeNormal();
1634 break;
1635 case SP_VERB_VIEW_MODE_OUTLINE:
1636 dt->setDisplayModeOutline();
1637 break;
1638 case SP_VERB_VIEW_MODE_TOGGLE:
1639 dt->displayModeToggle();
1640 break;
1641 case SP_VERB_VIEW_ICON_PREVIEW:
1642 show_panel( Inkscape::UI::Dialogs::IconPreviewPanel::getInstance(), "dialogs.iconpreview", SP_VERB_VIEW_ICON_PREVIEW );
1643 break;
1644 default:
1645 break;
1646 }
1648 dt->updateNow();
1650 } // end of sp_verb_action_zoom_perform()
1652 /** \brief Decode the verb code and take appropriate action */
1653 void
1654 DialogVerb::perform(SPAction *action, void *data, void *pdata)
1655 {
1656 if (reinterpret_cast<std::size_t>(data) != SP_VERB_DIALOG_TOGGLE) {
1657 // unhide all when opening a new dialog
1658 inkscape_dialogs_unhide();
1659 }
1661 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1662 g_assert(dt->_dlg_mgr != NULL);
1664 switch (reinterpret_cast<std::size_t>(data)) {
1665 case SP_VERB_DIALOG_DISPLAY:
1666 //sp_display_dialog();
1667 dt->_dlg_mgr->showDialog("InkscapePreferences");
1668 break;
1669 case SP_VERB_DIALOG_METADATA:
1670 // sp_desktop_dialog();
1671 dt->_dlg_mgr->showDialog("DocumentMetadata");
1672 break;
1673 case SP_VERB_DIALOG_NAMEDVIEW:
1674 // sp_desktop_dialog();
1675 dt->_dlg_mgr->showDialog("DocumentProperties");
1676 break;
1677 case SP_VERB_DIALOG_FILL_STROKE:
1678 sp_object_properties_dialog();
1679 // dt->_dlg_mgr->showDialog("FillAndStroke");
1680 break;
1681 case SP_VERB_DIALOG_SWATCHES:
1682 show_panel( Inkscape::UI::Dialogs::SwatchesPanel::getInstance(), "dialogs.swatches", SP_VERB_DIALOG_SWATCHES);
1683 break;
1684 case SP_VERB_DIALOG_TRANSFORM:
1685 dt->_dlg_mgr->showDialog("Transformation");
1686 break;
1687 case SP_VERB_DIALOG_ALIGN_DISTRIBUTE:
1688 dt->_dlg_mgr->showDialog("AlignAndDistribute");
1689 break;
1690 case SP_VERB_DIALOG_TEXT:
1691 sp_text_edit_dialog();
1692 break;
1693 case SP_VERB_DIALOG_XML_EDITOR:
1694 sp_xml_tree_dialog();
1695 break;
1696 case SP_VERB_DIALOG_FIND:
1697 sp_find_dialog();
1698 // Please test the new find dialog if you have time:
1699 // dt->_dlg_mgr->showDialog("Find");
1700 break;
1701 case SP_VERB_DIALOG_DEBUG:
1702 dt->_dlg_mgr->showDialog("Messages");
1703 break;
1704 case SP_VERB_DIALOG_SCRIPT:
1705 dt->_dlg_mgr->showDialog("Script");
1706 break;
1707 case SP_VERB_DIALOG_UNDO_HISTORY:
1708 dt->_dlg_mgr->showDialog("UndoHistory");
1709 break;
1710 case SP_VERB_DIALOG_TOGGLE:
1711 inkscape_dialogs_toggle();
1712 break;
1713 case SP_VERB_DIALOG_CLONETILER:
1714 clonetiler_dialog();
1715 break;
1716 case SP_VERB_DIALOG_ITEM:
1717 sp_item_dialog();
1718 break;
1719 #ifdef WITH_INKBOARD
1720 case SP_VERB_XMPP_CLIENT:
1721 {
1722 Inkscape::Whiteboard::SessionManager::showClient();
1723 break;
1724 }
1725 #endif
1726 case SP_VERB_DIALOG_INPUT:
1727 sp_input_dialog();
1728 break;
1729 case SP_VERB_DIALOG_EXTENSIONEDITOR:
1730 dt->_dlg_mgr->showDialog("ExtensionEditor");
1731 break;
1732 case SP_VERB_DIALOG_LAYERS:
1733 show_panel( Inkscape::UI::Dialogs::LayersPanel::getInstance(), "dialogs.layers", SP_VERB_DIALOG_LAYERS );
1734 break;
1735 case SP_VERB_DIALOG_FILTER_EFFECTS:
1736 dt->_dlg_mgr->showDialog("FilterEffectsDialog");
1737 break;
1738 default:
1739 break;
1740 }
1741 } // end of sp_verb_action_dialog_perform()
1743 /** \brief Decode the verb code and take appropriate action */
1744 void
1745 HelpVerb::perform(SPAction *action, void *data, void *pdata)
1746 {
1747 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
1748 g_assert(dt->_dlg_mgr != NULL);
1750 switch (reinterpret_cast<std::size_t>(data)) {
1751 case SP_VERB_HELP_KEYS:
1752 /* TRANSLATORS: If you have translated the keys.svg file to your language, then
1753 translate this string as "keys.LANG.svg" (where LANG is your language code);
1754 otherwise leave as "keys.svg". */
1755 sp_help_open_screen(_("keys.svg"));
1756 break;
1757 case SP_VERB_HELP_ABOUT:
1758 sp_help_about();
1759 break;
1760 case SP_VERB_HELP_ABOUT_EXTENSIONS: {
1761 Inkscape::UI::Dialogs::ExtensionsPanel *panel = new Inkscape::UI::Dialogs::ExtensionsPanel();
1762 panel->set_full(true);
1763 show_panel( *panel, "dialogs.aboutextensions", SP_VERB_HELP_ABOUT_EXTENSIONS );
1764 break;
1765 }
1767 /*
1768 case SP_VERB_SHOW_LICENSE:
1769 // TRANSLATORS: See "tutorial-basic.svg" comment.
1770 sp_help_open_tutorial(NULL, (gpointer) _("gpl-2.svg"));
1771 break;
1772 */
1774 case SP_VERB_HELP_MEMORY:
1775 dt->_dlg_mgr->showDialog("Memory");
1776 break;
1777 default:
1778 break;
1779 }
1780 } // end of sp_verb_action_help_perform()
1782 /** \brief Decode the verb code and take appropriate action */
1783 void
1784 TutorialVerb::perform(SPAction *action, void *data, void *pdata)
1785 {
1786 switch (reinterpret_cast<std::size_t>(data)) {
1787 case SP_VERB_TUTORIAL_BASIC:
1788 /* TRANSLATORS: If you have translated the tutorial-basic.svg file to your language,
1789 then translate this string as "tutorial-basic.LANG.svg" (where LANG is your language
1790 code); otherwise leave as "tutorial-basic.svg". */
1791 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-basic.svg"));
1792 break;
1793 case SP_VERB_TUTORIAL_SHAPES:
1794 // TRANSLATORS: See "tutorial-basic.svg" comment.
1795 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-shapes.svg"));
1796 break;
1797 case SP_VERB_TUTORIAL_ADVANCED:
1798 // TRANSLATORS: See "tutorial-basic.svg" comment.
1799 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-advanced.svg"));
1800 break;
1801 case SP_VERB_TUTORIAL_TRACING:
1802 // TRANSLATORS: See "tutorial-basic.svg" comment.
1803 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-tracing.svg"));
1804 break;
1805 case SP_VERB_TUTORIAL_CALLIGRAPHY:
1806 // TRANSLATORS: See "tutorial-basic.svg" comment.
1807 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-calligraphy.svg"));
1808 break;
1809 case SP_VERB_TUTORIAL_DESIGN:
1810 // TRANSLATORS: See "tutorial-basic.svg" comment.
1811 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-elements.svg"));
1812 break;
1813 case SP_VERB_TUTORIAL_TIPS:
1814 // TRANSLATORS: See "tutorial-basic.svg" comment.
1815 sp_help_open_tutorial(NULL, (gpointer)_("tutorial-tips.svg"));
1816 break;
1817 default:
1818 break;
1819 }
1820 } // end of sp_verb_action_tutorial_perform()
1823 /**
1824 * Action vector to define functions called if a staticly defined file verb
1825 * is called.
1826 */
1827 SPActionEventVector FileVerb::vector =
1828 {{NULL},FileVerb::perform, NULL, NULL, NULL, NULL};
1829 /**
1830 * Action vector to define functions called if a staticly defined edit verb is
1831 * called.
1832 */
1833 SPActionEventVector EditVerb::vector =
1834 {{NULL},EditVerb::perform, NULL, NULL, NULL, NULL};
1836 /**
1837 * Action vector to define functions called if a staticly defined selection
1838 * verb is called
1839 */
1840 SPActionEventVector SelectionVerb::vector =
1841 {{NULL},SelectionVerb::perform, NULL, NULL, NULL, NULL};
1843 /**
1844 * Action vector to define functions called if a staticly defined layer
1845 * verb is called
1846 */
1847 SPActionEventVector LayerVerb::vector =
1848 {{NULL}, LayerVerb::perform, NULL, NULL, NULL, NULL};
1850 /**
1851 * Action vector to define functions called if a staticly defined object
1852 * editing verb is called
1853 */
1854 SPActionEventVector ObjectVerb::vector =
1855 {{NULL},ObjectVerb::perform, NULL, NULL, NULL, NULL};
1857 /**
1858 * Action vector to define functions called if a staticly defined context
1859 * verb is called
1860 */
1861 SPActionEventVector ContextVerb::vector =
1862 {{NULL},ContextVerb::perform, NULL, NULL, NULL, NULL};
1864 /**
1865 * Action vector to define functions called if a staticly defined zoom verb
1866 * is called
1867 */
1868 SPActionEventVector ZoomVerb::vector =
1869 {{NULL},ZoomVerb::perform, NULL, NULL, NULL, NULL};
1872 /**
1873 * Action vector to define functions called if a staticly defined dialog verb
1874 * is called
1875 */
1876 SPActionEventVector DialogVerb::vector =
1877 {{NULL},DialogVerb::perform, NULL, NULL, NULL, NULL};
1879 /**
1880 * Action vector to define functions called if a staticly defined help verb
1881 * is called
1882 */
1883 SPActionEventVector HelpVerb::vector =
1884 {{NULL},HelpVerb::perform, NULL, NULL, NULL, NULL};
1886 /**
1887 * Action vector to define functions called if a staticly defined tutorial verb
1888 * is called
1889 */
1890 SPActionEventVector TutorialVerb::vector =
1891 {{NULL},TutorialVerb::perform, NULL, NULL, NULL, NULL};
1893 /**
1894 * Action vector to define functions called if a staticly defined tutorial verb
1895 * is called
1896 */
1897 SPActionEventVector TextVerb::vector =
1898 {{NULL},TextVerb::perform, NULL, NULL, NULL, NULL};
1901 /* *********** Effect Last ********** */
1903 /** \brief A class to represent the last effect issued */
1904 class EffectLastVerb : public Verb {
1905 private:
1906 static void perform(SPAction *action, void *mydata, void *otherdata);
1907 static SPActionEventVector vector;
1908 protected:
1909 virtual SPAction *make_action(Inkscape::UI::View::View *view);
1910 public:
1911 /** \brief Use the Verb initializer with the same parameters. */
1912 EffectLastVerb(unsigned int const code,
1913 gchar const *id,
1914 gchar const *name,
1915 gchar const *tip,
1916 gchar const *image) :
1917 Verb(code, id, name, tip, image)
1918 {
1919 set_default_sensitive(false);
1920 }
1921 }; /* EffectLastVerb class */
1923 /**
1924 * The vector to attach in the last effect verb.
1925 */
1926 SPActionEventVector EffectLastVerb::vector =
1927 {{NULL},EffectLastVerb::perform, NULL, NULL, NULL, NULL};
1929 /** \brief Create an action for a \c EffectLastVerb
1930 \param view Which view the action should be created for
1931 \return The built action.
1933 Calls \c make_action_helper with the \c vector.
1934 */
1935 SPAction *
1936 EffectLastVerb::make_action(Inkscape::UI::View::View *view)
1937 {
1938 return make_action_helper(view, &vector);
1939 }
1941 /** \brief Decode the verb code and take appropriate action */
1942 void
1943 EffectLastVerb::perform(SPAction *action, void *data, void *pdata)
1944 {
1945 /* These aren't used, but are here to remind people not to use
1946 the CURRENT_DOCUMENT macros unless they really have to. */
1947 Inkscape::UI::View::View *current_view = sp_action_get_view(action);
1948 // SPDocument *current_document = SP_VIEW_DOCUMENT(current_view);
1949 Inkscape::Extension::Effect *effect = Inkscape::Extension::Effect::get_last_effect();
1951 if (effect == NULL) return;
1952 if (current_view == NULL) return;
1954 switch ((long) data) {
1955 case SP_VERB_EFFECT_LAST_PREF:
1956 if (!effect->prefs(current_view))
1957 return;
1958 /* Note: fall through */
1959 case SP_VERB_EFFECT_LAST:
1960 effect->effect(current_view);
1961 break;
1962 default:
1963 return;
1964 }
1966 return;
1967 }
1968 /* *********** End Effect Last ********** */
1970 /* *********** Fit Canvas ********** */
1972 /** \brief A class to represent the canvas fitting verbs */
1973 class FitCanvasVerb : public Verb {
1974 private:
1975 static void perform(SPAction *action, void *mydata, void *otherdata);
1976 static SPActionEventVector vector;
1977 protected:
1978 virtual SPAction *make_action(Inkscape::UI::View::View *view);
1979 public:
1980 /** \brief Use the Verb initializer with the same parameters. */
1981 FitCanvasVerb(unsigned int const code,
1982 gchar const *id,
1983 gchar const *name,
1984 gchar const *tip,
1985 gchar const *image) :
1986 Verb(code, id, name, tip, image)
1987 {
1988 set_default_sensitive(false);
1989 }
1990 }; /* FitCanvasVerb class */
1992 /**
1993 * The vector to attach in the fit canvas verb.
1994 */
1995 SPActionEventVector FitCanvasVerb::vector =
1996 {{NULL},FitCanvasVerb::perform, NULL, NULL, NULL, NULL};
1998 /** \brief Create an action for a \c FitCanvasVerb
1999 \param view Which view the action should be created for
2000 \return The built action.
2002 Calls \c make_action_helper with the \c vector.
2003 */
2004 SPAction *
2005 FitCanvasVerb::make_action(Inkscape::UI::View::View *view)
2006 {
2007 SPAction *action = make_action_helper(view, &vector);
2008 return action;
2009 }
2011 /** \brief Decode the verb code and take appropriate action */
2012 void
2013 FitCanvasVerb::perform(SPAction *action, void *data, void *pdata)
2014 {
2015 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
2016 if (!dt) return;
2017 SPDocument *doc = sp_desktop_document(dt);
2018 if (!doc) return;
2020 switch ((long) data) {
2021 case SP_VERB_FIT_CANVAS_TO_SELECTION:
2022 fit_canvas_to_selection(dt);
2023 break;
2024 case SP_VERB_FIT_CANVAS_TO_DRAWING:
2025 fit_canvas_to_drawing(doc);
2026 break;
2027 case SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING:
2028 fit_canvas_to_selection_or_drawing(dt);
2029 break;
2030 default:
2031 return;
2032 }
2034 return;
2035 }
2036 /* *********** End Fit Canvas ********** */
2039 /* *********** Lock'N'Hide ********** */
2041 /** \brief A class to represent the object unlocking and unhiding verbs */
2042 class LockAndHideVerb : public Verb {
2043 private:
2044 static void perform(SPAction *action, void *mydata, void *otherdata);
2045 static SPActionEventVector vector;
2046 protected:
2047 virtual SPAction *make_action(Inkscape::UI::View::View *view);
2048 public:
2049 /** \brief Use the Verb initializer with the same parameters. */
2050 LockAndHideVerb(unsigned int const code,
2051 gchar const *id,
2052 gchar const *name,
2053 gchar const *tip,
2054 gchar const *image) :
2055 Verb(code, id, name, tip, image)
2056 {
2057 set_default_sensitive(true);
2058 }
2059 }; /* LockAndHideVerb class */
2061 /**
2062 * The vector to attach in the lock'n'hide verb.
2063 */
2064 SPActionEventVector LockAndHideVerb::vector =
2065 {{NULL},LockAndHideVerb::perform, NULL, NULL, NULL, NULL};
2067 /** \brief Create an action for a \c LockAndHideVerb
2068 \param view Which view the action should be created for
2069 \return The built action.
2071 Calls \c make_action_helper with the \c vector.
2072 */
2073 SPAction *
2074 LockAndHideVerb::make_action(Inkscape::UI::View::View *view)
2075 {
2076 SPAction *action = make_action_helper(view, &vector);
2077 return action;
2078 }
2080 /** \brief Decode the verb code and take appropriate action */
2081 void
2082 LockAndHideVerb::perform(SPAction *action, void *data, void *pdata)
2083 {
2084 SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
2085 if (!dt) return;
2086 SPDocument *doc = sp_desktop_document(dt);
2087 if (!doc) return;
2089 switch ((long) data) {
2090 case SP_VERB_UNLOCK_ALL:
2091 unlock_all(dt);
2092 sp_document_done(doc, SP_VERB_UNLOCK_ALL, _("Unlock all objects in the current layer"));
2093 break;
2094 case SP_VERB_UNLOCK_ALL_IN_ALL_LAYERS:
2095 unlock_all_in_all_layers(dt);
2096 sp_document_done(doc, SP_VERB_UNLOCK_ALL_IN_ALL_LAYERS, _("Unlock all objects in all layers"));
2097 break;
2098 case SP_VERB_UNHIDE_ALL:
2099 unhide_all(dt);
2100 sp_document_done(doc, SP_VERB_UNHIDE_ALL, _("Unhide all objects in the current layer"));
2101 break;
2102 case SP_VERB_UNHIDE_ALL_IN_ALL_LAYERS:
2103 unhide_all_in_all_layers(dt);
2104 sp_document_done(doc, SP_VERB_UNHIDE_ALL_IN_ALL_LAYERS, _("Unhide all objects in all layers"));
2105 break;
2106 default:
2107 return;
2108 }
2110 return;
2111 }
2112 /* *********** End Lock'N'Hide ********** */
2115 /* these must be in the same order as the SP_VERB_* enum in "verbs.h" */
2116 Verb *Verb::_base_verbs[] = {
2117 /* Header */
2118 new Verb(SP_VERB_INVALID, NULL, NULL, NULL, NULL),
2119 new Verb(SP_VERB_NONE, "None", N_("None"), N_("Does nothing"), NULL),
2121 /* File */
2122 new FileVerb(SP_VERB_FILE_NEW, "FileNew", N_("Default"), N_("Create new document from the default template"),
2123 GTK_STOCK_NEW ),
2124 new FileVerb(SP_VERB_FILE_OPEN, "FileOpen", N_("_Open..."),
2125 N_("Open an existing document"), GTK_STOCK_OPEN ),
2126 new FileVerb(SP_VERB_FILE_REVERT, "FileRevert", N_("Re_vert"),
2127 N_("Revert to the last saved version of document (changes will be lost)"), GTK_STOCK_REVERT_TO_SAVED ),
2128 new FileVerb(SP_VERB_FILE_SAVE, "FileSave", N_("_Save"), N_("Save document"),
2129 GTK_STOCK_SAVE ),
2130 new FileVerb(SP_VERB_FILE_SAVE_AS, "FileSaveAs", N_("Save _As..."),
2131 N_("Save document under a new name"), GTK_STOCK_SAVE_AS ),
2132 new FileVerb(SP_VERB_FILE_SAVE_A_COPY, "FileSaveACopy", N_("Save a Cop_y..."),
2133 N_("Save a copy of the document under a new name"), NULL ),
2134 new FileVerb(SP_VERB_FILE_PRINT, "FilePrint", N_("_Print..."), N_("Print document"),
2135 GTK_STOCK_PRINT ),
2136 // TRANSLATORS: "Vacuum Defs" means "Clean up defs" (so as to remove unused definitions)
2137 new FileVerb(SP_VERB_FILE_VACUUM, "FileVacuum", N_("Vac_uum Defs"), N_("Remove unused definitions (such as gradients or clipping paths) from the <defs> of the document"),
2138 "file_vacuum" ),
2139 new FileVerb(SP_VERB_FILE_PRINT_DIRECT, "FilePrintDirect", N_("Print _Direct"),
2140 N_("Print directly without prompting to a file or pipe"), NULL ),
2141 new FileVerb(SP_VERB_FILE_PRINT_PREVIEW, "FilePrintPreview", N_("Print Previe_w"),
2142 N_("Preview document printout"), GTK_STOCK_PRINT_PREVIEW ),
2143 new FileVerb(SP_VERB_FILE_IMPORT, "FileImport", N_("_Import..."),
2144 N_("Import a bitmap or SVG image into this document"), "file_import"),
2145 new FileVerb(SP_VERB_FILE_EXPORT, "FileExport", N_("_Export Bitmap..."),
2146 N_("Export this document or a selection as a bitmap image"), "file_export"),
2147 new FileVerb(SP_VERB_FILE_NEXT_DESKTOP, "NextWindow", N_("N_ext Window"),
2148 N_("Switch to the next document window"), "window_next"),
2149 new FileVerb(SP_VERB_FILE_PREV_DESKTOP, "PrevWindow", N_("P_revious Window"),
2150 N_("Switch to the previous document window"), "window_previous"),
2151 new FileVerb(SP_VERB_FILE_CLOSE_VIEW, "FileClose", N_("_Close"),
2152 N_("Close this document window"), GTK_STOCK_CLOSE),
2153 new FileVerb(SP_VERB_FILE_QUIT, "FileQuit", N_("_Quit"), N_("Quit Inkscape"), GTK_STOCK_QUIT),
2155 /* Edit */
2156 new EditVerb(SP_VERB_EDIT_UNDO, "EditUndo", N_("_Undo"), N_("Undo last action"),
2157 GTK_STOCK_UNDO),
2158 new EditVerb(SP_VERB_EDIT_REDO, "EditRedo", N_("_Redo"),
2159 N_("Do again the last undone action"), GTK_STOCK_REDO),
2160 new EditVerb(SP_VERB_EDIT_CUT, "EditCut", N_("Cu_t"),
2161 N_("Cut selection to clipboard"), GTK_STOCK_CUT),
2162 new EditVerb(SP_VERB_EDIT_COPY, "EditCopy", N_("_Copy"),
2163 N_("Copy selection to clipboard"), GTK_STOCK_COPY),
2164 new EditVerb(SP_VERB_EDIT_PASTE, "EditPaste", N_("_Paste"),
2165 N_("Paste objects from clipboard to mouse point, or paste text"), GTK_STOCK_PASTE),
2166 new EditVerb(SP_VERB_EDIT_PASTE_STYLE, "EditPasteStyle", N_("Paste _Style"),
2167 N_("Apply the style of the copied object to selection"), "selection_paste_style"),
2168 new EditVerb(SP_VERB_EDIT_PASTE_SIZE, "EditPasteSize", N_("Paste Si_ze"),
2169 N_("Scale selection to match the size of the copied object"), NULL),
2170 new EditVerb(SP_VERB_EDIT_PASTE_SIZE_X, "EditPasteWidth", N_("Paste _Width"),
2171 N_("Scale selection horizontally to match the width of the copied object"), NULL),
2172 new EditVerb(SP_VERB_EDIT_PASTE_SIZE_Y, "EditPasteHeight", N_("Paste _Height"),
2173 N_("Scale selection vertically to match the height of the copied object"), NULL),
2174 new EditVerb(SP_VERB_EDIT_PASTE_SIZE_SEPARATELY, "EditPasteSizeSeparately", N_("Paste Size Separately"),
2175 N_("Scale each selected object to match the size of the copied object"), NULL),
2176 new EditVerb(SP_VERB_EDIT_PASTE_SIZE_SEPARATELY_X, "EditPasteWidthSeparately", N_("Paste Width Separately"),
2177 N_("Scale each selected object horizontally to match the width of the copied object"), NULL),
2178 new EditVerb(SP_VERB_EDIT_PASTE_SIZE_SEPARATELY_Y, "EditPasteHeightSeparately", N_("Paste Height Separately"),
2179 N_("Scale each selected object vertically to match the height of the copied object"), NULL),
2180 new EditVerb(SP_VERB_EDIT_PASTE_IN_PLACE, "EditPasteInPlace", N_("Paste _In Place"),
2181 N_("Paste objects from clipboard to the original location"), "selection_paste_in_place"),
2182 new EditVerb(SP_VERB_EDIT_DELETE, "EditDelete", N_("_Delete"),
2183 N_("Delete selection"), GTK_STOCK_DELETE),
2184 new EditVerb(SP_VERB_EDIT_DUPLICATE, "EditDuplicate", N_("Duplic_ate"),
2185 N_("Duplicate selected objects"), "edit_duplicate"),
2186 new EditVerb(SP_VERB_EDIT_CLONE, "EditClone", N_("Create Clo_ne"),
2187 N_("Create a clone (a copy linked to the original) of selected object"), "edit_clone"),
2188 new EditVerb(SP_VERB_EDIT_UNLINK_CLONE, "EditUnlinkClone", N_("Unlin_k Clone"),
2189 N_("Cut the selected clone's link to its original, turning it into a standalone object"), "edit_unlink_clone"),
2190 new EditVerb(SP_VERB_EDIT_CLONE_ORIGINAL, "EditCloneOriginal", N_("Select _Original"),
2191 N_("Select the object to which the selected clone is linked"), "edit_select_original"),
2192 // TRANSLATORS: Convert selection to a rectangle with tiled pattern fill
2193 new EditVerb(SP_VERB_EDIT_TILE, "ObjectsToPattern", N_("Objects to Patter_n"),
2194 N_("Convert selection to a rectangle with tiled pattern fill"), NULL),
2195 // TRANSLATORS: Extract objects from a tiled pattern fill
2196 new EditVerb(SP_VERB_EDIT_UNTILE, "ObjectsFromPattern", N_("Pattern to _Objects"),
2197 N_("Extract objects from a tiled pattern fill"), NULL),
2198 new EditVerb(SP_VERB_EDIT_CLEAR_ALL, "EditClearAll", N_("Clea_r All"),
2199 N_("Delete all objects from document"), NULL),
2200 new EditVerb(SP_VERB_EDIT_SELECT_ALL, "EditSelectAll", N_("Select Al_l"),
2201 N_("Select all objects or all nodes"), "selection_select_all"),
2202 new EditVerb(SP_VERB_EDIT_SELECT_ALL_IN_ALL_LAYERS, "EditSelectAllInAllLayers", N_("Select All in All La_yers"),
2203 N_("Select all objects in all visible and unlocked layers"), "selection_select_all_in_all_layers"),
2204 new EditVerb(SP_VERB_EDIT_INVERT, "EditInvert", N_("In_vert Selection"),
2205 N_("Invert selection (unselect what is selected and select everything else)"), "selection_invert"),
2206 new EditVerb(SP_VERB_EDIT_INVERT_IN_ALL_LAYERS, "EditInvertInAllLayers", N_("Invert in All Layers"),
2207 N_("Invert selection in all visible and unlocked layers"), NULL),
2208 new EditVerb(SP_VERB_EDIT_SELECT_NEXT, "EditSelectNext", N_("Select Next"),
2209 N_("Select next object or node"), NULL),
2210 new EditVerb(SP_VERB_EDIT_SELECT_PREV, "EditSelectPrev", N_("Select Previous"),
2211 N_("Select previous object or node"), NULL),
2212 new EditVerb(SP_VERB_EDIT_DESELECT, "EditDeselect", N_("D_eselect"),
2213 N_("Deselect any selected objects or nodes"), "selection_deselect"),
2215 /* Selection */
2216 new SelectionVerb(SP_VERB_SELECTION_TO_FRONT, "SelectionToFront", N_("Raise to _Top"),
2217 N_("Raise selection to top"), "selection_top"),
2218 new SelectionVerb(SP_VERB_SELECTION_TO_BACK, "SelectionToBack", N_("Lower to _Bottom"),
2219 N_("Lower selection to bottom"), "selection_bot"),
2220 new SelectionVerb(SP_VERB_SELECTION_RAISE, "SelectionRaise", N_("_Raise"),
2221 N_("Raise selection one step"), "selection_up"),
2222 new SelectionVerb(SP_VERB_SELECTION_LOWER, "SelectionLower", N_("_Lower"),
2223 N_("Lower selection one step"), "selection_down"),
2224 new SelectionVerb(SP_VERB_SELECTION_GROUP, "SelectionGroup", N_("_Group"),
2225 N_("Group selected objects"), "selection_group"),
2226 new SelectionVerb(SP_VERB_SELECTION_UNGROUP, "SelectionUnGroup", N_("_Ungroup"),
2227 N_("Ungroup selected groups"), "selection_ungroup"),
2229 new SelectionVerb(SP_VERB_SELECTION_TEXTTOPATH, "SelectionTextToPath", N_("_Put on Path"),
2230 N_("Put text on path"), "put_on_path"),
2231 new SelectionVerb(SP_VERB_SELECTION_TEXTFROMPATH, "SelectionTextFromPath", N_("_Remove from Path"),
2232 N_("Remove text from path"), "remove_from_path"),
2233 new SelectionVerb(SP_VERB_SELECTION_REMOVE_KERNS, "SelectionTextRemoveKerns", N_("Remove Manual _Kerns"),
2234 // TRANSLATORS: "glyph": An image used in the visual representation of characters;
2235 // roughly speaking, how a character looks. A font is a set of glyphs.
2236 N_("Remove all manual kerns and glyph rotations from a text object"), "remove_manual_kerns"),
2238 new SelectionVerb(SP_VERB_SELECTION_UNION, "SelectionUnion", N_("_Union"),
2239 N_("Create union of selected paths"), "union"),
2240 new SelectionVerb(SP_VERB_SELECTION_INTERSECT, "SelectionIntersect", N_("_Intersection"),
2241 N_("Create intersection of selected paths"), "intersection"),
2242 new SelectionVerb(SP_VERB_SELECTION_DIFF, "SelectionDiff", N_("_Difference"),
2243 N_("Create difference of selected paths (bottom minus top)"), "difference"),
2244 new SelectionVerb(SP_VERB_SELECTION_SYMDIFF, "SelectionSymDiff", N_("E_xclusion"),
2245 N_("Create exclusive OR of selected paths (those parts that belong to only one path)"), "exclusion"),
2246 new SelectionVerb(SP_VERB_SELECTION_CUT, "SelectionDivide", N_("Di_vision"),
2247 N_("Cut the bottom path into pieces"), "division"),
2248 // TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
2249 // Advanced tutorial for more info
2250 new SelectionVerb(SP_VERB_SELECTION_SLICE, "SelectionCutPath", N_("Cut _Path"),
2251 N_("Cut the bottom path's stroke into pieces, removing fill"), "cut_path"),
2252 // TRANSLATORS: "outset": expand a shape by offsetting the object's path,
2253 // i.e. by displacing it perpendicular to the path in each point.
2254 // See also the Advanced Tutorial for explanation.
2255 new SelectionVerb(SP_VERB_SELECTION_OFFSET, "SelectionOffset", N_("Outs_et"),
2256 N_("Outset selected paths"), "outset_path"),
2257 new SelectionVerb(SP_VERB_SELECTION_OFFSET_SCREEN, "SelectionOffsetScreen",
2258 N_("O_utset Path by 1 px"),
2259 N_("Outset selected paths by 1 px"), NULL),
2260 new SelectionVerb(SP_VERB_SELECTION_OFFSET_SCREEN_10, "SelectionOffsetScreen10",
2261 N_("O_utset Path by 10 px"),
2262 N_("Outset selected paths by 10 px"), NULL),
2263 // TRANSLATORS: "inset": contract a shape by offsetting the object's path,
2264 // i.e. by displacing it perpendicular to the path in each point.
2265 // See also the Advanced Tutorial for explanation.
2266 new SelectionVerb(SP_VERB_SELECTION_INSET, "SelectionInset", N_("I_nset"),
2267 N_("Inset selected paths"), "inset_path"),
2268 new SelectionVerb(SP_VERB_SELECTION_INSET_SCREEN, "SelectionInsetScreen",
2269 N_("I_nset Path by 1 px"),
2270 N_("Inset selected paths by 1 px"), NULL),
2271 new SelectionVerb(SP_VERB_SELECTION_INSET_SCREEN_10, "SelectionInsetScreen10",
2272 N_("I_nset Path by 10 px"),
2273 N_("Inset selected paths by 10 px"), NULL),
2274 new SelectionVerb(SP_VERB_SELECTION_DYNAMIC_OFFSET, "SelectionDynOffset",
2275 N_("D_ynamic Offset"), N_("Create a dynamic offset object"), "dynamic_offset"),
2276 new SelectionVerb(SP_VERB_SELECTION_LINKED_OFFSET, "SelectionLinkedOffset",
2277 N_("_Linked Offset"),
2278 N_("Create a dynamic offset object linked to the original path"),
2279 "linked_offset"),
2280 new SelectionVerb(SP_VERB_SELECTION_OUTLINE, "StrokeToPath", N_("_Stroke to Path"),
2281 N_("Convert selected object's stroke to paths"), "stroke_tocurve"),
2282 new SelectionVerb(SP_VERB_SELECTION_SIMPLIFY, "SelectionSimplify", N_("Si_mplify"),
2283 N_("Simplify selected paths (remove extra nodes)"), "simplify"),
2284 new SelectionVerb(SP_VERB_SELECTION_REVERSE, "SelectionReverse", N_("_Reverse"),
2285 N_("Reverse the direction of selected paths (useful for flipping markers)"), "selection_reverse"),
2286 // TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
2287 new SelectionVerb(SP_VERB_SELECTION_TRACE, "SelectionTrace", N_("_Trace Bitmap..."),
2288 N_("Create one or more paths from a bitmap by tracing it"), "selection_trace"),
2289 new SelectionVerb(SP_VERB_SELECTION_CREATE_BITMAP, "SelectionCreateBitmap", N_("_Make a Bitmap Copy"),
2290 N_("Export selection to a bitmap and insert it into document"), "selection_bitmap" ),
2291 new SelectionVerb(SP_VERB_SELECTION_COMBINE, "SelectionCombine", N_("_Combine"),
2292 N_("Combine several paths into one"), "selection_combine"),
2293 // TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
2294 // Advanced tutorial for more info
2295 new SelectionVerb(SP_VERB_SELECTION_BREAK_APART, "SelectionBreakApart", N_("Break _Apart"),
2296 N_("Break selected paths into subpaths"), "selection_break"),
2297 new SelectionVerb(SP_VERB_SELECTION_GRIDTILE, "DialogGridArrange", N_("Gri_d Arrange..."),
2298 N_("Arrange selected objects in a grid pattern"), "grid_arrange"),
2299 /* Layer */
2300 new LayerVerb(SP_VERB_LAYER_NEW, "LayerNew", N_("_Add Layer..."),
2301 N_("Create a new layer"), "new_layer"),
2302 new LayerVerb(SP_VERB_LAYER_RENAME, "LayerRename", N_("Re_name Layer..."),
2303 N_("Rename the current layer"), "rename_layer"),
2304 new LayerVerb(SP_VERB_LAYER_NEXT, "LayerNext", N_("Switch to Layer Abov_e"),
2305 N_("Switch to the layer above the current"), "switch_to_layer_above"),
2306 new LayerVerb(SP_VERB_LAYER_PREV, "LayerPrev", N_("Switch to Layer Belo_w"),
2307 N_("Switch to the layer below the current"), "switch_to_layer_below"),
2308 new LayerVerb(SP_VERB_LAYER_MOVE_TO_NEXT, "LayerMoveToNext", N_("Move Selection to Layer Abo_ve"),
2309 N_("Move selection to the layer above the current"), "move_selection_above"),
2310 new LayerVerb(SP_VERB_LAYER_MOVE_TO_PREV, "LayerMoveToPrev", N_("Move Selection to Layer Bel_ow"),
2311 N_("Move selection to the layer below the current"), "move_selection_below"),
2312 new LayerVerb(SP_VERB_LAYER_TO_TOP, "LayerToTop", N_("Layer to _Top"),
2313 N_("Raise the current layer to the top"), "layer_to_top"),
2314 new LayerVerb(SP_VERB_LAYER_TO_BOTTOM, "LayerToBottom", N_("Layer to _Bottom"),
2315 N_("Lower the current layer to the bottom"), "layer_to_bottom"),
2316 new LayerVerb(SP_VERB_LAYER_RAISE, "LayerRaise", N_("_Raise Layer"),
2317 N_("Raise the current layer"), "raise_layer"),
2318 new LayerVerb(SP_VERB_LAYER_LOWER, "LayerLower", N_("_Lower Layer"),
2319 N_("Lower the current layer"), "lower_layer"),
2320 new LayerVerb(SP_VERB_LAYER_DELETE, "LayerDelete", N_("_Delete Current Layer"),
2321 N_("Delete the current layer"), "delete_layer"),
2323 /* Object */
2324 new ObjectVerb(SP_VERB_OBJECT_ROTATE_90_CW, "ObjectRotate90", N_("Rotate _90° CW"),
2325 // This is shared between tooltips and statusbar, so they
2326 // must use UTF-8, not HTML entities for special characters.
2327 N_("Rotate selection 90\xc2\xb0 clockwise"), "object_rotate_90_CW"),
2328 new ObjectVerb(SP_VERB_OBJECT_ROTATE_90_CCW, "ObjectRotate90CCW", N_("Rotate 9_0° CCW"),
2329 // This is shared between tooltips and statusbar, so they
2330 // must use UTF-8, not HTML entities for special characters.
2331 N_("Rotate selection 90\xc2\xb0 counter-clockwise"), "object_rotate_90_CCW"),
2332 new ObjectVerb(SP_VERB_OBJECT_FLATTEN, "ObjectRemoveTransform", N_("Remove _Transformations"),
2333 N_("Remove transformations from object"), "object_reset"),
2334 new ObjectVerb(SP_VERB_OBJECT_TO_CURVE, "ObjectToPath", N_("_Object to Path"),
2335 N_("Convert selected object to path"), "object_tocurve"),
2336 new ObjectVerb(SP_VERB_OBJECT_FLOW_TEXT, "ObjectFlowText", N_("_Flow into Frame"),
2337 N_("Put text into a frame (path or shape), creating a flowed text linked to the frame object"), "flow_into_frame"),
2338 new ObjectVerb(SP_VERB_OBJECT_UNFLOW_TEXT, "ObjectUnFlowText", N_("_Unflow"),
2339 N_("Remove text from frame (creates a single-line text object)"), "unflow"),
2340 new ObjectVerb(SP_VERB_OBJECT_FLOWTEXT_TO_TEXT, "ObjectFlowtextToText", N_("_Convert to Text"),
2341 N_("Convert flowed text to regular text object (preserves appearance)"), "convert_to_text"),
2342 new ObjectVerb(SP_VERB_OBJECT_FLIP_HORIZONTAL, "ObjectFlipHorizontally",
2343 N_("Flip _Horizontal"), N_("Flip selected objects horizontally"),
2344 "object_flip_hor"),
2345 new ObjectVerb(SP_VERB_OBJECT_FLIP_VERTICAL, "ObjectFlipVertically",
2346 N_("Flip _Vertical"), N_("Flip selected objects vertically"),
2347 "object_flip_ver"),
2348 new ObjectVerb(SP_VERB_OBJECT_SET_MASK, "ObjectSetMask", N_("_Set"),
2349 N_("Apply mask to selection (using the topmost object as mask)"), NULL),
2350 new ObjectVerb(SP_VERB_OBJECT_UNSET_MASK, "ObjectUnSetMask", N_("_Release"),
2351 N_("Remove mask from selection"), NULL),
2352 new ObjectVerb(SP_VERB_OBJECT_SET_CLIPPATH, "ObjectSetClipPath", N_("_Set"),
2353 N_("Apply clipping path to selection (using the topmost object as clipping path)"), NULL),
2354 new ObjectVerb(SP_VERB_OBJECT_UNSET_CLIPPATH, "ObjectUnSetClipPath", N_("_Release"),
2355 N_("Remove clipping path from selection"), NULL),
2357 /* Tools */
2358 new ContextVerb(SP_VERB_CONTEXT_SELECT, "ToolSelector", N_("Select"),
2359 N_("Select and transform objects"), "draw_select"),
2360 new ContextVerb(SP_VERB_CONTEXT_NODE, "ToolNode", N_("Node Edit"),
2361 N_("Edit path nodes or control handles"), "draw_node"),
2362 new ContextVerb(SP_VERB_CONTEXT_RECT, "ToolRect", N_("Rectangle"),
2363 N_("Create rectangles and squares"), "draw_rect"),
2364 new ContextVerb(SP_VERB_CONTEXT_3DBOX, "Tool3DBox", N_("3D Box"),
2365 N_("Create 3D boxes"), "draw_3dbox"),
2366 new ContextVerb(SP_VERB_CONTEXT_ARC, "ToolArc", N_("Ellipse"),
2367 N_("Create circles, ellipses, and arcs"), "draw_arc"),
2368 new ContextVerb(SP_VERB_CONTEXT_STAR, "ToolStar", N_("Star"),
2369 N_("Create stars and polygons"), "draw_star"),
2370 new ContextVerb(SP_VERB_CONTEXT_SPIRAL, "ToolSpiral", N_("Spiral"),
2371 N_("Create spirals"), "draw_spiral"),
2372 new ContextVerb(SP_VERB_CONTEXT_PENCIL, "ToolPencil", N_("Pencil"),
2373 N_("Draw freehand lines"), "draw_freehand"),
2374 new ContextVerb(SP_VERB_CONTEXT_PEN, "ToolPen", N_("Pen"),
2375 N_("Draw Bezier curves and straight lines"), "draw_pen"),
2376 new ContextVerb(SP_VERB_CONTEXT_CALLIGRAPHIC, "ToolCalligraphic", N_("Calligraphy"),
2377 N_("Draw calligraphic lines"), "draw_calligraphic"),
2378 new ContextVerb(SP_VERB_CONTEXT_TEXT, "ToolText", N_("Text"),
2379 N_("Create and edit text objects"), "draw_text"),
2380 new ContextVerb(SP_VERB_CONTEXT_GRADIENT, "ToolGradient", N_("Gradient"),
2381 N_("Create and edit gradients"), "draw_gradient"),
2382 new ContextVerb(SP_VERB_CONTEXT_ZOOM, "ToolZoom", N_("Zoom"),
2383 N_("Zoom in or out"), "draw_zoom"),
2384 new ContextVerb(SP_VERB_CONTEXT_DROPPER, "ToolDropper", N_("Dropper"),
2385 N_("Pick colors from image"), "draw_dropper"),
2386 new ContextVerb(SP_VERB_CONTEXT_CONNECTOR, "ToolConnector", N_("Connector"),
2387 N_("Create connectors"), "draw_connector"),
2388 new ContextVerb(SP_VERB_CONTEXT_PAINTBUCKET, "ToolPaintBucket", N_("Paint Bucket"),
2389 N_("Fill bounded areas"), "draw_paintbucket"),
2391 /* Tool prefs */
2392 new ContextVerb(SP_VERB_CONTEXT_SELECT_PREFS, "SelectPrefs", N_("Selector Preferences"),
2393 N_("Open Preferences for the Selector tool"), NULL),
2394 new ContextVerb(SP_VERB_CONTEXT_NODE_PREFS, "NodePrefs", N_("Node Tool Preferences"),
2395 N_("Open Preferences for the Node tool"), NULL),
2396 new ContextVerb(SP_VERB_CONTEXT_RECT_PREFS, "RectPrefs", N_("Rectangle Preferences"),
2397 N_("Open Preferences for the Rectangle tool"), NULL),
2398 new ContextVerb(SP_VERB_CONTEXT_3DBOX_PREFS, "3DBoxPrefs", N_("3D Box Preferences"),
2399 N_("Open Preferences for the 3D Box tool"), NULL),
2400 new ContextVerb(SP_VERB_CONTEXT_ARC_PREFS, "ArcPrefs", N_("Ellipse Preferences"),
2401 N_("Open Preferences for the Ellipse tool"), NULL),
2402 new ContextVerb(SP_VERB_CONTEXT_STAR_PREFS, "StarPrefs", N_("Star Preferences"),
2403 N_("Open Preferences for the Star tool"), NULL),
2404 new ContextVerb(SP_VERB_CONTEXT_SPIRAL_PREFS, "SpiralPrefs", N_("Spiral Preferences"),
2405 N_("Open Preferences for the Spiral tool"), NULL),
2406 new ContextVerb(SP_VERB_CONTEXT_PENCIL_PREFS, "PencilPrefs", N_("Pencil Preferences"),
2407 N_("Open Preferences for the Pencil tool"), NULL),
2408 new ContextVerb(SP_VERB_CONTEXT_PEN_PREFS, "PenPrefs", N_("Pen Preferences"),
2409 N_("Open Preferences for the Pen tool"), NULL),
2410 new ContextVerb(SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS, "CalligraphicPrefs", N_("Calligraphic Preferences"),
2411 N_("Open Preferences for the Calligraphy tool"), NULL),
2412 new ContextVerb(SP_VERB_CONTEXT_TEXT_PREFS, "TextPrefs", N_("Text Preferences"),
2413 N_("Open Preferences for the Text tool"), NULL),
2414 new ContextVerb(SP_VERB_CONTEXT_GRADIENT_PREFS, "GradientPrefs", N_("Gradient Preferences"),
2415 N_("Open Preferences for the Gradient tool"), NULL),
2416 new ContextVerb(SP_VERB_CONTEXT_ZOOM_PREFS, "ZoomPrefs", N_("Zoom Preferences"),
2417 N_("Open Preferences for the Zoom tool"), NULL),
2418 new ContextVerb(SP_VERB_CONTEXT_DROPPER_PREFS, "DropperPrefs", N_("Dropper Preferences"),
2419 N_("Open Preferences for the Dropper tool"), NULL),
2420 new ContextVerb(SP_VERB_CONTEXT_CONNECTOR_PREFS, "ConnectorPrefs", N_("Connector Preferences"),
2421 N_("Open Preferences for the Connector tool"), NULL),
2422 new ContextVerb(SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "PaintBucketPrefs", N_("Paint Bucket Preferences"),
2423 N_("Open Preferences for the Paint Bucket tool"), NULL),
2425 /* Zoom/View */
2426 new ZoomVerb(SP_VERB_ZOOM_IN, "ZoomIn", N_("Zoom In"), N_("Zoom in"), "zoom_in"),
2427 new ZoomVerb(SP_VERB_ZOOM_OUT, "ZoomOut", N_("Zoom Out"), N_("Zoom out"), "zoom_out"),
2428 new ZoomVerb(SP_VERB_TOGGLE_RULERS, "ToggleRulers", N_("_Rulers"), N_("Show or hide the canvas rulers"), "rulers"),
2429 new ZoomVerb(SP_VERB_TOGGLE_SCROLLBARS, "ToggleScrollbars", N_("Scroll_bars"), N_("Show or hide the canvas scrollbars"), "scrollbars"),
2430 new ZoomVerb(SP_VERB_TOGGLE_GRID, "ToggleGrid", N_("_Grid"), N_("Show or hide the grid"), "grid"),
2431 new ZoomVerb(SP_VERB_TOGGLE_GUIDES, "ToggleGuides", N_("G_uides"), N_("Show or hide guides (drag from a ruler to create a guide)"), "guides"),
2432 new ZoomVerb(SP_VERB_ZOOM_NEXT, "ZoomNext", N_("Nex_t Zoom"), N_("Next zoom (from the history of zooms)"),
2433 "zoom_next"),
2434 new ZoomVerb(SP_VERB_ZOOM_PREV, "ZoomPrev", N_("Pre_vious Zoom"), N_("Previous zoom (from the history of zooms)"),
2435 "zoom_previous"),
2436 new ZoomVerb(SP_VERB_ZOOM_1_1, "Zoom1:0", N_("Zoom 1:_1"), N_("Zoom to 1:1"),
2437 "zoom_1_to_1"),
2438 new ZoomVerb(SP_VERB_ZOOM_1_2, "Zoom1:2", N_("Zoom 1:_2"), N_("Zoom to 1:2"),
2439 "zoom_1_to_2"),
2440 new ZoomVerb(SP_VERB_ZOOM_2_1, "Zoom2:1", N_("_Zoom 2:1"), N_("Zoom to 2:1"),
2441 "zoom_2_to_1"),
2442 #ifdef HAVE_GTK_WINDOW_FULLSCREEN
2443 new ZoomVerb(SP_VERB_FULLSCREEN, "FullScreen", N_("_Fullscreen"), N_("Stretch this document window to full screen"),
2444 "fullscreen"),
2445 #endif /* HAVE_GTK_WINDOW_FULLSCREEN */
2446 new ZoomVerb(SP_VERB_VIEW_NEW, "ViewNew", N_("Duplic_ate Window"), N_("Open a new window with the same document"),
2447 "view_new"),
2448 new ZoomVerb(SP_VERB_VIEW_NEW_PREVIEW, "ViewNewPreview", N_("_New View Preview"),
2449 N_("New View Preview"), NULL/*"view_new_preview"*/),
2451 new ZoomVerb(SP_VERB_VIEW_MODE_NORMAL, "ViewModeNormal", N_("_Normal"),
2452 N_("Switch to normal display mode"), NULL),
2453 new ZoomVerb(SP_VERB_VIEW_MODE_OUTLINE, "ViewModeOutline", N_("_Outline"),
2454 N_("Switch to outline (wireframe) display mode"), NULL),
2455 new ZoomVerb(SP_VERB_VIEW_MODE_TOGGLE, "ViewModeToggle", N_("_Toggle"),
2456 N_("Toggle between normal and outline display modes"), NULL),
2458 new ZoomVerb(SP_VERB_VIEW_ICON_PREVIEW, "ViewIconPreview", N_("Ico_n Preview..."),
2459 N_("Open a window to preview objects at different icon resolutions"), "view_icon_preview"),
2460 new ZoomVerb(SP_VERB_ZOOM_PAGE, "ZoomPage", N_("_Page"),
2461 N_("Zoom to fit page in window"), "zoom_page"),
2462 new ZoomVerb(SP_VERB_ZOOM_PAGE_WIDTH, "ZoomPageWidth", N_("Page _Width"),
2463 N_("Zoom to fit page width in window"), "zoom_pagewidth"),
2464 new ZoomVerb(SP_VERB_ZOOM_DRAWING, "ZoomDrawing", N_("_Drawing"),
2465 N_("Zoom to fit drawing in window"), "zoom_draw"),
2466 new ZoomVerb(SP_VERB_ZOOM_SELECTION, "ZoomSelection", N_("_Selection"),
2467 N_("Zoom to fit selection in window"), "zoom_select"),
2469 /* Dialogs */
2470 new DialogVerb(SP_VERB_DIALOG_DISPLAY, "DialogPreferences", N_("In_kscape Preferences..."),
2471 N_("Edit global Inkscape preferences"), GTK_STOCK_PREFERENCES ),
2472 new DialogVerb(SP_VERB_DIALOG_NAMEDVIEW, "DialogDocumentProperties", N_("_Document Properties..."),
2473 N_("Edit properties of this document (to be saved with the document)"), GTK_STOCK_PROPERTIES ),
2474 new DialogVerb(SP_VERB_DIALOG_METADATA, "DialogMetadata", N_("Document _Metadata..."),
2475 N_("Edit document metadata (to be saved with the document)"), "document_metadata" ),
2476 new DialogVerb(SP_VERB_DIALOG_FILL_STROKE, "DialogFillStroke", N_("_Fill and Stroke..."),
2477 N_("Edit objects' colors, gradients, stroke width, arrowheads, dash patterns..."), "fill_and_stroke"),
2478 // TRANSLATORS: "Swatches" means: color samples
2479 new DialogVerb(SP_VERB_DIALOG_SWATCHES, "DialogSwatches", N_("S_watches..."),
2480 N_("Select colors from a swatches palette"), GTK_STOCK_SELECT_COLOR),
2481 new DialogVerb(SP_VERB_DIALOG_TRANSFORM, "DialogTransform", N_("Transfor_m..."),
2482 N_("Precisely control objects' transformations"), "object_trans"),
2483 new DialogVerb(SP_VERB_DIALOG_ALIGN_DISTRIBUTE, "DialogAlignDistribute", N_("_Align and Distribute..."),
2484 N_("Align and distribute objects"), "object_align"),
2485 new DialogVerb(SP_VERB_DIALOG_UNDO_HISTORY, "DialogUndoHistory", N_("Undo _History..."),
2486 N_("Undo History"), "edit_undo_history"),
2487 new DialogVerb(SP_VERB_DIALOG_TEXT, "DialogText", N_("_Text and Font..."),
2488 N_("View and select font family, font size and other text properties"), "object_font"),
2489 new DialogVerb(SP_VERB_DIALOG_XML_EDITOR, "DialogXMLEditor", N_("_XML Editor..."),
2490 N_("View and edit the XML tree of the document"), "xml_editor"),
2491 new DialogVerb(SP_VERB_DIALOG_FIND, "DialogFind", N_("_Find..."),
2492 N_("Find objects in document"), GTK_STOCK_FIND ),
2493 new DialogVerb(SP_VERB_DIALOG_DEBUG, "DialogDebug", N_("_Messages..."),
2494 N_("View debug messages"), "messages"),
2495 new DialogVerb(SP_VERB_DIALOG_SCRIPT, "DialogScript", N_("S_cripts..."),
2496 N_("Run scripts"), "scripts"),
2497 new DialogVerb(SP_VERB_DIALOG_TOGGLE, "DialogsToggle", N_("Show/Hide D_ialogs"),
2498 N_("Show or hide all open dialogs"), "dialog_toggle"),
2499 new DialogVerb(SP_VERB_DIALOG_CLONETILER, "DialogClonetiler", N_("Create Tiled Clones..."),
2500 N_("Create multiple clones of selected object, arranging them into a pattern or scattering"), "edit_create_tiled_clones"),
2501 new DialogVerb(SP_VERB_DIALOG_ITEM, "DialogObjectProperties", N_("_Object Properties..."),
2502 N_("Edit the ID, locked and visible status, and other object properties"), "dialog_item_properties"),
2503 #ifdef WITH_INKBOARD
2504 new DialogVerb(SP_VERB_XMPP_CLIENT, "DialogXmppClient",
2505 N_("_Instant Messaging..."), N_("Jabber Instant Messaging Client"), NULL),
2506 #endif
2507 new DialogVerb(SP_VERB_DIALOG_INPUT, "DialogInput", N_("_Input Devices..."),
2508 N_("Configure extended input devices, such as a graphics tablet"), "input_devices"),
2509 new DialogVerb(SP_VERB_DIALOG_EXTENSIONEDITOR, "org.inkscape.dialogs.extensioneditor", N_("_Extensions..."),
2510 N_("Query information about extensions"), NULL),
2511 new DialogVerb(SP_VERB_DIALOG_LAYERS, "DialogLayers", N_("Layer_s..."),
2512 N_("View Layers"), "layers"),
2513 new DialogVerb(SP_VERB_DIALOG_FILTER_EFFECTS, "DialogFilterEffects", N_("Filter Effects..."),
2514 N_("Manage SVG filter effects"), NULL),
2516 /* Help */
2517 new HelpVerb(SP_VERB_HELP_KEYS, "HelpKeys", N_("_Keys and Mouse"),
2518 N_("Keys and mouse shortcuts reference"), "help_keys"),
2519 new HelpVerb(SP_VERB_HELP_ABOUT_EXTENSIONS, "HelpAboutExtensions", N_("About E_xtensions"),
2520 N_("Information on Inkscape extensions"), NULL),
2521 new HelpVerb(SP_VERB_HELP_MEMORY, "HelpAboutMemory", N_("About _Memory"),
2522 N_("Memory usage information"), "about_memory"),
2523 new HelpVerb(SP_VERB_HELP_ABOUT, "HelpAbout", N_("_About Inkscape"),
2524 N_("Inkscape version, authors, license"), /*"help_about"*/"inkscape_options"),
2525 //new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"),
2526 // N_("Distribution terms"), /*"show_license"*/"inkscape_options"),
2528 /* Tutorials */
2529 new TutorialVerb(SP_VERB_TUTORIAL_BASIC, "TutorialsBasic", N_("Inkscape: _Basic"),
2530 N_("Getting started with Inkscape"), NULL/*"tutorial_basic"*/),
2531 new TutorialVerb(SP_VERB_TUTORIAL_SHAPES, "TutorialsShapes", N_("Inkscape: _Shapes"),
2532 N_("Using shape tools to create and edit shapes"), NULL),
2533 new TutorialVerb(SP_VERB_TUTORIAL_ADVANCED, "TutorialsAdvanced", N_("Inkscape: _Advanced"),
2534 N_("Advanced Inkscape topics"), NULL/*"tutorial_advanced"*/),
2535 // TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
2536 new TutorialVerb(SP_VERB_TUTORIAL_TRACING, "TutorialsTracing", N_("Inkscape: T_racing"),
2537 N_("Using bitmap tracing"), NULL/*"tutorial_tracing"*/),
2538 new TutorialVerb(SP_VERB_TUTORIAL_CALLIGRAPHY, "TutorialsCalligraphy", N_("Inkscape: _Calligraphy"),
2539 N_("Using the Calligraphy pen tool"), NULL),
2540 new TutorialVerb(SP_VERB_TUTORIAL_DESIGN, "TutorialsDesign", N_("_Elements of Design"),
2541 N_("Principles of design in the tutorial form"), NULL/*"tutorial_design"*/),
2542 new TutorialVerb(SP_VERB_TUTORIAL_TIPS, "TutorialsTips", N_("_Tips and Tricks"),
2543 N_("Miscellaneous tips and tricks"), NULL/*"tutorial_tips"*/),
2545 /* Effect */
2546 new EffectLastVerb(SP_VERB_EFFECT_LAST, "EffectLast", N_("Previous Effect"),
2547 N_("Repeat the last effect with the same settings"), NULL),
2548 new EffectLastVerb(SP_VERB_EFFECT_LAST_PREF, "EffectLastPref", N_("Previous Effect Settings..."),
2549 N_("Repeat the last effect with new settings"), NULL),
2551 /* Fit Page */
2552 new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_SELECTION, "FitCanvasToSelection", N_("Fit Page to Selection"),
2553 N_("Fit the page to the current selection"), NULL),
2554 new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_DRAWING, "FitCanvasToDrawing", N_("Fit Page to Drawing"),
2555 N_("Fit the page to the drawing"), NULL),
2556 new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING, "FitCanvasToSelectionOrDrawing", N_("Fit Page to Selection or Drawing"),
2557 N_("Fit the page to the current selection or the drawing if there is no selection"), NULL),
2558 /* LockAndHide */
2559 new LockAndHideVerb(SP_VERB_UNLOCK_ALL, "UnlockAll", N_("Unlock All"),
2560 N_("Unlock all objects in the current layer"), NULL),
2561 new LockAndHideVerb(SP_VERB_UNLOCK_ALL_IN_ALL_LAYERS, "UnlockAllInAllLayers", N_("Unlock All in All Layers"),
2562 N_("Unlock all objects in all layers"), NULL),
2563 new LockAndHideVerb(SP_VERB_UNHIDE_ALL, "UnhideAll", N_("Unhide All"),
2564 N_("Unhide all objects in the current layer"), NULL),
2565 new LockAndHideVerb(SP_VERB_UNHIDE_ALL_IN_ALL_LAYERS, "UnhideAllInAllLayers", N_("Unhide All in All Layers"),
2566 N_("Unhide all objects in all layers"), NULL),
2567 /* Footer */
2568 new Verb(SP_VERB_LAST, " '\"invalid id", NULL, NULL, NULL)
2569 };
2572 void
2573 Verb::list (void) {
2574 // Go through the dynamic verb table
2575 for (VerbTable::iterator iter = _verbs.begin(); iter != _verbs.end(); iter++) {
2576 Verb * verb = iter->second;
2577 if (verb->get_code() == SP_VERB_INVALID ||
2578 verb->get_code() == SP_VERB_NONE ||
2579 verb->get_code() == SP_VERB_LAST) {
2580 continue;
2581 }
2583 printf("%s: %s\n", verb->get_id(), verb->get_tip()? verb->get_tip() : verb->get_name());
2584 }
2586 return;
2587 };
2589 } /* namespace Inkscape */
2591 /*
2592 Local Variables:
2593 mode:c++
2594 c-file-style:"stroustrup"
2595 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
2596 indent-tabs-mode:nil
2597 fill-column:99
2598 End:
2599 */
2600 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :