Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
}