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