1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1999 Alexander Larsson
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19 #include <config.h>
20
21 #include <gtk/gtk.h>
22
23 #include "defaults.h"
24 #include "intl.h"
25 #include "properties-dialog.h"
26 #include "object_ops.h"
27 #include "connectionpoint_ops.h"
28 #include "object.h"
29
30 static GtkWidget *dialog = NULL;
31 static GtkWidget *dialog_vbox = NULL;
32 static GtkWidget *object_part = NULL;
33 static DiaObjectType *current_objtype = NULL;
34 static DiaObject *current_object = NULL;
35
36 static GtkWidget *no_defaults_dialog = NULL;
37
38 static gint defaults_respond(GtkWidget *widget, gint response_id, gpointer data);
39
create_dialog()40 static void create_dialog()
41 {
42 dialog = gtk_dialog_new_with_buttons(
43 _("Object defaults"),
44 NULL, 0,
45 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
46 GTK_STOCK_APPLY, GTK_RESPONSE_APPLY,
47 GTK_STOCK_OK, GTK_RESPONSE_OK,
48 NULL);
49
50 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK);
51
52 dialog_vbox = GTK_DIALOG (dialog)->vbox;
53
54 gtk_window_set_role (GTK_WINDOW (dialog), "defaults_window");
55
56 g_signal_connect(G_OBJECT (dialog), "response",
57 G_CALLBACK(defaults_respond), NULL);
58 g_signal_connect(G_OBJECT(dialog), "delete_event",
59 G_CALLBACK(gtk_widget_hide), NULL);
60
61 no_defaults_dialog = gtk_label_new(_("This object has no defaults."));
62 gtk_widget_show (no_defaults_dialog);
63
64 #if GLIB_CHECK_VERSION(2,10,0)
65 g_object_ref_sink(GTK_OBJECT(no_defaults_dialog));
66 #else
67 g_object_ref(GTK_OBJECT(no_defaults_dialog));
68 gtk_object_sink(GTK_OBJECT(no_defaults_dialog));
69 #endif
70 }
71
72 static gint
defaults_dialog_destroyed(GtkWidget * widget,gpointer data)73 defaults_dialog_destroyed(GtkWidget *widget, gpointer data)
74 {
75 if (widget == object_part) {
76 object_part = NULL;
77 current_objtype = NULL;
78 current_object = NULL;
79 }
80 dialog = NULL;
81 return 0;
82 }
83
84 static gint
defaults_respond(GtkWidget * widget,gint response_id,gpointer data)85 defaults_respond(GtkWidget *widget, gint response_id, gpointer data)
86 {
87 if (response_id == GTK_RESPONSE_OK ||
88 response_id == GTK_RESPONSE_APPLY) {
89 if (current_objtype != NULL) {
90 if (current_objtype->ops->apply_defaults)
91 current_objtype->ops->apply_defaults();
92 else if (current_object != NULL)
93 object_apply_props_from_dialog (current_object, object_part);
94 }
95 }
96 if (response_id != GTK_RESPONSE_APPLY)
97 gtk_widget_hide(widget);
98 return 0;
99 }
100
101 void
defaults_show(DiaObjectType * objtype,gpointer user_data)102 defaults_show(DiaObjectType *objtype, gpointer user_data)
103 {
104 GtkWidget *defaults;
105 DiaObject *def_object = NULL;
106 gchar *title = NULL;
107
108 if (objtype != NULL) {
109 if (objtype->ops->get_defaults != NULL)
110 defaults = objtype->ops->get_defaults();
111 else {
112 def_object = dia_object_default_get (objtype, user_data);
113 defaults = object_create_props_dialog (def_object, TRUE);
114 }
115 title = g_strconcat(_("Defaults: "), objtype->name, NULL);
116 } else {
117 defaults = NULL;
118 }
119
120 if (dialog == NULL)
121 create_dialog();
122
123 if ((objtype==NULL) || (defaults == NULL)) {
124 /* No defaults or no object */
125 defaults = no_defaults_dialog;
126 objtype = NULL;
127 }
128
129 if (object_part != NULL) {
130 gtk_container_remove(GTK_CONTAINER(dialog_vbox), object_part);
131 object_part = NULL;
132 }
133 g_signal_connect (G_OBJECT (dialog), "destroy",
134 G_CALLBACK(defaults_dialog_destroyed), NULL);
135 /* don't destroy dialog when window manager close button pressed */
136 g_signal_connect(G_OBJECT(dialog), "delete_event",
137 G_CALLBACK(gtk_widget_hide), NULL);
138 g_signal_connect(GTK_OBJECT(dialog), "delete_event",
139 G_CALLBACK(gtk_true), NULL);
140
141 gtk_box_pack_start(GTK_BOX(dialog_vbox), defaults, TRUE, TRUE, 0);
142 gtk_widget_show (defaults);
143
144 if (title)
145 {
146 gtk_window_set_title(GTK_WINDOW(dialog), title);
147 g_free(title);
148 }
149 else
150 gtk_window_set_title (GTK_WINDOW (dialog), _("Object defaults"));
151
152 if (object_part != defaults) {
153 gtk_window_resize (GTK_WINDOW(dialog), 1, 1); /* shrink to default */
154 if (dialog->window)
155 gdk_window_invalidate_rect (dialog->window, NULL, TRUE);
156 }
157 gtk_window_present (GTK_WINDOW(dialog));
158 object_part = defaults;
159 current_objtype = objtype;
160 current_object = def_object;
161 }
162