7 A Linux/Unix GUI for Nokia mobile phones.
8 Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
9 & Ján Derfiòák <ja@mail.upjs.sk>.
11 Released under the terms of the GNU GPL, see file COPYING for more details.
25 # define sleep(x) Sleep((x) * 1000)
26 # define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
34 #include "gsm-common.h"
35 #include "xgnokii_contacts.h"
36 #include "xgnokii_lowlevel.h"
38 #include "xgnokii_common.h"
39 #include "xgnokii_lowlevel.h"
40 #include "xgnokii_sms.h"
41 #include "xpm/Read.xpm"
42 #include "xpm/Send.xpm"
43 #include "xpm/Open.xpm"
44 #include "xpm/Save.xpm"
45 #include "xpm/New.xpm"
46 #include "xpm/Duplicate.xpm"
47 #include "xpm/Edit.xpm"
48 #include "xpm/Delete.xpm"
49 #include "xpm/Dial.xpm"
50 #include "xpm/sim.xpm"
51 #include "xpm/phone.xpm"
52 #include "xpm/quest.xpm"
69 PhonebookEntry *pbEntry;
72 static GtkWidget *GUI_ContactsWindow;
74 static bool contactsMemoryInitialized;
75 static MemoryStatus memoryStatus;
76 static ContactsMemory contactsMemory; /* Hold contacts. */
77 static GtkWidget *clist;
78 static StatusInfo statusInfo;
79 static ProgressDialog progressDialog = {NULL, NULL, NULL};
80 static ErrorDialog errorDialog = {NULL, NULL};
81 static FindEntryStruct findEntryStruct = { "", 0};
82 static ExportDialogData exportDialogData = {NULL};
83 static MemoryPixmaps memoryPixmaps;
84 static QuestMark questMark;
85 static EditEntryData newEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
86 static EditEntryData editEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
87 static EditEntryData duplicateEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
88 static EditNumbersData editNumbersData = {NULL, NULL};
90 /* return != 0 if user has unsaved changes in contacts memory */
91 inline gint GUI_ContactsIsChanged (void)
93 return statusInfo.ch_ME | statusInfo.ch_SM;
97 /* return TRUE if Contacts memory was read from phone or from file */
98 inline bool GUI_ContactsIsIntialized (void)
100 return contactsMemoryInitialized;
104 static inline void Help1 (GtkWidget *w, gpointer data)
106 gchar *indx = g_strdup_printf ("/help/%s/windows/contacts/index.html", xgnokiiConfig.locale);
112 void RefreshStatusInfo (void)
116 if (statusInfo.ch_ME)
121 if (statusInfo.ch_SM)
125 g_snprintf(statusInfo.text, STATUS_INFO_LENGTH, "SIM: %d/%d%c Phone: %d/%d%c",
126 memoryStatus.UsedSM, memoryStatus.MaxSM, s,
127 memoryStatus.UsedME, memoryStatus.MaxME, p);
128 gtk_label_set_text(GTK_LABEL (statusInfo.label), statusInfo.text);
132 static inline void SetGroup0 (GtkWidget *item, gpointer data)
134 ((EditEntryData *) data)->newGroup = 0;
138 static inline void SetGroup1 (GtkWidget *item, gpointer data)
140 ((EditEntryData *) data)->newGroup = 1;
144 static inline void SetGroup2 (GtkWidget *item, gpointer data)
146 ((EditEntryData *) data)->newGroup = 2;
150 static inline void SetGroup3 (GtkWidget *item, gpointer data)
152 ((EditEntryData *) data)->newGroup = 3;
156 static inline void SetGroup4 (GtkWidget *item, gpointer data)
158 ((EditEntryData *) data)->newGroup = 4;
162 static inline void SetGroup5 (GtkWidget *item, gpointer data)
164 ((EditEntryData *) data)->newGroup = 5;
168 PhonebookEntry *FindFreeEntry (GSM_MemoryType type)
170 PhonebookEntry *entry;
176 if (memoryStatus.FreeME == 0)
179 end = memoryStatus.MaxME;
183 if (memoryStatus.FreeSM == 0)
185 start = memoryStatus.MaxME;
186 end = memoryStatus.MaxME + memoryStatus.MaxSM;
189 for(i = start; i < end; i++)
191 entry = g_ptr_array_index(contactsMemory, i);
192 if (entry->status == E_Empty || entry->status == E_Deleted)
200 inline PhonebookEntry *GUI_GetEntry (GSM_MemoryType type, gint nr)
202 if ((type == GMT_ME && (nr < 1 || nr >= memoryStatus.MaxME)) ||
203 (type == GMT_SM && (nr < 1 || nr >= memoryStatus.MaxSM)))
207 return g_ptr_array_index (contactsMemory, nr - 1);
209 return g_ptr_array_index (contactsMemory, nr + memoryStatus.MaxME - 1);
213 static void CloseContacts (GtkWidget *w, gpointer data)
215 gtk_widget_hide (GUI_ContactsWindow);
219 /* I don't want to allow window to close */
220 static void ProgressDialogDeleteEvent (GtkWidget *w, gpointer data)
226 static void CancelEditDialog (GtkWidget *widget, gpointer data )
228 gtk_widget_hide(GTK_WIDGET(((EditEntryData*) data)->dialog));
233 static void OkEditEntryDialog (GtkWidget *widget, gpointer data)
236 PhonebookEntry *entry;
238 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active &&
239 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_SM)
241 if ((entry = FindFreeEntry(GMT_ME)) == NULL)
243 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Can't change memory type!"));
244 gtk_widget_show (errorDialog.dialog);
247 strncpy(entry->entry.Name,
248 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
249 max_phonebook_name_length);
250 entry->entry.Name[max_phonebook_name_length] = '\0';
252 if (phoneMonitor.supported & PM_EXTPBK)
257 strncpy(entry->entry.Number,
258 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
259 max_phonebook_number_length);
260 entry->entry.Name[max_phonebook_number_length] = '\0';
263 entry->entry.Group = ((EditEntryData*) data)->newGroup;
265 entry->status = E_Changed;
267 ((EditEntryData*) data)->pbEntry->status = E_Deleted;
269 memoryStatus.UsedME++;
270 memoryStatus.FreeME--;
271 memoryStatus.UsedSM--;
272 memoryStatus.FreeSM++;
273 statusInfo.ch_ME = statusInfo.ch_SM = 1;
275 ((EditEntryData*) data)->pbEntry = entry;
277 else if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypeSIM)->active &&
278 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
280 if ((entry = FindFreeEntry(GMT_SM)) == NULL)
282 gtk_label_set_text(GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
283 gtk_widget_show (errorDialog.dialog);
286 strncpy(entry->entry.Name,
287 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
288 max_phonebook_sim_name_length);
289 entry->entry.Name[max_phonebook_sim_name_length] = '\0';
291 if (strlen(gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
293 gtk_label_set_text( GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated,\n\
294 because you save it into SIM memory!"));
295 gtk_widget_show (errorDialog.dialog);
298 if (phoneMonitor.supported & PM_EXTPBK)
303 strncpy(entry->entry.Number,
304 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
305 max_phonebook_sim_number_length);
306 entry->entry.Name[max_phonebook_sim_number_length] = '\0';
309 entry->entry.Group = ((EditEntryData*) data)->newGroup;
311 entry->status = E_Changed;
313 ((EditEntryData*) data)->pbEntry->status = E_Deleted;
315 memoryStatus.UsedME--;
316 memoryStatus.FreeME++;
317 memoryStatus.UsedSM++;
318 memoryStatus.FreeSM--;
319 statusInfo.ch_ME = statusInfo.ch_SM = 1;
321 ((EditEntryData*) data)->pbEntry = entry;
325 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active)
327 strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
328 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
329 max_phonebook_name_length);
330 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_name_length] = '\0';
332 if (phoneMonitor.supported & PM_EXTPBK)
337 strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
338 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
339 max_phonebook_number_length);
340 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_number_length] = '\0';
345 strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
346 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
347 max_phonebook_sim_name_length);
348 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
350 if (strlen(gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
352 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated,\n\
353 because you save it into SIM memory!"));
354 gtk_widget_show (errorDialog.dialog);
357 if (phoneMonitor.supported & PM_EXTPBK)
362 strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
363 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
364 max_phonebook_sim_number_length);
365 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_number_length] = '\0';
369 ((EditEntryData*) data)->pbEntry->entry.Group = ((EditEntryData*) data)->newGroup;
371 ((EditEntryData*) data)->pbEntry->status = E_Changed;
373 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
374 statusInfo.ch_ME = 1;
376 statusInfo.ch_SM = 1;
379 gtk_widget_hide (GTK_WIDGET(((EditEntryData*) data)->dialog));
381 RefreshStatusInfo ();
383 gtk_clist_freeze (GTK_CLIST (clist));
384 gtk_clist_remove (GTK_CLIST (clist), ((EditEntryData*) data)->row);
386 clist_row[0] = ((EditEntryData*) data)->pbEntry->entry.Name;
388 clist_row[1] = ((EditEntryData*) data)->pbEntry->entry.Number;
390 if( ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
394 if (phoneMonitor.supported & PM_CALLERGROUP)
395 clist_row[3] = xgnokiiConfig.callerGroups[((EditEntryData*) data)->pbEntry->entry.Group];
398 gtk_clist_insert(GTK_CLIST (clist), ((EditEntryData*) data)->row, clist_row);
399 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
400 gtk_clist_set_pixmap( GTK_CLIST (clist), ((EditEntryData*) data)->row, 2,
401 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
403 gtk_clist_set_pixmap( GTK_CLIST (clist), ((EditEntryData*) data)->row, 2,
404 memoryPixmaps.simMemPix, memoryPixmaps.mask);
406 gtk_clist_set_row_data(GTK_CLIST (clist), ((EditEntryData*) data)->row, (gpointer) ((EditEntryData*) data)->pbEntry);
408 gtk_clist_sort(GTK_CLIST (clist));
409 gtk_clist_thaw(GTK_CLIST (clist));
413 static void OkDeleteEntryDialog(GtkWidget *widget, gpointer data )
415 PhonebookEntry *pbEntry;
419 sel = GTK_CLIST (clist)->selection;
421 gtk_clist_freeze(GTK_CLIST (clist));
425 row = GPOINTER_TO_INT(sel->data);
426 pbEntry = (PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row);
429 pbEntry->status = E_Deleted;
431 if (pbEntry->entry.MemoryType == GMT_ME)
433 memoryStatus.UsedME--;
434 memoryStatus.FreeME++;
435 statusInfo.ch_ME = 1;
439 memoryStatus.UsedSM--;
440 memoryStatus.FreeSM++;
441 statusInfo.ch_SM = 1;
444 gtk_clist_remove(GTK_CLIST (clist), row);
447 RefreshStatusInfo ();
449 gtk_widget_hide(GTK_WIDGET (data));
451 gtk_clist_thaw(GTK_CLIST (clist));
455 static void OkNewEntryDialog(GtkWidget *widget, gpointer data )
458 PhonebookEntry *entry;
460 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active &&
461 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_SM)
463 if ((entry = FindFreeEntry (GMT_ME)) == NULL)
465 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
466 gtk_widget_show (errorDialog.dialog);
469 strncpy(entry->entry.Name,
470 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
471 max_phonebook_name_length);
472 entry->entry.Name[max_phonebook_name_length] = '\0';
474 if (phoneMonitor.supported & PM_EXTPBK)
479 strncpy(entry->entry.Number,
480 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
481 max_phonebook_number_length);
482 entry->entry.Name[max_phonebook_number_length] = '\0';
485 entry->entry.Group = ((EditEntryData*) data)->newGroup;
487 entry->status = E_Changed;
489 ((EditEntryData*) data)->pbEntry = entry;
491 else if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypeSIM)->active &&
492 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
494 if ((entry = FindFreeEntry (GMT_SM)) == NULL)
496 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
497 gtk_widget_show (errorDialog.dialog);
500 strncpy(entry->entry.Name,
501 gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name)),
502 max_phonebook_sim_name_length);
503 entry->entry.Name[max_phonebook_sim_name_length] = '\0';
505 if (strlen(gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
507 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated\n\
508 because you save it into SIM memory!"));
509 gtk_widget_show (errorDialog.dialog);
512 if (phoneMonitor.supported & PM_EXTPBK)
517 strncpy(entry->entry.Number,
518 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
519 max_phonebook_sim_number_length);
520 entry->entry.Name[max_phonebook_sim_number_length] = '\0';
523 entry->entry.Group = ((EditEntryData*) data)->newGroup;
525 entry->status = E_Changed;
527 ((EditEntryData*) data)->pbEntry = entry;
531 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active)
533 strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
534 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
535 max_phonebook_name_length);
536 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_name_length] = '\0';
538 if (phoneMonitor.supported & PM_EXTPBK)
543 strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
544 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
545 max_phonebook_number_length);
546 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_number_length] = '\0';
551 strncpy (((EditEntryData*) data)->pbEntry->entry.Name,
552 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
553 max_phonebook_sim_name_length);
554 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
556 if (strlen(gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
558 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated\n\
559 because you save it into SIM memory!"));
560 gtk_widget_show (errorDialog.dialog);
563 if (phoneMonitor.supported & PM_EXTPBK)
568 strncpy (((EditEntryData*) data)->pbEntry->entry.Number,
569 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
570 max_phonebook_sim_number_length);
571 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_number_length] = '\0';
575 ((EditEntryData*) data)->pbEntry->entry.Group = ((EditEntryData*) data)->newGroup;
577 ((EditEntryData*) data)->pbEntry->status = E_Changed;
580 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
582 memoryStatus.UsedME++;
583 memoryStatus.FreeME--;
584 statusInfo.ch_ME = 1;
588 memoryStatus.UsedSM++;
589 memoryStatus.FreeSM--;
590 statusInfo.ch_SM = 1;
593 gtk_widget_hide(GTK_WIDGET(((EditEntryData*) data)->dialog));
595 RefreshStatusInfo ();
597 gtk_clist_freeze (GTK_CLIST (clist));
598 clist_row[0] = ((EditEntryData*) data)->pbEntry->entry.Name;
600 clist_row[1] = ((EditEntryData*) data)->pbEntry->entry.Number;
602 if( ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
606 if (phoneMonitor.supported & PM_CALLERGROUP)
607 clist_row[3] = xgnokiiConfig.callerGroups[((EditEntryData*) data)->pbEntry->entry.Group];
610 gtk_clist_insert (GTK_CLIST (clist), 1, clist_row);
612 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
613 gtk_clist_set_pixmap (GTK_CLIST (clist), 1, 2,
614 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
616 gtk_clist_set_pixmap (GTK_CLIST (clist), 1, 2,
617 memoryPixmaps.simMemPix, memoryPixmaps.mask);
619 gtk_clist_set_row_data (GTK_CLIST (clist), 1, (gpointer) ((EditEntryData*) data)->pbEntry);
621 gtk_clist_sort (GTK_CLIST (clist));
622 gtk_clist_thaw (GTK_CLIST (clist));
626 static void OkChangeEntryDialog( GtkWidget *widget, gpointer data)
630 PhonebookEntry *oldPbEntry, *newPbEntry;
634 sel = GTK_CLIST (clist)->selection;
636 gtk_widget_hide(GTK_WIDGET (data));
638 gtk_clist_freeze(GTK_CLIST (clist));
642 row = GPOINTER_TO_INT (sel->data);
643 oldPbEntry = (PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row);
647 if (oldPbEntry->entry.MemoryType == GMT_SM)
649 if ((newPbEntry = FindFreeEntry (GMT_ME)) == NULL)
651 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
652 gtk_widget_show (errorDialog.dialog);
656 newPbEntry->entry = oldPbEntry->entry;
657 newPbEntry->entry.MemoryType = GMT_ME;
659 newPbEntry->status = E_Changed;
660 oldPbEntry->status = E_Deleted;
662 memoryStatus.UsedME++;
663 memoryStatus.FreeME--;
664 memoryStatus.UsedSM--;
665 memoryStatus.FreeSM++;
666 statusInfo.ch_ME = statusInfo.ch_SM = 1;
671 if ((newPbEntry = FindFreeEntry(GMT_SM)) == NULL)
673 gtk_label_set_text(GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
674 gtk_widget_show (errorDialog.dialog);
678 newPbEntry->entry = oldPbEntry->entry;
679 newPbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
680 newPbEntry->entry.MemoryType = GMT_SM;
682 newPbEntry->status = E_Changed;
683 oldPbEntry->status = E_Deleted;
685 memoryStatus.UsedME--;
686 memoryStatus.FreeME++;
687 memoryStatus.UsedSM++;
688 memoryStatus.FreeSM--;
689 statusInfo.ch_ME = statusInfo.ch_SM = 1;
692 gtk_clist_remove(GTK_CLIST (clist), row);
694 clist_row[0] = newPbEntry->entry.Name;
696 if (newPbEntry->entry.SubEntriesCount>0) {
697 snprintf(string,100,"%s *",newPbEntry->entry.Number);
699 } else clist_row[1] = newPbEntry->entry.Number;
701 if( newPbEntry->entry.MemoryType == GMT_ME)
705 if (phoneMonitor.supported & PM_CALLERGROUP)
706 clist_row[3] = xgnokiiConfig.callerGroups[newPbEntry->entry.Group];
709 gtk_clist_insert (GTK_CLIST (clist), row, clist_row);
710 if (newPbEntry->entry.MemoryType == GMT_ME)
711 gtk_clist_set_pixmap (GTK_CLIST (clist), row, 2,
712 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
714 gtk_clist_set_pixmap (GTK_CLIST (clist), row, 2,
715 memoryPixmaps.simMemPix, memoryPixmaps.mask);
717 gtk_clist_set_row_data (GTK_CLIST (clist), row, (gpointer) newPbEntry);
720 RefreshStatusInfo ();
721 gtk_clist_sort (GTK_CLIST (clist));
722 gtk_clist_thaw (GTK_CLIST (clist));
726 static void SearchEntry (void)
732 if (!contactsMemoryInitialized || *findEntryStruct.pattern == '\0')
735 gtk_clist_unselect_all( GTK_CLIST (clist));
736 g_strup(findEntryStruct.pattern);
738 gtk_clist_get_text( GTK_CLIST (clist), findEntryStruct.lastRow,
739 findEntryStruct.type, &entry);
740 i = (findEntryStruct.lastRow + 1) % (memoryStatus.MaxME + memoryStatus.MaxSM);
742 while (findEntryStruct.lastRow != i)
744 buf = g_strdup (entry);
747 if (strstr( buf, findEntryStruct.pattern))
750 findEntryStruct.lastRow = i;
751 gtk_clist_select_row( GTK_CLIST (clist),
752 (i + memoryStatus.MaxME + memoryStatus.MaxSM - 1)
753 % (memoryStatus.MaxME + memoryStatus.MaxSM),
754 findEntryStruct.type);
755 gtk_clist_moveto( GTK_CLIST (clist),
756 (i + memoryStatus.MaxME + memoryStatus.MaxSM - 1)
757 % (memoryStatus.MaxME + memoryStatus.MaxSM),
758 findEntryStruct.type, 0.5, 0.5);
762 gtk_clist_get_text (GTK_CLIST (clist), i, findEntryStruct.type, &entry);
764 i = (i + 1) % (memoryStatus.MaxME + memoryStatus.MaxSM);
767 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find pattern!"));
768 gtk_widget_show (errorDialog.dialog);
772 static void OkFindEntryDialog (GtkWidget *widget, gpointer data)
774 if (GTK_TOGGLE_BUTTON (((FindEntryData*) data)->nameB)->active)
775 findEntryStruct.type = FIND_NAME;
777 findEntryStruct.type = FIND_NUMBER;
779 strncpy(findEntryStruct.pattern,
780 gtk_entry_get_text (GTK_ENTRY (((FindEntryData*) data)->pattern)),
781 max_phonebook_number_length);
782 findEntryStruct.pattern[max_phonebook_number_length] = '\0';
784 findEntryStruct.lastRow = 0;
786 gtk_widget_hide( ((FindEntryData*) data)->dialog);
792 void CreateGroupMenu (EditEntryData *data)
798 gtk_option_menu_remove_menu (GTK_OPTION_MENU (data->group));
799 if (GTK_IS_WIDGET (data->groupMenu))
800 gtk_widget_destroy (GTK_WIDGET (data->groupMenu));
801 data->groupMenu = NULL;
804 data->groupMenu = gtk_menu_new ();
806 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[0]);
807 gtk_signal_connect (GTK_OBJECT (item), "activate",
808 GTK_SIGNAL_FUNC (SetGroup0),
810 gtk_widget_show (item);
811 gtk_menu_append (GTK_MENU (data->groupMenu), item);
813 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[1]);
814 gtk_signal_connect (GTK_OBJECT (item), "activate",
815 GTK_SIGNAL_FUNC (SetGroup1),
817 gtk_widget_show (item);
818 gtk_menu_append (GTK_MENU (data->groupMenu), item);
820 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[2]);
821 gtk_signal_connect (GTK_OBJECT (item), "activate",
822 GTK_SIGNAL_FUNC (SetGroup2),
824 gtk_widget_show (item);
825 gtk_menu_append (GTK_MENU (data->groupMenu), item);
827 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[3]);
828 gtk_signal_connect (GTK_OBJECT (item), "activate",
829 GTK_SIGNAL_FUNC (SetGroup3),
831 gtk_widget_show (item);
832 gtk_menu_append (GTK_MENU (data->groupMenu), item);
834 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[4]);
835 gtk_signal_connect (GTK_OBJECT (item), "activate",
836 GTK_SIGNAL_FUNC (SetGroup4),
838 gtk_widget_show (item);
839 gtk_menu_append (GTK_MENU (data->groupMenu), item);
841 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[5]);
842 gtk_signal_connect (GTK_OBJECT (item), "activate",
843 GTK_SIGNAL_FUNC (SetGroup5),
845 gtk_widget_show (item);
846 gtk_menu_append (GTK_MENU (data->groupMenu), item);
848 gtk_option_menu_set_menu (GTK_OPTION_MENU (data->group), data->groupMenu);
852 inline void GUI_RefreshGroupMenu (void)
854 if (newEditEntryData.group)
855 CreateGroupMenu (&newEditEntryData);
857 if (editEditEntryData.group)
858 CreateGroupMenu (&editEditEntryData);
860 if (duplicateEditEntryData.group)
861 CreateGroupMenu (&duplicateEditEntryData);
865 static void EditSubEntries (GtkWidget *clist,
868 GdkEventButton *event,
871 if(event && event->type == GDK_2BUTTON_PRESS)
872 // EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row),
877 gtk_clist_get_text (GTK_CLIST (clist), row, 1, &buf);
883 static void EditNumbers (GtkWidget *widget, void *data)
885 GtkWidget *button, *clistScrolledWindow;
890 if (editNumbersData.dialog == NULL)
892 editNumbersData.dialog = gtk_dialog_new ();
893 gtk_window_set_title (GTK_WINDOW (editNumbersData.dialog), _("Numbers"));
894 gtk_window_set_modal (GTK_WINDOW (editNumbersData.dialog), TRUE);
895 gtk_container_set_border_width (GTK_CONTAINER (editNumbersData.dialog), 10);
896 gtk_signal_connect (GTK_OBJECT (editNumbersData.dialog), "delete_event",
897 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
899 button = gtk_button_new_with_label (_("Ok"));
900 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
901 button, TRUE, TRUE, 10);
902 // gtk_signal_connect (GTK_OBJECT (button), "clicked",
903 // GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
904 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
905 gtk_widget_grab_default (button);
906 gtk_widget_show (button);
908 button = gtk_button_new_with_label (_("New"));
909 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
910 button, TRUE, TRUE, 10);
911 // gtk_signal_connect (GTK_OBJECT (button), "clicked",
912 // GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
913 gtk_widget_show (button);
915 button = gtk_button_new_with_label (_("Cancel"));
916 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
917 button, TRUE, TRUE, 10);
918 gtk_signal_connect (GTK_OBJECT (button), "clicked",
919 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) editNumbersData.dialog);
920 gtk_widget_show (button);
922 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editNumbersData.dialog)->vbox), 5);
924 editNumbersData.clist = gtk_clist_new (3);
925 gtk_clist_set_shadow_type (GTK_CLIST (editNumbersData.clist), GTK_SHADOW_OUT);
927 gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 0, 4);
928 gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 1, 115);
929 gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 2, 10);
930 //gtk_clist_set_column_justification (GTK_CLIST (editNumbersData.clist), 2, GTK_JUSTIFY_CENTER);
932 gtk_signal_connect (GTK_OBJECT (editNumbersData.clist), "select_row",
933 GTK_SIGNAL_FUNC (EditSubEntries), NULL);
935 clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
936 gtk_container_add (GTK_CONTAINER (clistScrolledWindow), editNumbersData.clist);
937 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clistScrolledWindow),
938 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
940 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editNumbersData.dialog)->vbox),
941 clistScrolledWindow);
943 gtk_widget_show (editNumbersData.clist);
944 gtk_widget_show (clistScrolledWindow);
947 gtk_clist_freeze (GTK_CLIST (editNumbersData.clist));
948 gtk_clist_clear (GTK_CLIST (editNumbersData.clist));
950 for(i = 0; i < editNumbersData.pbEntry->entry.SubEntriesCount; i++)
952 if (strcmp (editNumbersData.pbEntry->entry.Number,
953 editNumbersData.pbEntry->entry.SubEntries[i].data.Number) == 0)
958 row[1] = editNumbersData.pbEntry->entry.SubEntries[i].data.Number;
960 switch (editNumbersData.pbEntry->entry.SubEntries[i].EntryType)
963 switch (editNumbersData.pbEntry->entry.SubEntries[i].NumberType)
1012 gtk_clist_append (GTK_CLIST (editNumbersData.clist), row);
1013 /* if (pbEntry->entry.MemoryType == GMT_ME)
1014 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
1015 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
1017 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
1018 memoryPixmaps.simMemPix, memoryPixmaps.mask);
1022 gtk_clist_thaw (GTK_CLIST (editNumbersData.clist));
1024 gtk_widget_show (editNumbersData.dialog);
1028 static void CreateEditDialog (EditEntryData *editEntryData, gchar *title,
1029 GtkSignalFunc okFunc)
1031 GtkWidget *button, *label, *hbox;
1033 editEntryData->dialog = gtk_dialog_new ();
1034 gtk_window_set_title (GTK_WINDOW (editEntryData->dialog), title);
1035 gtk_window_set_modal (GTK_WINDOW (editEntryData->dialog), TRUE);
1036 gtk_container_set_border_width (GTK_CONTAINER (editEntryData->dialog), 10);
1037 gtk_signal_connect (GTK_OBJECT (editEntryData->dialog), "delete_event",
1038 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1040 button = gtk_button_new_with_label (_("Ok"));
1041 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editEntryData->dialog)->action_area),
1042 button, TRUE, TRUE, 10);
1043 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1044 GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
1045 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1046 gtk_widget_grab_default (button);
1047 gtk_widget_show (button);
1048 button = gtk_button_new_with_label (_("Cancel"));
1049 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editEntryData->dialog)->action_area),
1050 button, TRUE, TRUE, 10);
1051 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1052 GTK_SIGNAL_FUNC (CancelEditDialog), (gpointer) editEntryData);
1053 gtk_widget_show (button);
1055 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), 5);
1057 hbox = gtk_hbox_new (FALSE, 0);
1058 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1059 gtk_widget_show (hbox);
1061 label = gtk_label_new (_("Name:"));
1062 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1063 gtk_widget_show (label);
1065 editEntryData->name = gtk_entry_new_with_max_length (100);
1067 gtk_box_pack_end(GTK_BOX(hbox), editEntryData->name, FALSE, FALSE, 2);
1068 gtk_widget_show (editEntryData->name);
1070 hbox = gtk_hbox_new (FALSE, 0);
1071 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1072 gtk_widget_show (hbox);
1074 label = gtk_label_new (_("Number:"));
1075 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1076 gtk_widget_show (label);
1078 if (phoneMonitor.supported & PM_EXTPBK)
1080 button = gtk_button_new ();
1081 editEntryData->number = gtk_label_new ("");
1083 gtk_container_add (GTK_CONTAINER (button), editEntryData->number);
1085 gtk_box_pack_end(GTK_BOX(hbox), button, TRUE, TRUE, 2);
1087 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1088 GTK_SIGNAL_FUNC (EditNumbers), NULL);
1089 gtk_widget_show_all (button);
1093 editEntryData->number = gtk_entry_new_with_max_length (max_phonebook_number_length);
1094 gtk_box_pack_end(GTK_BOX(hbox), editEntryData->number, FALSE, FALSE, 2);
1095 gtk_widget_show (editEntryData->number);
1098 /* if (phoneMonitor.supported & PM_EXTPBK) {
1100 hbox = gtk_hbox_new (FALSE, 0);
1101 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1102 // gtk_widget_show (hbox);
1104 label = gtk_label_new (_("Extended:"));
1105 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1106 // gtk_widget_show (label);
1108 editEntryData->extended = gtk_combo_new();
1109 gtk_box_pack_end(GTK_BOX(hbox), editEntryData->extended, FALSE, FALSE, 2);
1110 // gtk_widget_show (editEntryData->extended);
1112 gtk_signal_connect (GTK_OBJECT (GTK_COMBO(editEntryData->extended)->entry), "activate",
1113 GTK_SIGNAL_FUNC (ExtPbkChanged), (gpointer) editEntryData);
1117 editEntryData->memoryBox = gtk_hbox_new (FALSE, 0);
1118 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox),
1119 editEntryData->memoryBox);
1121 label = gtk_label_new (_("Memory:"));
1122 gtk_box_pack_start(GTK_BOX (editEntryData->memoryBox), label, FALSE, FALSE, 2);
1123 gtk_widget_show (label);
1125 editEntryData->memoryTypePhone = gtk_radio_button_new_with_label (NULL, _("phone"));
1126 gtk_box_pack_end (GTK_BOX (editEntryData->memoryBox), editEntryData->memoryTypePhone, TRUE, FALSE, 2);
1127 gtk_widget_show (editEntryData->memoryTypePhone);
1129 editEntryData->memoryTypeSIM = gtk_radio_button_new_with_label(
1130 gtk_radio_button_group (GTK_RADIO_BUTTON (editEntryData->memoryTypePhone)), "SIM");
1131 gtk_box_pack_end(GTK_BOX (editEntryData->memoryBox), editEntryData->memoryTypeSIM, TRUE, FALSE, 2);
1132 gtk_widget_show (editEntryData->memoryTypeSIM);
1134 hbox = gtk_hbox_new (FALSE, 0);
1135 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1136 gtk_widget_show (hbox);
1138 editEntryData->groupLabel = gtk_label_new (_("Caller group:"));
1139 gtk_box_pack_start (GTK_BOX (hbox), editEntryData->groupLabel, FALSE, FALSE, 2);
1141 editEntryData->group = gtk_option_menu_new ();
1143 CreateGroupMenu (editEntryData);
1145 gtk_box_pack_start (GTK_BOX (hbox), editEntryData->group, TRUE, TRUE, 0);
1149 static void EditPbEntry(PhonebookEntry *pbEntry, gint row)
1151 if (editEditEntryData.dialog == NULL)
1152 CreateEditDialog(&editEditEntryData, _("Edit entry"), OkEditEntryDialog);
1154 editEditEntryData.pbEntry = pbEntry;
1155 editEditEntryData.newGroup = pbEntry->entry.Group;
1156 editEditEntryData.row = row;
1157 editNumbersData.pbEntry = pbEntry;
1159 gtk_entry_set_text (GTK_ENTRY (editEditEntryData.name), pbEntry->entry.Name);
1161 if (phoneMonitor.supported & PM_EXTPBK)
1162 gtk_label_set_text (GTK_LABEL (editEditEntryData.number), pbEntry->entry.Number);
1164 gtk_entry_set_text (GTK_ENTRY (editEditEntryData.number), pbEntry->entry.Number);
1166 if (pbEntry->entry.MemoryType == GMT_ME)
1167 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editEditEntryData.memoryTypePhone), TRUE);
1169 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editEditEntryData.memoryTypeSIM), TRUE);
1171 gtk_option_menu_set_history( GTK_OPTION_MENU (editEditEntryData.group),
1172 pbEntry->entry.Group);
1174 if (phoneMonitor.supported & PM_CALLERGROUP)
1176 gtk_widget_show (editEditEntryData.group);
1177 gtk_widget_show (editEditEntryData.groupLabel);
1181 gtk_widget_hide (editEditEntryData.group);
1182 gtk_widget_hide (editEditEntryData.groupLabel);
1185 if (memoryStatus.MaxME > 0)
1186 gtk_widget_show (GTK_WIDGET (editEditEntryData.memoryBox));
1188 gtk_widget_hide (GTK_WIDGET (editEditEntryData.memoryBox));
1190 gtk_widget_show (GTK_WIDGET (editEditEntryData.dialog));
1194 void DeletePbEntry (void)
1196 static GtkWidget *dialog = NULL;
1197 GtkWidget *button, *hbox, *label, *pixmap;
1201 dialog = gtk_dialog_new ();
1202 gtk_window_set_title (GTK_WINDOW (dialog), _("Delete entries"));
1203 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1204 gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
1205 gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
1206 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1207 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1209 button = gtk_button_new_with_label (_("Ok"));
1210 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1211 button, TRUE, TRUE, 10);
1212 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1213 GTK_SIGNAL_FUNC (OkDeleteEntryDialog), (gpointer) dialog);
1214 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1215 gtk_widget_grab_default (button);
1216 gtk_widget_show (button);
1217 button = gtk_button_new_with_label (_("Cancel"));
1218 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1219 button, TRUE, TRUE, 10);
1220 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1221 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
1222 gtk_widget_show (button);
1224 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
1226 hbox = gtk_hbox_new (FALSE, 0);
1227 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
1228 gtk_widget_show (hbox);
1230 pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
1231 gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 10);
1232 gtk_widget_show(pixmap);
1234 label = gtk_label_new(_("Do you want to delete selected entries?"));
1235 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10);
1236 gtk_widget_show(label);
1239 gtk_widget_show(GTK_WIDGET (dialog));
1243 void NewPbEntry(PhonebookEntry *pbEntry)
1245 if (newEditEntryData.dialog == NULL)
1246 CreateEditDialog (&newEditEntryData, _("New entry"), OkNewEntryDialog);
1248 newEditEntryData.pbEntry = pbEntry;
1249 newEditEntryData.newGroup = 5;
1250 editNumbersData.pbEntry = pbEntry;
1252 gtk_entry_set_text (GTK_ENTRY (newEditEntryData.name), "");
1254 if (phoneMonitor.supported & PM_EXTPBK)
1255 gtk_label_set_text (GTK_LABEL (newEditEntryData.number), "");
1257 gtk_entry_set_text (GTK_ENTRY (newEditEntryData.number), "");
1259 if (pbEntry->entry.MemoryType == GMT_ME)
1260 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (newEditEntryData.memoryTypePhone), TRUE);
1262 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (newEditEntryData.memoryTypeSIM), TRUE);
1264 gtk_option_menu_set_history( GTK_OPTION_MENU (newEditEntryData.group),
1265 pbEntry->entry.Group);
1267 if (phoneMonitor.supported & PM_CALLERGROUP)
1269 gtk_widget_show (newEditEntryData.group);
1270 gtk_widget_show (newEditEntryData.groupLabel);
1274 gtk_widget_hide (newEditEntryData.group);
1275 gtk_widget_hide (newEditEntryData.groupLabel);
1278 if (memoryStatus.MaxME > 0)
1279 gtk_widget_show (GTK_WIDGET (newEditEntryData.memoryBox));
1281 gtk_widget_hide (GTK_WIDGET (newEditEntryData.memoryBox));
1283 gtk_widget_show(GTK_WIDGET (newEditEntryData.dialog));
1287 void DuplicatePbEntry (PhonebookEntry *pbEntry)
1289 if (duplicateEditEntryData.dialog == NULL)
1290 CreateEditDialog (&duplicateEditEntryData, _("Duplicate entry"), OkNewEntryDialog);
1292 duplicateEditEntryData.pbEntry = pbEntry;
1293 duplicateEditEntryData.newGroup = pbEntry->entry.Group;
1294 editNumbersData.pbEntry = pbEntry;
1296 gtk_entry_set_text (GTK_ENTRY (duplicateEditEntryData.name), pbEntry->entry.Name);
1298 if (phoneMonitor.supported & PM_EXTPBK)
1299 gtk_label_set_text (GTK_LABEL (duplicateEditEntryData.number), pbEntry->entry.Number);
1301 gtk_entry_set_text (GTK_ENTRY (duplicateEditEntryData.number), pbEntry->entry.Number);
1303 if (pbEntry->entry.MemoryType == GMT_ME)
1304 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (duplicateEditEntryData.memoryTypePhone), TRUE);
1306 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (duplicateEditEntryData.memoryTypeSIM), TRUE);
1308 gtk_option_menu_set_history( GTK_OPTION_MENU (duplicateEditEntryData.group),
1309 pbEntry->entry.Group);
1311 if (phoneMonitor.supported & PM_CALLERGROUP)
1313 gtk_widget_show (duplicateEditEntryData.group);
1314 gtk_widget_show (duplicateEditEntryData.groupLabel);
1318 gtk_widget_hide (duplicateEditEntryData.group);
1319 gtk_widget_hide (duplicateEditEntryData.groupLabel);
1322 if (memoryStatus.MaxME > 0)
1323 gtk_widget_show (GTK_WIDGET (duplicateEditEntryData.memoryBox));
1325 gtk_widget_hide (GTK_WIDGET (duplicateEditEntryData.memoryBox));
1327 gtk_widget_show(GTK_WIDGET (duplicateEditEntryData.dialog));
1331 static void EditEntry (void)
1333 if (contactsMemoryInitialized)
1335 if (GTK_CLIST (clist)->selection == NULL)
1338 EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist),
1339 GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data)),
1340 GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data));
1345 static void DuplicateEntry (void)
1347 PhonebookEntry *new, *old;
1349 if (contactsMemoryInitialized)
1351 if (GTK_CLIST (clist)->selection == NULL)
1354 old = (PhonebookEntry *) gtk_clist_get_row_data (GTK_CLIST (clist), GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data));
1356 if ( old->entry.MemoryType == GMT_ME)
1358 if ((new = FindFreeEntry (GMT_ME)) == NULL)
1359 if ((new = FindFreeEntry (GMT_SM)) == NULL)
1361 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
1362 gtk_widget_show (errorDialog.dialog);
1368 if ((new = FindFreeEntry(GMT_SM)) == NULL)
1369 if ((new = FindFreeEntry(GMT_ME)) == NULL)
1371 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
1372 gtk_widget_show (errorDialog.dialog);
1377 new->entry = old->entry;
1379 DuplicatePbEntry (new);
1384 static void NewEntry (void)
1386 PhonebookEntry *entry;
1388 if (contactsMemoryInitialized)
1390 if ((entry = FindFreeEntry (GMT_SM)) != NULL)
1392 else if ((entry = FindFreeEntry (GMT_ME)) != NULL)
1396 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
1397 gtk_widget_show (errorDialog.dialog);
1403 static inline void ClickEntry (GtkWidget *clist,
1406 GdkEventButton *event,
1409 if(event && event->type == GDK_2BUTTON_PRESS)
1410 EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row),
1415 static inline void DeleteEntry (void)
1417 if (contactsMemoryInitialized)
1419 if (GTK_CLIST (clist)->selection == NULL)
1427 static void ChMemType (void)
1429 static GtkWidget *dialog = NULL;
1430 GtkWidget *button, *hbox, *label;
1432 if (contactsMemoryInitialized)
1434 if (GTK_CLIST (clist)->selection == NULL)
1439 dialog = gtk_dialog_new ();
1440 gtk_window_set_title (GTK_WINDOW (dialog), _("Changing memory type"));
1441 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1442 gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
1443 gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
1444 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1445 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1447 button = gtk_button_new_with_label (_("Continue"));
1448 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1449 button, FALSE, FALSE, 0);
1450 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1451 GTK_SIGNAL_FUNC (OkChangeEntryDialog), (gpointer) dialog);
1452 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1453 gtk_widget_grab_default (button);
1454 gtk_widget_show (button);
1456 button = gtk_button_new_with_label (_("Cancel"));
1457 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1458 button, FALSE, FALSE, 0);
1459 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1460 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
1461 gtk_widget_show (button);
1463 hbox = gtk_hbox_new (FALSE, 0);
1464 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
1465 gtk_widget_show (hbox);
1467 label = gtk_label_new (_("If you change from phone memory to SIM memory\nsome entries may be truncated."));
1468 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 10);
1469 gtk_widget_show (label);
1472 gtk_widget_show (dialog);
1477 static void FindFirstEntry (void)
1479 static FindEntryData findEntryData = { NULL };
1480 GtkWidget *button, *label, *hbox;
1482 if (contactsMemoryInitialized)
1484 if (findEntryData.dialog == NULL)
1486 findEntryData.dialog = gtk_dialog_new ();
1487 gtk_window_set_title (GTK_WINDOW (findEntryData.dialog), _("Find"));
1488 gtk_window_set_modal (GTK_WINDOW (findEntryData.dialog), TRUE);
1489 gtk_container_set_border_width (GTK_CONTAINER (findEntryData.dialog), 10);
1490 gtk_signal_connect (GTK_OBJECT (findEntryData.dialog), "delete_event",
1491 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1493 button = gtk_button_new_with_label (_("Find"));
1494 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (findEntryData.dialog)->action_area),
1495 button, TRUE, TRUE, 10);
1496 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1497 GTK_SIGNAL_FUNC (OkFindEntryDialog), (gpointer) &findEntryData);
1498 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1499 gtk_widget_grab_default (button);
1500 gtk_widget_show (button);
1502 button = gtk_button_new_with_label (_("Cancel"));
1503 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (findEntryData.dialog)->action_area),
1504 button, TRUE, TRUE, 10);
1505 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1506 GTK_SIGNAL_FUNC (CancelEditDialog), (gpointer) &findEntryData);
1507 gtk_widget_show (button);
1509 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), 5);
1511 hbox = gtk_hbox_new (FALSE, 0);
1512 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), hbox);
1513 gtk_widget_show (hbox);
1515 label = gtk_label_new (_("Pattern:"));
1516 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
1517 gtk_widget_show (label);
1519 findEntryData.pattern = gtk_entry_new_with_max_length (max_phonebook_name_length);
1521 gtk_box_pack_end (GTK_BOX (hbox), findEntryData.pattern, FALSE, FALSE, 2);
1522 gtk_widget_show (findEntryData.pattern);
1524 hbox = gtk_hbox_new (FALSE, 0);
1525 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), hbox);
1526 gtk_widget_show (hbox);
1528 findEntryData.nameB = gtk_radio_button_new_with_label (NULL, _("Name"));
1529 gtk_box_pack_start (GTK_BOX (hbox), findEntryData.nameB, TRUE, FALSE, 2);
1530 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (findEntryData.nameB), TRUE);
1531 gtk_widget_show (findEntryData.nameB);
1533 findEntryData.numberB = gtk_radio_button_new_with_label (
1534 gtk_radio_button_group (GTK_RADIO_BUTTON (findEntryData.nameB)), _("Number"));
1535 gtk_box_pack_start (GTK_BOX(hbox), findEntryData.numberB, TRUE, FALSE, 2);
1536 gtk_widget_show (findEntryData.numberB);
1539 gtk_widget_show (findEntryData.dialog);
1544 static inline void SelectAll (void)
1546 gtk_clist_select_all (GTK_CLIST (clist));
1550 static inline void OkDialVoiceDialog (GtkWidget *w, gpointer data)
1553 gchar *buf = g_strdup (gtk_entry_get_text (GTK_ENTRY (((DialVoiceDialog *) data)->entry)));
1555 if (strlen (buf) > 0)
1557 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
1558 e->event = Event_DialVoice;
1560 GUI_InsertEvent (e);
1565 gtk_widget_hide (((DialVoiceDialog *) data)->dialog);
1569 static void DialVoice (void)
1571 static DialVoiceDialog dialVoiceDialog = {NULL, NULL};
1572 GtkWidget *button, *label;
1573 PhonebookEntry *pbEntry;
1575 if (dialVoiceDialog.dialog == NULL)
1577 dialVoiceDialog.dialog = gtk_dialog_new ();
1578 gtk_window_set_title (GTK_WINDOW (dialVoiceDialog.dialog), _("Dial voice"));
1579 gtk_window_set_modal(GTK_WINDOW (dialVoiceDialog.dialog), TRUE);
1580 gtk_container_set_border_width (GTK_CONTAINER (dialVoiceDialog.dialog), 10);
1581 gtk_signal_connect (GTK_OBJECT (dialVoiceDialog.dialog), "delete_event",
1582 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1584 button = gtk_button_new_with_label (_("Ok"));
1585 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->action_area),
1586 button, TRUE, TRUE, 10);
1587 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1588 GTK_SIGNAL_FUNC (OkDialVoiceDialog), (gpointer) &dialVoiceDialog);
1589 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1590 gtk_widget_grab_default (button);
1591 gtk_widget_show (button);
1593 button = gtk_button_new_with_label (_("Cancel"));
1594 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->action_area),
1595 button, TRUE, TRUE, 10);
1596 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1597 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialVoiceDialog.dialog);
1598 gtk_widget_show (button);
1600 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), 5);
1602 label = gtk_label_new (_("Number:"));
1603 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), label, FALSE, FALSE, 5);
1604 gtk_widget_show (label);
1606 dialVoiceDialog.entry = gtk_entry_new_with_max_length (GSM_MAX_PHONEBOOK_NUMBER_LENGTH);
1607 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), dialVoiceDialog.entry, FALSE, FALSE, 5);
1608 gtk_widget_show (dialVoiceDialog.entry);
1611 if (GTK_CLIST (clist)->selection != NULL)
1613 pbEntry = (PhonebookEntry *) gtk_clist_get_row_data (GTK_CLIST (clist),
1614 GPOINTER_TO_INT (GTK_CLIST (clist)->selection->data));
1616 gtk_entry_set_text (GTK_ENTRY (dialVoiceDialog.entry), pbEntry->entry.Number);
1619 gtk_widget_show (dialVoiceDialog.dialog);
1623 static gint CListCompareFunc (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
1625 static gchar phoneText[] = "B";
1626 static gchar simText[] = "A";
1631 GtkCListRow *row1 = (GtkCListRow *) ptr1;
1632 GtkCListRow *row2 = (GtkCListRow *) ptr2;
1634 switch (row1->cell[clist->sort_column].type)
1637 text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
1639 case GTK_CELL_PIXTEXT:
1640 text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text;
1645 switch (row2->cell[clist->sort_column].type)
1648 text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
1650 case GTK_CELL_PIXTEXT:
1651 text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text;
1657 if (clist->sort_column == 2)
1659 if (((PhonebookEntry *) row1->data)->entry.MemoryType == GMT_ME)
1663 if (((PhonebookEntry *) row2->data)->entry.MemoryType == GMT_ME)
1670 return (text1 != NULL);
1675 if ((ret = g_strcasecmp (text1, text2)) == 0)
1677 if (((PhonebookEntry *) row1->data)->entry.MemoryType < ((PhonebookEntry *) row2->data)->entry.MemoryType)
1679 else if (((PhonebookEntry *) row1->data)->entry.MemoryType > ((PhonebookEntry *) row2->data)->entry.MemoryType)
1687 static void CreateProgressDialog (gint maxME, gint maxSM)
1689 GtkWidget *vbox, *label;
1692 progressDialog.dialog = gtk_window_new (GTK_WINDOW_DIALOG);
1693 gtk_window_position (GTK_WINDOW (progressDialog.dialog), GTK_WIN_POS_MOUSE);
1694 gtk_window_set_modal (GTK_WINDOW (progressDialog.dialog), TRUE);
1695 gtk_signal_connect (GTK_OBJECT (progressDialog.dialog), "delete_event",
1696 GTK_SIGNAL_FUNC (ProgressDialogDeleteEvent), NULL);
1698 vbox = gtk_vbox_new (FALSE, 10);
1699 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1700 gtk_container_add (GTK_CONTAINER (progressDialog.dialog), vbox);
1702 gtk_widget_show (vbox);
1704 label = gtk_label_new (_("Phone memory..."));
1705 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
1707 gtk_widget_show (label);
1709 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, maxME, 0, 0, 0);
1710 progressDialog.pbarME = gtk_progress_bar_new_with_adjustment (adj);
1712 gtk_box_pack_start (GTK_BOX (vbox), progressDialog.pbarME, FALSE, FALSE, 0);
1713 gtk_widget_show (progressDialog.pbarME);
1715 label = gtk_label_new (_("SIM memory..."));
1716 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
1718 gtk_widget_show (label);
1720 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, maxSM, 0, 0, 0);
1721 progressDialog.pbarSM = gtk_progress_bar_new_with_adjustment (adj);
1723 gtk_box_pack_start (GTK_BOX (vbox), progressDialog.pbarSM, FALSE, FALSE, 0);
1724 gtk_widget_show (progressDialog.pbarSM);
1728 static void SaveContacts (void)
1731 PhonebookEntry *pbEntry;
1733 D_MemoryLocation *ml;
1735 if (progressDialog.dialog == NULL)
1737 CreateProgressDialog (memoryStatus.MaxME, memoryStatus.MaxSM);
1740 if (contactsMemoryInitialized && progressDialog.dialog)
1742 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), 0);
1743 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), 0);
1744 gtk_window_set_title (GTK_WINDOW (progressDialog.dialog), _("Saving entries"));
1745 gtk_widget_show_now (progressDialog.dialog);
1747 /* Save Phone memory */
1748 for(i = 0; i < memoryStatus.MaxME; i++)
1750 pbEntry = g_ptr_array_index(contactsMemory, i);
1752 g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
1753 pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
1754 (int) pbEntry->status);
1756 if (pbEntry->status == E_Changed || pbEntry->status == E_Deleted)
1758 if (pbEntry->status == E_Deleted)
1760 pbEntry->entry.Name[0] = '\0';
1761 pbEntry->entry.Number[0] = '\0';
1762 pbEntry->entry.Group = 5;
1765 pbEntry->entry.Location = i + 1;
1766 ml = (D_MemoryLocation *) g_malloc (sizeof (D_MemoryLocation));
1767 ml->entry = &(pbEntry->entry);
1768 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
1769 e->event = Event_WriteMemoryLocation;
1771 GUI_InsertEvent (e);
1772 pthread_mutex_lock (&memoryMutex);
1773 pthread_cond_wait (&memoryCond, &memoryMutex);
1774 pthread_mutex_unlock (&memoryMutex);
1776 if (ml->status != GE_NONE)
1778 g_print (_("%s: line: %d:Can't write ME memory entry number %d! Error: %d\n"),
1779 __FILE__, __LINE__, i + 1, ml->status);
1783 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), i + 1);
1787 /* Save SIM memory */
1788 for (i = memoryStatus.MaxME; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
1790 pbEntry = g_ptr_array_index (contactsMemory, i);
1793 g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
1794 pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
1795 (int) pbEntry->status);
1798 if (pbEntry->status == E_Changed || pbEntry->status == E_Deleted)
1800 if (pbEntry->status == E_Deleted)
1802 pbEntry->entry.Name[0] = '\0';
1803 pbEntry->entry.Number[0] = '\0';
1804 pbEntry->entry.Group = 5;
1807 pbEntry->entry.Location = i - memoryStatus.MaxME + 1;
1808 ml = (D_MemoryLocation *) g_malloc (sizeof (D_MemoryLocation));
1809 ml->entry = &(pbEntry->entry);
1810 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
1811 e->event = Event_WriteMemoryLocation;
1813 GUI_InsertEvent (e);
1814 pthread_mutex_lock (&memoryMutex);
1815 pthread_cond_wait (&memoryCond, &memoryMutex);
1816 pthread_mutex_unlock (&memoryMutex);
1818 if (ml->status != GE_NONE)
1820 g_print(_("%s: line %d:Can't write SM memory entry number %d! Error: %d\n"),
1821 __FILE__, __LINE__, i - memoryStatus.MaxME + 1, ml->status);
1825 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), i - memoryStatus.MaxME + 1);
1829 statusInfo.ch_ME = statusInfo.ch_SM = 0;
1830 RefreshStatusInfo ();
1831 gtk_widget_hide (progressDialog.dialog);
1836 static GtkWidget *CreateSaveQuestionDialog (GtkSignalFunc SaveFunc,
1837 GtkSignalFunc DontSaveFunc)
1840 GtkWidget *button, *label, *hbox, *pixmap;
1842 dialog = gtk_dialog_new ();
1843 gtk_window_set_title (GTK_WINDOW (dialog), _("Save changes?"));
1844 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1845 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
1846 gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
1847 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1848 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1850 button = gtk_button_new_with_label (_("Save"));
1851 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1852 button, TRUE, TRUE, 10);
1853 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1854 GTK_SIGNAL_FUNC (SaveFunc), (gpointer) dialog);
1855 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1856 gtk_widget_grab_default (button);
1857 gtk_widget_show (button);
1859 button = gtk_button_new_with_label (_("Don't save"));
1860 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1861 button, TRUE, TRUE, 10);
1862 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1863 GTK_SIGNAL_FUNC (DontSaveFunc), (gpointer) dialog);
1864 gtk_widget_show (button);
1866 button = gtk_button_new_with_label (_("Cancel"));
1867 gtk_box_pack_start(GTK_BOX (GTK_DIALOG (dialog)->action_area),
1868 button, TRUE, TRUE, 10);
1869 gtk_signal_connect(GTK_OBJECT (button), "clicked",
1870 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
1871 gtk_widget_show (button);
1873 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
1875 hbox = gtk_hbox_new (FALSE, 0);
1876 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
1877 gtk_widget_show (hbox);
1879 pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
1880 gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 10);
1881 gtk_widget_show (pixmap);
1883 label = gtk_label_new (_("You have made changes in your\ncontacts directory.\n\
1884 \n\nDo you want save these changes into phone?\n"));
1885 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
1886 gtk_widget_show (label);
1892 static void OkExtPbkDialog (GtkWidget *w, gpointer data) {
1894 ExtPbkDialog *d=(ExtPbkDialog*)data;
1895 SMS_NumberType numtype;
1899 if (w==d->gbutton) numtype=GSM_General;
1900 else if (w==d->mbutton) numtype=GSM_Mobile;
1901 else if (w==d->wbutton) numtype=GSM_Work;
1902 else if (w==d->fbutton) numtype=GSM_Fax;
1903 else if (w==d->hbutton) numtype=GSM_Home;
1904 else numtype=GSM_General;
1906 /* Search through subentries */
1908 for (i=0;i<d->pbEntry->entry.SubEntriesCount;i++) {
1909 if (d->pbEntry->entry.SubEntries[i].EntryType==GSM_Number)
1910 if (d->pbEntry->entry.SubEntries[i].NumberType==numtype)
1914 if (found>i) { /* Not found */
1915 found=d->pbEntry->entry.SubEntriesCount;
1916 d->pbEntry->entry.SubEntriesCount++;
1917 d->pbEntry->entry.SubEntries[found].EntryType=GSM_Number;
1918 d->pbEntry->entry.SubEntries[found].NumberType=numtype;
1921 chars=gtk_editable_get_chars(GTK_EDITABLE(d->entry),0,-1);
1922 strcpy(d->pbEntry->entry.SubEntries[found].data.Number,chars);
1925 /* Update the entry dialog */
1926 EditPbEntry(d->pbEntry,d->row);
1928 gtk_widget_hide (d->dialog);
1932 void ExtPbkChanged (GtkWidget *widget, gpointer data )
1934 static ExtPbkDialog dialog = {NULL,NULL,0,NULL,NULL,NULL,NULL,NULL};
1936 static GtkWidget *label;
1940 if (dialog.dialog==NULL) {
1942 dialog.dialog=gtk_dialog_new();
1944 gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Which Extended Phonebook Entry?"));
1945 gtk_window_set_modal(GTK_WINDOW (dialog.dialog), TRUE);
1946 gtk_container_set_border_width (GTK_CONTAINER (dialog.dialog), 10);
1947 gtk_signal_connect (GTK_OBJECT (dialog.dialog), "delete_event",
1948 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1950 dialog.gbutton = gtk_button_new_with_label (_("General"));
1951 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1952 dialog.gbutton, TRUE, TRUE, 10);
1953 gtk_signal_connect (GTK_OBJECT (dialog.gbutton), "clicked",
1954 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1955 gtk_widget_show (dialog.gbutton);
1956 dialog.mbutton = gtk_button_new_with_label (_("Mobile"));
1957 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1958 dialog.mbutton, TRUE, TRUE, 10);
1959 gtk_signal_connect (GTK_OBJECT (dialog.mbutton), "clicked",
1960 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1961 gtk_widget_show (dialog.mbutton);
1962 dialog.wbutton = gtk_button_new_with_label (_("Work"));
1963 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1964 dialog.wbutton, TRUE, TRUE, 10);
1965 gtk_signal_connect (GTK_OBJECT (dialog.wbutton), "clicked",
1966 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1967 gtk_widget_show (dialog.wbutton);
1968 dialog.fbutton = gtk_button_new_with_label (_("Fax"));
1969 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1970 dialog.fbutton, TRUE, TRUE, 10);
1971 gtk_signal_connect (GTK_OBJECT (dialog.fbutton), "clicked",
1972 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1973 gtk_widget_show (dialog.fbutton);
1974 dialog.hbutton = gtk_button_new_with_label (_("Home"));
1975 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1976 dialog.hbutton, TRUE, TRUE, 10);
1977 gtk_signal_connect (GTK_OBJECT (dialog.hbutton), "clicked",
1978 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1979 gtk_widget_show (dialog.hbutton);
1981 button = gtk_button_new_with_label (_("Cancel"));
1982 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->action_area),
1983 button, TRUE, TRUE, 10);
1984 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1985 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog.dialog);
1986 gtk_widget_show (button);
1988 label = gtk_label_new("");
1989 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox), label, FALSE, FALSE, 5);
1990 gtk_widget_show(label);
1993 chars=gtk_editable_get_chars(GTK_EDITABLE(widget),0,-1);
1994 gtk_label_set_text(GTK_LABEL(label),chars);
1996 dialog.pbEntry=((EditEntryData*)data)->pbEntry;
1997 dialog.row=((EditEntryData*)data)->row;
1998 dialog.entry=widget;
1999 gtk_widget_show(dialog.dialog);
2004 void GUI_RefreshContacts (void)
2006 PhonebookEntry *pbEntry;
2010 if (contactsMemoryInitialized == FALSE)
2013 gtk_clist_freeze (GTK_CLIST (clist));
2014 gtk_clist_clear (GTK_CLIST (clist));
2016 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2020 pbEntry = g_ptr_array_index (contactsMemory, i);
2021 if (pbEntry->status != E_Empty && pbEntry->status != E_Deleted)
2023 row[0] = pbEntry->entry.Name;
2025 row[1] = pbEntry->entry.Number;
2027 if (pbEntry->entry.MemoryType == GMT_ME)
2031 if (phoneMonitor.supported & PM_CALLERGROUP)
2032 row[3] = xgnokiiConfig.callerGroups[pbEntry->entry.Group];
2035 gtk_clist_append (GTK_CLIST (clist), row);
2036 if (pbEntry->entry.MemoryType == GMT_ME)
2037 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
2038 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
2040 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
2041 memoryPixmaps.simMemPix, memoryPixmaps.mask);
2043 gtk_clist_set_row_data (GTK_CLIST (clist), row_i++, (gpointer) pbEntry);
2046 g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
2047 pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
2048 (int) pbEntry->status);
2052 gtk_clist_sort (GTK_CLIST (clist));
2053 gtk_clist_thaw (GTK_CLIST (clist));
2057 static gint InsertPBEntryME (GSM_PhonebookEntry *entry)
2059 PhonebookEntry *pbEntry;
2061 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2063 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2064 g_ptr_array_free (contactsMemory, TRUE);
2065 gtk_widget_hide (progressDialog.dialog);
2069 pbEntry->entry = *entry;
2071 if (*pbEntry->entry.Name == '\0' && *pbEntry->entry.Number == '\0')
2072 pbEntry->status = E_Empty;
2074 pbEntry->status = E_Unchanged;
2076 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2077 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), entry->Location);
2084 static gint InsertPBEntrySM (GSM_PhonebookEntry *entry)
2086 PhonebookEntry *pbEntry;
2088 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2090 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2091 g_ptr_array_free (contactsMemory, TRUE);
2092 gtk_widget_hide (progressDialog.dialog);
2096 pbEntry->entry = *entry;
2098 if (*pbEntry->entry.Name == '\0' && *pbEntry->entry.Number == '\0')
2099 pbEntry->status = E_Empty;
2102 pbEntry->status = E_Unchanged;
2105 memoryStatus.UsedSM++;
2106 memoryStatus.FreeSM--;
2110 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2111 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), entry->Location);
2118 static inline gint ReadFailedPBEntry (gint i)
2120 g_ptr_array_free (contactsMemory, TRUE);
2121 gtk_widget_hide (progressDialog.dialog);
2126 static void ReadContactsMain (void)
2130 D_MemoryLocationAll *mla;
2131 PhonebookEntry *pbEntry;
2136 if (contactsMemoryInitialized == TRUE)
2138 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2140 pbEntry = g_ptr_array_index (contactsMemory, i);
2143 g_ptr_array_free (contactsMemory, TRUE);
2144 contactsMemory = NULL;
2145 gtk_clist_clear (GTK_CLIST (clist));
2146 contactsMemoryInitialized = FALSE;
2147 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
2148 memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
2149 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2150 RefreshStatusInfo ();
2153 ms = (D_MemoryStatus *) g_malloc (sizeof (D_MemoryStatus));
2154 ms->memoryStatus.MemoryType = GMT_ME;
2155 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2156 e->event = Event_GetMemoryStatus;
2158 GUI_InsertEvent (e);
2159 pthread_mutex_lock (&memoryMutex);
2160 pthread_cond_wait (&memoryCond, &memoryMutex);
2161 pthread_mutex_unlock (&memoryMutex);
2163 if (ms->status != GE_NONE)
2164 /* Phone don't support ME (5110) */
2165 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME = 0;
2168 memoryStatus.MaxME = ms->memoryStatus.Used + ms->memoryStatus.Free;
2169 memoryStatus.UsedME = ms->memoryStatus.Used;
2170 memoryStatus.FreeME = ms->memoryStatus.Free;
2173 ms->memoryStatus.MemoryType = GMT_SM;
2174 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2175 e->event = Event_GetMemoryStatus;
2177 GUI_InsertEvent (e);
2178 pthread_mutex_lock (&memoryMutex);
2179 pthread_cond_wait (&memoryCond, &memoryMutex);
2180 pthread_mutex_unlock (&memoryMutex);
2182 if (ms->status != GE_NONE)
2184 fbus3810 = TRUE; /* I try to recognize memoryStatus.UsedSM while reading */
2185 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't get SM memory status!\n\n\
2186 Setting max SIM entries to 100!\n"));
2187 memoryStatus.MaxSM = memoryStatus.FreeSM = 100;
2188 memoryStatus.UsedSM = 0;
2189 gtk_widget_show (errorDialog.dialog);
2193 memoryStatus.MaxSM = ms->memoryStatus.Used + ms->memoryStatus.Free;
2194 memoryStatus.UsedSM = ms->memoryStatus.Used;
2195 memoryStatus.FreeSM = ms->memoryStatus.Free;
2199 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2201 RefreshStatusInfo ();
2203 if (progressDialog.dialog == NULL)
2205 CreateProgressDialog (memoryStatus.MaxME, memoryStatus.MaxSM);
2208 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), 0);
2209 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), 0);
2210 gtk_window_set_title (GTK_WINDOW (progressDialog.dialog), _("Getting entries"));
2211 gtk_widget_show_now (progressDialog.dialog);
2213 contactsMemory = g_ptr_array_new ();
2215 mla = (D_MemoryLocationAll *) g_malloc (sizeof (D_MemoryLocationAll));
2216 if (memoryStatus.MaxME > 0)
2219 mla->max = memoryStatus.MaxME;
2221 mla->InsertEntry = InsertPBEntryME;
2222 mla->ReadFailed = ReadFailedPBEntry;
2224 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2225 e->event = Event_GetMemoryLocationAll;
2227 GUI_InsertEvent (e);
2228 pthread_mutex_lock (&memoryMutex);
2229 pthread_cond_wait (&memoryCond, &memoryMutex);
2230 pthread_mutex_unlock (&memoryMutex);
2232 if (mla->status != GE_NONE)
2235 gtk_widget_hide (progressDialog.dialog);
2241 mla->max = memoryStatus.MaxSM;
2243 mla->InsertEntry = InsertPBEntrySM;
2244 mla->ReadFailed = ReadFailedPBEntry;
2246 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2247 e->event = Event_GetMemoryLocationAll;
2249 GUI_InsertEvent (e);
2250 pthread_mutex_lock (&memoryMutex);
2251 pthread_cond_wait (&memoryCond, &memoryMutex);
2252 pthread_mutex_unlock (&memoryMutex);
2254 if (mla->status != GE_NONE)
2257 gtk_widget_hide (progressDialog.dialog);
2263 gtk_widget_hide (progressDialog.dialog);
2265 contactsMemoryInitialized = TRUE;
2266 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2267 GUIEventSend (GUI_EVENT_CONTACTS_CHANGED);
2268 GUIEventSend (GUI_EVENT_SMS_NUMBER_CHANGED);
2272 static void ReadSaveCallback (GtkWidget *widget, gpointer data)
2274 gtk_widget_hide (GTK_WIDGET (data));
2276 ReadContactsMain ();
2280 static void ReadDontSaveCallback (GtkWidget *widget, gpointer data)
2282 gtk_widget_hide (GTK_WIDGET (data));
2283 ReadContactsMain ();
2287 static void ReadSaveContacts (void)
2289 static GtkWidget *dialog = NULL;
2292 dialog = CreateSaveQuestionDialog (ReadSaveCallback, ReadDontSaveCallback);
2294 gtk_widget_show (dialog);
2298 static void ReadContacts (void)
2300 if (contactsMemoryInitialized == TRUE && (statusInfo.ch_ME || statusInfo.ch_SM))
2301 ReadSaveContacts ();
2303 ReadContactsMain ();
2307 inline void GUI_ReadContacts (void)
2313 inline void GUI_SaveContacts (void)
2319 inline void GUI_ShowContacts (void)
2321 if (xgnokiiConfig.callerGroups[0] == NULL)
2324 GUI_InitCallerGroupsInf ();
2326 gtk_clist_set_column_visibility (GTK_CLIST (clist), 3, phoneMonitor.supported & PM_CALLERGROUP);
2327 GUI_RefreshContacts ();
2328 gtk_widget_show (GUI_ContactsWindow);
2329 // if (!contactsMemoryInitialized)
2333 static void ExportVCARD (FILE *f)
2337 PhonebookEntry *pbEntry;
2339 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2341 pbEntry = g_ptr_array_index (contactsMemory, i);
2343 if (pbEntry->status == E_Deleted || pbEntry->status == E_Empty)
2346 fprintf (f, "BEGIN:VCARD\n");
2347 fprintf (f, "VERSION:3.0\n");
2348 fprintf (f, "FN:%s\n", pbEntry->entry.Name);
2349 fprintf (f, "TEL;PREF:%s\n", pbEntry->entry.Number);
2351 if (pbEntry->entry.MemoryType == GMT_ME)
2352 sprintf (buf2, "ME%d", i + 1);
2354 sprintf (buf2, "SM%d", i - memoryStatus.MaxME + 1);
2356 fprintf (f, "X_GSM_STORE_AT:%s\n", buf2);
2357 fprintf (f, "X_GSM_CALLERGROUP:%d\n", pbEntry->entry.Group);
2359 /* Add ext. pbk info if required */
2360 if (phoneMonitor.supported & PM_EXTPBK)
2361 for (j = 0; j < pbEntry->entry.SubEntriesCount; j++)
2363 if (pbEntry->entry.SubEntries[j].EntryType == GSM_Number)
2364 fprintf (f, "TEL;UNKNOWN_%d:%s\n", pbEntry->entry.SubEntries[j].NumberType,
2365 pbEntry->entry.SubEntries[j].data.Number);
2368 fprintf (f, "END:VCARD\n\n");
2375 static void ExportNative (FILE *f)
2377 gchar buf[IO_BUF_LEN], buf2[10];
2379 PhonebookEntry *pbEntry;
2382 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2384 pbEntry = g_ptr_array_index (contactsMemory, i);
2386 if (pbEntry->status != E_Deleted && pbEntry->status != E_Empty)
2388 if (index (pbEntry->entry.Name, ';') != NULL)
2391 strcat (buf, pbEntry->entry.Name);
2392 strcat (buf, "\";");
2396 strcpy (buf, pbEntry->entry.Name);
2400 if (index (pbEntry->entry.Number, ';') != NULL)
2403 strcat (buf, pbEntry->entry.Number);
2404 strcat (buf, "\";");
2408 strcat (buf, pbEntry->entry.Number);
2412 if (pbEntry->entry.MemoryType == GMT_ME)
2413 sprintf (buf2, "B;%d;%d;", i + 1, pbEntry->entry.Group);
2415 sprintf (buf2, "A;%d;%d;", i - memoryStatus.MaxME + 1, pbEntry->entry.Group);
2418 /* Add ext. pbk info if required */
2419 if (phoneMonitor.supported & PM_EXTPBK)
2421 for (j = 0; j < pbEntry->entry.SubEntriesCount; j++)
2422 if (pbEntry->entry.SubEntries[j].EntryType==GSM_Number)
2424 sprintf(buf2,"%d;",pbEntry->entry.SubEntries[j].NumberType);
2427 if (index (pbEntry->entry.SubEntries[j].data.Number, ';') != NULL)
2430 strcat (buf, pbEntry->entry.SubEntries[j].data.Number);
2431 strcat (buf, "\";");
2435 strcat (buf, pbEntry->entry.SubEntries[j].data.Number);
2440 fprintf (f, "%s\n", buf);
2448 static void ExportContactsMain (gchar *name)
2451 gchar buf[IO_BUF_LEN];
2453 if ((f = fopen (name, "w")) == NULL)
2455 g_snprintf (buf, IO_BUF_LEN, _("Can't open file %s for writing!"), name);
2456 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
2457 gtk_widget_show (errorDialog.dialog);
2461 if (strstr (name, ".vcard") || strstr (name, ".gcrd"))
2468 static void YesExportDialog (GtkWidget *w, gpointer data)
2470 gtk_widget_hide (GTK_WIDGET (data));
2471 ExportContactsMain (exportDialogData.fileName);
2475 static void OkExportDialog (GtkWidget *w, GtkFileSelection *fs)
2477 static YesNoDialog dialog = { NULL, NULL};
2481 exportDialogData.fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
2482 gtk_widget_hide (GTK_WIDGET (fs));
2484 if ((f = fopen (exportDialogData.fileName, "r")) != NULL)
2487 if (dialog.dialog == NULL)
2489 CreateYesNoDialog (&dialog, YesExportDialog, CancelDialog, GUI_ContactsWindow);
2490 gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
2491 g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), exportDialogData.fileName);
2492 gtk_label_set_text (GTK_LABEL(dialog.text), err);
2494 gtk_widget_show (dialog.dialog);
2497 ExportContactsMain (exportDialogData.fileName);
2501 static void ExportContacts (void)
2503 static GtkWidget *fileDialog = NULL;
2505 if (contactsMemoryInitialized)
2507 if (fileDialog == NULL)
2509 fileDialog = gtk_file_selection_new (_("Export"));
2510 gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
2511 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
2512 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
2513 "clicked", GTK_SIGNAL_FUNC (OkExportDialog), (gpointer) fileDialog);
2514 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
2515 "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
2518 gtk_widget_show (fileDialog);
2523 static bool ParseLine (GSM_PhonebookEntry *entry, gint *num, gchar *buf)
2525 register gint i = 0;
2530 entry->Empty = FALSE;
2531 entry->SubEntriesCount=0;
2537 while (i < len && i <= GSM_MAX_PHONEBOOK_NAME_LENGTH && buf[i] != '"')
2539 entry->Name[i - 1] = buf[i];
2542 entry->Name[i - 1] = '\0';
2545 if (buf[++i] != ';')
2550 while (i < len && i < GSM_MAX_PHONEBOOK_NAME_LENGTH && buf[i] != ';')
2552 entry->Name[i] = buf[i];
2555 entry->Name[i] = '\0';
2568 while (i < len && i <= GSM_MAX_PHONEBOOK_NUMBER_LENGTH && buf[i] != '"')
2570 entry->Number[i - 1] = buf[i];
2573 entry->Number[i - 1] = '\0';
2576 if (buf[++i] != ';')
2581 while (i < len && i < GSM_MAX_PHONEBOOK_NUMBER_LENGTH && buf[i] != ';')
2583 entry->Number[i] = buf[i];
2586 entry->Number[i] = '\0';
2595 if (!strncmp(buf, "B;", 2))
2597 entry->MemoryType = GMT_ME;
2601 if (!strncmp(buf, "A;", 2))
2603 entry->MemoryType = GMT_SM;
2607 if (!strncmp(buf, "ME;", 3))
2609 entry->MemoryType = GMT_ME;
2613 if (!strncmp(buf, "SM;", 3))
2615 entry->MemoryType = GMT_SM;
2622 while (i < len && i < 4 && buf[i] != ';')
2635 *num = strtol (s_num, &endptr, 10);
2636 if (s_num == endptr)
2638 if (*num == LONG_MIN || *num == LONG_MAX)
2642 if ( *buf == '\n' || *buf == '\r') /* for compatibility with NCDS */
2647 while (i < len && i < 4 && buf[i] != ';')
2658 entry->Group = strtol (s_num, &endptr, 10);
2659 if (s_num == endptr)
2661 if (entry->Group == LONG_MIN || entry->Group == LONG_MAX)
2663 if (entry->Group < 0 || entry->Group > 5)
2669 /* Ext Pbk Support */
2673 entry->SubEntries[entry->SubEntriesCount].EntryType=GSM_Number;
2675 while (i < len && i < 4 && buf[i] != ';')
2685 entry->SubEntries[entry->SubEntriesCount].NumberType=(SMS_NumberType)strtol (s_num, &endptr, 10);
2686 if (s_num == endptr)
2691 while (i < len && i < GSM_MAX_PHONEBOOK_TEXT_LENGTH && buf[i] != ';')
2693 entry->SubEntries[entry->SubEntriesCount].data.Number[i] = buf[i];
2696 entry->SubEntries[entry->SubEntriesCount].data.Number[i] = '\0';
2701 entry->SubEntriesCount++;
2709 static void OkImportDialog (GtkWidget *w, GtkFileSelection *fs)
2714 PhonebookEntry *pbEntry;
2715 GSM_PhonebookEntry gsmEntry;
2716 gchar buf[IO_BUF_LEN];
2720 fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
2721 gtk_widget_hide (GTK_WIDGET (fs));
2723 if ((f = fopen (fileName, "r")) == NULL)
2725 g_snprintf (buf, IO_BUF_LEN, _("Can't open file %s for reading!"), fileName);
2726 gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
2727 gtk_widget_show (errorDialog.dialog);
2731 if (contactsMemoryInitialized == TRUE)
2733 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2735 pbEntry = g_ptr_array_index(contactsMemory, i);
2738 g_ptr_array_free (contactsMemory, TRUE);
2739 contactsMemory = NULL;
2740 gtk_clist_clear (GTK_CLIST (clist));
2741 contactsMemoryInitialized = FALSE;
2742 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
2743 memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
2744 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2745 RefreshStatusInfo ();
2748 ms = (D_MemoryStatus *) g_malloc (sizeof (D_MemoryStatus));
2749 ms->memoryStatus.MemoryType = GMT_ME;
2750 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2751 e->event = Event_GetMemoryStatus;
2753 GUI_InsertEvent (e);
2754 pthread_mutex_lock (&memoryMutex);
2755 pthread_cond_wait (&memoryCond, &memoryMutex);
2756 pthread_mutex_unlock (&memoryMutex);
2758 if (ms->status != GE_NONE)
2759 /* Phone don't support ME (5110) */
2760 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME = 0;
2763 memoryStatus.MaxME = ms->memoryStatus.Used + ms->memoryStatus.Free;
2764 memoryStatus.UsedME = 0;
2765 memoryStatus.FreeME = memoryStatus.MaxME;
2768 ms->memoryStatus.MemoryType = GMT_SM;
2769 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2770 e->event = Event_GetMemoryStatus;
2772 GUI_InsertEvent (e);
2773 pthread_mutex_lock (&memoryMutex);
2774 pthread_cond_wait (&memoryCond, &memoryMutex);
2775 pthread_mutex_unlock (&memoryMutex);
2777 if (ms->status != GE_NONE)
2779 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't get SM memory status!\n\n\
2780 Setting max SIM entries set to 100!\n"));
2781 memoryStatus.MaxSM = memoryStatus.FreeSM = 100;
2782 memoryStatus.UsedSM = 0;
2783 gtk_widget_show (errorDialog.dialog);
2787 memoryStatus.MaxSM = ms->memoryStatus.Used + ms->memoryStatus.Free;
2788 memoryStatus.UsedSM = 0;
2789 memoryStatus.FreeSM = memoryStatus.MaxSM;
2793 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2795 RefreshStatusInfo ();
2797 contactsMemory = g_ptr_array_new ();
2799 for (i = 1; i <= memoryStatus.MaxME; i++)
2801 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2804 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2805 g_ptr_array_free (contactsMemory, TRUE);
2809 pbEntry->entry.Empty = FALSE;
2810 pbEntry->entry.Name[0] = '\0';
2811 pbEntry->entry.Number[0] = '\0';
2812 pbEntry->entry.MemoryType = GMT_ME;
2813 pbEntry->entry.Group = 5;
2814 pbEntry->status = E_Deleted; /* I must set status to E_Deleted, since I */
2815 /* I want clear empty entries when saving to */
2817 pbEntry->entry.SubEntriesCount=0;
2819 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2823 for (i = 1; i <= memoryStatus.MaxSM; i++)
2825 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2828 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2829 g_ptr_array_free (contactsMemory, TRUE);
2833 pbEntry->entry.Empty = FALSE;
2834 pbEntry->entry.Name[0] = '\0';
2835 pbEntry->entry.Number[0] = '\0';
2836 pbEntry->entry.MemoryType = GMT_SM;
2837 pbEntry->entry.Group = 5;
2838 pbEntry->status = E_Deleted;
2839 pbEntry->entry.SubEntriesCount=0;
2841 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2846 while (fgets (buf, IO_BUF_LEN, f))
2848 if (ParseLine (&gsmEntry, &i, buf))
2850 if (gsmEntry.MemoryType == GMT_ME && memoryStatus.FreeME > 0
2851 && i > 0 && i <= memoryStatus.MaxME)
2853 pbEntry = g_ptr_array_index (contactsMemory, i - 1);
2855 if (pbEntry->status == E_Deleted)
2857 pbEntry->entry = gsmEntry;
2858 pbEntry->status = E_Changed;
2859 memoryStatus.UsedME++;
2860 memoryStatus.FreeME--;
2861 statusInfo.ch_ME = 1;
2864 else if (gsmEntry.MemoryType == GMT_SM && memoryStatus.FreeSM > 0
2865 && i > 0 && i <= memoryStatus.MaxSM)
2867 pbEntry = g_ptr_array_index (contactsMemory, memoryStatus.MaxME + i - 1);
2869 if (pbEntry->status == E_Deleted)
2871 pbEntry->entry = gsmEntry;
2872 pbEntry->status = E_Changed;
2873 memoryStatus.UsedSM++;
2874 memoryStatus.FreeSM--;
2875 statusInfo.ch_SM = 1;
2881 contactsMemoryInitialized = TRUE;
2882 RefreshStatusInfo ();
2883 GUIEventSend (GUI_EVENT_CONTACTS_CHANGED);
2884 GUIEventSend (GUI_EVENT_SMS_NUMBER_CHANGED);
2888 static void ImportContactsFileDialog ()
2890 static GtkWidget *fileDialog = NULL;
2892 if (fileDialog == NULL)
2894 fileDialog = gtk_file_selection_new (_("Import"));
2895 gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
2896 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
2897 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
2898 "clicked", GTK_SIGNAL_FUNC (OkImportDialog), (gpointer) fileDialog);
2899 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
2900 "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
2903 gtk_widget_show (fileDialog);
2907 static void ImportSaveCallback (GtkWidget *widget, gpointer data)
2909 gtk_widget_hide (GTK_WIDGET (data));
2911 ImportContactsFileDialog ();
2915 static void ImportDontSaveCallback (GtkWidget *widget, gpointer data)
2917 gtk_widget_hide (GTK_WIDGET (data));
2918 ImportContactsFileDialog ();
2922 void static ImportSaveContacts (void)
2924 static GtkWidget *dialog = NULL;
2927 dialog = CreateSaveQuestionDialog (ImportSaveCallback, ImportDontSaveCallback);
2929 gtk_widget_show (dialog);
2933 static void ImportContacts (void)
2935 if (contactsMemoryInitialized == TRUE && (statusInfo.ch_ME || statusInfo.ch_SM))
2936 ImportSaveContacts ();
2938 ImportContactsFileDialog ();
2942 static void QuitSaveCallback (GtkWidget *widget, gpointer data)
2946 gtk_widget_hide (GTK_WIDGET (data));
2948 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2949 e->event = Event_Exit;
2951 GUI_InsertEvent (e);
2952 pthread_join (monitor_th, NULL);
2957 static void QuitDontSaveCallback (GtkWidget *widget, gpointer data)
2961 gtk_widget_hide (GTK_WIDGET (data));
2962 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2963 e->event = Event_Exit;
2965 GUI_InsertEvent (e);
2966 pthread_join (monitor_th, NULL);
2971 void GUI_QuitSaveContacts (void)
2973 static GtkWidget *dialog = NULL;
2976 dialog = CreateSaveQuestionDialog (QuitSaveCallback, QuitDontSaveCallback);
2978 gtk_widget_show (dialog);
2982 /* Function take number and return name belonged to number.
2983 If no name is found, return NULL;
2984 Do not modify returned name!
2986 gchar *GUI_GetName (gchar *number)
2988 PhonebookEntry *pbEntry;
2991 if (contactsMemoryInitialized == FALSE || number == NULL)
2992 return (gchar *)NULL;
2994 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2996 pbEntry = g_ptr_array_index (contactsMemory, i);
2998 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3001 if (strcmp (pbEntry->entry.Number, number) == 0)
3002 return pbEntry->entry.Name;
3005 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3007 pbEntry = g_ptr_array_index (contactsMemory, i);
3009 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3012 if (strrncmp (pbEntry->entry.Number, number, 9) == 0)
3013 return pbEntry->entry.Name;
3020 gchar *GUI_GetNameExact (gchar *number)
3022 PhonebookEntry *pbEntry;
3025 if (contactsMemoryInitialized == FALSE || number == NULL)
3026 return (gchar *)NULL;
3028 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3030 pbEntry = g_ptr_array_index (contactsMemory, i);
3032 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3035 if (strcmp (pbEntry->entry.Number, number) == 0)
3036 return pbEntry->entry.Name;
3043 gchar *GUI_GetNumber (gchar *name)
3045 PhonebookEntry *pbEntry;
3048 if (contactsMemoryInitialized == FALSE || name == NULL || *name == '\0')
3049 return (gchar *)NULL;
3051 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3053 pbEntry = g_ptr_array_index (contactsMemory, i);
3055 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3058 if (strcmp (pbEntry->entry.Name, name) == 0)
3059 return pbEntry->entry.Number;
3066 static void SelectDialogClickEntry (GtkWidget *clist,
3069 GdkEventButton *event,
3070 SelectContactData *data )
3072 if(event && event->type == GDK_2BUTTON_PRESS)
3073 gtk_signal_emit_by_name(GTK_OBJECT (data->okButton), "clicked");
3077 SelectContactData *GUI_SelectContactDialog (void)
3079 PhonebookEntry *pbEntry;
3080 static SelectContactData selectContactData;
3081 SortColumn *sColumn;
3082 gchar *titles[4] = { "Name", "Number", "Memory", "Group"};
3087 if (contactsMemoryInitialized == FALSE)
3090 selectContactData.dialog = gtk_dialog_new ();
3091 gtk_widget_set_usize (GTK_WIDGET (selectContactData.dialog), 436, 200);
3092 gtk_window_set_title (GTK_WINDOW (selectContactData.dialog), _("Select contacts"));
3093 gtk_window_set_modal (GTK_WINDOW (selectContactData.dialog), TRUE);
3095 selectContactData.okButton = gtk_button_new_with_label (_("Ok"));
3096 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->action_area),
3097 selectContactData.okButton, TRUE, TRUE, 10);
3098 GTK_WIDGET_SET_FLAGS (selectContactData.okButton, GTK_CAN_DEFAULT);
3099 gtk_widget_grab_default (selectContactData.okButton);
3100 gtk_widget_show (selectContactData.okButton);
3102 selectContactData.cancelButton = gtk_button_new_with_label (_("Cancel"));
3103 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->action_area),
3104 selectContactData.cancelButton, TRUE, TRUE, 10);
3105 gtk_widget_show (selectContactData.cancelButton);
3107 selectContactData.clist = gtk_clist_new_with_titles (4, titles);
3108 gtk_clist_set_shadow_type (GTK_CLIST (selectContactData.clist), GTK_SHADOW_OUT);
3109 gtk_clist_set_compare_func (GTK_CLIST (selectContactData.clist), CListCompareFunc);
3110 gtk_clist_set_sort_column (GTK_CLIST (selectContactData.clist), 0);
3111 gtk_clist_set_sort_type (GTK_CLIST (selectContactData.clist), GTK_SORT_ASCENDING);
3112 gtk_clist_set_auto_sort (GTK_CLIST (selectContactData.clist), FALSE);
3113 gtk_clist_set_selection_mode (GTK_CLIST (selectContactData.clist), GTK_SELECTION_EXTENDED);
3115 gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 0, 150);
3116 gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 1, 115);
3117 gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 3, 70);
3118 gtk_clist_set_column_justification (GTK_CLIST(selectContactData.clist), 2, GTK_JUSTIFY_CENTER);
3119 gtk_clist_set_column_visibility (GTK_CLIST(selectContactData.clist), 3, phoneMonitor.supported & PM_CALLERGROUP);
3121 for (i = 0; i < 4; i++)
3123 if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
3125 g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
3128 sColumn->clist = selectContactData.clist;
3129 sColumn->column = i;
3130 gtk_signal_connect (GTK_OBJECT (GTK_CLIST (selectContactData.clist)->column[i].button), "clicked",
3131 GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
3134 gtk_signal_connect (GTK_OBJECT (selectContactData.clist), "select_row",
3135 GTK_SIGNAL_FUNC (SelectDialogClickEntry),
3136 (gpointer) &selectContactData);
3138 selectContactData.clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
3139 gtk_container_add (GTK_CONTAINER (selectContactData.clistScrolledWindow),
3140 selectContactData.clist);
3141 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selectContactData.clistScrolledWindow),
3142 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3143 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->vbox),
3144 selectContactData.clistScrolledWindow,
3147 gtk_widget_show (selectContactData.clist);
3148 gtk_widget_show (selectContactData.clistScrolledWindow);
3150 if (xgnokiiConfig.callerGroups[0] == NULL)
3151 GUI_InitCallerGroupsInf ();
3153 gtk_clist_freeze (GTK_CLIST (selectContactData.clist));
3154 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3158 pbEntry = g_ptr_array_index (contactsMemory, i);
3159 if (pbEntry->status != E_Empty && pbEntry->status != E_Deleted)
3161 row[0] = pbEntry->entry.Name;
3163 if (pbEntry->entry.SubEntriesCount>0) {
3164 snprintf(string,100,"%s *",pbEntry->entry.Number);
3166 } else row[1] = pbEntry->entry.Number;
3169 if (pbEntry->entry.MemoryType == GMT_ME)
3173 if (phoneMonitor.supported & PM_CALLERGROUP)
3174 row[3] = xgnokiiConfig.callerGroups[pbEntry->entry.Group];
3177 gtk_clist_append (GTK_CLIST (selectContactData.clist), row);
3178 if (pbEntry->entry.MemoryType == GMT_ME)
3179 gtk_clist_set_pixmap (GTK_CLIST (selectContactData.clist), row_i, 2,
3180 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
3182 gtk_clist_set_pixmap (GTK_CLIST (selectContactData.clist), row_i, 2,
3183 memoryPixmaps.simMemPix, memoryPixmaps.mask);
3185 gtk_clist_set_row_data (GTK_CLIST (selectContactData.clist), row_i++, (gpointer) pbEntry);
3189 gtk_clist_sort (GTK_CLIST (selectContactData.clist));
3190 gtk_clist_thaw (GTK_CLIST (selectContactData.clist));
3192 gtk_widget_show (selectContactData.dialog);
3194 return &selectContactData;
3198 static GtkItemFactoryEntry menu_items[] = {
3199 { NULL, NULL, NULL, 0, "<Branch>"},
3200 { NULL, "<control>R", ReadContacts, 0, NULL},
3201 { NULL, "<control>S", SaveContacts, 0, NULL},
3202 { NULL, NULL, NULL, 0, "<Separator>"},
3203 { NULL, "<control>I", ImportContacts, 0, NULL},
3204 { NULL, "<control>E", ExportContacts, 0, NULL},
3205 { NULL, NULL, NULL, 0, "<Separator>"},
3206 { NULL, "<control>W", CloseContacts, 0, NULL},
3207 { NULL, NULL, NULL, 0, "<Branch>"},
3208 { NULL, "<control>N", NewEntry, 0, NULL},
3209 { NULL, "<control>U", DuplicateEntry, 0, NULL},
3210 { NULL, NULL, EditEntry, 0, NULL},
3211 { NULL, "<control>D", DeleteEntry, 0, NULL},
3212 { NULL, NULL, NULL, 0, "<Separator>"},
3213 { NULL, "<control>C", ChMemType, 0, NULL},
3214 { NULL, NULL, NULL, 0, "<Separator>"},
3215 { NULL, "<control>F", FindFirstEntry, 0, NULL},
3216 { NULL, "<control>L", SearchEntry, 0, NULL},
3217 { NULL, NULL, NULL, 0, "<Separator>"},
3218 { NULL, "<control>A", SelectAll, 0, NULL},
3219 { NULL, NULL, NULL, 0, "<Branch>"},
3220 { NULL, "<control>V", DialVoice, 0, NULL},
3221 { NULL, NULL, NULL, 0, "<LastBranch>"},
3222 { NULL, NULL, Help1, 0, NULL},
3223 { NULL, NULL, GUI_ShowAbout, 0, NULL},
3227 static void InitMainMenu (void)
3229 menu_items[0].path = g_strdup (_("/_File"));
3230 menu_items[1].path = g_strdup (_("/File/_Read from phone"));
3231 menu_items[2].path = g_strdup (_("/File/_Save to phone"));
3232 menu_items[3].path = g_strdup (_("/File/Sep1"));
3233 menu_items[4].path = g_strdup (_("/File/_Import from file"));
3234 menu_items[5].path = g_strdup (_("/File/_Export to file"));
3235 menu_items[6].path = g_strdup (_("/File/Sep2"));
3236 menu_items[7].path = g_strdup (_("/File/_Close"));
3237 menu_items[8].path = g_strdup (_("/_Edit"));
3238 menu_items[9].path = g_strdup (_("/Edit/_New"));
3239 menu_items[10].path = g_strdup (_("/Edit/D_uplicate"));
3240 menu_items[11].path = g_strdup (_("/Edit/_Edit"));
3241 menu_items[12].path = g_strdup (_("/Edit/_Delete"));
3242 menu_items[13].path = g_strdup (_("/Edit/Sep3"));
3243 menu_items[14].path = g_strdup (_("/Edit/_Change memory type"));
3244 menu_items[15].path = g_strdup (_("/Edit/Sep4"));
3245 menu_items[16].path = g_strdup (_("/Edit/_Find"));
3246 menu_items[17].path = g_strdup (_("/Edit/Find ne_xt"));
3247 menu_items[18].path = g_strdup (_("/Edit/Sep5"));
3248 menu_items[19].path = g_strdup (_("/Edit/Select _all"));
3249 menu_items[20].path = g_strdup (_("/_Dial"));
3250 menu_items[21].path = g_strdup (_("/Dial/Dial _voice"));
3251 menu_items[22].path = g_strdup (_("/_Help"));
3252 menu_items[23].path = g_strdup (_("/Help/_Help"));
3253 menu_items[24].path = g_strdup (_("/Help/_About"));
3257 void GUI_CreateContactsWindow (void)
3259 int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
3260 GtkItemFactory *item_factory;
3261 GtkAccelGroup *accel_group;
3262 SortColumn *sColumn;
3264 GtkWidget *main_vbox;
3266 GtkWidget *clistScrolledWindow;
3267 GtkWidget *status_hbox;
3269 gchar *titles[4] = { _("Name"), _("Number"), _("Memory"), _("Group")};
3272 contactsMemoryInitialized = FALSE;
3273 GUI_ContactsWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3274 gtk_window_set_wmclass (GTK_WINDOW (GUI_ContactsWindow), "ContactsWindow", "Xgnokii");
3275 gtk_window_set_title (GTK_WINDOW (GUI_ContactsWindow), _("Contacts"));
3276 gtk_widget_set_usize (GTK_WIDGET (GUI_ContactsWindow), 436, 220);
3277 //gtk_container_set_border_width (GTK_CONTAINER (GUI_ContactsWindow), 10);
3278 gtk_signal_connect (GTK_OBJECT (GUI_ContactsWindow), "delete_event",
3279 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
3280 gtk_widget_realize (GUI_ContactsWindow);
3282 accel_group = gtk_accel_group_new ();
3283 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
3286 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
3288 gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_ContactsWindow));
3290 /* Finally, return the actual menu bar created by the item factory. */
3291 menubar = gtk_item_factory_get_widget (item_factory, "<main>");
3293 main_vbox = gtk_vbox_new (FALSE, 1);
3294 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
3295 gtk_container_add (GTK_CONTAINER (GUI_ContactsWindow), main_vbox);
3296 gtk_widget_show (main_vbox);
3298 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
3299 gtk_widget_show (menubar);
3301 /* Create the toolbar */
3303 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
3304 gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
3306 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Read from phone"), NULL,
3307 NewPixmap(Read_xpm, GUI_ContactsWindow->window,
3308 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3309 (GtkSignalFunc) ReadContacts, NULL);
3310 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Save to phone"), NULL,
3311 NewPixmap(Send_xpm, GUI_ContactsWindow->window,
3312 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3313 (GtkSignalFunc) SaveContacts, NULL);
3315 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
3317 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Import from file"), NULL,
3318 NewPixmap(Open_xpm, GUI_ContactsWindow->window,
3319 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3320 (GtkSignalFunc) ImportContacts, NULL);
3321 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Export to file"), NULL,
3322 NewPixmap(Save_xpm, GUI_ContactsWindow->window,
3323 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3324 (GtkSignalFunc) ExportContacts, NULL);
3326 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
3328 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("New entry"), NULL,
3329 NewPixmap(New_xpm, GUI_ContactsWindow->window,
3330 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3331 (GtkSignalFunc) NewEntry, NULL);
3332 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Duplicate entry"), NULL,
3333 NewPixmap(Duplicate_xpm, GUI_ContactsWindow->window,
3334 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3335 (GtkSignalFunc) DuplicateEntry, NULL);
3336 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Edit entry"), NULL,
3337 NewPixmap(Edit_xpm, GUI_ContactsWindow->window,
3338 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3339 (GtkSignalFunc) EditEntry, NULL);
3340 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Delete entry"), NULL,
3341 NewPixmap(Delete_xpm, GUI_ContactsWindow->window,
3342 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3343 (GtkSignalFunc) DeleteEntry, NULL);
3345 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
3347 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Dial voice"), NULL,
3348 NewPixmap(Dial_xpm, GUI_ContactsWindow->window,
3349 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3350 (GtkSignalFunc) DialVoice, NULL);
3352 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
3354 gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
3355 gtk_widget_show (toolbar);
3358 clist = gtk_clist_new_with_titles (4, titles);
3359 gtk_clist_set_shadow_type (GTK_CLIST (clist), GTK_SHADOW_OUT);
3360 gtk_clist_set_compare_func (GTK_CLIST (clist), CListCompareFunc);
3361 gtk_clist_set_sort_column (GTK_CLIST (clist), 0);
3362 gtk_clist_set_sort_type (GTK_CLIST (clist), GTK_SORT_ASCENDING);
3363 gtk_clist_set_auto_sort (GTK_CLIST (clist), FALSE);
3364 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
3366 gtk_clist_set_column_width (GTK_CLIST (clist), 0, 150);
3367 gtk_clist_set_column_width (GTK_CLIST (clist), 1, 115);
3368 gtk_clist_set_column_width (GTK_CLIST (clist), 3, 70);
3369 gtk_clist_set_column_justification (GTK_CLIST (clist), 2, GTK_JUSTIFY_CENTER);
3370 // gtk_clist_set_column_visibility (GTK_CLIST (clist), 3, phoneMonitor.supported & PM_CALLERGROUP);
3372 for (i = 0; i < 4; i++)
3374 if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
3376 g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
3379 sColumn->clist = clist;
3380 sColumn->column = i;
3381 gtk_signal_connect (GTK_OBJECT (GTK_CLIST (clist)->column[i].button), "clicked",
3382 GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
3385 gtk_signal_connect (GTK_OBJECT (clist), "select_row",
3386 GTK_SIGNAL_FUNC (ClickEntry), NULL);
3388 clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
3389 gtk_container_add (GTK_CONTAINER (clistScrolledWindow), clist);
3390 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clistScrolledWindow),
3391 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3392 gtk_box_pack_start (GTK_BOX (main_vbox), clistScrolledWindow,
3395 gtk_widget_show (clist);
3396 gtk_widget_show (clistScrolledWindow);
3398 status_hbox = gtk_hbox_new (FALSE,20);
3399 gtk_box_pack_start (GTK_BOX (main_vbox), status_hbox, FALSE, FALSE, 0);
3400 gtk_widget_show (status_hbox);
3402 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
3403 memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
3404 statusInfo.ch_ME = statusInfo.ch_SM = 0;
3406 statusInfo.label = gtk_label_new ("");
3407 RefreshStatusInfo ();
3408 gtk_box_pack_start (GTK_BOX (status_hbox), statusInfo.label, FALSE, FALSE, 10);
3409 gtk_widget_show (statusInfo.label);
3411 memoryPixmaps.simMemPix = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
3412 &memoryPixmaps.mask,
3413 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
3416 memoryPixmaps.phoneMemPix = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
3417 &memoryPixmaps.mask,
3418 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
3421 questMark.pixmap = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
3423 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
3426 CreateErrorDialog (&errorDialog, GUI_ContactsWindow);
3427 GUIEventAdd (GUI_EVENT_CONTACTS_CHANGED, GUI_RefreshContacts);
3428 GUIEventAdd (GUI_EVENT_CALLERS_GROUPS_CHANGED, GUI_RefreshGroupMenu);