2007-03-30 [paul] 2.8.1cvs68
[claws.git] / src / mainwindow.c
index db160890fa174852f00fd0fea13dd8e3b431a6b7..9150dbdaf52ac04ac1780212d7e752d50e20c646 100644 (file)
@@ -199,6 +199,9 @@ static void addressbook_open_cb     (MainWindow     *mainwin,
 static void log_window_show_cb (MainWindow     *mainwin,
                                 guint           action,
                                 GtkWidget      *widget);
+static void filtering_debug_window_show_cb     (MainWindow     *mainwin,
+                                guint           action,
+                                GtkWidget      *widget);
 
 static void inc_cancel_cb              (MainWindow     *mainwin,
                                         guint           action,
@@ -562,6 +565,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_View/Layout/_Three columns"),    NULL, set_layout_cb, VERTICAL_LAYOUT, "/View/Layout/Standard"},
        {N_("/_View/Layout/_Wide message"),     NULL, set_layout_cb, WIDE_LAYOUT, "/View/Layout/Standard"},
        {N_("/_View/Layout/W_ide message list"),NULL, set_layout_cb, WIDE_MSGLIST_LAYOUT, "/View/Layout/Standard"},
+       {N_("/_View/Layout/S_mall screen"),     NULL, set_layout_cb, SMALL_LAYOUT, "/View/Layout/Standard"},
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_View/_Sort"),                    NULL, NULL, 0, "<Branch>"},
        {N_("/_View/_Sort/by _number"),         NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"},
@@ -860,6 +864,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
                                                NULL, ssl_manager_open_cb, 0, NULL},
 #endif
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
+       {N_("/_Tools/Filtering debug window"),  NULL, filtering_debug_window_show_cb, 0, NULL},
        {N_("/_Tools/_Log window"),             "<shift><control>L", log_window_show_cb, 0, NULL},
 
        {N_("/_Configuration"),                 NULL, NULL, 0, "<Branch>"},
@@ -1048,7 +1053,6 @@ static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refr
                                   GDK_1+i, GDK_CONTROL_MASK,
                                   GTK_ACCEL_LOCKED | GTK_ACCEL_VISIBLE);
        }
-
        gtk_widget_show(menu);
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
        mainwin->colorlabel_menu = menu;
@@ -1286,16 +1290,40 @@ MainWindow *main_window_create()
 
        gtk_widget_hide(offline_switch);
        gtk_widget_hide(warning_btn);
+
        /* create views */
        mainwin->folderview  = folderview  = folderview_create();
        mainwin->summaryview = summaryview = summary_create();
        mainwin->messageview = messageview = messageview_create(mainwin);
-       mainwin->logwin      = log_window_create();
 
+       /* init log instances data before creating log views */
+       set_log_title(LOG_PROTOCOL, _("Protocol log"));
+       set_log_prefs(LOG_PROTOCOL,
+                       &prefs_common.logwin_width,
+                       &prefs_common.logwin_height);
+       set_log_title(LOG_DEBUG_FILTERING, _("Filtering/processing debug log"));
+       set_log_prefs(LOG_DEBUG_FILTERING,
+                       &prefs_common.filtering_debugwin_width,
+                       &prefs_common.filtering_debugwin_height);
+
+       /* setup log windows */
+       mainwin->logwin = log_window_create(LOG_PROTOCOL);
        log_window_init(mainwin->logwin);
-       log_window_set_clipping(mainwin->logwin, prefs_common.cliplog,
+
+       mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
+       log_window_set_clipping(mainwin->logwin,
+                               prefs_common.cliplog,
                                prefs_common.loglength);
 
+       log_window_init(mainwin->filtering_debugwin);
+       log_window_set_clipping(mainwin->filtering_debugwin,
+                               prefs_common.filtering_debug_cliplog,
+                               prefs_common.filtering_debug_loglength);
+       if (prefs_common.enable_filtering_debug)
+               log_message(LOG_DEBUG_FILTERING, _("filtering debug enabled\n"));
+       else
+               log_message(LOG_DEBUG_FILTERING, _("filtering debug disabled\n"));
+
        folderview->mainwin      = mainwin;
        folderview->summaryview  = summaryview;
 
@@ -1443,9 +1471,12 @@ MainWindow *main_window_create()
                         G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
        gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
 
-       if (prefs_common.layout_mode == VERTICAL_LAYOUT)
+       if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
+           prefs_common.layout_mode == SMALL_LAYOUT) {
                summary_relayout(mainwin->summaryview); 
-
+       }
+       summary_update_unread(mainwin->summaryview, NULL);
+       
        gtk_widget_show(mainwin->window);
 
        /* initialize views */
@@ -1885,9 +1916,16 @@ static void main_window_separation_change(MainWindow *mainwin, LayoutType layout
        gtk_widget_unref(message_wid);
 }
 
