From c1b5780b8a6b033d800fc96deb87012631049090 Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Fri, 10 May 2002 16:54:23 +0000 Subject: Added some tests for the custom storage. * evolution-test-component.c: Added some tests for the custom storage. * evolution-storage.c: New signal DISCOVER_SHARED_FOLDER. (impl_Storage_asyncXferFolder): Renamed from impl_Storage_async_xfer_folder. (impl_Storage_asyncRemoveFolder): Renamed from impl_Storage_async_remove_folder. (impl_Storage_asyncCreateFolder): Renamed from impl_Storage_async_create_folder. (impl_Storage_asyncOpenFolder): Renamed from impl_storage_async_open_folder. (impl_Storage_addListener): Renamed from impl_Storage_add_listener. (impl_Storage_removeListener): Renamed from impl_Storage_remove_listener. (impl_Storage_asyncDiscoverSharedFolder): New, implementation for ::asyncDiscoverSharedFolder. (evolution_storage_get_epv): Install the CORBA method here. (class_init): Set up the "discover_shared_folder" signal here. (e_marshal_NONE__POINTER_POINTER): Yet Another Marshaller. Die die die. * Evolution-Storage.idl (Storage::asyncDiscoverSharedFolder): New method. (StorageListener::notifySharedFolderDiscovered): New method. * e-shell-view-menu.c (command_open_other_users_folder): New, implementation for the FileOpenOtherUsersFolder verb. * Makefile.am: Generate stubs and skels for Evolution::Addressbook::SelectNames as well. * glade/e-shell-shared-folder-picker-dialog.glade: New. svn path=/trunk/; revision=16746 --- shell/ChangeLog | 40 +++ shell/Evolution-Storage.idl | 21 ++ shell/Makefile.am | 29 +- shell/e-shell-view-menu.c | 19 ++ shell/evolution-storage-listener.h | 6 + shell/evolution-storage.c | 104 ++++--- shell/evolution-storage.h | 5 + shell/evolution-test-component.c | 84 +++++- shell/glade/Makefile.am | 11 +- .../e-shell-shared-folder-picker-dialog.glade | 301 +++++++++++++++++++++ 10 files changed, 571 insertions(+), 49 deletions(-) create mode 100644 shell/glade/e-shell-shared-folder-picker-dialog.glade diff --git a/shell/ChangeLog b/shell/ChangeLog index b6f2efee9d..e306621303 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,43 @@ +2002-05-10 Ettore Perazzoli + + * evolution-test-component.c: Added some tests for the custom + storage. + + * evolution-storage.c: New signal DISCOVER_SHARED_FOLDER. + (impl_Storage_asyncXferFolder): Renamed from + impl_Storage_async_xfer_folder. + (impl_Storage_asyncRemoveFolder): Renamed from + impl_Storage_async_remove_folder. + (impl_Storage_asyncCreateFolder): Renamed from + impl_Storage_async_create_folder. + (impl_Storage_asyncOpenFolder): Renamed from + impl_storage_async_open_folder. + (impl_Storage_addListener): Renamed from + impl_Storage_add_listener. + (impl_Storage_removeListener): Renamed from + impl_Storage_remove_listener. + (impl_Storage_asyncDiscoverSharedFolder): New, implementation for + ::asyncDiscoverSharedFolder. + (evolution_storage_get_epv): Install the CORBA method here. + (class_init): Set up the "discover_shared_folder" signal here. + (e_marshal_NONE__POINTER_POINTER): Yet Another Marshaller. Die + die die. + + * Evolution-Storage.idl (Storage::asyncDiscoverSharedFolder): New + method. + (StorageListener::notifySharedFolderDiscovered): New method. + + * e-shell-shared-folder-picker-dialog.c: New. + * e-shell-shared-folder-picker-dialog.h: New. + + * e-shell-view-menu.c (command_open_other_users_folder): New, + implementation for the FileOpenOtherUsersFolder verb. + + * Makefile.am: Generate stubs and skels for + Evolution::Addressbook::SelectNames as well. + + * glade/e-shell-shared-folder-picker-dialog.glade: New. + 2002-05-09 Ettore Perazzoli * e-local-storage.c (construct): Pass %FALSE as diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl index be6eaafcab..3660e3d74d 100644 --- a/shell/Evolution-Storage.idl +++ b/shell/Evolution-Storage.idl @@ -37,6 +37,13 @@ module Evolution { string path; }; + struct DiscoverSharedFolderResult { + Result result; + string storagePath; + string physicalURI; + string type; + }; + /* The name of the storage. */ readonly attribute string name; @@ -46,6 +53,8 @@ module Evolution { /* Flat list of the folders in the storage. */ readonly attribute FolderList folderList; + /* Folder Operations. */ + void asyncCreateFolder (in string path, in string type, in string description, @@ -61,11 +70,23 @@ module Evolution { in boolean remove_source, in Bonobo::Listener listener); + /* Open remote nodes. */ + void asyncOpenFolder (in string path); + /* Set unread count. */ + void updateFolder (in string path, in long unread_count); + /* Shared folders. */ + + void asyncDiscoverSharedFolder (in string user, + in string folder_name, + in Bonobo::Listener listener); + + /* Listener handling. */ + void addListener (in StorageListener listener) raises (AlreadyListening); diff --git a/shell/Makefile.am b/shell/Makefile.am index ea885f7233..c86fff6633 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -13,7 +13,7 @@ INCLUDES = -O \ -DG_LOG_DOMAIN=\"evolution-shell\" \ $(SHELL_CFLAGS) -# CORBA stuff +# Shell CORBA stuff IDLS = \ Evolution-Activity.idl \ @@ -43,6 +43,21 @@ $(IDL_GENERATED): $(IDLS) $(ORBIT_IDL) -I $(srcdir) -I $(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \ $(srcdir)/Evolution.idl +# SelectNames CORBA stuff + +SELECT_NAMES_IDL = \ + $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl + +SELECT_NAMES_IDL_GENERATED = \ + Evolution-Addressbook-SelectNames.h \ + Evolution-Addressbook-SelectNames-common.c \ + Evolution-Addressbook-SelectNames-skels.c \ + Evolution-Addressbook-SelectNames-stubs.c + +$(SELECT_NAMES_IDL_GENERATED): $(SELECT_NAMES_IDL) + $(ORBIT_IDL) -I $(srcdir) -I $(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \ + $(SELECT_NAMES_IDL) + # IDL install idldir = $(datadir)/idl @@ -102,6 +117,7 @@ libeshell_la_SOURCES = \ bin_PROGRAMS = evolution evolution_SOURCES = \ + $(SELECT_NAMES_IDL_GENERATED) \ e-activity-handler.c \ e-activity-handler.h \ e-component-info.c \ @@ -151,6 +167,8 @@ evolution_SOURCES = \ e-shell-offline-handler.h \ e-shell-settings-dialog.c \ e-shell-settings-dialog.h \ + e-shell-shared-folder-picker-dialog.c \ + e-shell-shared-folder-picker-dialog.h \ e-shell-startup-wizard.c \ e-shell-startup-wizard.h \ e-shell-user-creatable-items-handler.c \ @@ -223,7 +241,10 @@ oaf_in_files = GNOME_Evolution_Shell.oaf.in oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) etspecdir = $(datadir)/evolution/etspec/ -etspec_DATA = e-storage-set-view.etspec e-storage-set-view-checkboxes.etstate e-storage-set-view-no-checkboxes.etstate +etspec_DATA = \ + e-storage-set-view.etspec \ + e-storage-set-view-checkboxes.etstate \ + e-storage-set-view-no-checkboxes.etstate @XML_I18N_MERGE_OAF_RULE@ @@ -248,8 +269,8 @@ evolution.pure: evolution endif -CLEANFILES = $(IDL_GENERATED) -BUILT_SOURCES = $(IDL_GENERATED) +CLEANFILES = $(IDL_GENERATED) $(SELECT_NAMES_IDL_GENERATED) +BUILT_SOURCES = $(IDL_GENERATED) $(SELECT_NAMES_IDL_GENERATED) dist-hook: cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/shell/e-shell-view-menu.c b/shell/e-shell-view-menu.c index 5869048abf..eff7aa0817 100644 --- a/shell/e-shell-view-menu.c +++ b/shell/e-shell-view-menu.c @@ -30,6 +30,7 @@ #include "e-shell-view-menu.h" +#include "e-shell-shared-folder-picker-dialog.h" #include "e-shell-folder-creation-dialog.h" #include "e-shell-folder-selection-dialog.h" @@ -398,6 +399,23 @@ command_add_folder_to_shortcut_bar (BonoboUIComponent *uih, get_path_for_folder_op (shell_view)); } + +/* Opening other users' folders. */ + +static void +command_open_other_users_folder (BonoboUIComponent *uih, + void *data, + const char *path) +{ + EShellView *shell_view; + EShell *shell; + + shell_view = E_SHELL_VIEW (data); + shell = e_shell_view_get_shell (shell_view); + + e_shell_show_shared_folder_picker_dialog (shell, shell_view); +} + /* Going to a folder. */ @@ -627,6 +645,7 @@ static BonoboUIVerb new_verbs [] = { static BonoboUIVerb file_verbs [] = { BONOBO_UI_VERB ("FileImporter", (BonoboUIVerbFn) show_import_wizard), + BONOBO_UI_VERB ("FileOpenOtherUsersFolder", command_open_other_users_folder), BONOBO_UI_VERB ("FileGoToFolder", command_goto_folder), BONOBO_UI_VERB ("FileCreateFolder", command_create_folder), BONOBO_UI_VERB ("FileClose", command_close), diff --git a/shell/evolution-storage-listener.h b/shell/evolution-storage-listener.h index 8e9bee5df7..e48a3243f8 100644 --- a/shell/evolution-storage-listener.h +++ b/shell/evolution-storage-listener.h @@ -64,6 +64,12 @@ struct _EvolutionStorageListenerClass { void (* has_subfolders) (EvolutionStorageListener *storage_listener, const char *path, const char *message); + + void (* shared_folder_discovery_result) (EvolutionStorageListener *storage_listener, + const char *user, + const char *folder_name, + const char *storage_path, + const char *physical_uri); }; diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c index 79930b17f9..317812ab3c 100644 --- a/shell/evolution-storage.c +++ b/shell/evolution-storage.c @@ -68,6 +68,7 @@ enum { XFER_FOLDER, UPDATE_FOLDER, OPEN_FOLDER, + DISCOVER_SHARED_FOLDER, LAST_SIGNAL }; @@ -320,13 +321,13 @@ impl_Storage__get_folderList (PortableServer_Servant servant, } static void -impl_Storage_async_create_folder (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_char *type, - const CORBA_char *description, - const CORBA_char *parent_physical_uri, - const Bonobo_Listener listener, - CORBA_Environment *ev) +impl_Storage_asyncCreateFolder (PortableServer_Servant servant, + const CORBA_char *path, + const CORBA_char *type, + const CORBA_char *description, + const CORBA_char *parent_physical_uri, + const Bonobo_Listener listener, + CORBA_Environment *ev) { BonoboObject *bonobo_object; CORBA_Object obj_dup; @@ -342,11 +343,11 @@ impl_Storage_async_create_folder (PortableServer_Servant servant, static void -impl_Storage_async_remove_folder (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_char *physical_uri, - const Bonobo_Listener listener, - CORBA_Environment *ev) +impl_Storage_asyncRemoveFolder (PortableServer_Servant servant, + const CORBA_char *path, + const CORBA_char *physical_uri, + const Bonobo_Listener listener, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionStorage *storage; @@ -361,12 +362,12 @@ impl_Storage_async_remove_folder (PortableServer_Servant servant, } static void -impl_Storage_async_xfer_folder (PortableServer_Servant servant, - const CORBA_char *source_path, - const CORBA_char *destination_path, - const CORBA_boolean remove_source, - const Bonobo_Listener listener, - CORBA_Environment *ev) +impl_Storage_asyncXferFolder (PortableServer_Servant servant, + const CORBA_char *source_path, + const CORBA_char *destination_path, + const CORBA_boolean remove_source, + const Bonobo_Listener listener, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionStorage *storage; @@ -425,9 +426,9 @@ impl_Storage_updateFolder (PortableServer_Servant servant, } static void -impl_Storage_async_open_folder (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_Environment *ev) +impl_Storage_asyncOpenFolder (PortableServer_Servant servant, + const CORBA_char *path, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionStorage *storage; @@ -439,9 +440,26 @@ impl_Storage_async_open_folder (PortableServer_Servant servant, } static void -impl_Storage_add_listener (PortableServer_Servant servant, - const GNOME_Evolution_StorageListener listener, - CORBA_Environment *ev) +impl_Storage_asyncDiscoverSharedFolder (PortableServer_Servant servant, + const CORBA_char *user, + const CORBA_char *folder_name, + Bonobo_Listener listener, + CORBA_Environment *ev) +{ + BonoboObject *bonobo_object; + EvolutionStorage *storage; + + bonobo_object = bonobo_object_from_servant (servant); + storage = EVOLUTION_STORAGE (bonobo_object); + + gtk_signal_emit (GTK_OBJECT (storage), signals[DISCOVER_SHARED_FOLDER], + user, folder_name, listener); +} + +static void +impl_Storage_addListener (PortableServer_Servant servant, + const GNOME_Evolution_StorageListener listener, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionStorage *storage; @@ -454,9 +472,9 @@ impl_Storage_add_listener (PortableServer_Servant servant, } static void -impl_Storage_remove_listener (PortableServer_Servant servant, - const GNOME_Evolution_StorageListener listener, - CORBA_Environment *ev) +impl_Storage_removeListener (PortableServer_Servant servant, + const GNOME_Evolution_StorageListener listener, + CORBA_Environment *ev) { BonoboObject *bonobo_object; EvolutionStorage *storage; @@ -646,6 +664,17 @@ class_init (EvolutionStorageClass *klass) GTK_TYPE_NONE, 1, GTK_TYPE_STRING); + signals[DISCOVER_SHARED_FOLDER] = gtk_signal_new ("discover_shared_folder", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET (EvolutionStorageClass, + discover_shared_folder), + e_marshal_NONE__POINTER_POINTER_POINTER, + GTK_TYPE_NONE, 3, + GTK_TYPE_STRING, + GTK_TYPE_STRING, + GTK_TYPE_POINTER); + gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); corba_class_init (); @@ -673,16 +702,17 @@ evolution_storage_get_epv (void) POA_GNOME_Evolution_Storage__epv *epv; epv = g_new0 (POA_GNOME_Evolution_Storage__epv, 1); - epv->_get_name = impl_Storage__get_name; - epv->_get_hasSharedFolders = impl_Storage__get_hasSharedFolders; - epv->_get_folderList = impl_Storage__get_folderList; - epv->asyncCreateFolder = impl_Storage_async_create_folder; - epv->asyncRemoveFolder = impl_Storage_async_remove_folder; - epv->asyncXferFolder = impl_Storage_async_xfer_folder; - epv->asyncOpenFolder = impl_Storage_async_open_folder; - epv->updateFolder = impl_Storage_updateFolder; - epv->addListener = impl_Storage_add_listener; - epv->removeListener = impl_Storage_remove_listener; + epv->_get_name = impl_Storage__get_name; + epv->_get_hasSharedFolders = impl_Storage__get_hasSharedFolders; + epv->_get_folderList = impl_Storage__get_folderList; + epv->asyncCreateFolder = impl_Storage_asyncCreateFolder; + epv->asyncRemoveFolder = impl_Storage_asyncRemoveFolder; + epv->asyncXferFolder = impl_Storage_asyncXferFolder; + epv->asyncOpenFolder = impl_Storage_asyncOpenFolder; + epv->updateFolder = impl_Storage_updateFolder; + epv->asyncDiscoverSharedFolder = impl_Storage_asyncDiscoverSharedFolder; + epv->addListener = impl_Storage_addListener; + epv->removeListener = impl_Storage_removeListener; return epv; } diff --git a/shell/evolution-storage.h b/shell/evolution-storage.h index 004aedebbe..59d46f7a44 100644 --- a/shell/evolution-storage.h +++ b/shell/evolution-storage.h @@ -105,6 +105,11 @@ struct _EvolutionStorageClass { void (*update_folder) (EvolutionStorage *storage, const char *path, int unread_count); + + void (*discover_shared_folder) (EvolutionStorage *storage, + const char *user, + const char *folder_name, + Bonobo_Listener listener); }; diff --git a/shell/evolution-test-component.c b/shell/evolution-test-component.c index d083248395..58056de5d4 100644 --- a/shell/evolution-test-component.c +++ b/shell/evolution-test-component.c @@ -27,8 +27,10 @@ #endif #include "evolution-shell-component.h" + #include "evolution-activity-client.h" #include "evolution-config-control.h" +#include "evolution-storage.h" #include #include @@ -56,7 +58,7 @@ static EvolutionShellClient *parent_shell = NULL; static int timeout_id = 0; -/* Test the configuration control. */ +/* TEST #1: Configuration Control. */ static BonoboObject * create_configuration_page (void) @@ -94,7 +96,7 @@ register_configuration_control_factory (void) } -/* Test the ::Shortcut interface. */ +/* TEST #2: The ::Shortcut interface. */ static void spit_out_shortcuts (EvolutionShellClient *shell_client) @@ -146,7 +148,7 @@ spit_out_shortcuts (EvolutionShellClient *shell_client) } -/* Test the multiple folder selector. */ +/* TEST #4: The multiple folder selector. */ static void dialog_clicked_callback (GnomeDialog *dialog, @@ -256,6 +258,80 @@ create_new_folder_selector (EvolutionShellComponent *shell_component) CORBA_exception_free (&ev); } + +/* TEST #5: Test custom storage. */ + +static int +shared_folder_discovery_timeout_callback (void *data) +{ + CORBA_Environment ev; + Bonobo_Listener listener; + CORBA_any any; + GNOME_Evolution_Storage_DiscoverSharedFolderResult result; + + listener = (Bonobo_Listener) data; + + result.result = GNOME_Evolution_Storage_OK; + result.storagePath = "/Shared Folders/The Public Folder"; + result.physicalURI = "blah://bleh.net:3764/bluh/bleh/blih"; + result.type = "test"; + + any._type = TC_GNOME_Evolution_Storage_DiscoverSharedFolderResult; + any._value = &result; + + CORBA_exception_init (&ev); + + Bonobo_Listener_event (listener, "result", &any, &ev); + if (BONOBO_EX (&ev)) + g_warning ("Cannot report result for shared folder discovery -- %s", + BONOBO_EX_ID (&ev)); + + CORBA_Object_release (listener, &ev); + + CORBA_exception_free (&ev); + + return FALSE; +} + +static void +storage_discover_shared_folder_callback (EvolutionStorage *storage, + const char *user, + const char *folder_name, + Bonobo_Listener listener, + void *data) +{ + CORBA_Environment ev; + Bonobo_Listener listener_copy; + + CORBA_exception_init (&ev); + listener_copy = CORBA_Object_duplicate (listener, &ev); + CORBA_exception_free (&ev); + + g_timeout_add (1000, shared_folder_discovery_timeout_callback, listener_copy); +} + +static void +setup_custom_storage (EvolutionShellClient *shell_client) +{ + EvolutionStorage *the_storage; + EvolutionStorageResult result; + + the_storage = evolution_storage_new ("TestStorage", TRUE); + + gtk_signal_connect (GTK_OBJECT (the_storage), "discover_shared_folder", + GTK_SIGNAL_FUNC (storage_discover_shared_folder_callback), shell_client); + + result = evolution_storage_register_on_shell (the_storage, BONOBO_OBJREF (shell_client)); + if (result != EVOLUTION_STORAGE_OK) { + g_warning ("Cannot register storage on the shell."); + bonobo_object_unref (BONOBO_OBJECT (the_storage)); + return; + } + + evolution_storage_new_folder (the_storage, "/FirstFolder", "FirstFolder", "mail", "file:///tmp/blah", "", 0); + evolution_storage_new_folder (the_storage, "/SecondFolder", "SecondFolder", "calendar", "file:///tmp/bleh", "", 0); +} + /* Callbacks. */ @@ -432,6 +508,8 @@ owner_set_callback (EvolutionShellComponent *shell_component, g_warning ("Shell doesn't have a ::Activity interface -- weird!"); spit_out_shortcuts (shell_client); + + setup_custom_storage (shell_client); } static int diff --git a/shell/glade/Makefile.am b/shell/glade/Makefile.am index ada34672bd..a7e1ac69d3 100644 --- a/shell/glade/Makefile.am +++ b/shell/glade/Makefile.am @@ -1,10 +1,11 @@ gladedir = $(datadir)/evolution/glade -glade_DATA = \ - e-active-connection-dialog.glade \ - e-shell-config-default-folders.glade \ - e-shell-folder-creation-dialog.glade \ - evolution-startup-wizard.glade \ +glade_DATA = \ + e-active-connection-dialog.glade \ + e-shell-config-default-folders.glade \ + e-shell-folder-creation-dialog.glade \ + e-shell-shared-folder-picker-dialog.glade \ + evolution-startup-wizard.glade \ e-folder-list.glade EXTRA_DIST = $(glade_DATA) diff --git a/shell/glade/e-shell-shared-folder-picker-dialog.glade b/shell/glade/e-shell-shared-folder-picker-dialog.glade new file mode 100644 index 0000000000..0275f66a0e --- /dev/null +++ b/shell/glade/e-shell-shared-folder-picker-dialog.glade @@ -0,0 +1,301 @@ + + + + + Project1 + project1 + ../../../../home/ettore/Projects/project1 + ../../../../home/ettore/Projects/project1/src + ../../../../home/ettore/Projects/project1/pixmaps + C + True + True + ../../../../home/ettore/Projects/project1 + + + + GnomeDialog + dialog + 350 + Open Other User's Folder + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + False + False + False + + + GtkVBox + GnomeDialog:vbox + dialog-vbox1 + False + 8 + + 4 + True + True + + + + GtkHButtonBox + GnomeDialog:action_area + dialog-action_area1 + GTK_BUTTONBOX_END + 8 + 85 + 27 + 7 + 0 + + 0 + False + True + GTK_PACK_END + + + + GtkButton + button1 + True + True + True + GNOME_STOCK_BUTTON_OK + + + + GtkButton + button3 + True + True + GNOME_STOCK_BUTTON_CANCEL + + + + + GtkVBox + vbox1 + False + 0 + + 0 + True + True + + + + GtkLabel + label4 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkLabel + label5 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + + GtkTable + table1 + 3 + 2 + False + 3 + 3 + + 2 + True + True + + + + GtkLabel + label1 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkLabel + label2 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 0 + 1 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + + GtkLabel + label3 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 0 + 1 + 2 + 3 + 0 + 0 + False + False + False + False + True + False + + + + + GtkOptionMenu + server-option-menu + True + + 0 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkCombo + folder-name-combo + False + True + False + True + False + + + 1 + 2 + 2 + 3 + 0 + 0 + True + False + False + False + True + False + + + + GtkEntry + GtkCombo:entry + folder-name-entry + True + True + True + 0 + + + + + + GtkHBox + user-picker-placeholder + False + 0 + + 1 + 2 + 1 + 2 + 0 + 0 + False + False + False + False + True + True + + + + Placeholder + + + + + + + -- cgit v1.2.3