5 A Linux/Unix GUI for Nokia mobile phones.
6 Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
7 & Ján Derfiòák <ja@mail.upjs.sk>.
9 Released under the terms of the GNU GPL, see file COPYING for more details.
11 Last modification: Sun Apr 30 2000
12 Modified by Jan Derfinak
24 #include <gdk/gdkkeysyms.h>
27 #include "xgnokii_common.h"
29 #include "xgnokii_lowlevel.h"
30 #include "xgnokii_contacts.h"
31 #include "xgnokii_sms.h"
32 #include "xpm/Edit.xpm"
33 #include "xpm/Delete.xpm"
34 #include "xpm/Forward.xpm"
35 #include "xpm/Reply.xpm"
36 #include "xpm/Send.xpm"
37 #include "xpm/SendSMS.xpm"
38 #include "xpm/Check.xpm"
39 #include "xpm/Names.xpm"
40 #include "xpm/BCard.xpm"
41 #include "xpm/quest.xpm"
44 gint count; // Messages count
45 gint number; // Number of tail in Long SMS;
46 gint *msgPtr; // Array of MessageNumber;
49 gchar sender[GSM_MAX_SENDER_LENGTH + 1];
50 gchar destination[GSM_MAX_DESTINATION_LENGTH + 1];
69 GtkWidget *SMSSendWindow;
70 GtkWidget *smsSendText;
75 GtkWidget *smscOptionMenu;
81 static GtkWidget *GUI_SMSWindow;
82 static SMSWidget SMS = {NULL, NULL, NULL};
83 static SendSMSWidget sendSMS = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
84 static ErrorDialog errorDialog = {NULL, NULL};
85 static InfoDialog infoDialog = {NULL, NULL};
86 static QuestMark questMark;
89 static inline void Help1 (GtkWidget *w, gpointer data)
91 gchar *indx = g_strdup_printf ("/help/%s/windows/sms/index.html", xgnokiiConfig.locale);
97 static inline void Help2 (GtkWidget *w, gpointer data)
99 gchar *indx = g_strdup_printf ("/help/%s/sms_send.html", xgnokiiConfig.locale);
105 static inline void CloseSMS (GtkWidget *w, gpointer data)
107 gtk_widget_hide (GUI_SMSWindow);
111 static inline void CloseSMSSend (GtkWidget *w, gpointer data)
113 gtk_widget_hide (sendSMS.SMSSendWindow);
117 static gint CListCompareFunc (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
122 GtkCListRow *row1 = (GtkCListRow *) ptr1;
123 GtkCListRow *row2 = (GtkCListRow *) ptr2;
125 switch (row1->cell[clist->sort_column].type)
128 text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
130 case GTK_CELL_PIXTEXT:
131 text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text;
136 switch (row2->cell[clist->sort_column].type)
139 text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
141 case GTK_CELL_PIXTEXT:
142 text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text;
149 return (text1 != NULL);
154 if (clist->sort_column == 1 && !SMS.currentBox)
159 bdTime.tm_sec = atoi (text1 + 15);
160 bdTime.tm_min = atoi (text1 + 12);
161 bdTime.tm_hour = atoi (text1 + 9);
162 bdTime.tm_mday = atoi (text1);
163 bdTime.tm_mon = atoi (text1 + 3) - 1;
164 bdTime.tm_year = atoi (text1 + 6);
165 if (bdTime.tm_year < 70)
166 bdTime.tm_year += 100;
168 if (text1[17] != '\0')
169 bdTime.tm_gmtoff = atoi (text1 + 18) * 3600;
171 bdTime.tm_isdst = -1;
173 time1 = mktime (&bdTime);
175 bdTime.tm_sec = atoi (text2 + 15);
176 bdTime.tm_min = atoi (text2 + 12);
177 bdTime.tm_hour = atoi (text2 + 9);
178 bdTime.tm_mday = atoi (text2);
179 bdTime.tm_mon = atoi (text2 + 3) - 1;
180 bdTime.tm_year = atoi (text2 + 6);
181 if (bdTime.tm_year < 70)
182 bdTime.tm_year += 100;
184 if (text2[17] != '\0')
185 bdTime.tm_gmtoff = atoi (text2 + 18) * 3600;
187 bdTime.tm_isdst = -1;
189 time2 = mktime (&bdTime);
193 else if (time1 > time2)
199 return (g_strcasecmp (text1, text2));
203 static inline void DestroyMsgPtrs (gpointer data)
205 g_free (((MessagePointers *) data)->msgPtr);
206 g_free ((MessagePointers *) data);
210 static void InsertInboxElement (gpointer d, gpointer userData)
212 GSM_SMSMessage *data = (GSM_SMSMessage *) d;
213 MessagePointers *msgPtrs;
216 if (data->Type == GST_MT || data->Type == GST_DR)
218 /* if (data->Type == GST_MT && data->UDHType == GSM_ConcatenatedMessages)
222 msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
223 msgPtrs->count = data->UDH[4];
224 msgPtrs->number = data->UDH[5];
225 msgPtrs->validity = data->Validity;
226 msgPtrs->class = data->Class;
227 strcpy (msgPtrs->sender, data->Sender);
228 msgPtrs->msgPtr = (gint *) g_malloc (msgPtrs->count * sizeof (gint));
229 *(msgPtrs->msgPtr + msgPtrs->number - 1) = data->MessageNumber;
235 if (data->Type == GST_DR)
237 row[0] = g_strdup (_("report"));
238 dt = &(data->SMSCTime);
240 else if (data->Status)
242 row[0] = g_strdup (_("read"));
247 row[0] = g_strdup (_("unread"));
252 row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d %c%02d00",
253 dt->Day, dt->Month, dt->Year,
254 dt->Hour, dt->Minute, dt->Second,
255 dt->Timezone > 0 ? '+' : '-', abs (dt->Timezone));
257 row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d",
258 dt->Day, dt->Month, dt->Year,
259 dt->Hour, dt->Minute, dt->Second);
261 row[2] = GUI_GetName (data->Sender);
263 row[2] = data->Sender;
264 row[3] = data->MessageText;
266 gtk_clist_append (GTK_CLIST (SMS.smsClist), row);
267 msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
268 msgPtrs->count = msgPtrs->number = 1;
269 msgPtrs->validity = data->Validity;
270 msgPtrs->class = data->Class;
271 strcpy (msgPtrs->sender, data->Sender);
272 msgPtrs->destination[0]='\0';
273 msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
274 *(msgPtrs->msgPtr) = data->MessageNumber;
275 gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
276 msgPtrs, DestroyMsgPtrs);
284 static inline void RefreshInbox (void)
286 gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
287 gtk_clist_clear (GTK_CLIST (SMS.smsClist));
288 gtk_clist_set_column_title(GTK_CLIST (SMS.smsClist), 2/*column*/, _("Sender"));
291 g_slist_foreach (phoneMonitor.sms.messages, InsertInboxElement, (gpointer) NULL);
293 gtk_clist_sort (GTK_CLIST (SMS.smsClist));
294 gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
298 static void InsertOutboxElement (gpointer d, gpointer userData)
300 GSM_SMSMessage *data = (GSM_SMSMessage *) d;
301 MessagePointers *msgPtrs;
303 if (data->Type == GST_MO)
308 row[0] = g_strdup (_("sent"));
310 row[0] = g_strdup (_("unsent"));
312 row[1] = g_strdup (""); /* time */
314 row[2] = GUI_GetName (data->Destination);
316 row[2] = data->Destination;
318 row[3] = data->MessageText;
320 gtk_clist_append( GTK_CLIST (SMS.smsClist), row);
321 msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
322 msgPtrs->count = msgPtrs->number = 1;
323 msgPtrs->validity = data->Validity;
324 msgPtrs->class = data->Class;
325 msgPtrs->sender[0]='\0';
326 strcpy (msgPtrs->destination, data->Destination);
327 msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
328 *(msgPtrs->msgPtr) = data->MessageNumber;
329 gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
330 msgPtrs, DestroyMsgPtrs);
337 static inline void RefreshOutbox (void)
339 gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
340 gtk_clist_clear (GTK_CLIST (SMS.smsClist));
341 gtk_clist_set_column_title(GTK_CLIST (SMS.smsClist), 2/*column*/, _("Destination"));
344 g_slist_foreach (phoneMonitor.sms.messages, InsertOutboxElement, (gpointer) NULL);
346 gtk_clist_sort (GTK_CLIST (SMS.smsClist));
347 gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
351 inline void GUI_RefreshMessageWindow (void)
353 if (!GTK_WIDGET_VISIBLE (GUI_SMSWindow))
363 static void SelectTreeItem (GtkWidget *item, gpointer data)
365 SMS.currentBox = GPOINTER_TO_INT (data);
366 GUI_RefreshMessageWindow ();
370 static void ClickEntry (GtkWidget *clist,
373 GdkEventButton *event,
378 /* FIXME - We must mark SMS as readed */
379 gtk_text_freeze (GTK_TEXT (SMS.smsText));
381 gtk_text_set_point (GTK_TEXT (SMS.smsText), 0);
382 gtk_text_forward_delete (GTK_TEXT (SMS.smsText), gtk_text_get_length (GTK_TEXT (SMS.smsText)));
384 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.colour), NULL,
385 (SMS.currentBox ? _("To: ") : _("From: ")), -1);
386 gtk_clist_get_text (GTK_CLIST (clist), row, 2, &buf);
387 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
389 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
392 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.colour), NULL,
394 gtk_clist_get_text (GTK_CLIST (clist), row, 1, &buf);
395 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
397 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
400 gtk_clist_get_text (GTK_CLIST (clist), row, 3, &buf);
401 gtk_text_insert (GTK_TEXT (SMS.smsText), NULL, &(SMS.smsText->style->black), NULL,
404 gtk_text_thaw (GTK_TEXT (SMS.smsText));
408 inline void GUI_ShowSMS (void)
410 gtk_widget_show (GUI_SMSWindow);
411 GUI_RefreshMessageWindow ();
415 static void OkDeleteSMSDialog (GtkWidget *widget, gpointer data)
417 GSM_SMSMessage *message;
425 sel = GTK_CLIST (SMS.smsClist)->selection;
427 gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
431 row = GPOINTER_TO_INT (sel->data);
433 for (count = 0; count < ((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->count; count++)
435 message = (GSM_SMSMessage *) g_malloc (sizeof (GSM_SMSMessage));
436 message->Location = *(((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->msgPtr + count);
437 if (message->Location == -1)
442 message->MemoryType = GMT_SM;
444 e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
445 e->event = Event_DeleteSMSMessage;
449 /* error = GSM->DeleteSMSMessage(&message);
451 if (error != GE_NONE)
453 if (error == GE_NOTIMPLEMENTED)
455 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Function not implemented!"));
456 gtk_widget_show(errorDialog.dialog);
460 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Delete SMS failed!"));
461 gtk_widget_show(errorDialog.dialog);
468 gtk_widget_hide (GTK_WIDGET (data));
470 gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
474 static void DeleteSMS (void)
476 static GtkWidget *dialog = NULL;
477 GtkWidget *button, *hbox, *label, *pixmap;
481 dialog = gtk_dialog_new();
482 gtk_window_set_title (GTK_WINDOW (dialog), _("Delete SMS"));
483 gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
484 gtk_window_set_modal(GTK_WINDOW (dialog), TRUE);
485 gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
486 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
487 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
489 button = gtk_button_new_with_label (_("Ok"));
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 (OkDeleteSMSDialog), (gpointer) dialog);
494 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
495 gtk_widget_grab_default (button);
496 gtk_widget_show (button);
497 button = gtk_button_new_with_label (_("Cancel"));
498 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
499 button, TRUE, TRUE, 10);
500 gtk_signal_connect (GTK_OBJECT (button), "clicked",
501 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) dialog);
502 gtk_widget_show (button);
504 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
506 hbox = gtk_hbox_new (FALSE, 0);
507 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
508 gtk_widget_show (hbox);
510 pixmap = gtk_pixmap_new (questMark.pixmap, questMark.mask);
511 gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 10);
512 gtk_widget_show (pixmap);
514 label = gtk_label_new (_("Do you want to delete selected SMS?"));
515 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 10);
516 gtk_widget_show (label);
519 gtk_widget_show (GTK_WIDGET (dialog));
523 static void SaveToMailbox (void)
529 struct tm t, *loctime;
533 gchar *number, *text, *loc;
536 if ((f = fopen (xgnokiiConfig.mailbox, "a")) == NULL)
538 snprintf (buf, 255, _("Cannot open mailbox %s for appending!"), xgnokiiConfig.mailbox);
539 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
540 gtk_widget_show (errorDialog.dialog);
545 lock.l_type = F_WRLCK;
546 lock.l_whence = SEEK_SET;
550 if (fcntl (fd, F_GETLK, &lock) != -1 && lock.l_type != F_UNLCK)
552 snprintf (buf, 255, _("Cannot save to mailbox %s.\n\
553 %s is locked for process %d!"), xgnokiiConfig.mailbox, xgnokiiConfig.mailbox,
555 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
556 gtk_widget_show (errorDialog.dialog);
561 lock.l_type = F_WRLCK;
562 lock.l_whence = SEEK_SET;
565 if (fcntl (fd, F_SETLK, &lock) == -1)
567 snprintf (buf, 255, _("Cannot lock mailbox %s!"), xgnokiiConfig.mailbox);
568 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
569 gtk_widget_show (errorDialog.dialog);
574 sel = GTK_CLIST (SMS.smsClist)->selection;
578 row = GPOINTER_TO_INT (sel->data);
580 gtk_clist_get_text (GTK_CLIST (SMS.smsClist), row, 1, &text);
581 t.tm_sec = atoi (text + 15);
582 t.tm_min = atoi (text + 12);
583 t.tm_hour = atoi (text + 9);
584 t.tm_mday = atoi (text);
585 t.tm_mon = atoi (text + 3) - 1;
586 t.tm_year = atoi (text + 6);
590 if (text[17] != '\0')
591 t.tm_gmtoff = atoi (text + 18) * 3600;
594 caltime = mktime (&t);
595 loctime = localtime (&caltime);
597 gtk_clist_get_text (GTK_CLIST (SMS.smsClist), row, 2, &number);
598 gtk_clist_get_text (GTK_CLIST (SMS.smsClist), row, 3, &text);
600 fprintf (f, "From %s@xgnokii %s", number, asctime (loctime));
601 loc = setlocale (LC_ALL, "C");
602 strftime (buf, 255, "Date: %a, %d %b %Y %H:%M:%S %z (%Z)\n", loctime);
603 setlocale (LC_ALL, loc);
604 fprintf (f, "%s", buf);
605 fprintf (f, "From: %s@xgnokii\n", number);
606 strncpy (buf, text, 20);
608 fprintf (f, "Subject: %s\n\n", buf);
609 fprintf (f, "%s\n\n", text);
612 lock.l_type = F_UNLCK;
613 lock.l_whence = SEEK_SET;
616 if (fcntl (fd, F_SETLK, &lock) == -1)
618 snprintf (buf, 255, _("Cannot unlock mailbox %s!"), xgnokiiConfig.mailbox);
619 gtk_label_set_text (GTK_LABEL (errorDialog.text), buf);
620 gtk_widget_show (errorDialog.dialog);
627 static inline void RefreshSMSStatus (void)
632 l = gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText));
634 if (l <= GSM_MAX_SMS_LENGTH)
635 buf = g_strdup_printf ("%d/1", l);
639 buf = g_strdup_printf ("%d/%d", l > 0 && !m ? 153 : m, l == 0 ? 1 : ((l - 1) / 153) + 1);
642 gtk_frame_set_label (GTK_FRAME (sendSMS.status), buf);
647 static inline gint RefreshSMSLength (GtkWidget *widget,
649 gpointer callback_data)
652 if (GTK_EDITABLE (widget)->editable == FALSE)
654 if (event->keyval == GDK_BackSpace || event->keyval == GDK_Clear ||
655 event->keyval == GDK_Insert || event->keyval == GDK_Delete ||
656 event->keyval == GDK_Home || event->keyval == GDK_End ||
657 event->keyval == GDK_Left || event->keyval == GDK_Right ||
658 event->keyval == GDK_Up || event->keyval == GDK_Down ||
659 event->keyval == GDK_Return ||
660 (event->keyval >= 0x20 && event->keyval <= 0xFF))
667 static inline void SetActiveCenter (GtkWidget *item, gpointer data)
669 sendSMS.center = GPOINTER_TO_INT (data);
673 void GUI_RefreshSMSCenterMenu (void)
675 static GtkWidget *smscMenu = NULL;
679 if (!sendSMS.smscOptionMenu)
684 gtk_option_menu_remove_menu (GTK_OPTION_MENU (sendSMS.smscOptionMenu));
685 if (GTK_IS_WIDGET (smscMenu))
686 gtk_widget_destroy (GTK_WIDGET (smscMenu));
690 smscMenu = gtk_menu_new();
692 for (i = 0; i < xgnokiiConfig.smsSets; i++)
694 if (*(xgnokiiConfig.smsSetting[i].Name) == '\0')
696 gchar *buf = g_strdup_printf (_("Set %d"), i + 1);
697 item = gtk_menu_item_new_with_label (buf);
701 item = gtk_menu_item_new_with_label (xgnokiiConfig.smsSetting[i].Name);
703 gtk_signal_connect (GTK_OBJECT (item), "activate",
704 GTK_SIGNAL_FUNC (SetActiveCenter),
707 gtk_widget_show (item);
708 gtk_menu_append (GTK_MENU (smscMenu), item);
710 gtk_option_menu_set_menu (GTK_OPTION_MENU (sendSMS.smscOptionMenu), smscMenu);
714 static inline void InitAddressLine (gpointer d, gpointer userData)
716 ((AddressPar *) d)->used = 0;
721 static inline void PrintAddressLine (gpointer d, gpointer userData)
723 g_print ("Name: %s\nNumber: %s\nUsed: %d\n",
724 ((AddressPar *) d)->name,
725 ((AddressPar *) d)->number,
726 ((AddressPar *) d)->used);
731 static inline gint CompareAddressLineName (gconstpointer a, gconstpointer b)
733 return strcmp (((AddressPar *) a)->name, ((AddressPar *) b)->name);
737 static inline gint CompareAddressLineUsed (gconstpointer a, gconstpointer b)
739 return !(((AddressPar *) a)->used == ((AddressPar *) b)->used);
743 static gint CheckAddressMain (void)
751 gchar **strings = g_strsplit (gtk_entry_get_text (GTK_ENTRY (sendSMS.addr)), ",", 0);
753 tooltipBuf = g_string_new ("");
754 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
755 g_slist_foreach (sendSMS.addressLine, InitAddressLine, (gpointer) NULL);
759 g_strstrip (strings[i]);
760 if (*strings[i] == '\0')
765 if ((buf = GUI_GetName (strings[i])) != NULL)
767 AddressPar *ap = g_malloc (sizeof (AddressPar));
768 ap->number = g_strdup (strings[i]);
769 ap->name = g_strdup (buf);
771 sendSMS.addressLine = g_slist_append (sendSMS.addressLine, ap);
772 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), buf);
773 g_string_append (tooltipBuf, ap->number);
776 if ((buf = GUI_GetNumber (strings[i])) != NULL)
778 aps.name = strings[i];
779 r = g_slist_find_custom (sendSMS.addressLine, &aps, CompareAddressLineName);
782 ((AddressPar *) r->data)->used = 1;
783 g_string_append (tooltipBuf, ((AddressPar *) r->data)->number);
786 g_string_append (tooltipBuf, buf);
787 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), strings[i]);
791 gint len = strlen (strings[i]);
794 for (j = 0; j < len; j++)
795 if (strings[i][j] != '*' && strings[i][j] != '#' && strings[i][j] != '+'
796 && (strings[i][j] < '0' || strings[i][j] > '9'))
798 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), strings[i]);
799 g_string_append (tooltipBuf, strings[i]);
801 if (strings[i + 1] != NULL)
803 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), ", ");
804 g_string_append (tooltipBuf, ", ");
810 while ((r = g_slist_find_custom (sendSMS.addressLine, &aps, CompareAddressLineUsed)))
811 sendSMS.addressLine = g_slist_remove (sendSMS.addressLine, r->data);
813 if (tooltipBuf->len > 0)
815 gtk_tooltips_set_tip (sendSMS.addrTip, sendSMS.addr, tooltipBuf->str, NULL);
816 gtk_tooltips_enable (sendSMS.addrTip);
819 gtk_tooltips_disable (sendSMS.addrTip);
822 g_slist_foreach (sendSMS.addressLine, PrintAddressLine, (gpointer) NULL);
825 g_strfreev (strings);
826 g_string_free (tooltipBuf, TRUE);
832 static inline void CheckAddress (void)
834 if (CheckAddressMain ())
836 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Address line contains illegal address!"));
837 gtk_widget_show(errorDialog.dialog);
842 static void DeleteSelectContactDialog (GtkWidget *widget, GdkEvent *event,
843 SelectContactData *data)
845 gtk_widget_destroy (GTK_WIDGET (data->clist));
846 gtk_widget_destroy (GTK_WIDGET (data->clistScrolledWindow));
847 gtk_widget_destroy (GTK_WIDGET (widget));
851 static void CancelSelectContactDialog (GtkWidget *widget,
852 SelectContactData *data)
854 gtk_widget_destroy (GTK_WIDGET (data->clist));
855 gtk_widget_destroy (GTK_WIDGET (data->clistScrolledWindow));
856 gtk_widget_destroy (GTK_WIDGET (data->dialog));
860 static void OkSelectContactDialog (GtkWidget *widget,
861 SelectContactData *data)
864 PhonebookEntry *pbEntry;
866 if ((sel = GTK_CLIST (data->clist)->selection) != NULL)
869 AddressPar *ap = g_malloc (sizeof (AddressPar));
871 pbEntry = gtk_clist_get_row_data (GTK_CLIST (data->clist),
872 GPOINTER_TO_INT (sel->data));
873 ap->number = g_strdup (pbEntry->entry.Number);
874 ap->name = g_strdup (pbEntry->entry.Name);
876 sendSMS.addressLine = g_slist_append (sendSMS.addressLine, ap);
877 if (strlen (gtk_entry_get_text (GTK_ENTRY (sendSMS.addr))) > 0)
878 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), ", ");
879 gtk_entry_append_text (GTK_ENTRY (sendSMS.addr), ap->name);
884 gtk_widget_destroy (GTK_WIDGET (data->clist));
885 gtk_widget_destroy (GTK_WIDGET (data->clistScrolledWindow));
886 gtk_widget_destroy (GTK_WIDGET (data->dialog));
892 static void ShowSelectContactsDialog (void)
894 SelectContactData *r;
896 if (!GUI_ContactsIsIntialized ())
899 if ((r = GUI_SelectContactDialog ()) == NULL)
902 gtk_signal_connect (GTK_OBJECT (r->dialog), "delete_event",
903 GTK_SIGNAL_FUNC (DeleteSelectContactDialog), (gpointer) r);
905 gtk_signal_connect (GTK_OBJECT (r->okButton), "clicked",
906 GTK_SIGNAL_FUNC (OkSelectContactDialog), (gpointer) r);
907 gtk_signal_connect (GTK_OBJECT (r->cancelButton), "clicked",
908 GTK_SIGNAL_FUNC (CancelSelectContactDialog), (gpointer) r);
911 typedef gint (*SaveSendSMSCore_func)(GSM_SMSMessage *sms);
913 static gint SendSMSCore (GSM_SMSMessage *sms)
916 PhoneEvent *e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
917 D_SMSMessage *m = (D_SMSMessage *) g_malloc (sizeof (D_SMSMessage));
920 e->event = Event_SendSMSMessage;
923 pthread_mutex_lock (&sendSMSMutex);
924 pthread_cond_wait (&sendSMSCond, &sendSMSMutex);
925 pthread_mutex_unlock (&sendSMSMutex);
928 g_print ("Address: %s\nText: %s\nDelivery report: %d\nSMS Center: %d\n",
931 GTK_TOGGLE_BUTTON (sendSMS.report)->active,
938 if (error != GE_SMSSENDOK)
940 gchar *buf = g_strdup_printf (_("SMS send to %s failed\n(error=%d)"),
941 sms->Destination, error);
942 gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
943 gtk_widget_show (errorDialog.dialog);
947 g_print ("Message sent to: %s\n", sms->Destination);
952 static gint SaveSMSCore (GSM_SMSMessage *sms)
955 PhoneEvent *e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
956 D_SMSMessage *m = (D_SMSMessage *) g_malloc (sizeof (D_SMSMessage));
958 /* FIXME: Give user a choice of choosing target memory type, currently
959 * we implicitely always force SIM storage.
961 sms->MemoryType = GMT_SM;
964 e->event = Event_SaveSMSMessage;
967 pthread_mutex_lock (&saveSMSMutex);
968 pthread_cond_wait (&saveSMSCond, &saveSMSMutex);
969 pthread_mutex_unlock (&saveSMSMutex);
972 g_print ("Address: %s\nText: %s\nDelivery report: %d\nSMS Center: %d\n",
975 GTK_TOGGLE_BUTTON (sendSMS.report)->active,
982 if (error != GE_NONE)
984 gchar *buf = g_strdup_printf (_("SMS save of message to %s failed\n(error=%d)"),
985 sms->Destination, error);
986 gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
987 gtk_widget_show (errorDialog.dialog);
991 g_print ("Message saved, destination to: %s\n", sms->Destination);
996 static void SaveSendSMS (SaveSendSMSCore_func corefunc)
1001 gchar *text, *number;
1006 register gint i = 0;
1007 GSM_Deconcatenate_state SMS_Deconcatenate_state;
1009 if (CheckAddressMain ())
1011 gtk_label_set_text(GTK_LABEL(errorDialog.text), _("Address line contains illegal address!"));
1012 gtk_widget_show(errorDialog.dialog);
1016 text = gtk_editable_get_chars (GTK_EDITABLE (sendSMS.smsSendText), 0, -1);
1019 addresses = g_strsplit (gtk_entry_get_text (GTK_ENTRY (sendSMS.addr)), ",", 0);
1021 longSMS = GTK_TOGGLE_BUTTON (sendSMS.longSMS)->active;
1023 while (addresses[i])
1025 g_strstrip (addresses[i]);
1026 if ((number = GUI_GetNumber (addresses[i])))
1028 aps.name = addresses[i];
1029 if ((r = g_slist_find_custom (sendSMS.addressLine, &aps, CompareAddressLineName)))
1030 number = ((AddressPar *) r->data)->number;
1033 number = addresses[i];
1035 sms.MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center];
1036 sms.MessageCenter.No = 0;
1038 if (GTK_TOGGLE_BUTTON (sendSMS.report)->active)
1044 sms.Compression = false;
1045 sms.EightBit = false;
1046 sms.Validity = sms.MessageCenter.Validity;
1047 sms.UDHPresent = false;
1049 strncpy (sms.Destination, number, GSM_MAX_DESTINATION_LENGTH + 1);
1050 sms.Destination[GSM_MAX_DESTINATION_LENGTH] = '\0';
1052 buf = g_strdup_printf ((corefunc==SendSMSCore ? _("Sending SMS to %s ...\n") : _("Saving SMS to %s ...\n")),
1054 gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
1055 gtk_widget_show_now (infoDialog.dialog);
1059 SMS_Deconcatenate_state.first=true;
1060 while (SMS_Deconcatenate(&SMS_Deconcatenate_state,&sms,text,l,longSMS)) {
1062 (void) (*corefunc)(&sms); /* errors ignored, ugh */
1064 /* Here the sleep have no meaning.
1065 * If it is required by some backend phone driver, it should be done THERE!
1070 gtk_widget_hide (infoDialog.dialog);
1076 g_strfreev (addresses);
1081 static void SendSMS (void)
1083 SaveSendSMS(SendSMSCore);
1086 static void SaveSMS (void)
1088 SaveSendSMS(SaveSMSCore);
1091 static GtkItemFactoryEntry send_menu_items[] = {
1092 { NULL, NULL, NULL, 0, "<Branch>"},
1093 { NULL, "<control>X", SendSMS, 0, NULL},
1094 { NULL, "<control>S", SaveSMS, 0, NULL},
1095 { NULL, NULL, NULL, 0, "<Separator>"},
1096 { NULL, "<control>N", CheckAddress, 0, NULL},
1097 { NULL, "<control>C", ShowSelectContactsDialog, 0, NULL},
1098 { NULL, NULL, NULL, 0, "<Separator>"},
1099 { NULL, "<control>W", CloseSMSSend, 0, NULL},
1100 { NULL, NULL, NULL, 0, "<LastBranch>"},
1101 { NULL, NULL, Help2, 0, NULL},
1102 { NULL, NULL, GUI_ShowAbout, 0, NULL},
1106 static void InitSendMenu (void)
1108 send_menu_items[0].path = g_strdup (_("/_File"));
1109 send_menu_items[1].path = g_strdup (_("/File/Sen_d"));
1110 send_menu_items[2].path = g_strdup (_("/File/_Save"));
1111 send_menu_items[3].path = g_strdup (_("/File/Sep1"));
1112 send_menu_items[4].path = g_strdup (_("/File/Check _Names"));
1113 send_menu_items[5].path = g_strdup (_("/File/C_ontacts"));
1114 send_menu_items[6].path = g_strdup (_("/File/Sep2"));
1115 send_menu_items[7].path = g_strdup (_("/File/_Close"));
1116 send_menu_items[8].path = g_strdup (_("/_Help"));
1117 send_menu_items[9].path = g_strdup (_("/Help/_Help"));
1118 send_menu_items[10].path = g_strdup (_("/Help/_About"));
1122 static void CreateSMSSendWindow (void)
1124 int nmenu_items = sizeof (send_menu_items) / sizeof (send_menu_items[0]);
1125 GtkItemFactory *item_factory;
1126 GtkAccelGroup *accel_group;
1128 GtkWidget *main_vbox;
1129 GtkWidget *hbox, *vbox;
1134 GtkWidget *scrolledWindow;
1135 GtkTooltips *tooltips;
1137 if (sendSMS.SMSSendWindow)
1141 sendSMS.SMSSendWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1142 gtk_window_set_wmclass (GTK_WINDOW(sendSMS.SMSSendWindow), "SMSSendWindow", "Xgnokii");
1144 //gtk_widget_set_usize (GTK_WIDGET (sendSMS.SMSSendWindow), 436, 220);
1145 gtk_signal_connect (GTK_OBJECT (sendSMS.SMSSendWindow), "delete_event",
1146 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1147 gtk_widget_realize (sendSMS.SMSSendWindow);
1149 accel_group = gtk_accel_group_new ();
1150 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
1153 gtk_item_factory_create_items (item_factory, nmenu_items, send_menu_items, NULL);
1155 gtk_accel_group_attach (accel_group, GTK_OBJECT (sendSMS.SMSSendWindow));
1157 /* Finally, return the actual menu bar created by the item factory. */
1158 menubar = gtk_item_factory_get_widget (item_factory, "<main>");
1160 main_vbox = gtk_vbox_new (FALSE, 1);
1161 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
1162 gtk_container_add (GTK_CONTAINER (sendSMS.SMSSendWindow), main_vbox);
1163 gtk_widget_show (main_vbox);
1165 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
1166 gtk_widget_show (menubar);
1168 /* Create the toolbar */
1170 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
1171 gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1173 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Send message"), NULL,
1174 NewPixmap(SendSMS_xpm, GUI_SMSWindow->window,
1175 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1176 (GtkSignalFunc) SendSMS, NULL);
1177 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Save message to outbox"), NULL,
1178 NewPixmap(Send_xpm, GUI_SMSWindow->window,
1179 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1180 (GtkSignalFunc) SaveSMS, NULL);
1182 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1184 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Check names"), NULL,
1185 NewPixmap(Check_xpm, GUI_SMSWindow->window,
1186 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1187 (GtkSignalFunc) CheckAddress, NULL);
1189 gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
1190 gtk_widget_show (toolbar);
1193 hbox = gtk_hbox_new (FALSE, 3);
1194 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 3);
1195 gtk_widget_show (hbox);
1197 label = gtk_label_new (_("To:"));
1198 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 3);
1199 gtk_widget_show (label);
1201 sendSMS.addr = gtk_entry_new ();
1202 gtk_box_pack_start (GTK_BOX (hbox), sendSMS.addr, TRUE, TRUE, 1);
1204 sendSMS.addrTip = gtk_tooltips_new ();
1205 gtk_tooltips_set_tip (sendSMS.addrTip, sendSMS.addr, "", NULL);
1206 gtk_tooltips_disable (sendSMS.addrTip);
1208 gtk_widget_show (sendSMS.addr);
1210 button = gtk_button_new ();
1211 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1212 GTK_SIGNAL_FUNC (ShowSelectContactsDialog), (gpointer) NULL);
1214 pixmap = NewPixmap(Names_xpm, sendSMS.SMSSendWindow->window,
1215 &sendSMS.SMSSendWindow->style->bg[GTK_STATE_NORMAL]);
1216 gtk_container_add (GTK_CONTAINER (button), pixmap);
1217 gtk_widget_show (pixmap);
1218 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 5);
1220 tooltips = gtk_tooltips_new ();
1221 gtk_tooltips_set_tip (tooltips, button, _("Select contacts"), NULL);
1223 gtk_widget_show (button);
1225 hbox = gtk_hbox_new (FALSE, 3);
1226 gtk_box_pack_end (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 3);
1227 gtk_widget_show (hbox);
1229 /* Edit SMS widget */
1230 vbox = gtk_vbox_new (FALSE, 3);
1231 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 3);
1232 gtk_widget_show (vbox);
1234 sendSMS.status = gtk_frame_new ("0/1");
1235 gtk_frame_set_label_align (GTK_FRAME (sendSMS.status), 1.0, 0.0);
1236 gtk_frame_set_shadow_type (GTK_FRAME (sendSMS.status), GTK_SHADOW_OUT);
1238 gtk_box_pack_end (GTK_BOX (vbox), sendSMS.status, TRUE, TRUE, 5);
1239 gtk_widget_show (sendSMS.status);
1241 sendSMS.smsSendText = gtk_text_new (NULL, NULL);
1242 gtk_widget_set_usize (GTK_WIDGET (sendSMS.smsSendText), 0, 120);
1243 gtk_text_set_editable (GTK_TEXT (sendSMS.smsSendText), TRUE);
1244 gtk_text_set_word_wrap (GTK_TEXT (sendSMS.smsSendText), TRUE);
1245 gtk_signal_connect_after (GTK_OBJECT (sendSMS.smsSendText),
1247 GTK_SIGNAL_FUNC(RefreshSMSLength), (gpointer) NULL);
1248 gtk_signal_connect_after (GTK_OBJECT (sendSMS.smsSendText),
1249 "button_press_event",
1250 GTK_SIGNAL_FUNC(RefreshSMSLength), (gpointer) NULL);
1252 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1253 gtk_container_set_border_width (GTK_CONTAINER (scrolledWindow), 5);
1254 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1256 GTK_POLICY_AUTOMATIC);
1258 gtk_container_add (GTK_CONTAINER (scrolledWindow), sendSMS.smsSendText);
1259 gtk_container_add (GTK_CONTAINER (sendSMS.status), scrolledWindow);
1261 gtk_widget_show (sendSMS.smsSendText);
1262 gtk_widget_show (scrolledWindow);
1264 /* Options widget */
1265 vbox = gtk_vbox_new (FALSE, 3);
1266 gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 5);
1267 gtk_widget_show (vbox);
1269 sendSMS.report = gtk_check_button_new_with_label (_("Delivery report"));
1270 gtk_box_pack_start (GTK_BOX (vbox), sendSMS.report, FALSE, FALSE, 3);
1271 gtk_widget_show (sendSMS.report);
1273 sendSMS.longSMS = gtk_check_button_new_with_label (_("Send as Long SMS"));
1274 gtk_box_pack_start (GTK_BOX (vbox), sendSMS.longSMS, FALSE, FALSE, 3);
1275 gtk_widget_show (sendSMS.longSMS);
1277 label = gtk_label_new (_("SMS Center:"));
1278 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1);
1279 gtk_widget_show (label);
1281 GUI_InitSMSSettings ();
1282 sendSMS.smscOptionMenu = gtk_option_menu_new();
1284 GUIEventSend (GUI_EVENT_SMS_CENTERS_CHANGED);
1286 gtk_box_pack_start (GTK_BOX (vbox), sendSMS.smscOptionMenu, FALSE, FALSE, 1);
1287 gtk_widget_show (sendSMS.smscOptionMenu);
1291 static void NewSMS (void)
1293 if (!sendSMS.SMSSendWindow)
1294 CreateSMSSendWindow ();
1296 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("New Message"));
1298 gtk_tooltips_disable (sendSMS.addrTip);
1300 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1301 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1302 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText), gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1303 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1305 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
1307 RefreshSMSStatus ();
1309 gtk_widget_show (sendSMS.SMSSendWindow);
1313 static void ForwardSMS (void)
1317 if (GTK_CLIST (SMS.smsClist)->selection == NULL)
1320 if (!sendSMS.SMSSendWindow)
1321 CreateSMSSendWindow ();
1323 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("Forward Message"));
1325 gtk_tooltips_disable (sendSMS.addrTip);
1327 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1328 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1329 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText), gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1330 gtk_clist_get_text (GTK_CLIST (SMS.smsClist),
1331 GPOINTER_TO_INT(GTK_CLIST (SMS.smsClist)->selection->data),
1334 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1337 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1339 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
1341 RefreshSMSStatus ();
1343 gtk_widget_show (sendSMS.SMSSendWindow);
1348 static inline gint CompareSMSMessageLocation (gconstpointer a, gconstpointer b)
1350 return !(((GSM_SMSMessage *) a)->Location == ((GSM_SMSMessage *) b)->Location);
1355 static void ReplySMS (void)
1359 // GSM_SMSMessage msg;
1360 MessagePointers *msgPtrs;
1362 if (GTK_CLIST (SMS.smsClist)->selection == NULL)
1365 if (!sendSMS.SMSSendWindow)
1366 CreateSMSSendWindow ();
1368 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("Reply Message"));
1370 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1371 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1372 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText),
1373 gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1374 gtk_clist_get_text (GTK_CLIST (SMS.smsClist),
1375 GPOINTER_TO_INT(GTK_CLIST (SMS.smsClist)->selection->data),
1378 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL,
1379 &(sendSMS.smsSendText->style->black), NULL, buf, -1);
1381 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1383 //msg.Location = *(((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
1384 // GPOINTER_TO_INT (GTK_CLIST (SMS.smsClist)->selection->data)))->msgPtr);
1386 //r = g_slist_find_custom (SMS.messages, &msg, CompareSMSMessageLocation);
1388 msgPtrs = ((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
1389 GPOINTER_TO_INT (GTK_CLIST (SMS.smsClist)->selection->data)));
1391 /* We don't have GSM_SMSMessageType stored in MessagePointers so we just
1392 * look at both the "sender" and "destination", shouldn't matter.
1393 * Anyway to "Reply" to Outbox message is a bit weird, the icon/menu should
1394 * be automatically changed when switched to the Outbox mode. Not my business.
1396 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), (msgPtrs->sender[0] ? msgPtrs->sender : msgPtrs->destination));
1398 CheckAddressMain ();
1399 RefreshSMSStatus ();
1401 gtk_widget_show (sendSMS.SMSSendWindow);
1405 static void NewBC (void)
1407 if (!sendSMS.SMSSendWindow)
1408 CreateSMSSendWindow ();
1410 gtk_window_set_title (GTK_WINDOW (sendSMS.SMSSendWindow), _("Bussiness Card"));
1412 gtk_tooltips_disable (sendSMS.addrTip);
1414 gtk_text_freeze (GTK_TEXT (sendSMS.smsSendText));
1415 gtk_text_set_point (GTK_TEXT (sendSMS.smsSendText), 0);
1416 gtk_text_forward_delete (GTK_TEXT (sendSMS.smsSendText), gtk_text_get_length (GTK_TEXT (sendSMS.smsSendText)));
1418 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(SMS.colour), NULL,
1419 "Business Card\n", -1);
1421 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1422 xgnokiiConfig.user.name, -1);
1424 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1427 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1428 xgnokiiConfig.user.title, -1);
1430 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1433 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1434 xgnokiiConfig.user.company, -1);
1436 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1439 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(SMS.colour), NULL,
1442 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1443 xgnokiiConfig.user.telephone, -1);
1445 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1448 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(SMS.colour), NULL,
1451 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1452 xgnokiiConfig.user.fax, -1);
1454 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1457 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1458 xgnokiiConfig.user.email, -1);
1460 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1463 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1464 xgnokiiConfig.user.address, -1);
1466 gtk_text_insert (GTK_TEXT (sendSMS.smsSendText), NULL, &(sendSMS.smsSendText->style->black), NULL,
1469 gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
1471 gtk_entry_set_text (GTK_ENTRY (sendSMS.addr), "");
1473 RefreshSMSStatus ();
1475 gtk_widget_show (sendSMS.SMSSendWindow);
1479 static GtkItemFactoryEntry menu_items[] = {
1480 { NULL, NULL, NULL, 0, "<Branch>"},
1481 { NULL, "<control>S", NULL, 0, NULL},
1482 { NULL, "<control>M", SaveToMailbox, 0, NULL},
1483 { NULL, NULL, NULL, 0, "<Separator>"},
1484 { NULL, "<control>W", CloseSMS, 0, NULL},
1485 { NULL, NULL, NULL, 0, "<Branch>"},
1486 { NULL, "<control>N", NewSMS, 0, NULL},
1487 { NULL, "<control>F", ForwardSMS, 0, NULL},
1488 { NULL, "<control>R", ReplySMS, 0, NULL},
1489 { NULL, "<control>D", DeleteSMS, 0, NULL},
1490 { NULL, NULL, NULL, 0, "<Separator>"},
1491 { NULL, "<control>B", NewBC, 0, NULL},
1492 { NULL, NULL, NULL, 0, "<LastBranch>"},
1493 { NULL, NULL, Help1, 0, NULL},
1494 { NULL, NULL, GUI_ShowAbout, 0, NULL},
1498 static void InitMainMenu (void)
1500 register gint i = 0;
1502 menu_items[i++].path = g_strdup (_("/_File"));
1503 menu_items[i++].path = g_strdup (_("/File/_Save"));
1504 menu_items[i++].path = g_strdup (_("/File/Save to mailbo_x"));
1505 menu_items[i++].path = g_strdup (_("/File/Sep1"));
1506 menu_items[i++].path = g_strdup (_("/File/_Close"));
1507 menu_items[i++].path = g_strdup (_("/_Messages"));
1508 menu_items[i++].path = g_strdup (_("/_Messages/_New"));
1509 menu_items[i++].path = g_strdup (_("/_Messages/_Forward"));
1510 menu_items[i++].path = g_strdup (_("/_Messages/_Reply"));
1511 menu_items[i++].path = g_strdup (_("/_Messages/_Delete"));
1512 menu_items[i++].path = g_strdup (_("/Messages/Sep3"));
1513 menu_items[i++].path = g_strdup (_("/_Messages/_Bussiness card"));
1514 menu_items[i++].path = g_strdup (_("/_Help"));
1515 menu_items[i++].path = g_strdup (_("/Help/_Help"));
1516 menu_items[i++].path = g_strdup (_("/Help/_About"));
1520 void GUI_CreateSMSWindow (void)
1522 int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
1523 GtkItemFactory *item_factory;
1524 GtkAccelGroup *accel_group;
1526 GtkWidget *main_vbox;
1528 GtkWidget *scrolledWindow;
1529 GtkWidget *vpaned, *hpaned;
1530 GtkWidget *tree, *treeSMSItem, *treeInboxItem, *treeOutboxItem, *subTree;
1531 SortColumn *sColumn;
1534 gchar *titles[4] = { _("Status"), _("Date / Time"), _("Sender"), _("Message")};
1538 GUI_SMSWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1539 gtk_window_set_wmclass (GTK_WINDOW (GUI_SMSWindow), "SMSWindow", "Xgnokii");
1540 gtk_window_set_title (GTK_WINDOW (GUI_SMSWindow), _("Short Message Service"));
1541 //gtk_widget_set_usize (GTK_WIDGET (GUI_SMSWindow), 436, 220);
1542 gtk_signal_connect (GTK_OBJECT (GUI_SMSWindow), "delete_event",
1543 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
1544 gtk_widget_realize (GUI_SMSWindow);
1546 accel_group = gtk_accel_group_new ();
1547 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
1550 gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
1552 gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_SMSWindow));
1554 /* Finally, return the actual menu bar created by the item factory. */
1555 menubar = gtk_item_factory_get_widget (item_factory, "<main>");
1557 main_vbox = gtk_vbox_new (FALSE, 1);
1558 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
1559 gtk_container_add (GTK_CONTAINER (GUI_SMSWindow), main_vbox);
1560 gtk_widget_show (main_vbox);
1562 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
1563 gtk_widget_show (menubar);
1565 /* Create the toolbar */
1566 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
1567 gtk_toolbar_set_button_relief (GTK_TOOLBAR (toolbar), GTK_RELIEF_NORMAL);
1569 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("New message"), NULL,
1570 NewPixmap(Edit_xpm, GUI_SMSWindow->window,
1571 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1572 (GtkSignalFunc) NewSMS, NULL);
1573 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Forward message"), NULL,
1574 NewPixmap(Forward_xpm, GUI_SMSWindow->window,
1575 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1576 (GtkSignalFunc) ForwardSMS, NULL);
1577 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Reply message"), NULL,
1578 NewPixmap(Reply_xpm, GUI_SMSWindow->window,
1579 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1580 (GtkSignalFunc) ReplySMS, NULL);
1582 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Bussiness Card"), NULL,
1583 NewPixmap(BCard_xpm, GUI_SMSWindow->window,
1584 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1585 (GtkSignalFunc) NewBC, NULL);
1587 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1589 gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), NULL, _("Delete message"), NULL,
1590 NewPixmap(Delete_xpm, GUI_SMSWindow->window,
1591 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL]),
1592 (GtkSignalFunc) DeleteSMS, NULL);
1594 gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
1595 gtk_widget_show (toolbar);
1597 vpaned = gtk_vpaned_new ();
1598 gtk_paned_set_handle_size (GTK_PANED (vpaned), 10);
1599 gtk_paned_set_gutter_size (GTK_PANED (vpaned), 15);
1600 gtk_box_pack_end (GTK_BOX (main_vbox), vpaned, TRUE, TRUE, 0);
1601 gtk_widget_show (vpaned);
1603 hpaned = gtk_hpaned_new ();
1604 gtk_paned_set_handle_size (GTK_PANED (hpaned), 8);
1605 gtk_paned_set_gutter_size (GTK_PANED (hpaned), 10);
1606 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
1607 gtk_widget_show (hpaned);
1609 /* Navigation tree */
1610 tree = gtk_tree_new ();
1611 gtk_tree_set_selection_mode (GTK_TREE (tree), GTK_SELECTION_SINGLE);
1612 gtk_widget_show (tree);
1614 treeSMSItem = gtk_tree_item_new_with_label (_("SMS's"));
1615 gtk_tree_append (GTK_TREE (tree), treeSMSItem);
1616 gtk_widget_show (treeSMSItem);
1618 subTree = gtk_tree_new ();
1619 gtk_tree_set_selection_mode (GTK_TREE (subTree), GTK_SELECTION_SINGLE);
1620 gtk_tree_set_view_mode (GTK_TREE (subTree), GTK_TREE_VIEW_ITEM);
1621 gtk_tree_item_set_subtree (GTK_TREE_ITEM (treeSMSItem), subTree);
1623 treeInboxItem = gtk_tree_item_new_with_label (_("Inbox"));
1624 gtk_tree_append (GTK_TREE (subTree), treeInboxItem);
1625 gtk_signal_connect (GTK_OBJECT (treeInboxItem), "select",
1626 GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (0));
1627 gtk_widget_show (treeInboxItem);
1629 treeOutboxItem = gtk_tree_item_new_with_label (_("Outbox"));
1630 gtk_tree_append (GTK_TREE (subTree), treeOutboxItem);
1631 gtk_signal_connect (GTK_OBJECT (treeOutboxItem), "select",
1632 GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (1));
1633 gtk_widget_show (treeOutboxItem);
1635 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1636 gtk_widget_set_usize (scrolledWindow, 75, 80);
1637 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1638 GTK_POLICY_AUTOMATIC,
1639 GTK_POLICY_AUTOMATIC);
1641 gtk_paned_add1 (GTK_PANED (hpaned), scrolledWindow);
1643 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledWindow),
1645 gtk_widget_show (scrolledWindow);
1648 /* Message viewer */
1649 SMS.smsText = gtk_text_new (NULL, NULL);
1650 gtk_text_set_editable (GTK_TEXT (SMS.smsText), FALSE);
1651 gtk_text_set_word_wrap (GTK_TEXT (SMS.smsText), TRUE);
1652 //gtk_text_set_line_wrap (GTK_TEXT (SMS.smsText), TRUE);
1654 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1655 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1657 GTK_POLICY_AUTOMATIC);
1659 gtk_paned_add2 (GTK_PANED (hpaned), scrolledWindow);
1661 gtk_container_add (GTK_CONTAINER (scrolledWindow), SMS.smsText);
1662 gtk_widget_show_all (scrolledWindow);
1665 SMS.smsClist = gtk_clist_new_with_titles (4, titles);
1666 gtk_clist_set_shadow_type (GTK_CLIST (SMS.smsClist), GTK_SHADOW_OUT);
1667 gtk_clist_set_compare_func (GTK_CLIST (SMS.smsClist), CListCompareFunc);
1668 gtk_clist_set_sort_column (GTK_CLIST (SMS.smsClist), 1);
1669 gtk_clist_set_sort_type (GTK_CLIST (SMS.smsClist), GTK_SORT_ASCENDING);
1670 gtk_clist_set_auto_sort (GTK_CLIST (SMS.smsClist), FALSE);
1671 gtk_clist_set_selection_mode (GTK_CLIST (SMS.smsClist), GTK_SELECTION_EXTENDED);
1673 gtk_clist_set_column_width (GTK_CLIST (SMS.smsClist), 0, 40);
1674 gtk_clist_set_column_width (GTK_CLIST (SMS.smsClist), 1, 142);
1675 gtk_clist_set_column_width (GTK_CLIST (SMS.smsClist), 2, 135);
1676 //gtk_clist_set_column_justification (GTK_CLIST (SMS.smsClist), 2, GTK_JUSTIFY_CENTER);
1678 for (i = 0; i < 4; i++)
1680 if ((sColumn = g_malloc (sizeof (SortColumn))) == NULL)
1682 g_print (_("Error: %s: line %d: Can't allocate memory!\n"), __FILE__, __LINE__);
1685 sColumn->clist = SMS.smsClist;
1686 sColumn->column = i;
1687 gtk_signal_connect (GTK_OBJECT (GTK_CLIST (SMS.smsClist)->column[i].button), "clicked",
1688 GTK_SIGNAL_FUNC (SetSortColumn), (gpointer) sColumn);
1691 gtk_signal_connect (GTK_OBJECT (SMS.smsClist), "select_row",
1692 GTK_SIGNAL_FUNC (ClickEntry), NULL);
1694 scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1695 gtk_widget_set_usize (scrolledWindow, 550, 100);
1696 gtk_container_add (GTK_CONTAINER (scrolledWindow), SMS.smsClist);
1697 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
1698 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1700 gtk_paned_add2 (GTK_PANED (vpaned), scrolledWindow);
1702 gtk_widget_show (SMS.smsClist);
1703 gtk_widget_show (scrolledWindow);
1705 CreateErrorDialog (&errorDialog, GUI_SMSWindow);
1706 CreateInfoDialog (&infoDialog, GUI_SMSWindow);
1708 gtk_signal_emit_by_name(GTK_OBJECT (treeSMSItem), "expand");
1710 cmap = gdk_colormap_get_system();
1711 SMS.colour.red = 0xffff;
1712 SMS.colour.green = 0;
1713 SMS.colour.blue = 0;
1714 if (!gdk_color_alloc (cmap, &(SMS.colour)))
1715 g_error (_("couldn't allocate colour"));
1717 questMark.pixmap = gdk_pixmap_create_from_xpm_d (GUI_SMSWindow->window,
1719 &GUI_SMSWindow->style->bg[GTK_STATE_NORMAL],
1722 GUIEventAdd (GUI_EVENT_SMS_CENTERS_CHANGED, GUI_RefreshSMSCenterMenu);
1723 GUIEventAdd (GUI_EVENT_SMS_NUMBER_CHANGED, GUI_RefreshMessageWindow);