-static void mainwin_reset_paned(GtkPaned *paned)
+void mainwindow_reset_paned(GtkPaned *paned)
 {
                gint min, max, mid;
+
+               if (gtk_paned_get_child1(GTK_PANED(paned)))
+                       gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
+               if (gtk_paned_get_child2(GTK_PANED(paned)))
+                       gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
+
+GTK_EVENTS_FLUSH();
                g_object_get (G_OBJECT(paned),
                                "min-position",
                                &min, NULL);
@@ -1895,10 +1933,37 @@ static void mainwin_reset_paned(GtkPaned *paned)
                                "max-position",
                                &max, NULL);
                mid = (min+max)/2;
-
                gtk_paned_set_position(GTK_PANED(paned), mid);
 }
 
+static void mainwin_paned_show_first(GtkPaned *paned)
+{
+               gint max;
+               g_object_get (G_OBJECT(paned),
+                               "max-position",
+                               &max, NULL);
+
+               if (gtk_paned_get_child1(GTK_PANED(paned)))
+                       gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
+               if (gtk_paned_get_child2(GTK_PANED(paned)))
+                       gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
+               gtk_paned_set_position(GTK_PANED(paned), max);
+}
+
+static void mainwin_paned_show_last(GtkPaned *paned)
+{
+               gint min;
+               g_object_get (G_OBJECT(paned),
+                               "min-position",
+                               &min, NULL);
+
+               if (gtk_paned_get_child1(GTK_PANED(paned)))
+                       gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
+               if (gtk_paned_get_child2(GTK_PANED(paned)))
+                       gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
+               gtk_paned_set_position(GTK_PANED(paned), min);
+}
+
 void main_window_toggle_message_view(MainWindow *mainwin)
 {
        SummaryView *summaryview = mainwin->summaryview;
@@ -1908,6 +1973,7 @@ void main_window_toggle_message_view(MainWindow *mainwin)
        switch (prefs_common.layout_mode) {
        case NORMAL_LAYOUT:
        case VERTICAL_LAYOUT:
+       case SMALL_LAYOUT:
                ppaned = mainwin->vpaned;
                container = mainwin->hpaned;
                if (ppaned->parent != NULL) {
@@ -2275,6 +2341,9 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/Tools/Delete duplicated messages/In selected folder"   , M_MSG_EXIST|M_ALLOW_DELETE},
 
                {"/Configuration", M_UNLOCKED},
+               {"/Configuration/Preferences for current account...", M_UNLOCKED},
+               {"/Configuration/Create new account...", M_UNLOCKED},
+               {"/Configuration/Edit accounts...", M_UNLOCKED},
 
                {NULL, 0}
        };
@@ -2585,6 +2654,13 @@ void main_window_popup(MainWindow *mainwin)
                main_window_show(mainwin);
 
        gtkut_window_popup(mainwin->window);
+       if (prefs_common.layout_mode == SMALL_LAYOUT) {
+               if (mainwin->in_folder) {
+                       mainwindow_enter_folder(mainwin);
+               } else {
+                       mainwindow_exit_folder(mainwin);
+               }
+       }
 }
 
 void main_window_show(MainWindow *mainwin)
@@ -2625,18 +2701,28 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
        GtkWidget *vbox_body = mainwin->vbox_body;
        GtkItemFactory *ifactory = mainwin->menu_factory;
        GtkWidget *menuitem;
-
+       gboolean first_set = (mainwin->hpaned == NULL);
        debug_print("Setting widgets... ");
 
-       gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
+       if (layout_mode == SMALL_LAYOUT && first_set) {
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
                                    prefs_common.folderview_width,
                                    prefs_common.folderview_height);
-       gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
+                                   0,0);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
+                                   0,0);
+       } else {
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
+                                   prefs_common.folderview_width,
+                                   prefs_common.folderview_height);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
                                    prefs_common.summaryview_width,
                                    prefs_common.summaryview_height);
-       gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
                                    prefs_common.msgview_width,
                                    prefs_common.msgview_height);
+       }
 
        mainwin->messageview->statusbar = mainwin->statusbar;
        mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
@@ -2649,10 +2735,12 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
                        gtk_widget_destroy(mainwin->hpaned);
        }
 
-       menu_set_sensitive(ifactory, "/View/Show or hide/Message view", (layout_mode != WIDE_MSGLIST_LAYOUT));
+       menu_set_sensitive(ifactory, "/View/Show or hide/Message view", 
+               (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
        switch (layout_mode) {
        case VERTICAL_LAYOUT:
        case NORMAL_LAYOUT:
+       case SMALL_LAYOUT:
                hpaned = gtk_hpaned_new();
                if (layout_mode == VERTICAL_LAYOUT)
                        vpaned = gtk_hpaned_new();
@@ -2676,6 +2764,9 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
                gtk_paned_add2(GTK_PANED(vpaned),
                               GTK_WIDGET_PTR(mainwin->messageview));
                gtk_widget_show(vpaned);
+               if (layout_mode == SMALL_LAYOUT && first_set) {
+                       mainwin_paned_show_first(GTK_PANED(hpaned));
+               }
                gtk_widget_queue_resize(vpaned);
                break;
        case WIDE_LAYOUT:
@@ -2733,6 +2824,28 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
        mainwin->hpaned = hpaned;
        mainwin->vpaned = vpaned;
 
+       if (layout_mode == SMALL_LAYOUT) {
+               if (mainwin->messageview->visible)
+                       main_window_toggle_message_view(mainwin);
+       } 
+
+       if (layout_mode == SMALL_LAYOUT && first_set) {
+               gtk_widget_realize(mainwin->window);
+               gtk_widget_realize(mainwin->folderview->ctree);
+               gtk_widget_realize(mainwin->summaryview->hbox);
+               gtk_widget_realize(mainwin->summaryview->hbox_l);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
+                                   prefs_common.folderview_width,
+                                   prefs_common.folderview_height);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
+                                   0,0);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
+                                   0,0);
+               gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
+                               prefs_common.mainwin_width,
+                               prefs_common.mainwin_height);
+               gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
+       } 
        /* remove headerview if not in prefs */
        headerview_set_visibility(mainwin->messageview->headerview,
                                  prefs_common.display_header_pane);
