void object_list_properties_show(Diagram *dia, GList *objects) { GtkWidget *properties; DiaObject *one_obj; GtkWidget *parent = ddisplay_active() ? ddisplay_active()->shell : NULL; if (!dialog) create_dialog(parent); clear_dialog_globals(); if (!objects) { /* Hide dialog when no object is selected */ properties_dialog_hide(); return; } /* Prefer object-specific UI when only one object is selected. */ one_obj = (g_list_length(objects) == 1) ? objects->data : NULL; if (one_obj) properties = one_obj->ops->get_properties(one_obj, FALSE); else properties = object_list_create_props_dialog(objects, FALSE); if (properties == NULL) { properties = no_properties_dialog; } if (one_obj) { DiaObjectType *otype = one_obj->type; gchar *buf; buf = g_strconcat(_("Properties: "), _(otype->name), NULL); gtk_window_set_title(GTK_WINDOW(dialog), buf); g_free(buf); } else { gtk_window_set_title(GTK_WINDOW(dialog), _("Object properties:")); } g_signal_connect (G_OBJECT (properties), "destroy", G_CALLBACK(properties_part_destroyed), NULL); gtk_box_pack_start(GTK_BOX(dialog_vbox), properties, TRUE, TRUE, 0); gtk_widget_show (properties); properties_give_focus(properties, NULL); /* resize to minimum */ /* if (obj != current_obj) */ gtk_window_resize (GTK_WINDOW(dialog), 1, 1); if (parent) gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW (parent)); gtk_window_present (GTK_WINDOW (dialog)); object_part = properties; current_objects = g_list_copy(objects); current_dia = dia; }
/** * React to <Display>/Edit/Find */ void edit_find_callback(gpointer data, guint action, GtkWidget *widget) { DDisplay *ddisp; Diagram *dia; GtkWidget *dialog; ddisp = ddisplay_active(); if (!ddisp) return; dia = ddisp->diagram; /* no static var, instead we are attaching the dialog to the diplay shell */ dialog = g_object_get_data (G_OBJECT (ddisp->shell), "edit-find-dialog"); if (!dialog) { dialog = gtk_dialog_new_with_buttons ( _("Find"), GTK_WINDOW (ddisp->shell), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_FIND, RESPONSE_FIND, NULL); fnr_dialog_setup_common (dialog, FALSE, ddisp); } g_object_set_data (G_OBJECT (ddisp->shell), "edit-find-dialog", dialog); gtk_dialog_run (GTK_DIALOG (dialog)); }
Diagram * ddisplay_active_diagram(void) { DDisplay *ddisp = ddisplay_active (); if (!ddisp) return NULL; return ddisp->diagram; }
/** * Sets the Snap-to-grid property for the active display. * @param b Snap to grid toggle button. * @param not_used */ static void integrated_ui_toolbar_grid_snap_toggle(GtkToggleButton *b, gpointer *not_used) { DDisplay *ddisp = ddisplay_active (); if (ddisp) { ddisplay_set_snap_to_grid (ddisp, gtk_toggle_button_get_active (b)); } }
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; }
void view_zoom_set (float factor) { DDisplay *ddisp; real scale; ddisp = ddisplay_active(); if (!ddisp) return; scale = ((real) factor)/1000.0 * DDISPLAY_NORMAL_ZOOM; ddisplay_zoom_middle(ddisp, scale / ddisp->zoom_factor); }
/** * Respond to the File/Save As.. menu * * We have only one file save dialog at a time. So if the dialog alread exists * and the user tries to Save as once more only the diagram refernced will * change. Maybe we should also indicate the refernced diagram in the dialog. */ void file_save_as_callback(GtkAction *action) { DDisplay *ddisp; Diagram *dia; GtkWidget *dlg; ddisp = ddisplay_active(); if (!ddisp) return; dia = ddisp->diagram; dlg = file_save_as_dialog_prepare(dia, ddisp); gtk_widget_show(dlg); }
void diagram_properties_show(Diagram *dia) { if (dialog) { /* This makes the dialog a child of the newer diagram */ gtk_widget_destroy(dialog); dialog = NULL; } create_diagram_properties_dialog(dia); diagram_properties_retrieve(dia); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW (ddisplay_active()->shell)); gtk_widget_show(dialog); }
void diagram_select_list(Diagram *dia, GList *list) { g_return_if_fail (dia && list); /* otherwise we would signal objects step by step */ g_signal_handlers_block_by_func (dia, DIA_DIAGRAM_DATA_GET_CLASS (dia)->selection_changed, NULL); while (list != NULL) { DiaObject *obj = (DiaObject *)list->data; diagram_select(dia, obj); list = g_list_next(list); } if (get_active_focus((DiagramData*) dia) == NULL) { textedit_activate_first(ddisplay_active()); } g_signal_handlers_unblock_by_func (dia, DIA_DIAGRAM_DATA_GET_CLASS (dia)->selection_changed, NULL); g_signal_emit_by_name (dia, "selection_changed", g_list_length (dia->data->selected)); }
static void plugin_callback (GtkWidget *widget, gpointer data) { DiaCallbackFilter *cbf = data; /* check if the callback filter is still available */ if (!g_list_find (filter_get_callbacks (), cbf)) { message_error (_("The function is not available anymore.")); return; } /* and finally invoke it */ if (cbf->callback) { DDisplay *ddisp = NULL; DiagramData* diadata = NULL; ObjectChange *change; /* stuff from the toolbox menu should never get a diagram to modify */ if (strncmp (cbf->menupath, TOOLBOX_MENU, strlen (TOOLBOX_MENU)) != 0) { ddisp = ddisplay_active(); diadata = ddisp ? ddisp->diagram->data : NULL; } change = cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data); if (change != NULL) { if (ddisp) { undo_object_change(ddisp->diagram, NULL, change); /* * - can not call object_add_update() w/o object * - could call object_add_updates_list() with the selected objects, * but that would just be an educated guess (layout working on selection) */ diagram_add_update_all(ddisp->diagram); diagram_modified(ddisp->diagram); diagram_update_extents(ddisp->diagram); undo_set_transactionpoint(ddisp->diagram->undo); } else { /* no diagram to keep the change, throw it away */ if (change->free) change->free(change); g_free(change); } } } }
static void create_dialog() { /* GtkWidget *actionbox; */ /* GList *buttons; */ dialog = gtk_dialog_new_with_buttons( _("Object properties"), GTK_WINDOW (ddisplay_active()->shell), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); dialog_vbox = GTK_DIALOG(dialog)->vbox; gtk_window_set_role(GTK_WINDOW (dialog), "properties_window"); g_signal_connect(G_OBJECT (dialog), "response", G_CALLBACK (properties_respond), NULL); g_signal_connect(G_OBJECT (dialog), "delete_event", G_CALLBACK(properties_dialog_hide), NULL); g_signal_connect(G_OBJECT (dialog), "destroy", G_CALLBACK(gtk_widget_destroyed), &dialog); g_signal_connect(G_OBJECT (dialog), "destroy", G_CALLBACK(gtk_widget_destroyed), &dialog_vbox); g_signal_connect(G_OBJECT (dialog), "key-release-event", G_CALLBACK(properties_key_event), NULL); no_properties_dialog = gtk_label_new(_("This object has no properties.")); gtk_widget_show (no_properties_dialog); #if GLIB_CHECK_VERSION(2,10,0) g_object_ref_sink (G_OBJECT (no_properties_dialog)); #else g_object_ref (G_OBJECT (no_properties_dialog)); gtk_object_sink (GTK_OBJECT (no_properties_dialog)); #endif }
GdkCursor * get_cursor(DiaCursorType ctype) { if (ctype >= G_N_ELEMENTS (cursors)) { return NULL; } if (cursors[ctype].cursor == NULL) { GdkCursor *new_cursor = NULL; if (cursors[ctype].gdk_cursor_number != DIA_CURSOR) { new_cursor = gdk_cursor_new(cursors[ctype].gdk_cursor_number); } else { DDisplay *active_display = ddisplay_active (); if (active_display != NULL) new_cursor = create_cursor(gtk_widget_get_window(active_display->canvas), cursors[ctype].data, cursors[ctype].hot_x, cursors[ctype].hot_y); } cursors[ctype].cursor = new_cursor; } return cursors[ctype].cursor; }
/** * React to <Display>/Edit/Replace */ void edit_replace_callback(gpointer data, guint action, GtkWidget *widget) { DDisplay *ddisp; Diagram *dia; GtkWidget *dialog; ddisp = ddisplay_active(); if (!ddisp) return; dia = ddisp->diagram; /* no static var, instead we are attaching the dialog to the diplay shell */ dialog = g_object_get_data (G_OBJECT (ddisp->shell), "edit-replace-dialog"); if (!dialog) { GtkWidget *button; dialog = gtk_dialog_new_with_buttons ( _("Replace"), GTK_WINDOW (ddisp->shell), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, _("Replace _All"), RESPONSE_REPLACE_ALL, NULL); /* not adding the button in the list above to modify it's text; * the default "Find and Replace" is just too long for my taste ;) */ button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Replace"), RESPONSE_REPLACE); gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_stock (GTK_STOCK_FIND_AND_REPLACE, GTK_ICON_SIZE_BUTTON)); gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_FIND, RESPONSE_FIND); fnr_dialog_setup_common (dialog, TRUE, ddisp); } g_object_set_data (G_OBJECT (ddisp->shell), "edit-replace-dialog", dialog); gtk_dialog_run (GTK_DIALOG (dialog)); }
/* This is the real implementation of the sensitivity update. TODO: move it to the DDisplay as it belongs to it IMHO */ void diagram_update_menu_sensitivity (Diagram *dia) { gint selected_count = g_list_length (dia->data->selected); DDisplay *ddisp = ddisplay_active(); gboolean focus_active = (get_active_focus(dia->data) != NULL); gboolean textedit_active = ddisp ? textedit_mode(ddisp) : FALSE; GtkAction *action; /* Edit menu */ if ((action = menus_get_action ("EditUndo")) != NULL) gtk_action_set_sensitive (action, dia ? undo_available(dia->undo, TRUE) : FALSE); if ((action = menus_get_action ("EditRedo")) != NULL) gtk_action_set_sensitive (action, dia ? undo_available(dia->undo, FALSE) : FALSE); if ((action = menus_get_action ("EditCopy")) != NULL) gtk_action_set_sensitive (action, textedit_active || selected_count > 0); if ((action = menus_get_action ("EditCut")) != NULL) gtk_action_set_sensitive (action, textedit_mode(ddisp) || selected_count > 0); if ((action = menus_get_action ("EditPaste")) != NULL) gtk_action_set_sensitive (action, textedit_active || cnp_exist_stored_objects()); if ((action = menus_get_action ("EditDelete")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("EditDuplicate")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("EditCopytext")) != NULL) gtk_action_set_sensitive (action, focus_active); if ((action = menus_get_action ("EditCuttext")) != NULL) gtk_action_set_sensitive (action, focus_active); if ((action = menus_get_action ("EditPastetext")) != NULL) gtk_action_set_sensitive (action, focus_active); /* Objects menu */ if ((action = menus_get_action ("ObjectsSendtoback")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsBringtofront")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsSendbackwards")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsBringforwards")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsLayerAbove")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsLayerBelow")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 0); if ((action = menus_get_action ("ObjectsGroup")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsUngroup")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_any_groups (dia)); if ((action = menus_get_action ("ObjectsParent")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_can_parent (dia)); if ((action = menus_get_action ("ObjectsUnparent")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_any_children (dia)); if ((action = menus_get_action ("ObjectsUnparentchildren")) != NULL) gtk_action_set_sensitive (action, !textedit_active && diagram_selected_any_parents (dia)); if ((action = menus_get_action ("ObjectsProperties")) != NULL) gtk_action_set_sensitive (action, selected_count > 0); /* Objects->Align menu */ if ((action = menus_get_action ("ObjectsAlignLeft")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignCenter")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignRight")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignSpreadouthorizontally")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignAdjacent")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignTop")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignMiddle")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignBottom")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignSpreadoutvertically")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignStacked")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); if ((action = menus_get_action ("ObjectsAlignConnected")) != NULL) gtk_action_set_sensitive (action, !textedit_active && selected_count > 1); /* Select menu */ if ((action = menus_get_action ("SelectAll")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectNone")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectInvert")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectTransitive")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectConnected")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectSametype")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectReplace")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectUnion")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectIntersection")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectRemove")) != NULL) gtk_action_set_sensitive (action, !textedit_active); if ((action = menus_get_action ("SelectInverse")) != NULL) gtk_action_set_sensitive (action, !textedit_active); /* Tools menu - toolbox actions */ gtk_action_group_set_sensitive (menus_get_tool_actions (), !textedit_active); /* View menu - should not need disabling yet */ }
/** * React to <Display>/File/Export */ void file_export_callback(GtkAction *action) { DDisplay *ddisp; Diagram *dia; gchar *filename = NULL; ddisp = ddisplay_active(); if (!ddisp) return; dia = ddisp->diagram; if (!confirm_export_size (dia, GTK_WINDOW(ddisp->shell), CONFIRM_MEMORY|CONFIRM_PAGES)) return; if (!exportdlg) { persistence_register_integer ("export-filter", 0); exportdlg = gtk_file_chooser_dialog_new(_("Export Diagram"), GTK_WINDOW(ddisp->shell), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); /* export via vfs gives: Permission denied - but only if you do not * have write permissions ;) */ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(exportdlg), FALSE); gtk_dialog_set_default_response(GTK_DIALOG(exportdlg), GTK_RESPONSE_ACCEPT); gtk_window_set_role(GTK_WINDOW(exportdlg), "export_diagram"); g_signal_connect(G_OBJECT(exportdlg), "destroy", G_CALLBACK(gtk_widget_destroyed), &exportdlg); } if (!gtk_file_chooser_get_extra_widget(GTK_FILE_CHOOSER(exportdlg))) { GtkWidget *hbox, *label, *omenu, *options; GtkFileFilter* filter; options = gtk_frame_new(_("Export Options")); gtk_frame_set_shadow_type(GTK_FRAME(options), GTK_SHADOW_ETCHED_IN); hbox = gtk_hbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(options), hbox); gtk_widget_show(hbox); label = gtk_label_new (_("Determine file type:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); gtk_widget_show (label); omenu = create_export_menu(); gtk_box_pack_start(GTK_BOX(hbox), omenu, TRUE, TRUE, 0); gtk_widget_show(omenu); g_object_set_data(G_OBJECT(exportdlg), "export-menu", omenu); gtk_widget_show(options); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(exportdlg), options); /* set up file filters */ filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All Files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (exportdlg), filter); /* match the other selections extension */ filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Supported Formats")); gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, matching_extensions_filter, filter_guess_export_filter, NULL); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (exportdlg), filter); gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), persistence_get_integer ("export-filter")); g_signal_connect(GTK_FILE_CHOOSER(exportdlg), "response", G_CALLBACK(file_export_response_callback), omenu); } if (g_object_get_data (G_OBJECT(exportdlg), "user_data")) g_object_unref (g_object_get_data (G_OBJECT(exportdlg), "user_data")); g_object_ref(dia); g_object_set_data (G_OBJECT (exportdlg), "user_data", dia); gtk_widget_set_sensitive(exportdlg, TRUE); if (dia && dia->filename) filename = g_filename_from_utf8(dia->filename, -1, NULL, NULL, NULL); if (filename != NULL) { char* fnabs = dia_get_absolute_filename (filename); if (fnabs) { char *folder = g_path_get_dirname (fnabs); char *basename = g_path_get_basename (fnabs); /* can't use gtk_file_chooser_set_filename for various reasons, see e.g. bug #305850 */ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(exportdlg), folder); export_adapt_extension (basename, persistence_get_integer ("export-filter") - 1); g_free (folder); g_free (basename); } g_free(fnabs); g_free(filename); } gtk_widget_show(exportdlg); }
/** * Handle menu click File/Open * * This is either with or without diagram */ void file_open_callback(GtkAction *action) { if (!opendlg) { DDisplay *ddisp; Diagram *dia = NULL; GtkWindow *parent_window; gchar *filename = NULL; /* FIXME: we should not use ddisp_active but instead get the current diagram * from caller. Thus we could offer the option to "load into" if invoked by * <Display/File/Open. It wouldn't make any sense if invoked by * <Toolbox>/File/Open ... */ ddisp = ddisplay_active(); if (ddisp) { dia = ddisp->diagram; parent_window = GTK_WINDOW(ddisp->shell); } else { parent_window = GTK_WINDOW(interface_get_toolbox_shell()); } persistence_register_integer ("import-filter", 0); opendlg = gtk_file_chooser_dialog_new(_("Open Diagram"), parent_window, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); /* is activating gvfs really that easy - at least it works for samba shares*/ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(opendlg), FALSE); gtk_dialog_set_default_response(GTK_DIALOG(opendlg), GTK_RESPONSE_ACCEPT); gtk_window_set_role(GTK_WINDOW(opendlg), "open_diagram"); if (dia && dia->filename) filename = g_filename_from_utf8(dia->filename, -1, NULL, NULL, NULL); if (filename != NULL) { char* fnabs = dia_get_absolute_filename (filename); if (fnabs) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(opendlg), fnabs); g_free(fnabs); g_free(filename); } g_signal_connect(G_OBJECT(opendlg), "destroy", G_CALLBACK(gtk_widget_destroyed), &opendlg); } else { gtk_widget_set_sensitive(opendlg, TRUE); #if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible(opendlg)) #else if (GTK_WIDGET_VISIBLE(opendlg)) #endif return; } if (!gtk_file_chooser_get_extra_widget(GTK_FILE_CHOOSER(opendlg))) { GtkWidget *hbox, *label, *omenu, *options; GtkFileFilter* filter; options = gtk_frame_new(_("Open Options")); gtk_frame_set_shadow_type(GTK_FRAME(options), GTK_SHADOW_ETCHED_IN); hbox = gtk_hbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(options), hbox); gtk_widget_show(hbox); label = gtk_label_new (_("Determine file type:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); gtk_widget_show (label); omenu = create_open_menu(); gtk_box_pack_start(GTK_BOX(hbox), omenu, TRUE, TRUE, 0); gtk_widget_show(omenu); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(opendlg), options); gtk_widget_show(options); g_signal_connect(G_OBJECT(opendlg), "response", G_CALLBACK(file_open_response_callback), omenu); /* set up the gtk file (name) filters */ /* 0 = by extension */ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (opendlg), build_gtk_file_filter_from_index (0)); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All Files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (opendlg), filter); gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), persistence_get_integer ("import-filter")); } gtk_widget_show(opendlg); }
/** Make updates to menus associated with undo. * Currently just changes sensitivity, but should in the future also * include changing the labels. */ void undo_update_menus(UndoStack *stack) { ddisplay_do_update_menu_sensitivity(ddisplay_active()); }
static void create_diagram_properties_dialog(Diagram *dia) { GtkWidget *dialog_vbox; GtkWidget *notebook; GtkWidget *table; GtkWidget *label; GtkAdjustment *adj; dialog = gtk_dialog_new_with_buttons( _("Diagram Properties"), GTK_WINDOW(ddisplay_active()->shell), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); dialog_vbox = GTK_DIALOG(dialog)->vbox; gtk_window_set_role(GTK_WINDOW(dialog), "diagram_properties"); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(diagram_properties_respond), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_hide), NULL); g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(gtk_widget_destroyed), &dialog); notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(dialog_vbox), notebook, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(notebook), 2); gtk_widget_show(notebook); /* the grid page */ table = gtk_table_new(3,3,FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 2); gtk_table_set_row_spacings(GTK_TABLE(table), 1); gtk_table_set_col_spacings(GTK_TABLE(table), 2); dynamic_check = gtk_check_button_new_with_label(_("Dynamic grid")); gtk_table_attach(GTK_TABLE(table), dynamic_check, 1,2, 0,1, GTK_FILL, GTK_FILL, 0, 0); g_signal_connect(G_OBJECT(dynamic_check), "toggled", G_CALLBACK(diagram_properties_update_sensitivity), NULL); gtk_widget_show(dynamic_check); label = gtk_label_new(_("x")); gtk_table_attach(GTK_TABLE(table), label, 1,2, 1,2, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); label = gtk_label_new(_("y")); gtk_table_attach(GTK_TABLE(table), label, 2,3, 1,2, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); label = gtk_label_new(_("Spacing")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0,1, 2,3, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 10.0, 0.1, 10.0, 0)); width_x_entry = gtk_spin_button_new(adj, 1.0, 3); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(width_x_entry), TRUE); gtk_table_attach(GTK_TABLE(table), width_x_entry, 1,2, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(width_x_entry); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 10.0, 0.1, 10.0, 0)); width_y_entry = gtk_spin_button_new(adj, 1.0, 3); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(width_y_entry), TRUE); gtk_table_attach(GTK_TABLE(table), width_y_entry, 2,3, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(width_y_entry); label = gtk_label_new(_("Visible spacing")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0,1, 3,4, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); visible_x_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(visible_x_entry), TRUE); gtk_table_attach(GTK_TABLE(table), visible_x_entry, 1,2, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(visible_x_entry); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); visible_y_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(visible_y_entry), TRUE); gtk_table_attach(GTK_TABLE(table), visible_y_entry, 2,3, 3,4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(visible_y_entry); /* Hexes! */ hex_check = gtk_check_button_new_with_label(_("Hex grid")); gtk_table_attach(GTK_TABLE(table), hex_check, 1,2, 4,5, GTK_FILL, GTK_FILL, 0, 0); g_signal_connect(G_OBJECT(hex_check), "toggled", G_CALLBACK(diagram_properties_update_sensitivity), NULL); gtk_widget_show(hex_check); label = gtk_label_new(_("Hex grid size")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0,1, 5,6, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); hex_size_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(hex_size_entry), TRUE); gtk_table_attach(GTK_TABLE(table), hex_size_entry, 1,2, 5,6, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(hex_size_entry); label = gtk_label_new(_("Grid")); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); gtk_widget_show(table); gtk_widget_show(label); /* The background page */ table = gtk_table_new(1,2, FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 2); gtk_table_set_row_spacings(GTK_TABLE(table), 1); gtk_table_set_col_spacings(GTK_TABLE(table), 2); label = gtk_label_new(_("Background")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0,1, 0,1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); bg_colour = dia_color_selector_new(); gtk_table_attach(GTK_TABLE(table), bg_colour, 1,2, 0,1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(bg_colour); label = gtk_label_new(_("Grid Lines")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0,1, 1,2, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); grid_colour = dia_color_selector_new(); gtk_table_attach(GTK_TABLE(table), grid_colour, 1,2, 1,2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(grid_colour); label = gtk_label_new(_("Page Breaks")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0,1, 2,3, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); pagebreak_colour = dia_color_selector_new(); gtk_table_attach(GTK_TABLE(table), pagebreak_colour, 1,2, 2,3, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); gtk_widget_show(pagebreak_colour); label = gtk_label_new(_("Colors")); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); gtk_widget_show(table); gtk_widget_show(label); }