Enabling UML mainpoint
[dia.git] / app / defaults.c
blobbd375b8d60e04bffd1b2b1183c0a4ec3c4fe1e9b
1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1999 Alexander Larsson
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.
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.
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.
19 #include <config.h>
21 #include <gtk/gtk.h>
23 #include "defaults.h"
24 #include "intl.h"
25 #include "properties.h"
26 #include "object_ops.h"
27 #include "connectionpoint_ops.h"
28 #include "object.h"
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;
36 static GtkWidget *no_defaults_dialog = NULL;
38 static gint defaults_respond(GtkWidget *widget, gint response_id, gpointer data);
40 static void create_dialog()
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);
50 gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK);
52 dialog_vbox = GTK_DIALOG (dialog)->vbox;
54 gtk_window_set_role (GTK_WINDOW (dialog), "defaults_window");
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);
61 no_defaults_dialog = gtk_label_new(_("This object has no defaults."));
62 gtk_widget_show (no_defaults_dialog);
64 gtk_widget_ref(no_defaults_dialog);
65 gtk_object_sink(GTK_OBJECT(no_defaults_dialog));
68 static gint
69 defaults_dialog_destroyed(GtkWidget *widget, gpointer data)
71 if (widget == object_part) {
72 object_part = NULL;
73 current_objtype = NULL;
74 current_object = NULL;
76 dialog = NULL;
77 return 0;
80 static gint
81 defaults_respond(GtkWidget *widget, gint response_id, gpointer data)
83 if (response_id == GTK_RESPONSE_OK ||
84 response_id == GTK_RESPONSE_APPLY) {
85 if (current_objtype != NULL) {
86 if (current_objtype->ops->apply_defaults)
87 current_objtype->ops->apply_defaults();
88 else if (current_object != NULL)
89 object_apply_props_from_dialog (current_object, object_part);
92 if (response_id != GTK_RESPONSE_APPLY)
93 gtk_widget_hide(widget);
94 return 0;
97 void
98 defaults_show(DiaObjectType *objtype)
100 GtkWidget *defaults;
101 DiaObject *def_object = NULL;
102 gchar *title = NULL;
104 if (objtype != NULL) {
105 if (objtype->ops->get_defaults != NULL)
106 defaults = objtype->ops->get_defaults();
107 else {
108 def_object = dia_object_default_get (objtype);
109 defaults = object_create_props_dialog (def_object, TRUE);
111 title = g_strconcat(_("Defaults: "), objtype->name, NULL);
112 } else {
113 defaults = NULL;
116 if (dialog == NULL)
117 create_dialog();
119 if ((objtype==NULL) || (defaults == NULL)) {
120 /* No defaults or no object */
121 defaults = no_defaults_dialog;
122 objtype = NULL;
125 if (object_part != NULL) {
126 gtk_container_remove(GTK_CONTAINER(dialog_vbox), object_part);
127 object_part = NULL;
129 g_signal_connect (G_OBJECT (dialog), "destroy",
130 G_CALLBACK(defaults_dialog_destroyed), NULL);
131 /* don't destroy dialog when window manager close button pressed */
132 g_signal_connect(G_OBJECT(dialog), "delete_event",
133 G_CALLBACK(gtk_widget_hide), NULL);
134 g_signal_connect(GTK_OBJECT(dialog), "delete_event",
135 G_CALLBACK(gtk_true), NULL);
137 gtk_box_pack_start(GTK_BOX(dialog_vbox), defaults, TRUE, TRUE, 0);
138 gtk_widget_show (defaults);
140 if (title)
142 gtk_window_set_title(GTK_WINDOW(dialog), title);
143 g_free(title);
145 else
146 gtk_window_set_title (GTK_WINDOW (dialog), _("Object defaults"));
148 if (object_part != defaults) {
149 gtk_window_resize (GTK_WINDOW(dialog), 1, 1); /* shrink to default */
150 if (dialog->window)
151 gdk_window_invalidate_rect (dialog->window, NULL, TRUE);
153 gtk_window_present (GTK_WINDOW(dialog));
154 object_part = defaults;
155 current_objtype = objtype;
156 current_object = def_object;