2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * window.c: a gLabels app window
6 * Copyright (C) 2002 Jim Evins <evins@snaught.com>.
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.
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.
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
28 #include "xml-label.h"
33 /*============================================================================*/
34 /* Private macros and constants. */
35 /*============================================================================*/
37 #define DEFAULT_WINDOW_WIDTH 500
38 #define DEFAULT_WINDOW_HEIGHT 375
40 #define CURSOR_INFO_WIDTH 150
41 #define ZOOM_INFO_WIDTH 50
43 /*============================================================================*/
45 /*============================================================================*/
46 static BonoboWindowClass *parent_class;
48 static GList *window_list = NULL;
51 /*============================================================================*/
52 /* Local function prototypes */
53 /*============================================================================*/
55 static void gl_window_class_init (glWindowClass *class);
56 static void gl_window_init (glWindow *window);
57 static void gl_window_finalize (GObject *object);
58 static void gl_window_destroy (GtkObject *gtk_object);
60 static void set_window_title (glWindow *window,
63 static gboolean window_delete_event_cb (glWindow *window,
67 static void selection_changed_cb (glView *view,
70 static void zoom_changed_cb (glView *view,
74 static void pointer_moved_cb (glView *view,
79 static void name_changed_cb (glLabel *label,
82 static void modified_changed_cb (glLabel *label,
86 /****************************************************************************/
87 /* Boilerplate Object stuff. */
88 /****************************************************************************/
90 gl_window_get_type (void)
92 static guint window_type = 0;
95 GTypeInfo window_info = {
96 sizeof (glWindowClass),
99 (GClassInitFunc) gl_window_class_init,
104 (GInstanceInitFunc) gl_window_init,
108 g_type_register_static (bonobo_window_get_type (),
117 gl_window_class_init (glWindowClass *class)
119 GObjectClass *object_class = (GObjectClass *) class;
120 GtkObjectClass *gtk_object_class = (GtkObjectClass *) class;
122 gl_debug (DEBUG_WINDOW, "START");
124 parent_class = g_type_class_peek_parent (class);
126 object_class->finalize = gl_window_finalize;
128 gtk_object_class->destroy = gl_window_destroy;
130 gl_debug (DEBUG_WINDOW, "END");
134 gl_window_init (glWindow *window)
136 BonoboUIContainer *ui_container;
137 BonoboUIComponent *ui_component;
139 gl_debug (DEBUG_WINDOW, "START");
141 ui_container = bonobo_window_get_ui_container(BONOBO_WINDOW(window));
142 ui_component = bonobo_ui_component_new_default ();
143 bonobo_ui_component_set_container (ui_component,
144 BONOBO_OBJREF (ui_container),
147 window->cursor_info = gtk_label_new (NULL);
148 gtk_widget_set_size_request (window->cursor_info, CURSOR_INFO_WIDTH, -1);
149 window->cursor_info_frame = gtk_frame_new (NULL);
150 gtk_frame_set_shadow_type (GTK_FRAME(window->cursor_info_frame), GTK_SHADOW_IN);
151 gtk_container_add (GTK_CONTAINER(window->cursor_info_frame), window->cursor_info);
152 gtk_widget_show_all (window->cursor_info_frame);
154 window->zoom_info = gtk_label_new (NULL);
155 gtk_widget_set_size_request (window->zoom_info, ZOOM_INFO_WIDTH, -1);
156 window->zoom_info_frame = gtk_frame_new (NULL);
157 gtk_frame_set_shadow_type (GTK_FRAME(window->zoom_info_frame), GTK_SHADOW_IN);
158 gtk_container_add (GTK_CONTAINER(window->zoom_info_frame), window->zoom_info);
159 gtk_widget_show_all (window->zoom_info_frame);
161 gl_ui_init (ui_component,
162 BONOBO_WINDOW (window),
163 window->cursor_info_frame,
164 window->zoom_info_frame);
166 gtk_window_set_default_size (GTK_WINDOW (window),
167 DEFAULT_WINDOW_WIDTH,
168 DEFAULT_WINDOW_HEIGHT);
170 g_signal_connect (G_OBJECT(window), "delete-event",
171 G_CALLBACK(window_delete_event_cb), NULL);
173 window->uic = ui_component;
176 window_list = g_list_append (window_list, window);
178 gl_debug (DEBUG_WINDOW, "END");
182 gl_window_finalize (GObject *object)
186 gl_debug (DEBUG_WINDOW, "START");
188 g_return_if_fail (object != NULL);
189 g_return_if_fail (GL_IS_WINDOW (object));
191 window = GL_WINDOW (object);
193 G_OBJECT_CLASS (parent_class)->finalize (object);
195 gl_debug (DEBUG_WINDOW, "END");
199 gl_window_destroy (GtkObject *gtk_object)
203 gl_debug (DEBUG_WINDOW, "START");
205 g_return_if_fail (gtk_object != NULL);
206 g_return_if_fail (GL_IS_WINDOW (gtk_object));
208 window = GL_WINDOW (gtk_object);
209 window_list = g_list_remove (window_list, window);
211 if (GTK_OBJECT_CLASS (parent_class)->destroy) {
212 GTK_OBJECT_CLASS (parent_class)->destroy (gtk_object);
215 gl_debug (DEBUG_WINDOW, "END");
219 /****************************************************************************/
220 /* Create an app window. */
221 /****************************************************************************/
227 gl_debug (DEBUG_WINDOW, "START");
229 window = g_object_new (gl_window_get_type (),
230 "win_name", "glabels",
231 "title", _("(none) - glabels"),
234 gl_debug (DEBUG_WINDOW, "window=%p", window);
235 gl_debug (DEBUG_WINDOW, "view=%p", window->view);
237 gl_debug (DEBUG_WINDOW, "END");
239 return GTK_WIDGET(window);
242 /****************************************************************************/
243 /* Create an app window from a label. */
244 /****************************************************************************/
246 gl_window_new_from_label (glLabel *label)
250 gl_debug (DEBUG_WINDOW, "START");
252 window = GL_WINDOW (gl_window_new ());
254 gl_window_set_label (window, label);
256 gl_debug (DEBUG_WINDOW, "END");
258 return GTK_WIDGET(window);
261 /****************************************************************************/
262 /* Create an app window from a file. */
263 /****************************************************************************/
265 gl_window_new_from_file (const gchar *filename)
270 glXMLLabelStatus status;
272 gl_debug (DEBUG_WINDOW, "START");
274 window = GL_WINDOW (gl_window_new ());
276 abs_filename = gl_util_make_absolute (filename);
277 label = gl_xml_label_open (filename, &status);
278 g_free (abs_filename);
280 gl_window_set_label (window, label);
282 gl_debug (DEBUG_WINDOW, "END");
284 return GTK_WIDGET(window);
287 /****************************************************************************/
288 /* Is window empty? */
289 /****************************************************************************/
291 gl_window_is_empty (glWindow *window)
293 g_return_val_if_fail (GL_IS_WINDOW (window), FALSE);
295 gl_debug (DEBUG_WINDOW, "return %d", (window->view == NULL) );
296 return ( window->view == NULL );
299 /****************************************************************************/
300 /* Create view from label and place in window. */
301 /****************************************************************************/
303 gl_window_set_label (glWindow *window,
308 gl_debug (DEBUG_WINDOW, "START");
310 g_return_if_fail (GL_IS_WINDOW (window));
311 g_return_if_fail (GL_IS_LABEL (label));
313 gl_label_clear_modified (label);
315 set_window_title (window, label);
317 if ( window->view != NULL ) {
318 gtk_widget_destroy (window->view);
322 window->view = gl_view_new (label);
323 bonobo_window_set_contents (BONOBO_WINDOW(window), window->view);
325 gtk_widget_show_all (window->view);
327 gl_ui_update_all (window->uic, GL_VIEW(window->view));
329 string = g_strdup_printf ("%3.0f%%",
330 100.0*gl_view_get_zoom (GL_VIEW(window->view)));
331 gtk_label_set_text (GTK_LABEL(window->zoom_info), string);
334 g_signal_connect (G_OBJECT(window->view), "selection_changed",
335 G_CALLBACK(selection_changed_cb), window);
337 g_signal_connect (G_OBJECT(window->view), "zoom_changed",
338 G_CALLBACK(zoom_changed_cb), window);
340 g_signal_connect (G_OBJECT(window->view), "pointer_moved",
341 G_CALLBACK(pointer_moved_cb), window);
343 g_signal_connect (G_OBJECT(label), "name_changed",
344 G_CALLBACK(name_changed_cb), window);
346 g_signal_connect (G_OBJECT(label), "modified_changed",
347 G_CALLBACK(modified_changed_cb), window);
349 gl_debug (DEBUG_WINDOW, "END");
352 /****************************************************************************/
353 /* Return list of app windows. */
354 /****************************************************************************/
356 gl_window_get_window_list (void)
358 gl_debug (DEBUG_WINDOW, "");
362 /*---------------------------------------------------------------------------*/
363 /* PRIVATE. Set window title based on name and state of label. */
364 /*---------------------------------------------------------------------------*/
366 set_window_title (glWindow *window,
371 gl_debug (DEBUG_WINDOW, "START");
373 g_return_if_fail (window && GL_IS_WINDOW (window));
374 g_return_if_fail (label && GL_IS_LABEL (label));
376 name = gl_label_get_short_name (label);
377 g_return_if_fail (name != NULL);
379 if (gl_label_is_modified (label)) {
380 title = g_strdup_printf ("%s %s - glabels",
381 name, _("(modified)"));
383 title = g_strdup_printf ("%s - glabels", name);
386 gtk_window_set_title (GTK_WINDOW(window), title);
391 gl_debug (DEBUG_WINDOW, "END");
394 /*-------------------------------------------------------------------------*/
395 /* PRIVATE. Window "delete-event" callback. */
396 /*-------------------------------------------------------------------------*/
398 window_delete_event_cb (glWindow *window,
402 gl_debug (DEBUG_WINDOW, "START");
404 g_return_val_if_fail (window && GL_IS_WINDOW (window), TRUE);
406 gl_file_close (window);
408 gl_debug (DEBUG_WINDOW, "END");
413 /*---------------------------------------------------------------------------*/
414 /* PRIVATE. View "selection state changed" callback. */
415 /*---------------------------------------------------------------------------*/
417 selection_changed_cb (glView *view,
420 gl_debug (DEBUG_WINDOW, "START");
422 g_return_if_fail (view && GL_IS_VIEW (view));
423 g_return_if_fail (window && GL_IS_WINDOW (window));
425 gl_ui_update_selection_verbs (window->uic, view);
427 gl_debug (DEBUG_WINDOW, "END");
430 /*---------------------------------------------------------------------------*/
431 /* PRIVATE. View "zoom state changed" callback. */
432 /*---------------------------------------------------------------------------*/
434 zoom_changed_cb (glView *view,
440 gl_debug (DEBUG_WINDOW, "START");
442 g_return_if_fail (view && GL_IS_VIEW (view));
443 g_return_if_fail (window && GL_IS_WINDOW (window));
445 string = g_strdup_printf ("%3.0f%%", 100.0*zoom);
446 gtk_label_set_text (GTK_LABEL(window->zoom_info), string);
449 gl_debug (DEBUG_WINDOW, "END");
452 /*---------------------------------------------------------------------------*/
453 /* PRIVATE. View "pointer moved" callback. */
454 /*---------------------------------------------------------------------------*/
456 pointer_moved_cb (glView *view,
462 gdouble units_per_point;
463 gint units_precision;
465 gl_debug (DEBUG_WINDOW, "START");
467 g_return_if_fail (view && GL_IS_VIEW (view));
468 g_return_if_fail (window && GL_IS_WINDOW (window));
470 units_per_point = gl_prefs_get_units_per_point ();
471 units_precision = gl_prefs_get_units_precision ();
473 string = g_strdup_printf ("%.*f, %.*f",
474 units_precision, x*units_per_point,
475 units_precision, y*units_per_point);
476 gtk_label_set_text (GTK_LABEL(window->cursor_info), string);
479 gl_debug (DEBUG_WINDOW, "END");
482 /*---------------------------------------------------------------------------*/
483 /* PRIVATE. Label "name changed" callback. */
484 /*---------------------------------------------------------------------------*/
486 name_changed_cb (glLabel *label,
489 gl_debug (DEBUG_WINDOW, "START");
491 g_return_if_fail (label && GL_IS_LABEL (label));
492 g_return_if_fail (window && GL_IS_WINDOW (window));
494 set_window_title (window, label);
496 gl_debug (DEBUG_WINDOW, "END");
499 /*---------------------------------------------------------------------------*/
500 /* PRIVATE. Label "modified state changed" callback. */
501 /*---------------------------------------------------------------------------*/
503 modified_changed_cb (glLabel *label,
506 gl_debug (DEBUG_WINDOW, "START");
508 g_return_if_fail (label && GL_IS_LABEL (label));
509 g_return_if_fail (window && GL_IS_WINDOW (window));
511 set_window_title (window, label);
513 gl_ui_update_modified_verbs (window->uic, label);
515 gl_debug (DEBUG_WINDOW, "END");