@@ -2789,6 +2902,9 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
        case WIDE_MSGLIST_LAYOUT:
                SET_CHECK_MENU_ACTIVE("/View/Layout/Wide message list", TRUE);
                break;
+       case SMALL_LAYOUT:
+               SET_CHECK_MENU_ACTIVE("/View/Layout/Small screen", TRUE);
+               break;
        }
 #undef SET_CHECK_MENU_ACTIVE
 
@@ -2880,7 +2996,6 @@ static void main_window_size_allocate_cb(GtkWidget *widget,
                                         gpointer data)
 {
        MainWindow *mainwin = (MainWindow *)data;
-
        main_window_get_size(mainwin);
 }
 
@@ -3038,7 +3153,7 @@ static void set_layout_cb(MainWindow *mainwin, guint action,
                               GtkWidget *widget)
 {
        LayoutType layout_mode = action;
-
+       LayoutType old_layout_mode = prefs_common.layout_mode;
        if (mainwin->menu_lock_count) {
                return;
        }
@@ -3050,13 +3165,22 @@ static void set_layout_cb(MainWindow *mainwin, guint action,
                return;
        }
        
-       if (!mainwin->messageview->visible)
+       if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
+               main_window_toggle_message_view(mainwin);
+       else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
                main_window_toggle_message_view(mainwin);
 
        main_window_separation_change(mainwin, layout_mode);
-
-       mainwin_reset_paned(GTK_PANED(mainwin->vpaned));
+       mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
+       if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
+               mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
+       }
+       if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
+               mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
+               mainwindow_exit_folder(mainwin);
+       }
        summary_relayout(mainwin->summaryview); 
+       summary_update_unread(mainwin->summaryview, NULL);
 }
 
 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
@@ -3157,6 +3281,12 @@ static void log_window_show_cb(MainWindow *mainwin, guint action,
        log_window_show(mainwin->logwin);
 }
 
+static void filtering_debug_window_show_cb(MainWindow *mainwin, guint action,
+                              GtkWidget *widget)
+{
+       log_window_show(mainwin->filtering_debugwin);
+}
+
 static void inc_cancel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
 {
        inc_cancel_all();
@@ -3856,6 +3986,15 @@ gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
                        folderview_select_next_unread(mainwin->folderview, TRUE);
                }
                break;
+#ifdef MAEMO
+       case GDK_F6:
+               if (maemo_mainwindow_is_fullscreen(widget)) {
+                       gtk_window_unfullscreen(GTK_WINDOW(widget));
+                } else {
+                       gtk_window_fullscreen(GTK_WINDOW(widget));
+                }
+               break;
+#endif
        default:
                break;
        }
@@ -4000,3 +4139,40 @@ void mainwindow_jump_to(const gchar *target)
        
        g_free(tmp);
 }
+
+void mainwindow_exit_folder(MainWindow *mainwin) {
+       if (prefs_common.layout_mode == SMALL_LAYOUT) {
+               folderview_close_opened(mainwin->folderview);
+               mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
+               mainwin->in_folder = FALSE;
+       }
+}
+
+void mainwindow_enter_folder(MainWindow *mainwin) {
+       if (prefs_common.layout_mode == SMALL_LAYOUT) {
+               mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
+               mainwin->in_folder = TRUE;
+       }
+}
+
+#ifdef MAEMO
+gboolean maemo_mainwindow_is_fullscreen(GtkWidget *widget)
+{
+       gint w, h;
+       gtk_window_get_size(GTK_WINDOW(widget), &w, &h); 
+       return (w == 800);
+}
+
+void maemo_window_full_screen_if_needed (GtkWindow *window)
+{
+       if (maemo_mainwindow_is_fullscreen(mainwindow_get_mainwindow()->window)) {
+               gtk_window_fullscreen(GTK_WINDOW(window));
+       }
+}
+
+void maemo_connect_key_press_to_mainwindow (GtkWindow *window)
+{
+       g_signal_connect(G_OBJECT(window), "key_press_event",
+                        G_CALLBACK(mainwindow_key_pressed), mainwindow_get_mainwindow());
+}
+#endif