7 A Linux/Unix GUI for Nokia mobile phones.
8 Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
9 & Ján Derfiòák <ja@mail.upjs.sk>.
11 Released under the terms of the GNU GPL, see file COPYING for more details.
23 #include <gdk/gdkkeysyms.h>
26 #include "xgnokii_common.h"
28 #include "xgnokii_lowlevel.h"
29 #include "xgnokii_contacts.h"
30 #include "xgnokii_sms.h"
31 #include "xpm/Edit.xpm"
32 #include "xpm/Delete.xpm"
33 #include "xpm/Forward.xpm"
34 #include "xpm/Reply.xpm"
35 #include "xpm/Send.xpm"
36 #include "xpm/SendSMS.xpm"
37 #include "xpm/Check.xpm"
38 #include "xpm/Names.xpm"
39 #include "xpm/BCard.xpm"
40 #include "xpm/quest.xpm"
43 gint count; // Messages count
44 gint number; // Number of tail in Long SMS;
45 gint *msgPtr; // Array of MessageNumber;
48 gchar sender[GSM_MAX_SENDER_LENGTH + 1];
67 GtkWidget *SMSSendWindow;
68 GtkWidget *smsSendText;
73 GtkWidget *smscOptionMenu;
79 static GtkWidget *GUI_SMSWindow;
80 static SMSWidget SMS = {NULL, NULL, NULL};
81 static SendSMSWidget sendSMS = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
82 static ErrorDialog errorDialog = {NULL, NULL};
83 static InfoDialog infoDialog = {NULL, NULL};
84 static QuestMark questMark;
87 static inline void Help1 (GtkWidget *w, gpointer data)
89 gchar *indx = g_strdup_printf ("/help/%s/windows/sms/index.html", xgnokiiConfig.locale);
95 static inline void Help2 (GtkWidget *w, gpointer data)
97 gchar *indx = g_strdup_printf ("/help/%s/sms_send.html", xgnokiiConfig.locale);
103 static inline void CloseSMS (GtkWidget *w, gpointer data)
105 gtk_widget_hide (GUI_SMSWindow);
109 static inline void CloseSMSSend (GtkWidget *w, gpointer data)
111 gtk_widget_hide (sendSMS.SMSSendWindow);
115 static gint CListCompareFunc (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
120 GtkCListRow *row1 = (GtkCListRow *) ptr1;
121 GtkCListRow *row2 = (GtkCListRow *) ptr2;
123 switch (row1->cell[clist->sort_column].type)
126 text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
128 case GTK_CELL_PIXTEXT:
129 text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text;
134 switch (row2->cell[clist->sort_column].type)
137 text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
139 case GTK_CELL_PIXTEXT:
140 text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text;
147 return (text1 != NULL);
152 if (clist->sort_column == 1 && !SMS.currentBox)
157 bdTime.tm_sec = atoi (text1 + 15);
158 bdTime.tm_min = atoi (text1 + 12);
159 bdTime.tm_hour = atoi (text1 + 9);
160 bdTime.tm_mday = atoi (text1);
161 bdTime.tm_mon = atoi (text1 + 3) - 1;
162 bdTime.tm_year = atoi (text1 + 6);
163 if (bdTime.tm_year < 70)
164 bdTime.tm_year += 100;
166 if (text1[17] != '\0')
167 bdTime.tm_gmtoff = atoi (text1 + 18) * 3600;
169 bdTime.tm_isdst = -1;
171 time1 = mktime (&bdTime);
173 bdTime.tm_sec = atoi (text2 + 15);
174 bdTime.tm_min = atoi (text2 + 12);
175 bdTime.tm_hour = atoi (text2 + 9);
176 bdTime.tm_mday = atoi (text2);
177 bdTime.tm_mon = atoi (text2 + 3) - 1;
178 bdTime.tm_year = atoi (text2 + 6);
179 if (bdTime.tm_year < 70)
180 bdTime.tm_year += 100;
182 if (text2[17] != '\0')
183 bdTime.tm_gmtoff = atoi (text2 + 18) * 3600;
185 bdTime.tm_isdst = -1;
187 time2 = mktime (&bdTime);
191 else if (time1 > time2)
197 return (g_strcasecmp (text1, text2));
201 static inline void DestroyMsgPtrs (gpointer data)
203 g_free (((MessagePointers *) data)->msgPtr);
204 g_free ((MessagePointers *) data);
208 static void InsertInboxElement (gpointer d, gpointer userData)
210 GSM_SMSMessage *data = (GSM_SMSMessage *) d;
211 MessagePointers *msgPtrs;
214 if (data->Type == SMS_Deliver || data->Type == SMS_Delivery_Report)
216 /* if (data->Type == GST_MT && data->UDHType == GSM_ConcatenatedMessages)
220 msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
221 msgPtrs->count = data->UDH[4];
222 msgPtrs->number = data->UDH[5];
223 msgPtrs->validity = data->Validity;
224 msgPtrs->class = data->Class;
225 strcpy (msgPtrs->sender, data->Sender);
226 msgPtrs->msgPtr = (gint *) g_malloc (msgPtrs->count * sizeof (gint));
227 *(msgPtrs->msgPtr + msgPtrs->number - 1) = data->MessageNumber;
233 if (data->Type == SMS_Delivery_Report)
235 row[0] = g_strdup (_("report"));
236 dt = &(data->SMSCTime);
238 else if (data->Status)
240 row[0] = g_strdup (_("read"));
245 row[0] = g_strdup (_("unread"));
250 row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d %c%02d00",
251 dt->Day, dt->Month, dt->Year,
252 dt->Hour, dt->Minute, dt->Second,
253 dt->Timezone > 0 ? '+' : '-', abs (dt->Timezone));
255 row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d",
256 dt->Day, dt->Month, dt->Year,
257 dt->Hour, dt->Minute, dt->Second);
259 row[2] = GUI_GetName (data->RemoteNumber.number);
261 row[2] = data->RemoteNumber.number;
262 row[3] = data->MessageText;
264 gtk_clist_append (GTK_CLIST (SMS.smsClist), row);
265 msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
266 msgPtrs->count = msgPtrs->number = 1;
267 msgPtrs->validity = data->Validity.u.Relative;
268 // msgPtrs->class = data->Class;
269 strcpy (msgPtrs->sender, data->RemoteNumber.number);
270 msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
271 *(msgPtrs->msgPtr) = (int)data->Number;
272 gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
273 msgPtrs, DestroyMsgPtrs);
281 static inline void RefreshInbox (void)
283 gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
285 gtk_clist_clear (GTK_CLIST (SMS.smsClist));
288 g_slist_foreach (phoneMonitor.sms.messages, InsertInboxElement, (gpointer) NULL);
290 gtk_clist_sort (GTK_CLIST (SMS.smsClist));
291 gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
295 static void InsertOutboxElement (gpointer d, gpointer userData)
297 GSM_SMSMessage *data = (GSM_SMSMessage *) d;
298 MessagePointers *msgPtrs;
300 if (data->Type == SMS_Submit)
305 row[0] = g_strdup (_("sent"));
307 row[0] = g_strdup (_("unsent"));
309 row[1] = row[2] = g_strdup ("");
310 row[3] = data->MessageText;
312 gtk_clist_append( GTK_CLIST (SMS.smsClist), row);
313 msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
314 msgPtrs->count = msgPtrs->number = 1;
315 msgPtrs->validity = data->Validity.u.Relative;
316 // msgPtrs->class = data->Class;
317 strcpy (msgPtrs->sender, data->RemoteNumber.number);
318 msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
319 *(msgPtrs->msgPtr) = (int)data->Number;
320 gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
321 msgPtrs, DestroyMsgPtrs);
328 static inline void RefreshOutbox (void)
330 gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
331 gtk_clist_clear (GTK_CLIST (SMS.smsClist));
334 g_slist_foreach (phoneMonitor.sms.messages, InsertOutboxElement, (gpointer) NULL);
336 gtk_clist_sort (GTK_CLIST (SMS.smsClist));
337 gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
341 inline void GUI_RefreshMessageWindow (void)
343 if (!GTK_WIDGET_VISIBLE (GUI_SMSWindow))
353 static void SelectTreeItem (GtkWidget *item, gpointer data)
355 SMS.currentBox = GPOINTER_TO_INT (data);
356 GUI_RefreshMessageWindow ();
360 static void ClickEntry (GtkWidget *clist,
363 GdkEventButton *event,
368 /* FIXME - We must mark SMS as readed */
369 gtk_text_freeze (GTK_TEXT (SMS.smsText));
371 gtk_text_set_point (GTK_TEXT (SMS.smsText), 0);
372 gtk_text_forward_delete (GTK_TEXT (SMS.smsText), gtk_text_get_length (GTK_TEXT (SMS.smsText)));
374 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.colour), NULL,
376 gtk_clist_get_text (GTK_CLIST (clist), row, 2, &buf);
377 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
379 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
382 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.colour), NULL,
384 gtk_clist_get_text (GTK_CLIST (clist), row, 1, &buf);
385 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
387 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
390 gtk_clist_get_text (GTK_CLIST (clist), row, 3, &buf);
391 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
394 gtk_text_thaw (GTK_TEXT (SMS.smsText));
398 inline void GUI_ShowSMS (void)
400 gtk_widget_show (GUI_SMSWindow);
401 GUI_RefreshMessageWindow ();
405 static void OkDeleteSMSDialog (GtkWidget *widget, gpointer data)
407 GSM_SMSMessage *message;
415 sel = GTK_CLIST (SMS.smsClist)->selection;
417 gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
421 row = GPOINTER_TO_INT (sel->data);
423 for (count = 0; count < ((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->count; count++)
426 message = (GSM_SMSMessage *) g_malloc (sizeof (GSM_SMSMessage));
427 number = *(((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->msgPtr + count);
433 message->Number = number;
434 message->MemoryType = GMT_SM;
436 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
437 e->event = Event_DeleteSMSMessage;
441 /* error = GSM->DeleteSMSMessage(&message);
443 if (error != GE_NONE)
445 if (error == GE_NOTIMPLEMENTED)
447 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Function not implemented!"));
448 gtk_widget_show(errorDialog.dialog);
452 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Delete SMS failed!"));
453 gtk_widget_show(errorDialog.dialog);
460 gtk_widget_hide (GTK_WIDGET (data));
462 gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
466 static void DeleteSMS (void)
468 static GtkWidget *dialog = NULL;
469 GtkWidget *button, *hbox, *label, *pixmap;
473 dialog = gtk_dialog_new();
474 gtk_window_set_title (GTK_WINDOW (dialog), _("Delete SMS"));
475 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
476 gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
477 gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
478 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
479 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
481 button = gtk_button_new_with_label (_("Ok"));
482 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
483 button, TRUE, TRUE, 10);
484 gtk_signal_connect (GTK_OBJECT (button), "clicked",
485 GTK_SIGNAL_FUNC (OkDeleteSMSDialog), (gpointer) dialog);
486 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
487 gtk_widget_grab_default (button);
488 gtk_widget_show (button);
489 button = gtk_button_new_with_label (_("Cancel"));
490 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
491 button, TRUE, TRUE, 10);
492 gtk_signal_connect (GTK_OBJECT (button), "clicked",
493 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
494 gtk_widget_show (button);
496 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
498 hbox = gtk_hbox_new (FALSE, 0);
499 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
500 gtk_widget_show (hbox);
502 pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
503 gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 10);
504 gtk_widget_show (pixmap);
506 label = gtk_label_new (_("Do you want to delete selected SMS?"));
507 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 10);
508 gtk_widget_show (label);
511 gtk_widget_show (GTK_WIDGET (dialog));
515 static void SaveToMailbox (void)
521 struct tm t, *loctime;
525 gchar *number, *text, *loc;
528 if ((f = fopen (xgnokiiConfig.mailbox, "a")) == NULL)
530 snprintf (buf, 255, _("Cannot open mailbox %s for appending!"), xgnokiiConfig.mailbox);
531 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
532 gtk_widget_show (errorDialog.dialog);
537 lock.l_type = F_WRLCK;
538 lock.l_whence = SEEK_SET;
542 if (fcntl (fd, F_GETLK, &lock) != -1 && lock.l_type != F_UNLCK)
544 snprintf (buf, 255, _("Cannot save to mailbox %s.\n\
545 %s is locked for process %d!"), xgnokiiConfig.mailbox, xgnokiiConfig.mailbox,
547 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
548 gtk_widget_show (errorDialog.dialog);
553 lock.l_type = F_WRLCK;
554 lock.l_whence = SEEK_SET;
557 if (fcntl (fd, F_SETLK, &lock) == -1)
559 snprintf (buf, 255, _("Cannot lock mailbox %s!"), xgnokiiConfig.mailbox);
560 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
561 gtk_widget_show (errorDialog.dialog);
566 sel = GTK_CLIST (SMS.smsClist)->selection;
570 row = GPOINTER_TO_INT (sel->data);
572 gtk_clist_get_text (GTK_CLIST (SMS.smsClist), row, 1, &text);
573 t.tm_sec = atoi (text + 15);
574 t.tm_min = atoi (text + 12);
575 t.tm_hour = atoi (text + 9);
576 t.tm_mday = atoi (text);
577 t.tm_mon = atoi (text + 3) - 1;
578 t.tm_year = atoi (text + 6);
582 if (text[17] != '\0')
583 t.tm_gmtoff = atoi (text + 18) * 3600;
586 caltime = mktime (&t);
587 loctime = localtime (&caltime);
589 gtk_clist_get_text (GTK_CLIST (SMS.smsClist), row, 2, &number);
590 gtk_clist_get_text (GTK_CLIST (SMS.smsClist), row, 3, &text);
592 fprintf (f, "From %s@xgnokii %s", number, asctime (loctime));
593 loc = setlocale (LC_ALL, "C");
594 strftime (buf, 255, "Date: %a, %d %b %Y %H:%M:%S %z (%Z)\n", loctime);
595 setlocale (LC_ALL, loc);
596 fprintf (f, "%s", buf);
597 fprintf (f, "From: %s@xgnokii\n", number);
598 strncpy (buf, text, 20);
600 fprintf (f, "Subject: %s\n\n", buf);
601 fprintf (f, "%s\n\n", text);
604 lock.l_type = F_UNLCK;
605 lock.l_whence = SEEK_SET;
608 if (fcntl (fd, F_SETLK, &lock) == -1)
610 snprintf (buf, 255, _("Cannot unlock mailbox %s!"), xgnokiiConfig.mailbox);
611 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
612 gtk_widget_show (errorDialog.dialog);
619 static inline void RefreshSMSStatus (void)
624 l = gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText));
626 if (l <= GSM_MAX_SMS_LENGTH)
627 buf = g_strdup_printf ("%d/1", l);
631 buf = g_strdup_printf ("%d/%d", l > 0 && !m ? 153 : m, l == 0 ? 1 : ((l - 1) / 153) + 1);
634 gtk_frame_set_label (GTK_FRAME (sendSMS.status), buf);
639 static inline gint RefreshSMSLength (GtkWidget *widget,
641 gpointer callback_data)
644 if (GTK_EDITABLE (widget)->editable == FALSE)
646 if (event->keyval == GDK_BackSpace || event->keyval == GDK_Clear ||
647 event->keyval == GDK_Insert || event->keyval == GDK_Delete ||
648 event->keyval == GDK_Home || event->keyval == GDK_End ||
649 event->keyval == GDK_Left || event->keyval == GDK_Right ||
650 event->keyval == GDK_Up || event->keyval == GDK_Down ||
651 event->keyval == GDK_Return ||
652 (event->keyval >= 0x20 && event->keyval <= 0xFF))
659 static inline void SetActiveCenter (GtkWidget *item, gpointer data)
661 sendSMS.center = GPOINTER_TO_INT (data);
665 void GUI_RefreshSMSCenterMenu (void)
667 static GtkWidget *smscMenu = NULL;
671 if (!sendSMS.smscOptionMenu)
676 gtk_option_menu_remove_menu (GTK_OPTION_MENU (sendSMS.smscOptionMenu));
677 if (GTK_IS_WIDGET (smscMenu))
678 gtk_widget_destroy (GTK_WIDGET (smscMenu));
682 smscMenu = gtk_menu_new();
684 for (i = 0; i < xgnokiiConfig.smsSets; i++)
686 if (*(xgnokiiConfig.smsSetting[i].Name) == '\0')
688 gchar *buf = g_strdup_printf (_("Set %d"), i + 1);
689 item = gtk_menu_item_new_with_label (buf);
693 item = gtk_menu_item_new_with_label (xgnokiiConfig.smsSetting[i].Name);
695 gtk_signal_connect (GTK_OBJECT (item), "activate",
696 GTK_SIGNAL_FUNC (SetActiveCenter),
699 gtk_widget_show (item);
700 gtk_menu_append (GTK_MENU (smscMenu), item);
702 gtk_option_menu_set_menu (GTK_OPTION_MENU (sendSMS.smscOptionMenu), smscMenu);
706 static inline void InitAddressLine (gpointer d, gpointer userData)
708 ((AddressPar *) d)->used = 0;
713 static inline void PrintAddressLine (gpointer d, gpointer userData)
715 g_print ("Name: %s\nNumber: %s\nUsed: %d\n",
716 ((AddressPar *) d)->name,
717 ((AddressPar *) d)->number,
718 ((AddressPar *) d)->used);
723 static inline gint CompareAddressLineName (gconstpointer a, gconstpointer b)
725 return strcmp (((AddressPar *) a)->name, ((AddressPar *) b)->name);
729 static inline gint CompareAddressLineUsed (gconstpointer a, gconstpointer b)
731 return !(((AddressPar *) a)->used == ((AddressPar *) b)->used);
735 static gint CheckAddressMain (void)
743 gchar **strings = g_strsplit (gtk_entry_get_text (GTK_ENTRY (sendSMS.addr)), ",", 0);
745 tooltipBuf = g_string_new ("");
746 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
747 g_slist_foreach (sendSMS.addressLine, InitAddressLine, (gpointer) NULL);
751 g_strstrip (strings[i]);
752 if (*strings[i] == '\0')
757 if ((buf = GUI_GetName (strings[i])) != NULL)
759 AddressPar *ap = g_malloc (sizeof (AddressPar));
760 ap->number = g_strdup (strings[i]);
761 ap->name = g_strdup (buf);
763 sendSMS.addressLine = g_slist_append (sendSMS.addressLine, ap);
764 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), buf);
765 g_string_append (tooltipBuf, ap->number);
768 if ((buf = GUI_GetNumber (strings[i])) != NULL)
770 aps.name = strings[i];
771 r = g_slist_find_custom (sendSMS.addressLine, &aps, CompareAddressLineName);
774 ((AddressPar *) r->data)->used = 1;
775 g_string_append (tooltipBuf, ((AddressPar *) r->data)->number);
778 g_string_append (tooltipBuf, buf);
779 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), strings[i]);
783 gint len = strlen (strings[i]);
786 for (j = 0; j < len; j++)
787 if (strings[i][j] != '*' && strings[i][j] != '#' && strings[i][j] != '+'
788 && (strings[i][j] < '0' || strings[i][j] > '9'))
790 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), strings[i]);
791 g_string_append (tooltipBuf, strings[i]);
793 if (strings[i + 1] != NULL)
795 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), ", ");
796 g_string_append (tooltipBuf, ", ");
802 while ((r = g_slist_find_custom (sendSMS.addressLine, &aps, CompareAddressLineUsed)))
803 sendSMS.addressLine = g_slist_remove (sendSMS.addressLine, r->data);
805 if (tooltipBuf->len > 0)
807 gtk_tooltips_set_tip (sendSMS.addrTip, sendSMS.addr, tooltipBuf->str, NULL);
808 gtk_tooltips_enable (sendSMS.addrTip);
811 gtk_tooltips_disable (sendSMS.addrTip);
814 g_slist_foreach (sendSMS.addressLine, PrintAddressLine, (gpointer) NULL);
817 g_strfreev (strings);
818 g_string_free (tooltipBuf, TRUE);
824 static inline void CheckAddress (void)
826 if (CheckAddressMain ())
828 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Address line contains illegal address!"));
829 gtk_widget_show(errorDialog.dialog);
834 static void DeleteSelectContactDialog (GtkWidget *widget, GdkEvent *event,
835 SelectContactData *data)
837 gtk_widget_destroy (GTK_WIDGET (data->clist));
838 gtk_widget_destroy (GTK_WIDGET (data->clistScrolledWindow));
839 gtk_widget_destroy (GTK_WIDGET (widget));
843 static void CancelSelectContactDialog (GtkWidget *widget,
844 SelectContactData *data)
846 gtk_widget_destroy (GTK_WIDGET (data->clist));
847 gtk_widget_destroy (GTK_WIDGET (data->clistScrolledWindow));
848 gtk_widget_destroy (GTK_WIDGET (data->dialog));
852 static void OkSelectContactDialog (GtkWidget *widget,
853 SelectContactData *data)
856 PhonebookEntry *pbEntry;
858 if ((sel = GTK_CLIST (data->clist)->selection) != NULL)
861 AddressPar *ap = g_malloc (sizeof (AddressPar));
863 pbEntry = gtk_clist_get_row_data (GTK_CLIST (data->clist),
864 GPOINTER_TO_INT (sel->data));
865 ap->number = g_strdup (pbEntry->entry.Number);
866 ap->name = g_strdup (pbEntry->entry.Name);
868 sendSMS.addressLine = g_slist_append (sendSMS.addressLine, ap);
869 if (strlen (gtk_entry_get_text (GTK_ENTRY (sendSMS.addr))) > 0)
870 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), ", ");
871 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), ap->name);
876 gtk_widget_destroy (GTK_WIDGET (data->clist));
877 gtk_widget_destroy (GTK_WIDGET (data->clistScrolledWindow));
878 gtk_widget_destroy (GTK_WIDGET (data->dialog));
884 static void ShowSelectContactsDialog (void)
886 SelectContactData *r;
888 if (!GUI_ContactsIsIntialized ())
891 if ((r = GUI_SelectContactDialog ()) == NULL)
894 gtk_signal_connect (GTK_OBJECT (r->dialog), "delete_event",
895 GTK_SIGNAL_FUNC (DeleteSelectContactDialog), (gpointer) r);
897 gtk_signal_connect (GTK_OBJECT (r->okButton), "clicked",
898 GTK_SIGNAL_FUNC (OkSelectContactDialog), (gpointer) r);
899 gtk_signal_connect (GTK_OBJECT (r->cancelButton), "clicked",
900 GTK_SIGNAL_FUNC (CancelSelectContactDialog), (gpointer) r);
904 static gint SendSMSCore (GSM_SMSMessage *sms)
907 PhoneEvent *e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
908 D_SMSMessage *m = (D_SMSMessage *) g_malloc (sizeof (D_SMSMessage));
911 e->event = Event_SendSMSMessage;
914 pthread_mutex_lock (&sendSMSMutex);
915 pthread_cond_wait (&sendSMSCond, &sendSMSMutex);
916 pthread_mutex_unlock (&sendSMSMutex);
919 g_print ("Address: %s\nText: %s\nDelivery report: %d\nSMS Center: %d\n",
920 sms->RemoteNumber.number,
922 GTK_TOGGLE_BUTTON (sendSMS.report)->active,
929 if (error != GE_SMSSENDOK)
931 gchar *buf = g_strdup_printf (_("SMS send to %s failed\n(error=%d)"),
932 sms->RemoteNumber.number, error);
933 gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
934 gtk_widget_show (errorDialog.dialog);
938 g_print ("Message sent to: %s\n", sms->RemoteNumber.number);
944 static void SendSMS (void)
950 gchar *text, *number;
953 gint offset, nr_msg, l;
955 register gint i = 0, j;
957 if (CheckAddressMain ())
959 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Address line contains illegal address!"));
960 gtk_widget_show(errorDialog.dialog);
964 text = gtk_editable_get_chars (GTK_EDITABLE (sendSMS.smsSendText), 0, -1);
967 addresses = g_strsplit (gtk_entry_get_text (GTK_ENTRY (sendSMS.addr)), ",", 0);
969 longSMS = GTK_TOGGLE_BUTTON (sendSMS.longSMS)->active;
973 g_strstrip (addresses[i]);
974 if ((number = GUI_GetNumber (addresses[i])))
976 aps.name = addresses[i];
977 if ((r = g_slist_find_custom (sendSMS.addressLine, &aps, CompareAddressLineName)))
978 number = ((AddressPar *) r->data)->number;
981 number = addresses[i];
983 sms.MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center];
984 sms.MessageCenter.No = 0;
986 if (GTK_TOGGLE_BUTTON (sendSMS.report)->active)
990 sms.Type = SMS_Submit;
992 sms.DCS.Type = SMS_GeneralDataCoding;
993 sms.DCS.u.General.Compressed = false;
994 sms.DCS.u.General.Alphabet = SMS_DefaultAlphabet;
995 sms.DCS.u.General.Class = 0;
996 sms.MessageCenter.No = 1;
997 sms.Validity.VPF = SMS_RelativeFormat;
998 sms.Validity.u.Relative = sms.MessageCenter.Validity; /* 4320 minutes == 72 hours */
1001 strncpy (sms.RemoteNumber.number, number, GSM_MAX_DESTINATION_LENGTH + 1);
1002 sms.RemoteNumber.number[GSM_MAX_DESTINATION_LENGTH] = '\0';
1004 if (l > GSM_MAX_SMS_LENGTH)
1008 sms.UDH[0].Type = SMS_ConcatenatedMessages;
1009 nr_msg = ((l - 1) / 153) + 1;
1010 udh[0] = 0x05; // UDH length
1011 udh[1] = 0x00; // concatenated messages (IEI)
1012 udh[2] = 0x03; // IEI data length
1013 udh[3] = 0x01; // reference number
1014 udh[4] = nr_msg; // number of messages
1015 udh[5] = 0x00; // message reference number
1018 for (j = 0; j < nr_msg; j++)
1022 memcpy(sms.MessageText,udh,offset);
1023 strncpy (sms.MessageText+offset, text + (j * 153), 153);
1024 sms.MessageText[153] = '\0';
1026 buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
1027 sms.RemoteNumber.number, j + 1, nr_msg);
1028 gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
1029 gtk_widget_show_now (infoDialog.dialog);
1033 if (SendSMSCore (&sms) != GE_SMSSENDOK)
1035 gtk_widget_hide (infoDialog.dialog);
1040 gtk_widget_hide (infoDialog.dialog);
1049 nr_msg = ((l - 1) / 153) + 1;
1050 if (nr_msg > 99) // We have place only for 99 messages in header.
1052 for (j = 0; j < nr_msg; j++)
1056 g_snprintf (header, 8, "%2d/%-2d: ", j + 1, nr_msg);
1059 strcpy (sms.MessageText, header);
1060 strncat (sms.MessageText, text + (j * 153), 153);
1061 sms.MessageText[160] = '\0';
1063 buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
1064 sms.RemoteNumber.number, j + 1, nr_msg);
1065 gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
1066 gtk_widget_show_now (infoDialog.dialog);
1070 if (SendSMSCore (&sms) != GE_SMSSENDOK)
1072 gtk_widget_hide (infoDialog.dialog);
1077 gtk_widget_hide (infoDialog.dialog);
1087 strncpy (sms.MessageText, text, GSM_MAX_SMS_LENGTH + 1);
1088 sms.MessageText[GSM_MAX_SMS_LENGTH] = '\0';
1090 buf = g_strdup_printf (_("Sending SMS to %s ...\n"), sms.RemoteNumber.number);
1091 gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
1092 gtk_widget_show_now (infoDialog.dialog);
1096 (void) SendSMSCore (&sms);
1097 gtk_widget_hide (infoDialog.dialog);
1104 g_strfreev (addresses);
1110 static GtkItemFactoryEntry send_menu_items[] = {
1111 { NULL, NULL, NULL, 0, "<Branch>"},
1112 { NULL, "<control>X", SendSMS, 0, NULL},
1113 { NULL, "<control>S", NULL, 0, NULL},
1114 { NULL, NULL, NULL, 0, "<Separator>"},
1115 { NULL, "<control>N", CheckAddress, 0, NULL},
1116 { NULL, "<control>C", ShowSelectContactsDialog, 0, NULL},
1117 { NULL, NULL, NULL, 0, "<Separator>"},
1118 { NULL, "<control>W", CloseSMSSend, 0, NULL},
1119 { NULL, NULL, NULL, 0, "<LastBranch>"},
1120 { NULL, NULL, Help2, 0, NULL},
1121 { NULL, NULL, GUI_ShowAbout, 0, NULL},
1125 static void InitSendMenu (void)
1127 send_menu_items[0].path = g_strdup (_("/_File"));
1128 send_menu_items[1].path = g_strdup (_("/File/Sen_d"));
1129 send_menu_items[2].path = g_strdup (_("/File/_Save"));
1130 send_menu_items[3].path = g_strdup (_("/File/Sep1"));
1131 send_menu_items[4].path = g_strdup (_("/File/Check _Names"));
1132 send_menu_items[5].path = g_strdup (_("/File/C_ontacts"));
1133 send_menu_items[6].path = g_strdup (_("/File/Sep2"));
1134 send_menu_items[7].path = g_strdup (_("/File/_Close"));
1135 send_menu_items[8].path = g_strdup (_("/_Help"));
1136 send_menu_items[9].path = g_strdup (_("/Help/_Help"));
1137 send_menu_items[10].path = g_strdup (_("/Help/_About"));
1141 static void CreateSMSSendWindow (void)
1143 int nmenu_items = sizeof (send_menu_items) / sizeof (send_menu_items[0]);
1144 GtkItemFactory *item_factory;
1145 GtkAccelGroup *accel_group;
1147 GtkWidget *main_vbox;
1148 GtkWidget *hbox, *vbox;
1153 GtkWidget *scrolledWindow;
1154 GtkTooltips *tooltips;
1156 if (sendSMS.SMSSendWindow)
1160 sendSMS.SMSSendWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1161 gtk_window_set_wmclass (GTK_WINDOW(sendSMS.SMSSendWindow), "SMSSendWindow", "Xgnokii");
1163 //gtk_widget_set_usize (GTK_WIDGET (sendSMS.SMSSendWindow), 436, 220);
1164 gtk_signal_connect (GTK_OBJECT (sendSMS.SMSSendWindow), "delete_event",
1165 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1166 gtk_widget_realize (sendSMS.SMSSendWindow);
1168 accel_group = gtk_accel_group_new ();
1169 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
1172 gtk_item_factory_create_items (item_factory, nmenu_items, send_menu_items, NULL);
1174 gtk_accel_group_attach (accel_group, GTK_OBJECT (sendSMS.SMSSendWindow));
1176 /* Finally, return the actual menu bar created by the item factory. */
1177 menubar = gtk_item_factory_get_widget (item_factory, "<main>");
1179 main_vbox = gtk_vbox_new (FALSE, 1);
1180 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
1181 gtk_container_add (GTK_CONTAINER (sendSMS.SMSSendWindow), main_vbox);
1182 gtk_widget_show (main_vbox);
1184 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
1185 gtk_widget_show (menubar);
1187 /* Create the toolbar */
1189 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
1190 gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1192 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Send message"), NULL,
1193 NewPixmap(SendSMS_xpm, GUI_SMSWindow->window,
1194 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1195 (GtkSignalFunc) SendSMS, NULL);
1196 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Save message to outbox"), NULL,
1197 NewPixmap(Send_xpm, GUI_SMSWindow->window,
1198 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1199 (GtkSignalFunc) NULL, NULL);
1201 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1203 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Check names"), NULL,
1204 NewPixmap(Check_xpm, GUI_SMSWindow->window,
1205 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1206 (GtkSignalFunc) CheckAddress, NULL);
1208 gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
1209 gtk_widget_show (toolbar);
1212 hbox = gtk_hbox_new (FALSE, 3);
1213 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 3);
1214 gtk_widget_show (hbox);
1216 label = gtk_label_new (_("To:"));
1217 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 3);
1218 gtk_widget_show (label);
1220 sendSMS.addr = gtk_entry_new ();
1221 gtk_box_pack_start (GTK_BOX (hbox), sendSMS.addr, TRUE, TRUE, 1);
1223 sendSMS.addrTip = gtk_tooltips_new ();
1224 gtk_tooltips_set_tip (sendSMS.addrTip, sendSMS.addr, "", NULL);
1225 gtk_tooltips_disable (sendSMS.addrTip);
1227 gtk_widget_show (sendSMS.addr);
1229 button = gtk_button_new ();
1230 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1231 GTK_SIGNAL_FUNC (ShowSelectContactsDialog), (gpointer) NULL);
1233 pixmap = NewPixmap(Names_xpm, sendSMS.SMSSendWindow->window,
1234 &sendSMS.SMSSendWindow->style->bg[GTK_STATE_NORMAL]);
1235 gtk_container_add (GTK_CONTAINER (button), pixmap);
1236 gtk_widget_show (pixmap);
1237 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 5);
1239 tooltips = gtk_tooltips_new ();
1240 gtk_tooltips_set_tip (tooltips, button, _("Select contacts"), NULL);
1242 gtk_widget_show (button);
1244 hbox = gtk_hbox_new (FALSE, 3);
1245 gtk_box_pack_end (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 3);
1246 gtk_widget_show (hbox);
1248 /* Edit SMS widget */
1249 vbox = gtk_vbox_new (FALSE, 3);
1250 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 3);
1251 gtk_widget_show (vbox);
1253 sendSMS.status = gtk_frame_new ("0/1");
1254 gtk_frame_set_label_align (GTK_FRAME (sendSMS.status), 1.0, 0.0);
1255 gtk_frame_set_shadow_type (GTK_FRAME (sendSMS.status), GTK_SHADOW_OUT);
1257 gtk_box_pack_end (GTK_BOX (vbox), sendSMS.status, TRUE, TRUE, 5);
1258 gtk_widget_show (sendSMS.status);
1260 sendSMS.smsSendText = gtk_text_new (NULL, NULL);
1261 gtk_widget_set_usize (GTK_WIDGET (sendSMS.smsSendText), 0, 120);
1262 gtk_text_set_editable (GTK_TEXT (sendSMS.smsSendText), TRUE);
1263 gtk_text_set_word_wrap (GTK_TEXT (sendSMS.smsSendText), TRUE);
1264 gtk_signal_connect_after (GTK_OBJECT (sendSMS.smsSendText),
1266 GTK_SIGNAL_FUNC(RefreshSMSLength), (gpointer) NULL);
1267 gtk_signal_connect_after (GTK_OBJECT (sendSMS.smsSendText),
1268 "button_press_event",
1269 GTK_SIGNAL_FUNC(RefreshSMSLength), (gpointer) NULL);
1271 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1272 gtk_container_set_border_width (GTK_CONTAINER (scrolledWindow), 5);
1273 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1275 GTK_POLICY_AUTOMATIC);
1277 gtk_container_add (GTK_CONTAINER (scrolledWindow), sendSMS.smsSendText);
1278 gtk_container_add (GTK_CONTAINER (sendSMS.status), scrolledWindow);
1280 gtk_widget_show (sendSMS.smsSendText);
1281 gtk_widget_show (scrolledWindow);
1283 /* Options widget */
1284 vbox = gtk_vbox_new (FALSE, 3);
1285 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 5);
1286 gtk_widget_show (vbox);
1288 sendSMS.report = gtk_check_button_new_with_label (_("Delivery report"));
1289 gtk_box_pack_start (GTK_BOX (vbox), sendSMS.report, FALSE, FALSE, 3);
1290 gtk_widget_show (sendSMS.report);
1292 sendSMS.longSMS = gtk_check_button_new_with_label (_("Send as Long SMS"));
1293 gtk_box_pack_start (GTK_BOX (vbox), sendSMS.longSMS, FALSE, FALSE, 3);
1294 gtk_widget_show (sendSMS.longSMS);
1296 label = gtk_label_new (_("SMS Center:"));
1297 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1);
1298 gtk_widget_show (label);
1300 GUI_InitSMSSettings ();
1301 sendSMS.smscOptionMenu = gtk_option_menu_new();
1303 GUIEventSend (GUI_EVENT_SMS_CENTERS_CHANGED);
1305 gtk_box_pack_start (GTK_BOX (vbox), sendSMS.smscOptionMenu, FALSE, FALSE, 1);
1306 gtk_widget_show (sendSMS.smscOptionMenu);
1310 static void NewSMS (void)
1312 if (!sendSMS.SMSSendWindow)
1313 CreateSMSSendWindow ();
1315 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("New Message"));
1317 gtk_tooltips_disable (sendSMS.addrTip);
1319 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1320 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1321 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText), gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1322 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1324 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
1326 RefreshSMSStatus ();
1328 gtk_widget_show (sendSMS.SMSSendWindow);
1332 static void ForwardSMS (void)
1336 if (GTK_CLIST (SMS.smsClist)->selection == NULL)
1339 if (!sendSMS.SMSSendWindow)
1340 CreateSMSSendWindow ();
1342 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("Forward Message"));
1344 gtk_tooltips_disable (sendSMS.addrTip);
1346 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1347 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1348 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText), gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1349 gtk_clist_get_text (GTK_CLIST (SMS.smsClist),
1350 GPOINTER_TO_INT(GTK_CLIST (SMS.smsClist)->selection->data),
1353 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1356 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1358 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
1360 RefreshSMSStatus ();
1362 gtk_widget_show (sendSMS.SMSSendWindow);
1367 static inline gint CompareSMSMessageLocation (gconstpointer a, gconstpointer b)
1369 return !(((GSM_SMSMessage *) a)->Number == ((GSM_SMSMessage *) b)->Number);
1374 static void ReplySMS (void)
1378 // GSM_SMSMessage msg;
1380 if (GTK_CLIST (SMS.smsClist)->selection == NULL)
1383 if (!sendSMS.SMSSendWindow)
1384 CreateSMSSendWindow ();
1386 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("Reply Message"));
1388 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1389 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1390 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText),
1391 gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1392 gtk_clist_get_text (GTK_CLIST (SMS.smsClist),
1393 GPOINTER_TO_INT(GTK_CLIST (SMS.smsClist)->selection->data),
1396 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL,
1397 &(sendSMS.smsSendText->style->black), NULL, buf, -1);
1399 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1401 //msg.Number = *(((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
1402 // GPOINTER_TO_INT (GTK_CLIST (SMS.smsClist)->selection->data)))->msgPtr);
1404 //r = g_slist_find_custom (SMS.messages, &msg, CompareSMSMessageLocation);
1406 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr),
1407 ((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
1408 GPOINTER_TO_INT (GTK_CLIST (SMS.smsClist)->selection->data)))->sender);
1410 CheckAddressMain ();
1411 RefreshSMSStatus ();
1413 gtk_widget_show (sendSMS.SMSSendWindow);
1417 static void NewBC (void)
1419 if (!sendSMS.SMSSendWindow)
1420 CreateSMSSendWindow ();
1422 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("Bussiness Card"));
1424 gtk_tooltips_disable (sendSMS.addrTip);
1426 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1427 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1428 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText), gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1430 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(SMS.colour), NULL,
1431 "Business Card\n", -1);
1433 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1434 xgnokiiConfig.user.name, -1);
1436 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1439 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1440 xgnokiiConfig.user.title, -1);
1442 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1445 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1446 xgnokiiConfig.user.company, -1);
1448 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1451 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(SMS.colour), NULL,
1454 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1455 xgnokiiConfig.user.telephone, -1);
1457 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1460 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(SMS.colour), NULL,
1463 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1464 xgnokiiConfig.user.fax, -1);
1466 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1469 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1470 xgnokiiConfig.user.email, -1);
1472 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1475 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1476 xgnokiiConfig.user.address, -1);
1478 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1481 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1483 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
1485 RefreshSMSStatus ();
1487 gtk_widget_show (sendSMS.SMSSendWindow);
1491 static GtkItemFactoryEntry menu_items[] = {
1492 { NULL, NULL, NULL, 0, "<Branch>"},
1493 { NULL, "<control>S", NULL, 0, NULL},
1494 { NULL, "<control>M", SaveToMailbox, 0, NULL},
1495 { NULL, NULL, NULL, 0, "<Separator>"},
1496 { NULL, "<control>W", CloseSMS, 0, NULL},
1497 { NULL, NULL, NULL, 0, "<Branch>"},
1498 { NULL, "<control>N", NewSMS, 0, NULL},
1499 { NULL, "<control>F", ForwardSMS, 0, NULL},
1500 { NULL, "<control>R", ReplySMS, 0, NULL},
1501 { NULL, "<control>D", DeleteSMS, 0, NULL},
1502 { NULL, NULL, NULL, 0, "<Separator>"},
1503 { NULL, "<control>B", NewBC, 0, NULL},
1504 { NULL, NULL, NULL, 0, "<LastBranch>"},
1505 { NULL, NULL, Help1, 0, NULL},
1506 { NULL, NULL, GUI_ShowAbout, 0, NULL},
1510 static void InitMainMenu (void)
1512 register gint i = 0;
1514 menu_items[i++].path = g_strdup (_("/_File"));
1515 menu_items[i++].path = g_strdup (_("/File/_Save"));
1516 menu_items[i++].path = g_strdup (_("/File/Save to mailbo_x"));
1517 menu_items[i++].path = g_strdup (_("/File/Sep1"));
1518 menu_items[i++].path = g_strdup (_("/File/_Close"));
1519 menu_items[i++].path = g_strdup (_("/_Messages"));
1520 menu_items[i++].path = g_strdup (_("/_Messages/_New"));
1521 menu_items[i++].path = g_strdup (_("/_Messages/_Forward"));
1522 menu_items[i++].path = g_strdup (_("/_Messages/_Reply"));
1523 menu_items[i++].path = g_strdup (_("/_Messages/_Delete"));
1524 menu_items[i++].path = g_strdup (_("/Messages/Sep3"));
1525 menu_items[i++].path = g_strdup (_("/_Messages/_Bussiness card"));
1526 menu_items[i++].path = g_strdup (_("/_Help"));
1527 menu_items[i++].path = g_strdup (_("/Help/_Help"));
1528 menu_items[i++].path = g_strdup (_("/Help/_About"));
1532 void GUI_CreateSMSWindow (void)
1534 int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
1535 GtkItemFactory *item_factory;
1536 GtkAccelGroup *accel_group;
1538 GtkWidget *main_vbox;
1540 GtkWidget *scrolledWindow;
1541 GtkWidget *vpaned, *hpaned;
1542 GtkWidget *tree, *treeSMSItem, *treeInboxItem, *treeOutboxItem, *subTree;
1543 SortColumn *sColumn;
1546 gchar *titles[4] = { _("Status"), _("Date / Time"), _("Sender"), _("Message")};
1550 GUI_SMSWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1551 gtk_window_set_wmclass (GTK_WINDOW (GUI_SMSWindow), "SMSWindow", "Xgnokii");
1552 gtk_window_set_title (GTK_WINDOW (GUI_SMSWindow), _("Short Message Service"));
1553 //gtk_widget_set_usize (GTK_WIDGET (GUI_SMSWindow), 436, 220);
1554 gtk_signal_connect (GTK_OBJECT (GUI_SMSWindow), "delete_event",
1555 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1556 gtk_widget_realize (GUI_SMSWindow);
1558 accel_group = gtk_accel_group_new ();
1559 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
1562 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
1564 gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_SMSWindow));
1566 /* Finally, return the actual menu bar created by the item factory. */
1567 menubar = gtk_item_factory_get_widget (item_factory, "<main>");
1569 main_vbox = gtk_vbox_new (FALSE, 1);
1570 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
1571 gtk_container_add (GTK_CONTAINER (GUI_SMSWindow), main_vbox);
1572 gtk_widget_show (main_vbox);
1574 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
1575 gtk_widget_show (menubar);
1577 /* Create the toolbar */
1578 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
1579 gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1581 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("New message"), NULL,
1582 NewPixmap(Edit_xpm, GUI_SMSWindow->window,
1583 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1584 (GtkSignalFunc) NewSMS, NULL);
1585 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Forward message"), NULL,
1586 NewPixmap(Forward_xpm, GUI_SMSWindow->window,
1587 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1588 (GtkSignalFunc) ForwardSMS, NULL);
1589 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Reply message"), NULL,
1590 NewPixmap(Reply_xpm, GUI_SMSWindow->window,
1591 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1592 (GtkSignalFunc) ReplySMS, NULL);
1594 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Bussiness Card"), NULL,
1595 NewPixmap(BCard_xpm, GUI_SMSWindow->window,
1596 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1597 (GtkSignalFunc) NewBC, NULL);
1599 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1601 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Delete message"), NULL,
1602 NewPixmap(Delete_xpm, GUI_SMSWindow->window,
1603 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1604 (GtkSignalFunc) DeleteSMS, NULL);
1606 gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
1607 gtk_widget_show (toolbar);
1609 vpaned = gtk_vpaned_new ();
1610 gtk_paned_set_handle_size (GTK_PANED (vpaned), 10);
1611 gtk_paned_set_gutter_size (GTK_PANED (vpaned), 15);
1612 gtk_box_pack_end (GTK_BOX (main_vbox), vpaned, TRUE, TRUE, 0);
1613 gtk_widget_show (vpaned);
1615 hpaned = gtk_hpaned_new ();
1616 gtk_paned_set_handle_size (GTK_PANED (hpaned), 8);
1617 gtk_paned_set_gutter_size (GTK_PANED (hpaned), 10);
1618 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
1619 gtk_widget_show (hpaned);
1621 /* Navigation tree */
1622 tree = gtk_tree_new ();
1623 gtk_tree_set_selection_mode (GTK_TREE (tree), GTK_SELECTION_SINGLE);
1624 gtk_widget_show (tree);
1626 treeSMSItem = gtk_tree_item_new_with_label (_("SMS's"));
1627 gtk_tree_append (GTK_TREE (tree), treeSMSItem);
1628 gtk_widget_show (treeSMSItem);
1630 subTree = gtk_tree_new ();
1631 gtk_tree_set_selection_mode (GTK_TREE (subTree), GTK_SELECTION_SINGLE);
1632 gtk_tree_set_view_mode (GTK_TREE (subTree), GTK_TREE_VIEW_ITEM);
1633 gtk_tree_item_set_subtree (GTK_TREE_ITEM (treeSMSItem), subTree);
1635 treeInboxItem = gtk_tree_item_new_with_label (_("Inbox"));
1636 gtk_tree_append (GTK_TREE (subTree), treeInboxItem);
1637 gtk_signal_connect (GTK_OBJECT (treeInboxItem), "select",
1638 GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (0));
1639 gtk_widget_show (treeInboxItem);
1641 treeOutboxItem = gtk_tree_item_new_with_label (_("Outbox"));
1642 gtk_tree_append (GTK_TREE (subTree), treeOutboxItem);
1643 gtk_signal_connect (GTK_OBJECT (treeOutboxItem), "select",
1644 GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (1));
1645 gtk_widget_show (treeOutboxItem);
1647 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1648 gtk_widget_set_usize (scrolledWindow, 75, 80);
1649 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1650 GTK_POLICY_AUTOMATIC,
1651 GTK_POLICY_AUTOMATIC);
1653 gtk_paned_add1 (GTK_PANED (hpaned), scrolledWindow);
1655 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledWindow),
1657 gtk_widget_show (scrolledWindow);
1660 /* Message viewer */
1661 SMS.smsText = gtk_text_new (NULL, NULL);
1662 gtk_text_set_editable (GTK_TEXT (SMS.smsText), FALSE);
1663 gtk_text_set_word_wrap (GTK_TEXT (SMS.smsText), TRUE);
1664 //gtk_text_set_line_wrap (GTK_TEXT (SMS.smsText), TRUE);
1666 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1667 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1669 GTK_POLICY_AUTOMATIC);
1671 gtk_paned_add2 (GTK_PANED (hpaned), scrolledWindow);
1673 gtk_container_add (GTK_CONTAINER (scrolledWindow), SMS.smsText);
1674 gtk_widget_show_all (scrolledWindow);
1677 SMS.smsClist = gtk_clist_new_with_titles (4, titles);
1678 gtk_clist_set_shadow_type (GTK_CLIST (SMS.smsClist), GTK_SHADOW_OUT);
1679 gtk_clist_set_compare_func (GTK_CLIST (SMS.smsClist), CListCompareFunc);
1680 gtk_clist_set_sort_column (GTK_CLIST (SMS.smsClist), 1);
1681 gtk_clist_set_sort_type (GTK_CLIST (SMS.smsClist), GTK_SORT_ASCENDING);
1682 gtk_clist_set_auto_sort (GTK_CLIST (SMS.smsClist), FALSE);
1683 gtk_clist_set_selection_mode (GTK_CLIST (SMS.smsClist), GTK_SELECTION_EXTENDED);
1685 gtk_clist_set_column_width (GTK_CLIST (SMS.smsClist), 0, 40);
1686 gtk_clist_set_column_width (GTK_CLIST (SMS.smsClist), 1, 142);
1687 gtk_clist_set_column_width (GTK_CLIST (SMS.smsClist), 2, 135);
1688 //gtk_clist_set_column_justification (GTK_CLIST (SMS.smsClist), 2, GTK_JUSTIFY_CENTER);
1690 for (i = 0; i < 4; i++)
1692 if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
1694 g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
1697 sColumn->clist = SMS.smsClist;
1698 sColumn->column = i;
1699 gtk_signal_connect (GTK_OBJECT (GTK_CLIST (SMS.smsClist)->column[i].button), "clicked",
1700 GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
1703 gtk_signal_connect (GTK_OBJECT (SMS.smsClist), "select_row",
1704 GTK_SIGNAL_FUNC (ClickEntry), NULL);
1706 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1707 gtk_widget_set_usize (scrolledWindow, 550, 100);
1708 gtk_container_add (GTK_CONTAINER (scrolledWindow), SMS.smsClist);
1709 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1710 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1712 gtk_paned_add2 (GTK_PANED (vpaned), scrolledWindow);
1714 gtk_widget_show (SMS.smsClist);
1715 gtk_widget_show (scrolledWindow);
1717 CreateErrorDialog (&errorDialog, GUI_SMSWindow);
1718 CreateInfoDialog (&infoDialog, GUI_SMSWindow);
1720 gtk_signal_emit_by_name(GTK_OBJECT (treeSMSItem), "expand");
1722 cmap = gdk_colormap_get_system();
1723 SMS.colour.red = 0xffff;
1724 SMS.colour.green = 0;
1725 SMS.colour.blue = 0;
1726 if (!gdk_color_alloc (cmap, &(SMS.colour)))
1727 g_error (_("couldn't allocate colour"));
1729 questMark.pixmap = gdk_pixmap_create_from_xpm_d (GUI_SMSWindow->window,
1731 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL],
1734 GUIEventAdd (GUI_EVENT_SMS_CENTERS_CHANGED, GUI_RefreshSMSCenterMenu);
1735 GUIEventAdd (GUI_EVENT_SMS_NUMBER_CHANGED, GUI_RefreshMessageWindow);