Code

Ok, committed msgloan's patch to convert gbooleans to bools thus completing
[inkscape.git] / src / dialogs / find.cpp
1 #define __SP_TRANSFORMATION_C__
3 /**
4  * \brief  Find dialog
5  *
6  * Authors:
7  *   bulia byak <bulia@users.sf.net>
8  *
9  * Copyright (C) 2004 Authors
10  *
11  * Released under GNU GPL, read the file 'COPYING' for more information
12  */
14 #ifdef HAVE_CONFIG_H
15 # include "config.h"
16 #endif
19 #include "widgets/icon.h"
21 #include "message-stack.h"
23 //TODO  : delete this
24 GtkWidget * sp_find_dialog_old (void);
26 void
27 //GtkWidget *
28 sp_find_dialog(){
29     // DialogFind::get().present();
30     sp_find_dialog_old ();
31     return;
32 }
35 #include <gtk/gtk.h>
37 #include <glibmm/i18n.h>
38 #include "helper/window.h"
39 #include "macros.h"
40 #include "inkscape.h"
41 #include "document.h"
42 #include "desktop.h"
43 #include "selection.h"
44 #include "desktop-handles.h"
46 #include "dialog-events.h"
47 #include "../prefs-utils.h"
48 #include "../verbs.h"
49 #include "../interface.h"
50 #include "../sp-text.h"
51 #include "../sp-flowtext.h"
52 #include "../text-editing.h"
53 #include "../sp-tspan.h"
54 #include "../selection-chemistry.h"
55 #include "../sp-defs.h"
56 #include "../sp-rect.h"
57 #include "../sp-ellipse.h"
58 #include "../sp-star.h"
59 #include "../sp-spiral.h"
60 #include "../sp-path.h"
61 #include "../sp-line.h"
62 #include "../sp-polyline.h"
63 #include "../sp-item-group.h"
64 #include "../sp-use.h"
65 #include "../sp-image.h"
66 #include "../sp-offset.h"
67 #include <xml/repr.h>
69 using NR::X;
70 using NR::Y;
72 static GtkWidget *dlg = NULL;
73 static win_data wd;
75 // impossible original values to make sure they are read from prefs
76 static gint x = -1000, y = -1000, w = 0, h = 0;
77 static gchar *prefs_path = "dialogs.find";
82 static void sp_find_dialog_destroy(GtkObject *object, gpointer)
83 {
84     sp_signal_disconnect_by_data (INKSCAPE, object);
85     wd.win = dlg = NULL;
86     wd.stop = 0;
87 }
91 static bool sp_find_dialog_delete(GtkObject *, GdkEvent *, gpointer data)
92 {
93     gtk_window_get_position (GTK_WINDOW (dlg), &x, &y);
94     gtk_window_get_size (GTK_WINDOW (dlg), &w, &h);
96     if (x<0) x=0;
97     if (y<0) y=0;
99     prefs_set_int_attribute (prefs_path, "x", x);
100     prefs_set_int_attribute (prefs_path, "y", y);
101     prefs_set_int_attribute (prefs_path, "w", w);
102     prefs_set_int_attribute (prefs_path, "h", h);
104     return FALSE; // which means, go ahead and destroy it
107 void
108 sp_find_squeeze_window()
110     GtkRequisition r;
111     gtk_widget_size_request(dlg, &r);
112     gtk_window_resize ((GtkWindow *) dlg, r.width, r.height);
115 bool
116 item_id_match (SPItem *item, const gchar *id, bool exact)
118     if (SP_OBJECT_REPR (item) == NULL)
119         return false;
121     if (SP_IS_STRING(item)) // SPStrings have "on demand" ids which are useless for searching
122         return false;
124     const gchar *item_id = (SP_OBJECT_REPR (item))->attribute("id");
125     if (item_id == NULL)
126         return false;
128     if (exact) {
129         return ((bool) !strcmp(item_id, id));
130     } else {
131 //        g_print ("strstr: %s %s: %s\n", item_id, id, strstr(item_id, id) != NULL? "yes":"no");
132         return ((bool) (strstr(item_id, id) != NULL));
133     }
136 bool
137 item_text_match (SPItem *item, const gchar *text, bool exact)
139     if (SP_OBJECT_REPR (item) == NULL)
140         return false;
142     if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
143         const gchar *item_text = sp_te_get_string_multiline (item);
144         if (item_text == NULL)
145             return false;
146         bool ret;
147         if (exact) {
148             ret = ((bool) !strcasecmp(item_text, text));
149         } else {
150             //FIXME: strcasestr
151             ret = ((bool) (strstr(item_text, text) != NULL));
152         }
153         g_free ((void*) item_text);
154         return ret;
155     }
156     return false;
159 bool
160 item_style_match (SPItem *item, const gchar *text, bool exact)
162     if (SP_OBJECT_REPR (item) == NULL)
163         return false;
165     const gchar *item_text = (SP_OBJECT_REPR (item))->attribute("style");
166     if (item_text == NULL)
167         return false;
169     if (exact) {
170         return ((bool) !strcmp(item_text, text));
171     } else {
172         return ((bool) (strstr(item_text, text) != NULL));
173     }
176 bool
177 item_attr_match (SPItem *item, const gchar *name, bool exact)
179     if (SP_OBJECT_REPR (item) == NULL)
180         return false;
182     if (exact) {
183         const gchar *attr_value = (SP_OBJECT_REPR (item))->attribute(name);
184         return ((bool) (attr_value != NULL));
185     } else {
186         return SP_OBJECT_REPR (item)->matchAttributeName(name);
187     }
191 GSList *
192 filter_onefield (GSList *l, GObject *dlg, const gchar *field, bool (*match_function)(SPItem *, const gchar *, bool), bool exact)
194     GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
195     const gchar *text = gtk_entry_get_text (GTK_ENTRY(widget));
197     if (strlen (text) != 0) {
198         GSList *n = NULL;
199         for (GSList *i = l; i != NULL; i = i->next) {
200             if (match_function (SP_ITEM(i->data), text, exact)) {
201                 n = g_slist_prepend (n, i->data);
202             }
203         }
204         return n;
205     } else {
206         return l;
207     }
209     return NULL;
213 bool
214 type_checkbox (GtkWidget *widget, const gchar *data)
216     return  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (widget), data)));
219 bool
220 item_type_match (SPItem *item, GtkWidget *widget)
222     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
224     if (SP_IS_RECT(item)) {
225         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "rects"));
227     } else if (SP_IS_GENERICELLIPSE(item) || SP_IS_ELLIPSE(item) || SP_IS_ARC(item) || SP_IS_CIRCLE(item)) {
228         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "ellipses"));
230     } else if (SP_IS_STAR(item) || SP_IS_POLYGON(item)) {
231         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "stars"));
233     } else if (SP_IS_SPIRAL(item)) {
234         return (type_checkbox (widget, "shapes") || type_checkbox (widget, "spirals"));
236     } else if (SP_IS_PATH(item) || SP_IS_LINE(item) || SP_IS_POLYLINE(item)) {
237         return (type_checkbox (widget, "paths"));
239     } else if (SP_IS_TEXT(item) || SP_IS_TSPAN(item) || SP_IS_STRING(item)) {
240         return (type_checkbox (widget, "texts"));
242     } else if (SP_IS_GROUP(item) && !desktop->isLayer(item) ) { // never select layers!
243         return (type_checkbox (widget, "groups"));
245     } else if (SP_IS_USE(item)) {
246         return (type_checkbox (widget, "clones"));
248     } else if (SP_IS_IMAGE(item)) {
249         return (type_checkbox (widget, "images"));
251     } else if (SP_IS_OFFSET(item)) {
252         return (type_checkbox (widget, "offsets"));
253     }
255     return false;
258 GSList *
259 filter_types (GSList *l, GObject *dlg, bool (*match_function)(SPItem *, GtkWidget *))
261     GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
263     GtkWidget *alltypes = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (widget), "all"));
264     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (alltypes)))
265         return l;
268     GSList *n = NULL;
269     for (GSList *i = l; i != NULL; i = i->next) {
270         if (match_function (SP_ITEM(i->data), widget)) {
271             n = g_slist_prepend (n, i->data);
272         }
273     }
274     return n;
278 GSList *
279 filter_list (GSList *l, GObject *dlg, bool exact)
281     l = filter_onefield (l, dlg, "text", item_text_match, exact);
282     l = filter_onefield (l, dlg, "id", item_id_match, exact);
283     l = filter_onefield (l, dlg, "style", item_style_match, exact);
284     l = filter_onefield (l, dlg, "attr", item_attr_match, exact);
286     l = filter_types (l, dlg, item_type_match);
288     return l;
291 GSList *
292 all_items (SPObject *r, GSList *l, bool hidden, bool locked)
294     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
296     if (SP_IS_DEFS(r))
297         return l; // we're not interested in items in defs
299     if (!strcmp (SP_OBJECT_REPR (r)->name(), "svg:metadata"))
300         return l; // we're not interested in metadata
302     for (SPObject *child = sp_object_first_child(r); child; child = SP_OBJECT_NEXT (child)) {
303         if (SP_IS_ITEM (child) && !SP_OBJECT_IS_CLONED (child) && !desktop->isLayer(SP_ITEM(child))) {
304                 if ((hidden || !desktop->itemIsHidden(SP_ITEM(child))) && (locked || !SP_ITEM(child)->isLocked())) {
305                     l = g_slist_prepend (l, child);
306                 }
307         }
308         l = all_items (child, l, hidden, locked);
309     }
310     return l;
313 GSList *
314 all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked)
316     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
318    for (GSList *i = (GSList *) s->itemList(); i != NULL; i = i->next) {
319         if (SP_IS_ITEM (i->data) && !SP_OBJECT_IS_CLONED (i->data) && !desktop->isLayer(SP_ITEM(i->data))) {
320             if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
321                 if ((hidden || !desktop->itemIsHidden(SP_ITEM(i->data))) && (locked || !SP_ITEM(i->data)->isLocked())) {
322                     l = g_slist_prepend (l, i->data);
323                 }
324             }
325         }
326         if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
327             l = all_items (SP_OBJECT (i->data), l, hidden, locked);
328         }
329     }
330     return l;
334 void sp_find_dialog_find(GObject *, GObject *dlg)
336     SPDesktop *desktop = SP_ACTIVE_DESKTOP;
338     bool hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includehidden")));
339     bool locked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includelocked")));
341     GSList *l = NULL;
342     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inselection")))) {
343         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
344             l = all_selection_items (desktop->selection, l, desktop->currentLayer(), hidden, locked);
345         } else {
346             l = all_selection_items (desktop->selection, l, NULL, hidden, locked);
347         }
348     } else {
349         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
350             l = all_items (desktop->currentLayer(), l, hidden, locked);
351         } else {
352             l = all_items (SP_DOCUMENT_ROOT (sp_desktop_document (desktop)), l, hidden, locked);
353         }
354     }
355     guint all = g_slist_length (l);
357     bool exact = true;
358     GSList *n = NULL;
359     n = filter_list (l, dlg, exact);
360     if (n == NULL) {
361         exact = false;
362         n = filter_list (l, dlg, exact);
363     }
365     if (n != NULL) {
366         int count = g_slist_length (n);
367         desktop->messageStack()->flashF(Inkscape::NORMAL_MESSAGE,
368                                         // TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
369                                         ngettext("<b>%d</b> object found (out of <b>%d</b>), %s match.",
370                                                  "<b>%d</b> objects found (out of <b>%d</b>), %s match.",
371                                                  count),
372                                         count, all, exact? _("exact") : _("partial"));
374         Inkscape::Selection *selection = sp_desktop_selection (desktop);
375         selection->clear();
376         selection->setList(n);
377         scroll_to_show_item (desktop, SP_ITEM(n->data));
378     } else {
379         desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No objects found"));
380     }
383 void
384 sp_find_reset_searchfield (GObject *dlg, const gchar *field)
386     GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
387     gtk_entry_set_text (GTK_ENTRY(widget), "");
391 void
392 sp_find_dialog_reset (GObject *, GObject *dlg)
394     sp_find_reset_searchfield (dlg, "text");
395     sp_find_reset_searchfield (dlg, "id");
396     sp_find_reset_searchfield (dlg, "style");
397     sp_find_reset_searchfield (dlg, "attr");
399     GtkWidget *types = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
400     GtkToggleButton *tb = GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (types), "all"));
401     gtk_toggle_button_toggled (tb);
402     gtk_toggle_button_set_active (tb, TRUE);
406 #define FIND_LABELWIDTH 80
408 void
409 sp_find_new_searchfield (GtkWidget *dlg, GtkWidget *vb, const gchar *label, const gchar *id, GtkTooltips *tt, const gchar *tip)
411     GtkWidget *hb = gtk_hbox_new (FALSE, 0);
412     GtkWidget *l = gtk_label_new_with_mnemonic (label);
413     gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
414     gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
415     gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
417     GtkWidget *tf = gtk_entry_new ();
418     gtk_entry_set_max_length (GTK_ENTRY (tf), 64);
419     gtk_box_pack_start (GTK_BOX (hb), tf, TRUE, TRUE, 0);
420     gtk_object_set_data (GTK_OBJECT (dlg), id, tf);
421     gtk_tooltips_set_tip (tt, tf, tip, NULL);
422     g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_find_dialog_find), dlg );
423     gtk_label_set_mnemonic_widget   (GTK_LABEL(l), tf);
425     gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
428 void
429 sp_find_new_button (GtkWidget *dlg, GtkWidget *hb, const gchar *label, GtkTooltips *tt, const gchar *tip, void (*function) (GObject *, GObject *))
431     GtkWidget *b = gtk_button_new_with_mnemonic (label);
432     gtk_tooltips_set_tip (tt, b, tip, NULL);
433     gtk_box_pack_start (GTK_BOX (hb), b, TRUE, TRUE, 0);
434     g_signal_connect ( G_OBJECT (b), "clicked", G_CALLBACK (function), dlg );
435     gtk_widget_show (b);
438 void
439 toggle_alltypes (GtkToggleButton *tb, gpointer data)
441     GtkWidget *alltypes_pane =  GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "all-pane"));
442     if (gtk_toggle_button_get_active (tb)) {
443         gtk_widget_hide_all (alltypes_pane);
444     } else {
445         gtk_widget_show_all (alltypes_pane);
447         // excplicit toggle to make sure its handler gets called, no matter what was the original state
448         gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")));
449         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")), TRUE);
451         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "paths")), TRUE);
452         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "texts")), TRUE);
453         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "groups")), TRUE);
454         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "clones")), TRUE);
455         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "images")), TRUE);
456         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "offsets")), TRUE);
457     }
458     sp_find_squeeze_window();
461 void
462 toggle_shapes (GtkToggleButton *tb, gpointer data)
464     GtkWidget *shapes_pane =  GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "shapes-pane"));
465     if (gtk_toggle_button_get_active (tb)) {
466         gtk_widget_hide_all (shapes_pane);
467     } else {
468         gtk_widget_show_all (shapes_pane);
469         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "rects")), FALSE);
470         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "ellipses")), FALSE);
471         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "stars")), FALSE);
472         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "spirals")), FALSE);
473     }
474     sp_find_squeeze_window();
478 GtkWidget *
479 sp_find_types_checkbox (GtkWidget *w, const gchar *data, bool active,
480                         GtkTooltips *tt, const gchar *tip,
481                         const gchar *label,
482                         void (*toggled)(GtkToggleButton *, gpointer))
484     GtkWidget *hb = gtk_hbox_new (FALSE, 0);
485     gtk_widget_show (hb);
487     {
488         GtkWidget *b  = gtk_check_button_new_with_label (label);
489         gtk_widget_show (b);
490         gtk_toggle_button_set_active ((GtkToggleButton *) b, active);
491         gtk_object_set_data (GTK_OBJECT (w), data, b);
492         gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, tip, NULL);
493         if (toggled)
494             gtk_signal_connect (GTK_OBJECT (b), "toggled", GTK_SIGNAL_FUNC (toggled), w);
495         gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
496     }
498     return hb;
501 GtkWidget *
502 sp_find_types_checkbox_indented (GtkWidget *w, const gchar *data, bool active,
503                                  GtkTooltips *tt, const gchar *tip,
504                                  const gchar *label,
505                                  void (*toggled)(GtkToggleButton *, gpointer), guint indent)
507     GtkWidget *hb = gtk_hbox_new (FALSE, 0);
508     gtk_widget_show (hb);
510     { // empty label for indent
511         GtkWidget *l = gtk_label_new ("");
512         gtk_widget_show (l);
513         gtk_widget_set_size_request (l, FIND_LABELWIDTH + indent, -1);
514         gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
515     }
517     GtkWidget *c = sp_find_types_checkbox (w, data, active, tt, tip, label, toggled);
518     gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
520     return hb;
524 GtkWidget *
525 sp_find_types ()
527     GtkTooltips *tt = gtk_tooltips_new ();
529     GtkWidget *vb = gtk_vbox_new (FALSE, 4);
530     gtk_widget_show (vb);
532     {
533         GtkWidget *hb = gtk_hbox_new (FALSE, 0);
534         gtk_widget_show (hb);
536         {
537             GtkWidget *l = gtk_label_new_with_mnemonic (_("T_ype: "));
538             gtk_widget_show (l);
539             gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
540             gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
541             gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
542         }
544         GtkWidget *alltypes = sp_find_types_checkbox (vb, "all", TRUE, tt, _("Search in all object types"), _("All types"), toggle_alltypes);
545         gtk_box_pack_start (GTK_BOX (hb), alltypes, FALSE, FALSE, 0);
547         gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
548     }
550     {
551         GtkWidget *vb_all = gtk_vbox_new (FALSE, 0);
552         gtk_widget_show (vb_all);
554         {
555             GtkWidget *c = sp_find_types_checkbox_indented (vb, "shapes", FALSE, tt, _("Search all shapes"), _("All shapes"), toggle_shapes, 10);
556             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
557         }
560         {
561             GtkWidget *hb = gtk_hbox_new (FALSE, 0);
562             gtk_widget_show (hb);
564             { // empty label for alignment
565                 GtkWidget *l = gtk_label_new ("");
566                 gtk_widget_show (l);
567                 gtk_widget_set_size_request (l, FIND_LABELWIDTH + 20, -1);
568                 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
569             }
571             {
572                 GtkWidget *c = sp_find_types_checkbox (vb, "rects", FALSE, tt, _("Search rectangles"), _("Rectangles"), NULL);
573                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
574             }
576             {
577                 GtkWidget *c = sp_find_types_checkbox (vb, "ellipses", FALSE, tt, _("Search ellipses, arcs, circles"), _("Ellipses"), NULL);
578                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
579             }
581             {
582                 GtkWidget *c = sp_find_types_checkbox (vb, "stars", FALSE, tt, _("Search stars and polygons"), _("Stars"), NULL);
583                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
584             }
586             {
587                 GtkWidget *c = sp_find_types_checkbox (vb, "spirals", FALSE, tt, _("Search spirals"), _("Spirals"), NULL);
588                 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
589             }
591             gtk_object_set_data (GTK_OBJECT (vb), "shapes-pane", hb);
593             gtk_box_pack_start (GTK_BOX (vb_all), hb, FALSE, FALSE, 0);
594             gtk_widget_hide_all (hb);
595         }
597         {
598             // TRANSLATORS: polyline is a set of connected straight line segments
599             // http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
600             GtkWidget *c = sp_find_types_checkbox_indented (vb, "paths", TRUE, tt, _("Search paths, lines, polylines"), _("Paths"), NULL, 10);
601             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
602         }
604         {
605             GtkWidget *c = sp_find_types_checkbox_indented (vb, "texts", TRUE, tt, _("Search text objects"), _("Texts"), NULL, 10);
606             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
607         }
609         {
610             GtkWidget *c = sp_find_types_checkbox_indented (vb, "groups", TRUE, tt, _("Search groups"), _("Groups"), 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, "clones", TRUE, tt, _("Search clones"), _("Clones"), 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, "images", TRUE, tt, _("Search images"), _("Images"), NULL, 10);
621             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
622         }
624         {
625             GtkWidget *c = sp_find_types_checkbox_indented (vb, "offsets", TRUE, tt, _("Search offset objects"), _("Offsets"), NULL, 10);
626             gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
627         }
629         gtk_box_pack_start (GTK_BOX (vb), vb_all, FALSE, FALSE, 0);
630         gtk_object_set_data (GTK_OBJECT (vb), "all-pane", vb_all);
631         gtk_widget_hide_all (vb_all);
632     }
634     return vb;
638 GtkWidget *
639 sp_find_dialog_old (void)
641     if  (!dlg)
642     {
643         gchar title[500];
644         sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_FIND), title);
646         dlg = sp_window_new (title, TRUE);
647         if (x == -1000 || y == -1000) {
648             x = prefs_get_int_attribute (prefs_path, "x", 0);
649             y = prefs_get_int_attribute (prefs_path, "y", 0);
650         }
651         if (w ==0 || h == 0) {
652             w = prefs_get_int_attribute (prefs_path, "w", 0);
653             h = prefs_get_int_attribute (prefs_path, "h", 0);
654         }
655         
656         if (x<0) x=0;
657         if (y<0) y=0;
659         if (x != 0 || y != 0) {
660             gtk_window_move ((GtkWindow *) dlg, x, y);
661         } else {
662             gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
663         }
664         if (w && h)
665             gtk_window_resize ((GtkWindow *) dlg, w, h);
667         sp_transientize (dlg);
668         wd.win = dlg;
669         wd.stop = 0;
670         g_signal_connect   ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd );
672         gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
674         gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_find_dialog_destroy), NULL );
675         gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_find_dialog_delete), dlg);
676         g_signal_connect   ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_find_dialog_delete), dlg);
678         g_signal_connect   ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
679         g_signal_connect   ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
681         GtkTooltips *tt = gtk_tooltips_new ();
683         gtk_container_set_border_width (GTK_CONTAINER (dlg), 4);
685         /* Toplevel vbox */
686         GtkWidget *vb = gtk_vbox_new (FALSE, 0);
687         gtk_container_add (GTK_CONTAINER (dlg), vb);
689         sp_find_new_searchfield (dlg, vb, _("_Text: "), "text", tt, _("Find objects by their text content (exact or partial match)"));
690         sp_find_new_searchfield (dlg, vb, _("_ID: "), "id", tt, _("Find objects by the value of the id attribute (exact or partial match)"));
691         sp_find_new_searchfield (dlg, vb, _("_Style: "), "style", tt, _("Find objects by the value of the style attribute (exact or partial match)"));
692         sp_find_new_searchfield (dlg, vb, _("_Attribute: "), "attr", tt ,_("Find objects by the name of an attribute (exact or partial match)"));
694         gtk_widget_show_all (vb);
696         GtkWidget *types = sp_find_types ();
697         gtk_object_set_data (GTK_OBJECT (dlg), "types", types);
698         gtk_box_pack_start (GTK_BOX (vb), types, FALSE, FALSE, 0);
700         {
701             GtkWidget *w = gtk_hseparator_new ();
702             gtk_widget_show (w);
703             gtk_box_pack_start (GTK_BOX (vb), w, FALSE, FALSE, 3);
705             {
706             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Search in s_election"));
707             gtk_widget_show (b);
708             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
709             gtk_object_set_data (GTK_OBJECT (dlg), "inselection", b);
710             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current selection"), NULL);
711             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
712             }
714             {
715             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Search in current _layer"));
716             gtk_widget_show (b);
717             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
718             gtk_object_set_data (GTK_OBJECT (dlg), "inlayer", b);
719             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current layer"), NULL);
720             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
721             }
723             {
724             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Include _hidden"));
725             gtk_widget_show (b);
726             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
727             gtk_object_set_data (GTK_OBJECT (dlg), "includehidden", b);
728             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include hidden objects in search"), NULL);
729             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
730             }
732             {
733             GtkWidget *b  = gtk_check_button_new_with_mnemonic (_("Include l_ocked"));
734             gtk_widget_show (b);
735             gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
736             gtk_object_set_data (GTK_OBJECT (dlg), "includelocked", b);
737             gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include locked objects in search"), NULL);
738             gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
739             }
740         }
742         {
743             GtkWidget *hb = gtk_hbox_new (FALSE, 0);
744             gtk_widget_show (hb);
745             gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
747             // TRANSLATORS: "Clear" is a verb here
748             sp_find_new_button (dlg, hb, _("_Clear"), tt, _("Clear values"), sp_find_dialog_reset);
749             sp_find_new_button (dlg, hb, _("_Find"), tt, _("Select objects matching all of the fields you filled in"), sp_find_dialog_find);
750         }
751     }
753     gtk_widget_show((GtkWidget *) dlg);
754     gtk_window_present ((GtkWindow *) dlg);
755     sp_find_dialog_reset (NULL, G_OBJECT (dlg));
757     return dlg;
761 /*
762   Local Variables:
763   mode:c++
764   c-file-style:"stroustrup"
765   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
766   indent-tabs-mode:nil
767   fill-column:99
768   End:
769 */
770 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :