2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * mdi-child.c: gLabels MDI child module
6 * Copyright (C) 2001-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
24 * This file is based on gedit-mdi-child.c from gedit2:
26 * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence
27 * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi
28 * Copyright (C) 2002 Paolo Maggi
33 #include "mdi-child.h"
34 #include "xml-label.h"
40 struct _glMDIChildPrivate
47 UNDO_REDO_STATE_CHANGED,
51 static void gl_mdi_child_class_init (glMDIChildClass *klass);
52 static void gl_mdi_child_init (glMDIChild *mdi);
53 static void gl_mdi_child_finalize (GObject *obj);
54 static void gl_mdi_child_destroy (GtkObject *obj);
56 static void gl_mdi_child_real_state_changed (glMDIChild* child);
58 static GtkWidget *gl_mdi_child_create_view (BonoboMDIChild *child);
60 static void gl_mdi_child_document_state_changed_handler (glLabel *label,
63 static void gl_mdi_child_document_can_undo_redo_handler (glLabel *label,
64 gboolean can, glMDIChild* child);
66 static gchar* gl_mdi_child_get_config_string (BonoboMDIChild *child, gpointer data);
68 static BonoboMDIChildClass *parent_class = NULL;
69 static guint mdi_child_signals[LAST_SIGNAL] = { 0 };
73 gl_mdi_child_get_type (void)
75 static GType mdi_child_type = 0;
77 gl_debug (DEBUG_MDI, "START");
79 if (mdi_child_type == 0)
81 static const GTypeInfo our_info =
83 sizeof (glMDIChildClass),
85 NULL, /* base_finalize */
86 (GClassInitFunc) gl_mdi_child_class_init,
87 NULL, /* class_finalize */
88 NULL, /* class_data */
91 (GInstanceInitFunc) gl_mdi_child_init
94 mdi_child_type = g_type_register_static (BONOBO_TYPE_MDI_CHILD,
100 gl_debug (DEBUG_MDI, "END");
102 return mdi_child_type;
106 gl_mdi_child_class_init (glMDIChildClass *klass)
108 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
110 gl_debug (DEBUG_MDI, "START");
112 parent_class = g_type_class_peek_parent (klass);
114 gobject_class->finalize = gl_mdi_child_finalize;
116 klass->state_changed = gl_mdi_child_real_state_changed;
117 klass->undo_redo_state_changed = NULL;
119 mdi_child_signals [STATE_CHANGED] =
120 g_signal_new ("state_changed",
121 G_OBJECT_CLASS_TYPE (gobject_class),
122 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
123 G_STRUCT_OFFSET (glMDIChildClass, state_changed),
125 gl_marshal_VOID__VOID,
129 mdi_child_signals [UNDO_REDO_STATE_CHANGED] =
130 g_signal_new ("undo_redo_state_changed",
131 G_OBJECT_CLASS_TYPE (gobject_class),
132 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
133 G_STRUCT_OFFSET (glMDIChildClass, undo_redo_state_changed),
135 gl_marshal_VOID__VOID,
139 BONOBO_MDI_CHILD_CLASS (klass)->create_view =
140 (BonoboMDIChildViewCreator)(gl_mdi_child_create_view);
142 BONOBO_MDI_CHILD_CLASS (klass)->get_config_string =
143 (BonoboMDIChildConfigFunc)(gl_mdi_child_get_config_string);
145 gl_debug (DEBUG_MDI, "END");
149 gl_mdi_child_init (glMDIChild *child)
151 gl_debug (DEBUG_MDI, "START");
153 child->priv = g_new0 (glMDIChildPrivate, 1);
155 child->priv->tab_label = NULL;
157 gl_debug (DEBUG_MDI, "END");
161 gl_mdi_child_finalize (GObject *obj)
165 gl_debug (DEBUG_MDI, "START");
167 g_return_if_fail (obj != NULL);
169 child = GL_MDI_CHILD (obj);
171 g_return_if_fail (GL_IS_MDI_CHILD (child));
172 g_return_if_fail (child->priv != NULL);
174 if (child->label != NULL)
175 g_object_unref (G_OBJECT (child->label));
177 g_free (child->priv);
179 G_OBJECT_CLASS (parent_class)->finalize (obj);
181 gl_debug (DEBUG_MDI, "END");
184 static void gl_mdi_child_real_state_changed (glMDIChild* child)
186 gchar* docname = NULL;
187 gchar* tab_name = NULL;
189 gl_debug (DEBUG_MDI, "START");
191 g_return_if_fail (child != NULL);
192 g_return_if_fail (child->label != NULL);
194 docname = gl_label_get_short_name (child->label);
195 g_return_if_fail (docname != NULL);
197 if (gl_label_is_modified (child->label))
199 tab_name = g_strdup_printf ("%s*", docname);
203 tab_name = g_strdup_printf ("%s", docname);
208 g_return_if_fail (tab_name != NULL);
210 bonobo_mdi_child_set_name (BONOBO_MDI_CHILD (child), tab_name);
214 gl_debug (DEBUG_MDI, "END");
218 gl_mdi_child_document_state_changed_handler (glLabel *label, glMDIChild* child)
220 gl_debug (DEBUG_MDI, "");
221 g_return_if_fail (child->label == label);
223 g_signal_emit (G_OBJECT (child), mdi_child_signals [STATE_CHANGED], 0);
227 gl_mdi_child_document_can_undo_redo_handler (glLabel *label, gboolean can,
230 gl_debug (DEBUG_MDI, "");
231 g_return_if_fail (child->label == label);
233 g_signal_emit (G_OBJECT (child), mdi_child_signals [UNDO_REDO_STATE_CHANGED], 0);
238 gl_mdi_child_connect_signals (glMDIChild *child)
240 gl_debug (DEBUG_MDI, "START");
242 g_signal_connect (G_OBJECT (child->label), "name_changed",
243 G_CALLBACK (gl_mdi_child_document_state_changed_handler),
245 g_signal_connect (G_OBJECT (child->label), "modified_changed",
246 G_CALLBACK (gl_mdi_child_document_state_changed_handler),
249 g_signal_connect (G_OBJECT (child->label), "can_undo",
250 G_CALLBACK (gl_mdi_child_document_can_undo_redo_handler),
252 g_signal_connect (G_OBJECT (child->label), "can_redo",
253 G_CALLBACK (gl_mdi_child_document_can_undo_redo_handler),
257 gl_debug (DEBUG_MDI, "END");
263 * Creates a new #glMDIChild object.
265 * Return value: a new #glMDIChild
268 gl_mdi_child_new (const gchar *tmplt_name,
269 gboolean rotate_flag)
273 glTemplate *template;
275 gl_debug (DEBUG_MDI, "START");
277 child = GL_MDI_CHILD (g_object_new (GL_TYPE_MDI_CHILD, NULL));
278 g_return_val_if_fail (child != NULL, NULL);
280 child->label = GL_LABEL (gl_label_new ());
281 g_return_val_if_fail (child->label != NULL, NULL);
283 template = gl_template_from_name (tmplt_name);
284 gl_label_set_template (child->label, template);
285 gl_template_free (&template);
286 gl_label_set_rotate_flag (child->label, rotate_flag);
287 gl_label_clear_modified (child->label);
289 doc_name = gl_label_get_short_name (child->label);
290 bonobo_mdi_child_set_name (BONOBO_MDI_CHILD (child), doc_name);
293 gl_mdi_child_connect_signals (child);
295 gl_debug (DEBUG_MDI, "END");
301 gl_mdi_child_new_with_uri (const gchar *uri, GError **error)
305 glXMLLabelStatus status;
307 gl_debug (DEBUG_MDI, "START");
309 doc = gl_xml_label_open (uri, &status);
316 child = GL_MDI_CHILD (g_object_new (GL_TYPE_MDI_CHILD, NULL));
317 g_return_val_if_fail (child != NULL, NULL);
320 g_return_val_if_fail (child->label != NULL, NULL);
322 gl_mdi_child_real_state_changed (child);
324 gl_mdi_child_connect_signals (child);
326 gl_debug (DEBUG_MDI, "END");
332 gl_mdi_child_create_view (BonoboMDIChild *child)
336 gl_debug (DEBUG_MDI, "START");
338 g_return_val_if_fail (child != NULL, NULL);
339 g_return_val_if_fail (GL_IS_MDI_CHILD (child), NULL);
341 new_view = GL_VIEW(gl_view_new (GL_MDI_CHILD (child)->label));
343 gtk_widget_show_all (GTK_WIDGET (new_view));
345 gl_debug (DEBUG_MDI, "END");
347 return GTK_WIDGET (new_view);
351 gl_mdi_child_get_config_string (BonoboMDIChild *child, gpointer data)
355 gl_debug (DEBUG_MDI, "");
357 g_return_val_if_fail (child != NULL, NULL);
358 g_return_val_if_fail (GL_IS_MDI_CHILD (child), NULL);
360 c = GL_MDI_CHILD (child);
362 return gl_label_get_filename (c->label);