Further updates after 5110 testing
[gnokii.git] / xgnokii / xgnokii_dtmf.c
1 /*
2
3   X G N O K I I
4
5   A Linux/Unix GUI for Nokia mobile phones.
6
7   Released under the terms of the GNU GPL, see file COPYING for more details.
8
9 */
10
11 #include <stdio.h>
12 #include <gtk/gtk.h>
13 #include "misc.h"
14 #include "xgnokii_common.h"
15 #include "xgnokii.h"
16 #include "xgnokii_lowlevel.h"
17 #include "xgnokii_dtmf.h"
18 #include "xpm/Send.xpm"
19 #include "xpm/Delete.xpm"
20
21 #define MAX_DTMF_LENGTH         50
22
23 static GtkWidget *GUI_DTMFWindow;
24 static GtkWidget *displayEntry;
25 static ErrorDialog errorDialog = {NULL, NULL};
26 static gchar *saveFileName;
27
28
29 static inline void Help1 (GtkWidget *w, gpointer data)
30 {
31   gchar *indx = g_strdup_printf ("/%s/gnokii/xgnokii/dtmf/index.htm", xgnokiiConfig.locale);
32   Help (w, indx);
33   g_free (indx);
34 }
35
36
37 static inline void ButtonCB (GtkWidget *widget,
38                       gpointer   data )
39 {
40   gchar buf[2] = " ";
41
42   *buf = GPOINTER_TO_INT (data);
43   gtk_entry_append_text (GTK_ENTRY (displayEntry), buf);
44 }
45
46
47 static inline void ClearCB (GtkWidget *widget,
48                             gpointer   data )
49 {
50   gtk_entry_set_text (GTK_ENTRY (displayEntry), "");
51 }
52
53
54 static inline void SendCB (GtkWidget *widget,
55                             gpointer   data )
56 {
57   PhoneEvent *e;
58   gchar *buf = g_strdup (gtk_entry_get_text (GTK_ENTRY (displayEntry)));
59
60   if (*buf == '\0')
61   {
62     g_free (buf);
63     return;
64   }
65
66   e = g_malloc (sizeof (PhoneEvent));
67   e->event = Event_SendDTMF;
68   e->data = buf;
69   GUI_InsertEvent (e);
70 }
71
72
73 static void OkLoadDialog (GtkWidget *w, GtkFileSelection *fs)
74 {
75   FILE *f;
76   gchar *fileName;
77   gchar line[MAX_DTMF_LENGTH + 1];
78   gchar buf[80];
79
80   fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
81   gtk_widget_hide (GTK_WIDGET (fs));
82
83   if ((f = fopen (fileName, "r")) == NULL)
84   {
85     g_snprintf (buf, 80, _("Can't open file %s for reading!"), fileName);
86     gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
87     gtk_widget_show (errorDialog.dialog);
88     return;
89   }
90
91   fgets (line, MAX_DTMF_LENGTH + 1, f);
92   gtk_entry_set_text (GTK_ENTRY (displayEntry), line);
93   fclose (f);
94 }
95
96
97 static void LoadFileDialog ()
98 {  
99   static GtkWidget *fileDialog = NULL;
100
101   if (fileDialog == NULL)
102   {
103     fileDialog = gtk_file_selection_new (_("Load"));
104     gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
105                         GTK_SIGNAL_FUNC (DeleteEvent), NULL);
106     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
107                         "clicked", GTK_SIGNAL_FUNC (OkLoadDialog), (gpointer) fileDialog);
108     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
109                         "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
110   }
111
112   gtk_widget_show (fileDialog);
113 }
114
115
116 static void SaveDTMF ()
117 {
118   FILE *f;
119   gchar buf[80];
120
121   if ((f = fopen (saveFileName, "w")) == NULL)
122   {
123     g_snprintf (buf, 80, _("Can't open file %s for writing!"), saveFileName);
124     gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
125     gtk_widget_show (errorDialog.dialog);
126     return;
127   }
128
129   fputs (gtk_entry_get_text (GTK_ENTRY (displayEntry)), f);
130   fclose (f);
131 }
132
133
134 static inline void YesSaveDialog (GtkWidget *w, gpointer data)
135 {
136   gtk_widget_hide (GTK_WIDGET (data));
137   SaveDTMF();
138 }
139
140
141 static void OkSaveDialog (GtkWidget *w, GtkFileSelection *fs)
142 {
143   FILE *f;
144   static YesNoDialog dialog = { NULL, NULL};
145   gchar err[80]; 
146
147   saveFileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
148   gtk_widget_hide (GTK_WIDGET (fs));
149
150   if ((f = fopen (saveFileName, "r")) != NULL)
151   {
152     fclose (f);
153     if (dialog.dialog == NULL)
154     {
155       CreateYesNoDialog (&dialog, YesSaveDialog, CancelDialog, GUI_DTMFWindow);
156       gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
157       g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), saveFileName); 
158       gtk_label_set_text (GTK_LABEL(dialog.text), err);
159     }
160     gtk_widget_show (dialog.dialog);
161   }
162   else
163     SaveDTMF ();
164 }
165
166
167 static void SaveFileDialog ()
168 {
169   static GtkWidget *fileDialog = NULL;
170
171   if (fileDialog == NULL)
172   {
173     fileDialog = gtk_file_selection_new (_("Save"));
174     gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
175                         GTK_SIGNAL_FUNC (DeleteEvent), NULL);
176     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
177                         "clicked", GTK_SIGNAL_FUNC (OkSaveDialog), (gpointer) fileDialog);
178     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
179                         "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
180   }
181
182   gtk_widget_show (fileDialog);
183 }
184
185
186 static inline void CloseDTMF (GtkWidget *w, gpointer data)
187 {
188   gtk_widget_hide (GUI_DTMFWindow);
189 }
190
191
192 inline void GUI_ShowDTMF ()
193 {
194   gtk_widget_show (GUI_DTMFWindow);
195 }
196
197
198 static GtkItemFactoryEntry menu_items[] = {
199   { NULL,               NULL,           NULL, 0, "<Branch>"},
200   { NULL,               "<control>O",   LoadFileDialog, 0, NULL},
201   { NULL,               "<control>S",   SaveFileDialog, 0, NULL},
202   { NULL,               NULL,           NULL, 0, "<Separator>"},
203   { NULL,               "<control>W",   CloseDTMF, 0, NULL},
204   { NULL,               NULL,           NULL, 0, "<LastBranch>"},
205   { NULL,               NULL,           Help1, 0, NULL},
206   { NULL,               NULL,           GUI_ShowAbout, 0, NULL},
207 };
208
209
210 static void InitMainMenu (void)
211 {
212   menu_items[0].path = g_strdup (_("/_File"));
213   menu_items[1].path = g_strdup (_("/File/_Open"));
214   menu_items[2].path = g_strdup (_("/File/_Save"));
215   menu_items[3].path = g_strdup (_("/File/Sep1"));
216   menu_items[4].path = g_strdup (_("/File/_Close"));
217   menu_items[5].path = g_strdup (_("/_Help"));
218   menu_items[6].path = g_strdup (_("/Help/_Help"));
219   menu_items[7].path = g_strdup (_("/Help/_About"));
220 }
221
222
223 void GUI_CreateDTMFWindow ()
224 {
225   int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
226   GtkItemFactory *item_factory;
227   GtkAccelGroup *accel_group;
228   GtkWidget *menubar;
229   GtkWidget *main_vbox;
230   GtkWidget *table;
231   GtkWidget *frame;
232   GtkWidget *button;
233   GtkWidget *pixmap;
234   gchar buf[2];
235   gint i,j;
236
237
238   InitMainMenu ();
239   GUI_DTMFWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
240   gtk_window_set_title (GTK_WINDOW (GUI_DTMFWindow), _("Dial Tone"));
241   //gtk_widget_set_usize (GTK_WIDGET (GUI_DTMFWindow), 436, 220);
242   gtk_signal_connect (GTK_OBJECT (GUI_DTMFWindow), "delete_event",
243                       GTK_SIGNAL_FUNC (DeleteEvent), NULL);
244   gtk_widget_realize (GUI_DTMFWindow);
245
246   accel_group = gtk_accel_group_new ();
247   item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", 
248                                        accel_group);
249
250   gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
251
252   gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_DTMFWindow));
253
254   /* Finally, return the actual menu bar created by the item factory. */ 
255   menubar = gtk_item_factory_get_widget (item_factory, "<main>");
256
257   main_vbox = gtk_vbox_new (FALSE, 1);
258   gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
259   gtk_container_add (GTK_CONTAINER (GUI_DTMFWindow), main_vbox);
260   gtk_widget_show (main_vbox);
261
262   gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
263   gtk_widget_show (menubar);
264
265   table = gtk_table_new (8, 3, TRUE);
266
267   frame = gtk_frame_new (NULL);
268   gtk_container_add (GTK_CONTAINER (frame), table);
269   gtk_container_border_width (GTK_CONTAINER (frame), 10);
270   gtk_container_border_width (GTK_CONTAINER (table), 3);
271   gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
272   gtk_widget_show (frame);
273
274   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
275   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
276
277   displayEntry = gtk_entry_new_with_max_length (MAX_DTMF_LENGTH);
278   gtk_table_attach_defaults (GTK_TABLE (table), displayEntry, 0, 3, 0, 1);
279   gtk_widget_set_usize (displayEntry, 110, 22);
280
281   for (i = 0; i < 3; i++)
282     for (j = 0; j < 3; j++)
283     {
284       g_snprintf (buf, 2, "%d", j * 3 + i + 1);
285       button = gtk_button_new_with_label (buf);
286       gtk_signal_connect (GTK_OBJECT (button), "clicked",
287                           GTK_SIGNAL_FUNC (ButtonCB), (gpointer) ((gint) *buf));
288       gtk_table_attach_defaults (GTK_TABLE (table), button, i, i + 1, j + 2, j + 3);
289     }
290
291   button = gtk_button_new_with_label ("*");
292   gtk_signal_connect (GTK_OBJECT (button), "clicked",
293                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '*');
294   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 5, 6);
295
296   button = gtk_button_new_with_label ("0");
297   gtk_signal_connect (GTK_OBJECT (button), "clicked",
298                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '0');
299   gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 5, 6);
300
301   button = gtk_button_new_with_label ("#");
302   gtk_signal_connect (GTK_OBJECT (button), "clicked",
303                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '#');
304   gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 5, 6);
305
306
307   button = gtk_button_new_with_label ("Pause");
308   gtk_signal_connect (GTK_OBJECT (button), "clicked",
309                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) 'p');
310   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 6, 7);
311
312   button = gtk_button_new_with_label ("Wait");
313   gtk_signal_connect (GTK_OBJECT (button), "clicked",
314                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) 'w');
315   gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 6, 7);
316
317   button = gtk_button_new ();
318   pixmap = NewPixmap(Send_xpm, GUI_DTMFWindow->window,
319                      &GUI_DTMFWindow->style->bg[GTK_STATE_NORMAL]);
320   gtk_container_add (GTK_CONTAINER (button), pixmap);
321   gtk_signal_connect (GTK_OBJECT (button), "clicked",
322                       GTK_SIGNAL_FUNC (SendCB), (gpointer) NULL);
323   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 3, 7, 8);
324
325   button = gtk_button_new ();
326   pixmap = NewPixmap(Delete_xpm, GUI_DTMFWindow->window,
327                      &GUI_DTMFWindow->style->bg[GTK_STATE_NORMAL]);
328   gtk_container_add (GTK_CONTAINER (button), pixmap);
329   gtk_signal_connect (GTK_OBJECT (button), "clicked",
330                       GTK_SIGNAL_FUNC (ClearCB), (gpointer) NULL);
331   gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 6, 7);
332
333   gtk_widget_show_all (table);
334
335   CreateErrorDialog (&errorDialog, GUI_DTMFWindow);
336 }