diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-03-08 09:17:17 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-03-08 09:17:17 +0000 |
commit | 0ff75d10977146767ccc42c2e2915f75886a68bf (patch) | |
tree | d006e0d23948dfa1e66d7ccbe9e5746472c2e54e | |
parent | 15ecfbc6effda513ca18e81b419b0eaf02daa0d5 (diff) |
changed the implementation of switching Text/MIME view.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@154 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ChangeLog.ja | 6 | ||||
-rw-r--r-- | src/messageview.c | 99 | ||||
-rw-r--r-- | src/messageview.h | 6 | ||||
-rw-r--r-- | src/mimeview.c | 27 | ||||
-rw-r--r-- | src/mimeview.h | 5 | ||||
-rw-r--r-- | src/summaryview.c | 9 | ||||
-rw-r--r-- | src/textview.c | 1 |
8 files changed, 89 insertions, 70 deletions
@@ -1,5 +1,11 @@ 2005-03-08 + * src/messageview.[ch] + src/mimeview.[ch]: changed the implementation of switching + Text/MIME view (enables smooth switching). + +2005-03-08 + * src/textview.c: textview_make_clickable_parts(): optimized the URI search (fixes freeze at extremely long lines with many '@'). * src/gtkutils.[ch]: gtkut_text_buffer_insert_with_tag_by_name(): diff --git a/ChangeLog.ja b/ChangeLog.ja index 30acbb69..e54ee4ca 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,5 +1,11 @@ 2005-03-08 + * src/messageview.[ch] + src/mimeview.[ch]: テキスト/MIME ビュー切り替えの実装を変更 + (切り替えがスムーズになった)。 + +2005-03-08 + * src/textview.c: textview_make_clickable_parts(): URI 検索を最適化 (多数の '@' を持つ極端に長い行におけるフリーズを修正)。 * src/gtkutils.[ch]: gtkut_text_buffer_insert_with_tag_by_name(): diff --git a/src/messageview.c b/src/messageview.c index f6b40764..421f8d00 100644 --- a/src/messageview.c +++ b/src/messageview.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2004 Hiroyuki Yamamoto + * Copyright (C) 1999-2005 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +22,7 @@ #include <glib.h> #include <glib/gi18n.h> #include <gdk/gdkkeysyms.h> +#include <gtk/gtknotebook.h> #include <gtk/gtkvbox.h> #include <gtk/gtkcontainer.h> #include <gtk/gtkwindow.h> @@ -61,15 +62,19 @@ static GList *messageview_list = NULL; -static void messageview_change_view_type(MessageView *messageview, - MessageType type); -static void messageview_destroy_cb (GtkWidget *widget, - MessageView *messageview); -static void messageview_size_allocate_cb(GtkWidget *widget, - GtkAllocation *allocation); -static gboolean key_pressed (GtkWidget *widget, - GdkEventKey *event, - MessageView *messageview); +static void messageview_change_view_type(MessageView *messageview, + MessageType type); +static void messageview_destroy_cb (GtkWidget *widget, + MessageView *messageview); +static void messageview_size_allocate_cb(GtkWidget *widget, + GtkAllocation *allocation); +static void messageview_switch_page_cb (GtkNotebook *notebook, + GtkNotebookPage *page, + guint page_num, + MessageView *messageview); +static gboolean key_pressed (GtkWidget *widget, + GdkEventKey *event, + MessageView *messageview); static void save_as_cb (gpointer data, guint action, @@ -265,6 +270,7 @@ MessageView *messageview_create(void) { MessageView *messageview; GtkWidget *vbox; + GtkWidget *notebook; HeaderView *headerview; TextView *textview; MimeView *mimeview; @@ -286,23 +292,45 @@ MessageView *messageview_create(void) mimeview->imageview->messageview = messageview; mimeview->messageview = messageview; + notebook = gtk_notebook_new(); + gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE); + gtk_widget_show(notebook); + + gtk_container_add(GTK_CONTAINER(notebook), GTK_WIDGET_PTR(textview)); + gtk_notebook_set_tab_label_text + (GTK_NOTEBOOK(notebook), GTK_WIDGET_PTR(textview), _("Text")); + + gtk_container_add(GTK_CONTAINER(notebook), GTK_WIDGET_PTR(mimeview)); + gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(notebook), + GTK_WIDGET_PTR(mimeview), + _("Attachments")); + + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0); + gtk_widget_show_all(notebook); + vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(headerview), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(textview), - TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); gtk_widget_show(vbox); /* to remove without destroyed */ - gtk_widget_ref(GTK_WIDGET_PTR(textview)); - gtk_widget_ref(GTK_WIDGET_PTR(mimeview)); gtk_widget_ref(GTK_WIDGET_PTR(mimeview->textview)); gtk_widget_ref(GTK_WIDGET_PTR(mimeview->imageview)); + g_signal_connect(G_OBJECT(notebook), "switch_page", + G_CALLBACK(messageview_switch_page_cb), messageview); + messageview->vbox = vbox; + messageview->notebook = notebook; + messageview->new_window = FALSE; messageview->window = NULL; messageview->window_vbox = NULL; + messageview->body_vbox = NULL; + messageview->headerview = headerview; messageview->textview = textview; messageview->mimeview = mimeview; @@ -310,6 +338,8 @@ MessageView *messageview_create(void) messageview->statusbar = NULL; messageview->statusbar_cid = 0; + messageview->current_page = 0; + return messageview; } @@ -452,31 +482,21 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo, static void messageview_change_view_type(MessageView *messageview, MessageType type) { - TextView *textview = messageview->textview; - MimeView *mimeview = messageview->mimeview; + GtkWidget *notebook = messageview->notebook; if (messageview->type == type) return; if (type == MVIEW_MIME) { - gtkut_container_remove - (GTK_CONTAINER(GTK_WIDGET_PTR(messageview)), - GTK_WIDGET_PTR(textview)); - gtk_box_pack_start(GTK_BOX(messageview->vbox), - GTK_WIDGET_PTR(mimeview), TRUE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(mimeview->vbox), - GTK_WIDGET_PTR(textview)); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE); + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), + messageview->current_page); } else if (type == MVIEW_TEXT) { - gtkut_container_remove - (GTK_CONTAINER(GTK_WIDGET_PTR(messageview)), - GTK_WIDGET_PTR(mimeview)); - mimeview_clear(mimeview); - - if (mimeview->vbox == GTK_WIDGET_PTR(textview)->parent) - gtkut_container_remove(GTK_CONTAINER(mimeview->vbox), - GTK_WIDGET_PTR(textview)); + gint current_page = messageview->current_page; - gtk_box_pack_start(GTK_BOX(messageview->vbox), - GTK_WIDGET_PTR(textview), TRUE, TRUE, 0); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0); + messageview->current_page = current_page; + mimeview_clear(messageview->mimeview); } else return; @@ -495,9 +515,8 @@ void messageview_clear(MessageView *messageview) void messageview_destroy(MessageView *messageview) { - GtkWidget *textview = GTK_WIDGET_PTR(messageview->textview); + GtkWidget *textview = GTK_WIDGET_PTR(messageview->mimeview->textview); GtkWidget *imageview = GTK_WIDGET_PTR(messageview->mimeview->imageview); - GtkWidget *mimeview = GTK_WIDGET_PTR(messageview->mimeview); messageview_list = g_list_remove(messageview_list, messageview); @@ -511,7 +530,6 @@ void messageview_destroy(MessageView *messageview) gtk_widget_unref(textview); gtk_widget_unref(imageview); - gtk_widget_unref(mimeview); } void messageview_quote_color_set(void) @@ -531,7 +549,7 @@ TextView *messageview_get_current_textview(MessageView *messageview) text = messageview->textview; else if (messageview->type == MVIEW_MIME) { if (gtk_notebook_get_current_page - (GTK_NOTEBOOK(messageview->mimeview->notebook)) == 0) + (GTK_NOTEBOOK(messageview->notebook)) == 0) text = messageview->textview; else if (messageview->mimeview->type == MIMEVIEW_TEXT) text = messageview->mimeview->textview; @@ -647,6 +665,13 @@ static void messageview_size_allocate_cb(GtkWidget *widget, prefs_common.msgwin_height = allocation->height; } +static void messageview_switch_page_cb(GtkNotebook *notebook, + GtkNotebookPage *page, guint page_num, + MessageView *messageview) +{ + messageview->current_page = page_num; +} + static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, MessageView *messageview) { diff --git a/src/messageview.h b/src/messageview.h index 99c71631..150260ca 100644 --- a/src/messageview.h +++ b/src/messageview.h @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2004 Hiroyuki Yamamoto + * Copyright (C) 1999-2005 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -42,7 +42,10 @@ struct _MessageView { GtkWidget *vbox; + GtkWidget *notebook; + MessageType type; + gboolean new_window; GtkWidget *window; GtkWidget *window_vbox; @@ -62,6 +65,7 @@ struct _MessageView gchar *forced_charset; gboolean visible; + gint current_page; }; MessageView *messageview_create (void); diff --git a/src/mimeview.c b/src/mimeview.c index 1d39448e..124de6f8 100644 --- a/src/mimeview.c +++ b/src/mimeview.c @@ -26,7 +26,6 @@ #include <glib.h> #include <glib/gi18n.h> #include <gdk/gdkkeysyms.h> -#include <gtk/gtknotebook.h> #include <gtk/gtkscrolledwindow.h> #include <gtk/gtkctree.h> #include <gtk/gtkvbox.h> @@ -134,8 +133,6 @@ MimeView *mimeview_create(void) { MimeView *mimeview; - GtkWidget *notebook; - GtkWidget *vbox; GtkWidget *paned; GtkWidget *scrolledwin; GtkWidget *ctree; @@ -153,14 +150,6 @@ MimeView *mimeview_create(void) titles[COL_SIZE] = _("Size"); titles[COL_NAME] = _("Name"); - notebook = gtk_notebook_new(); - gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(notebook), vbox); - gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(notebook), vbox, - _("Text")); - scrolledwin = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), GTK_POLICY_AUTOMATIC, @@ -196,21 +185,12 @@ MimeView *mimeview_create(void) paned = gtk_vpaned_new(); gtk_paned_add1(GTK_PANED(paned), scrolledwin); gtk_paned_add2(GTK_PANED(paned), mime_vbox); - gtk_container_add(GTK_CONTAINER(notebook), paned); - gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(notebook), paned, - _("Attachments")); - - gtk_widget_show_all(notebook); - - gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0); n_entries = sizeof(mimeview_popup_entries) / sizeof(mimeview_popup_entries[0]); popupmenu = menu_create_items(mimeview_popup_entries, n_entries, "<MimeView>", &popupfactory, mimeview); - mimeview->notebook = notebook; - mimeview->vbox = vbox; mimeview->paned = paned; mimeview->scrolledwin = scrolledwin; mimeview->ctree = ctree; @@ -336,7 +316,8 @@ void mimeview_show_message(MimeView *mimeview, MimeInfo *mimeinfo, if (node) { gtk_ctree_select(ctree, node); gtkut_ctree_set_focus_row(ctree, node); - gtk_widget_grab_focus(mimeview->ctree); + if (mimeview_get_selected_part(mimeview)) + gtk_widget_grab_focus(mimeview->ctree); } } @@ -355,8 +336,6 @@ void mimeview_clear(MimeView *mimeview) g_free(mimeview->file); mimeview->file = NULL; - - /* gtk_notebook_set_page(GTK_NOTEBOOK(mimeview->notebook), 0); */ } void mimeview_destroy(MimeView *mimeview) @@ -371,7 +350,7 @@ void mimeview_destroy(MimeView *mimeview) MimeInfo *mimeview_get_selected_part(MimeView *mimeview) { if (gtk_notebook_get_current_page - (GTK_NOTEBOOK(mimeview->notebook)) == 0) + (GTK_NOTEBOOK(mimeview->messageview->notebook)) == 0) return NULL; return gtk_ctree_node_get_row_data diff --git a/src/mimeview.h b/src/mimeview.h index 8701462d..7170243e 100644 --- a/src/mimeview.h +++ b/src/mimeview.h @@ -40,12 +40,11 @@ typedef enum struct _MimeView { - GtkWidget *notebook; - GtkWidget *vbox; - GtkWidget *paned; + GtkWidget *scrolledwin; GtkWidget *ctree; + GtkWidget *mime_vbox; MimeViewType type; diff --git a/src/summaryview.c b/src/summaryview.c index 36dbe9ee..f0c4ef43 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -1936,16 +1936,17 @@ static void summary_display_msg_full(SummaryView *summaryview, msgview = summaryview->messageview; summaryview->displayed = row; - if (!messageview_is_visible(msgview)) + if (!messageview_is_visible(msgview)) { main_window_toggle_message_view(summaryview->mainwin); + GTK_EVENTS_FLUSH(); + } val = messageview_show(msgview, msginfo, all_headers); if (msgview->type == MVIEW_TEXT || (msgview->type == MVIEW_MIME && (GTK_CLIST(msgview->mimeview->ctree)->row_list == NULL || gtk_notebook_get_current_page - (GTK_NOTEBOOK(msgview->mimeview->notebook)) == 0))) + (GTK_NOTEBOOK(msgview->notebook)) == 0))) gtk_widget_grab_focus(summaryview->ctree); - GTK_EVENTS_FLUSH(); gtkut_ctree_node_move_if_on_the_edge(ctree, row); } @@ -3819,7 +3820,7 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event, messageview = summaryview->messageview; if (messageview->type == MVIEW_MIME && gtk_notebook_get_current_page - (GTK_NOTEBOOK(messageview->mimeview->notebook)) == 1) + (GTK_NOTEBOOK(messageview->notebook)) == 1) textview = messageview->mimeview->textview; else textview = messageview->textview; diff --git a/src/textview.c b/src/textview.c index 456ad883..81142690 100644 --- a/src/textview.c +++ b/src/textview.c @@ -1070,7 +1070,6 @@ void textview_clear(TextView *textview) textview->uri_list = NULL; textview->body_pos = 0; - //textview->cur_pos = 0; } void textview_destroy(TextView *textview) |