#include #include #include #include #include #include "structures.h" #include "functions.h" #include "vars.h" /*---------------------------------------------------------------- * CreateGtkWindow * * * * Create a new window, with some options * * Used by the main function and some callbacks * * arguments: title, width, height, resizeable (1) or not, * * maximizeable (1) or not, whole program (1) or window exit * * --------------------------------------------------------------*/ GtkWidget *CreateGtkWindow(gchar *Title, int X, int Y, int Resizeable, int Maximize, int MainQuit) { GtkWidget *Window; Window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(Window), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(Window), Title); gtk_window_set_icon_from_file(GTK_WINDOW(Window), "icons/icon.ico", NULL); if(MainQuit) g_signal_connect(G_OBJECT(Window), "destroy", G_CALLBACK(GtkMainQuit), Window); else g_signal_connect(G_OBJECT(Window), "destroy", G_CALLBACK(gtk_widget_destroy), Window); if(Resizeable) { gtk_window_set_resizable(GTK_WINDOW(Window), 1); gtk_window_set_default_size(GTK_WINDOW(Window), X, Y); } else { gtk_window_set_resizable(GTK_WINDOW(Window), 0); gtk_widget_set_size_request(GTK_WIDGET(Window), X, Y); } if(Maximize) gtk_window_maximize(GTK_WINDOW(Window)); return Window; } /*---------------------------------------------------------------- * Menu * * * * Create a menu bar * * arguments: window to close on quit item * * * * --------------------------------------------------------------*/ GtkWidget *Menu(GtkWidget *Window) { GtkWidget *MenuBar, *Menu, *Item; MenuBar = gtk_menu_bar_new(); Menu = gtk_menu_new(); Widgets.ItemNew = gtk_menu_item_new_with_label("New"); gtk_widget_set_sensitive(Widgets.ItemNew, 0); g_signal_connect(G_OBJECT(Widgets.ItemNew), "activate", G_CALLBACK(NewMailWindow), (gpointer*)&Widgets.New); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), Widgets.ItemNew); Item = gtk_menu_item_new_with_label("Accounts Manager"); g_signal_connect(G_OBJECT(Item), "activate", G_CALLBACK(AccountManager), NULL); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), Item); Item = gtk_menu_item_new_with_label("Quit"); g_signal_connect(G_OBJECT(Item), "activate", G_CALLBACK(GtkMainQuit), (GtkWidget*) Window); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), Item); Item = gtk_menu_item_new_with_label("File"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(Item), Menu); gtk_menu_shell_append(GTK_MENU_SHELL(MenuBar), Item); Menu = gtk_menu_new(); Widgets.ItemAnswer = gtk_menu_item_new_with_label("Answer"); gtk_widget_set_sensitive(Widgets.ItemAnswer, 0); g_signal_connect(G_OBJECT(Widgets.ItemAnswer), "activate", G_CALLBACK(NewMailWindow), (gpointer*)&Widgets.Answer); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), Widgets.ItemAnswer); Widgets.ItemTrans = gtk_menu_item_new_with_label("Transfer"); gtk_widget_set_sensitive(Widgets.ItemTrans, 0); g_signal_connect(G_OBJECT(Widgets.ItemTrans), "activate", G_CALLBACK(NewMailWindow), (gpointer*)&Widgets.Tr); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), Widgets.ItemTrans); Widgets.ItemDelete = gtk_menu_item_new_with_label("Delete"); gtk_widget_set_sensitive(Widgets.ItemDelete, 0); g_signal_connect(G_OBJECT(Widgets.ItemDelete), "activate", G_CALLBACK(DeleteMail), &Widgets.MailId); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), Widgets.ItemDelete); Item = gtk_menu_item_new_with_label("Edition"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(Item), Menu); gtk_menu_shell_append(GTK_MENU_SHELL(MenuBar), Item); Menu = gtk_menu_new(); Item = gtk_menu_item_new_with_label("About SLMC"); g_signal_connect(G_OBJECT(Item), "activate", G_CALLBACK(AboutWindow), NULL); gtk_menu_shell_append(GTK_MENU_SHELL(Menu),Item); Item = gtk_menu_item_new_with_label("?"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(Item), Menu); gtk_menu_shell_append(GTK_MENU_SHELL(MenuBar), Item); return MenuBar; } /*---------------------------------------------------------------- * ToolBar * * Creating a toolbar with icons for default actions * * --------------------------------------------------------------*/ GtkWidget *ToolBar() { GtkWidget *Toolbar, *AM; GtkTooltips *Tooltips; Tooltips = gtk_tooltips_new(); Widgets.ButtonReceive = CreateButton("icons/mail-send-receive.png"); g_signal_connect(GTK_OBJECT(Widgets.ButtonReceive), "clicked", G_CALLBACK(CheckMails), NULL); gtk_widget_set_sensitive(Widgets.ButtonReceive, 0); gtk_tooltips_set_tip(Tooltips, Widgets.ButtonReceive, "Fetch mails", "Fetch mails"); Widgets.ButtonNew = CreateButton("icons/mail-message-new.png"); g_signal_connect(GTK_OBJECT(Widgets.ButtonNew), "clicked", G_CALLBACK(NewMailWindow), (gpointer*)&Widgets.New); gtk_widget_set_sensitive(Widgets.ButtonNew, 0); gtk_tooltips_set_tip(Tooltips, Widgets.ButtonNew, "New mail", "New mail"); Widgets.ButtonAnswer = CreateButton("icons/mail-reply-sender.png"); g_signal_connect(GTK_OBJECT(Widgets.ButtonAnswer), "clicked", G_CALLBACK(NewMailWindow), (gpointer*)&Widgets.Answer); gtk_widget_set_sensitive(Widgets.ButtonAnswer, 0); gtk_tooltips_set_tip(Tooltips, Widgets.ButtonAnswer, "Reply", "Reply"); Widgets.ButtonTrans = CreateButton("icons/mail-forward.png"); g_signal_connect(GTK_OBJECT(Widgets.ButtonTrans), "clicked", G_CALLBACK(NewMailWindow), (gpointer*)&Widgets.Tr); gtk_widget_set_sensitive(Widgets.ButtonTrans, 0); gtk_tooltips_set_tip(Tooltips, Widgets.ButtonTrans, "Transfert mail", "Transfert mail"); Widgets.ButtonDelete = CreateButton("icons/edit-delete.png"); g_signal_connect(GTK_OBJECT(Widgets.ButtonDelete), "clicked", G_CALLBACK(DeleteMail), NULL); gtk_widget_set_sensitive(Widgets.ButtonDelete, 0); gtk_tooltips_set_tip(Tooltips, Widgets.ButtonDelete, "Delete mail", "Delete mail"); AM = CreateButton("icons/am.xpm"); g_signal_connect(GTK_OBJECT(AM), "clicked", G_CALLBACK(AccountManager), NULL); gtk_tooltips_set_tip(Tooltips, AM, "Accounts manager", "Accounts manager"); Toolbar = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(Toolbar), Widgets.ButtonReceive, 0, 0, 0); gtk_box_pack_start(GTK_BOX(Toolbar), Widgets.ButtonNew, 0, 0, 0); gtk_box_pack_start(GTK_BOX(Toolbar), Widgets.ButtonAnswer, 0, 0, 0); gtk_box_pack_start(GTK_BOX(Toolbar), Widgets.ButtonTrans, 0, 0, 0); gtk_box_pack_start(GTK_BOX(Toolbar), Widgets.ButtonDelete, 0, 0, 0); gtk_box_pack_start(GTK_BOX(Toolbar), AM, 0, 0, 0); gtk_tooltips_enable(Tooltips); return Toolbar; } GtkWidget *CreateTree() { GtkWidget *TreeView; GtkTreeViewColumn *Column; GtkCellRenderer *CellRenderer; Widgets.TreeStore = gtk_tree_store_new(N_COLUMN, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); TreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(Widgets.TreeStore)); CellRenderer = gtk_cell_renderer_pixbuf_new(); Column = gtk_tree_view_column_new_with_attributes("",CellRenderer,"pixbuf", BMP_COLUMN,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(TreeView), Column); CellRenderer = gtk_cell_renderer_text_new(); Column = gtk_tree_view_column_new_with_attributes("Account",CellRenderer,"text", TEXT_COLUMN,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(TreeView), Column); return TreeView; } GtkWidget *CreateList() { GtkWidget *ListView; GtkTreeViewColumn *Column; GtkCellRenderer *CellRenderer; Widgets.ListStore = gtk_list_store_new(NUMBER, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); ListView = gtk_tree_view_new(); gtk_tree_view_set_model(GTK_TREE_VIEW(ListView), GTK_TREE_MODEL(Widgets.ListStore)); CellRenderer = gtk_cell_renderer_text_new(); Column = gtk_tree_view_column_new_with_attributes("From",CellRenderer,"text", FROM_COLUMN,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(ListView),GTK_TREE_VIEW_COLUMN(Column)); CellRenderer = gtk_cell_renderer_text_new(); Column = gtk_tree_view_column_new_with_attributes("Subject",CellRenderer,"text", SUBJECT_COLUMN,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(ListView),GTK_TREE_VIEW_COLUMN(Column)); CellRenderer = gtk_cell_renderer_text_new(); Column = gtk_tree_view_column_new_with_attributes("Date",CellRenderer,"text", DATE_COLUMN,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(ListView),GTK_TREE_VIEW_COLUMN(Column)); CellRenderer = gtk_cell_renderer_text_new(); Column = gtk_tree_view_column_new_with_attributes("hiddenid",CellRenderer,"text", MAIL_ID_COLUMN,NULL); return ListView; } GtkWidget *PackIt(GtkWidget *MainWindow) { GtkWidget *Container; GtkWidget *ContainerMiddle, *MenuBar, *Toolbar, *ListView; GtkWidget *ContainerPan; GtkWidget *LeftBox, *MiddleBox, *RightBox; GtkWidget *RightPaned, *LeftPaned, *MiddlePaned; MenuBar = Menu(MainWindow); Toolbar = ToolBar(); Widgets.TreeView = CreateTree(); ListView = CreateList(); Widgets.PixBufBox = gdk_pixbuf_new_from_file("icons/folder-remote.png", NULL); Widgets.PixBufAcc = gdk_pixbuf_new_from_file("icons/am2.xpm", NULL); Widgets.Text = g_malloc(16); Container = gtk_vbox_new(FALSE, 0); ContainerMiddle = gtk_hbox_new(FALSE, 2); ContainerPan = gtk_hpaned_new(); GtkWidget *Middle = gtk_hpaned_new(); RightPaned = gtk_vbox_new(FALSE, 0); LeftPaned = gtk_vbox_new(FALSE, 0); MiddlePaned = gtk_vbox_new(FALSE, 0); LeftBox = gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(LeftPaned), LeftBox, 1, 1, 1); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(LeftBox), GTK_WIDGET(Widgets.TreeView)); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(LeftBox),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); MiddleBox = gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(MiddlePaned), MiddleBox, 1, 1, 1); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(MiddleBox), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(MiddleBox),ListView); Widgets.RightLabel = gtk_label_new("Subject:\nFrom:\nDate:\nTo:\nCC:"); gtk_misc_set_alignment(GTK_MISC(Widgets.RightLabel), 0.02, 0); Widgets.Rig = CreateTextView("", 0); RightBox = PackIntoScroll(Widgets.Rig); gtk_box_pack_start(GTK_BOX(RightPaned), Widgets.RightLabel, 0, 0, 1); gtk_box_pack_start(GTK_BOX(RightPaned), RightBox, 1, 1, 1); gtk_container_add(GTK_CONTAINER(ContainerPan), LeftPaned); gtk_container_add(GTK_CONTAINER(ContainerPan), MiddlePaned); gtk_container_add(GTK_CONTAINER(Middle), ContainerPan); gtk_container_add(GTK_CONTAINER(Middle), RightPaned); gtk_widget_set_size_request(GTK_WIDGET(LeftPaned), 200, 800); gtk_widget_set_size_request(GTK_WIDGET(MiddlePaned), 400, 800); gtk_box_pack_start(GTK_BOX(Container), MenuBar, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(Container), Toolbar, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(Container), Middle, TRUE, TRUE, 0); Widgets.TreeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(Widgets.TreeView)); g_signal_connect(GTK_TREE_VIEW(Widgets.TreeView), "cursor-changed", G_CALLBACK(AccountSelected), NULL); Widgets.ListSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ListView)); g_signal_connect(GTK_TREE_VIEW(ListView), "cursor-changed", G_CALLBACK(MailSelected), NULL); return Container; } int Dialog_Box(gchar *Message, int close) { GtkWidget *Dialog, *MessageLabel; Dialog = gtk_dialog_new_with_buttons ("", NULL,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_OK,GTK_RESPONSE_NONE,NULL); MessageLabel = gtk_label_new (Message); if(close) g_signal_connect_swapped(Dialog, "response", G_CALLBACK(gtk_main_quit), Dialog); else g_signal_connect(Dialog, "response", G_CALLBACK(gtk_widget_destroy), Dialog); gtk_container_add (GTK_CONTAINER(GTK_DIALOG(Dialog)->vbox), MessageLabel); gtk_window_set_transient_for(GTK_WINDOW(Dialog), GTK_WINDOW(Widgets.MainWindow)); gtk_widget_show_all(Dialog); return 0; } GtkWidget *CreateEntry(gchar *Data, int password) { GtkWidget *Entry; gchar *Content; Content = g_locale_to_utf8(Data, -1, NULL, NULL, NULL); Entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(Entry), 25); if(password) gtk_entry_set_visibility(GTK_ENTRY(Entry), FALSE); gtk_entry_set_text(GTK_ENTRY(Entry), Content); g_free(Content); return Entry; } GtkWidget *CreateLabel(const gchar *LabelContent, int Size) { GtkWidget *Label; Label = gtk_label_new(LabelContent); gtk_label_set_width_chars(GTK_LABEL(Label), Size); return Label; } GtkWidget *PackLabelEntry(GtkWidget *Label, GtkWidget *Entry) { GtkWidget *Container; Container = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(Container), GTK_WIDGET(Label), 0, 0, 2); gtk_box_pack_start(GTK_BOX(Container), GTK_WIDGET(Entry), 0, 0, 2); return Container; } GtkWidget *CreateTextView(gchar *Text, int IsEditable) { GtkWidget *TextView; gchar *Content; GtkTextBuffer *TextViewBuffer; Content = g_locale_to_utf8(Text, -1, NULL, NULL, NULL); TextView = gtk_text_view_new(); TextViewBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TextView)); gtk_text_buffer_set_text(GTK_TEXT_BUFFER(TextViewBuffer), Content, -1); gtk_text_view_set_editable(GTK_TEXT_VIEW(TextView), IsEditable); g_free(Content); return TextView; } GtkWidget *PackIntoScroll(GtkWidget *Widget) { GtkWidget *Scroll; Scroll = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(Scroll), Widget); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(Scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(Scroll), GTK_SHADOW_IN); return Scroll; } GtkWidget *CreateButton(const gchar *File) { GtkWidget *Button, *Image; Button = gtk_button_new(); Image = gtk_image_new_from_file(File); gtk_button_set_image(GTK_BUTTON(Button), Image); return Button; } int GtkError(gchar *text, int close) { Dialog_Box(text, close); fprintf(stderr, "\n%s\n", text); if(close) { sqlite3_close(Widgets.db); sqlite3_close(Widgets.db2); } return 1; }