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
This commit is contained in:
Ettore Perazzoli
2002-05-10 16:54:23 +00:00
parent cf18d0940f
commit c1b5780b8a
10 changed files with 571 additions and 49 deletions

View File

@ -1,3 +1,43 @@
2002-05-10 Ettore Perazzoli <ettore@ximian.com>
* 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 <ettore@ximian.com>
* e-local-storage.c (construct): Pass %FALSE as

View File

@ -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);

View File

@ -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)

View File

@ -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),

View File

@ -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);
};

View File

@ -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;
}

View File

@ -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);
};

View File

@ -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 <bonobo/bonobo-exception.h>
#include <bonobo/bonobo-generic-factory.h>
@ -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

View File

@ -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)

View File

@ -0,0 +1,301 @@
<?xml version="1.0"?>
<GTK-Interface>
<project>
<name>Project1</name>
<program_name>project1</program_name>
<directory>../../../../home/ettore/Projects/project1</directory>
<source_directory>../../../../home/ettore/Projects/project1/src</source_directory>
<pixmaps_directory>../../../../home/ettore/Projects/project1/pixmaps</pixmaps_directory>
<language>C</language>
<gnome_support>True</gnome_support>
<gettext_support>True</gettext_support>
<translatable_strings_file>../../../../home/ettore/Projects/project1</translatable_strings_file>
</project>
<widget>
<class>GnomeDialog</class>
<name>dialog</name>
<width>350</width>
<title>Open Other User's Folder</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
<modal>False</modal>
<allow_shrink>False</allow_shrink>
<allow_grow>False</allow_grow>
<auto_shrink>False</auto_shrink>
<auto_close>False</auto_close>
<hide_on_close>False</hide_on_close>
<widget>
<class>GtkVBox</class>
<child_name>GnomeDialog:vbox</child_name>
<name>dialog-vbox1</name>
<homogeneous>False</homogeneous>
<spacing>8</spacing>
<child>
<padding>4</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHButtonBox</class>
<child_name>GnomeDialog:action_area</child_name>
<name>dialog-action_area1</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>
<widget>
<class>GtkButton</class>
<name>button1</name>
<can_default>True</can_default>
<has_default>True</has_default>
<can_focus>True</can_focus>
<stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
</widget>
<widget>
<class>GtkButton</class>
<name>button3</name>
<can_default>True</can_default>
<can_focus>True</can_focus>
<stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
</widget>
</widget>
<widget>
<class>GtkVBox</class>
<name>vbox1</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label4</name>
<label>Blah blah.</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label5</name>
<label>Insert some explanatory text here.</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkTable</class>
<name>table1</name>
<rows>3</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>3</row_spacing>
<column_spacing>3</column_spacing>
<child>
<padding>2</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label1</name>
<label>Server:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label2</name>
<label>User:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label3</name>
<label>Folder Name:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkOptionMenu</class>
<name>server-option-menu</name>
<can_focus>True</can_focus>
<items></items>
<initial_choice>0</initial_choice>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>0</top_attach>
<bottom_attach>1</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
</widget>
<widget>
<class>GtkCombo</class>
<name>folder-name-combo</name>
<value_in_list>False</value_in_list>
<ok_if_empty>True</ok_if_empty>
<case_sensitive>False</case_sensitive>
<use_arrows>True</use_arrows>
<use_arrows_always>False</use_arrows_always>
<items></items>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>2</top_attach>
<bottom_attach>3</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>False</yfill>
</child>
<widget>
<class>GtkEntry</class>
<child_name>GtkCombo:entry</child_name>
<name>folder-name-entry</name>
<can_focus>True</can_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
</widget>
</widget>
<widget>
<class>GtkHBox</class>
<name>user-picker-placeholder</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<left_attach>1</left_attach>
<right_attach>2</right_attach>
<top_attach>1</top_attach>
<bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
<widget>
<class>Placeholder</class>
</widget>
</widget>
</widget>
</widget>
</widget>
</GTK-Interface>