dia r3974 - in trunk: . app lib samples/Self
- From: hans svn gnome org
- To: svn-commits-list gnome org
- Subject: dia r3974 - in trunk: . app lib samples/Self
- Date: Thu, 1 May 2008 22:44:03 +0100 (BST)
Author: hans
Date: Thu May 1 21:44:03 2008
New Revision: 3974
URL: http://svn.gnome.org/viewvc/dia?rev=3974&view=rev
Log:
2008-05-01 Hans Breuer <hans breuer org>
* app/find-and-replace.[hc] : inital version of find&replace - find
already working, replace does nothing yet (to be continued)
* lib/libdia.def : export it
Modified:
trunk/ChangeLog
trunk/app/find-and-replace.c
trunk/lib/libdia.def
trunk/samples/Self/dia-renderer.dia
Modified: trunk/app/find-and-replace.c
==============================================================================
--- trunk/app/find-and-replace.c (original)
+++ trunk/app/find-and-replace.c Thu May 1 21:44:03 2008
@@ -37,20 +37,61 @@
RESPONSE_REPLACE = -21,
RESPONSE_REPLACE_ALL = -23
};
+
+enum {
+ MATCH_CASE = (1<<0),
+ MATCH_WORD = (1<<1)
+};
typedef struct _SearchData {
- const gchar *key;
+ const gchar *key;
+ guint flags;
+ Diagram *diagram;
+ DiaObject *first; /* the first one found */
+ DiaObject *found; /* the one we were looking for */
+ DiaObject *last; /* previously found */
+ gboolean seen_last;
} SearchData;
+
+static gboolean
+_matches (DiaObject *obj, const SearchData *sd)
+{
+ gchar* name = object_get_displayname (obj);
+ gboolean ret = FALSE;
+
+ if (sd->flags & MATCH_CASE)
+ ret = strstr (name, sd->key) != NULL;
+ else {
+ gchar *s1 = g_utf8_casefold (name, -1);
+ gchar *s2 = g_utf8_casefold (sd->key, -1);
+ ret = strstr (s1, s2) != NULL;
+ g_free (s1);
+ g_free (s2);
+ }
+
+ if (sd->flags & MATCH_WORD)
+ ret = (ret && strlen(name) == strlen(sd->key));
+
+ g_free (name);
+ return ret;
+}
static void
find_func (DiaObject *obj, gpointer user_data)
{
- SearchData *data = (SearchData *)user_data;
-
- gchar* name = object_get_displayname (obj);
- if (strstr (name, data->key) != NULL)
- g_print ("%s\n", name);
- g_free (name);
+ SearchData *sd = (SearchData *)user_data;
+
+ if (!sd->found) {
+ if (_matches (obj, sd)) {
+ if (!sd->first)
+ sd->first = obj;
+ if (obj == sd->last)
+ sd->seen_last = TRUE;
+ else if (sd->seen_last) {
+ sd->found = obj;
+ }
+ }
+ }
}
static gint
@@ -60,12 +101,32 @@
const gchar *replace;
DDisplay *ddisp = (DDisplay*)data;
GList *list;
- SearchData sd;
+ SearchData sd = { 0, };
+ sd.diagram = ddisp->diagram;
+ sd.flags = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON (
+ g_object_get_data (G_OBJECT (widget), "match-case"))) ? MATCH_CASE : 0;
+ sd.flags |= gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON (
+ g_object_get_data (G_OBJECT (widget), "match-word"))) ? MATCH_WORD : 0;
+
switch (response_id) {
case RESPONSE_FIND :
sd.key = search;
+ sd.last = g_object_get_data (G_OBJECT (widget), "last-found");
+ diagram_remove_all_selected (ddisp->diagram, TRUE);
data_foreach_object (ddisp->diagram->data, find_func, &sd);
+ /* remember it */
+ sd.last = sd.found ? sd.found : sd.first;
+ g_object_set_data (G_OBJECT (widget), "last-found", sd.last);
+ if (sd.last) {
+ if (dia_object_get_parent_layer(sd.last) != ddisp->diagram->data->active_layer) {
+ /* can only select objects in the active layer */
+ data_set_active_layer(ddisp->diagram->data, dia_object_get_parent_layer(sd.last));
+ diagram_add_update_all(ddisp->diagram);
+ diagram_flush(ddisp->diagram);
+ }
+ diagram_select (ddisp->diagram, sd.last);
+ }
break;
case RESPONSE_REPLACE :
replace = gtk_entry_get_text (g_object_get_data (G_OBJECT (widget), "replace-entry"));
@@ -129,9 +190,11 @@
match_case = gtk_check_button_new_with_mnemonic (_("_Match case"));
gtk_box_pack_start (GTK_BOX (vbox), match_case, FALSE, FALSE, 6);
+ g_object_set_data (G_OBJECT (dialog), "match-case", match_case);
match_word = gtk_check_button_new_with_mnemonic (_("Match _entire word only"));
gtk_box_pack_start (GTK_BOX (vbox), match_word, FALSE, FALSE, 6);
+ g_object_set_data (G_OBJECT (dialog), "match-word", match_word);
gtk_widget_show_all (vbox);
}
Modified: trunk/lib/libdia.def
==============================================================================
--- trunk/lib/libdia.def (original)
+++ trunk/lib/libdia.def Thu May 1 21:44:03 2008
@@ -142,6 +142,7 @@
data_enum
data_filename
data_font
+ data_foreach_object
data_get_sorted_selected
data_get_sorted_selected_remove
data_int
Modified: trunk/samples/Self/dia-renderer.dia
==============================================================================
Binary files. No diff available.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]