]> git.sur5r.net Git - glabels/blob - glabels2/src/object-editor-data-page.c
2009-08-23 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor-data-page.c
1 /*
2  *  object-editor-data-page.c
3  *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "object-editor.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtkeditable.h>
27 #include <gtk/gtkcombobox.h>
28 #include <gtk/gtktogglebutton.h>
29 #include <string.h>
30 #include <math.h>
31
32 #include "prefs.h"
33 #include "util.h"
34
35 #include "object-editor-private.h"
36
37 #include "debug.h"
38
39
40 /*===========================================*/
41 /* Private macros                            */
42 /*===========================================*/
43
44
45 /*===========================================*/
46 /* Private data types                        */
47 /*===========================================*/
48
49
50 /*===========================================*/
51 /* Private globals                           */
52 /*===========================================*/
53
54
55 /*===========================================*/
56 /* Local function prototypes                 */
57 /*===========================================*/
58
59 static void data_radio_toggled_cb                (glObjectEditor        *editor);
60
61
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         gl_util_get_builder_widgets (editor->priv->builder,
72                                      "data_page_vbox",     &editor->priv->data_page_vbox,
73                                      "data_literal_radio", &editor->priv->data_literal_radio,
74                                      "data_key_radio",     &editor->priv->data_key_radio,
75                                      "data_text_entry",    &editor->priv->data_text_entry,
76                                      "data_key_combo",     &editor->priv->data_key_combo,
77                                      NULL);
78
79         gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->data_key_combo));
80
81         /* Un-hide */
82         gtk_widget_show_all (editor->priv->data_page_vbox);
83
84         /* Connect signals */
85         g_signal_connect_swapped (G_OBJECT (editor->priv->data_text_entry),
86                                   "changed",
87                                   G_CALLBACK (gl_object_editor_changed_cb),
88                                   G_OBJECT (editor));
89         g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_combo),
90                                   "changed",
91                                   G_CALLBACK (gl_object_editor_changed_cb),
92                                   G_OBJECT (editor));
93         g_signal_connect_swapped (G_OBJECT (editor->priv->data_literal_radio),
94                                   "toggled",
95                                   G_CALLBACK (data_radio_toggled_cb),
96                                   G_OBJECT (editor));
97         g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_radio),
98                                   "toggled",
99                                   G_CALLBACK (data_radio_toggled_cb),
100                                   G_OBJECT (editor));
101
102         gl_debug (DEBUG_EDITOR, "END");
103 }
104
105
106 /*--------------------------------------------------------------------------*/
107 /* PRIVATE.  data radio callback.                                           */
108 /*--------------------------------------------------------------------------*/
109 static void
110 data_radio_toggled_cb (glObjectEditor *editor)
111 {
112         if (editor->priv->stop_signals) return;
113
114         gl_debug (DEBUG_WDGT, "START");
115  
116         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
117                 gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE);
118                 gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE);
119                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
120                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
121                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
122                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
123         } else {
124                 gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE);
125                 gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE);
126                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
127                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
128                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
129                                           !editor->priv->data_format_fixed_flag);
130                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
131                                           !editor->priv->data_format_fixed_flag);
132         }
133  
134         /* Emit our "changed" signal */
135         g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
136  
137         gl_debug (DEBUG_WDGT, "END");
138 }
139
140
141 /*****************************************************************************/
142 /* Set data.                                                                 */
143 /*****************************************************************************/
144 void
145 gl_object_editor_set_data (glObjectEditor      *editor,
146                             gboolean            merge_flag,
147                             glTextNode         *text_node)
148 {
149         gint pos;
150  
151         gl_debug (DEBUG_EDITOR, "START");
152  
153         editor->priv->stop_signals = TRUE;
154
155         gtk_widget_set_sensitive (editor->priv->data_key_radio, merge_flag);
156  
157         if (!text_node->field_flag) {
158  
159                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
160                                               (editor->priv->data_literal_radio), TRUE); 
161                 gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE);
162                 gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE);
163                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
164                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
165                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
166                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
167  
168                 gtk_editable_delete_text (GTK_EDITABLE (editor->priv->data_text_entry), 0, -1);
169                 pos = 0;
170                 if (text_node->data != NULL ) {
171                         gtk_editable_insert_text (GTK_EDITABLE (editor->priv->data_text_entry),
172                                                   text_node->data,
173                                                   strlen (text_node->data),
174                                                   &pos);
175                 }
176
177         } else {
178                                                                                 
179                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
180                                               (editor->priv->data_key_radio), TRUE);
181                                                                                 
182                 gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE);
183                 gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE);
184                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
185                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
186                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
187                                           !editor->priv->data_format_fixed_flag);
188                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
189                                           !editor->priv->data_format_fixed_flag);
190                                                                                 
191
192                 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo),
193                                                    text_node->data);
194         }
195                                                                                 
196
197         editor->priv->stop_signals = FALSE;
198
199         gl_debug (DEBUG_EDITOR, "END");
200 }
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 }
233
234
235
236 /*
237  * Local Variables:       -- emacs
238  * mode: C                -- emacs
239  * c-basic-offset: 8      -- emacs
240  * tab-width: 8           -- emacs
241  * indent-tabs-mode: nil  -- emacs
242  * End:                   -- emacs
243  */