static gboolean _dtv_button_press (GtkWidget *widget, GdkEventButton *event) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreePath *path = NULL; GtkTreeIter iter; DiaObject *object; Diagram *diagram; if (event->button == 3) { selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), event->x, event->y, &path, NULL, NULL, NULL)) { return TRUE; } if (gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget))) < 2) { gtk_tree_selection_unselect_all (selection); gtk_tree_selection_select_path (selection, path); /* FIXME: for multiple selection we should check all object selected being compatible */ gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1); gtk_tree_path_free (path); } gtk_menu_popup (DIAGRAM_TREE_VIEW(widget)->popup, NULL, NULL, NULL, NULL, event->button, event->time); } else { GTK_WIDGET_CLASS (_dtv_parent_class)->button_press_event (widget, event); if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), event->x, event->y, &path, NULL, NULL, NULL)) { model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1); gtk_tree_model_get (model, &iter, DIAGRAM_COLUMN, &diagram, -1); if (object && diagram && ddisplay_active_diagram() == diagram) { if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) /* double-click 'locates' */ ddisplay_present_object (ddisplay_active(), object); } if (diagram) g_object_unref(diagram); gtk_tree_path_free (path); } } return TRUE; }
static void _dtv_locate_item (GtkAction *action, DiagramTreeView *dtv) { GtkTreeSelection *selection; GtkTreeModel *model; GList *rows, *r; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dtv)); rows = gtk_tree_selection_get_selected_rows (selection, &model); r = rows; while (r) { GtkTreeIter iter; if (gtk_tree_model_get_iter (model, &iter, r->data)) { Diagram *diagram; DiaObject *object; gtk_tree_model_get (model, &iter, DIAGRAM_COLUMN, &diagram, -1); gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1); if (object && diagram) { /* It's kind of stupid to have this running in two loops: * - one may expect to have one presentation for all selected objects * - if there really would be multiple displays and objects we would * iterate through them with a very questionable order ;) */ GSList *displays; for (displays = diagram->displays; displays != NULL; displays = g_slist_next (displays)) { DDisplay *ddisp = (DDisplay *)displays->data; ddisplay_present_object (ddisp, object); } } /* drop all references got from the model */ if (diagram) { g_object_unref (diagram); } } r = g_list_next (r); } g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); g_list_free (rows); }
static gint fnr_respond (GtkWidget *widget, gint response_id, gpointer data) { const gchar *search = gtk_entry_get_text (g_object_get_data (G_OBJECT (widget), "search-entry")); const gchar *replace; DDisplay *ddisp = (DDisplay*)data; 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; sd.flags |= gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( g_object_get_data (G_OBJECT (widget), "match-all-properties"))) ? MATCH_ALL_PROPERTIES : 0; switch (response_id) { case RESPONSE_FIND : sd.key = search; sd.last = g_object_get_data (G_OBJECT (widget), "last-found"); if (!_matches (sd.last, &sd)) sd.last = NULL; /* reset if we start a new search */ 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); ddisplay_present_object (ddisp, sd.last); } break; case RESPONSE_REPLACE : replace = gtk_entry_get_text (g_object_get_data (G_OBJECT (widget), "replace-entry")); sd.key = search; sd.last = g_object_get_data (G_OBJECT (widget), "last-found"); if (!_matches (sd.last, &sd)) { sd.last = NULL; /* reset if we start a new search */ data_foreach_object (ddisp->diagram->data, find_func, &sd); } sd.last = sd.found ? sd.found : sd.first; g_object_set_data (G_OBJECT (widget), "last-found", sd.last); if (sd.last) { _replace (sd.last, &sd, replace); undo_set_transactionpoint(ddisp->diagram->undo); } g_object_set_data (G_OBJECT (widget), "last-found", sd.last); break; case RESPONSE_REPLACE_ALL : replace = gtk_entry_get_text (g_object_get_data (G_OBJECT (widget), "replace-entry")); sd.key = search; sd.last = g_object_get_data (G_OBJECT (widget), "last-found"); do { if (!_matches (sd.last, &sd)) { sd.last = NULL; /* reset if we start a new search */ sd.first = NULL; data_foreach_object (ddisp->diagram->data, find_func, &sd); } sd.last = sd.found ? sd.found : sd.first; if (sd.last) if (!_replace (sd.last, &sd, replace)) sd.last = NULL; } while (sd.last); g_object_set_data (G_OBJECT (widget), "last-found", sd.last); undo_set_transactionpoint(ddisp->diagram->undo); break; default: gtk_widget_hide (widget); } return 0; }