]> git.sur5r.net Git - glabels/blob - src/object-editor-data-page.c
Imported Upstream version 2.2.8
[glabels] / src / object-editor-data-page.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  object-editor.c:  object properties editor module
7  *
8  *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "object-editor.h"
27
28 #include <glib/gi18n.h>
29 #include <gtk/gtkeditable.h>
30 #include <gtk/gtkcombobox.h>
31 #include <gtk/gtktogglebutton.h>
32 #include <string.h>
33 #include <math.h>
34
35 #include "prefs.h"
36 #include "util.h"
37
38 #include "object-editor-private.h"
39
40 #include "debug.h"
41
42 /*===========================================*/
43 /* Private macros                            */
44 /*===========================================*/
45
46 /*===========================================*/
47 /* Private data types                        */
48 /*===========================================*/
49
50 /*===========================================*/
51 /* Private globals                           */
52 /*===========================================*/
53
54 /*===========================================*/
55 /* Local function prototypes                 */
56 /*===========================================*/
57
58 static void data_radio_toggled_cb                (glObjectEditor        *editor);
59
60
61 \f
62 /*--------------------------------------------------------------------------*/
63 /* PRIVATE.  Prepare data page.                                             */
64 /*--------------------------------------------------------------------------*/
65 void
66 gl_object_editor_prepare_data_page (glObjectEditor *editor)
67 {
68         gl_debug (DEBUG_EDITOR, "START");
69
70         /* Extract widgets from XML tree. */
71         editor->priv->data_page_vbox     = glade_xml_get_widget (editor->priv->gui,
72                                                                  "data_page_vbox");
73         editor->priv->data_literal_radio = glade_xml_get_widget (editor->priv->gui,
74                                                                  "data_literal_radio");
75         editor->priv->data_key_radio     = glade_xml_get_widget (editor->priv->gui,
76                                                                  "data_key_radio");
77         editor->priv->data_text_entry    = glade_xml_get_widget (editor->priv->gui,
78                                                                  "data_text_entry");
79         editor->priv->data_key_combo     = glade_xml_get_widget (editor->priv->gui,
80                                                                  "data_key_combo");
81
82         gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->data_key_combo));
83
84         /* Un-hide */
85         gtk_widget_show_all (editor->priv->data_page_vbox);
86
87         /* Connect signals */
88         g_signal_connect_swapped (G_OBJECT (editor->priv->data_text_entry),
89                                   "changed",
90                                   G_CALLBACK (gl_object_editor_changed_cb),
91                                   G_OBJECT (editor));
92         g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_combo),
93                                   "changed",
94                                   G_CALLBACK (gl_object_editor_changed_cb),
95                                   G_OBJECT (editor));
96         g_signal_connect_swapped (G_OBJECT (editor->priv->data_literal_radio),
97                                   "toggled",
98                                   G_CALLBACK (data_radio_toggled_cb),
99                                   G_OBJECT (editor));
100         g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_radio),
101                                   "toggled",
102                                   G_CALLBACK (data_radio_toggled_cb),
103                                   G_OBJECT (editor));
104
105         gl_debug (DEBUG_EDITOR, "END");
106 }
107
108 /*--------------------------------------------------------------------------*/
109 /* PRIVATE.  data radio callback.                                           */
110 /*--------------------------------------------------------------------------*/
111 static void
112 data_radio_toggled_cb (glObjectEditor *editor)
113 {
114         if (editor->priv->stop_signals) return;
115
116         gl_debug (DEBUG_WDGT, "START");
117  
118         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
119                 gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE);
120                 gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE);
121                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
122                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
123                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
124                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
125         } else {
126                 gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE);
127                 gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE);
128                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
129                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
130                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
131                                           !editor->priv->data_format_fixed_flag);
132                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
133                                           !editor->priv->data_format_fixed_flag);
134         }
135  
136         /* Emit our "changed" signal */
137         g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
138  
139         gl_debug (DEBUG_WDGT, "END");
140 }
141
142 /*****************************************************************************/
143 /* Set data.                                                                 */
144 /*****************************************************************************/
145 void
146 gl_object_editor_set_data (glObjectEditor      *editor,
147                             gboolean            merge_flag,
148                             glTextNode         *text_node)
149 {
150         gint pos;
151  
152         gl_debug (DEBUG_EDITOR, "START");
153  
154         editor->priv->stop_signals = TRUE;
155
156         gtk_widget_set_sensitive (editor->priv->data_key_radio, merge_flag);
157  
158         if (!text_node->field_flag || !merge_flag) {
159  
160                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
161                                               (editor->priv->data_literal_radio), TRUE); 
162                 gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE);
163                 gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE);
164                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
165                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
166                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
167                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
168  
169                 gtk_editable_delete_text (GTK_EDITABLE (editor->priv->data_text_entry), 0, -1);
170                 pos = 0;
171                 if (text_node->data != NULL ) {
172                         gtk_editable_insert_text (GTK_EDITABLE (editor->priv->data_text_entry),
173                                                   text_node->data,
174                                                   strlen (text_node->data),
175                                                   &pos);
176                 }
177
178         } else {
179                                                                                 
180                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
181                                               (editor->priv->data_key_radio), TRUE);
182                                                                                 
183                 gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE);
184                 gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE);
185                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
186                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
187                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
188                                           !editor->priv->data_format_fixed_flag);
189                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
190                                           !editor->priv->data_format_fixed_flag);
191                                                                                 
192
193                 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo),
194                                                    text_node->data);
195         }
196                                                                                 
197
198         editor->priv->stop_signals = FALSE;
199
200         gl_debug (DEBUG_EDITOR, "END");
201 }
202
203 /*****************************************************************************/
204 /* Query data.                                                              */
205 /*****************************************************************************/
206 glTextNode *
207 gl_object_editor_get_data (glObjectEditor      *editor)
208 {
209         glTextNode *text_node;
210  
211         gl_debug (DEBUG_EDITOR, "START");
212  
213         text_node = g_new0(glTextNode,1);
214  
215         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
216                 text_node->field_flag = FALSE;
217                 text_node->data =
218                     gtk_editable_get_chars (GTK_EDITABLE (editor->priv->data_text_entry),
219                                             0, -1);
220         } else {
221                 text_node->field_flag = TRUE;
222                 text_node->data =
223                         gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo));
224         }
225  
226         gl_debug (DEBUG_EDITOR, "text_node: field_flag=%d, data=%s",
227                   text_node->field_flag, text_node->data);
228
229         gl_debug (DEBUG_EDITOR, "END");
230  
231         return text_node;
232 }