96a6305530122dbec92f256a63209b4bde3231c0
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 "../preferences.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 "../sp-tref.h"
55 #include "../selection-chemistry.h"
56 #include "../sp-defs.h"
57 #include "../sp-rect.h"
58 #include "../sp-ellipse.h"
59 #include "../sp-star.h"
60 #include "../sp-spiral.h"
61 #include "../sp-path.h"
62 #include "../sp-line.h"
63 #include "../sp-polyline.h"
64 #include "../sp-item-group.h"
65 #include "../sp-use.h"
66 #include "../sp-image.h"
67 #include "../sp-offset.h"
68 #include <xml/repr.h>
70 #define MIN_ONSCREEN_DISTANCE 50
72 using NR::X;
73 using NR::Y;
75 static GtkWidget *dlg = NULL;
76 static win_data wd;
78 // impossible original values to make sure they are read from prefs
79 static gint x = -1000, y = -1000, w = 0, h = 0;
80 static Glib::ustring const prefs_path = "/dialogs/find/";
85 static void sp_find_dialog_destroy(GtkObject *object, gpointer)
86 {
87 sp_signal_disconnect_by_data (INKSCAPE, object);
88 wd.win = dlg = NULL;
89 wd.stop = 0;
90 }
94 static gboolean sp_find_dialog_delete(GtkObject *, GdkEvent *, gpointer /*data*/)
95 {
96 gtk_window_get_position (GTK_WINDOW (dlg), &x, &y);
97 gtk_window_get_size (GTK_WINDOW (dlg), &w, &h);
99 if (x<0) x=0;
100 if (y<0) y=0;
102 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
103 prefs->setInt(prefs_path + "x", x);
104 prefs->setInt(prefs_path + "y", y);
105 prefs->setInt(prefs_path + "w", w);
106 prefs->setInt(prefs_path + "h", h);
108 return FALSE; // which means, go ahead and destroy it
109 }
111 void
112 sp_find_squeeze_window()
113 {
114 GtkRequisition r;
115 gtk_widget_size_request(dlg, &r);
116 gtk_window_resize ((GtkWindow *) dlg, r.width, r.height);
117 }
119 bool
120 item_id_match (SPItem *item, const gchar *id, bool exact)
121 {
122 if (SP_OBJECT_REPR (item) == NULL)
123 return false;
125 if (SP_IS_STRING(item)) // SPStrings have "on demand" ids which are useless for searching
126 return false;
128 const gchar *item_id = (SP_OBJECT_REPR (item))->attribute("id");
129 if (item_id == NULL)
130 return false;
132 if (exact) {
133 return ((bool) !strcmp(item_id, id));
134 } else {
135 // g_print ("strstr: %s %s: %s\n", item_id, id, strstr(item_id, id) != NULL? "yes":"no");
136 return ((bool) (strstr(item_id, id) != NULL));
137 }
138 }
140 bool
141 item_text_match (SPItem *item, const gchar *text, bool exact)
142 {
143 if (SP_OBJECT_REPR (item) == NULL)
144 return false;
146 if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
147 const gchar *item_text = sp_te_get_string_multiline (item);
148 if (item_text == NULL)
149 return false;
150 bool ret;
151 if (exact) {
152 ret = ((bool) !strcasecmp(item_text, text));
153 } else {
154 //FIXME: strcasestr
155 ret = ((bool) (strstr(item_text, text) != NULL));
156 }
157 g_free ((void*) item_text);
158 return ret;
159 }
160 return false;
161 }
163 bool
164 item_style_match (SPItem *item, const gchar *text, bool exact)
165 {
166 if (SP_OBJECT_REPR (item) == NULL)
167 return false;
169 const gchar *item_text = (SP_OBJECT_REPR (item))->attribute("style");
170 if (item_text == NULL)
171 return false;
173 if (exact) {
174 return ((bool) !strcmp(item_text, text));
175 } else {
176 return ((bool) (strstr(item_text, text) != NULL));
177 }
178 }
180 bool
181 item_attr_match (SPItem *item, const gchar *name, bool exact)
182 {
183 if (SP_OBJECT_REPR (item) == NULL)
184 return false;
186 if (exact) {
187 const gchar *attr_value = (SP_OBJECT_REPR (item))->attribute(name);
188 return ((bool) (attr_value != NULL));
189 } else {
190 return SP_OBJECT_REPR (item)->matchAttributeName(name);
191 }
192 }
195 GSList *
196 filter_onefield (GSList *l, GObject *dlg, const gchar *field, bool (*match_function)(SPItem *, const gchar *, bool), bool exact)
197 {
198 GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
199 const gchar *text = gtk_entry_get_text (GTK_ENTRY(widget));
201 if (strlen (text) != 0) {
202 GSList *n = NULL;
203 for (GSList *i = l; i != NULL; i = i->next) {
204 if (match_function (SP_ITEM(i->data), text, exact)) {
205 n = g_slist_prepend (n, i->data);
206 }
207 }
208 return n;
209 } else {
210 return l;
211 }
213 return NULL;
214 }
217 bool
218 type_checkbox (GtkWidget *widget, const gchar *data)
219 {
220 return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (widget), data)));
221 }
223 bool
224 item_type_match (SPItem *item, GtkWidget *widget)
225 {
226 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
228 if (SP_IS_RECT(item)) {
229 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "rects"));
231 } else if (SP_IS_GENERICELLIPSE(item) || SP_IS_ELLIPSE(item) || SP_IS_ARC(item) || SP_IS_CIRCLE(item)) {
232 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "ellipses"));
234 } else if (SP_IS_STAR(item) || SP_IS_POLYGON(item)) {
235 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "stars"));
237 } else if (SP_IS_SPIRAL(item)) {
238 return (type_checkbox (widget, "shapes") || type_checkbox (widget, "spirals"));
240 } else if (SP_IS_PATH(item) || SP_IS_LINE(item) || SP_IS_POLYLINE(item)) {
241 return (type_checkbox (widget, "paths"));
243 } else if (SP_IS_TEXT(item) || SP_IS_TSPAN(item) || SP_IS_TREF(item) || SP_IS_STRING(item)) {
244 return (type_checkbox (widget, "texts"));
246 } else if (SP_IS_GROUP(item) && !desktop->isLayer(item) ) { // never select layers!
247 return (type_checkbox (widget, "groups"));
249 } else if (SP_IS_USE(item)) {
250 return (type_checkbox (widget, "clones"));
252 } else if (SP_IS_IMAGE(item)) {
253 return (type_checkbox (widget, "images"));
255 } else if (SP_IS_OFFSET(item)) {
256 return (type_checkbox (widget, "offsets"));
257 }
259 return false;
260 }
262 GSList *
263 filter_types (GSList *l, GObject *dlg, bool (*match_function)(SPItem *, GtkWidget *))
264 {
265 GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
267 GtkWidget *alltypes = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (widget), "all"));
268 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (alltypes)))
269 return l;
272 GSList *n = NULL;
273 for (GSList *i = l; i != NULL; i = i->next) {
274 if (match_function (SP_ITEM(i->data), widget)) {
275 n = g_slist_prepend (n, i->data);
276 }
277 }
278 return n;
279 }
282 GSList *
283 filter_list (GSList *l, GObject *dlg, bool exact)
284 {
285 l = filter_onefield (l, dlg, "text", item_text_match, exact);
286 l = filter_onefield (l, dlg, "id", item_id_match, exact);
287 l = filter_onefield (l, dlg, "style", item_style_match, exact);
288 l = filter_onefield (l, dlg, "attr", item_attr_match, exact);
290 l = filter_types (l, dlg, item_type_match);
292 return l;
293 }
295 GSList *
296 all_items (SPObject *r, GSList *l, bool hidden, bool locked)
297 {
298 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
300 if (SP_IS_DEFS(r))
301 return l; // we're not interested in items in defs
303 if (!strcmp (SP_OBJECT_REPR (r)->name(), "svg:metadata"))
304 return l; // we're not interested in metadata
306 for (SPObject *child = sp_object_first_child(r); child; child = SP_OBJECT_NEXT (child)) {
307 if (SP_IS_ITEM (child) && !SP_OBJECT_IS_CLONED (child) && !desktop->isLayer(SP_ITEM(child))) {
308 if ((hidden || !desktop->itemIsHidden(SP_ITEM(child))) && (locked || !SP_ITEM(child)->isLocked())) {
309 l = g_slist_prepend (l, child);
310 }
311 }
312 l = all_items (child, l, hidden, locked);
313 }
314 return l;
315 }
317 GSList *
318 all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked)
319 {
320 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
322 for (GSList *i = (GSList *) s->itemList(); i != NULL; i = i->next) {
323 if (SP_IS_ITEM (i->data) && !SP_OBJECT_IS_CLONED (i->data) && !desktop->isLayer(SP_ITEM(i->data))) {
324 if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
325 if ((hidden || !desktop->itemIsHidden(SP_ITEM(i->data))) && (locked || !SP_ITEM(i->data)->isLocked())) {
326 l = g_slist_prepend (l, i->data);
327 }
328 }
329 }
330 if (!ancestor || ancestor->isAncestorOf(SP_OBJECT (i->data))) {
331 l = all_items (SP_OBJECT (i->data), l, hidden, locked);
332 }
333 }
334 return l;
335 }
338 void sp_find_dialog_find(GObject *, GObject *dlg)
339 {
340 SPDesktop *desktop = SP_ACTIVE_DESKTOP;
342 bool hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includehidden")));
343 bool locked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "includelocked")));
345 GSList *l = NULL;
346 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inselection")))) {
347 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
348 l = all_selection_items (desktop->selection, l, desktop->currentLayer(), hidden, locked);
349 } else {
350 l = all_selection_items (desktop->selection, l, NULL, hidden, locked);
351 }
352 } else {
353 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (dlg), "inlayer")))) {
354 l = all_items (desktop->currentLayer(), l, hidden, locked);
355 } else {
356 l = all_items (SP_DOCUMENT_ROOT (sp_desktop_document (desktop)), l, hidden, locked);
357 }
358 }
359 guint all = g_slist_length (l);
361 bool exact = true;
362 GSList *n = NULL;
363 n = filter_list (l, dlg, exact);
364 if (n == NULL) {
365 exact = false;
366 n = filter_list (l, dlg, exact);
367 }
369 if (n != NULL) {
370 int count = g_slist_length (n);
371 desktop->messageStack()->flashF(Inkscape::NORMAL_MESSAGE,
372 // TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
373 ngettext("<b>%d</b> object found (out of <b>%d</b>), %s match.",
374 "<b>%d</b> objects found (out of <b>%d</b>), %s match.",
375 count),
376 count, all, exact? _("exact") : _("partial"));
378 Inkscape::Selection *selection = sp_desktop_selection (desktop);
379 selection->clear();
380 selection->setList(n);
381 scroll_to_show_item (desktop, SP_ITEM(n->data));
382 } else {
383 desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No objects found"));
384 }
385 }
387 void
388 sp_find_reset_searchfield (GObject *dlg, const gchar *field)
389 {
390 GtkWidget *widget = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), field));
391 gtk_entry_set_text (GTK_ENTRY(widget), "");
392 }
395 void
396 sp_find_dialog_reset (GObject *, GObject *dlg)
397 {
398 sp_find_reset_searchfield (dlg, "text");
399 sp_find_reset_searchfield (dlg, "id");
400 sp_find_reset_searchfield (dlg, "style");
401 sp_find_reset_searchfield (dlg, "attr");
403 GtkWidget *types = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dlg), "types"));
404 GtkToggleButton *tb = GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (types), "all"));
405 gtk_toggle_button_toggled (tb);
406 gtk_toggle_button_set_active (tb, TRUE);
407 }
410 #define FIND_LABELWIDTH 80
412 void
413 sp_find_new_searchfield (GtkWidget *dlg, GtkWidget *vb, const gchar *label, const gchar *id, GtkTooltips *tt, const gchar *tip)
414 {
415 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
416 GtkWidget *l = gtk_label_new_with_mnemonic (label);
417 gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
418 gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
419 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
421 GtkWidget *tf = gtk_entry_new ();
422 gtk_entry_set_max_length (GTK_ENTRY (tf), 64);
423 gtk_box_pack_start (GTK_BOX (hb), tf, TRUE, TRUE, 0);
424 gtk_object_set_data (GTK_OBJECT (dlg), id, tf);
425 gtk_tooltips_set_tip (tt, tf, tip, NULL);
426 g_signal_connect ( G_OBJECT (tf), "activate", G_CALLBACK (sp_find_dialog_find), dlg );
427 gtk_label_set_mnemonic_widget (GTK_LABEL(l), tf);
429 gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
430 }
432 void
433 sp_find_new_button (GtkWidget *dlg, GtkWidget *hb, const gchar *label, GtkTooltips *tt, const gchar *tip, void (*function) (GObject *, GObject *))
434 {
435 GtkWidget *b = gtk_button_new_with_mnemonic (label);
436 gtk_tooltips_set_tip (tt, b, tip, NULL);
437 gtk_box_pack_start (GTK_BOX (hb), b, TRUE, TRUE, 0);
438 g_signal_connect ( G_OBJECT (b), "clicked", G_CALLBACK (function), dlg );
439 gtk_widget_show (b);
440 }
442 void
443 toggle_alltypes (GtkToggleButton *tb, gpointer data)
444 {
445 GtkWidget *alltypes_pane = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "all-pane"));
446 if (gtk_toggle_button_get_active (tb)) {
447 gtk_widget_hide_all (alltypes_pane);
448 } else {
449 gtk_widget_show_all (alltypes_pane);
451 // excplicit toggle to make sure its handler gets called, no matter what was the original state
452 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")));
453 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "shapes")), TRUE);
455 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "paths")), TRUE);
456 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "texts")), TRUE);
457 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "groups")), TRUE);
458 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "clones")), TRUE);
459 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "images")), TRUE);
460 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "offsets")), TRUE);
461 }
462 sp_find_squeeze_window();
463 }
465 void
466 toggle_shapes (GtkToggleButton *tb, gpointer data)
467 {
468 GtkWidget *shapes_pane = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (data), "shapes-pane"));
469 if (gtk_toggle_button_get_active (tb)) {
470 gtk_widget_hide_all (shapes_pane);
471 } else {
472 gtk_widget_show_all (shapes_pane);
473 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "rects")), FALSE);
474 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "ellipses")), FALSE);
475 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "stars")), FALSE);
476 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_object_get_data (GTK_OBJECT (data), "spirals")), FALSE);
477 }
478 sp_find_squeeze_window();
479 }
482 GtkWidget *
483 sp_find_types_checkbox (GtkWidget *w, const gchar *data, gboolean active,
484 GtkTooltips *tt, const gchar *tip,
485 const gchar *label,
486 void (*toggled)(GtkToggleButton *, gpointer))
487 {
488 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
489 gtk_widget_show (hb);
491 {
492 GtkWidget *b = gtk_check_button_new_with_label (label);
493 gtk_widget_show (b);
494 gtk_toggle_button_set_active ((GtkToggleButton *) b, active);
495 gtk_object_set_data (GTK_OBJECT (w), data, b);
496 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, tip, NULL);
497 if (toggled)
498 gtk_signal_connect (GTK_OBJECT (b), "toggled", GTK_SIGNAL_FUNC (toggled), w);
499 gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0);
500 }
502 return hb;
503 }
505 GtkWidget *
506 sp_find_types_checkbox_indented (GtkWidget *w, const gchar *data, gboolean active,
507 GtkTooltips *tt, const gchar *tip,
508 const gchar *label,
509 void (*toggled)(GtkToggleButton *, gpointer), guint indent)
510 {
511 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
512 gtk_widget_show (hb);
514 { // empty label for indent
515 GtkWidget *l = gtk_label_new ("");
516 gtk_widget_show (l);
517 gtk_widget_set_size_request (l, FIND_LABELWIDTH + indent, -1);
518 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
519 }
521 GtkWidget *c = sp_find_types_checkbox (w, data, active, tt, tip, label, toggled);
522 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
524 return hb;
525 }
528 GtkWidget *
529 sp_find_types ()
530 {
531 GtkTooltips *tt = gtk_tooltips_new ();
533 GtkWidget *vb = gtk_vbox_new (FALSE, 4);
534 gtk_widget_show (vb);
536 {
537 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
538 gtk_widget_show (hb);
540 {
541 GtkWidget *l = gtk_label_new_with_mnemonic (_("T_ype: "));
542 gtk_widget_show (l);
543 gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
544 gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
545 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
546 }
548 GtkWidget *alltypes = sp_find_types_checkbox (vb, "all", TRUE, tt, _("Search in all object types"), _("All types"), toggle_alltypes);
549 gtk_box_pack_start (GTK_BOX (hb), alltypes, FALSE, FALSE, 0);
551 gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
552 }
554 {
555 GtkWidget *vb_all = gtk_vbox_new (FALSE, 0);
556 gtk_widget_show (vb_all);
558 {
559 GtkWidget *c = sp_find_types_checkbox_indented (vb, "shapes", FALSE, tt, _("Search all shapes"), _("All shapes"), toggle_shapes, 10);
560 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
561 }
564 {
565 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
566 gtk_widget_show (hb);
568 { // empty label for alignment
569 GtkWidget *l = gtk_label_new ("");
570 gtk_widget_show (l);
571 gtk_widget_set_size_request (l, FIND_LABELWIDTH + 20, -1);
572 gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
573 }
575 {
576 GtkWidget *c = sp_find_types_checkbox (vb, "rects", FALSE, tt, _("Search rectangles"), _("Rectangles"), NULL);
577 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
578 }
580 {
581 GtkWidget *c = sp_find_types_checkbox (vb, "ellipses", FALSE, tt, _("Search ellipses, arcs, circles"), _("Ellipses"), NULL);
582 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
583 }
585 {
586 GtkWidget *c = sp_find_types_checkbox (vb, "stars", FALSE, tt, _("Search stars and polygons"), _("Stars"), NULL);
587 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
588 }
590 {
591 GtkWidget *c = sp_find_types_checkbox (vb, "spirals", FALSE, tt, _("Search spirals"), _("Spirals"), NULL);
592 gtk_box_pack_start (GTK_BOX (hb), c, FALSE, FALSE, 0);
593 }
595 gtk_object_set_data (GTK_OBJECT (vb), "shapes-pane", hb);
597 gtk_box_pack_start (GTK_BOX (vb_all), hb, FALSE, FALSE, 0);
598 gtk_widget_hide_all (hb);
599 }
601 {
602 // TRANSLATORS: polyline is a set of connected straight line segments
603 // http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
604 GtkWidget *c = sp_find_types_checkbox_indented (vb, "paths", TRUE, tt, _("Search paths, lines, polylines"), _("Paths"), NULL, 10);
605 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
606 }
608 {
609 GtkWidget *c = sp_find_types_checkbox_indented (vb, "texts", TRUE, tt, _("Search text objects"), _("Texts"), NULL, 10);
610 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
611 }
613 {
614 GtkWidget *c = sp_find_types_checkbox_indented (vb, "groups", TRUE, tt, _("Search groups"), _("Groups"), NULL, 10);
615 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
616 }
618 {
619 GtkWidget *c = sp_find_types_checkbox_indented (vb, "clones", TRUE, tt, _("Search clones"),
620 //TRANSLATORS: Translate the word "Clones" only. A noun indicating type of object to find
621 Q_("find|Clones"), NULL, 10);
622 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
623 }
625 {
626 GtkWidget *c = sp_find_types_checkbox_indented (vb, "images", TRUE, tt, _("Search images"), _("Images"), NULL, 10);
627 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
628 }
630 {
631 GtkWidget *c = sp_find_types_checkbox_indented (vb, "offsets", TRUE, tt, _("Search offset objects"), _("Offsets"), NULL, 10);
632 gtk_box_pack_start (GTK_BOX (vb_all), c, FALSE, FALSE, 0);
633 }
635 gtk_box_pack_start (GTK_BOX (vb), vb_all, FALSE, FALSE, 0);
636 gtk_object_set_data (GTK_OBJECT (vb), "all-pane", vb_all);
637 gtk_widget_hide_all (vb_all);
638 }
640 return vb;
641 }
644 GtkWidget *
645 sp_find_dialog_old (void)
646 {
647 if (!dlg)
648 {
649 gchar title[500];
650 sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_FIND), title);
651 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
653 dlg = sp_window_new (title, TRUE);
654 if (x == -1000 || y == -1000) {
655 x = prefs->getInt(prefs_path + "x", -1000);
656 y = prefs->getInt(prefs_path + "y", -1000);
657 }
658 if (w ==0 || h == 0) {
659 w = prefs->getInt(prefs_path + "w", 0);
660 h = prefs->getInt(prefs_path + "h", 0);
661 }
663 // if (x<0) x=0;
664 // if (y<0) y=0;
666 if (w && h)
667 gtk_window_resize ((GtkWindow *) dlg, w, h);
668 if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
669 gtk_window_move ((GtkWindow *) dlg, x, y);
670 } else {
671 gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
672 }
674 sp_transientize (dlg);
675 wd.win = dlg;
676 wd.stop = 0;
677 g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd );
679 gtk_signal_connect ( GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
681 gtk_signal_connect ( GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_find_dialog_destroy), NULL );
682 gtk_signal_connect ( GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_find_dialog_delete), dlg);
683 g_signal_connect ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_find_dialog_delete), dlg);
685 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg);
686 g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg);
688 GtkTooltips *tt = gtk_tooltips_new ();
690 gtk_container_set_border_width (GTK_CONTAINER (dlg), 4);
692 /* Toplevel vbox */
693 GtkWidget *vb = gtk_vbox_new (FALSE, 0);
694 gtk_container_add (GTK_CONTAINER (dlg), vb);
696 sp_find_new_searchfield (dlg, vb, _("_Text: "), "text", tt, _("Find objects by their text content (exact or partial match)"));
697 sp_find_new_searchfield (dlg, vb, _("_ID: "), "id", tt, _("Find objects by the value of the id attribute (exact or partial match)"));
698 sp_find_new_searchfield (dlg, vb, _("_Style: "), "style", tt, _("Find objects by the value of the style attribute (exact or partial match)"));
699 sp_find_new_searchfield (dlg, vb, _("_Attribute: "), "attr", tt ,_("Find objects by the name of an attribute (exact or partial match)"));
701 gtk_widget_show_all (vb);
703 GtkWidget *types = sp_find_types ();
704 gtk_object_set_data (GTK_OBJECT (dlg), "types", types);
705 gtk_box_pack_start (GTK_BOX (vb), types, FALSE, FALSE, 0);
707 {
708 GtkWidget *w = gtk_hseparator_new ();
709 gtk_widget_show (w);
710 gtk_box_pack_start (GTK_BOX (vb), w, FALSE, FALSE, 3);
712 {
713 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Search in s_election"));
714 gtk_widget_show (b);
715 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
716 gtk_object_set_data (GTK_OBJECT (dlg), "inselection", b);
717 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current selection"), NULL);
718 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
719 }
721 {
722 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Search in current _layer"));
723 gtk_widget_show (b);
724 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
725 gtk_object_set_data (GTK_OBJECT (dlg), "inlayer", b);
726 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Limit search to the current layer"), 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 _hidden"));
732 gtk_widget_show (b);
733 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
734 gtk_object_set_data (GTK_OBJECT (dlg), "includehidden", b);
735 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include hidden objects in search"), NULL);
736 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
737 }
739 {
740 GtkWidget *b = gtk_check_button_new_with_mnemonic (_("Include l_ocked"));
741 gtk_widget_show (b);
742 gtk_toggle_button_set_active ((GtkToggleButton *) b, FALSE);
743 gtk_object_set_data (GTK_OBJECT (dlg), "includelocked", b);
744 gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), b, _("Include locked objects in search"), NULL);
745 gtk_box_pack_start (GTK_BOX (vb), b, FALSE, FALSE, 0);
746 }
747 }
749 {
750 GtkWidget *hb = gtk_hbox_new (FALSE, 0);
751 gtk_widget_show (hb);
752 gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
754 // TRANSLATORS: "Clear" is a verb here
755 sp_find_new_button (dlg, hb, _("_Clear"), tt, _("Clear values"), sp_find_dialog_reset);
756 sp_find_new_button (dlg, hb, _("_Find"), tt, _("Select objects matching all of the fields you filled in"), sp_find_dialog_find);
757 }
758 }
760 gtk_widget_show((GtkWidget *) dlg);
761 gtk_window_present ((GtkWindow *) dlg);
762 sp_find_dialog_reset (NULL, G_OBJECT (dlg));
764 return dlg;
765 }
768 /*
769 Local Variables:
770 mode:c++
771 c-file-style:"stroustrup"
772 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
773 indent-tabs-mode:nil
774 fill-column:99
775 End:
776 */
777 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :