--- /dev/null
+/*
+
+ X G N O K I I
+
+ A Linux/Unix GUI for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ $Id$
+
+*/
+
+
+#include "misc.h"
+
+#include <stdio.h>
+#include <pthread.h>
+
+#ifndef WIN32
+# include <unistd.h>
+#else
+# include <windows.h>
+# define sleep(x) Sleep((x) * 1000)
+# define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
+# define index strchr
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#if __unices__
+# include <strings.h>
+#endif
+#include <gtk/gtk.h>
+
+#include "gsm-api.h"
+#include "gsm-common.h"
+#include "xgnokii_contacts.h"
+#include "xgnokii_lowlevel.h"
+#include "xgnokii.h"
+#include "xgnokii_common.h"
+#include "xgnokii_lowlevel.h"
+#include "xgnokii_sms.h"
+#include "xpm/Read.xpm"
+#include "xpm/Send.xpm"
+#include "xpm/Open.xpm"
+#include "xpm/Save.xpm"
+#include "xpm/New.xpm"
+#include "xpm/Duplicate.xpm"
+#include "xpm/Edit.xpm"
+#include "xpm/Delete.xpm"
+#include "xpm/Dial.xpm"
+#include "xpm/sim.xpm"
+#include "xpm/phone.xpm"
+#include "xpm/quest.xpm"
+
+
+typedef struct {
+ GtkWidget *dialog;
+ GtkWidget *entry;
+} DialVoiceDialog;
+
+typedef struct {
+ GtkWidget *dialog;
+ GtkWidget *entry;
+ gint row;
+ GtkWidget *gbutton;
+ GtkWidget *mbutton;
+ GtkWidget *wbutton;
+ GtkWidget *fbutton;
+ GtkWidget *hbutton;
+ PhonebookEntry *pbEntry;
+} ExtPbkDialog;
+
+static GtkWidget *GUI_ContactsWindow;
+static bool fbus3810;
+static bool contactsMemoryInitialized;
+static MemoryStatus memoryStatus;
+static ContactsMemory contactsMemory; /* Hold contacts. */
+static GtkWidget *clist;
+static StatusInfo statusInfo;
+static ProgressDialog progressDialog = {NULL, NULL, NULL};
+static ErrorDialog errorDialog = {NULL, NULL};
+static FindEntryStruct findEntryStruct = { "", 0};
+static ExportDialogData exportDialogData = {NULL};
+static MemoryPixmaps memoryPixmaps;
+static QuestMark questMark;
+static EditEntryData newEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+static EditEntryData editEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+static EditEntryData duplicateEditEntryData = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+static EditNumbersData editNumbersData = {NULL, NULL};
+
+/* return != 0 if user has unsaved changes in contacts memory */
+inline gint GUI_ContactsIsChanged (void)
+{
+ return statusInfo.ch_ME | statusInfo.ch_SM;
+}
+
+
+/* return TRUE if Contacts memory was read from phone or from file */
+inline bool GUI_ContactsIsIntialized (void)
+{
+ return contactsMemoryInitialized;
+}
+
+
+static inline void Help1 (GtkWidget *w, gpointer data)
+{
+ gchar *indx = g_strdup_printf ("/help/%s/windows/contacts/index.html", xgnokiiConfig.locale);
+ Help (w, indx);
+ g_free (indx);
+}
+
+
+void RefreshStatusInfo (void)
+{
+ char p,s;
+
+ if (statusInfo.ch_ME)
+ p = '*';
+ else
+ p = ' ';
+
+ if (statusInfo.ch_SM)
+ s = '*';
+ else
+ s = ' ';
+ g_snprintf(statusInfo.text, STATUS_INFO_LENGTH, "SIM: %d/%d%c Phone: %d/%d%c",
+ memoryStatus.UsedSM, memoryStatus.MaxSM, s,
+ memoryStatus.UsedME, memoryStatus.MaxME, p);
+ gtk_label_set_text(GTK_LABEL (statusInfo.label), statusInfo.text);
+}
+
+
+static inline void SetGroup0 (GtkWidget *item, gpointer data)
+{
+ ((EditEntryData *) data)->newGroup = 0;
+}
+
+
+static inline void SetGroup1 (GtkWidget *item, gpointer data)
+{
+ ((EditEntryData *) data)->newGroup = 1;
+}
+
+
+static inline void SetGroup2 (GtkWidget *item, gpointer data)
+{
+ ((EditEntryData *) data)->newGroup = 2;
+}
+
+
+static inline void SetGroup3 (GtkWidget *item, gpointer data)
+{
+ ((EditEntryData *) data)->newGroup = 3;
+}
+
+
+static inline void SetGroup4 (GtkWidget *item, gpointer data)
+{
+ ((EditEntryData *) data)->newGroup = 4;
+}
+
+
+static inline void SetGroup5 (GtkWidget *item, gpointer data)
+{
+ ((EditEntryData *) data)->newGroup = 5;
+}
+
+
+PhonebookEntry *FindFreeEntry (GSM_MemoryType type)
+{
+ PhonebookEntry *entry;
+ gint start, end;
+ register gint i;
+
+ if (type == GMT_ME)
+ {
+ if (memoryStatus.FreeME == 0)
+ return NULL;
+ start = 0;
+ end = memoryStatus.MaxME;
+ }
+ else
+ {
+ if (memoryStatus.FreeSM == 0)
+ return NULL;
+ start = memoryStatus.MaxME;
+ end = memoryStatus.MaxME + memoryStatus.MaxSM;
+ }
+
+ for(i = start; i < end; i++)
+ {
+ entry = g_ptr_array_index(contactsMemory, i);
+ if (entry->status == E_Empty || entry->status == E_Deleted)
+ return entry;
+ }
+
+ return NULL;
+}
+
+
+inline PhonebookEntry *GUI_GetEntry (GSM_MemoryType type, gint nr)
+{
+ if ((type == GMT_ME && (nr < 1 || nr >= memoryStatus.MaxME)) ||
+ (type == GMT_SM && (nr < 1 || nr >= memoryStatus.MaxSM)))
+ return NULL;
+
+ if (type == GMT_ME)
+ return g_ptr_array_index (contactsMemory, nr - 1);
+ else
+ return g_ptr_array_index (contactsMemory, nr + memoryStatus.MaxME - 1);
+}
+
+
+static void CloseContacts (GtkWidget *w, gpointer data)
+{
+ gtk_widget_hide (GUI_ContactsWindow);
+}
+
+
+/* I don't want to allow window to close */
+static void ProgressDialogDeleteEvent (GtkWidget *w, gpointer data)
+{
+ return;
+}
+
+
+static void CancelEditDialog (GtkWidget *widget, gpointer data )
+{
+ gtk_widget_hide(GTK_WIDGET(((EditEntryData*) data)->dialog));
+}
+
+
+
+static void OkEditEntryDialog (GtkWidget *widget, gpointer data)
+{
+ gchar *clist_row[4];
+ PhonebookEntry *entry;
+
+ if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active &&
+ ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_SM)
+ {
+ if ((entry = FindFreeEntry(GMT_ME)) == NULL)
+ {
+ gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Can't change memory type!"));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+ strncpy(entry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_name_length);
+ entry->entry.Name[max_phonebook_name_length] = '\0';
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(entry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_number_length);
+ entry->entry.Name[max_phonebook_number_length] = '\0';
+ }
+
+ entry->entry.Group = ((EditEntryData*) data)->newGroup;
+
+ entry->status = E_Changed;
+
+ ((EditEntryData*) data)->pbEntry->status = E_Deleted;
+
+ memoryStatus.UsedME++;
+ memoryStatus.FreeME--;
+ memoryStatus.UsedSM--;
+ memoryStatus.FreeSM++;
+ statusInfo.ch_ME = statusInfo.ch_SM = 1;
+
+ ((EditEntryData*) data)->pbEntry = entry;
+ }
+ else if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypeSIM)->active &&
+ ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ {
+ if ((entry = FindFreeEntry(GMT_SM)) == NULL)
+ {
+ gtk_label_set_text(GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+ strncpy(entry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_sim_name_length);
+ entry->entry.Name[max_phonebook_sim_name_length] = '\0';
+
+ if (strlen(gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
+ {
+ gtk_label_set_text( GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated,\n\
+because you save it into SIM memory!"));
+ gtk_widget_show (errorDialog.dialog);
+ }
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(entry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_sim_number_length);
+ entry->entry.Name[max_phonebook_sim_number_length] = '\0';
+ }
+
+ entry->entry.Group = ((EditEntryData*) data)->newGroup;
+
+ entry->status = E_Changed;
+
+ ((EditEntryData*) data)->pbEntry->status = E_Deleted;
+
+ memoryStatus.UsedME--;
+ memoryStatus.FreeME++;
+ memoryStatus.UsedSM++;
+ memoryStatus.FreeSM--;
+ statusInfo.ch_ME = statusInfo.ch_SM = 1;
+
+ ((EditEntryData*) data)->pbEntry = entry;
+ }
+ else
+ {
+ if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active)
+ {
+ strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_name_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_name_length] = '\0';
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_number_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_number_length] = '\0';
+ }
+ }
+ else
+ {
+ strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_sim_name_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
+
+ if (strlen(gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated,\n\
+because you save it into SIM memory!"));
+ gtk_widget_show (errorDialog.dialog);
+ }
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_sim_number_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_number_length] = '\0';
+ }
+ }
+
+ ((EditEntryData*) data)->pbEntry->entry.Group = ((EditEntryData*) data)->newGroup;
+
+ ((EditEntryData*) data)->pbEntry->status = E_Changed;
+
+ if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ statusInfo.ch_ME = 1;
+ else
+ statusInfo.ch_SM = 1;
+ }
+
+ gtk_widget_hide (GTK_WIDGET(((EditEntryData*) data)->dialog));
+
+ RefreshStatusInfo ();
+
+ gtk_clist_freeze (GTK_CLIST (clist));
+ gtk_clist_remove (GTK_CLIST (clist), ((EditEntryData*) data)->row);
+
+ clist_row[0] = ((EditEntryData*) data)->pbEntry->entry.Name;
+
+ clist_row[1] = ((EditEntryData*) data)->pbEntry->entry.Number;
+
+ if( ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ clist_row[2] = "P";
+ else
+ clist_row[2] = "S";
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ clist_row[3] = xgnokiiConfig.callerGroups[((EditEntryData*) data)->pbEntry->entry.Group];
+ else
+ clist_row[3] = "";
+ gtk_clist_insert(GTK_CLIST (clist), ((EditEntryData*) data)->row, clist_row);
+ if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ gtk_clist_set_pixmap( GTK_CLIST (clist), ((EditEntryData*) data)->row, 2,
+ memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
+ else
+ gtk_clist_set_pixmap( GTK_CLIST (clist), ((EditEntryData*) data)->row, 2,
+ memoryPixmaps.simMemPix, memoryPixmaps.mask);
+
+ gtk_clist_set_row_data(GTK_CLIST (clist), ((EditEntryData*) data)->row, (gpointer) ((EditEntryData*) data)->pbEntry);
+
+ gtk_clist_sort(GTK_CLIST (clist));
+ gtk_clist_thaw(GTK_CLIST (clist));
+}
+
+
+static void OkDeleteEntryDialog(GtkWidget *widget, gpointer data )
+{
+ PhonebookEntry *pbEntry;
+ GList *sel;
+ gint row;
+
+ sel = GTK_CLIST (clist)->selection;
+
+ gtk_clist_freeze(GTK_CLIST (clist));
+
+ while (sel != NULL)
+ {
+ row = GPOINTER_TO_INT(sel->data);
+ pbEntry = (PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row);
+ sel = sel->next;
+
+ pbEntry->status = E_Deleted;
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ {
+ memoryStatus.UsedME--;
+ memoryStatus.FreeME++;
+ statusInfo.ch_ME = 1;
+ }
+ else
+ {
+ memoryStatus.UsedSM--;
+ memoryStatus.FreeSM++;
+ statusInfo.ch_SM = 1;
+ }
+
+ gtk_clist_remove(GTK_CLIST (clist), row);
+ }
+
+ RefreshStatusInfo ();
+
+ gtk_widget_hide(GTK_WIDGET (data));
+
+ gtk_clist_thaw(GTK_CLIST (clist));
+}
+
+
+static void OkNewEntryDialog(GtkWidget *widget, gpointer data )
+{
+ gchar *clist_row[4];
+ PhonebookEntry *entry;
+
+ if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active &&
+ ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_SM)
+ {
+ if ((entry = FindFreeEntry (GMT_ME)) == NULL)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+ strncpy(entry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_name_length);
+ entry->entry.Name[max_phonebook_name_length] = '\0';
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(entry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_number_length);
+ entry->entry.Name[max_phonebook_number_length] = '\0';
+ }
+
+ entry->entry.Group = ((EditEntryData*) data)->newGroup;
+
+ entry->status = E_Changed;
+
+ ((EditEntryData*) data)->pbEntry = entry;
+ }
+ else if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypeSIM)->active &&
+ ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ {
+ if ((entry = FindFreeEntry (GMT_SM)) == NULL)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+ strncpy(entry->entry.Name,
+ gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_sim_name_length);
+ entry->entry.Name[max_phonebook_sim_name_length] = '\0';
+
+ if (strlen(gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated\n\
+because you save it into SIM memory!"));
+ gtk_widget_show (errorDialog.dialog);
+ }
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(entry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_sim_number_length);
+ entry->entry.Name[max_phonebook_sim_number_length] = '\0';
+ }
+
+ entry->entry.Group = ((EditEntryData*) data)->newGroup;
+
+ entry->status = E_Changed;
+
+ ((EditEntryData*) data)->pbEntry = entry;
+ }
+ else
+ {
+ if (GTK_TOGGLE_BUTTON(((EditEntryData*) data)->memoryTypePhone)->active)
+ {
+ strncpy(((EditEntryData*) data)->pbEntry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_name_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_name_length] = '\0';
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy(((EditEntryData*) data)->pbEntry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_number_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_number_length] = '\0';
+ }
+ }
+ else
+ {
+ strncpy (((EditEntryData*) data)->pbEntry->entry.Name,
+ gtk_entry_get_text(GTK_ENTRY (((EditEntryData*) data)->name)),
+ max_phonebook_sim_name_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
+
+ if (strlen(gtk_entry_get_text (GTK_ENTRY (((EditEntryData*) data)->name))) > max_phonebook_sim_name_length)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Sorry, phonebook name will be truncated\n\
+because you save it into SIM memory!"));
+ gtk_widget_show (errorDialog.dialog);
+ }
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ }
+ else
+ {
+ strncpy (((EditEntryData*) data)->pbEntry->entry.Number,
+ gtk_entry_get_text (GTK_ENTRY(((EditEntryData*) data)->number)),
+ max_phonebook_sim_number_length);
+ ((EditEntryData*) data)->pbEntry->entry.Name[max_phonebook_sim_number_length] = '\0';
+ }
+ }
+
+ ((EditEntryData*) data)->pbEntry->entry.Group = ((EditEntryData*) data)->newGroup;
+
+ ((EditEntryData*) data)->pbEntry->status = E_Changed;
+ }
+
+ if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ {
+ memoryStatus.UsedME++;
+ memoryStatus.FreeME--;
+ statusInfo.ch_ME = 1;
+ }
+ else
+ {
+ memoryStatus.UsedSM++;
+ memoryStatus.FreeSM--;
+ statusInfo.ch_SM = 1;
+ }
+
+ gtk_widget_hide(GTK_WIDGET(((EditEntryData*) data)->dialog));
+
+ RefreshStatusInfo ();
+
+ gtk_clist_freeze (GTK_CLIST (clist));
+ clist_row[0] = ((EditEntryData*) data)->pbEntry->entry.Name;
+
+ clist_row[1] = ((EditEntryData*) data)->pbEntry->entry.Number;
+
+ if( ((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ clist_row[2] = "P";
+ else
+ clist_row[2] = "S";
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ clist_row[3] = xgnokiiConfig.callerGroups[((EditEntryData*) data)->pbEntry->entry.Group];
+ else
+ clist_row[3] = "";
+ gtk_clist_insert (GTK_CLIST (clist), 1, clist_row);
+
+ if (((EditEntryData*) data)->pbEntry->entry.MemoryType == GMT_ME)
+ gtk_clist_set_pixmap (GTK_CLIST (clist), 1, 2,
+ memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
+ else
+ gtk_clist_set_pixmap (GTK_CLIST (clist), 1, 2,
+ memoryPixmaps.simMemPix, memoryPixmaps.mask);
+
+ gtk_clist_set_row_data (GTK_CLIST (clist), 1, (gpointer) ((EditEntryData*) data)->pbEntry);
+
+ gtk_clist_sort (GTK_CLIST (clist));
+ gtk_clist_thaw (GTK_CLIST (clist));
+}
+
+
+static void OkChangeEntryDialog( GtkWidget *widget, gpointer data)
+{
+ gchar *clist_row[4];
+ gint row;
+ PhonebookEntry *oldPbEntry, *newPbEntry;
+ GList *sel;
+ gchar string[100];
+
+ sel = GTK_CLIST (clist)->selection;
+
+ gtk_widget_hide(GTK_WIDGET (data));
+
+ gtk_clist_freeze(GTK_CLIST (clist));
+
+ while (sel != NULL)
+ {
+ row = GPOINTER_TO_INT (sel->data);
+ oldPbEntry = (PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row);
+
+ sel = sel->next;
+
+ if (oldPbEntry->entry.MemoryType == GMT_SM)
+ {
+ if ((newPbEntry = FindFreeEntry (GMT_ME)) == NULL)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+
+ newPbEntry->entry = oldPbEntry->entry;
+ newPbEntry->entry.MemoryType = GMT_ME;
+
+ newPbEntry->status = E_Changed;
+ oldPbEntry->status = E_Deleted;
+
+ memoryStatus.UsedME++;
+ memoryStatus.FreeME--;
+ memoryStatus.UsedSM--;
+ memoryStatus.FreeSM++;
+ statusInfo.ch_ME = statusInfo.ch_SM = 1;
+
+ }
+ else
+ {
+ if ((newPbEntry = FindFreeEntry(GMT_SM)) == NULL)
+ {
+ gtk_label_set_text(GTK_LABEL (errorDialog.text), _("Can't change memory type!"));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+
+ newPbEntry->entry = oldPbEntry->entry;
+ newPbEntry->entry.Name[max_phonebook_sim_name_length] = '\0';
+ newPbEntry->entry.MemoryType = GMT_SM;
+
+ newPbEntry->status = E_Changed;
+ oldPbEntry->status = E_Deleted;
+
+ memoryStatus.UsedME--;
+ memoryStatus.FreeME++;
+ memoryStatus.UsedSM++;
+ memoryStatus.FreeSM--;
+ statusInfo.ch_ME = statusInfo.ch_SM = 1;
+ }
+
+ gtk_clist_remove(GTK_CLIST (clist), row);
+
+ clist_row[0] = newPbEntry->entry.Name;
+
+ if (newPbEntry->entry.SubEntriesCount>0) {
+ snprintf(string,100,"%s *",newPbEntry->entry.Number);
+ clist_row[1]=string;
+ } else clist_row[1] = newPbEntry->entry.Number;
+
+ if( newPbEntry->entry.MemoryType == GMT_ME)
+ clist_row[2] = "P";
+ else
+ clist_row[2] = "S";
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ clist_row[3] = xgnokiiConfig.callerGroups[newPbEntry->entry.Group];
+ else
+ clist_row[3] = "";
+ gtk_clist_insert (GTK_CLIST (clist), row, clist_row);
+ if (newPbEntry->entry.MemoryType == GMT_ME)
+ gtk_clist_set_pixmap (GTK_CLIST (clist), row, 2,
+ memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
+ else
+ gtk_clist_set_pixmap (GTK_CLIST (clist), row, 2,
+ memoryPixmaps.simMemPix, memoryPixmaps.mask);
+
+ gtk_clist_set_row_data (GTK_CLIST (clist), row, (gpointer) newPbEntry);
+ }
+
+ RefreshStatusInfo ();
+ gtk_clist_sort (GTK_CLIST (clist));
+ gtk_clist_thaw (GTK_CLIST (clist));
+}
+
+
+static void SearchEntry (void)
+{
+ gchar *buf;
+ gchar *entry;
+ gint i;
+
+ if (!contactsMemoryInitialized || *findEntryStruct.pattern == '\0')
+ return;
+
+ gtk_clist_unselect_all( GTK_CLIST (clist));
+ g_strup(findEntryStruct.pattern);
+
+ gtk_clist_get_text( GTK_CLIST (clist), findEntryStruct.lastRow,
+ findEntryStruct.type, &entry);
+ i = (findEntryStruct.lastRow + 1) % (memoryStatus.MaxME + memoryStatus.MaxSM);
+
+ while (findEntryStruct.lastRow != i)
+ {
+ buf = g_strdup (entry);
+ g_strup (buf);
+
+ if (strstr( buf, findEntryStruct.pattern))
+ {
+ g_free(buf);
+ findEntryStruct.lastRow = i;
+ gtk_clist_select_row( GTK_CLIST (clist),
+ (i + memoryStatus.MaxME + memoryStatus.MaxSM - 1)
+ % (memoryStatus.MaxME + memoryStatus.MaxSM),
+ findEntryStruct.type);
+ gtk_clist_moveto( GTK_CLIST (clist),
+ (i + memoryStatus.MaxME + memoryStatus.MaxSM - 1)
+ % (memoryStatus.MaxME + memoryStatus.MaxSM),
+ findEntryStruct.type, 0.5, 0.5);
+ return;
+ }
+ g_free(buf);
+ gtk_clist_get_text (GTK_CLIST (clist), i, findEntryStruct.type, &entry);
+
+ i = (i + 1) % (memoryStatus.MaxME + memoryStatus.MaxSM);
+ }
+
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find pattern!"));
+ gtk_widget_show (errorDialog.dialog);
+}
+
+
+static void OkFindEntryDialog (GtkWidget *widget, gpointer data)
+{
+ if (GTK_TOGGLE_BUTTON (((FindEntryData*) data)->nameB)->active)
+ findEntryStruct.type = FIND_NAME;
+ else
+ findEntryStruct.type = FIND_NUMBER;
+
+ strncpy(findEntryStruct.pattern,
+ gtk_entry_get_text (GTK_ENTRY (((FindEntryData*) data)->pattern)),
+ max_phonebook_number_length);
+ findEntryStruct.pattern[max_phonebook_number_length] = '\0';
+
+ findEntryStruct.lastRow = 0;
+
+ gtk_widget_hide( ((FindEntryData*) data)->dialog);
+
+ SearchEntry ();
+}
+
+
+void CreateGroupMenu (EditEntryData *data)
+{
+ GtkWidget *item;
+
+ if (data->groupMenu)
+ {
+ gtk_option_menu_remove_menu (GTK_OPTION_MENU (data->group));
+ if (GTK_IS_WIDGET (data->groupMenu))
+ gtk_widget_destroy (GTK_WIDGET (data->groupMenu));
+ data->groupMenu = NULL;
+ }
+
+ data->groupMenu = gtk_menu_new ();
+
+ item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[0]);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (SetGroup0),
+ (gpointer) data);
+ gtk_widget_show (item);
+ gtk_menu_append (GTK_MENU (data->groupMenu), item);
+
+ item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[1]);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (SetGroup1),
+ (gpointer) data);
+ gtk_widget_show (item);
+ gtk_menu_append (GTK_MENU (data->groupMenu), item);
+
+ item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[2]);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (SetGroup2),
+ (gpointer) data);
+ gtk_widget_show (item);
+ gtk_menu_append (GTK_MENU (data->groupMenu), item);
+
+ item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[3]);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (SetGroup3),
+ (gpointer) data);
+ gtk_widget_show (item);
+ gtk_menu_append (GTK_MENU (data->groupMenu), item);
+
+ item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[4]);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (SetGroup4),
+ (gpointer) data);
+ gtk_widget_show (item);
+ gtk_menu_append (GTK_MENU (data->groupMenu), item);
+
+ item = gtk_menu_item_new_with_label (xgnokiiConfig.callerGroups[5]);
+ gtk_signal_connect (GTK_OBJECT (item), "activate",
+ GTK_SIGNAL_FUNC (SetGroup5),
+ (gpointer) data);
+ gtk_widget_show (item);
+ gtk_menu_append (GTK_MENU (data->groupMenu), item);
+
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (data->group), data->groupMenu);
+}
+
+
+inline void GUI_RefreshGroupMenu (void)
+{
+ if (newEditEntryData.group)
+ CreateGroupMenu (&newEditEntryData);
+
+ if (editEditEntryData.group)
+ CreateGroupMenu (&editEditEntryData);
+
+ if (duplicateEditEntryData.group)
+ CreateGroupMenu (&duplicateEditEntryData);
+}
+
+
+static void EditSubEntries (GtkWidget *clist,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data )
+{
+ if(event && event->type == GDK_2BUTTON_PRESS)
+// EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row),
+// row);
+ {
+ gchar *buf;
+
+ gtk_clist_get_text (GTK_CLIST (clist), row, 1, &buf);
+ g_print (buf);
+ }
+}
+
+
+static void EditNumbers (GtkWidget *widget, void *data)
+{
+ GtkWidget *button, *clistScrolledWindow;
+ gchar *row[3];
+ register gint i;
+
+
+ if (editNumbersData.dialog == NULL)
+ {
+ editNumbersData.dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (editNumbersData.dialog), _("Numbers"));
+ gtk_window_set_modal (GTK_WINDOW (editNumbersData.dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (editNumbersData.dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (editNumbersData.dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Ok"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("New"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editNumbersData.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelDialog), (gpointer) editNumbersData.dialog);
+ gtk_widget_show (button);
+
+ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editNumbersData.dialog)->vbox), 5);
+
+ editNumbersData.clist = gtk_clist_new (3);
+ gtk_clist_set_shadow_type (GTK_CLIST (editNumbersData.clist), GTK_SHADOW_OUT);
+
+ gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 0, 4);
+ gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 1, 115);
+ gtk_clist_set_column_width (GTK_CLIST (editNumbersData.clist), 2, 10);
+ //gtk_clist_set_column_justification (GTK_CLIST (editNumbersData.clist), 2, GTK_JUSTIFY_CENTER);
+
+ gtk_signal_connect (GTK_OBJECT (editNumbersData.clist), "select_row",
+ GTK_SIGNAL_FUNC (EditSubEntries), NULL);
+
+ clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (clistScrolledWindow), editNumbersData.clist);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clistScrolledWindow),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editNumbersData.dialog)->vbox),
+ clistScrolledWindow);
+
+ gtk_widget_show (editNumbersData.clist);
+ gtk_widget_show (clistScrolledWindow);
+ }
+
+ gtk_clist_freeze (GTK_CLIST (editNumbersData.clist));
+ gtk_clist_clear (GTK_CLIST (editNumbersData.clist));
+
+ for(i = 0; i < editNumbersData.pbEntry->entry.SubEntriesCount; i++)
+ {
+ if (strcmp (editNumbersData.pbEntry->entry.Number,
+ editNumbersData.pbEntry->entry.SubEntries[i].data.Number) == 0)
+ row[0] = "*";
+ else
+ row[0] = "";
+
+ row[1] = editNumbersData.pbEntry->entry.SubEntries[i].data.Number;
+
+ switch (editNumbersData.pbEntry->entry.SubEntries[i].EntryType)
+ {
+ case GSM_Number:
+ switch (editNumbersData.pbEntry->entry.SubEntries[i].NumberType)
+ {
+ case GSM_General:
+ row[2] = "General";
+ break;
+
+ case GSM_Mobile:
+ row[2] = "Mobile";
+ break;
+
+ case GSM_Work:
+ row[2] = "Work";
+ break;
+
+ case GSM_Fax:
+ row[2] = "Fax";
+ break;
+
+ case GSM_Home:
+ row[2] = "Home";
+ break;
+
+ default:
+ row[2] = "Unknown";
+ break;
+ }
+ break;
+
+ case GSM_Note:
+ row[2] = "Note";
+ break;
+
+ case GSM_Postal:
+ row[2] = "Postal";
+ break;
+
+ case GSM_Email:
+ row[2] = "E-Mail";
+ break;
+
+ case GSM_Name:
+ row[2] = "Name";
+ break;
+
+ default:
+ row[2] = "Unknown";
+ break;
+ }
+
+ gtk_clist_append (GTK_CLIST (editNumbersData.clist), row);
+/* if (pbEntry->entry.MemoryType == GMT_ME)
+ gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
+ memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
+ else
+ gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
+ memoryPixmaps.simMemPix, memoryPixmaps.mask);
+*/
+ }
+
+ gtk_clist_thaw (GTK_CLIST (editNumbersData.clist));
+
+ gtk_widget_show (editNumbersData.dialog);
+}
+
+
+static void CreateEditDialog (EditEntryData *editEntryData, gchar *title,
+ GtkSignalFunc okFunc)
+{
+ GtkWidget *button, *label, *hbox;
+
+ editEntryData->dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (editEntryData->dialog), title);
+ gtk_window_set_modal (GTK_WINDOW (editEntryData->dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (editEntryData->dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (editEntryData->dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Ok"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editEntryData->dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (okFunc), (gpointer) editEntryData);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editEntryData->dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelEditDialog), (gpointer) editEntryData);
+ gtk_widget_show (button);
+
+ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new (_("Name:"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
+ gtk_widget_show (label);
+
+ editEntryData->name = gtk_entry_new_with_max_length (100);
+
+ gtk_box_pack_end(GTK_BOX(hbox), editEntryData->name, FALSE, FALSE, 2);
+ gtk_widget_show (editEntryData->name);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new (_("Number:"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
+ gtk_widget_show (label);
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ button = gtk_button_new ();
+ editEntryData->number = gtk_label_new ("");
+
+ gtk_container_add (GTK_CONTAINER (button), editEntryData->number);
+
+ gtk_box_pack_end(GTK_BOX(hbox), button, TRUE, TRUE, 2);
+
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (EditNumbers), NULL);
+ gtk_widget_show_all (button);
+ }
+ else
+ {
+ editEntryData->number = gtk_entry_new_with_max_length (max_phonebook_number_length);
+ gtk_box_pack_end(GTK_BOX(hbox), editEntryData->number, FALSE, FALSE, 2);
+ gtk_widget_show (editEntryData->number);
+ }
+
+/* if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
+// gtk_widget_show (hbox);
+
+ label = gtk_label_new (_("Extended:"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
+// gtk_widget_show (label);
+
+ editEntryData->extended = gtk_combo_new();
+ gtk_box_pack_end(GTK_BOX(hbox), editEntryData->extended, FALSE, FALSE, 2);
+// gtk_widget_show (editEntryData->extended);
+
+ gtk_signal_connect (GTK_OBJECT (GTK_COMBO(editEntryData->extended)->entry), "activate",
+ GTK_SIGNAL_FUNC (ExtPbkChanged), (gpointer) editEntryData);
+ }
+*/
+
+ editEntryData->memoryBox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox),
+ editEntryData->memoryBox);
+
+ label = gtk_label_new (_("Memory:"));
+ gtk_box_pack_start(GTK_BOX (editEntryData->memoryBox), label, FALSE, FALSE, 2);
+ gtk_widget_show (label);
+
+ editEntryData->memoryTypePhone = gtk_radio_button_new_with_label (NULL, _("phone"));
+ gtk_box_pack_end (GTK_BOX (editEntryData->memoryBox), editEntryData->memoryTypePhone, TRUE, FALSE, 2);
+ gtk_widget_show (editEntryData->memoryTypePhone);
+
+ editEntryData->memoryTypeSIM = gtk_radio_button_new_with_label(
+ gtk_radio_button_group (GTK_RADIO_BUTTON (editEntryData->memoryTypePhone)), "SIM");
+ gtk_box_pack_end(GTK_BOX (editEntryData->memoryBox), editEntryData->memoryTypeSIM, TRUE, FALSE, 2);
+ gtk_widget_show (editEntryData->memoryTypeSIM);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editEntryData->dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ editEntryData->groupLabel = gtk_label_new (_("Caller group:"));
+ gtk_box_pack_start (GTK_BOX (hbox), editEntryData->groupLabel, FALSE, FALSE, 2);
+
+ editEntryData->group = gtk_option_menu_new ();
+
+ CreateGroupMenu (editEntryData);
+
+ gtk_box_pack_start (GTK_BOX (hbox), editEntryData->group, TRUE, TRUE, 0);
+}
+
+
+static void EditPbEntry(PhonebookEntry *pbEntry, gint row)
+{
+ if (editEditEntryData.dialog == NULL)
+ CreateEditDialog(&editEditEntryData, _("Edit entry"), OkEditEntryDialog);
+
+ editEditEntryData.pbEntry = pbEntry;
+ editEditEntryData.newGroup = pbEntry->entry.Group;
+ editEditEntryData.row = row;
+ editNumbersData.pbEntry = pbEntry;
+
+ gtk_entry_set_text (GTK_ENTRY (editEditEntryData.name), pbEntry->entry.Name);
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ gtk_label_set_text (GTK_LABEL (editEditEntryData.number), pbEntry->entry.Number);
+ else
+ gtk_entry_set_text (GTK_ENTRY (editEditEntryData.number), pbEntry->entry.Number);
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editEditEntryData.memoryTypePhone), TRUE);
+ else
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editEditEntryData.memoryTypeSIM), TRUE);
+
+ gtk_option_menu_set_history( GTK_OPTION_MENU (editEditEntryData.group),
+ pbEntry->entry.Group);
+
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ {
+ gtk_widget_show (editEditEntryData.group);
+ gtk_widget_show (editEditEntryData.groupLabel);
+ }
+ else
+ {
+ gtk_widget_hide (editEditEntryData.group);
+ gtk_widget_hide (editEditEntryData.groupLabel);
+ }
+
+ if (memoryStatus.MaxME > 0)
+ gtk_widget_show (GTK_WIDGET (editEditEntryData.memoryBox));
+ else
+ gtk_widget_hide (GTK_WIDGET (editEditEntryData.memoryBox));
+
+ gtk_widget_show (GTK_WIDGET (editEditEntryData.dialog));
+}
+
+
+void DeletePbEntry (void)
+{
+ static GtkWidget *dialog = NULL;
+ GtkWidget *button, *hbox, *label, *pixmap;
+
+ if (dialog == NULL)
+ {
+ dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Delete entries"));
+ gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Ok"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (OkDeleteEntryDialog), (gpointer) dialog);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
+ gtk_widget_show (button);
+
+ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
+ gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 10);
+ gtk_widget_show(pixmap);
+
+ label = gtk_label_new(_("Do you want to delete selected entries?"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10);
+ gtk_widget_show(label);
+ }
+
+ gtk_widget_show(GTK_WIDGET (dialog));
+}
+
+
+void NewPbEntry(PhonebookEntry *pbEntry)
+{
+ if (newEditEntryData.dialog == NULL)
+ CreateEditDialog (&newEditEntryData, _("New entry"), OkNewEntryDialog);
+
+ newEditEntryData.pbEntry = pbEntry;
+ newEditEntryData.newGroup = 5;
+ editNumbersData.pbEntry = pbEntry;
+
+ gtk_entry_set_text (GTK_ENTRY (newEditEntryData.name), "");
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ gtk_label_set_text (GTK_LABEL (newEditEntryData.number), "");
+ else
+ gtk_entry_set_text (GTK_ENTRY (newEditEntryData.number), "");
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (newEditEntryData.memoryTypePhone), TRUE);
+ else
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (newEditEntryData.memoryTypeSIM), TRUE);
+
+ gtk_option_menu_set_history( GTK_OPTION_MENU (newEditEntryData.group),
+ pbEntry->entry.Group);
+
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ {
+ gtk_widget_show (newEditEntryData.group);
+ gtk_widget_show (newEditEntryData.groupLabel);
+ }
+ else
+ {
+ gtk_widget_hide (newEditEntryData.group);
+ gtk_widget_hide (newEditEntryData.groupLabel);
+ }
+
+ if (memoryStatus.MaxME > 0)
+ gtk_widget_show (GTK_WIDGET (newEditEntryData.memoryBox));
+ else
+ gtk_widget_hide (GTK_WIDGET (newEditEntryData.memoryBox));
+
+ gtk_widget_show(GTK_WIDGET (newEditEntryData.dialog));
+}
+
+
+void DuplicatePbEntry (PhonebookEntry *pbEntry)
+{
+ if (duplicateEditEntryData.dialog == NULL)
+ CreateEditDialog (&duplicateEditEntryData, _("Duplicate entry"), OkNewEntryDialog);
+
+ duplicateEditEntryData.pbEntry = pbEntry;
+ duplicateEditEntryData.newGroup = pbEntry->entry.Group;
+ editNumbersData.pbEntry = pbEntry;
+
+ gtk_entry_set_text (GTK_ENTRY (duplicateEditEntryData.name), pbEntry->entry.Name);
+
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ gtk_label_set_text (GTK_LABEL (duplicateEditEntryData.number), pbEntry->entry.Number);
+ else
+ gtk_entry_set_text (GTK_ENTRY (duplicateEditEntryData.number), pbEntry->entry.Number);
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (duplicateEditEntryData.memoryTypePhone), TRUE);
+ else
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (duplicateEditEntryData.memoryTypeSIM), TRUE);
+
+ gtk_option_menu_set_history( GTK_OPTION_MENU (duplicateEditEntryData.group),
+ pbEntry->entry.Group);
+
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ {
+ gtk_widget_show (duplicateEditEntryData.group);
+ gtk_widget_show (duplicateEditEntryData.groupLabel);
+ }
+ else
+ {
+ gtk_widget_hide (duplicateEditEntryData.group);
+ gtk_widget_hide (duplicateEditEntryData.groupLabel);
+ }
+
+ if (memoryStatus.MaxME > 0)
+ gtk_widget_show (GTK_WIDGET (duplicateEditEntryData.memoryBox));
+ else
+ gtk_widget_hide (GTK_WIDGET (duplicateEditEntryData.memoryBox));
+
+ gtk_widget_show(GTK_WIDGET (duplicateEditEntryData.dialog));
+}
+
+
+static void EditEntry (void)
+{
+ if (contactsMemoryInitialized)
+ {
+ if (GTK_CLIST (clist)->selection == NULL)
+ return;
+
+ EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist),
+ GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data)),
+ GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data));
+ }
+}
+
+
+static void DuplicateEntry (void)
+{
+ PhonebookEntry *new, *old;
+
+ if (contactsMemoryInitialized)
+ {
+ if (GTK_CLIST (clist)->selection == NULL)
+ return;
+
+ old = (PhonebookEntry *) gtk_clist_get_row_data (GTK_CLIST (clist), GPOINTER_TO_INT(GTK_CLIST (clist)->selection->data));
+
+ if ( old->entry.MemoryType == GMT_ME)
+ {
+ if ((new = FindFreeEntry (GMT_ME)) == NULL)
+ if ((new = FindFreeEntry (GMT_SM)) == NULL)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+ }
+ else
+ {
+ if ((new = FindFreeEntry(GMT_SM)) == NULL)
+ if ((new = FindFreeEntry(GMT_ME)) == NULL)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+ }
+
+ new->entry = old->entry;
+
+ DuplicatePbEntry (new);
+ }
+}
+
+
+static void NewEntry (void)
+{
+ PhonebookEntry *entry;
+
+ if (contactsMemoryInitialized)
+ {
+ if ((entry = FindFreeEntry (GMT_SM)) != NULL)
+ NewPbEntry(entry);
+ else if ((entry = FindFreeEntry (GMT_ME)) != NULL)
+ NewPbEntry(entry);
+ else
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't find free memory."));
+ gtk_widget_show (errorDialog.dialog);
+ }
+ }
+}
+
+
+static inline void ClickEntry (GtkWidget *clist,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data )
+{
+ if(event && event->type == GDK_2BUTTON_PRESS)
+ EditPbEntry((PhonebookEntry *) gtk_clist_get_row_data(GTK_CLIST (clist), row),
+ row);
+}
+
+
+static inline void DeleteEntry (void)
+{
+ if (contactsMemoryInitialized)
+ {
+ if (GTK_CLIST (clist)->selection == NULL)
+ return;
+
+ DeletePbEntry ();
+ }
+}
+
+
+static void ChMemType (void)
+{
+ static GtkWidget *dialog = NULL;
+ GtkWidget *button, *hbox, *label;
+
+ if (contactsMemoryInitialized)
+ {
+ if (GTK_CLIST (clist)->selection == NULL)
+ return;
+
+ if (dialog == NULL)
+ {
+ dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Changing memory type"));
+ gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Continue"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (OkChangeEntryDialog), (gpointer) dialog);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, FALSE, FALSE, 0);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
+ gtk_widget_show (button);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new (_("If you change from phone memory to SIM memory\nsome entries may be truncated."));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 10);
+ gtk_widget_show (label);
+ }
+
+ gtk_widget_show (dialog);
+ }
+}
+
+
+static void FindFirstEntry (void)
+{
+ static FindEntryData findEntryData = { NULL };
+ GtkWidget *button, *label, *hbox;
+
+ if (contactsMemoryInitialized)
+ {
+ if (findEntryData.dialog == NULL)
+ {
+ findEntryData.dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (findEntryData.dialog), _("Find"));
+ gtk_window_set_modal (GTK_WINDOW (findEntryData.dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (findEntryData.dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (findEntryData.dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Find"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (findEntryData.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (OkFindEntryDialog), (gpointer) &findEntryData);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (findEntryData.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelEditDialog), (gpointer) &findEntryData);
+ gtk_widget_show (button);
+
+ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new (_("Pattern:"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
+ gtk_widget_show (label);
+
+ findEntryData.pattern = gtk_entry_new_with_max_length (max_phonebook_name_length);
+
+ gtk_box_pack_end (GTK_BOX (hbox), findEntryData.pattern, FALSE, FALSE, 2);
+ gtk_widget_show (findEntryData.pattern);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (findEntryData.dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ findEntryData.nameB = gtk_radio_button_new_with_label (NULL, _("Name"));
+ gtk_box_pack_start (GTK_BOX (hbox), findEntryData.nameB, TRUE, FALSE, 2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (findEntryData.nameB), TRUE);
+ gtk_widget_show (findEntryData.nameB);
+
+ findEntryData.numberB = gtk_radio_button_new_with_label (
+ gtk_radio_button_group (GTK_RADIO_BUTTON (findEntryData.nameB)), _("Number"));
+ gtk_box_pack_start (GTK_BOX(hbox), findEntryData.numberB, TRUE, FALSE, 2);
+ gtk_widget_show (findEntryData.numberB);
+ }
+
+ gtk_widget_show (findEntryData.dialog);
+ }
+}
+
+
+static inline void SelectAll (void)
+{
+ gtk_clist_select_all (GTK_CLIST (clist));
+}
+
+
+static inline void OkDialVoiceDialog (GtkWidget *w, gpointer data)
+{
+ PhoneEvent *e;
+ gchar *buf = g_strdup (gtk_entry_get_text (GTK_ENTRY (((DialVoiceDialog *) data)->entry)));
+
+ if (strlen (buf) > 0)
+ {
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_DialVoice;
+ e->data = buf;
+ GUI_InsertEvent (e);
+ }
+ else
+ g_free (buf);
+
+ gtk_widget_hide (((DialVoiceDialog *) data)->dialog);
+}
+
+
+static void DialVoice (void)
+{
+ static DialVoiceDialog dialVoiceDialog = {NULL, NULL};
+ GtkWidget *button, *label;
+ PhonebookEntry *pbEntry;
+
+ if (dialVoiceDialog.dialog == NULL)
+ {
+ dialVoiceDialog.dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (dialVoiceDialog.dialog), _("Dial voice"));
+ gtk_window_set_modal(GTK_WINDOW (dialVoiceDialog.dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialVoiceDialog.dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (dialVoiceDialog.dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Ok"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (OkDialVoiceDialog), (gpointer) &dialVoiceDialog);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialVoiceDialog.dialog);
+ gtk_widget_show (button);
+
+ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), 5);
+
+ label = gtk_label_new (_("Number:"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), label, FALSE, FALSE, 5);
+ gtk_widget_show (label);
+
+ dialVoiceDialog.entry = gtk_entry_new_with_max_length (GSM_MAX_PHONEBOOK_NUMBER_LENGTH);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialVoiceDialog.dialog)->vbox), dialVoiceDialog.entry, FALSE, FALSE, 5);
+ gtk_widget_show (dialVoiceDialog.entry);
+ }
+
+ if (GTK_CLIST (clist)->selection != NULL)
+ {
+ pbEntry = (PhonebookEntry *) gtk_clist_get_row_data (GTK_CLIST (clist),
+ GPOINTER_TO_INT (GTK_CLIST (clist)->selection->data));
+
+ gtk_entry_set_text (GTK_ENTRY (dialVoiceDialog.entry), pbEntry->entry.Number);
+ }
+
+ gtk_widget_show (dialVoiceDialog.dialog);
+}
+
+
+static gint CListCompareFunc (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
+{
+ static gchar phoneText[] = "B";
+ static gchar simText[] = "A";
+ char *text1 = NULL;
+ char *text2 = NULL;
+ gint ret;
+
+ GtkCListRow *row1 = (GtkCListRow *) ptr1;
+ GtkCListRow *row2 = (GtkCListRow *) ptr2;
+
+ switch (row1->cell[clist->sort_column].type)
+ {
+ case GTK_CELL_TEXT:
+ text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
+ break;
+ case GTK_CELL_PIXTEXT:
+ text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text;
+ break;
+ default:
+ break;
+ }
+ switch (row2->cell[clist->sort_column].type)
+ {
+ case GTK_CELL_TEXT:
+ text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
+ break;
+ case GTK_CELL_PIXTEXT:
+ text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text;
+ break;
+ default:
+ break;
+ }
+
+ if (clist->sort_column == 2)
+ {
+ if (((PhonebookEntry *) row1->data)->entry.MemoryType == GMT_ME)
+ text1 = phoneText;
+ else
+ text1 = simText;
+ if (((PhonebookEntry *) row2->data)->entry.MemoryType == GMT_ME)
+ text2 = phoneText;
+ else
+ text2 = simText;
+ }
+
+ if (!text2)
+ return (text1 != NULL);
+
+ if (!text1)
+ return -1;
+
+ if ((ret = g_strcasecmp (text1, text2)) == 0)
+ {
+ if (((PhonebookEntry *) row1->data)->entry.MemoryType < ((PhonebookEntry *) row2->data)->entry.MemoryType)
+ ret = -1;
+ else if (((PhonebookEntry *) row1->data)->entry.MemoryType > ((PhonebookEntry *) row2->data)->entry.MemoryType)
+ ret = 1;
+ }
+
+ return ret;
+}
+
+
+static void CreateProgressDialog (gint maxME, gint maxSM)
+{
+ GtkWidget *vbox, *label;
+ GtkAdjustment *adj;
+
+ progressDialog.dialog = gtk_window_new (GTK_WINDOW_DIALOG);
+ gtk_window_position (GTK_WINDOW (progressDialog.dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_modal (GTK_WINDOW (progressDialog.dialog), TRUE);
+ gtk_signal_connect (GTK_OBJECT (progressDialog.dialog), "delete_event",
+ GTK_SIGNAL_FUNC (ProgressDialogDeleteEvent), NULL);
+
+ vbox = gtk_vbox_new (FALSE, 10);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+ gtk_container_add (GTK_CONTAINER (progressDialog.dialog), vbox);
+
+ gtk_widget_show (vbox);
+
+ label = gtk_label_new (_("Phone memory..."));
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+ gtk_widget_show (label);
+
+ adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, maxME, 0, 0, 0);
+ progressDialog.pbarME = gtk_progress_bar_new_with_adjustment (adj);
+
+ gtk_box_pack_start (GTK_BOX (vbox), progressDialog.pbarME, FALSE, FALSE, 0);
+ gtk_widget_show (progressDialog.pbarME);
+
+ label = gtk_label_new (_("SIM memory..."));
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+ gtk_widget_show (label);
+
+ adj = (GtkAdjustment *) gtk_adjustment_new (0, 1, maxSM, 0, 0, 0);
+ progressDialog.pbarSM = gtk_progress_bar_new_with_adjustment (adj);
+
+ gtk_box_pack_start (GTK_BOX (vbox), progressDialog.pbarSM, FALSE, FALSE, 0);
+ gtk_widget_show (progressDialog.pbarSM);
+}
+
+
+static void SaveContacts (void)
+{
+ register gint i;
+ PhonebookEntry *pbEntry;
+ PhoneEvent *e;
+ D_MemoryLocation *ml;
+
+ if (progressDialog.dialog == NULL)
+ {
+ CreateProgressDialog (memoryStatus.MaxME, memoryStatus.MaxSM);
+ }
+
+ if (contactsMemoryInitialized && progressDialog.dialog)
+ {
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), 0);
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), 0);
+ gtk_window_set_title (GTK_WINDOW (progressDialog.dialog), _("Saving entries"));
+ gtk_widget_show_now (progressDialog.dialog);
+
+ /* Save Phone memory */
+ for(i = 0; i < memoryStatus.MaxME; i++)
+ {
+ pbEntry = g_ptr_array_index(contactsMemory, i);
+#ifdef XDEBUG
+ g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
+ pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
+ (int) pbEntry->status);
+#endif
+ if (pbEntry->status == E_Changed || pbEntry->status == E_Deleted)
+ {
+ if (pbEntry->status == E_Deleted)
+ {
+ pbEntry->entry.Name[0] = '\0';
+ pbEntry->entry.Number[0] = '\0';
+ pbEntry->entry.Group = 5;
+ }
+
+ pbEntry->entry.Location = i + 1;
+ ml = (D_MemoryLocation *) g_malloc (sizeof (D_MemoryLocation));
+ ml->entry = &(pbEntry->entry);
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_WriteMemoryLocation;
+ e->data = ml;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (ml->status != GE_NONE)
+ {
+ g_print (_("%s: line: %d:Can't write ME memory entry number %d! Error: %d\n"),
+ __FILE__, __LINE__, i + 1, ml->status);
+ }
+ g_free (ml);
+ }
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), i + 1);
+ GUI_Refresh ();
+ }
+
+ /* Save SIM memory */
+ for (i = memoryStatus.MaxME; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+#ifdef XDEBUG
+ g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
+ pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
+ (int) pbEntry->status);
+#endif
+
+ if (pbEntry->status == E_Changed || pbEntry->status == E_Deleted)
+ {
+ if (pbEntry->status == E_Deleted)
+ {
+ pbEntry->entry.Name[0] = '\0';
+ pbEntry->entry.Number[0] = '\0';
+ pbEntry->entry.Group = 5;
+ }
+
+ pbEntry->entry.Location = i - memoryStatus.MaxME + 1;
+ ml = (D_MemoryLocation *) g_malloc (sizeof (D_MemoryLocation));
+ ml->entry = &(pbEntry->entry);
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_WriteMemoryLocation;
+ e->data = ml;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (ml->status != GE_NONE)
+ {
+ g_print(_("%s: line %d:Can't write SM memory entry number %d! Error: %d\n"),
+ __FILE__, __LINE__, i - memoryStatus.MaxME + 1, ml->status);
+ }
+ g_free (ml);
+ }
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), i - memoryStatus.MaxME + 1);
+ GUI_Refresh ();
+ }
+
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+ RefreshStatusInfo ();
+ gtk_widget_hide (progressDialog.dialog);
+ }
+}
+
+
+static GtkWidget *CreateSaveQuestionDialog (GtkSignalFunc SaveFunc,
+ GtkSignalFunc DontSaveFunc)
+{
+ GtkWidget *dialog;
+ GtkWidget *button, *label, *hbox, *pixmap;
+
+ dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Save changes?"));
+ gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ button = gtk_button_new_with_label (_("Save"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (SaveFunc), (gpointer) dialog);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("Don't save"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (DontSaveFunc), (gpointer) dialog);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start(GTK_BOX (GTK_DIALOG (dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect(GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
+ gtk_widget_show (button);
+
+ gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
+ gtk_widget_show (hbox);
+
+ pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
+ gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 10);
+ gtk_widget_show (pixmap);
+
+ label = gtk_label_new (_("You have made changes in your\ncontacts directory.\n\
+\n\nDo you want save these changes into phone?\n"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
+ gtk_widget_show (label);
+
+ return dialog;
+}
+
+
+static void OkExtPbkDialog (GtkWidget *w, gpointer data) {
+
+ ExtPbkDialog *d=(ExtPbkDialog*)data;
+ GSM_NumberType numtype;
+ gint i, found=999;
+ gchar *chars;
+
+ if (w==d->gbutton) numtype=GSM_General;
+ else if (w==d->mbutton) numtype=GSM_Mobile;
+ else if (w==d->wbutton) numtype=GSM_Work;
+ else if (w==d->fbutton) numtype=GSM_Fax;
+ else if (w==d->hbutton) numtype=GSM_Home;
+ else numtype=GSM_General;
+
+ /* Search through subentries */
+
+ for (i=0;i<d->pbEntry->entry.SubEntriesCount;i++) {
+ if (d->pbEntry->entry.SubEntries[i].EntryType==GSM_Number)
+ if (d->pbEntry->entry.SubEntries[i].NumberType==numtype)
+ found=i;
+ }
+
+ if (found>i) { /* Not found */
+ found=d->pbEntry->entry.SubEntriesCount;
+ d->pbEntry->entry.SubEntriesCount++;
+ d->pbEntry->entry.SubEntries[found].EntryType=GSM_Number;
+ d->pbEntry->entry.SubEntries[found].NumberType=numtype;
+ }
+
+ chars=gtk_editable_get_chars(GTK_EDITABLE(d->entry),0,-1);
+ strcpy(d->pbEntry->entry.SubEntries[found].data.Number,chars);
+ g_free(chars);
+
+ /* Update the entry dialog */
+ EditPbEntry(d->pbEntry,d->row);
+
+ gtk_widget_hide (d->dialog);
+}
+
+
+void ExtPbkChanged (GtkWidget *widget, gpointer data )
+{
+ static ExtPbkDialog dialog = {NULL,NULL,0,NULL,NULL,NULL,NULL,NULL};
+ GtkWidget *button;
+ static GtkWidget *label;
+ gchar *chars;
+
+
+ if (dialog.dialog==NULL) {
+
+ dialog.dialog=gtk_dialog_new();
+
+ gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Which Extended Phonebook Entry?"));
+ gtk_window_set_modal(GTK_WINDOW (dialog.dialog), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog.dialog), 10);
+ gtk_signal_connect (GTK_OBJECT (dialog.dialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+
+ dialog.gbutton = gtk_button_new_with_label (_("General"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
+ dialog.gbutton, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (dialog.gbutton), "clicked",
+ GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
+ gtk_widget_show (dialog.gbutton);
+ dialog.mbutton = gtk_button_new_with_label (_("Mobile"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
+ dialog.mbutton, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (dialog.mbutton), "clicked",
+ GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
+ gtk_widget_show (dialog.mbutton);
+ dialog.wbutton = gtk_button_new_with_label (_("Work"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
+ dialog.wbutton, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (dialog.wbutton), "clicked",
+ GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
+ gtk_widget_show (dialog.wbutton);
+ dialog.fbutton = gtk_button_new_with_label (_("Fax"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
+ dialog.fbutton, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (dialog.fbutton), "clicked",
+ GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
+ gtk_widget_show (dialog.fbutton);
+ dialog.hbutton = gtk_button_new_with_label (_("Home"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox),
+ dialog.hbutton, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (dialog.hbutton), "clicked",
+ GTK_SIGNAL_FUNC (OkExtPbkDialog), (gpointer)&dialog );
+ gtk_widget_show (dialog.hbutton);
+
+ button = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->action_area),
+ button, TRUE, TRUE, 10);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog.dialog);
+ gtk_widget_show (button);
+
+ label = gtk_label_new("");
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog.dialog)->vbox), label, FALSE, FALSE, 5);
+ gtk_widget_show(label);
+ }
+
+ chars=gtk_editable_get_chars(GTK_EDITABLE(widget),0,-1);
+ gtk_label_set_text(GTK_LABEL(label),chars);
+ g_free(chars);
+ dialog.pbEntry=((EditEntryData*)data)->pbEntry;
+ dialog.row=((EditEntryData*)data)->row;
+ dialog.entry=widget;
+ gtk_widget_show(dialog.dialog);
+}
+
+
+
+void GUI_RefreshContacts (void)
+{
+ PhonebookEntry *pbEntry;
+ gint row_i = 0;
+ register gint i;
+
+ if (contactsMemoryInitialized == FALSE)
+ return;
+
+ gtk_clist_freeze (GTK_CLIST (clist));
+ gtk_clist_clear (GTK_CLIST (clist));
+
+ for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ gchar *row[4];
+
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+ if (pbEntry->status != E_Empty && pbEntry->status != E_Deleted)
+ {
+ row[0] = pbEntry->entry.Name;
+
+ row[1] = pbEntry->entry.Number;
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ row[2] = "P";
+ else
+ row[2] = "S";
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ row[3] = xgnokiiConfig.callerGroups[pbEntry->entry.Group];
+ else
+ row[3] = "";
+ gtk_clist_append (GTK_CLIST (clist), row);
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
+ memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
+ else
+ gtk_clist_set_pixmap (GTK_CLIST (clist), row_i, 2,
+ memoryPixmaps.simMemPix, memoryPixmaps.mask);
+
+ gtk_clist_set_row_data (GTK_CLIST (clist), row_i++, (gpointer) pbEntry);
+ }
+#ifdef XDEBUG
+ g_print ("%d;%s;%s;%d;%d;%d\n", pbEntry->entry.Empty, pbEntry->entry.Name,
+ pbEntry->entry.Number, (int) pbEntry->entry.MemoryType, pbEntry->entry.Group,
+ (int) pbEntry->status);
+#endif
+ }
+
+ gtk_clist_sort (GTK_CLIST (clist));
+ gtk_clist_thaw (GTK_CLIST (clist));
+}
+
+
+static gint InsertPBEntryME (GSM_PhonebookEntry *entry)
+{
+ PhonebookEntry *pbEntry;
+
+ if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
+ {
+ g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
+ g_ptr_array_free (contactsMemory, TRUE);
+ gtk_widget_hide (progressDialog.dialog);
+ return (-1);
+ }
+
+ pbEntry->entry = *entry;
+
+ if (*pbEntry->entry.Name == '\0' && *pbEntry->entry.Number == '\0')
+ pbEntry->status = E_Empty;
+ else
+ pbEntry->status = E_Unchanged;
+
+ g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), entry->Location);
+ GUI_Refresh ();
+
+ return (GE_NONE);
+}
+
+
+static gint InsertPBEntrySM (GSM_PhonebookEntry *entry)
+{
+ PhonebookEntry *pbEntry;
+
+ if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
+ {
+ g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
+ g_ptr_array_free (contactsMemory, TRUE);
+ gtk_widget_hide (progressDialog.dialog);
+ return (-1);
+ }
+
+ pbEntry->entry = *entry;
+
+ if (*pbEntry->entry.Name == '\0' && *pbEntry->entry.Number == '\0')
+ pbEntry->status = E_Empty;
+ else
+ {
+ pbEntry->status = E_Unchanged;
+ if (fbus3810)
+ {
+ memoryStatus.UsedSM++;
+ memoryStatus.FreeSM--;
+ }
+ }
+
+ g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), entry->Location);
+ GUI_Refresh ();
+
+ return (GE_NONE);
+}
+
+
+static inline gint ReadFailedPBEntry (gint i)
+{
+ g_ptr_array_free (contactsMemory, TRUE);
+ gtk_widget_hide (progressDialog.dialog);
+ return (0);
+}
+
+
+static void ReadContactsMain (void)
+{
+ PhoneEvent *e;
+ D_MemoryStatus *ms;
+ D_MemoryLocationAll *mla;
+ PhonebookEntry *pbEntry;
+ register gint i;
+
+ fbus3810 = FALSE;
+
+ if (contactsMemoryInitialized == TRUE)
+ {
+ for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+ g_free (pbEntry);
+ }
+ g_ptr_array_free (contactsMemory, TRUE);
+ contactsMemory = NULL;
+ gtk_clist_clear (GTK_CLIST (clist));
+ contactsMemoryInitialized = FALSE;
+ memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
+ memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+ RefreshStatusInfo ();
+ }
+
+ ms = (D_MemoryStatus *) g_malloc (sizeof (D_MemoryStatus));
+ ms->memoryStatus.MemoryType = GMT_ME;
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_GetMemoryStatus;
+ e->data = ms;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (ms->status != GE_NONE)
+ /* Phone don't support ME (5110) */
+ memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME = 0;
+ else
+ {
+ memoryStatus.MaxME = ms->memoryStatus.Used + ms->memoryStatus.Free;
+ memoryStatus.UsedME = ms->memoryStatus.Used;
+ memoryStatus.FreeME = ms->memoryStatus.Free;
+ }
+
+ ms->memoryStatus.MemoryType = GMT_SM;
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_GetMemoryStatus;
+ e->data = ms;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (ms->status != GE_NONE)
+ {
+ fbus3810 = TRUE; /* I try to recognize memoryStatus.UsedSM while reading */
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't get SM memory status!\n\n\
+Setting max SIM entries to 100!\n"));
+ memoryStatus.MaxSM = memoryStatus.FreeSM = 100;
+ memoryStatus.UsedSM = 0;
+ gtk_widget_show (errorDialog.dialog);
+ }
+ else
+ {
+ memoryStatus.MaxSM = ms->memoryStatus.Used + ms->memoryStatus.Free;
+ memoryStatus.UsedSM = ms->memoryStatus.Used;
+ memoryStatus.FreeSM = ms->memoryStatus.Free;
+ }
+ g_free (ms);
+
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+
+ RefreshStatusInfo ();
+
+ if (progressDialog.dialog == NULL)
+ {
+ CreateProgressDialog (memoryStatus.MaxME, memoryStatus.MaxSM);
+ }
+
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarME), 0);
+ gtk_progress_set_value (GTK_PROGRESS (progressDialog.pbarSM), 0);
+ gtk_window_set_title (GTK_WINDOW (progressDialog.dialog), _("Getting entries"));
+ gtk_widget_show_now (progressDialog.dialog);
+
+ contactsMemory = g_ptr_array_new ();
+
+ mla = (D_MemoryLocationAll *) g_malloc (sizeof (D_MemoryLocationAll));
+ if (memoryStatus.MaxME > 0)
+ {
+ mla->min = 1;
+ mla->max = memoryStatus.MaxME;
+ mla->type = GMT_ME;
+ mla->used = memoryStatus.UsedME; //MW
+ mla->InsertEntry = InsertPBEntryME;
+ mla->ReadFailed = ReadFailedPBEntry;
+
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_GetMemoryLocationAll;
+ e->data = mla;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (mla->status != GE_NONE)
+ {
+ g_free (mla);
+ gtk_widget_hide (progressDialog.dialog);
+ return;
+ }
+ }
+
+ mla->min = 1;
+ mla->max = memoryStatus.MaxSM;
+ mla->type = GMT_SM;
+ mla->used = memoryStatus.UsedSM; //MW
+ mla->InsertEntry = InsertPBEntrySM;
+ mla->ReadFailed = ReadFailedPBEntry;
+
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_GetMemoryLocationAll;
+ e->data = mla;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (mla->status != GE_NONE)
+ {
+ g_free (mla);
+ gtk_widget_hide (progressDialog.dialog);
+ return;
+ }
+
+ g_free (mla);
+
+ gtk_widget_hide (progressDialog.dialog);
+
+ contactsMemoryInitialized = TRUE;
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+ GUIEventSend (GUI_EVENT_CONTACTS_CHANGED);
+ GUIEventSend (GUI_EVENT_SMS_NUMBER_CHANGED);
+}
+
+
+static void ReadSaveCallback (GtkWidget *widget, gpointer data)
+{
+ gtk_widget_hide (GTK_WIDGET (data));
+ SaveContacts ();
+ ReadContactsMain ();
+}
+
+
+static void ReadDontSaveCallback (GtkWidget *widget, gpointer data)
+{
+ gtk_widget_hide (GTK_WIDGET (data));
+ ReadContactsMain ();
+}
+
+
+static void ReadSaveContacts (void)
+{
+ static GtkWidget *dialog = NULL;
+
+ if (dialog == NULL)
+ dialog = CreateSaveQuestionDialog (ReadSaveCallback, ReadDontSaveCallback);
+
+ gtk_widget_show (dialog);
+}
+
+
+static void ReadContacts (void)
+{
+ if (contactsMemoryInitialized == TRUE && (statusInfo.ch_ME || statusInfo.ch_SM))
+ ReadSaveContacts ();
+ else
+ ReadContactsMain ();
+}
+
+
+inline void GUI_ReadContacts (void)
+{
+ ReadContacts ();
+}
+
+
+inline void GUI_SaveContacts (void)
+{
+ SaveContacts ();
+}
+
+
+inline void GUI_ShowContacts (void)
+{
+ if (xgnokiiConfig.callerGroups[0] == NULL)
+ {
+ GUI_Refresh ();
+ GUI_InitCallerGroupsInf ();
+ }
+ gtk_clist_set_column_visibility (GTK_CLIST (clist), 3, (GetModelFeature(FN_CALLERGROUPS)!=0));
+ GUI_RefreshContacts ();
+ gtk_widget_show (GUI_ContactsWindow);
+// if (!contactsMemoryInitialized)
+// ReadContacts ();
+}
+
+static void ExportVCARD (FILE *f)
+{
+ gchar buf2[10];
+ register gint i,j;
+ PhonebookEntry *pbEntry;
+
+ for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+ if (pbEntry->status == E_Deleted || pbEntry->status == E_Empty)
+ continue;
+
+ fprintf (f, "BEGIN:VCARD\n");
+ fprintf (f, "VERSION:3.0\n");
+ fprintf (f, "FN:%s\n", pbEntry->entry.Name);
+ fprintf (f, "TEL;PREF:%s\n", pbEntry->entry.Number);
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ sprintf (buf2, "ME%d", i + 1);
+ else
+ sprintf (buf2, "SM%d", i - memoryStatus.MaxME + 1);
+
+ fprintf (f, "X_GSM_STORE_AT:%s\n", buf2);
+ fprintf (f, "X_GSM_CALLERGROUP:%d\n", pbEntry->entry.Group);
+
+ /* Add ext. pbk info if required */
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ for (j = 0; j < pbEntry->entry.SubEntriesCount; j++)
+ {
+ if (pbEntry->entry.SubEntries[j].EntryType == GSM_Number)
+ fprintf (f, "TEL;UNKNOWN_%d:%s\n", pbEntry->entry.SubEntries[j].NumberType,
+ pbEntry->entry.SubEntries[j].data.Number);
+ }
+
+ fprintf (f, "END:VCARD\n\n");
+ }
+
+ fclose (f);
+}
+
+
+static void ExportNative (FILE *f)
+{
+ gchar buf[IO_BUF_LEN], buf2[10];
+ register gint i,j;
+ PhonebookEntry *pbEntry;
+
+
+ for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+ if (pbEntry->status != E_Deleted && pbEntry->status != E_Empty)
+ {
+ if (index (pbEntry->entry.Name, ';') != NULL)
+ {
+ strcpy (buf, "\"");
+ strcat (buf, pbEntry->entry.Name);
+ strcat (buf, "\";");
+ }
+ else
+ {
+ strcpy (buf, pbEntry->entry.Name);
+ strcat (buf, ";");
+ }
+
+ if (index (pbEntry->entry.Number, ';') != NULL)
+ {
+ strcat (buf, "\"");
+ strcat (buf, pbEntry->entry.Number);
+ strcat (buf, "\";");
+ }
+ else
+ {
+ strcat (buf, pbEntry->entry.Number);
+ strcat (buf, ";");
+ }
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ sprintf (buf2, "B;%d;%d;", i + 1, pbEntry->entry.Group);
+ else
+ sprintf (buf2, "A;%d;%d;", i - memoryStatus.MaxME + 1, pbEntry->entry.Group);
+ strcat (buf, buf2);
+
+ /* Add ext. pbk info if required */
+ if (GetModelFeature(FN_PHONEBOOK)==F_PBK71)
+ {
+ for (j = 0; j < pbEntry->entry.SubEntriesCount; j++)
+ if (pbEntry->entry.SubEntries[j].EntryType==GSM_Number)
+ {
+ sprintf(buf2,"%d;",pbEntry->entry.SubEntries[j].NumberType);
+ strcat(buf,buf2);
+
+ if (index (pbEntry->entry.SubEntries[j].data.Number, ';') != NULL)
+ {
+ strcat (buf, "\"");
+ strcat (buf, pbEntry->entry.SubEntries[j].data.Number);
+ strcat (buf, "\";");
+ }
+ else
+ {
+ strcat (buf, pbEntry->entry.SubEntries[j].data.Number);
+ strcat (buf, ";");
+ }
+ }
+ }
+ fprintf (f, "%s\n", buf);
+ }
+ }
+
+ fclose(f);
+}
+
+
+static void ExportContactsMain (gchar *name)
+{
+ FILE *f;
+ gchar buf[IO_BUF_LEN];
+
+ if ((f = fopen (name, "w")) == NULL)
+ {
+ g_snprintf (buf, IO_BUF_LEN, _("Can't open file %s for writing!"), name);
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+
+ if (strstr (name, ".vcard") || strstr (name, ".gcrd"))
+ ExportVCARD (f);
+ else
+ ExportNative (f);
+}
+
+
+static void YesExportDialog (GtkWidget *w, gpointer data)
+{
+ gtk_widget_hide (GTK_WIDGET (data));
+ ExportContactsMain (exportDialogData.fileName);
+}
+
+
+static void OkExportDialog (GtkWidget *w, GtkFileSelection *fs)
+{
+ static YesNoDialog dialog = { NULL, NULL};
+ FILE *f;
+ gchar err[80];
+
+ exportDialogData.fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+ gtk_widget_hide (GTK_WIDGET (fs));
+
+ if ((f = fopen (exportDialogData.fileName, "r")) != NULL)
+ {
+ fclose (f);
+ if (dialog.dialog == NULL)
+ {
+ CreateYesNoDialog (&dialog, YesExportDialog, CancelDialog, GUI_ContactsWindow);
+ gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
+ g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), exportDialogData.fileName);
+ gtk_label_set_text (GTK_LABEL(dialog.text), err);
+ }
+ gtk_widget_show (dialog.dialog);
+ }
+ else
+ ExportContactsMain (exportDialogData.fileName);
+}
+
+
+static void ExportContacts (void)
+{
+ static GtkWidget *fileDialog = NULL;
+
+ if (contactsMemoryInitialized)
+ {
+ if (fileDialog == NULL)
+ {
+ fileDialog = gtk_file_selection_new (_("Export"));
+ gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
+ "clicked", GTK_SIGNAL_FUNC (OkExportDialog), (gpointer) fileDialog);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
+ }
+
+ gtk_widget_show (fileDialog);
+ }
+}
+
+
+static bool ParseLine (GSM_PhonebookEntry *entry, gint *num, gchar *buf)
+{
+ register gint i = 0;
+ size_t len;
+ gchar s_num[5];
+ gchar *endptr;
+
+ entry->Empty = FALSE;
+ entry->SubEntriesCount=0;
+
+ len = strlen (buf);
+ if (buf[i] == '"')
+ {
+ i++;
+ while (i < len && i <= GSM_MAX_PHONEBOOK_NAME_LENGTH && buf[i] != '"')
+ {
+ entry->Name[i - 1] = buf[i];
+ i++;
+ }
+ entry->Name[i - 1] = '\0';
+ if (i >= len)
+ return FALSE;
+ if (buf[++i] != ';')
+ return FALSE;
+ }
+ else
+ {
+ while (i < len && i < GSM_MAX_PHONEBOOK_NAME_LENGTH && buf[i] != ';')
+ {
+ entry->Name[i] = buf[i];
+ i++;
+ }
+ entry->Name[i] = '\0';
+ if (buf[i] != ';')
+ return FALSE;
+ if (i >= len)
+ return FALSE;
+ }
+ buf += (i + 1);
+ i = 0;
+
+ len = strlen (buf);
+ if (buf[i] == '"')
+ {
+ i++;
+ while (i < len && i <= GSM_MAX_PHONEBOOK_NUMBER_LENGTH && buf[i] != '"')
+ {
+ entry->Number[i - 1] = buf[i];
+ i++;
+ }
+ entry->Number[i - 1] = '\0';
+ if (i >= len)
+ return FALSE;
+ if (buf[++i] != ';')
+ return FALSE;
+ }
+ else
+ {
+ while (i < len && i < GSM_MAX_PHONEBOOK_NUMBER_LENGTH && buf[i] != ';')
+ {
+ entry->Number[i] = buf[i];
+ i++;
+ }
+ entry->Number[i] = '\0';
+ if (buf[i] != ';')
+ return FALSE;
+ if (i >= len)
+ return FALSE;
+ }
+ buf += (i + 1);
+ i = 0;
+
+ if (!strncmp(buf, "B;", 2))
+ {
+ entry->MemoryType = GMT_ME;
+ buf += 2;
+ }
+ else
+ if (!strncmp(buf, "A;", 2))
+ {
+ entry->MemoryType = GMT_SM;
+ buf += 2;
+ }
+ else
+ if (!strncmp(buf, "ME;", 3))
+ {
+ entry->MemoryType = GMT_ME;
+ buf += 3;
+ }
+ else
+ if (!strncmp(buf, "SM;", 3))
+ {
+ entry->MemoryType = GMT_SM;
+ buf += 3;
+ }
+ else
+ return FALSE;
+
+ len = strlen (buf);
+ while (i < len && i < 4 && buf[i] != ';')
+ {
+ s_num[i] = buf[i];
+ i++;
+ }
+ s_num[i] = '\0';
+ if (buf[i] != ';')
+ return FALSE;
+ if (i >= len)
+ return FALSE;
+ buf += (i + 1);
+ i = 0;
+
+ *num = strtol (s_num, &endptr, 10);
+ if (s_num == endptr)
+ return FALSE;
+ if (*num == LONG_MIN || *num == LONG_MAX)
+ return FALSE;
+
+
+ if ( *buf == '\n' || *buf == '\r') /* for compatibility with NCDS */
+ entry->Group = 5;
+ else
+ {
+ len = strlen (buf);
+ while (i < len && i < 4 && buf[i] != ';')
+ {
+ s_num[i] = buf[i];
+ i++;
+ }
+ s_num[i] = '\0';
+ if (buf[i] != ';')
+ return FALSE;
+ if (i >= len)
+ return FALSE;
+
+ entry->Group = strtol (s_num, &endptr, 10);
+ if (s_num == endptr)
+ return FALSE;
+ if (entry->Group == LONG_MIN || entry->Group == LONG_MAX)
+ return FALSE;
+ if (entry->Group < 0 || entry->Group > 5)
+ return FALSE;
+
+ buf += (i + 1);
+ i = 0;
+
+ /* Ext Pbk Support */
+
+ while (*buf!='\n')
+ {
+ entry->SubEntries[entry->SubEntriesCount].EntryType=GSM_Number;
+ len = strlen (buf);
+ while (i < len && i < 4 && buf[i] != ';')
+ {
+ s_num[i] = buf[i];
+ i++;
+ }
+ s_num[i] = '\0';
+ if (buf[i] != ';')
+ return FALSE;
+ if (i >= len)
+ return FALSE;
+ entry->SubEntries[entry->SubEntriesCount].NumberType=(GSM_NumberType)strtol (s_num, &endptr, 10);
+ if (s_num == endptr)
+ return FALSE;
+ buf += (i + 1);
+ i = 0;
+ len = strlen (buf);
+ while (i < len && i < GSM_MAX_PHONEBOOK_TEXT_LENGTH && buf[i] != ';')
+ {
+ entry->SubEntries[entry->SubEntriesCount].data.Number[i] = buf[i];
+ i++;
+ }
+ entry->SubEntries[entry->SubEntriesCount].data.Number[i] = '\0';
+ buf += (i + 1);
+ i = 0;
+ if (i >= len)
+ return FALSE;
+ entry->SubEntriesCount++;
+ }
+ }
+
+ return TRUE;
+}
+
+
+static void OkImportDialog (GtkWidget *w, GtkFileSelection *fs)
+{
+ FILE *f;
+ PhoneEvent *e;
+ D_MemoryStatus *ms;
+ PhonebookEntry *pbEntry;
+ GSM_PhonebookEntry gsmEntry;
+ gchar buf[IO_BUF_LEN];
+ gchar *fileName;
+ gint i;
+
+ fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+ gtk_widget_hide (GTK_WIDGET (fs));
+
+ if ((f = fopen (fileName, "r")) == NULL)
+ {
+ g_snprintf (buf, IO_BUF_LEN, _("Can't open file %s for reading!"), fileName);
+ gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
+ gtk_widget_show (errorDialog.dialog);
+ return;
+ }
+
+ if (contactsMemoryInitialized == TRUE)
+ {
+ for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index(contactsMemory, i);
+ g_free(pbEntry);
+ }
+ g_ptr_array_free (contactsMemory, TRUE);
+ contactsMemory = NULL;
+ gtk_clist_clear (GTK_CLIST (clist));
+ contactsMemoryInitialized = FALSE;
+ memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
+ memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+ RefreshStatusInfo ();
+ }
+
+ ms = (D_MemoryStatus *) g_malloc (sizeof (D_MemoryStatus));
+ ms->memoryStatus.MemoryType = GMT_ME;
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_GetMemoryStatus;
+ e->data = ms;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (ms->status != GE_NONE)
+ /* Phone don't support ME (5110) */
+ memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME = 0;
+ else
+ {
+ memoryStatus.MaxME = ms->memoryStatus.Used + ms->memoryStatus.Free;
+ memoryStatus.UsedME = 0;
+ memoryStatus.FreeME = memoryStatus.MaxME;
+ }
+
+ ms->memoryStatus.MemoryType = GMT_SM;
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_GetMemoryStatus;
+ e->data = ms;
+ GUI_InsertEvent (e);
+ pthread_mutex_lock (&memoryMutex);
+ pthread_cond_wait (&memoryCond, &memoryMutex);
+ pthread_mutex_unlock (&memoryMutex);
+
+ if (ms->status != GE_NONE)
+ {
+ gtk_label_set_text (GTK_LABEL (errorDialog.text), _("Can't get SM memory status!\n\n\
+Setting max SIM entries set to 100!\n"));
+ memoryStatus.MaxSM = memoryStatus.FreeSM = 100;
+ memoryStatus.UsedSM = 0;
+ gtk_widget_show (errorDialog.dialog);
+ }
+ else
+ {
+ memoryStatus.MaxSM = ms->memoryStatus.Used + ms->memoryStatus.Free;
+ memoryStatus.UsedSM = 0;
+ memoryStatus.FreeSM = memoryStatus.MaxSM;
+ }
+ g_free (ms);
+
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+
+ RefreshStatusInfo ();
+
+ contactsMemory = g_ptr_array_new ();
+
+ for (i = 1; i <= memoryStatus.MaxME; i++)
+ {
+ if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
+ {
+ fclose (f);
+ g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
+ g_ptr_array_free (contactsMemory, TRUE);
+ return;
+ }
+
+ pbEntry->entry.Empty = FALSE;
+ pbEntry->entry.Name[0] = '\0';
+ pbEntry->entry.Number[0] = '\0';
+ pbEntry->entry.MemoryType = GMT_ME;
+ pbEntry->entry.Group = 5;
+ pbEntry->status = E_Deleted; /* I must set status to E_Deleted, since I */
+ /* I want clear empty entries when saving to */
+ /* to phone */
+ pbEntry->entry.SubEntriesCount=0;
+
+ g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
+ pbEntry = NULL;
+ }
+
+ for (i = 1; i <= memoryStatus.MaxSM; i++)
+ {
+ if ((pbEntry = (PhonebookEntry *) g_malloc (sizeof (PhonebookEntry))) == NULL)
+ {
+ fclose (f);
+ g_print (_("%s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
+ g_ptr_array_free (contactsMemory, TRUE);
+ return;
+ }
+
+ pbEntry->entry.Empty = FALSE;
+ pbEntry->entry.Name[0] = '\0';
+ pbEntry->entry.Number[0] = '\0';
+ pbEntry->entry.MemoryType = GMT_SM;
+ pbEntry->entry.Group = 5;
+ pbEntry->status = E_Deleted;
+ pbEntry->entry.SubEntriesCount=0;
+
+ g_ptr_array_add (contactsMemory, (gpointer) pbEntry);
+ pbEntry = NULL;
+ }
+
+
+ while (fgets (buf, IO_BUF_LEN, f))
+ {
+ if (ParseLine (&gsmEntry, &i, buf))
+ {
+ if (gsmEntry.MemoryType == GMT_ME && memoryStatus.FreeME > 0
+ && i > 0 && i <= memoryStatus.MaxME)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i - 1);
+
+ if (pbEntry->status == E_Deleted)
+ {
+ pbEntry->entry = gsmEntry;
+ pbEntry->status = E_Changed;
+ memoryStatus.UsedME++;
+ memoryStatus.FreeME--;
+ statusInfo.ch_ME = 1;
+ }
+ }
+ else if (gsmEntry.MemoryType == GMT_SM && memoryStatus.FreeSM > 0
+ && i > 0 && i <= memoryStatus.MaxSM)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, memoryStatus.MaxME + i - 1);
+
+ if (pbEntry->status == E_Deleted)
+ {
+ pbEntry->entry = gsmEntry;
+ pbEntry->status = E_Changed;
+ memoryStatus.UsedSM++;
+ memoryStatus.FreeSM--;
+ statusInfo.ch_SM = 1;
+ }
+ }
+ }
+ }
+
+ contactsMemoryInitialized = TRUE;
+ RefreshStatusInfo ();
+ GUIEventSend (GUI_EVENT_CONTACTS_CHANGED);
+ GUIEventSend (GUI_EVENT_SMS_NUMBER_CHANGED);
+}
+
+
+static void ImportContactsFileDialog ()
+{
+ static GtkWidget *fileDialog = NULL;
+
+ if (fileDialog == NULL)
+ {
+ fileDialog = gtk_file_selection_new (_("Import"));
+ gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
+ "clicked", GTK_SIGNAL_FUNC (OkImportDialog), (gpointer) fileDialog);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
+ }
+
+ gtk_widget_show (fileDialog);
+}
+
+
+static void ImportSaveCallback (GtkWidget *widget, gpointer data)
+{
+ gtk_widget_hide (GTK_WIDGET (data));
+ SaveContacts ();
+ ImportContactsFileDialog ();
+}
+
+
+static void ImportDontSaveCallback (GtkWidget *widget, gpointer data)
+{
+ gtk_widget_hide (GTK_WIDGET (data));
+ ImportContactsFileDialog ();
+}
+
+
+void static ImportSaveContacts (void)
+{
+ static GtkWidget *dialog = NULL;
+
+ if (dialog == NULL)
+ dialog = CreateSaveQuestionDialog (ImportSaveCallback, ImportDontSaveCallback);
+
+ gtk_widget_show (dialog);
+}
+
+
+static void ImportContacts (void)
+{
+ if (contactsMemoryInitialized == TRUE && (statusInfo.ch_ME || statusInfo.ch_SM))
+ ImportSaveContacts ();
+ else
+ ImportContactsFileDialog ();
+}
+
+
+static void QuitSaveCallback (GtkWidget *widget, gpointer data)
+{
+ PhoneEvent *e;
+
+ gtk_widget_hide (GTK_WIDGET (data));
+ SaveContacts ();
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_Exit;
+ e->data = NULL;
+ GUI_InsertEvent (e);
+ pthread_join (monitor_th, NULL);
+ gtk_main_quit ();
+}
+
+
+static void QuitDontSaveCallback (GtkWidget *widget, gpointer data)
+{
+ PhoneEvent *e;
+
+ gtk_widget_hide (GTK_WIDGET (data));
+ e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
+ e->event = Event_Exit;
+ e->data = NULL;
+ GUI_InsertEvent (e);
+ pthread_join (monitor_th, NULL);
+ gtk_main_quit ();
+}
+
+
+void GUI_QuitSaveContacts (void)
+{
+ static GtkWidget *dialog = NULL;
+
+ if (dialog == NULL)
+ dialog = CreateSaveQuestionDialog (QuitSaveCallback, QuitDontSaveCallback);
+
+ gtk_widget_show (dialog);
+}
+
+
+/* Function take number and return name belonged to number.
+ If no name is found, return NULL;
+ Do not modify returned name!
+*/
+gchar *GUI_GetName (gchar *number)
+{
+ PhonebookEntry *pbEntry;
+ register gint i;
+
+ if (contactsMemoryInitialized == FALSE || number == NULL)
+ return (gchar *)NULL;
+
+ for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+ if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
+ continue;
+
+ if (strcmp (pbEntry->entry.Number, number) == 0)
+ return pbEntry->entry.Name;
+ }
+
+ for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+ if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
+ continue;
+
+ if (strrncmp (pbEntry->entry.Number, number, 9) == 0)
+ return pbEntry->entry.Name;
+ }
+
+ return NULL;
+}
+
+
+gchar *GUI_GetNameExact (gchar *number)
+{
+ PhonebookEntry *pbEntry;
+ register gint i;
+
+ if (contactsMemoryInitialized == FALSE || number == NULL)
+ return (gchar *)NULL;
+
+ for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+ if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
+ continue;
+
+ if (strcmp (pbEntry->entry.Number, number) == 0)
+ return pbEntry->entry.Name;
+ }
+
+ return NULL;
+}
+
+
+gchar *GUI_GetNumber (gchar *name)
+{
+ PhonebookEntry *pbEntry;
+ register gint i;
+
+ if (contactsMemoryInitialized == FALSE || name == NULL || *name == '\0')
+ return (gchar *)NULL;
+
+ for(i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+
+ if (pbEntry->status == E_Empty || pbEntry->status == E_Deleted)
+ continue;
+
+ if (strcmp (pbEntry->entry.Name, name) == 0)
+ return pbEntry->entry.Number;
+ }
+
+ return NULL;
+}
+
+
+static void SelectDialogClickEntry (GtkWidget *clist,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ SelectContactData *data )
+{
+ if(event && event->type == GDK_2BUTTON_PRESS)
+ gtk_signal_emit_by_name(GTK_OBJECT (data->okButton), "clicked");
+}
+
+
+SelectContactData *GUI_SelectContactDialog (void)
+{
+ PhonebookEntry *pbEntry;
+ static SelectContactData selectContactData;
+ SortColumn *sColumn;
+ gchar *titles[4] = { "Name", "Number", "Memory", "Group"};
+ gint row_i = 0;
+ register gint i;
+ gchar string[100];
+
+ if (contactsMemoryInitialized == FALSE)
+ return NULL;
+
+ selectContactData.dialog = gtk_dialog_new ();
+ gtk_widget_set_usize (GTK_WIDGET (selectContactData.dialog), 436, 200);
+ gtk_window_set_title (GTK_WINDOW (selectContactData.dialog), _("Select contacts"));
+ gtk_window_set_modal (GTK_WINDOW (selectContactData.dialog), TRUE);
+
+ selectContactData.okButton = gtk_button_new_with_label (_("Ok"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->action_area),
+ selectContactData.okButton, TRUE, TRUE, 10);
+ GTK_WIDGET_SET_FLAGS (selectContactData.okButton, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (selectContactData.okButton);
+ gtk_widget_show (selectContactData.okButton);
+
+ selectContactData.cancelButton = gtk_button_new_with_label (_("Cancel"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->action_area),
+ selectContactData.cancelButton, TRUE, TRUE, 10);
+ gtk_widget_show (selectContactData.cancelButton);
+
+ selectContactData.clist = gtk_clist_new_with_titles (4, titles);
+ gtk_clist_set_shadow_type (GTK_CLIST (selectContactData.clist), GTK_SHADOW_OUT);
+ gtk_clist_set_compare_func (GTK_CLIST (selectContactData.clist), CListCompareFunc);
+ gtk_clist_set_sort_column (GTK_CLIST (selectContactData.clist), 0);
+ gtk_clist_set_sort_type (GTK_CLIST (selectContactData.clist), GTK_SORT_ASCENDING);
+ gtk_clist_set_auto_sort (GTK_CLIST (selectContactData.clist), FALSE);
+ gtk_clist_set_selection_mode (GTK_CLIST (selectContactData.clist), GTK_SELECTION_EXTENDED);
+
+ gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 0, 150);
+ gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 1, 115);
+ gtk_clist_set_column_width (GTK_CLIST(selectContactData.clist), 3, 70);
+ gtk_clist_set_column_justification (GTK_CLIST(selectContactData.clist), 2, GTK_JUSTIFY_CENTER);
+ gtk_clist_set_column_visibility (GTK_CLIST(selectContactData.clist), 3, (GetModelFeature(FN_CALLERGROUPS)!=0));
+
+ for (i = 0; i < 4; i++)
+ {
+ if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
+ {
+ g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
+ return NULL;
+ }
+ sColumn->clist = selectContactData.clist;
+ sColumn->column = i;
+ gtk_signal_connect (GTK_OBJECT (GTK_CLIST (selectContactData.clist)->column[i].button), "clicked",
+ GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
+ }
+
+ gtk_signal_connect (GTK_OBJECT (selectContactData.clist), "select_row",
+ GTK_SIGNAL_FUNC (SelectDialogClickEntry),
+ (gpointer) &selectContactData);
+
+ selectContactData.clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (selectContactData.clistScrolledWindow),
+ selectContactData.clist);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selectContactData.clistScrolledWindow),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (selectContactData.dialog)->vbox),
+ selectContactData.clistScrolledWindow,
+ TRUE, TRUE, 0);
+
+ gtk_widget_show (selectContactData.clist);
+ gtk_widget_show (selectContactData.clistScrolledWindow);
+
+ if (xgnokiiConfig.callerGroups[0] == NULL)
+ GUI_InitCallerGroupsInf ();
+
+ gtk_clist_freeze (GTK_CLIST (selectContactData.clist));
+ for (i = 0; i < memoryStatus.MaxME + memoryStatus.MaxSM; i++)
+ {
+ gchar *row[4];
+
+ pbEntry = g_ptr_array_index (contactsMemory, i);
+ if (pbEntry->status != E_Empty && pbEntry->status != E_Deleted)
+ {
+ row[0] = pbEntry->entry.Name;
+
+ if (pbEntry->entry.SubEntriesCount>0) {
+ snprintf(string,100,"%s *",pbEntry->entry.Number);
+ row[1]=string;
+ } else row[1] = pbEntry->entry.Number;
+
+
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ row[2] = "P";
+ else
+ row[2] = "S";
+ if (GetModelFeature(FN_CALLERGROUPS)!=0)
+ row[3] = xgnokiiConfig.callerGroups[pbEntry->entry.Group];
+ else
+ row[3] = "";
+ gtk_clist_append (GTK_CLIST (selectContactData.clist), row);
+ if (pbEntry->entry.MemoryType == GMT_ME)
+ gtk_clist_set_pixmap (GTK_CLIST (selectContactData.clist), row_i, 2,
+ memoryPixmaps.phoneMemPix, memoryPixmaps.mask);
+ else
+ gtk_clist_set_pixmap (GTK_CLIST (selectContactData.clist), row_i, 2,
+ memoryPixmaps.simMemPix, memoryPixmaps.mask);
+
+ gtk_clist_set_row_data (GTK_CLIST (selectContactData.clist), row_i++, (gpointer) pbEntry);
+ }
+ }
+
+ gtk_clist_sort (GTK_CLIST (selectContactData.clist));
+ gtk_clist_thaw (GTK_CLIST (selectContactData.clist));
+
+ gtk_widget_show (selectContactData.dialog);
+
+ return &selectContactData;
+}
+
+
+static GtkItemFactoryEntry menu_items[] = {
+ { NULL, NULL, NULL, 0, "<Branch>"},
+ { NULL, "<control>R", ReadContacts, 0, NULL},
+ { NULL, "<control>S", SaveContacts, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>I", ImportContacts, 0, NULL},
+ { NULL, "<control>E", ExportContacts, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>W", CloseContacts, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Branch>"},
+ { NULL, "<control>N", NewEntry, 0, NULL},
+ { NULL, "<control>U", DuplicateEntry, 0, NULL},
+ { NULL, NULL, EditEntry, 0, NULL},
+ { NULL, "<control>D", DeleteEntry, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>C", ChMemType, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>F", FindFirstEntry, 0, NULL},
+ { NULL, "<control>L", SearchEntry, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>A", SelectAll, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Branch>"},
+ { NULL, "<control>V", DialVoice, 0, NULL},
+ { NULL, NULL, NULL, 0, "<LastBranch>"},
+ { NULL, NULL, Help1, 0, NULL},
+ { NULL, NULL, GUI_ShowAbout, 0, NULL},
+};
+
+
+static void InitMainMenu (void)
+{
+ menu_items[0].path = g_strdup (_("/_File"));
+ menu_items[1].path = g_strdup (_("/File/_Read from phone"));
+ menu_items[2].path = g_strdup (_("/File/_Save to phone"));
+ menu_items[3].path = g_strdup (_("/File/Sep1"));
+ menu_items[4].path = g_strdup (_("/File/_Import from file"));
+ menu_items[5].path = g_strdup (_("/File/_Export to file"));
+ menu_items[6].path = g_strdup (_("/File/Sep2"));
+ menu_items[7].path = g_strdup (_("/File/_Close"));
+ menu_items[8].path = g_strdup (_("/_Edit"));
+ menu_items[9].path = g_strdup (_("/Edit/_New"));
+ menu_items[10].path = g_strdup (_("/Edit/D_uplicate"));
+ menu_items[11].path = g_strdup (_("/Edit/_Edit"));
+ menu_items[12].path = g_strdup (_("/Edit/_Delete"));
+ menu_items[13].path = g_strdup (_("/Edit/Sep3"));
+ menu_items[14].path = g_strdup (_("/Edit/_Change memory type"));
+ menu_items[15].path = g_strdup (_("/Edit/Sep4"));
+ menu_items[16].path = g_strdup (_("/Edit/_Find"));
+ menu_items[17].path = g_strdup (_("/Edit/Find ne_xt"));
+ menu_items[18].path = g_strdup (_("/Edit/Sep5"));
+ menu_items[19].path = g_strdup (_("/Edit/Select _all"));
+ menu_items[20].path = g_strdup (_("/_Dial"));
+ menu_items[21].path = g_strdup (_("/Dial/Dial _voice"));
+ menu_items[22].path = g_strdup (_("/_Help"));
+ menu_items[23].path = g_strdup (_("/Help/_Help"));
+ menu_items[24].path = g_strdup (_("/Help/_About"));
+}
+
+
+void GUI_CreateContactsWindow (void)
+{
+ int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
+ GtkItemFactory *item_factory;
+ GtkAccelGroup *accel_group;
+ SortColumn *sColumn;
+ GtkWidget *menubar;
+ GtkWidget *main_vbox;
+ GtkWidget *toolbar;
+ GtkWidget *clistScrolledWindow;
+ GtkWidget *status_hbox;
+ register gint i;
+ gchar *titles[4] = { _("Name"), _("Number"), _("Memory"), _("Group")};
+
+ InitMainMenu ();
+ contactsMemoryInitialized = FALSE;
+ GUI_ContactsWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (GUI_ContactsWindow), _("Contacts"));
+ gtk_widget_set_usize (GTK_WIDGET (GUI_ContactsWindow), 436, 220);
+ //gtk_container_set_border_width (GTK_CONTAINER (GUI_ContactsWindow), 10);
+ gtk_signal_connect (GTK_OBJECT (GUI_ContactsWindow), "delete_event",
+ GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+ gtk_widget_realize (GUI_ContactsWindow);
+
+ accel_group = gtk_accel_group_new ();
+ item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
+ accel_group);
+
+ gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
+
+ gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_ContactsWindow));
+
+ /* Finally, return the actual menu bar created by the item factory. */
+ menubar = gtk_item_factory_get_widget (item_factory, "<main>");
+
+ main_vbox = gtk_vbox_new (FALSE, 1);
+ gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
+ gtk_container_add (GTK_CONTAINER (GUI_ContactsWindow), main_vbox);
+ gtk_widget_show (main_vbox);
+
+ gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
+ gtk_widget_show (menubar);
+
+ /* Create the toolbar */
+
+ toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
+ gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
+
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Read from phone"), NULL,
+ NewPixmap(Read_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) ReadContacts, NULL);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Save to phone"), NULL,
+ NewPixmap(Send_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) SaveContacts, NULL);
+
+ gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Import from file"), NULL,
+ NewPixmap(Open_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) ImportContacts, NULL);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Export to file"), NULL,
+ NewPixmap(Save_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) ExportContacts, NULL);
+
+ gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
+
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("New entry"), NULL,
+ NewPixmap(New_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) NewEntry, NULL);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Duplicate entry"), NULL,
+ NewPixmap(Duplicate_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) DuplicateEntry, NULL);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Edit entry"), NULL,
+ NewPixmap(Edit_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) EditEntry, NULL);
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Delete entry"), NULL,
+ NewPixmap(Delete_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) DeleteEntry, NULL);
+
+ gtk_toolbar_append_space (GTK_TOOLBAR(toolbar));
+
+ gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Dial voice"), NULL,
+ NewPixmap(Dial_xpm, GUI_ContactsWindow->window,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc) DialVoice, NULL);
+
+// gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
+
+ gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
+ gtk_widget_show (toolbar);
+
+
+ clist = gtk_clist_new_with_titles (4, titles);
+ gtk_clist_set_shadow_type (GTK_CLIST (clist), GTK_SHADOW_OUT);
+ gtk_clist_set_compare_func (GTK_CLIST (clist), CListCompareFunc);
+ gtk_clist_set_sort_column (GTK_CLIST (clist), 0);
+ gtk_clist_set_sort_type (GTK_CLIST (clist), GTK_SORT_ASCENDING);
+ gtk_clist_set_auto_sort (GTK_CLIST (clist), FALSE);
+ gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_EXTENDED);
+
+ gtk_clist_set_column_width (GTK_CLIST (clist), 0, 150);
+ gtk_clist_set_column_width (GTK_CLIST (clist), 1, 115);
+ gtk_clist_set_column_width (GTK_CLIST (clist), 3, 70);
+ gtk_clist_set_column_justification (GTK_CLIST (clist), 2, GTK_JUSTIFY_CENTER);
+// gtk_clist_set_column_visibility (GTK_CLIST (clist), 3, (GetModelFeature(FN_CALLERGROUPS)!=0));
+
+ for (i = 0; i < 4; i++)
+ {
+ if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
+ {
+ g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
+ gtk_main_quit ();
+ }
+ sColumn->clist = clist;
+ sColumn->column = i;
+ gtk_signal_connect (GTK_OBJECT (GTK_CLIST (clist)->column[i].button), "clicked",
+ GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
+ }
+
+ gtk_signal_connect (GTK_OBJECT (clist), "select_row",
+ GTK_SIGNAL_FUNC (ClickEntry), NULL);
+
+ clistScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (clistScrolledWindow), clist);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clistScrolledWindow),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start (GTK_BOX (main_vbox), clistScrolledWindow,
+ TRUE, TRUE, 0);
+
+ gtk_widget_show (clist);
+ gtk_widget_show (clistScrolledWindow);
+
+ status_hbox = gtk_hbox_new (FALSE,20);
+ gtk_box_pack_start (GTK_BOX (main_vbox), status_hbox, FALSE, FALSE, 0);
+ gtk_widget_show (status_hbox);
+
+ memoryStatus.MaxME = memoryStatus.UsedME = memoryStatus.FreeME =
+ memoryStatus.MaxSM = memoryStatus.UsedSM = memoryStatus.FreeSM = 0;
+ statusInfo.ch_ME = statusInfo.ch_SM = 0;
+
+ statusInfo.label = gtk_label_new ("");
+ RefreshStatusInfo ();
+ gtk_box_pack_start (GTK_BOX (status_hbox), statusInfo.label, FALSE, FALSE, 10);
+ gtk_widget_show (statusInfo.label);
+
+ memoryPixmaps.simMemPix = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
+ &memoryPixmaps.mask,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
+ sim_xpm);
+
+ memoryPixmaps.phoneMemPix = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
+ &memoryPixmaps.mask,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
+ phone_xpm);
+
+ questMark.pixmap = gdk_pixmap_create_from_xpm_d (GUI_ContactsWindow->window,
+ &questMark.mask,
+ &GUI_ContactsWindow->style->bg[GTK_STATE_NORMAL],
+ quest_xpm);
+
+ CreateErrorDialog (&errorDialog, GUI_ContactsWindow);
+ GUIEventAdd (GUI_EVENT_CONTACTS_CHANGED, GUI_RefreshContacts);
+ GUIEventAdd (GUI_EVENT_CALLERS_GROUPS_CHANGED, GUI_RefreshGroupMenu);
+}
+