]> git.sur5r.net Git - glabels/blob - glabels2/src/ui-sidebar.c
Changed object property dialogs to a single object property editor sidebar.
[glabels] / glabels2 / src / ui-sidebar.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  ui-sidebar.c:  Object property sidebar
5  *
6  *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include <libgnomeprint/gnome-font.h>
26
27 #include "ui-sidebar.h"
28 #include "ui-util.h"
29 #include "object-editor.h"
30 #include "stock.h"
31
32 #include "debug.h"
33
34 /*============================================================================*/
35 /* Private macros and constants.                                              */
36 /*============================================================================*/
37
38 #define DEFAULT_SIDEBAR_WIDTH 300
39
40 /*============================================================================*/
41 /* Private globals                                                            */
42 /*============================================================================*/
43
44 static GObjectClass *parent_class;
45
46 static gchar* doc_verbs [] = {
47         "/commands/PropertyEditor",
48
49         NULL
50 };
51
52 /*============================================================================*/
53 /* Local function prototypes                                                  */
54 /*============================================================================*/
55
56 static void     gl_ui_sidebar_class_init    (glUISidebarClass     *class);
57 static void     gl_ui_sidebar_instance_init (glUISidebar          *sidebar);
58 static void     gl_ui_sidebar_finalize      (GObject              *object);
59
60 static void     gl_ui_sidebar_construct     (glUISidebar          *sidebar,
61                                              BonoboUIComponent    *ui_component);
62
63 static void     selection_changed_cb        (glView               *view,
64                                              glUISidebar          *sidebar);
65
66
67 \f
68 /****************************************************************************/
69 /* Boilerplate Object stuff.                                                */
70 /****************************************************************************/
71 guint
72 gl_ui_sidebar_get_type (void)
73 {
74         static guint sidebar_type = 0;
75
76         if (!sidebar_type) {
77                 GTypeInfo sidebar_info = {
78                         sizeof (glUISidebarClass),
79                         NULL,
80                         NULL,
81                         (GClassInitFunc) gl_ui_sidebar_class_init,
82                         NULL,
83                         NULL,
84                         sizeof (glUISidebar),
85                         0,
86                         (GInstanceInitFunc) gl_ui_sidebar_instance_init,
87                 };
88
89                 sidebar_type =
90                         g_type_register_static (GTK_TYPE_VBOX,
91                                                 "glUISidebar",
92                                                 &sidebar_info, 0);
93         }
94
95         return sidebar_type;
96 }
97
98 static void
99 gl_ui_sidebar_class_init (glUISidebarClass *class)
100 {
101         GObjectClass   *object_class     = (GObjectClass *) class;
102
103         gl_debug (DEBUG_UI, "START");
104
105         parent_class = g_type_class_peek_parent (class);
106
107         object_class->finalize = gl_ui_sidebar_finalize;
108
109         gl_debug (DEBUG_UI, "END");
110 }
111
112 static void
113 gl_ui_sidebar_instance_init (glUISidebar *sidebar)
114 {
115         gl_debug (DEBUG_UI, "START");
116
117         sidebar->view = NULL;
118
119         gl_debug (DEBUG_UI, "END");
120 }
121
122 static void
123 gl_ui_sidebar_finalize (GObject *object)
124 {
125         glUISidebar *sidebar;
126
127         gl_debug (DEBUG_UI, "START");
128
129         g_return_if_fail (object != NULL);
130         g_return_if_fail (GL_IS_UI_SIDEBAR (object));
131
132         sidebar = GL_UI_SIDEBAR (object);
133
134         if (sidebar->view) {
135                 g_object_unref (G_OBJECT(sidebar->view));
136                 sidebar = NULL;
137         }
138
139         G_OBJECT_CLASS (parent_class)->finalize (object);
140
141         gl_debug (DEBUG_UI, "END");
142 }
143
144 /****************************************************************************/
145 /* Create a NEW sidebar.                                                    */
146 /****************************************************************************/
147 GObject *
148 gl_ui_sidebar_new (BonoboUIComponent *ui_component)
149 {
150         glUISidebar *sidebar;
151
152         gl_debug (DEBUG_UI, "START");
153
154         sidebar = g_object_new (gl_ui_sidebar_get_type (), NULL);
155
156         gtk_widget_set_size_request (GTK_WIDGET (sidebar), DEFAULT_SIDEBAR_WIDTH, -1);
157
158         gl_ui_sidebar_construct (sidebar, ui_component);
159
160         gl_debug (DEBUG_UI, "END");
161
162         return G_OBJECT(sidebar);
163 }
164
165 /******************************************************************************/
166 /* Initialize property toolbar.                                               */
167 /******************************************************************************/
168 static void
169 gl_ui_sidebar_construct (glUISidebar       *sidebar,
170                          BonoboUIComponent *ui_component)
171 {
172         gl_debug (DEBUG_UI, "START");
173
174         sidebar->ui_component = ui_component;
175
176         gl_ui_util_insert_widget (ui_component,
177                                   GTK_WIDGET (sidebar),
178                                   "/PropertySidebar/PropertyEditor");
179
180         sidebar->empty_child = gl_object_editor_new (GL_STOCK_PROPERTIES,
181                                                      _("Object properties"),
182                                                      GL_OBJECT_EDITOR_EMPTY,
183                                                      NULL);
184
185         sidebar->child = gtk_widget_ref (sidebar->empty_child);
186         gtk_widget_show (sidebar->child);
187         gtk_container_add (GTK_CONTAINER(sidebar), sidebar->child);
188
189         gl_ui_util_set_verb_list_sensitive (ui_component, doc_verbs, FALSE);
190
191         gl_debug (DEBUG_UI, "END");
192 }
193
194 /****************************************************************************/
195 /* Set view associated with sidebar.                                        */
196 /****************************************************************************/
197 void
198 gl_ui_sidebar_set_view (glUISidebar *sidebar,
199                         glView      *view)
200 {
201         gl_debug (DEBUG_UI, "START");
202
203         g_return_if_fail (view && GL_IS_VIEW (view));
204
205         gl_ui_util_set_verb_list_sensitive (sidebar->ui_component, doc_verbs, TRUE);
206
207         sidebar->view = GL_VIEW (g_object_ref (G_OBJECT (view)));
208
209         g_signal_connect (G_OBJECT(view), "selection_changed",
210                           G_CALLBACK(selection_changed_cb), sidebar);
211
212         gl_debug (DEBUG_UI, "END");
213 }
214
215 /*---------------------------------------------------------------------------*/
216 /* PRIVATE.  View "selection state changed" callback.                        */
217 /*---------------------------------------------------------------------------*/
218 static void 
219 selection_changed_cb (glView      *view,
220                       glUISidebar *sidebar)
221 {
222         gl_debug (DEBUG_UI, "START");
223
224         g_return_if_fail (view && GL_IS_VIEW (view));
225         g_return_if_fail (sidebar && GL_IS_UI_SIDEBAR (sidebar));
226
227         gtk_container_remove (GTK_CONTAINER(sidebar), sidebar->child);
228
229         if (gl_view_is_selection_empty (view)) {
230
231                 sidebar->child = gtk_widget_ref (sidebar->empty_child);
232                 
233         } else {
234
235                 sidebar->child = gtk_widget_ref (gl_view_get_editor (view));
236
237         }
238
239         gtk_widget_show (sidebar->child);
240 #if 0
241         gtk_container_add (GTK_CONTAINER(sidebar), sidebar->child);
242 #else
243         gtk_box_pack_start (GTK_BOX(sidebar), sidebar->child, TRUE, TRUE, 0);
244 #endif
245
246         gl_debug (DEBUG_UI, "END");
247 }
248