Code

Pot and Dutch translation update
[inkscape.git] / src / dialogs / find.cpp
1 /** @file
2  * @brief  Find dialog
3  */
4 /* Authors:
5  *   bulia byak <bulia@users.sf.net>
6  *
7  * Copyright (C) 2004 Authors
8  *
9  * Released under GNU GPL, read the file 'COPYING' for more information
10  */
12 #include "widgets/icon.h"
13 #include "message-stack.h"
15 //TODO  : delete this
16 GtkWidget * sp_find_dialog_old (void);
18 void
19 //GtkWidget *
20 sp_find_dialog(){
21     // DialogFind::get().present();
22     sp_find_dialog_old ();
23     return;
24 }
27 #include <gtk/gtk.h>
29 #include <glibmm/i18n.h>
30 #include "helper/window.h"
31 #include "macros.h"
32 #include "inkscape.h"
33 #include "document.h"
34 #include "desktop.h"
35 #include "selection.h"
36 #include "desktop-handles.h"
38 #include "dialog-events.h"
39 #include "../preferences.h"
40 #include "../verbs.h"
41 #include "../interface.h"
42 #include "../sp-text.h"
43 #include "../sp-flowtext.h"
44 #include "../text-editing.h"
45 #include "../sp-tspan.h"
46 #include "../sp-tref.h"
47 #include "../selection-chemistry.h"
48 #include "../sp-defs.h"
49 #include "../sp-rect.h"
50 #include "../sp-ellipse.h"
51 #include "../sp-star.h"
52 #include "../sp-spiral.h"
53 #include "../sp-path.h"
54 #include "../sp-line.h"
55 #include "../sp-polyline.h"
56 #include "../sp-item-group.h"
57 #include "../sp-use.h"
58 #include "../sp-image.h"
59 #include "../sp-offset.h"
60 #include <xml/repr.h>
62 #define MIN_ONSCREEN_DISTANCE 50
64 static GtkWidget *dlg = NULL;
65 static win_data wd;
67 // impossible original values to make sure they are read from prefs
68 static gint x = -1000, y = -1000, w = 0, h = 0;
69 static Glib::ustring const prefs_path = "/dialogs/find/";
74 static void sp_find_dialog_destroy(GtkObject *object, gpointer)
75 {
76     sp_signal_disconnect_by_data (INKSCAPE, object);
77     wd.win = dlg = NULL;
78     wd.stop = 0;
79 }
83 static gboolean sp_find_dialog_delete(GtkObject *, GdkEvent *, gpointer /*data*/)
84 {
85     gtk_window_get_position (GTK_WINDOW (dlg), &x, &y);
86     gtk_window_get_size (GTK_WINDOW (dlg), &w, &h);
88     if (x<0) x=0;
89     if (y<0) y=0;
91     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
92     prefs->setInt(prefs_path + "x", x);
93     prefs->setInt(prefs_path + "y", y);
94     prefs->setInt(prefs_path + "w", w);
95     prefs->setInt(prefs_path + "h", h);
97     return FALSE; // which means, go ahead and destroy it
98 }
100 void
101 sp_find_squeeze_window()
103     GtkRequisition r;
104     gtk_widget_size_request(dlg, &r);
105     gtk_window_resize ((GtkWindow *) dlg, r.width, r.height);
108 bool
109 item_id_match (SPItem *item, const gchar *id, bool exact)
111     if (SP_OBJECT_REPR (item) == NULL)
112         return false;
114     if (SP_IS_STRING(item)) // SPStrings have "on demand" ids which are useless for searching
115         return false;
117     const gchar *item_id = (SP_OBJECT_REPR (item))->attribute("id");
118     if (item_id == NULL)
119         return false;
121     if (exact) {
122         return ((bool) !strcmp(item_id, id));
123     } else {
124 //        g_print ("strstr: %s %s: %s\n", item_id, id, strstr(item_id, id) != NULL? "yes":"no");
125         return ((bool) (strstr(item_id, id) != NULL));
126     }
129 bool
130 item_text_match (SPItem *item, const gchar *text, bool exact)
132     if (SP_OBJECT_REPR (item) == NULL)
133         return false;
135     if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
136         const gchar *item_text = sp_te_get_string_multiline (item);
137         if (item_text == NULL)
138             return false;
139         bool ret;
140         if (exact) {
141             ret = ((bool) !strcasecmp(item_text, text));
142         } else {
143             //FIXME: strcasestr
144             ret = ((bool) (strstr(item_text, text) != NULL));
145         }
146         g_free ((void*) item_text);
147         return ret;
148     }
149     return false;
152 bool
153 item_style_match (SPItem *item, const gchar *text, bool exact)
155     if (SP_OBJECT_REPR (item) == NULL)
156         return false;
158     const gchar *item_text = (SP_OBJECT_REPR (item))->attribute("style");
159     if (item_text == NULL)
160         return false;
162     if (exact) {
163         return ((bool) !strcmp(item_text, text));
164     } else {
165         return ((bool) (strstr(item_text, text) != NULL));
166     }
169 bool
170 item_attr_match (SPItem *item, const gchar *name, bool exact)
172     if (SP_OBJECT_REPR (item) == NULL)
173         return false;
175     if (exact) {
176         const gchar *attr_value = (SP_OBJECT_REPR (item))->attribute(name);
177         return ((bool) (attr_value != NULL));
178     } else {
179         return SP_OBJECT_REPR (item)->matchAttributeName(name);
180     }
184 GSList *
185 filter_onefield (GSList *l, GObject *dlg, const gchar *field, bool (*match_function)(SPItem *, const gchar *, bool), bool exact)
187     GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
188     const gchar *text = gtk_entry_get_text (GTK_ENTRY(widget));
190     if (strlen (text) != 0) {
191         GSList *n = NULL;
192         for (GSList *i = l; i != NULL; i = i->next) {
193             if (match_function (SP_ITEM(i->data), text, exact)) {
194                 n = g_slist_prepend (n, i->data);
195             }
196         }
197         return n;
198     } else {
199         return l;
200     }
202     return NULL;
206 bool
207 type_checkbox (GtkWidget *widget, const gchar *data)
209     return  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (widget), data)));
212 bool
213 item_type_match (SPItem *item, GtkWidget *widget)
215     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
217     if (SP_IS_RECT(item)) {
218         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "rects"));
220     } else if (SP_IS_GENERICELLIPSE(item) || SP_IS_ELLIPSE(item) || SP_IS_ARC(item) || SP_IS_CIRCLE(item)) {
221         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "ellipses"));
223     } else if (SP_IS_STAR(item) || SP_IS_POLYGON(item)) {
224         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "stars"));
226     } else if (SP_IS_SPIRAL(item)) {
227         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "spirals"));
229     } else if (SP_IS_PATH(item) || SP_IS_LINE(item) || SP_IS_POLYLINE(item)) {
230         return (type_checkbox (widget, "paths"));
232     } else if (SP_IS_TEXT(item) || SP_IS_TSPAN(item) || SP_IS_TREF(item) || SP_IS_STRING(item)) {
233         return (type_checkbox (widget, "texts"));
235     } else if (SP_IS_GROUP(item) && !desktop->isLayer(item) ) { // never select layers!
236         return (type_checkbox (widget, "groups"));
238     } else if (SP_IS_USE(item)) {
239         return (type_checkbox (widget, "clones"));
241     } else if (SP_IS_IMAGE(item)) {
242         return (type_checkbox (widget, "images"));
244     } else if (SP_IS_OFFSET(item)) {
245         return (type_checkbox (widget, "offsets"));
246     }
248     return false;
251 GSList *
252 filter_types (GSList *l, GObject *dlg, bool (*match_function)(SPItem *, GtkWidget *))
254     GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
256     GtkWidget *alltypes = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (widget), "all"));
257     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (alltypes)))
258         return l;
261     GSList *n = NULL;
262     for (GSList *i = l; i != NULL; i = i->next) {
263         if (match_function (SP_ITEM(i->data), widget)) {
264             n = g_slist_prepend (n, i->data);
265         }
266     }
267     return n;
271 GSList *
272 filter_list (GSList *l, GObject *dlg, bool exact)
274     l = filter_onefield (l, dlg, "text", item_text_match, exact);
275     l = filter_onefield (l, dlg, "id", item_id_match, exact);
276     l = filter_onefield (l, dlg, "style", item_style_match, exact);
277     l = filter_onefield (l, dlg, "attr", item_attr_match, exact);
279     l = filter_types (l, dlg, item_type_match);
281     return l;
284 GSList *
285 all_items (SPObject *r, GSList *l, bool hidden, bool locked)
287     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
289     if (SP_IS_DEFS(r))
290         return l; // we're not interested in items in defs
292     if (!strcmp (SP_OBJECT_REPR (r)->name(), "svg:metadata"))
293         return l; // we're not interested in metadata
295     for (SPObject *child = sp_object_first_child(r); child; child = SP_OBJECT_NEXT (child)) {
296         if (SP_IS_ITEM (child) && !SP_OBJECT_IS_CLONED (child) && !desktop->isLayer(SP_ITEM(child))) {
297                 if ((hidden || !desktop->itemIsHidden(SP_ITEM(child))) && (locked || !SP_ITEM(child)->isLocked())) {
298                     l = g_slist_prepend (l, child);
299                 }
300         }
301         l = all_items (child, l, hidden, locked);
302     }
303     return l;
306 GSList *
307 all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked)
309     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
311    for (GSList *i = (GSList *) s->itemList(); i != NULL; i = i->next) {
312         if (SP_IS_ITEM (i->data) && !SP_OBJECT_IS_CLONED (i->data) && !desktop->isLayer(SP_ITEM(i->data))) {
313             if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
314                 if ((hidden || !desktop->itemIsHidden(SP_ITEM(i->data))) && (locked || !SP_ITEM(i->data)->isLocked())) {
315                     l = g_slist_prepend (l, i->data);
316                 }
317             }
318         }
319         if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
320             l = all_items (SP_OBJECT (i->data), l, hidden, locked);
321         }
322     }
323     return l;
327 void sp_find_dialog_find(GObject *, GObject *dlg)
329     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
331     bool hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includehidden")));
332     bool locked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includelocked")));
334     GSList *l = NULL;
335     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inselection")))) {
336         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
337             l = all_selection_items (desktop->selection, l, desktop->currentLayer(), hidden, locked);
338         } else {
339             l = all_selection_items (desktop->selection, l, NULL, hidden, locked);
340         }
341     } else {
342         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
343             l = all_items (desktop->currentLayer(), l, hidden, locked);
344         } else {
345             l = all_items (SP_DOCUMENT_ROOT (sp_desktop_document (desktop)), l, hidden, locked);
346         }
347     }
348     guint all = g_slist_length (l);
350     bool exact = true;
351     GSList *n = NULL;
352     n = filter_list (l, dlg, exact);
353     if (n == NULL) {
354         exact = false;
355         n = filter_list (l, dlg, exact);
356     }
358     if (n != NULL) {
359         int count = g_slist_length (n);
360         desktop->messageStack()->flashF(Inkscape::NORMAL_MESSAGE,
361                                         // TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
362                                         ngettext("<b>%d</b> object found (out of <b>%d</b>), %s match.",
363                                                  "<b>%d</b> objects found (out of <b>%d</b>), %s match.",
364                                                  count),
365                                         count, all, exact? _("exact") : _("partial"));
367         Inkscape::Selection *selection = sp_desktop_selection (desktop);
368         selection->clear();
369         selection->setList(n);
370         scroll_to_show_item (desktop, SP_ITEM(n->data));
371     } else {
372         desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No objects found"));
373     }
376 void
377 sp_find_reset_searchfield (GObject *dlg, const gchar *field)
379     GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
380     gtk_entry_set_text (GTK_ENTRY(widget), "");
384 void
385 sp_find_dialog_reset (GObject *, GObject *dlg)
387     sp_find_reset_searchfield (dlg, "text");
388     sp_find_reset_searchfield (dlg, "id");
389     sp_find_reset_searchfield (dlg, "style");
390     sp_find_reset_searchfield (dlg, "attr");
392     GtkWidget *types = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
393     GtkToggleButton *tb = GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (types), "all"));
394     gtk_toggle_button_toggled (tb);
395     gtk_toggle_button_set_active (tb, TRUE);
399 #define FIND_LABELWIDTH 80
401 void
402 sp_find_new_searchfield (GtkWidget *dlg, GtkWidget *vb, const gchar *label, const gchar *id, GtkTooltips *tt, const gchar *tip)
404     GtkWidget *hb = gtk_hbox_new (FALSE, 0);
405     GtkWidget *l = gtk_label_new_with_mnemonic (label);
406     gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
407     gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
408     gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
410     GtkWidget *tf = gtk_entry_new ();
411     gtk_entry_set_max_length (GTK_ENTRY (tf), 64);
412     gtk_box_pack_start (GTK_BOX (hb), tf, TRUE, TRUE, 0);
413     gtk_object_set_data (GTK_OBJECT (dlg), id, tf);
414     gtk_tooltips_set_tip (tt, tf, tip, NULL);
415     g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_find_dialog_find), dlg );
416     gtk_label_set_mnemonic_widget   (GTK_LABEL(l), tf);
418     gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
421 void
422 sp_find_new_button (GtkWidget *dlg, GtkWidget *hb, const gchar *label, GtkTooltips *tt, const gchar *tip, void (*function) (GObject *, GObject *))
424     GtkWidget *b = gtk_button_new_with_mnemonic (label);
425     gtk_tooltips_set_tip (tt, b, tip, NULL);
426     gtk_box_pack_start (GTK_BOX (hb), b, TRUE, TRUE, 0);
427     g_signal_connect ( G_OBJECT (b), "clicked", G_CALLBACK (function), dlg );
428     gtk_widget_show (b);
431 void
432 toggle_alltypes (GtkToggleButton *tb, gpointer data)
434     GtkWidget *alltypes_pane =  GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "all-pane"));
435     if (gtk_toggle_button_get_active (tb)) {
436         gtk_widget_hide_all (alltypes_pane);
437     } else {
438         gtk_widget_show_all (alltypes_pane);
440         // excplicit toggle to make sure its handler gets called, no matter what was the original state
441         gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")));
442         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")), TRUE);
444         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "paths")), TRUE);
445         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "texts")), TRUE);
446         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "groups")), TRUE);
447         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "clones")), TRUE);
448         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "images")), TRUE);
449         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "offsets")), TRUE);
450     }
451     sp_find_squeeze_window();
454 void
455 toggle_shapes (GtkToggleButton *tb, gpointer data)
457     GtkWidget *shapes_pane =  GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "shapes-pane"));
458     if (gtk_toggle_button_get_active (tb)) {
459         gtk_widget_hide_all (shapes_pane);
460     } else {
461         gtk_widget_show_all (shapes_pane);
462         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "rects")), FALSE);
463         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "ellipses")), FALSE);
464         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "stars")), FALSE);
465         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "spirals")), FALSE);
466     }
467     sp_find_squeeze_window();
471 GtkWidget *
472 sp_find_types_checkbox (GtkWidget *w, const gchar *data, gboolean active,
473                         GtkTooltips *tt, const gchar *tip,
474                         const gchar *label,
475                         void (*toggled)(GtkToggleButton *, gpointer))
477     GtkWidget *hb = gtk_hbox_new (FALSE, 0);
478     gtk_widget_show (hb);
480     {
481         GtkWidget *b  = gtk_check_button_new_with_label (label);
482         gtk_widget_show (b);
483         gtk_toggle_button_set_active ((GtkToggleButton *) b, active);
484         gtk_object_set_data (GTK_OBJECT (w), data, b);
485         gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, tip, NULL);
486         if (toggled)
487             gtk_signal_connect (GTK_OBJECT (b), "toggled", GTK_SIGNAL_FUNC (toggled), w);
488         gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
489     }
491     return hb;
494 GtkWidget *
495 sp_find_types_checkbox_indented (GtkWidget *w, const gchar *data, gboolean active,
496                                  GtkTooltips *tt, const gchar *tip,
497                                  const gchar *label,
498                                  void (*toggled)(GtkToggleButton *, gpointer), guint indent)
500     GtkWidget *hb = gtk_hbox_new (FALSE, 0);
501     gtk_widget_show (hb);
503     { // empty label for indent
504         GtkWidget *l = gtk_label_new ("");
505         gtk_widget_show (l);
506         gtk_widget_set_size_request (l, FIND_LABELWIDTH + indent, -1);
507         gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
508     }
510     GtkWidget *c = sp_find_types_checkbox (w, data, active, tt, tip, label, toggled);
511     gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
513     return hb;
517 GtkWidget *
518 sp_find_types ()
520     GtkTooltips *tt = gtk_tooltips_new ();
522     GtkWidget *vb = gtk_vbox_new (FALSE, 4);
523     gtk_widget_show (vb);
525     {
526         GtkWidget *hb = gtk_hbox_new (FALSE, 0);
527         gtk_widget_show (hb);
529         {
530             GtkWidget *l = gtk_label_new_with_mnemonic (_("T_ype: "));
531             gtk_widget_show (l);
532             gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
533             gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
534             gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
535         }
537         GtkWidget *alltypes = sp_find_types_checkbox (vb, "all", TRUE, tt, _("Search in all object types"), _("All types"), toggle_alltypes);
538         gtk_box_pack_start (GTK_BOX (hb), alltypes, FALSE, FALSE, 0);
540         gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
541     }
543     {
544         GtkWidget *vb_all = gtk_vbox_new (FALSE, 0);
545         gtk_widget_show (vb_all);
547         {
548             GtkWidget *c = sp_find_types_checkbox_indented (vb, "shapes", FALSE, tt, _("Search all shapes"), _("All shapes"), toggle_shapes, 10);
549             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
550         }
553         {
554             GtkWidget *hb = gtk_hbox_new (FALSE, 0);
555             gtk_widget_show (hb);
557             { // empty label for alignment
558                 GtkWidget *l = gtk_label_new ("");
559                 gtk_widget_show (l);
560                 gtk_widget_set_size_request (l, FIND_LABELWIDTH + 20, -1);
561                 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
562             }
564             {
565                 GtkWidget *c = sp_find_types_checkbox (vb, "rects", FALSE, tt, _("Search rectangles"), _("Rectangles"), NULL);
566                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
567             }
569             {
570                 GtkWidget *c = sp_find_types_checkbox (vb, "ellipses", FALSE, tt, _("Search ellipses, arcs, circles"), _("Ellipses"), NULL);
571                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
572             }
574             {
575                 GtkWidget *c = sp_find_types_checkbox (vb, "stars", FALSE, tt, _("Search stars and polygons"), _("Stars"), NULL);
576                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
577             }
579             {
580                 GtkWidget *c = sp_find_types_checkbox (vb, "spirals", FALSE, tt, _("Search spirals"), _("Spirals"), NULL);
581                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
582             }
584             gtk_object_set_data (GTK_OBJECT (vb), "shapes-pane", hb);
586             gtk_box_pack_start (GTK_BOX (vb_all), hb, FALSE, FALSE, 0);
587             gtk_widget_hide_all (hb);
588         }
590         {
591             // TRANSLATORS: polyline is a set of connected straight line segments
592             // http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
593             GtkWidget *c = sp_find_types_checkbox_indented (vb, "paths", TRUE, tt, _("Search paths, lines, polylines"), _("Paths"), NULL, 10);
594             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
595         }
597         {
598             GtkWidget *c = sp_find_types_checkbox_indented (vb, "texts", TRUE, tt, _("Search text objects"), _("Texts"), NULL, 10);
599             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
600         }
602         {
603             GtkWidget *c = sp_find_types_checkbox_indented (vb, "groups", TRUE, tt, _("Search groups"), _("Groups"), NULL, 10);
604             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
605         }
607         {
608             GtkWidget *c = sp_find_types_checkbox_indented (vb, "clones", TRUE, tt, _("Search clones"),
609                         //TRANSLATORS: "Clones" is a noun indicating type of object to find
610                         C_("Find dialog","Clones"), NULL, 10);
611             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
612         }
614         {
615             GtkWidget *c = sp_find_types_checkbox_indented (vb, "images", TRUE, tt, _("Search images"), _("Images"), NULL, 10);
616             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
617         }
619         {
620             GtkWidget *c = sp_find_types_checkbox_indented (vb, "offsets", TRUE, tt, _("Search offset objects"), _("Offsets"), NULL, 10);
621             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
622         }
624         gtk_box_pack_start (GTK_BOX (vb), vb_all, FALSE, FALSE, 0);
625         gtk_object_set_data (GTK_OBJECT (vb), "all-pane", vb_all);
626         gtk_widget_hide_all (vb_all);
627     }
629     return vb;
633 GtkWidget *
634 sp_find_dialog_old (void)
636     if  (!dlg)
637     {
638         gchar title[500];
639         sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_FIND), title);
640         Inkscape::Preferences *prefs = Inkscape::Preferences::get();
642         dlg = sp_window_new (title, TRUE);
643         if (x == -1000 || y == -1000) {
644             x = prefs->getInt(prefs_path + "x", -1000);
645             y = prefs->getInt(prefs_path + "y", -1000);
646         }
647         if (w ==0 || h == 0) {
648             w = prefs->getInt(prefs_path + "w", 0);
649             h = prefs->getInt(prefs_path + "h", 0);
650         }
651         
652 //        if (x<0) x=0;
653 //        if (y<0) y=0;
655         if (w && h)
656             gtk_window_resize ((GtkWindow *) dlg, w, h);
657         if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
658             gtk_window_move ((GtkWindow *) dlg, x, y);
659         } else {
660             gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
661         }
663         sp_transientize (dlg);
664         wd.win = dlg;
665         wd.stop = 0;
666         g_signal_connect   ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd );
668         gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
670         gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_find_dialog_destroy), NULL );
671         gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_find_dialog_delete), dlg);
672         g_signal_connect   ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_find_dialog_delete), dlg);
674         g_signal_connect   ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
675         g_signal_connect   ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
677         GtkTooltips *tt = gtk_tooltips_new ();
679         gtk_container_set_border_width (GTK_CONTAINER (dlg), 4);
681         /* Toplevel vbox */
682         GtkWidget *vb = gtk_vbox_new (FALSE, 0);
683         gtk_container_add (GTK_CONTAINER (dlg), vb);
685         sp_find_new_searchfield (dlg, vb, _("_Text:"), "text", tt, _("Find objects by their text content (exact or partial match)"));
686         sp_find_new_searchfield (dlg, vb, _("_ID:"), "id", tt, _("Find objects by the value of the id attribute (exact or partial match)"));
687         sp_find_new_searchfield (dlg, vb, _("_Style:"), "style", tt, _("Find objects by the value of the style attribute (exact or partial match)"));
688         sp_find_new_searchfield (dlg, vb, _("_Attribute:"), "attr", tt ,_("Find objects by the name of an attribute (exact or partial match)"));
690         gtk_widget_show_all (vb);
692         GtkWidget *types = sp_find_types ();
693         gtk_object_set_data (GTK_OBJECT (dlg), "types", types);
694         gtk_box_pack_start (GTK_BOX (vb), types, FALSE, FALSE, 0);
696         {
697             GtkWidget *w = gtk_hseparator_new ();
698             gtk_widget_show (w);
699             gtk_box_pack_start (GTK_BOX (vb), w, FALSE, FALSE, 3);
701             {
702             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Search in s_election"));
703             gtk_widget_show (b);
704             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
705             gtk_object_set_data (GTK_OBJECT (dlg), "inselection", b);
706             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current selection"), NULL);
707             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
708             }
710             {
711             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Search in current _layer"));
712             gtk_widget_show (b);
713             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
714             gtk_object_set_data (GTK_OBJECT (dlg), "inlayer", b);
715             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current layer"), NULL);
716             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
717             }
719             {
720             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Include _hidden"));
721             gtk_widget_show (b);
722             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
723             gtk_object_set_data (GTK_OBJECT (dlg), "includehidden", b);
724             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include hidden objects in search"), NULL);
725             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
726             }
728             {
729             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Include l_ocked"));
730             gtk_widget_show (b);
731             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
732             gtk_object_set_data (GTK_OBJECT (dlg), "includelocked", b);
733             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include locked objects in search"), NULL);
734             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
735             }
736         }
738         {
739             GtkWidget *hb = gtk_hbox_new (FALSE, 0);
740             gtk_widget_show (hb);
741             gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
743             // TRANSLATORS: "Clear" is a verb here
744             sp_find_new_button (dlg, hb, _("_Clear"), tt, _("Clear values"), sp_find_dialog_reset);
745             sp_find_new_button (dlg, hb, _("_Find"), tt, _("Select objects matching all of the fields you filled in"), sp_find_dialog_find);
746         }
747     }
749     gtk_widget_show((GtkWidget *) dlg);
750     gtk_window_present ((GtkWindow *) dlg);
751     sp_find_dialog_reset (NULL, G_OBJECT (dlg));
753     return dlg;
757 /*
758   Local Variables:
759   mode:c++
760   c-file-style:"stroustrup"
761   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
762   indent-tabs-mode:nil
763   fill-column:99
764   End:
765 */
766 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :