1 /** @file
2 * @brief Find dialog
3 */
4 /* Authors:
5 * bulia byak <bulia@users.sf.net>
6 * Jon A. Cruz <jon@joncruz.org>
7 * Abhishek Sharma
8 *
9 * Copyright (C) 2004 Authors
10 *
11 * Released under GNU GPL, read the file 'COPYING' for more information
12 */
14 #include "widgets/icon.h"
15 #include "message-stack.h"
17 //TODO : delete this
18 GtkWidget * sp_find_dialog_old (void);
20 void
21 //GtkWidget *
22 sp_find_dialog(){
23 // DialogFind::get().present();
24 sp_find_dialog_old ();
25 return;
26 }
29 #include <gtk/gtk.h>
31 #include <glibmm/i18n.h>
32 #include "helper/window.h"
33 #include "macros.h"
34 #include "inkscape.h"
35 #include "document.h"
36 #include "desktop.h"
37 #include "selection.h"
38 #include "desktop-handles.h"
40 #include "dialog-events.h"
41 #include "../preferences.h"
42 #include "../verbs.h"
43 #include "../interface.h"
44 #include "../sp-text.h"
45 #include "../sp-flowtext.h"
46 #include "../text-editing.h"
47 #include "../sp-tspan.h"
48 #include "../sp-tref.h"
49 #include "../selection-chemistry.h"
50 #include "../sp-defs.h"
51 #include "../sp-rect.h"
52 #include "../sp-ellipse.h"
53 #include "../sp-star.h"
54 #include "../sp-spiral.h"
55 #include "../sp-path.h"
56 #include "../sp-line.h"
57 #include "../sp-polyline.h"
58 #include "../sp-item-group.h"
59 #include "../sp-use.h"
60 #include "../sp-image.h"
61 #include "../sp-offset.h"
62 #include <xml/repr.h>
64 #define MIN_ONSCREEN_DISTANCE 50
66 static GtkWidget *dlg = NULL;
67 static win_data wd;
69 // impossible original values to make sure they are read from prefs
70 static gint x = -1000, y = -1000, w = 0, h = 0;
71 static Glib::ustring const prefs_path = "/dialogs/find/";
76 static void sp_find_dialog_destroy(GtkObject *object, gpointer)
77 {
78 sp_signal_disconnect_by_data (INKSCAPE, object);
79 wd.win = dlg = NULL;
80 wd.stop = 0;
81 }
85 static gboolean sp_find_dialog_delete(GtkObject *, GdkEvent *, gpointer /*data*/)
86 {
87 gtk_window_get_position (GTK_WINDOW (dlg), &x, &y);
88 gtk_window_get_size (GTK_WINDOW (dlg), &w, &h);
90 if (x<0) x=0;
91 if (y<0) y=0;
93 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
94 prefs->setInt(prefs_path + "x", x);
95 prefs->setInt(prefs_path + "y", y);
96 prefs->setInt(prefs_path + "w", w);
97 prefs->setInt(prefs_path + "h", h);
99 return FALSE; // which means, go ahead and destroy it
100 }
102 void
103 sp_find_squeeze_window()
104 {
105 GtkRequisition r;
106 gtk_widget_size_request(dlg, &r);
107 gtk_window_resize ((GtkWindow *) dlg, r.width, r.height);
108 }
110 bool
111 item_id_match (SPItem *item, const gchar *id, bool exact)
112 {
113 if (SP_OBJECT_REPR (item) == NULL)
114 return false;
116 if (SP_IS_STRING(item)) // SPStrings have "on demand" ids which are useless for searching
117 return false;
119 const gchar *item_id = (SP_OBJECT_REPR (item))->attribute("id");
120 if (item_id == NULL)
121 return false;
123 if (exact) {
124 return ((bool) !strcmp(item_id, id));
125 } else {
126 // g_print ("strstr: %s %s: %s\n", item_id, id, strstr(item_id, id) != NULL? "yes":"no");
127 return ((bool) (strstr(item_id, id) != NULL));
128 }
129 }
131 bool
132 item_text_match (SPItem *item, const gchar *text, bool exact)
133 {
134 if (SP_OBJECT_REPR (item) == NULL)
135 return false;
137 if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
138 const gchar *item_text = sp_te_get_string_multiline (item);
139 if (item_text == NULL)
140 return false;
141 bool ret;
142 if (exact) {
143 ret = ((bool) !strcasecmp(item_text, text));
144 } else {
145 //FIXME: strcasestr
146 ret = ((bool) (strstr(item_text, text) != NULL));
147 }
148 g_free ((void*) item_text);
149 return ret;
150 }
151 return false;
152 }
154 bool
155 item_style_match (SPItem *item, const gchar *text, bool exact)
156 {
157 if (SP_OBJECT_REPR (item) == NULL)
158 return false;
160 const gchar *item_text = (SP_OBJECT_REPR (item))->attribute("style");
161 if (item_text == NULL)
162 return false;
164 if (exact) {
165 return ((bool) !strcmp(item_text, text));
166 } else {
167 return ((bool) (strstr(item_text, text) != NULL));
168 }
169 }
171 bool
172 item_attr_match (SPItem *item, const gchar *name, bool exact)
173 {
174 if (SP_OBJECT_REPR (item) == NULL)
175 return false;
177 if (exact) {
178 const gchar *attr_value = (SP_OBJECT_REPR (item))->attribute(name);
179 return ((bool) (attr_value != NULL));
180 } else {
181 return SP_OBJECT_REPR (item)->matchAttributeName(name);
182 }
183 }
186 GSList *
187 filter_onefield (GSList *l, GObject *dlg, const gchar *field, bool (*match_function)(SPItem *, const gchar *, bool), bool exact)
188 {
189 GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
190 const gchar *text = gtk_entry_get_text (GTK_ENTRY(widget));
192 if (strlen (text) != 0) {
193 GSList *n = NULL;
194 for (GSList *i = l; i != NULL; i = i->next) {
195 if (match_function (SP_ITEM(i->data), text, exact)) {
196 n = g_slist_prepend (n, i->data);
197 }
198 }
199 return n;
200 } else {
201 return l;
202 }
204 return NULL;
205 }
208 bool
209 type_checkbox (GtkWidget *widget, const gchar *data)
210 {
211 return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (widget), data)));
212 }
214 bool
215 item_type_match (SPItem *item, GtkWidget *widget)
216 {
217 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
219 if (SP_IS_RECT(item)) {
220 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "rects"));
222 } else if (SP_IS_GENERICELLIPSE(item) || SP_IS_ELLIPSE(item) || SP_IS_ARC(item) || SP_IS_CIRCLE(item)) {
223 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "ellipses"));
225 } else if (SP_IS_STAR(item) || SP_IS_POLYGON(item)) {
226 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "stars"));
228 } else if (SP_IS_SPIRAL(item)) {
229 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "spirals"));
231 } else if (SP_IS_PATH(item) || SP_IS_LINE(item) || SP_IS_POLYLINE(item)) {
232 return (type_checkbox (widget, "paths"));
234 } else if (SP_IS_TEXT(item) || SP_IS_TSPAN(item) || SP_IS_TREF(item) || SP_IS_STRING(item)) {
235 return (type_checkbox (widget, "texts"));
237 } else if (SP_IS_GROUP(item) && !desktop->isLayer(item) ) { // never select layers!
238 return (type_checkbox (widget, "groups"));
240 } else if (SP_IS_USE(item)) {
241 return (type_checkbox (widget, "clones"));
243 } else if (SP_IS_IMAGE(item)) {
244 return (type_checkbox (widget, "images"));
246 } else if (SP_IS_OFFSET(item)) {
247 return (type_checkbox (widget, "offsets"));
248 }
250 return false;
251 }
253 GSList *
254 filter_types (GSList *l, GObject *dlg, bool (*match_function)(SPItem *, GtkWidget *))
255 {
256 GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
258 GtkWidget *alltypes = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (widget), "all"));
259 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (alltypes)))
260 return l;
263 GSList *n = NULL;
264 for (GSList *i = l; i != NULL; i = i->next) {
265 if (match_function (SP_ITEM(i->data), widget)) {
266 n = g_slist_prepend (n, i->data);
267 }
268 }
269 return n;
270 }
273 GSList *
274 filter_list (GSList *l, GObject *dlg, bool exact)
275 {
276 l = filter_onefield (l, dlg, "text", item_text_match, exact);
277 l = filter_onefield (l, dlg, "id", item_id_match, exact);
278 l = filter_onefield (l, dlg, "style", item_style_match, exact);
279 l = filter_onefield (l, dlg, "attr", item_attr_match, exact);
281 l = filter_types (l, dlg, item_type_match);
283 return l;
284 }
286 GSList *
287 all_items (SPObject *r, GSList *l, bool hidden, bool locked)
288 {
289 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
291 if (SP_IS_DEFS(r))
292 return l; // we're not interested in items in defs
294 if (!strcmp (SP_OBJECT_REPR (r)->name(), "svg:metadata"))
295 return l; // we're not interested in metadata
297 for (SPObject *child = r->firstChild(); child; child = child->next) {
298 if (SP_IS_ITEM (child) && !SP_OBJECT_IS_CLONED (child) && !desktop->isLayer(SP_ITEM(child))) {
299 if ((hidden || !desktop->itemIsHidden(SP_ITEM(child))) && (locked || !SP_ITEM(child)->isLocked())) {
300 l = g_slist_prepend (l, child);
301 }
302 }
303 l = all_items (child, l, hidden, locked);
304 }
305 return l;
306 }
308 GSList *
309 all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked)
310 {
311 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
313 for (GSList *i = (GSList *) s->itemList(); i != NULL; i = i->next) {
314 if (SP_IS_ITEM (i->data) && !SP_OBJECT_IS_CLONED (i->data) && !desktop->isLayer(SP_ITEM(i->data))) {
315 if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
316 if ((hidden || !desktop->itemIsHidden(SP_ITEM(i->data))) && (locked || !SP_ITEM(i->data)->isLocked())) {
317 l = g_slist_prepend (l, i->data);
318 }
319 }
320 }
321 if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
322 l = all_items (SP_OBJECT (i->data), l, hidden, locked);
323 }
324 }
325 return l;
326 }
329 void sp_find_dialog_find(GObject *, GObject *dlg)
330 {
331 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
333 bool hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includehidden")));
334 bool locked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includelocked")));
336 GSList *l = NULL;
337 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inselection")))) {
338 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
339 l = all_selection_items (desktop->selection, l, desktop->currentLayer(), hidden, locked);
340 } else {
341 l = all_selection_items (desktop->selection, l, NULL, hidden, locked);
342 }
343 } else {
344 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
345 l = all_items (desktop->currentLayer(), l, hidden, locked);
346 } else {
347 l = all_items(sp_desktop_document(desktop)->getRoot(), l, hidden, locked);
348 }
349 }
350 guint all = g_slist_length (l);
352 bool exact = true;
353 GSList *n = NULL;
354 n = filter_list (l, dlg, exact);
355 if (n == NULL) {
356 exact = false;
357 n = filter_list (l, dlg, exact);
358 }
360 if (n != NULL) {
361 int count = g_slist_length (n);
362 desktop->messageStack()->flashF(Inkscape::NORMAL_MESSAGE,
363 // TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
364 ngettext("<b>%d</b> object found (out of <b>%d</b>), %s match.",
365 "<b>%d</b> objects found (out of <b>%d</b>), %s match.",
366 count),
367 count, all, exact? _("exact") : _("partial"));
369 Inkscape::Selection *selection = sp_desktop_selection (desktop);
370 selection->clear();
371 selection->setList(n);
372 scroll_to_show_item (desktop, SP_ITEM(n->data));
373 } else {
374 desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No objects found"));
375 }
376 }
378 void
379 sp_find_reset_searchfield (GObject *dlg, const gchar *field)
380 {
381 GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
382 gtk_entry_set_text (GTK_ENTRY(widget), "");
383 }
386 void
387 sp_find_dialog_reset (GObject *, GObject *dlg)
388 {
389 sp_find_reset_searchfield (dlg, "text");
390 sp_find_reset_searchfield (dlg, "id");
391 sp_find_reset_searchfield (dlg, "style");
392 sp_find_reset_searchfield (dlg, "attr");
394 GtkWidget *types = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
395 GtkToggleButton *tb = GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (types), "all"));
396 gtk_toggle_button_toggled (tb);
397 gtk_toggle_button_set_active (tb, TRUE);
398 }
401 #define FIND_LABELWIDTH 80
403 void
404 sp_find_new_searchfield (GtkWidget *dlg, GtkWidget *vb, const gchar *label, const gchar *id, GtkTooltips *tt, const gchar *tip)
405 {
406 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
407 GtkWidget *l = gtk_label_new_with_mnemonic (label);
408 gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
409 gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
410 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
412 GtkWidget *tf = gtk_entry_new ();
413 gtk_entry_set_max_length (GTK_ENTRY (tf), 64);
414 gtk_box_pack_start (GTK_BOX (hb), tf, TRUE, TRUE, 0);
415 gtk_object_set_data (GTK_OBJECT (dlg), id, tf);
416 gtk_tooltips_set_tip (tt, tf, tip, NULL);
417 g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_find_dialog_find), dlg );
418 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
420 gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
421 }
423 void
424 sp_find_new_button (GtkWidget *dlg, GtkWidget *hb, const gchar *label, GtkTooltips *tt, const gchar *tip, void (*function) (GObject *, GObject *))
425 {
426 GtkWidget *b = gtk_button_new_with_mnemonic (label);
427 gtk_tooltips_set_tip (tt, b, tip, NULL);
428 gtk_box_pack_start (GTK_BOX (hb), b, TRUE, TRUE, 0);
429 g_signal_connect ( G_OBJECT (b), "clicked", G_CALLBACK (function), dlg );
430 gtk_widget_show (b);
431 }
433 void
434 toggle_alltypes (GtkToggleButton *tb, gpointer data)
435 {
436 GtkWidget *alltypes_pane = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "all-pane"));
437 if (gtk_toggle_button_get_active (tb)) {
438 gtk_widget_hide_all (alltypes_pane);
439 } else {
440 gtk_widget_show_all (alltypes_pane);
442 // excplicit toggle to make sure its handler gets called, no matter what was the original state
443 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")));
444 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")), TRUE);
446 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "paths")), TRUE);
447 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "texts")), TRUE);
448 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "groups")), TRUE);
449 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "clones")), TRUE);
450 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "images")), TRUE);
451 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "offsets")), TRUE);
452 }
453 sp_find_squeeze_window();
454 }
456 void
457 toggle_shapes (GtkToggleButton *tb, gpointer data)
458 {
459 GtkWidget *shapes_pane = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "shapes-pane"));
460 if (gtk_toggle_button_get_active (tb)) {
461 gtk_widget_hide_all (shapes_pane);
462 } else {
463 gtk_widget_show_all (shapes_pane);
464 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "rects")), FALSE);
465 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "ellipses")), FALSE);
466 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "stars")), FALSE);
467 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "spirals")), FALSE);
468 }
469 sp_find_squeeze_window();
470 }
473 GtkWidget *
474 sp_find_types_checkbox (GtkWidget *w, const gchar *data, gboolean active,
475 GtkTooltips *tt, const gchar *tip,
476 const gchar *label,
477 void (*toggled)(GtkToggleButton *, gpointer))
478 {
479 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
480 gtk_widget_show (hb);
482 {
483 GtkWidget *b = gtk_check_button_new_with_label (label);
484 gtk_widget_show (b);
485 gtk_toggle_button_set_active ((GtkToggleButton *) b, active);
486 gtk_object_set_data (GTK_OBJECT (w), data, b);
487 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, tip, NULL);
488 if (toggled)
489 gtk_signal_connect (GTK_OBJECT (b), "toggled", GTK_SIGNAL_FUNC (toggled), w);
490 gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
491 }
493 return hb;
494 }
496 GtkWidget *
497 sp_find_types_checkbox_indented (GtkWidget *w, const gchar *data, gboolean active,
498 GtkTooltips *tt, const gchar *tip,
499 const gchar *label,
500 void (*toggled)(GtkToggleButton *, gpointer), guint indent)
501 {
502 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
503 gtk_widget_show (hb);
505 { // empty label for indent
506 GtkWidget *l = gtk_label_new ("");
507 gtk_widget_show (l);
508 gtk_widget_set_size_request (l, FIND_LABELWIDTH + indent, -1);
509 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
510 }
512 GtkWidget *c = sp_find_types_checkbox (w, data, active, tt, tip, label, toggled);
513 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
515 return hb;
516 }
519 GtkWidget *
520 sp_find_types ()
521 {
522 GtkTooltips *tt = gtk_tooltips_new ();
524 GtkWidget *vb = gtk_vbox_new (FALSE, 4);
525 gtk_widget_show (vb);
527 {
528 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
529 gtk_widget_show (hb);
531 {
532 GtkWidget *l = gtk_label_new_with_mnemonic (_("T_ype: "));
533 gtk_widget_show (l);
534 gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
535 gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
536 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
537 }
539 GtkWidget *alltypes = sp_find_types_checkbox (vb, "all", TRUE, tt, _("Search in all object types"), _("All types"), toggle_alltypes);
540 gtk_box_pack_start (GTK_BOX (hb), alltypes, FALSE, FALSE, 0);
542 gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
543 }
545 {
546 GtkWidget *vb_all = gtk_vbox_new (FALSE, 0);
547 gtk_widget_show (vb_all);
549 {
550 GtkWidget *c = sp_find_types_checkbox_indented (vb, "shapes", FALSE, tt, _("Search all shapes"), _("All shapes"), toggle_shapes, 10);
551 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
552 }
555 {
556 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
557 gtk_widget_show (hb);
559 { // empty label for alignment
560 GtkWidget *l = gtk_label_new ("");
561 gtk_widget_show (l);
562 gtk_widget_set_size_request (l, FIND_LABELWIDTH + 20, -1);
563 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
564 }
566 {
567 GtkWidget *c = sp_find_types_checkbox (vb, "rects", FALSE, tt, _("Search rectangles"), _("Rectangles"), NULL);
568 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
569 }
571 {
572 GtkWidget *c = sp_find_types_checkbox (vb, "ellipses", FALSE, tt, _("Search ellipses, arcs, circles"), _("Ellipses"), NULL);
573 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
574 }
576 {
577 GtkWidget *c = sp_find_types_checkbox (vb, "stars", FALSE, tt, _("Search stars and polygons"), _("Stars"), NULL);
578 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
579 }
581 {
582 GtkWidget *c = sp_find_types_checkbox (vb, "spirals", FALSE, tt, _("Search spirals"), _("Spirals"), NULL);
583 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
584 }
586 gtk_object_set_data (GTK_OBJECT (vb), "shapes-pane", hb);
588 gtk_box_pack_start (GTK_BOX (vb_all), hb, FALSE, FALSE, 0);
589 gtk_widget_hide_all (hb);
590 }
592 {
593 // TRANSLATORS: polyline is a set of connected straight line segments
594 // http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
595 GtkWidget *c = sp_find_types_checkbox_indented (vb, "paths", TRUE, tt, _("Search paths, lines, polylines"), _("Paths"), NULL, 10);
596 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
597 }
599 {
600 GtkWidget *c = sp_find_types_checkbox_indented (vb, "texts", TRUE, tt, _("Search text objects"), _("Texts"), 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, "groups", TRUE, tt, _("Search groups"), _("Groups"), 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, "clones", TRUE, tt, _("Search clones"),
611 //TRANSLATORS: "Clones" is a noun indicating type of object to find
612 C_("Find dialog","Clones"), NULL, 10);
613 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
614 }
616 {
617 GtkWidget *c = sp_find_types_checkbox_indented (vb, "images", TRUE, tt, _("Search images"), _("Images"), NULL, 10);
618 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
619 }
621 {
622 GtkWidget *c = sp_find_types_checkbox_indented (vb, "offsets", TRUE, tt, _("Search offset objects"), _("Offsets"), NULL, 10);
623 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
624 }
626 gtk_box_pack_start (GTK_BOX (vb), vb_all, FALSE, FALSE, 0);
627 gtk_object_set_data (GTK_OBJECT (vb), "all-pane", vb_all);
628 gtk_widget_hide_all (vb_all);
629 }
631 return vb;
632 }
635 GtkWidget *
636 sp_find_dialog_old (void)
637 {
638 if (!dlg)
639 {
640 gchar title[500];
641 sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_FIND), title);
642 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
644 dlg = sp_window_new (title, TRUE);
645 if (x == -1000 || y == -1000) {
646 x = prefs->getInt(prefs_path + "x", -1000);
647 y = prefs->getInt(prefs_path + "y", -1000);
648 }
649 if (w ==0 || h == 0) {
650 w = prefs->getInt(prefs_path + "w", 0);
651 h = prefs->getInt(prefs_path + "h", 0);
652 }
654 // if (x<0) x=0;
655 // if (y<0) y=0;
657 if (w && h)
658 gtk_window_resize ((GtkWindow *) dlg, w, h);
659 if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
660 gtk_window_move ((GtkWindow *) dlg, x, y);
661 } else {
662 gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
663 }
665 sp_transientize (dlg);
666 wd.win = dlg;
667 wd.stop = 0;
668 g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd );
670 gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
672 gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_find_dialog_destroy), NULL );
673 gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_find_dialog_delete), dlg);
674 g_signal_connect ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_find_dialog_delete), dlg);
676 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
677 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
679 GtkTooltips *tt = gtk_tooltips_new ();
681 gtk_container_set_border_width (GTK_CONTAINER (dlg), 4);
683 /* Toplevel vbox */
684 GtkWidget *vb = gtk_vbox_new (FALSE, 0);
685 gtk_container_add (GTK_CONTAINER (dlg), vb);
687 sp_find_new_searchfield (dlg, vb, _("_Text:"), "text", tt, _("Find objects by their text content (exact or partial match)"));
688 sp_find_new_searchfield (dlg, vb, _("_ID:"), "id", tt, _("Find objects by the value of the id attribute (exact or partial match)"));
689 sp_find_new_searchfield (dlg, vb, _("_Style:"), "style", tt, _("Find objects by the value of the style attribute (exact or partial match)"));
690 sp_find_new_searchfield (dlg, vb, _("_Attribute:"), "attr", tt ,_("Find objects by the name of an attribute (exact or partial match)"));
692 gtk_widget_show_all (vb);
694 GtkWidget *types = sp_find_types ();
695 gtk_object_set_data (GTK_OBJECT (dlg), "types", types);
696 gtk_box_pack_start (GTK_BOX (vb), types, FALSE, FALSE, 0);
698 {
699 GtkWidget *w = gtk_hseparator_new ();
700 gtk_widget_show (w);
701 gtk_box_pack_start (GTK_BOX (vb), w, FALSE, FALSE, 3);
703 {
704 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Search in s_election"));
705 gtk_widget_show (b);
706 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
707 gtk_object_set_data (GTK_OBJECT (dlg), "inselection", b);
708 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current selection"), NULL);
709 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
710 }
712 {
713 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Search in current _layer"));
714 gtk_widget_show (b);
715 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
716 gtk_object_set_data (GTK_OBJECT (dlg), "inlayer", b);
717 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current layer"), NULL);
718 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
719 }
721 {
722 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Include _hidden"));
723 gtk_widget_show (b);
724 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
725 gtk_object_set_data (GTK_OBJECT (dlg), "includehidden", b);
726 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include hidden objects in search"), NULL);
727 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
728 }
730 {
731 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Include l_ocked"));
732 gtk_widget_show (b);
733 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
734 gtk_object_set_data (GTK_OBJECT (dlg), "includelocked", b);
735 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include locked objects in search"), NULL);
736 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
737 }
738 }
740 {
741 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
742 gtk_widget_show (hb);
743 gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
745 // TRANSLATORS: "Clear" is a verb here
746 sp_find_new_button (dlg, hb, _("_Clear"), tt, _("Clear values"), sp_find_dialog_reset);
747 sp_find_new_button (dlg, hb, _("_Find"), tt, _("Select objects matching all of the fields you filled in"), sp_find_dialog_find);
748 }
749 }
751 gtk_widget_show((GtkWidget *) dlg);
752 gtk_window_present ((GtkWindow *) dlg);
753 sp_find_dialog_reset (NULL, G_OBJECT (dlg));
755 return dlg;
756 }
759 /*
760 Local Variables:
761 mode:c++
762 c-file-style:"stroustrup"
763 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
764 indent-tabs-mode:nil
765 fill-column:99
766 End:
767 */
768 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :