diff options
-rw-r--r-- | mail/ChangeLog | 29 | ||||
-rw-r--r-- | mail/mail-callbacks.c | 2 | ||||
-rw-r--r-- | mail/subscribe-dialog.c | 112 | ||||
-rw-r--r-- | mail/subscribe-dialog.glade | 148 |
4 files changed, 208 insertions, 83 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 077a9475ce..3e2a731d0d 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,32 @@ +2002-08-09 Peter Williams <peterw@ximian.com> + + * subscribe-dialog.c: Change this into a GnomeApp so we get a + statusbar and the dialog is a little more comprehensible. + + * subscribe-dialog.c: (struct _FolderETree): Add members for + tracking activity callback information. + (get_short_folderinfo_got): Notify the activity callback. + (subscribe_get_short_folderinfo): Here too. + (folder_etree_init): Initialize the activity level to 0. + (folder_etree_construct): Take new parameters of our activity + callback and user_data. + (folder_etree_new): Here too. + (store_data_get_widget): Take the parameters here and pass them + on. + (sc_close_pressed): New callback for when close button is pressed. + (sc_activity_timeout): New timeout to move the activity bar when + folders are being scanned. + (sc_activity_cb): If activity_level > 0, start the progressbar + moving and set the status. + (menu_item_selected): Pass the callback to store_data_get_widget. + (subscribe_dialog_construct): Load some more widgets and adapt to + some changes in the XML. Also connect the close button signal and + initialize the progress bar's settings. + + * mail-callbacks.c (manage_subscriptions): Don't call + gnome_dialog_set_close on it anymore since it's no longer a gnome + dialog. + 2002-08-14 Dan Winship <danw@ximian.com> * mail-config.glade: Add a "don't sign meeting requests" option to diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 52c778739e..d953676ff9 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -3276,8 +3276,6 @@ manage_subscriptions (BonoboUIComponent *uih, void *user_data, const char *path) gtk_signal_connect (GTK_OBJECT (SUBSCRIBE_DIALOG (subscribe_dialog)->app), "destroy", subscribe_dialog_destroy, NULL); - gnome_dialog_set_close (GNOME_DIALOG (SUBSCRIBE_DIALOG (subscribe_dialog)->app), TRUE); - subscribe_dialog_show (subscribe_dialog); } else { gdk_window_raise (SUBSCRIBE_DIALOG (subscribe_dialog)->app->window); diff --git a/mail/subscribe-dialog.c b/mail/subscribe-dialog.c index e9c42855c0..7669833e7f 100644 --- a/mail/subscribe-dialog.c +++ b/mail/subscribe-dialog.c @@ -26,6 +26,9 @@ #include <config.h> #endif +#include <libgnomeui/gnome-app.h> +#include <libgnomeui/gnome-appbar.h> + #include <gal/util/e-util.h> #include <gal/widgets/e-unicode.h> @@ -124,6 +127,8 @@ typedef struct _FolderETree FolderETree; typedef struct _FolderETreeClass FolderETreeClass; +typedef void (*FolderETreeActivityCallback) (int level, gpointer user_data); + struct _FolderETree { ETreeMemory parent; ETreePath root; @@ -135,6 +140,10 @@ struct _FolderETree { EvolutionStorage *e_storage; char *service_name; char *search; + + FolderETreeActivityCallback activity_cb; + gpointer activity_data; + int activity_level; }; struct _FolderETreeClass { @@ -242,6 +251,9 @@ get_short_folderinfo_got (struct _mail_msg *mm) camel_service_get_url (CAMEL_SERVICE (m->ftree->store)), camel_exception_get_description (&mm->ex)); + m->ftree->activity_level--; + (m->ftree->activity_cb) (m->ftree->activity_level, m->ftree->activity_data); + /* 'done' is probably guaranteed to fail, but... */ if (m->func) @@ -288,6 +300,9 @@ subscribe_get_short_folderinfo (FolderETree *ftree, m->func = func; m->user_data = user_data; + ftree->activity_level++; + (ftree->activity_cb) (ftree->activity_level, ftree->activity_data); + id = m->msg.seq; e_thread_put (mail_thread_queued, (EMsg *)m); return id; @@ -935,11 +950,15 @@ folder_etree_init (GtkObject *object) ftree->subscribe_ops = g_hash_table_new (g_direct_hash, g_direct_equal); ftree->search = g_strdup (""); + + ftree->activity_level = 0; } static FolderETree * folder_etree_construct (FolderETree *ftree, - CamelStore *store) + CamelStore *store, + FolderETreeActivityCallback activity_cb, + gpointer activity_data) { e_tree_memory_construct (E_TREE_MEMORY (ftree)); @@ -950,6 +969,9 @@ folder_etree_construct (FolderETree *ftree, ftree->e_storage = mail_lookup_storage (store); /* this gives us a ref */ + ftree->activity_cb = activity_cb; + ftree->activity_data = activity_data; + fe_create_root_node (ftree); return ftree; @@ -961,12 +983,14 @@ E_MAKE_TYPE (folder_etree, "FolderETree", FolderETree, folder_etree_class_init, /* public */ static FolderETree * -folder_etree_new (CamelStore *store) +folder_etree_new (CamelStore *store, + FolderETreeActivityCallback activity_cb, + gpointer activity_data) { FolderETree *ftree; ftree = gtk_type_new (folder_etree_get_type()); - ftree = folder_etree_construct (ftree, store); + ftree = folder_etree_construct (ftree, store, activity_cb, activity_data); return ftree; } @@ -1169,7 +1193,9 @@ sd_toggle_cb (ETree *tree, int row, ETreePath path, int col, GdkEvent *event, gp } static GtkWidget * -store_data_get_widget (StoreData *sd) +store_data_get_widget (StoreData *sd, + FolderETreeActivityCallback activity_cb, + gpointer activity_data) { GtkWidget *tree; @@ -1181,7 +1207,7 @@ store_data_get_widget (StoreData *sd) if (sd->widget) return sd->widget; - sd->ftree = folder_etree_new (sd->store); + sd->ftree = folder_etree_new (sd->store, activity_cb, activity_data); /* You annoy me, etree! */ tree = gtk_widget_new (E_TREE_SCROLLED_TYPE, @@ -1292,7 +1318,11 @@ struct _SubscribeDialogPrivate { GtkWidget *search_entry; GtkWidget *hbox; GtkWidget *filter_radio, *all_radio; - GtkWidget *sub_button, *unsub_button, *refresh_button; + GtkWidget *sub_button, *unsub_button, *refresh_button, *close_button; + GtkWidget *progress; + GtkWidget *appbar; + + guint activity_timeout_id; }; static GtkObjectClass *subscribe_dialog_parent_class; @@ -1321,6 +1351,14 @@ sc_search_activated (GtkWidget *widget, gpointer user_data) } static void +sc_close_pressed (GtkWidget *widget, gpointer user_data) +{ + SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); + + gtk_widget_destroy (GTK_WIDGET (sc->app)); +} + +static void sc_subscribe_pressed (GtkWidget *widget, gpointer user_data) { SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); @@ -1416,6 +1454,43 @@ sc_selection_changed (GtkObject *obj, gpointer user_data) gtk_widget_set_sensitive (sc->priv->unsub_button, sensitive); } +static gint +sc_activity_timeout (SubscribeDialog *sc) +{ + GtkAdjustment *adj; + gfloat next; + + adj = GTK_PROGRESS (sc->priv->progress)->adjustment; + next = adj->value + 1; + if (next > adj->upper) + next = adj->lower; + + gtk_progress_set_value (GTK_PROGRESS (sc->priv->progress), next); + return TRUE; +} + +static void +sc_activity_cb (int level, SubscribeDialog *sc) +{ + g_assert (pthread_self() == mail_gui_thread); + + if (level) { + if (sc->priv->activity_timeout_id) + return; + + sc->priv->activity_timeout_id = gtk_timeout_add (50, (GtkFunction) + sc_activity_timeout, sc); + gnome_appbar_set_status (GNOME_APPBAR (sc->priv->appbar), _("Scanning folders...")); + } else { + if (sc->priv->activity_timeout_id) { + gtk_timeout_remove (sc->priv->activity_timeout_id); + sc->priv->activity_timeout_id = 0; + } + + gnome_appbar_set_status (GNOME_APPBAR (sc->priv->appbar), ""); + } +} + static void menu_item_selected (GtkMenuItem *item, gpointer user_data) { @@ -1429,7 +1504,7 @@ menu_item_selected (GtkMenuItem *item, gpointer user_data) ESelectionModel *esm; ETree *tree; - widget = store_data_get_widget (sd); + widget = store_data_get_widget (sd, (FolderETreeActivityCallback) sc_activity_cb, sc); gtk_box_pack_start (GTK_BOX (sc->priv->hbox), widget, TRUE, TRUE, 0); tree = e_tree_scrolled_get_tree (E_TREE_SCROLLED (widget)); @@ -1530,7 +1605,10 @@ subscribe_dialog_destroy (GtkObject *object) GList *iter; sc = SUBSCRIBE_DIALOG (object); - + + if (sc->priv->activity_timeout_id) + gtk_timeout_remove (sc->priv->activity_timeout_id); + for (iter = sc->priv->store_list; iter; iter = iter->next) { StoreData *data = iter->data; @@ -1589,17 +1667,21 @@ subscribe_dialog_construct (GtkObject *object) SubscribeDialog *sc = SUBSCRIBE_DIALOG (object); /* Load the XML */ - sc->priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/subscribe-dialog.glade", NULL); + /* "app2" */ + sc->priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/subscribe-dialog.glade", "app"); - sc->app = glade_xml_get_widget (sc->priv->xml, "Manage Subscriptions"); + sc->app = glade_xml_get_widget (sc->priv->xml, "app"); sc->priv->hbox = glade_xml_get_widget (sc->priv->xml, "tree_box"); sc->priv->search_entry = glade_xml_get_widget (sc->priv->xml, "search_entry"); sc->priv->filter_radio = glade_xml_get_widget (sc->priv->xml, "filter_radio"); sc->priv->all_radio = glade_xml_get_widget (sc->priv->xml, "all_radio"); + sc->priv->close_button = glade_xml_get_widget (sc->priv->xml, "close_button"); sc->priv->sub_button = glade_xml_get_widget (sc->priv->xml, "subscribe_button"); sc->priv->unsub_button = glade_xml_get_widget (sc->priv->xml, "unsubscribe_button"); sc->priv->refresh_button = glade_xml_get_widget (sc->priv->xml, "refresh_button"); - + sc->priv->appbar = GNOME_APP (sc->app)->statusbar; + sc->priv->progress = GTK_WIDGET (gnome_appbar_get_progress (GNOME_APPBAR (sc->priv->appbar))); + /* create default view */ sc->priv->default_widget = sc_create_default_widget(); sc->priv->current_widget = sc->priv->default_widget; @@ -1615,12 +1697,18 @@ subscribe_dialog_construct (GtkObject *object) /* hook up some signals */ gtk_signal_connect (GTK_OBJECT (sc->priv->search_entry), "activate", sc_search_activated, sc); + gtk_signal_connect (GTK_OBJECT (sc->priv->close_button), "clicked", sc_close_pressed, sc); gtk_signal_connect (GTK_OBJECT (sc->priv->sub_button), "clicked", sc_subscribe_pressed, sc); gtk_signal_connect (GTK_OBJECT (sc->priv->unsub_button), "clicked", sc_unsubscribe_pressed, sc); gtk_signal_connect (GTK_OBJECT (sc->priv->refresh_button), "clicked", sc_refresh_pressed, sc); gtk_signal_connect (GTK_OBJECT (sc->priv->all_radio), "toggled", sc_all_toggled, sc); gtk_signal_connect (GTK_OBJECT (sc->priv->filter_radio), "toggled", sc_filter_toggled, sc); - + + /* progress */ + gtk_progress_set_activity_mode (GTK_PROGRESS (sc->priv->progress), 1); + gtk_progress_bar_set_activity_step (GTK_PROGRESS_BAR (sc->priv->progress), 5); + gtk_progress_bar_set_activity_blocks (GTK_PROGRESS_BAR (sc->priv->progress), 10); + /* Get the list of stores */ populate_store_list (sc); } diff --git a/mail/subscribe-dialog.glade b/mail/subscribe-dialog.glade index 472491b3e8..1970844367 100644 --- a/mail/subscribe-dialog.glade +++ b/mail/subscribe-dialog.glade @@ -14,73 +14,89 @@ </project> <widget> - <class>GnomeDialog</class> - <name>Manage Subscriptions</name> + <class>GnomeApp</class> + <name>app</name> <title>Manage Subscriptions</title> <type>GTK_WINDOW_TOPLEVEL</type> <position>GTK_WIN_POS_NONE</position> <modal>False</modal> - <default_width>484</default_width> - <default_height>423</default_height> <allow_shrink>False</allow_shrink> <allow_grow>True</allow_grow> <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> + <enable_layout_config>True</enable_layout_config> <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox2</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> + <class>GnomeDock</class> + <child_name>GnomeApp:dock</child_name> + <name>dock2</name> + <border_width>3</border_width> + <allow_floating>True</allow_floating> <child> - <padding>4</padding> + <padding>0</padding> <expand>True</expand> <fill>True</fill> </child> <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area2</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> + <class>GnomeDockItem</class> + <name>dockitem2</name> + <border_width>1</border_width> + <placement>GNOME_DOCK_TOP</placement> + <band>1</band> + <position>0</position> + <offset>0</offset> + <locked>False</locked> + <exclusive>True</exclusive> + <never_floating>False</never_floating> + <never_vertical>False</never_vertical> + <never_horizontal>False</never_horizontal> + <shadow_type>GTK_SHADOW_OUT</shadow_type> <widget> - <class>GtkButton</class> - <name>button9</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button> + <class>GtkToolbar</class> + <name>toolbar1</name> + <border_width>1</border_width> + <orientation>GTK_ORIENTATION_HORIZONTAL</orientation> + <type>GTK_TOOLBAR_BOTH</type> + <space_size>16</space_size> + <space_style>GTK_TOOLBAR_SPACE_LINE</space_style> + <relief>GTK_RELIEF_NONE</relief> + <tooltips>True</tooltips> + + <widget> + <class>GtkButton</class> + <child_name>Toolbar:button</child_name> + <name>refresh_button</name> + <tooltip>Apri file</tooltip> + <label>Refresh List</label> + <stock_pixmap>GNOME_STOCK_PIXMAP_REFRESH</stock_pixmap> + </widget> + + <widget> + <class>GtkButton</class> + <child_name>Toolbar:button</child_name> + <name>close_button</name> + <tooltip>Salve file</tooltip> + <label>Close</label> + <stock_pixmap>GNOME_STOCK_PIXMAP_CLOSE</stock_pixmap> + <child> + <new_group>True</new_group> + </child> + </widget> </widget> </widget> <widget> <class>GtkVBox</class> - <name>vbox2</name> + <child_name>GnomeDock:contents</child_name> + <name>vbox6</name> <border_width>3</border_width> <homogeneous>False</homogeneous> <spacing>3</spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> <widget> <class>GtkHBox</class> - <name>hbox1</name> + <name>hbox7</name> <homogeneous>False</homogeneous> <spacing>0</spacing> <child> @@ -91,15 +107,15 @@ <widget> <class>GtkLabel</class> - <name>label1</name> - <label>Show _folders from server: </label> + <name>label5</name> + <label>S_elect server: </label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>store_menu</default_focus_target> + <default_focus_target>optionmenu2</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -138,7 +154,7 @@ <widget> <class>GtkVBox</class> - <name>vbox3</name> + <name>vbox7</name> <border_width>3</border_width> <homogeneous>False</homogeneous> <spacing>3</spacing> @@ -151,7 +167,7 @@ <widget> <class>GtkLabel</class> - <name>label2</name> + <name>label6</name> <label> </label> <justify>GTK_JUSTIFY_CENTER</justify> @@ -169,7 +185,7 @@ <widget> <class>GtkVButtonBox</class> - <name>vbuttonbox2</name> + <name>vbuttonbox6</name> <layout_style>GTK_BUTTONBOX_SPREAD</layout_style> <spacing>0</spacing> <child_min_width>85</child_min_width> @@ -202,18 +218,8 @@ </widget> <widget> - <class>GtkHSeparator</class> - <name>hseparator1</name> - <child> - <padding>14</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> <class>GtkVButtonBox</class> - <name>vbuttonbox3</name> + <name>vbuttonbox7</name> <layout_style>GTK_BUTTONBOX_START</layout_style> <spacing>10</spacing> <child_min_width>85</child_min_width> @@ -225,23 +231,14 @@ <expand>False</expand> <fill>False</fill> </child> - - <widget> - <class>GtkButton</class> - <name>refresh_button</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label> _Refresh List </label> - <relief>GTK_RELIEF_NORMAL</relief> - </widget> </widget> </widget> </widget> <widget> <class>GtkFrame</class> - <name>frame1</name> - <label>Display options</label> + <name>frame3</name> + <label>Display Options</label> <label_xalign>0</label_xalign> <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> <child> @@ -252,7 +249,7 @@ <widget> <class>GtkHBox</class> - <name>hbox3</name> + <name>hbox9</name> <border_width>3</border_width> <homogeneous>False</homogeneous> <spacing>3</spacing> @@ -304,7 +301,7 @@ <widget> <class>GtkHButtonBox</class> - <name>hbuttonbox1</name> + <name>hbuttonbox3</name> <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style> <spacing>30</spacing> <child_min_width>85</child_min_width> @@ -321,6 +318,19 @@ </widget> </widget> </widget> + + <widget> + <class>GnomeAppBar</class> + <child_name>GnomeApp:appbar</child_name> + <name>appbar2</name> + <has_progress>True</has_progress> + <has_status>True</has_status> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> </widget> </GTK-Interface> |