5 A Linux/Unix GUI for Nokia mobile phones.
7 Released under the terms of the GNU GPL, see file COPYING for more details.
23 # define sleep(x) Sleep((x) * 1000)
24 # define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
36 #include "gsm-common.h"
37 #include "xgnokii_contacts.h"
38 #include "xgnokii_lowlevel.h"
40 #include "xgnokii_common.h"
41 #include "xgnokii_lowlevel.h"
42 #include "xgnokii_sms.h"
43 #include "xpm/Read.xpm"
44 #include "xpm/Send.xpm"
45 #include "xpm/Open.xpm"
46 #include "xpm/Save.xpm"
47 #include "xpm/New.xpm"
48 #include "xpm/Duplicate.xpm"
49 #include "xpm/Edit.xpm"
50 #include "xpm/Delete.xpm"
51 #include "xpm/Dial.xpm"
52 #include "xpm/sim.xpm"
53 #include "xpm/phone.xpm"
54 #include "xpm/quest.xpm"
71 PhonebookEntry *pbEntry;
74 static GtkWidget *GUI_ContactsWindow;
76 static bool contactsMemoryInitialized;
77 static MemoryStatus memoryStatus;
78 static ContactsMemory contactsMemory; /* Hold contacts. */
79 static GtkWidget *clist;
80 static StatusInfo statusInfo;
81 static ProgressDialog progressDialog = {NULL, NULL, NULL};
82 static ErrorDialog errorDialog = {NULL, NULL};
83 static FindEntryStruct findEntryStruct = { "", 0};
84 static ExportDialogData exportDialogData = {NULL};
85 static MemoryPixmaps memoryPixmaps;
86 static QuestMark questMark;
87 static EditEntryData newEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
88 static EditEntryData editEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
89 static EditEntryData duplicateEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
90 static EditNumbersData editNumbersData = {NULL, NULL};
92 /* return != 0 if user has unsaved changes in contacts memory */
93 inline gint GUI_ContactsIsChanged (void)
95 return statusInfo.ch_ME | statusInfo.ch_SM;
99 /* return TRUE if Contacts memory was read from phone or from file */
100 inline bool GUI_ContactsIsIntialized (void)
102 return contactsMemoryInitialized;
106 static inline void Help1 (GtkWidget *w, gpointer data)
108 gchar *indx = g_strdup_printf ("/help/%s/windows/contacts/index.html", xgnokiiConfig.locale);
114 void RefreshStatusInfo (void)
118 if (statusInfo.ch_ME)
123 if (statusInfo.ch_SM)
127 g_snprintf(statusInfo.text, STATUS_INFO_LENGTH, "SIM: %d/%d%c Phone: %d/%d%c",
128 memoryStatus.UsedSM, memoryStatus.MaxSM, s,
129 memoryStatus.UsedME, memoryStatus.MaxME, p);
130 gtk_label_set_text(GTK_LABEL (statusInfo.label), statusInfo.text);
134 static inline void SetGroup0 (GtkWidget *item, gpointer data)
136 ((EditEntryData *) data)->newGroup = 0;
140 static inline void SetGroup1 (GtkWidget *item, gpointer data)
142 ((EditEntryData *) data)->newGroup = 1;
146 static inline void SetGroup2 (GtkWidget *item, gpointer data)
148 ((EditEntryData *) data)->newGroup = 2;
152 static inline void SetGroup3 (GtkWidget *item, gpointer data)
154 ((EditEntryData *) data)->newGroup = 3;
158 static inline void SetGroup4 (GtkWidget *item, gpointer data)
160 ((EditEntryData *) data)->newGroup = 4;
164 static inline void SetGroup5 (GtkWidget *item, gpointer data)
166 ((EditEntryData *) data)->newGroup = 5;
170 PhonebookEntry *FindFreeEntry (GSM_MemoryType type)
172 PhonebookEntry *entry;
178 if (memoryStatus.FreeME == 0)
181 end = memoryStatus.MaxME;
185 if (memoryStatus.FreeSM == 0)
187 start = memoryStatus.MaxME;
188 end = memoryStatus.MaxME + memoryStatus.MaxSM;
191 for(i = start; i < end; i++)
193 entry = g_ptr_array_index(contactsMemory, i);
194 if (entry->status == E_Empty || entry->status == E_Deleted)
202 inline PhonebookEntry *GUI_GetEntry (GSM_MemoryType type, gint nr)
204 if ((type == GMT_ME && (nr < 1 || nr >= memoryStatus.MaxME)) ||
205 (type == GMT_SM && (nr < 1 || nr >= memoryStatus.MaxSM)))
209 return g_ptr_array_index (contactsMemory, nr - 1);
211 return g_ptr_array_index (contactsMemory, nr + memoryStatus.MaxME - 1);
215 static void CloseContacts (GtkWidget *w, gpointer data)
217 gtk_widget_hide (GUI_ContactsWindow);
221 /* I don't want to allow window to close */
222 static void ProgressDialogDeleteEvent (GtkWidget *w, gpointer data)
228 static void CancelEditDialog (GtkWidget *widget, gpointer data )
230 gtk_widget_hide(GTK_WIDGET(((EditEntryData*) data)->dialog));
235 static void OkEditEntryDialog (GtkWidget *widget, gpointer data)
238 PhonebookEntry *entry;
240 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active &&
241 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_SM)
243 if ((entry = FindFreeEntry(GMT_ME)) == NULL)
245 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Can't change memory type!"));
246 gtk_widget_show (errorDialog.dialog);
249 strncpy(entry->entry.Name,
250 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
251 max_phonebook_name_length);
252 entry->entry.Name[max_phonebook_name_length] = '\0';
254 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
259 strncpy(entry->entry.Number,
260 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
261 max_phonebook_number_length);
262 entry->entry.Name[max_phonebook_number_length] = '\0';
265 entry->entry.Group = ((EditEntryData*) data)->newGroup;
267 entry->status = E_Changed;
269 ((EditEntryData*) data)->pbEntry->status = E_Deleted;
271 memoryStatus.UsedME++;
272 memoryStatus.FreeME--;
273 memoryStatus.UsedSM--;
274 memoryStatus.FreeSM++;
275 statusInfo.ch_ME = statusInfo.ch_SM = 1;
277 ((EditEntryData*) data)->pbEntry = entry;
279 else if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypeSIM)->active &&
280 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
282 if ((entry = FindFreeEntry(GMT_SM)) == NULL)
284 gtk_label_set_text(GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
285 gtk_widget_show (errorDialog.dialog);
288 strncpy(entry->entry.Name,
289 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
290 max_phonebook_sim_name_length);
291 entry->entry.Name[max_phonebook_sim_name_length] = '\0';
293 if (strlen(gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
295 gtk_label_set_text( GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated,\n\
296 because you save it into SIM memory!"));
297 gtk_widget_show (errorDialog.dialog);
300 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
305 strncpy(entry->entry.Number,
306 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
307 max_phonebook_sim_number_length);
308 entry->entry.Name[max_phonebook_sim_number_length] = '\0';
311 entry->entry.Group = ((EditEntryData*) data)->newGroup;
313 entry->status = E_Changed;
315 ((EditEntryData*) data)->pbEntry->status = E_Deleted;
317 memoryStatus.UsedME--;
318 memoryStatus.FreeME++;
319 memoryStatus.UsedSM++;
320 memoryStatus.FreeSM--;
321 statusInfo.ch_ME = statusInfo.ch_SM = 1;
323 ((EditEntryData*) data)->pbEntry = entry;
327 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active)
329 strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
330 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
331 max_phonebook_name_length);
332 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_name_length] = '\0';
334 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
339 strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
340 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
341 max_phonebook_number_length);
342 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_number_length] = '\0';
347 strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
348 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
349 max_phonebook_sim_name_length);
350 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
352 if (strlen(gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
354 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated,\n\
355 because you save it into SIM memory!"));
356 gtk_widget_show (errorDialog.dialog);
359 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
364 strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
365 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
366 max_phonebook_sim_number_length);
367 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_number_length] = '\0';
371 ((EditEntryData*) data)->pbEntry->entry.Group = ((EditEntryData*) data)->newGroup;
373 ((EditEntryData*) data)->pbEntry->status = E_Changed;
375 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
376 statusInfo.ch_ME = 1;
378 statusInfo.ch_SM = 1;
381 gtk_widget_hide (GTK_WIDGET(((EditEntryData*) data)->dialog));
383 RefreshStatusInfo ();
385 gtk_clist_freeze (GTK_CLIST (clist));
386 gtk_clist_remove (GTK_CLIST (clist), ((EditEntryData*) data)->row);
388 clist_row[0] = ((EditEntryData*) data)->pbEntry->entry.Name;
390 clist_row[1] = ((EditEntryData*) data)->pbEntry->entry.Number;
392 if( ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
396 if (GetModelFeature(FN_CALLERGROUPS)!=0)
397 clist_row[3] = xgnokiiConfig.callerGroups[((EditEntryData*) data)->pbEntry->entry.Group];
400 gtk_clist_insert(GTK_CLIST (clist), ((EditEntryData*) data)->row, clist_row);
401 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
402 gtk_clist_set_pixmap( GTK_CLIST (clist), ((EditEntryData*) data)->row, 2,
403 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
405 gtk_clist_set_pixmap( GTK_CLIST (clist), ((EditEntryData*) data)->row, 2,
406 memoryPixmaps.simMemPix, memoryPixmaps.mask);
408 gtk_clist_set_row_data(GTK_CLIST (clist), ((EditEntryData*) data)->row, (gpointer) ((EditEntryData*) data)->pbEntry);
410 gtk_clist_sort(GTK_CLIST (clist));
411 gtk_clist_thaw(GTK_CLIST (clist));
415 static void OkDeleteEntryDialog(GtkWidget *widget, gpointer data )
417 PhonebookEntry *pbEntry;
421 sel = GTK_CLIST (clist)->selection;
423 gtk_clist_freeze(GTK_CLIST (clist));
427 row = GPOINTER_TO_INT(sel->data);
428 pbEntry = (PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row);
431 pbEntry->status = E_Deleted;
433 if (pbEntry->entry.MemoryType == GMT_ME)
435 memoryStatus.UsedME--;
436 memoryStatus.FreeME++;
437 statusInfo.ch_ME = 1;
441 memoryStatus.UsedSM--;
442 memoryStatus.FreeSM++;
443 statusInfo.ch_SM = 1;
446 gtk_clist_remove(GTK_CLIST (clist), row);
449 RefreshStatusInfo ();
451 gtk_widget_hide(GTK_WIDGET (data));
453 gtk_clist_thaw(GTK_CLIST (clist));
457 static void OkNewEntryDialog(GtkWidget *widget, gpointer data )
460 PhonebookEntry *entry;
462 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active &&
463 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_SM)
465 if ((entry = FindFreeEntry (GMT_ME)) == NULL)
467 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
468 gtk_widget_show (errorDialog.dialog);
471 strncpy(entry->entry.Name,
472 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
473 max_phonebook_name_length);
474 entry->entry.Name[max_phonebook_name_length] = '\0';
476 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
481 strncpy(entry->entry.Number,
482 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
483 max_phonebook_number_length);
484 entry->entry.Name[max_phonebook_number_length] = '\0';
487 entry->entry.Group = ((EditEntryData*) data)->newGroup;
489 entry->status = E_Changed;
491 ((EditEntryData*) data)->pbEntry = entry;
493 else if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypeSIM)->active &&
494 ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
496 if ((entry = FindFreeEntry (GMT_SM)) == NULL)
498 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
499 gtk_widget_show (errorDialog.dialog);
502 strncpy(entry->entry.Name,
503 gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name)),
504 max_phonebook_sim_name_length);
505 entry->entry.Name[max_phonebook_sim_name_length] = '\0';
507 if (strlen(gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
509 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated\n\
510 because you save it into SIM memory!"));
511 gtk_widget_show (errorDialog.dialog);
514 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
519 strncpy(entry->entry.Number,
520 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
521 max_phonebook_sim_number_length);
522 entry->entry.Name[max_phonebook_sim_number_length] = '\0';
525 entry->entry.Group = ((EditEntryData*) data)->newGroup;
527 entry->status = E_Changed;
529 ((EditEntryData*) data)->pbEntry = entry;
533 if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active)
535 strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
536 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
537 max_phonebook_name_length);
538 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_name_length] = '\0';
540 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
545 strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
546 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
547 max_phonebook_number_length);
548 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_number_length] = '\0';
553 strncpy (((EditEntryData*) data)->pbEntry->entry.Name,
554 gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
555 max_phonebook_sim_name_length);
556 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
558 if (strlen(gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
560 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated\n\
561 because you save it into SIM memory!"));
562 gtk_widget_show (errorDialog.dialog);
565 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
570 strncpy (((EditEntryData*) data)->pbEntry->entry.Number,
571 gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
572 max_phonebook_sim_number_length);
573 ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_number_length] = '\0';
577 ((EditEntryData*) data)->pbEntry->entry.Group = ((EditEntryData*) data)->newGroup;
579 ((EditEntryData*) data)->pbEntry->status = E_Changed;
582 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
584 memoryStatus.UsedME++;
585 memoryStatus.FreeME--;
586 statusInfo.ch_ME = 1;
590 memoryStatus.UsedSM++;
591 memoryStatus.FreeSM--;
592 statusInfo.ch_SM = 1;
595 gtk_widget_hide(GTK_WIDGET(((EditEntryData*) data)->dialog));
597 RefreshStatusInfo ();
599 gtk_clist_freeze (GTK_CLIST (clist));
600 clist_row[0] = ((EditEntryData*) data)->pbEntry->entry.Name;
602 clist_row[1] = ((EditEntryData*) data)->pbEntry->entry.Number;
604 if( ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
608 if (GetModelFeature(FN_CALLERGROUPS)!=0)
609 clist_row[3] = xgnokiiConfig.callerGroups[((EditEntryData*) data)->pbEntry->entry.Group];
612 gtk_clist_insert (GTK_CLIST (clist), 1, clist_row);
614 if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
615 gtk_clist_set_pixmap (GTK_CLIST (clist), 1, 2,
616 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
618 gtk_clist_set_pixmap (GTK_CLIST (clist), 1, 2,
619 memoryPixmaps.simMemPix, memoryPixmaps.mask);
621 gtk_clist_set_row_data (GTK_CLIST (clist), 1, (gpointer) ((EditEntryData*) data)->pbEntry);
623 gtk_clist_sort (GTK_CLIST (clist));
624 gtk_clist_thaw (GTK_CLIST (clist));
628 static void OkChangeEntryDialog( GtkWidget *widget, gpointer data)
632 PhonebookEntry *oldPbEntry, *newPbEntry;
636 sel = GTK_CLIST (clist)->selection;
638 gtk_widget_hide(GTK_WIDGET (data));
640 gtk_clist_freeze(GTK_CLIST (clist));
644 row = GPOINTER_TO_INT (sel->data);
645 oldPbEntry = (PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row);
649 if (oldPbEntry->entry.MemoryType == GMT_SM)
651 if ((newPbEntry = FindFreeEntry (GMT_ME)) == NULL)
653 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
654 gtk_widget_show (errorDialog.dialog);
658 newPbEntry->entry = oldPbEntry->entry;
659 newPbEntry->entry.MemoryType = GMT_ME;
661 newPbEntry->status = E_Changed;
662 oldPbEntry->status = E_Deleted;
664 memoryStatus.UsedME++;
665 memoryStatus.FreeME--;
666 memoryStatus.UsedSM--;
667 memoryStatus.FreeSM++;
668 statusInfo.ch_ME = statusInfo.ch_SM = 1;
673 if ((newPbEntry = FindFreeEntry(GMT_SM)) == NULL)
675 gtk_label_set_text(GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
676 gtk_widget_show (errorDialog.dialog);
680 newPbEntry->entry = oldPbEntry->entry;
681 newPbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
682 newPbEntry->entry.MemoryType = GMT_SM;
684 newPbEntry->status = E_Changed;
685 oldPbEntry->status = E_Deleted;
687 memoryStatus.UsedME--;
688 memoryStatus.FreeME++;
689 memoryStatus.UsedSM++;
690 memoryStatus.FreeSM--;
691 statusInfo.ch_ME = statusInfo.ch_SM = 1;
694 gtk_clist_remove(GTK_CLIST (clist), row);
696 clist_row[0] = newPbEntry->entry.Name;
698 if (newPbEntry->entry.SubEntriesCount>0) {
699 snprintf(string,100,"%s *",newPbEntry->entry.Number);
701 } else clist_row[1] = newPbEntry->entry.Number;
703 if( newPbEntry->entry.MemoryType == GMT_ME)
707 if (GetModelFeature(FN_CALLERGROUPS)!=0)
708 clist_row[3] = xgnokiiConfig.callerGroups[newPbEntry->entry.Group];
711 gtk_clist_insert (GTK_CLIST (clist), row, clist_row);
712 if (newPbEntry->entry.MemoryType == GMT_ME)
713 gtk_clist_set_pixmap (GTK_CLIST (clist), row, 2,
714 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
716 gtk_clist_set_pixmap (GTK_CLIST (clist), row, 2,
717 memoryPixmaps.simMemPix, memoryPixmaps.mask);
719 gtk_clist_set_row_data (GTK_CLIST (clist), row, (gpointer) newPbEntry);
722 RefreshStatusInfo ();
723 gtk_clist_sort (GTK_CLIST (clist));
724 gtk_clist_thaw (GTK_CLIST (clist));
728 static void SearchEntry (void)
734 if (!contactsMemoryInitialized || *findEntryStruct.pattern == '\0')
737 gtk_clist_unselect_all( GTK_CLIST (clist));
738 g_strup(findEntryStruct.pattern);
740 gtk_clist_get_text( GTK_CLIST (clist), findEntryStruct.lastRow,
741 findEntryStruct.type, &entry);
742 i = (findEntryStruct.lastRow + 1) % (memoryStatus.MaxME + memoryStatus.MaxSM);
744 while (findEntryStruct.lastRow != i)
746 buf = g_strdup (entry);
749 if (strstr( buf, findEntryStruct.pattern))
752 findEntryStruct.lastRow = i;
753 gtk_clist_select_row( GTK_CLIST (clist),
754 (i + memoryStatus.MaxME + memoryStatus.MaxSM - 1)
755 % (memoryStatus.MaxME + memoryStatus.MaxSM),
756 findEntryStruct.type);
757 gtk_clist_moveto( GTK_CLIST (clist),
758 (i + memoryStatus.MaxME + memoryStatus.MaxSM - 1)
759 % (memoryStatus.MaxME + memoryStatus.MaxSM),
760 findEntryStruct.type, 0.5, 0.5);
764 gtk_clist_get_text (GTK_CLIST (clist), i, findEntryStruct.type, &entry);
766 i = (i + 1) % (memoryStatus.MaxME + memoryStatus.MaxSM);
769 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find pattern!"));
770 gtk_widget_show (errorDialog.dialog);
774 static void OkFindEntryDialog (GtkWidget *widget, gpointer data)
776 if (GTK_TOGGLE_BUTTON (((FindEntryData*) data)->nameB)->active)
777 findEntryStruct.type = FIND_NAME;
779 findEntryStruct.type = FIND_NUMBER;
781 strncpy(findEntryStruct.pattern,
782 gtk_entry_get_text (GTK_ENTRY (((FindEntryData*) data)->pattern)),
783 max_phonebook_number_length);
784 findEntryStruct.pattern[max_phonebook_number_length] = '\0';
786 findEntryStruct.lastRow = 0;
788 gtk_widget_hide( ((FindEntryData*) data)->dialog);
794 void CreateGroupMenu (EditEntryData *data)
800 gtk_option_menu_remove_menu (GTK_OPTION_MENU (data->group));
801 if (GTK_IS_WIDGET (data->groupMenu))
802 gtk_widget_destroy (GTK_WIDGET (data->groupMenu));
803 data->groupMenu = NULL;
806 data->groupMenu = gtk_menu_new ();
808 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[0]);
809 gtk_signal_connect (GTK_OBJECT (item), "activate",
810 GTK_SIGNAL_FUNC (SetGroup0),
812 gtk_widget_show (item);
813 gtk_menu_append (GTK_MENU (data->groupMenu), item);
815 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[1]);
816 gtk_signal_connect (GTK_OBJECT (item), "activate",
817 GTK_SIGNAL_FUNC (SetGroup1),
819 gtk_widget_show (item);
820 gtk_menu_append (GTK_MENU (data->groupMenu), item);
822 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[2]);
823 gtk_signal_connect (GTK_OBJECT (item), "activate",
824 GTK_SIGNAL_FUNC (SetGroup2),
826 gtk_widget_show (item);
827 gtk_menu_append (GTK_MENU (data->groupMenu), item);
829 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[3]);
830 gtk_signal_connect (GTK_OBJECT (item), "activate",
831 GTK_SIGNAL_FUNC (SetGroup3),
833 gtk_widget_show (item);
834 gtk_menu_append (GTK_MENU (data->groupMenu), item);
836 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[4]);
837 gtk_signal_connect (GTK_OBJECT (item), "activate",
838 GTK_SIGNAL_FUNC (SetGroup4),
840 gtk_widget_show (item);
841 gtk_menu_append (GTK_MENU (data->groupMenu), item);
843 item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[5]);
844 gtk_signal_connect (GTK_OBJECT (item), "activate",
845 GTK_SIGNAL_FUNC (SetGroup5),
847 gtk_widget_show (item);
848 gtk_menu_append (GTK_MENU (data->groupMenu), item);
850 gtk_option_menu_set_menu (GTK_OPTION_MENU (data->group), data->groupMenu);
854 inline void GUI_RefreshGroupMenu (void)
856 if (newEditEntryData.group)
857 CreateGroupMenu (&newEditEntryData);
859 if (editEditEntryData.group)
860 CreateGroupMenu (&editEditEntryData);
862 if (duplicateEditEntryData.group)
863 CreateGroupMenu (&duplicateEditEntryData);
867 static void EditSubEntries (GtkWidget *clist,
870 GdkEventButton *event,
873 if(event && event->type == GDK_2BUTTON_PRESS)
874 // EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row),
879 gtk_clist_get_text (GTK_CLIST (clist), row, 1, &buf);
885 static void EditNumbers (GtkWidget *widget, void *data)
887 GtkWidget *button, *clistScrolledWindow;
892 if (editNumbersData.dialog == NULL)
894 editNumbersData.dialog = gtk_dialog_new ();
895 gtk_window_set_title (GTK_WINDOW (editNumbersData.dialog), _("Numbers"));
896 gtk_window_set_modal (GTK_WINDOW (editNumbersData.dialog), TRUE);
897 gtk_container_set_border_width (GTK_CONTAINER (editNumbersData.dialog), 10);
898 gtk_signal_connect (GTK_OBJECT (editNumbersData.dialog), "delete_event",
899 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
901 button = gtk_button_new_with_label (_("Ok"));
902 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
903 button, TRUE, TRUE, 10);
904 // gtk_signal_connect (GTK_OBJECT (button), "clicked",
905 // GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
906 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
907 gtk_widget_grab_default (button);
908 gtk_widget_show (button);
910 button = gtk_button_new_with_label (_("New"));
911 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
912 button, TRUE, TRUE, 10);
913 // gtk_signal_connect (GTK_OBJECT (button), "clicked",
914 // GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
915 gtk_widget_show (button);
917 button = gtk_button_new_with_label (_("Cancel"));
918 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
919 button, TRUE, TRUE, 10);
920 gtk_signal_connect (GTK_OBJECT (button), "clicked",
921 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) editNumbersData.dialog);
922 gtk_widget_show (button);
924 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editNumbersData.dialog)->vbox), 5);
926 editNumbersData.clist = gtk_clist_new (3);
927 gtk_clist_set_shadow_type (GTK_CLIST (editNumbersData.clist), GTK_SHADOW_OUT);
929 gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 0, 4);
930 gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 1, 115);
931 gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 2, 10);
932 //gtk_clist_set_column_justification (GTK_CLIST (editNumbersData.clist), 2, GTK_JUSTIFY_CENTER);
934 gtk_signal_connect (GTK_OBJECT (editNumbersData.clist), "select_row",
935 GTK_SIGNAL_FUNC (EditSubEntries), NULL);
937 clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
938 gtk_container_add (GTK_CONTAINER (clistScrolledWindow), editNumbersData.clist);
939 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clistScrolledWindow),
940 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
942 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editNumbersData.dialog)->vbox),
943 clistScrolledWindow);
945 gtk_widget_show (editNumbersData.clist);
946 gtk_widget_show (clistScrolledWindow);
949 gtk_clist_freeze (GTK_CLIST (editNumbersData.clist));
950 gtk_clist_clear (GTK_CLIST (editNumbersData.clist));
952 for(i = 0; i < editNumbersData.pbEntry->entry.SubEntriesCount; i++)
954 if (strcmp (editNumbersData.pbEntry->entry.Number,
955 editNumbersData.pbEntry->entry.SubEntries[i].data.Number) == 0)
960 row[1] = editNumbersData.pbEntry->entry.SubEntries[i].data.Number;
962 switch (editNumbersData.pbEntry->entry.SubEntries[i].EntryType)
965 switch (editNumbersData.pbEntry->entry.SubEntries[i].NumberType)
1014 gtk_clist_append (GTK_CLIST (editNumbersData.clist), row);
1015 /* if (pbEntry->entry.MemoryType == GMT_ME)
1016 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
1017 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
1019 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
1020 memoryPixmaps.simMemPix, memoryPixmaps.mask);
1024 gtk_clist_thaw (GTK_CLIST (editNumbersData.clist));
1026 gtk_widget_show (editNumbersData.dialog);
1030 static void CreateEditDialog (EditEntryData *editEntryData, gchar *title,
1031 GtkSignalFunc okFunc)
1033 GtkWidget *button, *label, *hbox;
1035 editEntryData->dialog = gtk_dialog_new ();
1036 gtk_window_set_title (GTK_WINDOW (editEntryData->dialog), title);
1037 gtk_window_set_modal (GTK_WINDOW (editEntryData->dialog), TRUE);
1038 gtk_container_set_border_width (GTK_CONTAINER (editEntryData->dialog), 10);
1039 gtk_signal_connect (GTK_OBJECT (editEntryData->dialog), "delete_event",
1040 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1042 button = gtk_button_new_with_label (_("Ok"));
1043 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editEntryData->dialog)->action_area),
1044 button, TRUE, TRUE, 10);
1045 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1046 GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
1047 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1048 gtk_widget_grab_default (button);
1049 gtk_widget_show (button);
1050 button = gtk_button_new_with_label (_("Cancel"));
1051 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editEntryData->dialog)->action_area),
1052 button, TRUE, TRUE, 10);
1053 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1054 GTK_SIGNAL_FUNC (CancelEditDialog), (gpointer) editEntryData);
1055 gtk_widget_show (button);
1057 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), 5);
1059 hbox = gtk_hbox_new (FALSE, 0);
1060 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1061 gtk_widget_show (hbox);
1063 label = gtk_label_new (_("Name:"));
1064 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1065 gtk_widget_show (label);
1067 editEntryData->name = gtk_entry_new_with_max_length (100);
1069 gtk_box_pack_end(GTK_BOX(hbox), editEntryData->name, FALSE, FALSE, 2);
1070 gtk_widget_show (editEntryData->name);
1072 hbox = gtk_hbox_new (FALSE, 0);
1073 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1074 gtk_widget_show (hbox);
1076 label = gtk_label_new (_("Number:"));
1077 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1078 gtk_widget_show (label);
1080 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
1082 button = gtk_button_new ();
1083 editEntryData->number = gtk_label_new ("");
1085 gtk_container_add (GTK_CONTAINER (button), editEntryData->number);
1087 gtk_box_pack_end(GTK_BOX(hbox), button, TRUE, TRUE, 2);
1089 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1090 GTK_SIGNAL_FUNC (EditNumbers), NULL);
1091 gtk_widget_show_all (button);
1095 editEntryData->number = gtk_entry_new_with_max_length (max_phonebook_number_length);
1096 gtk_box_pack_end(GTK_BOX(hbox), editEntryData->number, FALSE, FALSE, 2);
1097 gtk_widget_show (editEntryData->number);
1100 /* if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
1102 hbox = gtk_hbox_new (FALSE, 0);
1103 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1104 // gtk_widget_show (hbox);
1106 label = gtk_label_new (_("Extended:"));
1107 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1108 // gtk_widget_show (label);
1110 editEntryData->extended = gtk_combo_new();
1111 gtk_box_pack_end(GTK_BOX(hbox), editEntryData->extended, FALSE, FALSE, 2);
1112 // gtk_widget_show (editEntryData->extended);
1114 gtk_signal_connect (GTK_OBJECT (GTK_COMBO(editEntryData->extended)->entry), "activate",
1115 GTK_SIGNAL_FUNC (ExtPbkChanged), (gpointer) editEntryData);
1119 editEntryData->memoryBox = gtk_hbox_new (FALSE, 0);
1120 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox),
1121 editEntryData->memoryBox);
1123 label = gtk_label_new (_("Memory:"));
1124 gtk_box_pack_start(GTK_BOX (editEntryData->memoryBox), label, FALSE, FALSE, 2);
1125 gtk_widget_show (label);
1127 editEntryData->memoryTypePhone = gtk_radio_button_new_with_label (NULL, _("phone"));
1128 gtk_box_pack_end (GTK_BOX (editEntryData->memoryBox), editEntryData->memoryTypePhone, TRUE, FALSE, 2);
1129 gtk_widget_show (editEntryData->memoryTypePhone);
1131 editEntryData->memoryTypeSIM = gtk_radio_button_new_with_label(
1132 gtk_radio_button_group (GTK_RADIO_BUTTON (editEntryData->memoryTypePhone)), "SIM");
1133 gtk_box_pack_end(GTK_BOX (editEntryData->memoryBox), editEntryData->memoryTypeSIM, TRUE, FALSE, 2);
1134 gtk_widget_show (editEntryData->memoryTypeSIM);
1136 hbox = gtk_hbox_new (FALSE, 0);
1137 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
1138 gtk_widget_show (hbox);
1140 editEntryData->groupLabel = gtk_label_new (_("Caller group:"));
1141 gtk_box_pack_start (GTK_BOX (hbox), editEntryData->groupLabel, FALSE, FALSE, 2);
1143 editEntryData->group = gtk_option_menu_new ();
1145 CreateGroupMenu (editEntryData);
1147 gtk_box_pack_start (GTK_BOX (hbox), editEntryData->group, TRUE, TRUE, 0);
1151 static void EditPbEntry(PhonebookEntry *pbEntry, gint row)
1153 if (editEditEntryData.dialog == NULL)
1154 CreateEditDialog(&editEditEntryData, _("Edit entry"), OkEditEntryDialog);
1156 editEditEntryData.pbEntry = pbEntry;
1157 editEditEntryData.newGroup = pbEntry->entry.Group;
1158 editEditEntryData.row = row;
1159 editNumbersData.pbEntry = pbEntry;
1161 gtk_entry_set_text (GTK_ENTRY (editEditEntryData.name), pbEntry->entry.Name);
1163 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
1164 gtk_label_set_text (GTK_LABEL (editEditEntryData.number), pbEntry->entry.Number);
1166 gtk_entry_set_text (GTK_ENTRY (editEditEntryData.number), pbEntry->entry.Number);
1168 if (pbEntry->entry.MemoryType == GMT_ME)
1169 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editEditEntryData.memoryTypePhone), TRUE);
1171 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editEditEntryData.memoryTypeSIM), TRUE);
1173 gtk_option_menu_set_history( GTK_OPTION_MENU (editEditEntryData.group),
1174 pbEntry->entry.Group);
1176 if (GetModelFeature(FN_CALLERGROUPS)!=0)
1178 gtk_widget_show (editEditEntryData.group);
1179 gtk_widget_show (editEditEntryData.groupLabel);
1183 gtk_widget_hide (editEditEntryData.group);
1184 gtk_widget_hide (editEditEntryData.groupLabel);
1187 if (memoryStatus.MaxME > 0)
1188 gtk_widget_show (GTK_WIDGET (editEditEntryData.memoryBox));
1190 gtk_widget_hide (GTK_WIDGET (editEditEntryData.memoryBox));
1192 gtk_widget_show (GTK_WIDGET (editEditEntryData.dialog));
1196 void DeletePbEntry (void)
1198 static GtkWidget *dialog = NULL;
1199 GtkWidget *button, *hbox, *label, *pixmap;
1203 dialog = gtk_dialog_new ();
1204 gtk_window_set_title (GTK_WINDOW (dialog), _("Delete entries"));
1205 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1206 gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
1207 gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
1208 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1209 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1211 button = gtk_button_new_with_label (_("Ok"));
1212 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1213 button, TRUE, TRUE, 10);
1214 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1215 GTK_SIGNAL_FUNC (OkDeleteEntryDialog), (gpointer) dialog);
1216 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1217 gtk_widget_grab_default (button);
1218 gtk_widget_show (button);
1219 button = gtk_button_new_with_label (_("Cancel"));
1220 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1221 button, TRUE, TRUE, 10);
1222 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1223 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
1224 gtk_widget_show (button);
1226 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
1228 hbox = gtk_hbox_new (FALSE, 0);
1229 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
1230 gtk_widget_show (hbox);
1232 pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
1233 gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 10);
1234 gtk_widget_show(pixmap);
1236 label = gtk_label_new(_("Do you want to delete selected entries?"));
1237 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10);
1238 gtk_widget_show(label);
1241 gtk_widget_show(GTK_WIDGET (dialog));
1245 void NewPbEntry(PhonebookEntry *pbEntry)
1247 if (newEditEntryData.dialog == NULL)
1248 CreateEditDialog (&newEditEntryData, _("New entry"), OkNewEntryDialog);
1250 newEditEntryData.pbEntry = pbEntry;
1251 newEditEntryData.newGroup = 5;
1252 editNumbersData.pbEntry = pbEntry;
1254 gtk_entry_set_text (GTK_ENTRY (newEditEntryData.name), "");
1256 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
1257 gtk_label_set_text (GTK_LABEL (newEditEntryData.number), "");
1259 gtk_entry_set_text (GTK_ENTRY (newEditEntryData.number), "");
1261 if (pbEntry->entry.MemoryType == GMT_ME)
1262 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (newEditEntryData.memoryTypePhone), TRUE);
1264 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (newEditEntryData.memoryTypeSIM), TRUE);
1266 gtk_option_menu_set_history( GTK_OPTION_MENU (newEditEntryData.group),
1267 pbEntry->entry.Group);
1269 if (GetModelFeature(FN_CALLERGROUPS)!=0)
1271 gtk_widget_show (newEditEntryData.group);
1272 gtk_widget_show (newEditEntryData.groupLabel);
1276 gtk_widget_hide (newEditEntryData.group);
1277 gtk_widget_hide (newEditEntryData.groupLabel);
1280 if (memoryStatus.MaxME > 0)
1281 gtk_widget_show (GTK_WIDGET (newEditEntryData.memoryBox));
1283 gtk_widget_hide (GTK_WIDGET (newEditEntryData.memoryBox));
1285 gtk_widget_show(GTK_WIDGET (newEditEntryData.dialog));
1289 void DuplicatePbEntry (PhonebookEntry *pbEntry)
1291 if (duplicateEditEntryData.dialog == NULL)
1292 CreateEditDialog (&duplicateEditEntryData, _("Duplicate entry"), OkNewEntryDialog);
1294 duplicateEditEntryData.pbEntry = pbEntry;
1295 duplicateEditEntryData.newGroup = pbEntry->entry.Group;
1296 editNumbersData.pbEntry = pbEntry;
1298 gtk_entry_set_text (GTK_ENTRY (duplicateEditEntryData.name), pbEntry->entry.Name);
1300 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
1301 gtk_label_set_text (GTK_LABEL (duplicateEditEntryData.number), pbEntry->entry.Number);
1303 gtk_entry_set_text (GTK_ENTRY (duplicateEditEntryData.number), pbEntry->entry.Number);
1305 if (pbEntry->entry.MemoryType == GMT_ME)
1306 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (duplicateEditEntryData.memoryTypePhone), TRUE);
1308 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (duplicateEditEntryData.memoryTypeSIM), TRUE);
1310 gtk_option_menu_set_history( GTK_OPTION_MENU (duplicateEditEntryData.group),
1311 pbEntry->entry.Group);
1313 if (GetModelFeature(FN_CALLERGROUPS)!=0)
1315 gtk_widget_show (duplicateEditEntryData.group);
1316 gtk_widget_show (duplicateEditEntryData.groupLabel);
1320 gtk_widget_hide (duplicateEditEntryData.group);
1321 gtk_widget_hide (duplicateEditEntryData.groupLabel);
1324 if (memoryStatus.MaxME > 0)
1325 gtk_widget_show (GTK_WIDGET (duplicateEditEntryData.memoryBox));
1327 gtk_widget_hide (GTK_WIDGET (duplicateEditEntryData.memoryBox));
1329 gtk_widget_show(GTK_WIDGET (duplicateEditEntryData.dialog));
1333 static void EditEntry (void)
1335 if (contactsMemoryInitialized)
1337 if (GTK_CLIST (clist)->selection == NULL)
1340 EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist),
1341 GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data)),
1342 GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data));
1347 static void DuplicateEntry (void)
1349 PhonebookEntry *new, *old;
1351 if (contactsMemoryInitialized)
1353 if (GTK_CLIST (clist)->selection == NULL)
1356 old = (PhonebookEntry *) gtk_clist_get_row_data (GTK_CLIST (clist), GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data));
1358 if ( old->entry.MemoryType == GMT_ME)
1360 if ((new = FindFreeEntry (GMT_ME)) == NULL)
1361 if ((new = FindFreeEntry (GMT_SM)) == NULL)
1363 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
1364 gtk_widget_show (errorDialog.dialog);
1370 if ((new = FindFreeEntry(GMT_SM)) == NULL)
1371 if ((new = FindFreeEntry(GMT_ME)) == NULL)
1373 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
1374 gtk_widget_show (errorDialog.dialog);
1379 new->entry = old->entry;
1381 DuplicatePbEntry (new);
1386 static void NewEntry (void)
1388 PhonebookEntry *entry;
1390 if (contactsMemoryInitialized)
1392 if ((entry = FindFreeEntry (GMT_SM)) != NULL)
1394 else if ((entry = FindFreeEntry (GMT_ME)) != NULL)
1398 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
1399 gtk_widget_show (errorDialog.dialog);
1405 static inline void ClickEntry (GtkWidget *clist,
1408 GdkEventButton *event,
1411 if(event && event->type == GDK_2BUTTON_PRESS)
1412 EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row),
1417 static inline void DeleteEntry (void)
1419 if (contactsMemoryInitialized)
1421 if (GTK_CLIST (clist)->selection == NULL)
1429 static void ChMemType (void)
1431 static GtkWidget *dialog = NULL;
1432 GtkWidget *button, *hbox, *label;
1434 if (contactsMemoryInitialized)
1436 if (GTK_CLIST (clist)->selection == NULL)
1441 dialog = gtk_dialog_new ();
1442 gtk_window_set_title (GTK_WINDOW (dialog), _("Changing memory type"));
1443 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1444 gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
1445 gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
1446 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1447 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1449 button = gtk_button_new_with_label (_("Continue"));
1450 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1451 button, FALSE, FALSE, 0);
1452 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1453 GTK_SIGNAL_FUNC (OkChangeEntryDialog), (gpointer) dialog);
1454 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1455 gtk_widget_grab_default (button);
1456 gtk_widget_show (button);
1458 button = gtk_button_new_with_label (_("Cancel"));
1459 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1460 button, FALSE, FALSE, 0);
1461 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1462 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
1463 gtk_widget_show (button);
1465 hbox = gtk_hbox_new (FALSE, 0);
1466 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
1467 gtk_widget_show (hbox);
1469 label = gtk_label_new (_("If you change from phone memory to SIM memory\nsome entries may be truncated."));
1470 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 10);
1471 gtk_widget_show (label);
1474 gtk_widget_show (dialog);
1479 static void FindFirstEntry (void)
1481 static FindEntryData findEntryData = { NULL };
1482 GtkWidget *button, *label, *hbox;
1484 if (contactsMemoryInitialized)
1486 if (findEntryData.dialog == NULL)
1488 findEntryData.dialog = gtk_dialog_new ();
1489 gtk_window_set_title (GTK_WINDOW (findEntryData.dialog), _("Find"));
1490 gtk_window_set_modal (GTK_WINDOW (findEntryData.dialog), TRUE);
1491 gtk_container_set_border_width (GTK_CONTAINER (findEntryData.dialog), 10);
1492 gtk_signal_connect (GTK_OBJECT (findEntryData.dialog), "delete_event",
1493 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1495 button = gtk_button_new_with_label (_("Find"));
1496 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (findEntryData.dialog)->action_area),
1497 button, TRUE, TRUE, 10);
1498 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1499 GTK_SIGNAL_FUNC (OkFindEntryDialog), (gpointer) &findEntryData);
1500 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1501 gtk_widget_grab_default (button);
1502 gtk_widget_show (button);
1504 button = gtk_button_new_with_label (_("Cancel"));
1505 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (findEntryData.dialog)->action_area),
1506 button, TRUE, TRUE, 10);
1507 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1508 GTK_SIGNAL_FUNC (CancelEditDialog), (gpointer) &findEntryData);
1509 gtk_widget_show (button);
1511 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), 5);
1513 hbox = gtk_hbox_new (FALSE, 0);
1514 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), hbox);
1515 gtk_widget_show (hbox);
1517 label = gtk_label_new (_("Pattern:"));
1518 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
1519 gtk_widget_show (label);
1521 findEntryData.pattern = gtk_entry_new_with_max_length (max_phonebook_name_length);
1523 gtk_box_pack_end (GTK_BOX (hbox), findEntryData.pattern, FALSE, FALSE, 2);
1524 gtk_widget_show (findEntryData.pattern);
1526 hbox = gtk_hbox_new (FALSE, 0);
1527 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), hbox);
1528 gtk_widget_show (hbox);
1530 findEntryData.nameB = gtk_radio_button_new_with_label (NULL, _("Name"));
1531 gtk_box_pack_start (GTK_BOX (hbox), findEntryData.nameB, TRUE, FALSE, 2);
1532 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (findEntryData.nameB), TRUE);
1533 gtk_widget_show (findEntryData.nameB);
1535 findEntryData.numberB = gtk_radio_button_new_with_label (
1536 gtk_radio_button_group (GTK_RADIO_BUTTON (findEntryData.nameB)), _("Number"));
1537 gtk_box_pack_start (GTK_BOX(hbox), findEntryData.numberB, TRUE, FALSE, 2);
1538 gtk_widget_show (findEntryData.numberB);
1541 gtk_widget_show (findEntryData.dialog);
1546 static inline void SelectAll (void)
1548 gtk_clist_select_all (GTK_CLIST (clist));
1552 static inline void OkDialVoiceDialog (GtkWidget *w, gpointer data)
1555 gchar *buf = g_strdup (gtk_entry_get_text (GTK_ENTRY (((DialVoiceDialog *) data)->entry)));
1557 if (strlen (buf) > 0)
1559 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
1560 e->event = Event_DialVoice;
1562 GUI_InsertEvent (e);
1567 gtk_widget_hide (((DialVoiceDialog *) data)->dialog);
1571 static void DialVoice (void)
1573 static DialVoiceDialog dialVoiceDialog = {NULL, NULL};
1574 GtkWidget *button, *label;
1575 PhonebookEntry *pbEntry;
1577 if (dialVoiceDialog.dialog == NULL)
1579 dialVoiceDialog.dialog = gtk_dialog_new ();
1580 gtk_window_set_title (GTK_WINDOW (dialVoiceDialog.dialog), _("Dial voice"));
1581 gtk_window_set_modal(GTK_WINDOW (dialVoiceDialog.dialog), TRUE);
1582 gtk_container_set_border_width (GTK_CONTAINER (dialVoiceDialog.dialog), 10);
1583 gtk_signal_connect (GTK_OBJECT (dialVoiceDialog.dialog), "delete_event",
1584 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1586 button = gtk_button_new_with_label (_("Ok"));
1587 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->action_area),
1588 button, TRUE, TRUE, 10);
1589 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1590 GTK_SIGNAL_FUNC (OkDialVoiceDialog), (gpointer) &dialVoiceDialog);
1591 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1592 gtk_widget_grab_default (button);
1593 gtk_widget_show (button);
1595 button = gtk_button_new_with_label (_("Cancel"));
1596 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->action_area),
1597 button, TRUE, TRUE, 10);
1598 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1599 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialVoiceDialog.dialog);
1600 gtk_widget_show (button);
1602 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), 5);
1604 label = gtk_label_new (_("Number:"));
1605 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), label, FALSE, FALSE, 5);
1606 gtk_widget_show (label);
1608 dialVoiceDialog.entry = gtk_entry_new_with_max_length (GSM_MAX_PHONEBOOK_NUMBER_LENGTH);
1609 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), dialVoiceDialog.entry, FALSE, FALSE, 5);
1610 gtk_widget_show (dialVoiceDialog.entry);
1613 if (GTK_CLIST (clist)->selection != NULL)
1615 pbEntry = (PhonebookEntry *) gtk_clist_get_row_data (GTK_CLIST (clist),
1616 GPOINTER_TO_INT (GTK_CLIST (clist)->selection->data));
1618 gtk_entry_set_text (GTK_ENTRY (dialVoiceDialog.entry), pbEntry->entry.Number);
1621 gtk_widget_show (dialVoiceDialog.dialog);
1625 static gint CListCompareFunc (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
1627 static gchar phoneText[] = "B";
1628 static gchar simText[] = "A";
1633 GtkCListRow *row1 = (GtkCListRow *) ptr1;
1634 GtkCListRow *row2 = (GtkCListRow *) ptr2;
1636 switch (row1->cell[clist->sort_column].type)
1639 text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
1641 case GTK_CELL_PIXTEXT:
1642 text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text;
1647 switch (row2->cell[clist->sort_column].type)
1650 text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
1652 case GTK_CELL_PIXTEXT:
1653 text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text;
1659 if (clist->sort_column == 2)
1661 if (((PhonebookEntry *) row1->data)->entry.MemoryType == GMT_ME)
1665 if (((PhonebookEntry *) row2->data)->entry.MemoryType == GMT_ME)
1672 return (text1 != NULL);
1677 if ((ret = g_strcasecmp (text1, text2)) == 0)
1679 if (((PhonebookEntry *) row1->data)->entry.MemoryType < ((PhonebookEntry *) row2->data)->entry.MemoryType)
1681 else if (((PhonebookEntry *) row1->data)->entry.MemoryType > ((PhonebookEntry *) row2->data)->entry.MemoryType)
1689 static void CreateProgressDialog (gint maxME, gint maxSM)
1691 GtkWidget *vbox, *label;
1694 progressDialog.dialog = gtk_window_new (GTK_WINDOW_DIALOG);
1695 gtk_window_position (GTK_WINDOW (progressDialog.dialog), GTK_WIN_POS_MOUSE);
1696 gtk_window_set_modal (GTK_WINDOW (progressDialog.dialog), TRUE);
1697 gtk_signal_connect (GTK_OBJECT (progressDialog.dialog), "delete_event",
1698 GTK_SIGNAL_FUNC (ProgressDialogDeleteEvent), NULL);
1700 vbox = gtk_vbox_new (FALSE, 10);
1701 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1702 gtk_container_add (GTK_CONTAINER (progressDialog.dialog), vbox);
1704 gtk_widget_show (vbox);
1706 label = gtk_label_new (_("Phone memory..."));
1707 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
1709 gtk_widget_show (label);
1711 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, maxME, 0, 0, 0);
1712 progressDialog.pbarME = gtk_progress_bar_new_with_adjustment (adj);
1714 gtk_box_pack_start (GTK_BOX (vbox), progressDialog.pbarME, FALSE, FALSE, 0);
1715 gtk_widget_show (progressDialog.pbarME);
1717 label = gtk_label_new (_("SIM memory..."));
1718 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
1720 gtk_widget_show (label);
1722 adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, maxSM, 0, 0, 0);
1723 progressDialog.pbarSM = gtk_progress_bar_new_with_adjustment (adj);
1725 gtk_box_pack_start (GTK_BOX (vbox), progressDialog.pbarSM, FALSE, FALSE, 0);
1726 gtk_widget_show (progressDialog.pbarSM);
1730 static void SaveContacts (void)
1733 PhonebookEntry *pbEntry;
1735 D_MemoryLocation *ml;
1737 if (progressDialog.dialog == NULL)
1739 CreateProgressDialog (memoryStatus.MaxME, memoryStatus.MaxSM);
1742 if (contactsMemoryInitialized && progressDialog.dialog)
1744 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), 0);
1745 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), 0);
1746 gtk_window_set_title (GTK_WINDOW (progressDialog.dialog), _("Saving entries"));
1747 gtk_widget_show_now (progressDialog.dialog);
1749 /* Save Phone memory */
1750 for(i = 0; i < memoryStatus.MaxME; i++)
1752 pbEntry = g_ptr_array_index(contactsMemory, i);
1754 g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
1755 pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
1756 (int) pbEntry->status);
1758 if (pbEntry->status == E_Changed || pbEntry->status == E_Deleted)
1760 if (pbEntry->status == E_Deleted)
1762 pbEntry->entry.Name[0] = '\0';
1763 pbEntry->entry.Number[0] = '\0';
1764 pbEntry->entry.Group = 5;
1767 pbEntry->entry.Location = i + 1;
1768 ml = (D_MemoryLocation *) g_malloc (sizeof (D_MemoryLocation));
1769 ml->entry = &(pbEntry->entry);
1770 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
1771 e->event = Event_WriteMemoryLocation;
1773 GUI_InsertEvent (e);
1774 pthread_mutex_lock (&memoryMutex);
1775 pthread_cond_wait (&memoryCond, &memoryMutex);
1776 pthread_mutex_unlock (&memoryMutex);
1778 if (ml->status != GE_NONE)
1780 g_print (_("%s: line: %d:Can't write ME memory entry number %d! Error: %d\n"),
1781 __FILE__, __LINE__, i + 1, ml->status);
1785 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), i + 1);
1789 /* Save SIM memory */
1790 for (i = memoryStatus.MaxME; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
1792 pbEntry = g_ptr_array_index (contactsMemory, i);
1795 g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
1796 pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
1797 (int) pbEntry->status);
1800 if (pbEntry->status == E_Changed || pbEntry->status == E_Deleted)
1802 if (pbEntry->status == E_Deleted)
1804 pbEntry->entry.Name[0] = '\0';
1805 pbEntry->entry.Number[0] = '\0';
1806 pbEntry->entry.Group = 5;
1809 pbEntry->entry.Location = i - memoryStatus.MaxME + 1;
1810 ml = (D_MemoryLocation *) g_malloc (sizeof (D_MemoryLocation));
1811 ml->entry = &(pbEntry->entry);
1812 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
1813 e->event = Event_WriteMemoryLocation;
1815 GUI_InsertEvent (e);
1816 pthread_mutex_lock (&memoryMutex);
1817 pthread_cond_wait (&memoryCond, &memoryMutex);
1818 pthread_mutex_unlock (&memoryMutex);
1820 if (ml->status != GE_NONE)
1822 g_print(_("%s: line %d:Can't write SM memory entry number %d! Error: %d\n"),
1823 __FILE__, __LINE__, i - memoryStatus.MaxME + 1, ml->status);
1827 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), i - memoryStatus.MaxME + 1);
1831 statusInfo.ch_ME = statusInfo.ch_SM = 0;
1832 RefreshStatusInfo ();
1833 gtk_widget_hide (progressDialog.dialog);
1838 static GtkWidget *CreateSaveQuestionDialog (GtkSignalFunc SaveFunc,
1839 GtkSignalFunc DontSaveFunc)
1842 GtkWidget *button, *label, *hbox, *pixmap;
1844 dialog = gtk_dialog_new ();
1845 gtk_window_set_title (GTK_WINDOW (dialog), _("Save changes?"));
1846 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1847 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
1848 gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
1849 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1850 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1852 button = gtk_button_new_with_label (_("Save"));
1853 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1854 button, TRUE, TRUE, 10);
1855 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1856 GTK_SIGNAL_FUNC (SaveFunc), (gpointer) dialog);
1857 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1858 gtk_widget_grab_default (button);
1859 gtk_widget_show (button);
1861 button = gtk_button_new_with_label (_("Don't save"));
1862 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
1863 button, TRUE, TRUE, 10);
1864 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1865 GTK_SIGNAL_FUNC (DontSaveFunc), (gpointer) dialog);
1866 gtk_widget_show (button);
1868 button = gtk_button_new_with_label (_("Cancel"));
1869 gtk_box_pack_start(GTK_BOX (GTK_DIALOG (dialog)->action_area),
1870 button, TRUE, TRUE, 10);
1871 gtk_signal_connect(GTK_OBJECT (button), "clicked",
1872 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
1873 gtk_widget_show (button);
1875 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
1877 hbox = gtk_hbox_new (FALSE, 0);
1878 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
1879 gtk_widget_show (hbox);
1881 pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
1882 gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 10);
1883 gtk_widget_show (pixmap);
1885 label = gtk_label_new (_("You have made changes in your\ncontacts directory.\n\
1886 \n\nDo you want save these changes into phone?\n"));
1887 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
1888 gtk_widget_show (label);
1894 static void OkExtPbkDialog (GtkWidget *w, gpointer data) {
1896 ExtPbkDialog *d=(ExtPbkDialog*)data;
1897 GSM_NumberType numtype;
1901 if (w==d->gbutton) numtype=GSM_General;
1902 else if (w==d->mbutton) numtype=GSM_Mobile;
1903 else if (w==d->wbutton) numtype=GSM_Work;
1904 else if (w==d->fbutton) numtype=GSM_Fax;
1905 else if (w==d->hbutton) numtype=GSM_Home;
1906 else numtype=GSM_General;
1908 /* Search through subentries */
1910 for (i=0;i<d->pbEntry->entry.SubEntriesCount;i++) {
1911 if (d->pbEntry->entry.SubEntries[i].EntryType==GSM_Number)
1912 if (d->pbEntry->entry.SubEntries[i].NumberType==numtype)
1916 if (found>i) { /* Not found */
1917 found=d->pbEntry->entry.SubEntriesCount;
1918 d->pbEntry->entry.SubEntriesCount++;
1919 d->pbEntry->entry.SubEntries[found].EntryType=GSM_Number;
1920 d->pbEntry->entry.SubEntries[found].NumberType=numtype;
1923 chars=gtk_editable_get_chars(GTK_EDITABLE(d->entry),0,-1);
1924 strcpy(d->pbEntry->entry.SubEntries[found].data.Number,chars);
1927 /* Update the entry dialog */
1928 EditPbEntry(d->pbEntry,d->row);
1930 gtk_widget_hide (d->dialog);
1934 void ExtPbkChanged (GtkWidget *widget, gpointer data )
1936 static ExtPbkDialog dialog = {NULL,NULL,0,NULL,NULL,NULL,NULL,NULL};
1938 static GtkWidget *label;
1942 if (dialog.dialog==NULL) {
1944 dialog.dialog=gtk_dialog_new();
1946 gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Which Extended Phonebook Entry?"));
1947 gtk_window_set_modal(GTK_WINDOW (dialog.dialog), TRUE);
1948 gtk_container_set_border_width (GTK_CONTAINER (dialog.dialog), 10);
1949 gtk_signal_connect (GTK_OBJECT (dialog.dialog), "delete_event",
1950 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1952 dialog.gbutton = gtk_button_new_with_label (_("General"));
1953 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1954 dialog.gbutton, TRUE, TRUE, 10);
1955 gtk_signal_connect (GTK_OBJECT (dialog.gbutton), "clicked",
1956 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1957 gtk_widget_show (dialog.gbutton);
1958 dialog.mbutton = gtk_button_new_with_label (_("Mobile"));
1959 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1960 dialog.mbutton, TRUE, TRUE, 10);
1961 gtk_signal_connect (GTK_OBJECT (dialog.mbutton), "clicked",
1962 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1963 gtk_widget_show (dialog.mbutton);
1964 dialog.wbutton = gtk_button_new_with_label (_("Work"));
1965 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1966 dialog.wbutton, TRUE, TRUE, 10);
1967 gtk_signal_connect (GTK_OBJECT (dialog.wbutton), "clicked",
1968 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1969 gtk_widget_show (dialog.wbutton);
1970 dialog.fbutton = gtk_button_new_with_label (_("Fax"));
1971 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1972 dialog.fbutton, TRUE, TRUE, 10);
1973 gtk_signal_connect (GTK_OBJECT (dialog.fbutton), "clicked",
1974 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1975 gtk_widget_show (dialog.fbutton);
1976 dialog.hbutton = gtk_button_new_with_label (_("Home"));
1977 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
1978 dialog.hbutton, TRUE, TRUE, 10);
1979 gtk_signal_connect (GTK_OBJECT (dialog.hbutton), "clicked",
1980 GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
1981 gtk_widget_show (dialog.hbutton);
1983 button = gtk_button_new_with_label (_("Cancel"));
1984 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->action_area),
1985 button, TRUE, TRUE, 10);
1986 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1987 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog.dialog);
1988 gtk_widget_show (button);
1990 label = gtk_label_new("");
1991 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox), label, FALSE, FALSE, 5);
1992 gtk_widget_show(label);
1995 chars=gtk_editable_get_chars(GTK_EDITABLE(widget),0,-1);
1996 gtk_label_set_text(GTK_LABEL(label),chars);
1998 dialog.pbEntry=((EditEntryData*)data)->pbEntry;
1999 dialog.row=((EditEntryData*)data)->row;
2000 dialog.entry=widget;
2001 gtk_widget_show(dialog.dialog);
2006 void GUI_RefreshContacts (void)
2008 PhonebookEntry *pbEntry;
2012 if (contactsMemoryInitialized == FALSE)
2015 gtk_clist_freeze (GTK_CLIST (clist));
2016 gtk_clist_clear (GTK_CLIST (clist));
2018 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2022 pbEntry = g_ptr_array_index (contactsMemory, i);
2023 if (pbEntry->status != E_Empty && pbEntry->status != E_Deleted)
2025 row[0] = pbEntry->entry.Name;
2027 row[1] = pbEntry->entry.Number;
2029 if (pbEntry->entry.MemoryType == GMT_ME)
2033 if (GetModelFeature(FN_CALLERGROUPS)!=0)
2034 row[3] = xgnokiiConfig.callerGroups[pbEntry->entry.Group];
2037 gtk_clist_append (GTK_CLIST (clist), row);
2038 if (pbEntry->entry.MemoryType == GMT_ME)
2039 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
2040 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
2042 gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
2043 memoryPixmaps.simMemPix, memoryPixmaps.mask);
2045 gtk_clist_set_row_data (GTK_CLIST (clist), row_i++, (gpointer) pbEntry);
2048 g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
2049 pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
2050 (int) pbEntry->status);
2054 gtk_clist_sort (GTK_CLIST (clist));
2055 gtk_clist_thaw (GTK_CLIST (clist));
2059 static gint InsertPBEntryME (GSM_PhonebookEntry *entry)
2061 PhonebookEntry *pbEntry;
2063 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2065 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2066 g_ptr_array_free (contactsMemory, TRUE);
2067 gtk_widget_hide (progressDialog.dialog);
2071 pbEntry->entry = *entry;
2073 if (*pbEntry->entry.Name == '\0' && *pbEntry->entry.Number == '\0')
2074 pbEntry->status = E_Empty;
2076 pbEntry->status = E_Unchanged;
2078 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2079 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), entry->Location);
2086 static gint InsertPBEntrySM (GSM_PhonebookEntry *entry)
2088 PhonebookEntry *pbEntry;
2090 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2092 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2093 g_ptr_array_free (contactsMemory, TRUE);
2094 gtk_widget_hide (progressDialog.dialog);
2098 pbEntry->entry = *entry;
2100 if (*pbEntry->entry.Name == '\0' && *pbEntry->entry.Number == '\0')
2101 pbEntry->status = E_Empty;
2104 pbEntry->status = E_Unchanged;
2107 memoryStatus.UsedSM++;
2108 memoryStatus.FreeSM--;
2112 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2113 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), entry->Location);
2120 static inline gint ReadFailedPBEntry (gint i)
2122 g_ptr_array_free (contactsMemory, TRUE);
2123 gtk_widget_hide (progressDialog.dialog);
2128 static void ReadContactsMain (void)
2132 D_MemoryLocationAll *mla;
2133 PhonebookEntry *pbEntry;
2138 if (contactsMemoryInitialized == TRUE)
2140 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2142 pbEntry = g_ptr_array_index (contactsMemory, i);
2145 g_ptr_array_free (contactsMemory, TRUE);
2146 contactsMemory = NULL;
2147 gtk_clist_clear (GTK_CLIST (clist));
2148 contactsMemoryInitialized = FALSE;
2149 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
2150 memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
2151 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2152 RefreshStatusInfo ();
2155 ms = (D_MemoryStatus *) g_malloc (sizeof (D_MemoryStatus));
2156 ms->memoryStatus.MemoryType = GMT_ME;
2157 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2158 e->event = Event_GetMemoryStatus;
2160 GUI_InsertEvent (e);
2161 pthread_mutex_lock (&memoryMutex);
2162 pthread_cond_wait (&memoryCond, &memoryMutex);
2163 pthread_mutex_unlock (&memoryMutex);
2165 if (ms->status != GE_NONE)
2166 /* Phone don't support ME (5110) */
2167 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME = 0;
2170 memoryStatus.MaxME = ms->memoryStatus.Used + ms->memoryStatus.Free;
2171 memoryStatus.UsedME = ms->memoryStatus.Used;
2172 memoryStatus.FreeME = ms->memoryStatus.Free;
2175 ms->memoryStatus.MemoryType = GMT_SM;
2176 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2177 e->event = Event_GetMemoryStatus;
2179 GUI_InsertEvent (e);
2180 pthread_mutex_lock (&memoryMutex);
2181 pthread_cond_wait (&memoryCond, &memoryMutex);
2182 pthread_mutex_unlock (&memoryMutex);
2184 if (ms->status != GE_NONE)
2186 fbus3810 = TRUE; /* I try to recognize memoryStatus.UsedSM while reading */
2187 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't get SM memory status!\n\n\
2188 Setting max SIM entries to 100!\n"));
2189 memoryStatus.MaxSM = memoryStatus.FreeSM = 100;
2190 memoryStatus.UsedSM = 0;
2191 gtk_widget_show (errorDialog.dialog);
2195 memoryStatus.MaxSM = ms->memoryStatus.Used + ms->memoryStatus.Free;
2196 memoryStatus.UsedSM = ms->memoryStatus.Used;
2197 memoryStatus.FreeSM = ms->memoryStatus.Free;
2201 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2203 RefreshStatusInfo ();
2205 if (progressDialog.dialog == NULL)
2207 CreateProgressDialog (memoryStatus.MaxME, memoryStatus.MaxSM);
2210 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), 0);
2211 gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), 0);
2212 gtk_window_set_title (GTK_WINDOW (progressDialog.dialog), _("Getting entries"));
2213 gtk_widget_show_now (progressDialog.dialog);
2215 contactsMemory = g_ptr_array_new ();
2217 mla = (D_MemoryLocationAll *) g_malloc (sizeof (D_MemoryLocationAll));
2218 if (memoryStatus.MaxME > 0)
2221 mla->max = memoryStatus.MaxME;
2223 mla->used = memoryStatus.UsedME; //MW
2224 mla->InsertEntry = InsertPBEntryME;
2225 mla->ReadFailed = ReadFailedPBEntry;
2227 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2228 e->event = Event_GetMemoryLocationAll;
2230 GUI_InsertEvent (e);
2231 pthread_mutex_lock (&memoryMutex);
2232 pthread_cond_wait (&memoryCond, &memoryMutex);
2233 pthread_mutex_unlock (&memoryMutex);
2235 if (mla->status != GE_NONE)
2238 gtk_widget_hide (progressDialog.dialog);
2244 mla->max = memoryStatus.MaxSM;
2246 mla->used = memoryStatus.UsedSM; //MW
2247 mla->InsertEntry = InsertPBEntrySM;
2248 mla->ReadFailed = ReadFailedPBEntry;
2250 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2251 e->event = Event_GetMemoryLocationAll;
2253 GUI_InsertEvent (e);
2254 pthread_mutex_lock (&memoryMutex);
2255 pthread_cond_wait (&memoryCond, &memoryMutex);
2256 pthread_mutex_unlock (&memoryMutex);
2258 if (mla->status != GE_NONE)
2261 gtk_widget_hide (progressDialog.dialog);
2267 gtk_widget_hide (progressDialog.dialog);
2269 contactsMemoryInitialized = TRUE;
2270 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2271 GUIEventSend (GUI_EVENT_CONTACTS_CHANGED);
2272 GUIEventSend (GUI_EVENT_SMS_NUMBER_CHANGED);
2276 static void ReadSaveCallback (GtkWidget *widget, gpointer data)
2278 gtk_widget_hide (GTK_WIDGET (data));
2280 ReadContactsMain ();
2284 static void ReadDontSaveCallback (GtkWidget *widget, gpointer data)
2286 gtk_widget_hide (GTK_WIDGET (data));
2287 ReadContactsMain ();
2291 static void ReadSaveContacts (void)
2293 static GtkWidget *dialog = NULL;
2296 dialog = CreateSaveQuestionDialog (ReadSaveCallback, ReadDontSaveCallback);
2298 gtk_widget_show (dialog);
2302 static void ReadContacts (void)
2304 if (contactsMemoryInitialized == TRUE && (statusInfo.ch_ME || statusInfo.ch_SM))
2305 ReadSaveContacts ();
2307 ReadContactsMain ();
2311 inline void GUI_ReadContacts (void)
2317 inline void GUI_SaveContacts (void)
2323 inline void GUI_ShowContacts (void)
2325 if (xgnokiiConfig.callerGroups[0] == NULL)
2328 GUI_InitCallerGroupsInf ();
2330 gtk_clist_set_column_visibility (GTK_CLIST (clist), 3, (GetModelFeature(FN_CALLERGROUPS)!=0));
2331 GUI_RefreshContacts ();
2332 gtk_widget_show (GUI_ContactsWindow);
2333 // if (!contactsMemoryInitialized)
2337 static void ExportVCARD (FILE *f)
2341 PhonebookEntry *pbEntry;
2343 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2345 pbEntry = g_ptr_array_index (contactsMemory, i);
2347 if (pbEntry->status == E_Deleted || pbEntry->status == E_Empty)
2350 fprintf (f, "BEGIN:VCARD\n");
2351 fprintf (f, "VERSION:3.0\n");
2352 fprintf (f, "FN:%s\n", pbEntry->entry.Name);
2353 fprintf (f, "TEL;PREF:%s\n", pbEntry->entry.Number);
2355 if (pbEntry->entry.MemoryType == GMT_ME)
2356 sprintf (buf2, "ME%d", i + 1);
2358 sprintf (buf2, "SM%d", i - memoryStatus.MaxME + 1);
2360 fprintf (f, "X_GSM_STORE_AT:%s\n", buf2);
2361 fprintf (f, "X_GSM_CALLERGROUP:%d\n", pbEntry->entry.Group);
2363 /* Add ext. pbk info if required */
2364 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
2365 for (j = 0; j < pbEntry->entry.SubEntriesCount; j++)
2367 if (pbEntry->entry.SubEntries[j].EntryType == GSM_Number)
2368 fprintf (f, "TEL;UNKNOWN_%d:%s\n", pbEntry->entry.SubEntries[j].NumberType,
2369 pbEntry->entry.SubEntries[j].data.Number);
2372 fprintf (f, "END:VCARD\n\n");
2379 static void ExportNative (FILE *f)
2381 gchar buf[IO_BUF_LEN], buf2[10];
2383 PhonebookEntry *pbEntry;
2386 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2388 pbEntry = g_ptr_array_index (contactsMemory, i);
2390 if (pbEntry->status != E_Deleted && pbEntry->status != E_Empty)
2392 if (index (pbEntry->entry.Name, ';') != NULL)
2395 strcat (buf, pbEntry->entry.Name);
2396 strcat (buf, "\";");
2400 strcpy (buf, pbEntry->entry.Name);
2404 if (index (pbEntry->entry.Number, ';') != NULL)
2407 strcat (buf, pbEntry->entry.Number);
2408 strcat (buf, "\";");
2412 strcat (buf, pbEntry->entry.Number);
2416 if (pbEntry->entry.MemoryType == GMT_ME)
2417 sprintf (buf2, "B;%d;%d;", i + 1, pbEntry->entry.Group);
2419 sprintf (buf2, "A;%d;%d;", i - memoryStatus.MaxME + 1, pbEntry->entry.Group);
2422 /* Add ext. pbk info if required */
2423 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT)
2425 for (j = 0; j < pbEntry->entry.SubEntriesCount; j++)
2426 if (pbEntry->entry.SubEntries[j].EntryType==GSM_Number)
2428 sprintf(buf2,"%d;",pbEntry->entry.SubEntries[j].NumberType);
2431 if (index (pbEntry->entry.SubEntries[j].data.Number, ';') != NULL)
2434 strcat (buf, pbEntry->entry.SubEntries[j].data.Number);
2435 strcat (buf, "\";");
2439 strcat (buf, pbEntry->entry.SubEntries[j].data.Number);
2444 fprintf (f, "%s\n", buf);
2452 static void ExportContactsMain (gchar *name)
2455 gchar buf[IO_BUF_LEN];
2457 if ((f = fopen (name, "w")) == NULL)
2459 g_snprintf (buf, IO_BUF_LEN, _("Can't open file %s for writing!"), name);
2460 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
2461 gtk_widget_show (errorDialog.dialog);
2465 if (strstr (name, ".vcard") || strstr (name, ".gcrd"))
2472 static void YesExportDialog (GtkWidget *w, gpointer data)
2474 gtk_widget_hide (GTK_WIDGET (data));
2475 ExportContactsMain (exportDialogData.fileName);
2479 static void OkExportDialog (GtkWidget *w, GtkFileSelection *fs)
2481 static YesNoDialog dialog = { NULL, NULL};
2485 exportDialogData.fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
2486 gtk_widget_hide (GTK_WIDGET (fs));
2488 if ((f = fopen (exportDialogData.fileName, "r")) != NULL)
2491 if (dialog.dialog == NULL)
2493 CreateYesNoDialog (&dialog, YesExportDialog, CancelDialog, GUI_ContactsWindow);
2494 gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
2495 g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), exportDialogData.fileName);
2496 gtk_label_set_text (GTK_LABEL(dialog.text), err);
2498 gtk_widget_show (dialog.dialog);
2501 ExportContactsMain (exportDialogData.fileName);
2505 static void ExportContacts (void)
2507 static GtkWidget *fileDialog = NULL;
2509 if (contactsMemoryInitialized)
2511 if (fileDialog == NULL)
2513 fileDialog = gtk_file_selection_new (_("Export"));
2514 gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
2515 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
2516 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
2517 "clicked", GTK_SIGNAL_FUNC (OkExportDialog), (gpointer) fileDialog);
2518 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
2519 "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
2522 gtk_widget_show (fileDialog);
2527 static bool ParseLine (GSM_PhonebookEntry *entry, gint *num, gchar *buf)
2529 register gint i = 0;
2534 entry->Empty = FALSE;
2535 entry->SubEntriesCount=0;
2541 while (i < len && i <= GSM_MAX_PHONEBOOK_NAME_LENGTH && buf[i] != '"')
2543 entry->Name[i - 1] = buf[i];
2546 entry->Name[i - 1] = '\0';
2549 if (buf[++i] != ';')
2554 while (i < len && i < GSM_MAX_PHONEBOOK_NAME_LENGTH && buf[i] != ';')
2556 entry->Name[i] = buf[i];
2559 entry->Name[i] = '\0';
2572 while (i < len && i <= GSM_MAX_PHONEBOOK_NUMBER_LENGTH && buf[i] != '"')
2574 entry->Number[i - 1] = buf[i];
2577 entry->Number[i - 1] = '\0';
2580 if (buf[++i] != ';')
2585 while (i < len && i < GSM_MAX_PHONEBOOK_NUMBER_LENGTH && buf[i] != ';')
2587 entry->Number[i] = buf[i];
2590 entry->Number[i] = '\0';
2599 if (!strncmp(buf, "B;", 2))
2601 entry->MemoryType = GMT_ME;
2605 if (!strncmp(buf, "A;", 2))
2607 entry->MemoryType = GMT_SM;
2611 if (!strncmp(buf, "ME;", 3))
2613 entry->MemoryType = GMT_ME;
2617 if (!strncmp(buf, "SM;", 3))
2619 entry->MemoryType = GMT_SM;
2626 while (i < len && i < 4 && buf[i] != ';')
2639 *num = strtol (s_num, &endptr, 10);
2640 if (s_num == endptr)
2642 if (*num == LONG_MIN || *num == LONG_MAX)
2646 if ( *buf == '\n' || *buf == '\r') /* for compatibility with NCDS */
2651 while (i < len && i < 4 && buf[i] != ';')
2662 entry->Group = strtol (s_num, &endptr, 10);
2663 if (s_num == endptr)
2665 if (entry->Group == LONG_MIN || entry->Group == LONG_MAX)
2667 if (entry->Group < 0 || entry->Group > 5)
2673 /* Ext Pbk Support */
2677 entry->SubEntries[entry->SubEntriesCount].EntryType=GSM_Number;
2679 while (i < len && i < 4 && buf[i] != ';')
2689 entry->SubEntries[entry->SubEntriesCount].NumberType=(GSM_NumberType)strtol (s_num, &endptr, 10);
2690 if (s_num == endptr)
2695 while (i < len && i < GSM_MAX_PHONEBOOK_TEXT_LENGTH && buf[i] != ';')
2697 entry->SubEntries[entry->SubEntriesCount].data.Number[i] = buf[i];
2700 entry->SubEntries[entry->SubEntriesCount].data.Number[i] = '\0';
2705 entry->SubEntriesCount++;
2713 static void OkImportDialog (GtkWidget *w, GtkFileSelection *fs)
2718 PhonebookEntry *pbEntry;
2719 GSM_PhonebookEntry gsmEntry;
2720 gchar buf[IO_BUF_LEN];
2724 fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
2725 gtk_widget_hide (GTK_WIDGET (fs));
2727 if ((f = fopen (fileName, "r")) == NULL)
2729 g_snprintf (buf, IO_BUF_LEN, _("Can't open file %s for reading!"), fileName);
2730 gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
2731 gtk_widget_show (errorDialog.dialog);
2735 if (contactsMemoryInitialized == TRUE)
2737 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
2739 pbEntry = g_ptr_array_index(contactsMemory, i);
2742 g_ptr_array_free (contactsMemory, TRUE);
2743 contactsMemory = NULL;
2744 gtk_clist_clear (GTK_CLIST (clist));
2745 contactsMemoryInitialized = FALSE;
2746 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
2747 memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
2748 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2749 RefreshStatusInfo ();
2752 ms = (D_MemoryStatus *) g_malloc (sizeof (D_MemoryStatus));
2753 ms->memoryStatus.MemoryType = GMT_ME;
2754 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2755 e->event = Event_GetMemoryStatus;
2757 GUI_InsertEvent (e);
2758 pthread_mutex_lock (&memoryMutex);
2759 pthread_cond_wait (&memoryCond, &memoryMutex);
2760 pthread_mutex_unlock (&memoryMutex);
2762 if (ms->status != GE_NONE)
2763 /* Phone don't support ME (5110) */
2764 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME = 0;
2767 memoryStatus.MaxME = ms->memoryStatus.Used + ms->memoryStatus.Free;
2768 memoryStatus.UsedME = 0;
2769 memoryStatus.FreeME = memoryStatus.MaxME;
2772 ms->memoryStatus.MemoryType = GMT_SM;
2773 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2774 e->event = Event_GetMemoryStatus;
2776 GUI_InsertEvent (e);
2777 pthread_mutex_lock (&memoryMutex);
2778 pthread_cond_wait (&memoryCond, &memoryMutex);
2779 pthread_mutex_unlock (&memoryMutex);
2781 if (ms->status != GE_NONE)
2783 gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't get SM memory status!\n\n\
2784 Setting max SIM entries set to 100!\n"));
2785 memoryStatus.MaxSM = memoryStatus.FreeSM = 100;
2786 memoryStatus.UsedSM = 0;
2787 gtk_widget_show (errorDialog.dialog);
2791 memoryStatus.MaxSM = ms->memoryStatus.Used + ms->memoryStatus.Free;
2792 memoryStatus.UsedSM = 0;
2793 memoryStatus.FreeSM = memoryStatus.MaxSM;
2797 statusInfo.ch_ME = statusInfo.ch_SM = 0;
2799 RefreshStatusInfo ();
2801 contactsMemory = g_ptr_array_new ();
2803 for (i = 1; i <= memoryStatus.MaxME; i++)
2805 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2808 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2809 g_ptr_array_free (contactsMemory, TRUE);
2813 pbEntry->entry.Empty = FALSE;
2814 pbEntry->entry.Name[0] = '\0';
2815 pbEntry->entry.Number[0] = '\0';
2816 pbEntry->entry.MemoryType = GMT_ME;
2817 pbEntry->entry.Group = 5;
2818 pbEntry->status = E_Deleted; /* I must set status to E_Deleted, since I */
2819 /* I want clear empty entries when saving to */
2821 pbEntry->entry.SubEntriesCount=0;
2823 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2827 for (i = 1; i <= memoryStatus.MaxSM; i++)
2829 if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
2832 g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
2833 g_ptr_array_free (contactsMemory, TRUE);
2837 pbEntry->entry.Empty = FALSE;
2838 pbEntry->entry.Name[0] = '\0';
2839 pbEntry->entry.Number[0] = '\0';
2840 pbEntry->entry.MemoryType = GMT_SM;
2841 pbEntry->entry.Group = 5;
2842 pbEntry->status = E_Deleted;
2843 pbEntry->entry.SubEntriesCount=0;
2845 g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
2850 while (fgets (buf, IO_BUF_LEN, f))
2852 if (ParseLine (&gsmEntry, &i, buf))
2854 if (gsmEntry.MemoryType == GMT_ME && memoryStatus.FreeME > 0
2855 && i > 0 && i <= memoryStatus.MaxME)
2857 pbEntry = g_ptr_array_index (contactsMemory, i - 1);
2859 if (pbEntry->status == E_Deleted)
2861 pbEntry->entry = gsmEntry;
2862 pbEntry->status = E_Changed;
2863 memoryStatus.UsedME++;
2864 memoryStatus.FreeME--;
2865 statusInfo.ch_ME = 1;
2868 else if (gsmEntry.MemoryType == GMT_SM && memoryStatus.FreeSM > 0
2869 && i > 0 && i <= memoryStatus.MaxSM)
2871 pbEntry = g_ptr_array_index (contactsMemory, memoryStatus.MaxME + i - 1);
2873 if (pbEntry->status == E_Deleted)
2875 pbEntry->entry = gsmEntry;
2876 pbEntry->status = E_Changed;
2877 memoryStatus.UsedSM++;
2878 memoryStatus.FreeSM--;
2879 statusInfo.ch_SM = 1;
2885 contactsMemoryInitialized = TRUE;
2886 RefreshStatusInfo ();
2887 GUIEventSend (GUI_EVENT_CONTACTS_CHANGED);
2888 GUIEventSend (GUI_EVENT_SMS_NUMBER_CHANGED);
2892 static void ImportContactsFileDialog ()
2894 static GtkWidget *fileDialog = NULL;
2896 if (fileDialog == NULL)
2898 fileDialog = gtk_file_selection_new (_("Import"));
2899 gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
2900 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
2901 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
2902 "clicked", GTK_SIGNAL_FUNC (OkImportDialog), (gpointer) fileDialog);
2903 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
2904 "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
2907 gtk_widget_show (fileDialog);
2911 static void ImportSaveCallback (GtkWidget *widget, gpointer data)
2913 gtk_widget_hide (GTK_WIDGET (data));
2915 ImportContactsFileDialog ();
2919 static void ImportDontSaveCallback (GtkWidget *widget, gpointer data)
2921 gtk_widget_hide (GTK_WIDGET (data));
2922 ImportContactsFileDialog ();
2926 void static ImportSaveContacts (void)
2928 static GtkWidget *dialog = NULL;
2931 dialog = CreateSaveQuestionDialog (ImportSaveCallback, ImportDontSaveCallback);
2933 gtk_widget_show (dialog);
2937 static void ImportContacts (void)
2939 if (contactsMemoryInitialized == TRUE && (statusInfo.ch_ME || statusInfo.ch_SM))
2940 ImportSaveContacts ();
2942 ImportContactsFileDialog ();
2946 static void QuitSaveCallback (GtkWidget *widget, gpointer data)
2950 gtk_widget_hide (GTK_WIDGET (data));
2952 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2953 e->event = Event_Exit;
2955 GUI_InsertEvent (e);
2956 pthread_join (monitor_th, NULL);
2961 static void QuitDontSaveCallback (GtkWidget *widget, gpointer data)
2965 gtk_widget_hide (GTK_WIDGET (data));
2966 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
2967 e->event = Event_Exit;
2969 GUI_InsertEvent (e);
2970 pthread_join (monitor_th, NULL);
2975 void GUI_QuitSaveContacts (void)
2977 static GtkWidget *dialog = NULL;
2980 dialog = CreateSaveQuestionDialog (QuitSaveCallback, QuitDontSaveCallback);
2982 gtk_widget_show (dialog);
2986 /* Function take number and return name belonged to number.
2987 If no name is found, return NULL;
2988 Do not modify returned name!
2990 gchar *GUI_GetName (gchar *number)
2992 PhonebookEntry *pbEntry;
2995 if (contactsMemoryInitialized == FALSE || number == NULL)
2996 return (gchar *)NULL;
2998 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3000 pbEntry = g_ptr_array_index (contactsMemory, i);
3002 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3005 if (strcmp (pbEntry->entry.Number, number) == 0)
3006 return pbEntry->entry.Name;
3009 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3011 pbEntry = g_ptr_array_index (contactsMemory, i);
3013 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3016 if (strrncmp (pbEntry->entry.Number, number, 9) == 0)
3017 return pbEntry->entry.Name;
3024 gchar *GUI_GetNameExact (gchar *number)
3026 PhonebookEntry *pbEntry;
3029 if (contactsMemoryInitialized == FALSE || number == NULL)
3030 return (gchar *)NULL;
3032 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3034 pbEntry = g_ptr_array_index (contactsMemory, i);
3036 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3039 if (strcmp (pbEntry->entry.Number, number) == 0)
3040 return pbEntry->entry.Name;
3047 gchar *GUI_GetNumber (gchar *name)
3049 PhonebookEntry *pbEntry;
3052 if (contactsMemoryInitialized == FALSE || name == NULL || *name == '\0')
3053 return (gchar *)NULL;
3055 for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3057 pbEntry = g_ptr_array_index (contactsMemory, i);
3059 if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
3062 if (strcmp (pbEntry->entry.Name, name) == 0)
3063 return pbEntry->entry.Number;
3070 static void SelectDialogClickEntry (GtkWidget *clist,
3073 GdkEventButton *event,
3074 SelectContactData *data )
3076 if(event && event->type == GDK_2BUTTON_PRESS)
3077 gtk_signal_emit_by_name(GTK_OBJECT (data->okButton), "clicked");
3081 SelectContactData *GUI_SelectContactDialog (void)
3083 PhonebookEntry *pbEntry;
3084 static SelectContactData selectContactData;
3085 SortColumn *sColumn;
3086 gchar *titles[4] = { "Name", "Number", "Memory", "Group"};
3091 if (contactsMemoryInitialized == FALSE)
3094 selectContactData.dialog = gtk_dialog_new ();
3095 gtk_widget_set_usize (GTK_WIDGET (selectContactData.dialog), 436, 200);
3096 gtk_window_set_title (GTK_WINDOW (selectContactData.dialog), _("Select contacts"));
3097 gtk_window_set_modal (GTK_WINDOW (selectContactData.dialog), TRUE);
3099 selectContactData.okButton = gtk_button_new_with_label (_("Ok"));
3100 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->action_area),
3101 selectContactData.okButton, TRUE, TRUE, 10);
3102 GTK_WIDGET_SET_FLAGS (selectContactData.okButton, GTK_CAN_DEFAULT);
3103 gtk_widget_grab_default (selectContactData.okButton);
3104 gtk_widget_show (selectContactData.okButton);
3106 selectContactData.cancelButton = gtk_button_new_with_label (_("Cancel"));
3107 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->action_area),
3108 selectContactData.cancelButton, TRUE, TRUE, 10);
3109 gtk_widget_show (selectContactData.cancelButton);
3111 selectContactData.clist = gtk_clist_new_with_titles (4, titles);
3112 gtk_clist_set_shadow_type (GTK_CLIST (selectContactData.clist), GTK_SHADOW_OUT);
3113 gtk_clist_set_compare_func (GTK_CLIST (selectContactData.clist), CListCompareFunc);
3114 gtk_clist_set_sort_column (GTK_CLIST (selectContactData.clist), 0);
3115 gtk_clist_set_sort_type (GTK_CLIST (selectContactData.clist), GTK_SORT_ASCENDING);
3116 gtk_clist_set_auto_sort (GTK_CLIST (selectContactData.clist), FALSE);
3117 gtk_clist_set_selection_mode (GTK_CLIST (selectContactData.clist), GTK_SELECTION_EXTENDED);
3119 gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 0, 150);
3120 gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 1, 115);
3121 gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 3, 70);
3122 gtk_clist_set_column_justification (GTK_CLIST(selectContactData.clist), 2, GTK_JUSTIFY_CENTER);
3123 gtk_clist_set_column_visibility (GTK_CLIST(selectContactData.clist), 3, (GetModelFeature(FN_CALLERGROUPS)!=0));
3125 for (i = 0; i < 4; i++)
3127 if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
3129 g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
3132 sColumn->clist = selectContactData.clist;
3133 sColumn->column = i;
3134 gtk_signal_connect (GTK_OBJECT (GTK_CLIST (selectContactData.clist)->column[i].button), "clicked",
3135 GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
3138 gtk_signal_connect (GTK_OBJECT (selectContactData.clist), "select_row",
3139 GTK_SIGNAL_FUNC (SelectDialogClickEntry),
3140 (gpointer) &selectContactData);
3142 selectContactData.clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
3143 gtk_container_add (GTK_CONTAINER (selectContactData.clistScrolledWindow),
3144 selectContactData.clist);
3145 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selectContactData.clistScrolledWindow),
3146 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3147 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->vbox),
3148 selectContactData.clistScrolledWindow,
3151 gtk_widget_show (selectContactData.clist);
3152 gtk_widget_show (selectContactData.clistScrolledWindow);
3154 if (xgnokiiConfig.callerGroups[0] == NULL)
3155 GUI_InitCallerGroupsInf ();
3157 gtk_clist_freeze (GTK_CLIST (selectContactData.clist));
3158 for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
3162 pbEntry = g_ptr_array_index (contactsMemory, i);
3163 if (pbEntry->status != E_Empty && pbEntry->status != E_Deleted)
3165 row[0] = pbEntry->entry.Name;
3167 if (pbEntry->entry.SubEntriesCount>0) {
3168 snprintf(string,100,"%s *",pbEntry->entry.Number);
3170 } else row[1] = pbEntry->entry.Number;
3173 if (pbEntry->entry.MemoryType == GMT_ME)
3177 if (GetModelFeature(FN_CALLERGROUPS)!=0)
3178 row[3] = xgnokiiConfig.callerGroups[pbEntry->entry.Group];
3181 gtk_clist_append (GTK_CLIST (selectContactData.clist), row);
3182 if (pbEntry->entry.MemoryType == GMT_ME)
3183 gtk_clist_set_pixmap (GTK_CLIST (selectContactData.clist), row_i, 2,
3184 memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
3186 gtk_clist_set_pixmap (GTK_CLIST (selectContactData.clist), row_i, 2,
3187 memoryPixmaps.simMemPix, memoryPixmaps.mask);
3189 gtk_clist_set_row_data (GTK_CLIST (selectContactData.clist), row_i++, (gpointer) pbEntry);
3193 gtk_clist_sort (GTK_CLIST (selectContactData.clist));
3194 gtk_clist_thaw (GTK_CLIST (selectContactData.clist));
3196 gtk_widget_show (selectContactData.dialog);
3198 return &selectContactData;
3202 static GtkItemFactoryEntry menu_items[] = {
3203 { NULL, NULL, NULL, 0, "<Branch>"},
3204 { NULL, "<control>R", ReadContacts, 0, NULL},
3205 { NULL, "<control>S", SaveContacts, 0, NULL},
3206 { NULL, NULL, NULL, 0, "<Separator>"},
3207 { NULL, "<control>I", ImportContacts, 0, NULL},
3208 { NULL, "<control>E", ExportContacts, 0, NULL},
3209 { NULL, NULL, NULL, 0, "<Separator>"},
3210 { NULL, "<control>W", CloseContacts, 0, NULL},
3211 { NULL, NULL, NULL, 0, "<Branch>"},
3212 { NULL, "<control>N", NewEntry, 0, NULL},
3213 { NULL, "<control>U", DuplicateEntry, 0, NULL},
3214 { NULL, NULL, EditEntry, 0, NULL},
3215 { NULL, "<control>D", DeleteEntry, 0, NULL},
3216 { NULL, NULL, NULL, 0, "<Separator>"},
3217 { NULL, "<control>C", ChMemType, 0, NULL},
3218 { NULL, NULL, NULL, 0, "<Separator>"},
3219 { NULL, "<control>F", FindFirstEntry, 0, NULL},
3220 { NULL, "<control>L", SearchEntry, 0, NULL},
3221 { NULL, NULL, NULL, 0, "<Separator>"},
3222 { NULL, "<control>A", SelectAll, 0, NULL},
3223 { NULL, NULL, NULL, 0, "<Branch>"},
3224 { NULL, "<control>V", DialVoice, 0, NULL},
3225 { NULL, NULL, NULL, 0, "<LastBranch>"},
3226 { NULL, NULL, Help1, 0, NULL},
3227 { NULL, NULL, GUI_ShowAbout, 0, NULL},
3231 static void InitMainMenu (void)
3233 menu_items[0].path = g_strdup (_("/_File"));
3234 menu_items[1].path = g_strdup (_("/File/_Read from phone"));
3235 menu_items[2].path = g_strdup (_("/File/_Save to phone"));
3236 menu_items[3].path = g_strdup (_("/File/Sep1"));
3237 menu_items[4].path = g_strdup (_("/File/_Import from file"));
3238 menu_items[5].path = g_strdup (_("/File/_Export to file"));
3239 menu_items[6].path = g_strdup (_("/File/Sep2"));
3240 menu_items[7].path = g_strdup (_("/File/_Close"));
3241 menu_items[8].path = g_strdup (_("/_Edit"));
3242 menu_items[9].path = g_strdup (_("/Edit/_New"));
3243 menu_items[10].path = g_strdup (_("/Edit/D_uplicate"));
3244 menu_items[11].path = g_strdup (_("/Edit/_Edit"));
3245 menu_items[12].path = g_strdup (_("/Edit/_Delete"));
3246 menu_items[13].path = g_strdup (_("/Edit/Sep3"));
3247 menu_items[14].path = g_strdup (_("/Edit/_Change memory type"));
3248 menu_items[15].path = g_strdup (_("/Edit/Sep4"));
3249 menu_items[16].path = g_strdup (_("/Edit/_Find"));
3250 menu_items[17].path = g_strdup (_("/Edit/Find ne_xt"));
3251 menu_items[18].path = g_strdup (_("/Edit/Sep5"));
3252 menu_items[19].path = g_strdup (_("/Edit/Select _all"));
3253 menu_items[20].path = g_strdup (_("/_Dial"));
3254 menu_items[21].path = g_strdup (_("/Dial/Dial _voice"));
3255 menu_items[22].path = g_strdup (_("/_Help"));
3256 menu_items[23].path = g_strdup (_("/Help/_Help"));
3257 menu_items[24].path = g_strdup (_("/Help/_About"));
3261 void GUI_CreateContactsWindow (void)
3263 int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
3264 GtkItemFactory *item_factory;
3265 GtkAccelGroup *accel_group;
3266 SortColumn *sColumn;
3268 GtkWidget *main_vbox;
3270 GtkWidget *clistScrolledWindow;
3271 GtkWidget *status_hbox;
3273 gchar *titles[4] = { _("Name"), _("Number"), _("Memory"), _("Group")};
3276 contactsMemoryInitialized = FALSE;
3277 GUI_ContactsWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3278 gtk_window_set_title (GTK_WINDOW (GUI_ContactsWindow), _("Contacts"));
3279 gtk_widget_set_usize (GTK_WIDGET (GUI_ContactsWindow), 436, 220);
3280 //gtk_container_set_border_width (GTK_CONTAINER (GUI_ContactsWindow), 10);
3281 gtk_signal_connect (GTK_OBJECT (GUI_ContactsWindow), "delete_event",
3282 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
3283 gtk_widget_realize (GUI_ContactsWindow);
3285 accel_group = gtk_accel_group_new ();
3286 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
3289 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
3291 gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_ContactsWindow));
3293 /* Finally, return the actual menu bar created by the item factory. */
3294 menubar = gtk_item_factory_get_widget (item_factory, "<main>");
3296 main_vbox = gtk_vbox_new (FALSE, 1);
3297 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
3298 gtk_container_add (GTK_CONTAINER (GUI_ContactsWindow), main_vbox);
3299 gtk_widget_show (main_vbox);
3301 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
3302 gtk_widget_show (menubar);
3304 /* Create the toolbar */
3306 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
3307 gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
3309 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Read from phone"), NULL,
3310 NewPixmap(Read_xpm, GUI_ContactsWindow->window,
3311 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3312 (GtkSignalFunc) ReadContacts, NULL);
3313 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Save to phone"), NULL,
3314 NewPixmap(Send_xpm, GUI_ContactsWindow->window,
3315 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3316 (GtkSignalFunc) SaveContacts, NULL);
3318 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
3320 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Import from file"), NULL,
3321 NewPixmap(Open_xpm, GUI_ContactsWindow->window,
3322 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3323 (GtkSignalFunc) ImportContacts, NULL);
3324 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Export to file"), NULL,
3325 NewPixmap(Save_xpm, GUI_ContactsWindow->window,
3326 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3327 (GtkSignalFunc) ExportContacts, NULL);
3329 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
3331 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("New entry"), NULL,
3332 NewPixmap(New_xpm, GUI_ContactsWindow->window,
3333 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3334 (GtkSignalFunc) NewEntry, NULL);
3335 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Duplicate entry"), NULL,
3336 NewPixmap(Duplicate_xpm, GUI_ContactsWindow->window,
3337 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3338 (GtkSignalFunc) DuplicateEntry, NULL);
3339 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Edit entry"), NULL,
3340 NewPixmap(Edit_xpm, GUI_ContactsWindow->window,
3341 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3342 (GtkSignalFunc) EditEntry, NULL);
3343 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Delete entry"), NULL,
3344 NewPixmap(Delete_xpm, GUI_ContactsWindow->window,
3345 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3346 (GtkSignalFunc) DeleteEntry, NULL);
3348 gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
3350 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Dial voice"), NULL,
3351 NewPixmap(Dial_xpm, GUI_ContactsWindow->window,
3352 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
3353 (GtkSignalFunc) DialVoice, NULL);
3355 // gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
3357 gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
3358 gtk_widget_show (toolbar);
3361 clist = gtk_clist_new_with_titles (4, titles);
3362 gtk_clist_set_shadow_type (GTK_CLIST (clist), GTK_SHADOW_OUT);
3363 gtk_clist_set_compare_func (GTK_CLIST (clist), CListCompareFunc);
3364 gtk_clist_set_sort_column (GTK_CLIST (clist), 0);
3365 gtk_clist_set_sort_type (GTK_CLIST (clist), GTK_SORT_ASCENDING);
3366 gtk_clist_set_auto_sort (GTK_CLIST (clist), FALSE);
3367 gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
3369 gtk_clist_set_column_width (GTK_CLIST (clist), 0, 150);
3370 gtk_clist_set_column_width (GTK_CLIST (clist), 1, 115);
3371 gtk_clist_set_column_width (GTK_CLIST (clist), 3, 70);
3372 gtk_clist_set_column_justification (GTK_CLIST (clist), 2, GTK_JUSTIFY_CENTER);
3373 // gtk_clist_set_column_visibility (GTK_CLIST (clist), 3, (GetModelFeature(FN_CALLERGROUPS)!=0));
3375 for (i = 0; i < 4; i++)
3377 if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
3379 g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
3382 sColumn->clist = clist;
3383 sColumn->column = i;
3384 gtk_signal_connect (GTK_OBJECT (GTK_CLIST (clist)->column[i].button), "clicked",
3385 GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
3388 gtk_signal_connect (GTK_OBJECT (clist), "select_row",
3389 GTK_SIGNAL_FUNC (ClickEntry), NULL);
3391 clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
3392 gtk_container_add (GTK_CONTAINER (clistScrolledWindow), clist);
3393 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clistScrolledWindow),
3394 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3395 gtk_box_pack_start (GTK_BOX (main_vbox), clistScrolledWindow,
3398 gtk_widget_show (clist);
3399 gtk_widget_show (clistScrolledWindow);
3401 status_hbox = gtk_hbox_new (FALSE,20);
3402 gtk_box_pack_start (GTK_BOX (main_vbox), status_hbox, FALSE, FALSE, 0);
3403 gtk_widget_show (status_hbox);
3405 memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
3406 memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
3407 statusInfo.ch_ME = statusInfo.ch_SM = 0;
3409 statusInfo.label = gtk_label_new ("");
3410 RefreshStatusInfo ();
3411 gtk_box_pack_start (GTK_BOX (status_hbox), statusInfo.label, FALSE, FALSE, 10);
3412 gtk_widget_show (statusInfo.label);
3414 memoryPixmaps.simMemPix = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
3415 &memoryPixmaps.mask,
3416 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
3419 memoryPixmaps.phoneMemPix = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
3420 &memoryPixmaps.mask,
3421 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
3424 questMark.pixmap = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
3426 &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
3429 CreateErrorDialog (&errorDialog, GUI_ContactsWindow);
3430 GUIEventAdd (GUI_EVENT_CONTACTS_CHANGED, GUI_RefreshContacts);
3431 GUIEventAdd (GUI_EVENT_CALLERS_GROUPS_CHANGED, GUI_RefreshGroupMenu);