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"
34 /*============================================================================*/
35 /* Private macros and constants. */
36 /*============================================================================*/
38 #define DEFAULT_WINDOW_WIDTH 788
39 #define DEFAULT_WINDOW_HEIGHT 600
41 #define CURSOR_INFO_WIDTH 150
42 #define ZOOM_INFO_WIDTH 50
44 /*============================================================================*/
46 /*============================================================================*/
47 static BonoboWindowClass *parent_class;
49 static GList *window_list = NULL;
52 /*============================================================================*/
53 /* Local function prototypes */
54 /*============================================================================*/
56 static void gl_window_class_init (glWindowClass *class);
57 static void gl_window_init (glWindow *window);
58 static void gl_window_finalize (GObject *object);
59 static void gl_window_destroy (GtkObject *gtk_object);
61 static void set_window_title (glWindow *window,
64 static gboolean window_delete_event_cb (glWindow *window,
68 static void selection_changed_cb (glView *view,
71 static void zoom_changed_cb (glView *view,
75 static void pointer_moved_cb (glView *view,
80 static void pointer_exit_cb (glView *view,
83 static void name_changed_cb (glLabel *label,
86 static void modified_changed_cb (glLabel *label,
90 /****************************************************************************/
91 /* Boilerplate Object stuff. */
92 /****************************************************************************/
94 gl_window_get_type (void)
96 static GType type = 0;
99 static const GTypeInfo info = {
100 sizeof (glWindowClass),
103 (GClassInitFunc) gl_window_class_init,
108 (GInstanceInitFunc) gl_window_init,
112 type = g_type_register_static (BONOBO_TYPE_WINDOW,
113 "glWindow", &info, 0);
120 gl_window_class_init (glWindowClass *class)
122 GObjectClass *object_class = (GObjectClass *) class;
123 GtkObjectClass *gtk_object_class = (GtkObjectClass *) class;
125 gl_debug (DEBUG_WINDOW, "START");
127 parent_class = g_type_class_peek_parent (class);
129 object_class->finalize = gl_window_finalize;
131 gtk_object_class->destroy = gl_window_destroy;
133 gl_debug (DEBUG_WINDOW, "END");
137 gl_window_init (glWindow *window)
139 BonoboUIContainer *ui_container;
140 BonoboUIComponent *ui_component;
142 gl_debug (DEBUG_WINDOW, "START");
144 ui_container = bonobo_window_get_ui_container(BONOBO_WINDOW(window));
145 ui_component = bonobo_ui_component_new_default ();
146 bonobo_ui_component_set_container (ui_component,
147 BONOBO_OBJREF (ui_container),
150 window->cursor_info = gtk_label_new (NULL);
151 gtk_widget_set_size_request (window->cursor_info, CURSOR_INFO_WIDTH, -1);
152 window->cursor_info_frame = gtk_frame_new (NULL);
153 gtk_frame_set_shadow_type (GTK_FRAME(window->cursor_info_frame), GTK_SHADOW_IN);
154 gtk_container_add (GTK_CONTAINER(window->cursor_info_frame), window->cursor_info);
155 gtk_widget_show_all (window->cursor_info_frame);
157 window->zoom_info = gtk_label_new (NULL);
158 gtk_widget_set_size_request (window->zoom_info, ZOOM_INFO_WIDTH, -1);
159 window->zoom_info_frame = gtk_frame_new (NULL);
160 gtk_frame_set_shadow_type (GTK_FRAME(window->zoom_info_frame), GTK_SHADOW_IN);
161 gtk_container_add (GTK_CONTAINER(window->zoom_info_frame), window->zoom_info);
162 gtk_widget_show_all (window->zoom_info_frame);
164 gl_ui_init (ui_component,
165 BONOBO_WINDOW (window),
166 window->cursor_info_frame,
167 window->zoom_info_frame);
169 window->property_bar =
170 GL_UI_PROPERTY_BAR(gl_ui_property_bar_new (ui_component));
172 GL_UI_SIDEBAR(gl_ui_sidebar_new (ui_component));
174 gtk_window_set_default_size (GTK_WINDOW (window),
175 DEFAULT_WINDOW_WIDTH,
176 DEFAULT_WINDOW_HEIGHT);
178 g_signal_connect (G_OBJECT(window), "delete-event",
179 G_CALLBACK(window_delete_event_cb), NULL);
181 window->uic = ui_component;
184 window_list = g_list_append (window_list, window);
186 gl_debug (DEBUG_WINDOW, "END");
190 gl_window_finalize (GObject *object)
194 gl_debug (DEBUG_WINDOW, "START");
196 g_return_if_fail (object != NULL);
197 g_return_if_fail (GL_IS_WINDOW (object));
199 window = GL_WINDOW (object);
201 G_OBJECT_CLASS (parent_class)->finalize (object);
203 gl_debug (DEBUG_WINDOW, "END");
207 gl_window_destroy (GtkObject *gtk_object)
211 gl_debug (DEBUG_WINDOW, "START");
213 g_return_if_fail (gtk_object != NULL);
214 g_return_if_fail (GL_IS_WINDOW (gtk_object));
216 window = GL_WINDOW (gtk_object);
217 window_list = g_list_remove (window_list, window);
220 gl_ui_unref(window->uic);
224 if (GTK_OBJECT_CLASS (parent_class)->destroy) {
225 GTK_OBJECT_CLASS (parent_class)->destroy (gtk_object);
228 gl_debug (DEBUG_WINDOW, "END");
232 /****************************************************************************/
233 /* Create an app window. */
234 /****************************************************************************/
240 gl_debug (DEBUG_WINDOW, "START");
242 window = g_object_new (gl_window_get_type (),
243 "win_name", "glabels",
244 "title", _("(none) - gLabels"),
247 gl_debug (DEBUG_WINDOW, "window=%p", window);
248 gl_debug (DEBUG_WINDOW, "view=%p", window->view);
250 gl_debug (DEBUG_WINDOW, "END");
252 return GTK_WIDGET(window);
255 /****************************************************************************/
256 /* Create an app window from a label. */
257 /****************************************************************************/
259 gl_window_new_from_label (glLabel *label)
263 gl_debug (DEBUG_WINDOW, "START");
265 window = GL_WINDOW (gl_window_new ());
267 gl_window_set_label (window, label);
269 gl_debug (DEBUG_WINDOW, "END");
271 return GTK_WIDGET(window);
274 /****************************************************************************/
275 /* Create an app window from a file. */
276 /****************************************************************************/
278 gl_window_new_from_file (const gchar *filename)
283 glXMLLabelStatus status;
285 gl_debug (DEBUG_WINDOW, "START");
287 window = GL_WINDOW (gl_window_new ());
289 abs_filename = gl_util_make_absolute (filename);
290 label = gl_xml_label_open (abs_filename, &status);
291 g_free (abs_filename);
293 gl_window_set_label (window, label);
295 gl_debug (DEBUG_WINDOW, "END");
297 return GTK_WIDGET(window);
300 /****************************************************************************/
301 /* Is window empty? */
302 /****************************************************************************/
304 gl_window_is_empty (glWindow *window)
306 g_return_val_if_fail (GL_IS_WINDOW (window), FALSE);
308 gl_debug (DEBUG_WINDOW, "return %d", (window->view == NULL) );
309 return ( window->view == NULL );
312 /****************************************************************************/
313 /* Create view from label and place in window. */
314 /****************************************************************************/
316 gl_window_set_label (glWindow *window,
321 gl_debug (DEBUG_WINDOW, "START");
323 g_return_if_fail (GL_IS_WINDOW (window));
324 g_return_if_fail (GL_IS_LABEL (label));
326 gl_label_clear_modified (label);
328 set_window_title (window, label);
330 if ( window->view != NULL ) {
331 gtk_widget_destroy (window->view);
335 window->view = gl_view_new (label);
336 bonobo_window_set_contents (BONOBO_WINDOW(window), window->view);
338 gtk_widget_show_all (window->view);
340 gl_view_zoom_to_fit (GL_VIEW(window->view));
342 if (gl_prefs->grid_visible) {
343 gl_view_show_grid (GL_VIEW(window->view));
345 gl_view_hide_grid (GL_VIEW(window->view));
348 if (gl_prefs->markup_visible) {
349 gl_view_show_markup (GL_VIEW(window->view));
351 gl_view_hide_markup (GL_VIEW(window->view));
354 gl_ui_update_all (window->uic, GL_VIEW(window->view));
356 gl_ui_property_bar_set_view (window->property_bar, GL_VIEW(window->view));
357 gl_ui_sidebar_set_view (window->sidebar, GL_VIEW(window->view));
359 string = g_strdup_printf ("%3.0f%%",
360 100.0*gl_view_get_zoom (GL_VIEW(window->view)));
361 gtk_label_set_text (GTK_LABEL(window->zoom_info), string);
364 g_signal_connect (G_OBJECT(window->view), "selection_changed",
365 G_CALLBACK(selection_changed_cb), window);
367 g_signal_connect (G_OBJECT(window->view), "zoom_changed",
368 G_CALLBACK(zoom_changed_cb), window);
370 g_signal_connect (G_OBJECT(window->view), "pointer_moved",
371 G_CALLBACK(pointer_moved_cb), window);
373 g_signal_connect (G_OBJECT(window->view), "pointer_exit",
374 G_CALLBACK(pointer_exit_cb), window);
376 g_signal_connect (G_OBJECT(label), "name_changed",
377 G_CALLBACK(name_changed_cb), window);
379 g_signal_connect (G_OBJECT(label), "modified_changed",
380 G_CALLBACK(modified_changed_cb), window);
382 gl_debug (DEBUG_WINDOW, "END");
385 /****************************************************************************/
386 /* Return list of app windows. */
387 /****************************************************************************/
389 gl_window_get_window_list (void)
391 gl_debug (DEBUG_WINDOW, "");
395 /*---------------------------------------------------------------------------*/
396 /* PRIVATE. Set window title based on name and state of label. */
397 /*---------------------------------------------------------------------------*/
399 set_window_title (glWindow *window,
404 gl_debug (DEBUG_WINDOW, "START");
406 g_return_if_fail (window && GL_IS_WINDOW (window));
407 g_return_if_fail (label && GL_IS_LABEL (label));
409 name = gl_label_get_short_name (label);
410 g_return_if_fail (name != NULL);
412 if (gl_label_is_modified (label)) {
413 title = g_strdup_printf ("%s %s - gLabels",
414 name, _("(modified)"));
416 title = g_strdup_printf ("%s - gLabels", name);
419 gtk_window_set_title (GTK_WINDOW(window), title);
424 gl_debug (DEBUG_WINDOW, "END");
427 /*-------------------------------------------------------------------------*/
428 /* PRIVATE. Window "delete-event" callback. */
429 /*-------------------------------------------------------------------------*/
431 window_delete_event_cb (glWindow *window,
435 gl_debug (DEBUG_WINDOW, "START");
437 g_return_val_if_fail (window && GL_IS_WINDOW (window), TRUE);
439 gl_file_close (window);
441 gl_debug (DEBUG_WINDOW, "END");
446 /*---------------------------------------------------------------------------*/
447 /* PRIVATE. View "selection state changed" callback. */
448 /*---------------------------------------------------------------------------*/
450 selection_changed_cb (glView *view,
453 gl_debug (DEBUG_WINDOW, "START");
455 g_return_if_fail (view && GL_IS_VIEW (view));
456 g_return_if_fail (window && GL_IS_WINDOW (window));
458 gl_ui_update_selection_verbs (window->uic, view);
460 gl_debug (DEBUG_WINDOW, "END");
463 /*---------------------------------------------------------------------------*/
464 /* PRIVATE. View "zoom state changed" callback. */
465 /*---------------------------------------------------------------------------*/
467 zoom_changed_cb (glView *view,
473 gl_debug (DEBUG_WINDOW, "START");
475 g_return_if_fail (view && GL_IS_VIEW (view));
476 g_return_if_fail (window && GL_IS_WINDOW (window));
478 string = g_strdup_printf ("%3.0f%%", 100.0*zoom);
479 gtk_label_set_text (GTK_LABEL(window->zoom_info), string);
482 gl_ui_update_zoom_verbs (window->uic, view);
484 gl_debug (DEBUG_WINDOW, "END");
487 /*---------------------------------------------------------------------------*/
488 /* PRIVATE. View "pointer moved" callback. */
489 /*---------------------------------------------------------------------------*/
491 pointer_moved_cb (glView *view,
497 gdouble units_per_point;
498 gint units_precision;
500 gl_debug (DEBUG_WINDOW, "START");
502 g_return_if_fail (view && GL_IS_VIEW (view));
503 g_return_if_fail (window && GL_IS_WINDOW (window));
505 units_per_point = gl_prefs_get_units_per_point ();
506 units_precision = gl_prefs_get_units_precision ();
508 string = g_strdup_printf ("%.*f, %.*f",
509 units_precision, x*units_per_point,
510 units_precision, y*units_per_point);
511 gtk_label_set_text (GTK_LABEL(window->cursor_info), string);
514 gl_debug (DEBUG_WINDOW, "END");
517 /*---------------------------------------------------------------------------*/
518 /* PRIVATE. View "pointer exit" callback. */
519 /*---------------------------------------------------------------------------*/
521 pointer_exit_cb (glView *view,
524 gl_debug (DEBUG_WINDOW, "START");
526 g_return_if_fail (view && GL_IS_VIEW (view));
527 g_return_if_fail (window && GL_IS_WINDOW (window));
529 gtk_label_set_text (GTK_LABEL(window->cursor_info), "");
531 gl_debug (DEBUG_WINDOW, "END");
534 /*---------------------------------------------------------------------------*/
535 /* PRIVATE. Label "name changed" callback. */
536 /*---------------------------------------------------------------------------*/
538 name_changed_cb (glLabel *label,
541 gl_debug (DEBUG_WINDOW, "START");
543 g_return_if_fail (label && GL_IS_LABEL (label));
544 g_return_if_fail (window && GL_IS_WINDOW (window));
546 set_window_title (window, label);
548 gl_debug (DEBUG_WINDOW, "END");
551 /*---------------------------------------------------------------------------*/
552 /* PRIVATE. Label "modified state changed" callback. */
553 /*---------------------------------------------------------------------------*/
555 modified_changed_cb (glLabel *label,
558 gl_debug (DEBUG_WINDOW, "START");
560 g_return_if_fail (label && GL_IS_LABEL (label));
561 g_return_if_fail (window && GL_IS_WINDOW (window));
563 set_window_title (window, label);
565 gl_ui_update_modified_verbs (window->uic, label);
567 gl_debug (DEBUG_WINDOW, "END");