[mapguide-commits] r6387 - in trunk/Tools/Maestro: Maestro Maestro.Base Maestro.Base/Commands Maestro.Base/Editor Maestro.Base/Events Maestro.Base/Properties Maestro.Base/Services Maestro.Base/UI Maestro.Shared.UI Maestro.Shared.UI/Properties

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Dec 30 09:16:32 EST 2011


Author: jng
Date: 2011-12-30 06:16:32 -0800 (Fri, 30 Dec 2011)
New Revision: 6387

Added:
   trunk/Tools/Maestro/Maestro.Base/WorkbenchInitializer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ISubView.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/IViewContent.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/IViewContentManager.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/IWorkbenchInitializer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ServiceBase.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.Designer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.resx
   trunk/Tools/Maestro/Maestro.Shared.UI/TabFactory.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.Designer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.resx
   trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentManagerBase.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.Designer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.resx
   trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.Designer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.resx
Removed:
   trunk/Tools/Maestro/Maestro.Base/ISubView.cs
   trunk/Tools/Maestro/Maestro.Base/IViewContent.cs
   trunk/Tools/Maestro/Maestro.Base/Services/ServiceBase.cs
   trunk/Tools/Maestro/Maestro.Base/TabFactory.cs
   trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.cs
   trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.resx
   trunk/Tools/Maestro/Maestro.Base/ViewContentBase.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/ViewContentBase.cs
   trunk/Tools/Maestro/Maestro.Base/ViewContentBase.resx
   trunk/Tools/Maestro/Maestro.Base/Workbench.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/Workbench.resx
   trunk/Tools/Maestro/Maestro.Base/ZonedContainer.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/ZonedContainer.cs
   trunk/Tools/Maestro/Maestro.Base/ZonedContainer.resx
Modified:
   trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs
   trunk/Tools/Maestro/Maestro.Base/Editor/IEditorViewContent.cs
   trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs
   trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj
   trunk/Tools/Maestro/Maestro.Base/Properties/Resources.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/Properties/Resources.resx
   trunk/Tools/Maestro/Maestro.Base/Services/ClipboardService.cs
   trunk/Tools/Maestro/Maestro.Base/Services/DragDropHandlerService.cs
   trunk/Tools/Maestro/Maestro.Base/Services/NewItemTemplateService.cs
   trunk/Tools/Maestro/Maestro.Base/Services/ServerConnectionManager.cs
   trunk/Tools/Maestro/Maestro.Base/Services/ServiceRegistry.cs
   trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs
   trunk/Tools/Maestro/Maestro.Base/Services/ViewContentManager.cs
   trunk/Tools/Maestro/Maestro.Base/UI/ISiteExplorer.cs
   trunk/Tools/Maestro/Maestro.Base/UI/SiteExplorer.cs
   trunk/Tools/Maestro/Maestro.Base/Workbench.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/Maestro.Shared.UI.csproj
   trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.Designer.cs
   trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.resx
   trunk/Tools/Maestro/Maestro/Program.cs
Log:
#1610: This mega-destructive submission moves the core Maestro UI classes (Workbench, IViewContent, view content management) away from the Maestro.Base assembly into the Maestro.Shared.UI assembly and refactors them to eliminate dependencies on SharpDevelop Core. This means non-Maestro applications can now utilise the Workbench and related UI classes by referencing only the Maestro.Shared.UI assembly.

Modified: trunk/Tools/Maestro/Maestro/Program.cs
===================================================================
--- trunk/Tools/Maestro/Maestro/Program.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro/Program.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -32,6 +32,8 @@
 using Maestro.Login;
 using Maestro.Shared.UI;
 using System.Diagnostics;
+using Maestro.Base.Services;
+using Maestro.Base.Events;
 
 namespace Maestro
 {
@@ -134,27 +136,28 @@
             LoggingService.Info("Initializing Workbench...");
             // Workbench is our class from the base project, this method creates an instance
             // of the main form.
-            Workbench.InitializeWorkbench();
-
-            try
-            {
-                LoggingService.Info("Running application...");
-                // Workbench.Instance is the instance of the main form, run the message loop.
-                Application.Run(Workbench.Instance);
-            }
-            finally
-            {
+            ServiceRegistry.Initialize(() => {
+                Workbench.InitializeWorkbench(new WorkbenchInitializer());
                 try
                 {
-                    // Save changed properties
-                    PropertyService.Save();
+                    LoggingService.Info("Running application...");
+                    // Workbench.Instance is the instance of the main form, run the message loop.
+                    Application.Run(Workbench.Instance);
                 }
-                catch (Exception ex)
+                finally
                 {
-                    ErrorDialog.Show("Error storing properties", ex.ToString());
+                    try
+                    {
+                        // Save changed properties
+                        PropertyService.Save();
+                    }
+                    catch (Exception ex)
+                    {
+                        ErrorDialog.Show("Error storing properties", ex.ToString());
+                    }
                 }
-            }
-            LoggingService.Info("Application shutdown");
+                LoggingService.Info("Application shutdown");
+            });
         }
 
         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)

Modified: trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -30,6 +30,7 @@
 using Props = ICSharpCode.Core.PropertyService;
 using Maestro.Base.UI.Preferences;
 using System.Windows.Forms;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Commands
 {
@@ -40,9 +41,6 @@
             ResourceService.RegisterNeutralImages(Properties.Resources.ResourceManager);
             ResourceService.RegisterNeutralStrings(Properties.Resources.ResourceManager);
 
-            ServiceRegistry.Initialize();
-            EventWatcher.Initialize();
-
             ResourcePreviewerFactory.RegisterPreviewer("Maestro.Http", new DefaultResourcePreviewer());
 
             Workbench.WorkbenchInitialized += (sender, e) =>

Modified: trunk/Tools/Maestro/Maestro.Base/Editor/IEditorViewContent.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Editor/IEditorViewContent.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Editor/IEditorViewContent.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -23,6 +23,7 @@
 using OSGeo.MapGuide.MaestroAPI;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using Maestro.Editors;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Editor
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -27,6 +27,7 @@
 using OSGeo.MapGuide.MaestroAPI.Services;
 using ICSharpCode.Core;
 using System.Windows.Forms;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Events
 {
@@ -108,7 +109,12 @@
             if (wb.ActiveSiteExplorer == null)
             {
                 var siteExp = new SiteExplorer();
-                wb.ShowContent(siteExp);
+                var viewMgr = ServiceRegistry.GetService<ViewContentManager>();
+
+                viewMgr.OpenContent(Properties.Resources.Content_SiteExplorer, 
+                                    Properties.Resources.Content_SiteExplorer, 
+                                    ViewRegion.Left, 
+                                    () => { return new SiteExplorer(); });
             }
 
             wb.ActiveSiteExplorer.RefreshModel(name);

Deleted: trunk/Tools/Maestro/Maestro.Base/ISubView.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ISubView.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ISubView.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,37 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-
-namespace Maestro.Base
-{
-    /// <summary>
-    /// A control sub view
-    /// </summary>
-    public interface ISubView
-    {
-        /// <summary>
-        /// The underlying control
-        /// </summary>
-        Control ContentControl { get; }
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/IViewContent.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/IViewContent.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/IViewContent.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,159 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-using System.ComponentModel;
-
-namespace Maestro.Base
-{
-    /// <summary>
-    /// Abstract view interface.
-    /// </summary>
-    public interface IViewContent : ISubView
-    {
-        /// <summary>
-        /// The title of the view
-        /// </summary>
-        string Title { get; set; }
-        /// <summary>
-        /// The view's description, this is the ToolTip content
-        /// </summary>
-        string Description { get; set; }
-        /// <summary>
-        /// Raised when the description has changed
-        /// </summary>
-        event EventHandler DescriptionChanged;
-        /// <summary>
-        /// Fires when the title has been changed
-        /// </summary>
-        event EventHandler TitleChanged;
-        /// <summary>
-        /// Detrmines if this view can be closed by the user, note that this does not affect the <see cref="Close"/> method
-        /// in any way. All view content can still be programmatically closed if they inherit from <see cref="ViewContentBase"/> and
-        /// does not override the default implementation of <see cref="Close"/>
-        /// </summary>
-        bool AllowUserClose { get; }
-        /// <summary>
-        /// Makes this content active
-        /// </summary>
-        void Activate();
-        /// <summary>
-        /// Hides this view content. Can only be called when 
-        /// </summary>
-        void Hide();
-        /// <summary>
-        /// Closes the view. This raises the <see cref="ViewContentClosing"/> event
-        /// </summary>
-        /// <returns></returns>
-        void Close();
-        /// <summary>
-        /// Fired when the view is activating
-        /// </summary>
-        event EventHandler ViewContentActivating;
-        /// <summary>
-        /// Fired when the view has been closed internally
-        /// </summary>
-        event CancelEventHandler ViewContentClosing;
-        /// <summary>
-        /// Fired when the view has been closed internally
-        /// </summary>
-        event EventHandler ViewContentClosed;
-        /// <summary>
-        /// Fired when the view is going to hide
-        /// </summary>
-        event EventHandler ViewContentHiding;
-        /// <summary>
-        /// Fired when the view, which was hidden is now being shown 
-        /// </summary>
-        event EventHandler ViewContentShowing;
-        /// <summary>
-        /// Displays an exception message
-        /// </summary>
-        /// <param name="ex">The exception object</param>
-        void ShowError(Exception ex);
-        /// <summary>
-        /// Displays an error message
-        /// </summary>
-        /// <param name="message">The message</param>
-        void ShowError(string message);
-        /// <summary>
-        /// Displays an alert message
-        /// </summary>
-        /// <param name="title">The title of this message</param>
-        /// <param name="message">The message</param>
-        void ShowMessage(string title, string message);
-        /// <summary>
-        /// Make a request for confirmation
-        /// </summary>
-        /// <param name="title">The title of the confirmation message</param>
-        /// <param name="message">The message</param>
-        /// <returns>true if confirmed, false otherwise</returns>
-        bool Confirm(string title, string message);
-        /// <summary>
-        /// Make a request for confirmation
-        /// </summary>
-        /// <param name="title">The title of the confirmation message</param>
-        /// <param name="format">The message template</param>
-        /// <param name="args">The template values</param>
-        /// <returns>true if confirmed, false otherwise</returns>
-        bool ConfirmFormatted(string title, string format, params string[] args);
-        /// <summary>
-        /// Indicates whether this view is attached to a workbench
-        /// </summary>
-        bool IsAttached { get; }
-        /// <summary>
-        /// Indicates the default region this view content will be put in
-        /// </summary>
-        ViewRegion DefaultRegion { get; }
-    }
-
-    /// <summary>
-    /// Defines the possible regions of the user interface a <see cref="IViewContent"/> can reside in 
-    /// </summary>
-    public enum ViewRegion
-    {
-        /// <summary>
-        /// The view content will be docked to the left
-        /// </summary>
-        Left,
-        /// <summary>
-        /// The view content will be docked to the right
-        /// </summary>
-        Right,
-        /// <summary>
-        /// The view content will be docked to the bottom
-        /// </summary>
-        Bottom,
-        /// <summary>
-        /// The view content will be docked to the center, (in a tabbed document interface)
-        /// </summary>
-        Document,
-        /// <summary>
-        /// The view content will reside in a floating dialog
-        /// </summary>
-        Floating,
-        /// <summary>
-        /// The view content will reside in a modal dialog
-        /// </summary>
-        Dialog
-    }
-}

Modified: trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj	2011-12-30 14:16:32 UTC (rev 6387)
@@ -215,8 +215,6 @@
       <DependentUpon>XmlEditorDialog.cs</DependentUpon>
     </Compile>
     <Compile Include="Events\EventWatcher.cs" />
-    <Compile Include="ISubView.cs" />
-    <Compile Include="IViewContent.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
       <AutoGen>True</AutoGen>
@@ -236,7 +234,6 @@
     <Compile Include="Services\OpenResourceManager.cs" />
     <Compile Include="Services\ResourcePreviewerFactory.cs" />
     <Compile Include="Services\ServerConnectionManager.cs" />
-    <Compile Include="Services\ServiceBase.cs" />
     <Compile Include="Services\ServiceRegistry.cs" />
     <Compile Include="Services\UrlLauncherService.cs" />
     <Compile Include="Services\ViewContentManager.cs" />
@@ -354,19 +351,12 @@
     <Compile Include="UI\ResourcePropertiesDialog.Designer.cs">
       <DependentUpon>ResourcePropertiesDialog.cs</DependentUpon>
     </Compile>
-    <Compile Include="UI\SingletonViewContent.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="UI\SingletonViewContent.Designer.cs">
-      <DependentUpon>SingletonViewContent.cs</DependentUpon>
-    </Compile>
     <Compile Include="UI\SiteExplorer.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Include="UI\SiteExplorer.Designer.cs">
       <DependentUpon>SiteExplorer.cs</DependentUpon>
     </Compile>
-    <Compile Include="TabFactory.cs" />
     <Compile Include="UI\SiteExplorerDragDropHandler.cs" />
     <Compile Include="UI\TipOfTheDayDialog.cs">
       <SubType>Form</SubType>
@@ -380,24 +370,10 @@
     <Compile Include="UI\ValidationResultsDialog.Designer.cs">
       <DependentUpon>ValidationResultsDialog.cs</DependentUpon>
     </Compile>
-    <Compile Include="ViewContentBase.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ViewContentBase.Designer.cs">
-      <DependentUpon>ViewContentBase.cs</DependentUpon>
-    </Compile>
     <Compile Include="Workbench.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Include="Workbench.Designer.cs">
-      <DependentUpon>Workbench.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ZonedContainer.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ZonedContainer.Designer.cs">
-      <DependentUpon>ZonedContainer.cs</DependentUpon>
-    </Compile>
+    <Compile Include="WorkbenchInitializer.cs" />
     <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
   </ItemGroup>
   <ItemGroup>
@@ -561,9 +537,6 @@
       <DependentUpon>ResourcePropertiesDialog.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
-    <EmbeddedResource Include="UI\SingletonViewContent.resx">
-      <DependentUpon>SingletonViewContent.cs</DependentUpon>
-    </EmbeddedResource>
     <EmbeddedResource Include="UI\SiteExplorer.resx">
       <DependentUpon>SiteExplorer.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -574,17 +547,6 @@
     <EmbeddedResource Include="UI\ValidationResultsDialog.resx">
       <DependentUpon>ValidationResultsDialog.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="ViewContentBase.resx">
-      <DependentUpon>ViewContentBase.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Workbench.resx">
-      <DependentUpon>Workbench.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ZonedContainer.resx">
-      <DependentUpon>ZonedContainer.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Maestro.Editors\Maestro.Editors.csproj">

Modified: trunk/Tools/Maestro/Maestro.Base/Properties/Resources.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Properties/Resources.Designer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Properties/Resources.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -518,11 +518,12 @@
         ///  Andrew DeMerchant
         ///  Gabriele Monfardini
         ///  Gordon Luckett
+        ///  Hans Milling
         ///
         ///Many thanks to the following people who have translated Maestro into other languages:
         ///
         ///  José Manuel Cerrejón González (Spanish)
-        ///  Pierre Cardina [rest of string was truncated]&quot;;.
+        /// [rest of string was truncated]&quot;;.
         /// </summary>
         internal static string Contributors {
             get {
@@ -722,24 +723,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to The specified view content type is not registered in any addin files: {0}.
-        /// </summary>
-        internal static string Error_ViewContent_Not_Registered {
-            get {
-                return ResourceManager.GetString("Error_ViewContent_Not_Registered", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to The specified view content type is not a singleton: {0}.
-        /// </summary>
-        internal static string Error_ViewContent_Type_Not_Singleton {
-            get {
-                return ResourceManager.GetString("Error_ViewContent_Type_Not_Singleton", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Autodesk DWF (*.dwf)|*.dwf.
         /// </summary>
         internal static string Filter_Dwf_Files {

Modified: trunk/Tools/Maestro/Maestro.Base/Properties/Resources.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Properties/Resources.resx	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Properties/Resources.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -301,12 +301,6 @@
   <data name="Error_Closeable_Singleton_Content" xml:space="preserve">
     <value>Singleton view content cannot be closed by users. The AllowUserClose property must return false</value>
   </data>
-  <data name="Error_ViewContent_Not_Registered" xml:space="preserve">
-    <value>The specified view content type is not registered in any addin files: {0}</value>
-  </data>
-  <data name="Error_ViewContent_Type_Not_Singleton" xml:space="preserve">
-    <value>The specified view content type is not a singleton: {0}</value>
-  </data>
   <data name="applications_stack" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\applications-stack.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>

Modified: trunk/Tools/Maestro/Maestro.Base/Services/ClipboardService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/ClipboardService.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/ClipboardService.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -24,6 +24,7 @@
 using ICSharpCode.Core;
 using Maestro.Base.UI;
 using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Services
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Services/DragDropHandlerService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/DragDropHandlerService.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/DragDropHandlerService.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -22,6 +22,7 @@
 using System.Text;
 using System.IO;
 using ICSharpCode.Core;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Services
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Services/NewItemTemplateService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/NewItemTemplateService.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/NewItemTemplateService.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -30,6 +30,7 @@
     using Res = Properties.Resources;
     using Maestro.Base.Templates;
     using System.IO;
+    using Maestro.Shared.UI;
 
     public class NewItemTemplateService : ServiceBase
     {

Modified: trunk/Tools/Maestro/Maestro.Base/Services/ServerConnectionManager.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/ServerConnectionManager.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/ServerConnectionManager.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -23,6 +23,7 @@
 using OSGeo.MapGuide.MaestroAPI;
 using ICSharpCode.Core;
 using System.ComponentModel;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Services
 {

Deleted: trunk/Tools/Maestro/Maestro.Base/Services/ServiceBase.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/ServiceBase.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/ServiceBase.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,34 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Maestro.Base.Services
-{
-    public abstract class ServiceBase
-    {
-        public virtual void Initialize() { }
-
-        public virtual void Load() { }
-
-        public virtual void Save() { }
-    }
-}

Modified: trunk/Tools/Maestro/Maestro.Base/Services/ServiceRegistry.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/ServiceRegistry.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/ServiceRegistry.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -21,6 +21,8 @@
 using System.Collections.Generic;
 using System.Text;
 using ICSharpCode.Core;
+using Maestro.Shared.UI;
+using Maestro.Base.Events;
 
 namespace Maestro.Base.Services
 {
@@ -28,14 +30,23 @@
     {
         private static List<ServiceBase> _services;
 
-        internal static void Initialize()
+        private static bool _init = false;
+
+        public static void Initialize(Action callback)
         {
+            if (_init)
+                return;
+
             _services = AddInTree.BuildItems<ServiceBase>("/Maestro/ApplicationServices", null);
             foreach (var svc in _services)
             {
                 svc.Initialize();
                 svc.Load();
             }
+            _init = true;
+            EventWatcher.Initialize();
+            if (callback != null)
+                callback();
         }
 
         public static T GetService<T>() where T : ServiceBase

Modified: trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -24,6 +24,7 @@
 using System.Diagnostics;
 using Maestro.Base.UI;
 using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Services
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Services/ViewContentManager.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/ViewContentManager.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Services/ViewContentManager.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -22,27 +22,14 @@
 using System.Text;
 using ICSharpCode.Core;
 using Maestro.Base.UI;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Services
 {
-    public class ViewContentManager : ServiceBase
+    public class ViewContentManager : ViewContentManagerBase
     {
-        private Dictionary<string, Type> _singletonViewContentTypes;
-        private List<IViewContent> _singletonInstances;
-
-        public event EventHandler ViewHidden;
-
-        private Workbench _wb;
-
         public override void Initialize()
         {
-            base.Initialize();
-
-            Workbench.WorkbenchInitialized += (sender, e) =>
-            {
-                _wb = Workbench.Instance;
-            };
-
             _singletonInstances = new List<IViewContent>();
             _singletonViewContentTypes = new Dictionary<string, Type>();
 
@@ -58,122 +45,9 @@
             LoggingService.Info(Properties.Resources.Service_Init_ViewContent_Manager);
         }
 
-        public bool IsCreated<T>() where T : IViewContent
+        protected override WorkbenchBase GetWorkbench()
         {
-            var type = typeof(T);
-            if (_singletonViewContentTypes.ContainsKey(type.Name))
-            {
-                foreach (var cnt in _singletonInstances)
-                {
-                    if (type.IsAssignableFrom(cnt.GetType()))
-                    {
-                        return true;
-                    }
-                }
-                return false;
-            }
-            else
-            {
-                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Type_Not_Singleton, type.Name));
-            }
+            return Workbench.Instance;
         }
-
-        public void HideContent<T>() where T : IViewContent
-        {
-            var type = typeof(T);
-            if (_singletonViewContentTypes.ContainsKey(type.Name))
-            {
-                foreach (var cnt in _singletonInstances)
-                {
-                    if (type.IsAssignableFrom(cnt.GetType()))
-                    {
-                        cnt.Hide();
-                        var handler = this.ViewHidden;
-                        if (handler != null)
-                            handler(this, EventArgs.Empty);
-
-                        if (_wb != null)
-                            _wb.CheckContainerStatus();
-                        return;
-                    }
-                }
-            }
-            else
-            {
-                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Type_Not_Singleton, type.Name));
-            }
-        }
-
-        public void ShowContent<T>() where T : IViewContent
-        {
-            var type = typeof(T);
-            if (_singletonViewContentTypes.ContainsKey(type.Name))
-            {
-                foreach (var cnt in _singletonInstances)
-                {
-                    if (type.IsAssignableFrom(cnt.GetType()))
-                    {
-                        if (!cnt.IsAttached)
-                            _wb.ShowContent(cnt);
-                        cnt.Activate();
-                        if (_wb != null)
-                            _wb.CheckContainerStatus();
-                        return;
-                    }
-                }
-            }
-            else
-            {
-                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Type_Not_Singleton, type.Name));
-            }
-        }
-
-        public T OpenContent<T>(ViewRegion region, CreateFunc<T> method) where T : IViewContent
-        {
-            return OpenContent<T>(null, null, region, method);
-        }
-
-        public T OpenContent<T>(ViewRegion region) where T : IViewContent
-        {
-            return OpenContent<T>(null, null, region);
-        }
-
-        public T OpenContent<T>(string title, string description, ViewRegion region) where T : IViewContent
-        {
-            return OpenContent<T>(title, description, region, () => { return (T)Activator.CreateInstance(typeof(T), true); });
-        }
-
-        public T OpenContent<T>(string title, string description, ViewRegion region, CreateFunc<T> method) where T : IViewContent
-        {
-            var type = typeof(T);
-            var wb = Workbench.Instance;
-            if (_singletonViewContentTypes.ContainsKey(type.Name))
-            {
-                foreach (var cnt in _singletonInstances)
-                {
-                    if (type.IsAssignableFrom(cnt.GetType()))
-                    {
-                        if (!cnt.IsAttached)
-                            _wb.ShowContent(cnt);
-                        cnt.Activate();
-                        if (_wb != null)
-                            _wb.CheckContainerStatus();
-                        return (T)cnt;
-                    }
-                }
-            }
-
-            T obj = method(); //(T)Activator.CreateInstance(type, true);
-            SingletonViewContent svc = obj as SingletonViewContent;
-            if (svc != null)
-                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Not_Registered, type.Name));
-
-            obj.Title = title;
-            obj.Description = description;
-            wb.ShowContent(obj);
-            return obj;
-        }
     }
-
-    public delegate T CreateFunc<T>();
 }

Deleted: trunk/Tools/Maestro/Maestro.Base/TabFactory.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/TabFactory.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/TabFactory.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,168 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using OSGeo.MapGuide.MaestroAPI;
-
-namespace Maestro.Base
-{
-    internal class HiddenTab
-    {
-        public TabControl Parent { get; set; }
-        public TabPage Tab { get; set; }
-    }
-
-    // A BIG NOTE TO ANYONE THINKING ABOUT HACKING THIS CODE:
-    //
-    // There are 2 ways to handle tab selections (setting/getting):
-    // - Using the SelectedTab property of TabControl
-    // - Using the SelectedIndex property of TabControl and fetching the relevant tab from its TabPages collection
-    //
-    // Mono (2.4) has a buggy implementation of TabControl and will do crazy things if you use the SelectedTab property. 
-    // So if you're ever hacking code that involves setting or getting a selected tab, NEVER USE THE SelectedTab PROPERTY!
-
-    internal static class TabFactory
-    {
-        private static List<HiddenTab> _hiddenTabs = new List<HiddenTab>();
-
-        static ContextMenuStrip smStrip;
-
-        internal static TabPage CreateTab(IViewContent content, string imgKey)
-        {
-            TabPage page = new TabPage();
-            page.ImageKey = imgKey;
-            page.Text = content.Title; 
-            page.ToolTipText = content.Description;
-            page.Tag = content;
-
-            if (smStrip == null)
-            {
-                smStrip = new ContextMenuStrip();
-                smStrip.Items.Add("Close This Tab");
-                smStrip.Items.Add("Close All But This");
-                smStrip.Items.Add("Close All");
-            }
-            
-            content.TitleChanged += (sender, e) => 
-            {
-                page.Text = content.Title; 
-            };
-            content.DescriptionChanged += (sender, e) =>
-            {
-                page.ToolTipText = content.Description;
-            };
-            content.ViewContentActivating += (sender, e) =>
-            {
-                //Find matching hidden tab entry, and restore
-                HiddenTab hiddenTab = null;
-                foreach (var htab in _hiddenTabs)
-                {
-                    if (htab.Tab == page)
-                    {
-                        hiddenTab = htab;
-                    }
-                }
-                if (hiddenTab != null)
-                {
-                    hiddenTab.Parent.TabPages.Add(page);
-                    var indx = hiddenTab.Parent.TabPages.IndexOf(page);
-                    hiddenTab.Parent.SelectedIndex = indx;
-                    _hiddenTabs.Remove(hiddenTab);
-                }
-                else //Wasn't hidden in the first place
-                {
-                    var tabs = page.Parent as TabControl;
-                    if (tabs != null)
-                    {
-                        var indx = tabs.TabPages.IndexOf(page);
-                        tabs.SelectedIndex = indx;
-                    }
-                }
-            };
-
-
-            content.ViewContentClosed += (sender, e) =>
-            {
-                //Remove itself from the tab control
-                var tabs = page.Parent as TabControl;
-                if (tabs != null && tabs.TabPages.Contains(page))
-                {
-                    if (!Platform.IsRunningOnMono)
-                    {
-                        var idx = tabs.TabPages.IndexOf(page);
-                        tabs.TabPages.Remove(page);
-                        if (idx > 0)
-                            tabs.SelectedIndex = --idx;
-                    }
-                    else
-                    {
-                        int idx = -1;
-                        //HACK: Mono (2.4) will chuck a hissy fit if we remove
-                        //a tab from a TabControl that has a selected tab so we
-                        //have to null the selected tab, but this cause weird
-                        //visual effects once the tab is removed, so we record
-                        //the selected index, so we can assign the one beside it
-                        //to be the selected tab after removal.
-                        if (tabs.SelectedTab == page)
-                        {
-                            idx = tabs.SelectedIndex;
-                            tabs.SelectedTab = null;
-                        }
-                        tabs.TabPages.Remove(page);
-
-                        if (idx > 0)
-                        {
-                            idx--;
-                            tabs.SelectedIndex = idx;
-                        }
-                        else
-                        {
-                            //Set to first tab if available.
-                            if (tabs.TabCount > 0)
-                            {
-                                tabs.SelectedIndex = 0;
-                            }
-                        }
-                    }
-                    page.Dispose();
-                }
-            };
-
-            content.ViewContentHiding += (sender, e) =>
-            {
-                //Store in hidden tabs collection
-                var tabs = page.Parent as TabControl;
-                if (tabs != null && tabs.TabPages.Contains(page))
-                {
-                    var htab = new HiddenTab() { Parent = tabs, Tab = page };
-                    _hiddenTabs.Add(htab);
-                    htab.Parent.TabPages.Remove(page);
-                }
-            };
-
-            content.ContentControl.Dock = DockStyle.Fill;
-            page.Controls.Add(content.ContentControl);
-
-            return page;
-        }
-    }
-}

Modified: trunk/Tools/Maestro/Maestro.Base/UI/ISiteExplorer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/ISiteExplorer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/UI/ISiteExplorer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -22,6 +22,7 @@
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Editors;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.UI
 {

Deleted: trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.Designer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,43 +0,0 @@
-namespace Maestro.Base.UI
-{
-    partial class SingletonViewContent
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.SuspendLayout();
-            // 
-            // SingletonViewContent
-            // 
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
-            this.Name = "SingletonViewContent";
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,58 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-
-namespace Maestro.Base.UI
-{
-    public partial class SingletonViewContent : ViewContentBase
-    {
-        public SingletonViewContent()
-        {
-            InitializeComponent();
-        }
-
-        public override bool AllowUserClose
-        {
-            get
-            {
-                return false;
-            }
-        }
-
-        public override void Close()
-        {
-            //Do nothing. Singletons aren't closeable
-        }
-
-        public override ViewRegion DefaultRegion
-        {
-            get
-            {
-                return ViewRegion.Left;
-            }
-        }
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.resx	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <data name="&gt;&gt;$this.Name" xml:space="preserve">
-    <value>SingletonViewContent</value>
-  </data>
-  <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>Maestro.Base.ViewContentBase, Maestro.Base, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
-  </data>
-</root>
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Base/UI/SiteExplorer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/SiteExplorer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/UI/SiteExplorer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -52,9 +52,6 @@
             ndResource.ToolTipProvider = new RepositoryItemToolTipProvider();
             ndResource.DrawText += new EventHandler<Aga.Controls.Tree.NodeControls.DrawEventArgs>(OnNodeDrawText);
 
-            this.Title = Properties.Resources.Content_SiteExplorer;
-            this.Description = Properties.Resources.Content_SiteExplorer;
-
             var ts = ToolbarService.CreateToolStripItems("/Maestro/Shell/SiteExplorer/Toolbar", this, true);
             tsSiteExplorer.Items.AddRange(ts);
 

Deleted: trunk/Tools/Maestro/Maestro.Base/ViewContentBase.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ViewContentBase.Designer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ViewContentBase.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,43 +0,0 @@
-namespace Maestro.Base
-{
-    partial class ViewContentBase
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.SuspendLayout();
-            // 
-            // ViewContentBase
-            // 
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
-            this.Name = "ViewContentBase";
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/ViewContentBase.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ViewContentBase.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ViewContentBase.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,262 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-using ICSharpCode.Core.WinForms;
-using ICSharpCode.Core;
-using Maestro.Shared.UI;
-
-namespace Maestro.Base
-{
-    /// <summary>
-    /// The base class of all view content. Provides the default implementation of <see cref="IViewContent"/>
-    /// </summary>
-    [ToolboxItem(false)]
-    public partial class ViewContentBase : UserControl, IViewContent
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="ViewContentBase"/> class.
-        /// </summary>
-        public ViewContentBase()
-        {
-            InitializeComponent();
-        }
-
-        private string _title;
-
-        /// <summary>
-        /// The title of the view
-        /// </summary>
-        public string Title
-        {
-            get
-            {
-                return _title;
-            }
-            set
-            {
-                if (_title != value)
-                {
-                    _title = value;
-                    var handler = this.TitleChanged;
-                    if (handler != null)
-                        handler(this, EventArgs.Empty);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Fires when the title has been changed
-        /// </summary>
-        public event EventHandler TitleChanged;
-
-        /// <summary>
-        /// Detrmines if this view can be closed by the user, note that this does not affect the <see cref="Close"/> method
-        /// in any way. All view content can still be programmatically closed if they inherit from <see cref="ViewContentBase"/> and
-        /// does not override the default implementation of <see cref="Close"/>
-        /// </summary>
-        public virtual bool AllowUserClose
-        {
-            get { return true; }
-        }
-
-        /// <summary>
-        /// Closes the view. This raises the <see cref="ViewContentClosing"/> event
-        /// </summary>
-        public virtual void Close()
-        {
-            CancelEventArgs ce = new CancelEventArgs(false);
-            var ceHandler = this.ViewContentClosing;
-            if (ceHandler != null)
-                ceHandler(this, ce);
-
-            if (ce.Cancel)
-                return;
-
-            var handler = this.ViewContentClosed;
-            if (handler != null)
-                handler(this, EventArgs.Empty);
-        }
-
-        /// <summary>
-        /// Fired when the view has been closed internally
-        /// </summary>
-        public event CancelEventHandler ViewContentClosing;
-
-        /// <summary>
-        /// Displays an exception message
-        /// </summary>
-        /// <param name="ex">The exception object</param>
-        public void ShowError(Exception ex)
-        {
-            ErrorDialog.Show(ex);
-        }
-
-        /// <summary>
-        /// Displays an error message
-        /// </summary>
-        /// <param name="message">The message</param>
-        public void ShowError(string message)
-        {
-            MessageService.ShowError(message);
-        }
-
-        /// <summary>
-        /// Displays an alert message
-        /// </summary>
-        /// <param name="title">The title of this message</param>
-        /// <param name="message">The message</param>
-        public void ShowMessage(string title, string message)
-        {
-            MessageService.ShowMessage(message, title);
-        }
-
-        /// <summary>
-        /// Make a request for confirmation
-        /// </summary>
-        /// <param name="title">The title of the confirmation message</param>
-        /// <param name="message">The message</param>
-        /// <returns>
-        /// true if confirmed, false otherwise
-        /// </returns>
-        public bool Confirm(string title, string message)
-        {
-            return MessageService.AskQuestion(message, title);
-        }
-
-        /// <summary>
-        /// Make a request for confirmation
-        /// </summary>
-        /// <param name="title">The title of the confirmation message</param>
-        /// <param name="format">The message template</param>
-        /// <param name="args">The template values</param>
-        /// <returns>
-        /// true if confirmed, false otherwise
-        /// </returns>
-        public bool ConfirmFormatted(string title, string format, params string[] args)
-        {
-            return MessageService.AskQuestion(string.Format(format, args), title);
-        }
-
-        /// <summary>
-        /// The underlying control
-        /// </summary>
-        public Control ContentControl
-        {
-            get { return this; }
-        }
-
-        private string _description;
-
-        /// <summary>
-        /// The view's description, this is the ToolTip content
-        /// </summary>
-        public string Description
-        {
-            get
-            {
-                return _description;
-            }
-            set
-            {
-                if (_description != value)
-                {
-                    _description = value;
-                    var handler = this.DescriptionChanged;
-                    if (handler != null)
-                        handler(this, EventArgs.Empty);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Raised when the description has changed
-        /// </summary>
-        public event EventHandler DescriptionChanged;
-
-        /// <summary>
-        /// Makes this content active
-        /// </summary>
-        public void Activate()
-        {
-            var handler = this.ViewContentActivating;
-            if (handler != null)
-                handler(this, EventArgs.Empty);
-        }
-
-        /// <summary>
-        /// Fired when the view is going to hide
-        /// </summary>
-        public event EventHandler ViewContentHiding;
-
-        /// <summary>
-        /// Fired when the view, which was hidden is now being shown
-        /// </summary>
-        public event EventHandler ViewContentShowing;
-
-        /// <summary>
-        /// Fired when the view is activating
-        /// </summary>
-        public event EventHandler ViewContentActivating;
-
-        /// <summary>
-        /// Conceals the control from the user.
-        /// </summary>
-        /// <PermissionSet>
-        ///   <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
-        ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
-        ///   <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence"/>
-        ///   <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
-        ///   </PermissionSet>
-        void IViewContent.Hide()
-        {
-            var handler = this.ViewContentHiding;
-            if (handler != null)
-                handler(this, EventArgs.Empty);
-        }
-
-        /// <summary>
-        /// Indicates whether this view is attached to a workbench
-        /// </summary>
-        public bool IsAttached
-        {
-            get;
-            internal set;
-        }
-
-        /// <summary>
-        /// Indicates the default region this view content will be put in
-        /// </summary>
-        public virtual ViewRegion DefaultRegion
-        {
-            get { return ViewRegion.Document; }
-        }
-
-        /// <summary>
-        /// Fired when the view has been closed internally
-        /// </summary>
-        public event EventHandler ViewContentClosed;
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/ViewContentBase.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ViewContentBase.resx	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ViewContentBase.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <data name="&gt;&gt;$this.Name" xml:space="preserve">
-    <value>ViewContentBase</value>
-  </data>
-  <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-</root>
\ No newline at end of file

Deleted: trunk/Tools/Maestro/Maestro.Base/Workbench.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Workbench.Designer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Workbench.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,47 +0,0 @@
-namespace Maestro.Base
-{
-    partial class Workbench
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Workbench));
-            this.SuspendLayout();
-            // 
-            // Workbench
-            // 
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
-            resources.ApplyResources(this, "$this");
-            this.Name = "Workbench";
-            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-    }
-}
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Base/Workbench.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Workbench.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Workbench.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,5 +1,5 @@
 #region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
+// Copyright (C) 2011, Jackie Ng
 // http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
 // 
 // This library is free software; you can redistribute it and/or
@@ -24,15 +24,13 @@
 using System.Drawing;
 using System.Text;
 using System.Windows.Forms;
-using ICSharpCode.Core.WinForms;
-using ICSharpCode.Core;
-using ICSharpCode.Core.Services;
-using Maestro.Base.UI;
 using Maestro.Base.Editor;
+using Maestro.Shared.UI;
+using Maestro.Base.UI;
 
 namespace Maestro.Base
 {
-    public sealed partial class Workbench : Form
+    public partial class Workbench : WorkbenchBase
     {
         static Workbench instance;
 
@@ -58,232 +56,16 @@
         /// <summary>
         /// Initializes the workbench.
         /// </summary>
-        public static void InitializeWorkbench()
+        public static void InitializeWorkbench(IWorkbenchInitializer init)
         {
             if (!_init)
             {
-                instance = new Workbench();
+                instance = new Workbench(init);
                 _init = true;
                 WorkbenchInitialized(instance, EventArgs.Empty);
             }
         }
 
-        MenuStrip menu;
-        ToolStripContainer toolStripContainer;
-        ToolStrip toolbar;
-        
-        StatusStrip status;
-        ToolStripStatusLabel statusLabel;
-
-        ZonedContainer contentPanel;
-
-        ContextMenuStrip ctxToolbar;
-
-        private Workbench()
-        {
-            InitializeComponent();
-
-            _toolstrips = new Dictionary<string, ToolStrip>();
-            _toolstripRegions = new Dictionary<string, ToolbarRegion>();
-
-            this.Icon = Properties.Resources.MapGuide_Maestro;
-
-            contentPanel = new ZonedContainer();
-            contentPanel.Dock = DockStyle.Fill;
-
-            contentPanel.ViewActivated += new ViewContentActivateEventHandler(OnViewActivated);
-
-            menu = new MenuStrip();
-            MenuService.AddItemsToMenu(menu.Items, this, "/Maestro/Shell/MainMenu");
-
-            toolStripContainer = new ToolStripContainer();
-            toolStripContainer.ContentPanel.Controls.Add(contentPanel);
-            toolStripContainer.Dock = DockStyle.Fill;
-
-            this.Controls.Add(toolStripContainer);
-
-            ctxToolbar = new ContextMenuStrip();
-            menu.ContextMenuStrip = ctxToolbar;
-            toolStripContainer.TopToolStripPanel.ContextMenuStrip = ctxToolbar;
-            toolStripContainer.BottomToolStripPanel.ContextMenuStrip = ctxToolbar;
-            toolStripContainer.LeftToolStripPanel.ContextMenuStrip = ctxToolbar;
-            toolStripContainer.RightToolStripPanel.ContextMenuStrip = ctxToolbar;
-
-            toolbar = ToolbarService.CreateToolStrip(this, "/Maestro/Shell/Toolbars/Main");
-            toolbar.Stretch = true;
-
-            AddToolbar("Base", toolbar, ToolbarRegion.Top, true);
-            
-            status = new StatusStrip();
-            statusLabel = new ToolStripStatusLabel();
-            status.Items.Add(statusLabel);
-
-            this.Controls.Add(menu);
-            this.Controls.Add(status);
-
-            // Use the Idle event to update the status of menu and toolbar items.
-            Application.Idle += OnApplicationIdle;
-        }
-
-        void OnViewActivated(object sender, IViewContent content)
-        {
-            //If a site explorer was activated, update our active site explorer property
-            var exp = content as ISiteExplorer;
-            if (exp != null)
-            {
-                this.ActiveSiteExplorer = exp;
-            }
-
-            var editor = content as IEditorViewContent;
-            if (editor != null)
-            {
-                this.ActiveEditor = editor;
-            }
-        }
-
-        private Dictionary<string, ToolStrip> _toolstrips;
-        private Dictionary<string, ToolbarRegion> _toolstripRegions;
-
-        /// <summary>
-        /// Adds the toolbar.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="toolbar">The toolbar.</param>
-        /// <param name="region">The region.</param>
-        /// <param name="canToggleVisibility">if set to <c>true</c> [can toggle visibility].</param>
-        public void AddToolbar(string name, ToolStrip toolbar, ToolbarRegion region, bool canToggleVisibility)
-        {
-            _toolstrips.Add(name, toolbar);
-            _toolstripRegions.Add(name, region);
-
-            if (canToggleVisibility)
-            {
-                ToolStripMenuItem item = new ToolStripMenuItem();
-                item.Text = name;
-                item.Tag = name;
-                item.Checked = true;
-                item.CheckOnClick = true;
-                item.Click += delegate
-                {
-                    SetToolbarVisibility(name, item.Checked);
-                };
-                ctxToolbar.Items.Add(item);
-            }
-
-            switch (region)
-            {
-                case ToolbarRegion.Top:
-                    toolStripContainer.TopToolStripPanel.Controls.Add(toolbar);
-                    break;
-                case ToolbarRegion.Bottom:
-                    toolStripContainer.BottomToolStripPanel.Controls.Add(toolbar);
-                    break;
-                case ToolbarRegion.Left:
-                    toolStripContainer.LeftToolStripPanel.Controls.Add(toolbar);
-                    break;
-                case ToolbarRegion.Right:
-                    toolStripContainer.RightToolStripPanel.Controls.Add(toolbar);
-                    break;
-            }
-        }
-
-        /// <summary>
-        /// Sets the toolbar visibility.
-        /// </summary>
-        /// <param name="toolbarName">Name of the toolbar.</param>
-        /// <param name="visible">if set to <c>true</c> [visible].</param>
-        public void SetToolbarVisibility(string toolbarName, bool visible)
-        {
-            ToolStrip strip = GetToolbar(toolbarName);
-            if (strip != null)
-            {
-                ToolbarRegion region = _toolstripRegions[toolbarName];
-                if (visible)
-                {
-                    switch (region)
-                    {
-                        case ToolbarRegion.Bottom:
-                            toolStripContainer.BottomToolStripPanel.Controls.Add(strip);
-                            break;
-                        case ToolbarRegion.Left:
-                            toolStripContainer.LeftToolStripPanel.Controls.Add(strip);
-                            break;
-                        case ToolbarRegion.Right:
-                            toolStripContainer.RightToolStripPanel.Controls.Add(strip);
-                            break;
-                        case ToolbarRegion.Top:
-                            toolStripContainer.TopToolStripPanel.Controls.Add(strip);
-                            break;
-                    }
-                }
-                else
-                {
-                    switch (region)
-                    {
-                        case ToolbarRegion.Bottom:
-                            toolStripContainer.BottomToolStripPanel.Controls.Remove(strip);
-                            break;
-                        case ToolbarRegion.Left:
-                            toolStripContainer.LeftToolStripPanel.Controls.Remove(strip);
-                            break;
-                        case ToolbarRegion.Right:
-                            toolStripContainer.RightToolStripPanel.Controls.Remove(strip);
-                            break;
-                        case ToolbarRegion.Top:
-                            toolStripContainer.TopToolStripPanel.Controls.Remove(strip);
-                            break;
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// Gets the toolbar.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <returns></returns>
-        public ToolStrip GetToolbar(string name)
-        {
-            if (_toolstrips.ContainsKey(name))
-                return _toolstrips[name];
-            return null;
-        }
-
-        /// <summary>
-        /// Gets the toolbar names.
-        /// </summary>
-        /// <value>The toolbar names.</value>
-        public ICollection<string> ToolbarNames
-        {
-            get { return _toolstrips.Keys; }
-        }
-
-        /// <summary>
-        /// Sets the status label.
-        /// </summary>
-        /// <param name="text">The text.</param>
-        public void SetStatusLabel(string text)
-        {
-            statusLabel.Text = text;
-        }
-
-        /// <summary>
-        /// Sets the title.
-        /// </summary>
-        /// <param name="title">The title.</param>
-        public void SetTitle(string title)
-        {
-            this.Text = title;
-        }
-
-        /// <summary>
-        /// Gets the active view in the document region
-        /// </summary>
-        public IViewContent ActiveDocumentView
-        {
-            get { return contentPanel.ActiveDocumentView; }
-        }
-
         private ISiteExplorer _siteExp;
 
         /// <summary>
@@ -300,8 +82,6 @@
                 {
                     current.Close();
                     CheckContainerStatus();
-                    //TODO: When we do support multiple repos we'll need to find and activate the next open
-                    //ISiteExplorer in the ZonedContainer and designate that as the ActiveSiteExplorer
                 }
             }
         }
@@ -312,83 +92,22 @@
             private set;
         }
 
-        /// <summary>
-        /// Shows the content.
-        /// </summary>
-        /// <param name="vc">The vc.</param>
-        internal void ShowContent(IViewContent vc)
+        protected override void OnViewActivated(object sender, IViewContent content)
         {
-            switch (vc.DefaultRegion)
+            //If a site explorer was activated, update our active site explorer property
+            var exp = content as ISiteExplorer;
+            if (exp != null)
             {
-                case ViewRegion.Bottom:
-                case ViewRegion.Left:
-                case ViewRegion.Right:
-                case ViewRegion.Document:
-                    contentPanel.AddContent(vc);
-                    var vcb = vc as ViewContentBase;
-                    if (vcb != null)
-                        vcb.IsAttached = true;
-                    break;
-                case ViewRegion.Floating:
-                    throw new NotImplementedException();
-                case ViewRegion.Dialog:
-                    throw new NotImplementedException();
+                this.ActiveSiteExplorer = exp;
             }
-        }
 
-        internal void CheckContainerStatus()
-        {
-            contentPanel.CheckContainerStatus();
-        }
-
-        void OnApplicationIdle(object sender, EventArgs e)
-        {
-            // Use the Idle event to update the status of menu and toolbar.
-            // Depending on your application and the number of menu items with complex conditions,
-            // you might want to update the status less frequently.
-            UpdateMenuItemStatus();
-        }
-
-        /// <summary>Update Enabled/Visible state of items in the main menu based on conditions</summary>
-        void UpdateMenuItemStatus()
-        {
-            foreach (ToolStripItem item in menu.Items)
+            var editor = content as IEditorViewContent;
+            if (editor != null)
             {
-                if (item is IStatusUpdate)
-                    (item as IStatusUpdate).UpdateStatus();
+                this.ActiveEditor = editor;
             }
-
-            foreach (ToolStrip ts in _toolstrips.Values)
-            {
-                foreach (ToolStripItem item in ts.Items)
-                {
-                    if (item is IStatusUpdate)
-                        (item as IStatusUpdate).UpdateStatus();
-                }
-            }
         }
-    }
 
-    /// <summary>
-    /// Defines the valid regions a toolbar can reside on a workbench
-    /// </summary>
-    public enum ToolbarRegion
-    {
-        /// <summary>
-        /// On the top
-        /// </summary>
-        Top,
-        /// <summary>
-        /// On the left
-        /// </summary>
-        Left,
-        /// <summary>
-        /// On the right
-        /// </summary>
-        Right,
-        /// <summary>
-        /// On the bottom
-        /// </summary>
-        Bottom
+        public Workbench(IWorkbenchInitializer init) : base(init) { }
     }
 }

Deleted: trunk/Tools/Maestro/Maestro.Base/Workbench.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Workbench.resx	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/Workbench.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
-    <value>792, 566</value>
-  </data>
-  <data name="&gt;&gt;$this.Name" xml:space="preserve">
-    <value>Workbench</value>
-  </data>
-  <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-</root>
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.Base/WorkbenchInitializer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/WorkbenchInitializer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Base/WorkbenchInitializer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,77 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Maestro.Shared.UI;
+using ICSharpCode.Core.WinForms;
+using System.Windows.Forms;
+using Maestro.Base.Services;
+
+namespace Maestro.Base
+{
+    public class WorkbenchInitializer : IWorkbenchInitializer
+    {
+        public System.Drawing.Icon GetIcon()
+        {
+            return Properties.Resources.MapGuide_Maestro;
+        }
+
+        public void UpdateMenuItemStatus(MenuStrip menu, IEnumerable<ToolStrip> toolstrips)
+        {
+            foreach (ToolStripItem item in menu.Items)
+            {
+                if (item is IStatusUpdate)
+                    (item as IStatusUpdate).UpdateStatus();
+            }
+
+            foreach (ToolStrip ts in toolstrips)
+            {
+                foreach (ToolStripItem item in ts.Items)
+                {
+                    if (item is IStatusUpdate)
+                        (item as IStatusUpdate).UpdateStatus();
+                }
+            }
+        }
+
+        public MenuStrip GetMainMenu(WorkbenchBase workbench)
+        {
+            var menu = new System.Windows.Forms.MenuStrip();
+            MenuService.AddItemsToMenu(menu.Items, workbench, "/Maestro/Shell/MainMenu");
+            return menu;
+        }
+
+        public ToolStrip GetMainToolStrip(WorkbenchBase workbench)
+        {
+            return ToolbarService.CreateToolStrip(workbench, "/Maestro/Shell/Toolbars/Main");
+        }
+
+        public IViewContentManager GetViewContentManager()
+        {
+            return ServiceRegistry.GetService<ViewContentManager>();
+        }
+
+        public System.Drawing.Image GetDocumentCloseIcon()
+        {
+            return Properties.Resources.cross_small;
+        }
+    }
+}

Deleted: trunk/Tools/Maestro/Maestro.Base/ZonedContainer.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ZonedContainer.Designer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ZonedContainer.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,247 +0,0 @@
-namespace Maestro.Base
-{
-    partial class ZonedContainer
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.components = new System.ComponentModel.Container();
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ZonedContainer));
-            this.docRightContainer = new System.Windows.Forms.SplitContainer();
-            this.docBottomContainer = new System.Windows.Forms.SplitContainer();
-            this.documentTabs = new System.Windows.Forms.TabControl();
-            this.docImgList = new System.Windows.Forms.ImageList(this.components);
-            this.bottomZone = new System.Windows.Forms.TabControl();
-            this.bottomImgList = new System.Windows.Forms.ImageList(this.components);
-            this.rightZone = new System.Windows.Forms.TabControl();
-            this.rightImgList = new System.Windows.Forms.ImageList(this.components);
-            this.topContainer = new System.Windows.Forms.SplitContainer();
-            this.leftZone = new System.Windows.Forms.TabControl();
-            this.leftImgList = new System.Windows.Forms.ImageList(this.components);
-            this.ctxDocumentTabs = new System.Windows.Forms.ContextMenuStrip(this.components);
-            this.closeTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.closeAllButThisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.closeAllTabsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.docRightContainer.Panel1.SuspendLayout();
-            this.docRightContainer.Panel2.SuspendLayout();
-            this.docRightContainer.SuspendLayout();
-            this.docBottomContainer.Panel1.SuspendLayout();
-            this.docBottomContainer.Panel2.SuspendLayout();
-            this.docBottomContainer.SuspendLayout();
-            this.topContainer.Panel1.SuspendLayout();
-            this.topContainer.Panel2.SuspendLayout();
-            this.topContainer.SuspendLayout();
-            this.ctxDocumentTabs.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // docRightContainer
-            // 
-            resources.ApplyResources(this.docRightContainer, "docRightContainer");
-            this.docRightContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
-            this.docRightContainer.Name = "docRightContainer";
-            // 
-            // docRightContainer.Panel1
-            // 
-            this.docRightContainer.Panel1.Controls.Add(this.docBottomContainer);
-            resources.ApplyResources(this.docRightContainer.Panel1, "docRightContainer.Panel1");
-            // 
-            // docRightContainer.Panel2
-            // 
-            this.docRightContainer.Panel2.Controls.Add(this.rightZone);
-            resources.ApplyResources(this.docRightContainer.Panel2, "docRightContainer.Panel2");
-            // 
-            // docBottomContainer
-            // 
-            resources.ApplyResources(this.docBottomContainer, "docBottomContainer");
-            this.docBottomContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
-            this.docBottomContainer.Name = "docBottomContainer";
-            // 
-            // docBottomContainer.Panel1
-            // 
-            this.docBottomContainer.Panel1.Controls.Add(this.documentTabs);
-            resources.ApplyResources(this.docBottomContainer.Panel1, "docBottomContainer.Panel1");
-            // 
-            // docBottomContainer.Panel2
-            // 
-            this.docBottomContainer.Panel2.Controls.Add(this.bottomZone);
-            resources.ApplyResources(this.docBottomContainer.Panel2, "docBottomContainer.Panel2");
-            // 
-            // documentTabs
-            // 
-            resources.ApplyResources(this.documentTabs, "documentTabs");
-            this.documentTabs.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
-            this.documentTabs.HotTrack = true;
-            this.documentTabs.ImageList = this.docImgList;
-            this.documentTabs.Name = "documentTabs";
-            this.documentTabs.SelectedIndex = 0;
-            this.documentTabs.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
-            this.documentTabs.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
-            this.documentTabs.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            this.documentTabs.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            // 
-            // docImgList
-            // 
-            this.docImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-            resources.ApplyResources(this.docImgList, "docImgList");
-            this.docImgList.TransparentColor = System.Drawing.Color.Transparent;
-            // 
-            // bottomZone
-            // 
-            resources.ApplyResources(this.bottomZone, "bottomZone");
-            this.bottomZone.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
-            this.bottomZone.HotTrack = true;
-            this.bottomZone.ImageList = this.bottomImgList;
-            this.bottomZone.Name = "bottomZone";
-            this.bottomZone.SelectedIndex = 0;
-            this.bottomZone.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
-            this.bottomZone.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
-            this.bottomZone.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            this.bottomZone.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            // 
-            // bottomImgList
-            // 
-            this.bottomImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-            resources.ApplyResources(this.bottomImgList, "bottomImgList");
-            this.bottomImgList.TransparentColor = System.Drawing.Color.Transparent;
-            // 
-            // rightZone
-            // 
-            resources.ApplyResources(this.rightZone, "rightZone");
-            this.rightZone.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
-            this.rightZone.HotTrack = true;
-            this.rightZone.ImageList = this.rightImgList;
-            this.rightZone.Name = "rightZone";
-            this.rightZone.SelectedIndex = 0;
-            this.rightZone.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
-            this.rightZone.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
-            this.rightZone.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            this.rightZone.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            // 
-            // rightImgList
-            // 
-            this.rightImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-            resources.ApplyResources(this.rightImgList, "rightImgList");
-            this.rightImgList.TransparentColor = System.Drawing.Color.Transparent;
-            // 
-            // topContainer
-            // 
-            resources.ApplyResources(this.topContainer, "topContainer");
-            this.topContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
-            this.topContainer.Name = "topContainer";
-            // 
-            // topContainer.Panel1
-            // 
-            this.topContainer.Panel1.Controls.Add(this.leftZone);
-            // 
-            // topContainer.Panel2
-            // 
-            this.topContainer.Panel2.Controls.Add(this.docRightContainer);
-            // 
-            // leftZone
-            // 
-            resources.ApplyResources(this.leftZone, "leftZone");
-            this.leftZone.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
-            this.leftZone.HotTrack = true;
-            this.leftZone.ImageList = this.leftImgList;
-            this.leftZone.Name = "leftZone";
-            this.leftZone.SelectedIndex = 0;
-            this.leftZone.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
-            this.leftZone.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
-            this.leftZone.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            this.leftZone.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
-            // 
-            // leftImgList
-            // 
-            this.leftImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-            resources.ApplyResources(this.leftImgList, "leftImgList");
-            this.leftImgList.TransparentColor = System.Drawing.Color.Transparent;
-            // 
-            // ctxDocumentTabs
-            // 
-            this.ctxDocumentTabs.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.closeTabToolStripMenuItem,
-            this.closeAllButThisToolStripMenuItem,
-            this.closeAllTabsToolStripMenuItem});
-            this.ctxDocumentTabs.Name = "ctxDocumentTabs";
-            resources.ApplyResources(this.ctxDocumentTabs, "ctxDocumentTabs");
-            // 
-            // closeTabToolStripMenuItem
-            // 
-            this.closeTabToolStripMenuItem.Name = "closeTabToolStripMenuItem";
-            resources.ApplyResources(this.closeTabToolStripMenuItem, "closeTabToolStripMenuItem");
-            this.closeTabToolStripMenuItem.Click += new System.EventHandler(this.closeTabToolStripMenuItem_Click);
-            // 
-            // closeAllButThisToolStripMenuItem
-            // 
-            this.closeAllButThisToolStripMenuItem.Name = "closeAllButThisToolStripMenuItem";
-            resources.ApplyResources(this.closeAllButThisToolStripMenuItem, "closeAllButThisToolStripMenuItem");
-            this.closeAllButThisToolStripMenuItem.Click += new System.EventHandler(this.closeAllButThisToolStripMenuItem_Click);
-            // 
-            // closeAllTabsToolStripMenuItem
-            // 
-            this.closeAllTabsToolStripMenuItem.Name = "closeAllTabsToolStripMenuItem";
-            resources.ApplyResources(this.closeAllTabsToolStripMenuItem, "closeAllTabsToolStripMenuItem");
-            this.closeAllTabsToolStripMenuItem.Click += new System.EventHandler(this.closeAllTabsToolStripMenuItem_Click);
-            // 
-            // ZonedContainer
-            // 
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
-            this.Controls.Add(this.topContainer);
-            this.Name = "ZonedContainer";
-            resources.ApplyResources(this, "$this");
-            this.docRightContainer.Panel1.ResumeLayout(false);
-            this.docRightContainer.Panel2.ResumeLayout(false);
-            this.docRightContainer.ResumeLayout(false);
-            this.docBottomContainer.Panel1.ResumeLayout(false);
-            this.docBottomContainer.Panel2.ResumeLayout(false);
-            this.docBottomContainer.ResumeLayout(false);
-            this.topContainer.Panel1.ResumeLayout(false);
-            this.topContainer.Panel2.ResumeLayout(false);
-            this.topContainer.ResumeLayout(false);
-            this.ctxDocumentTabs.ResumeLayout(false);
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.SplitContainer topContainer;
-        private System.Windows.Forms.SplitContainer docRightContainer;
-        private System.Windows.Forms.SplitContainer docBottomContainer;
-        private System.Windows.Forms.TabControl documentTabs;
-        private System.Windows.Forms.TabControl leftZone;
-        private System.Windows.Forms.TabControl bottomZone;
-        private System.Windows.Forms.TabControl rightZone;
-        private System.Windows.Forms.ImageList leftImgList;
-        private System.Windows.Forms.ImageList rightImgList;
-        private System.Windows.Forms.ImageList docImgList;
-        private System.Windows.Forms.ImageList bottomImgList;
-        private System.Windows.Forms.ContextMenuStrip ctxDocumentTabs;
-        private System.Windows.Forms.ToolStripMenuItem closeTabToolStripMenuItem;
-        private System.Windows.Forms.ToolStripMenuItem closeAllButThisToolStripMenuItem;
-        private System.Windows.Forms.ToolStripMenuItem closeAllTabsToolStripMenuItem;
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/ZonedContainer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ZonedContainer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ZonedContainer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,291 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-using System.Windows.Forms.VisualStyles;
-using Maestro.Base.Services;
-using OSGeo.MapGuide.MaestroAPI;
-
-namespace Maestro.Base
-{
-    public delegate void ViewContentActivateEventHandler(object sender, IViewContent content);
-
-    internal partial class ZonedContainer : UserControl
-    {
-        public ZonedContainer()
-        {
-            InitializeComponent();
-        }
-
-        public IViewContent ActiveDocumentView
-        {
-            get
-            {
-                if (documentTabs.TabCount == 0)
-                    return null;
-
-                var indx = documentTabs.SelectedIndex;
-                if (indx >= 0)
-                {
-                    var page = documentTabs.TabPages[indx];
-                    var cnt = (IViewContent)page.Tag;
-                    return cnt;
-                }
-                return null;
-            }
-        }
-
-        public event ViewContentActivateEventHandler ViewActivated;
-
-        protected override void OnLoad(EventArgs e)
-        {
-            base.OnLoad(e);
-
-            CheckContainerStatus();
-
-            var mgr = ServiceRegistry.GetService<ViewContentManager>();
-            mgr.ViewHidden += new EventHandler(OnViewHidden);
-        }
-
-        void OnViewHidden(object sender, EventArgs e)
-        {
-            CheckContainerStatus();
-        }
-
-        private IEnumerable<TabControl> AllTabs()
-        {
-            yield return bottomZone;
-            yield return documentTabs;
-            yield return leftZone;
-            yield return rightZone;
-        }
-
-        internal void CheckContainerStatus()
-        {
-            docBottomContainer.Panel2Collapsed = (bottomZone.TabPages.Count == 0);
-            topContainer.Panel1Collapsed = (leftZone.TabPages.Count == 0);
-            docRightContainer.Panel2Collapsed = (rightZone.TabPages.Count == 0) ;
-        }
-
-        public void AddContent(IViewContent content)
-        {
-            TabControl zone = null;
-            ImageList zoneImgList = null;
-            switch (content.DefaultRegion)
-            {
-                case ViewRegion.Bottom:
-                    zone = bottomZone;
-                    zoneImgList = bottomImgList;
-                    break;
-                case ViewRegion.Document:
-                    zone = documentTabs;
-                    zoneImgList = docImgList;
-                    break;
-                case ViewRegion.Left:
-                    zone = leftZone;
-                    zoneImgList = leftImgList;
-                    break;
-                case ViewRegion.Right:
-                    zone = rightZone;
-                    zoneImgList = rightImgList;
-                    break;
-                default: //Something further up should've handled this
-                    throw new InvalidOperationException("Not zoned content");
-            }
-
-            var page = TabFactory.CreateTab(content, null);
-            zone.TabPages.Add(page);
-            var idx = zone.TabPages.IndexOf(page);
-            if (zone.SelectedIndex != idx)
-                zone.SelectedIndex = idx;
-            else
-                OnViewActivated(content);
-
-            CheckContainerStatus();
-        }
-
-        // Close button on tabs implementation
-        //
-        // http://www.dotnetspider.com/resources/29206-Custom-drawn-Close-button-TabControl.aspx
-
-        private Point _imageLocation = new Point(17, 4);
-        private Point _imgHitArea = new Point(15, 2);
-
-        private void ZoneDrawItem(object sender, DrawItemEventArgs e)
-        {
-            TabControl tab = (TabControl)sender;
-            //The tag specifies whether the user can manually close this tab
-            var page = tab.TabPages[e.Index];
-
-            bool draw = (page.Tag != null && ((IViewContent)page.Tag).AllowUserClose);
-
-            try
-            {
-                Rectangle r = e.Bounds;
-                r = tab.GetTabRect(e.Index);
-                r.Offset(2, 2);
-
-                Brush TitleBrush = new SolidBrush(Color.Black);
-                Font f = this.Font;
-
-                string title = page.Text;
-
-                var tabRect = tab.GetTabRect(e.Index);
-
-                if (e.Index == tab.SelectedIndex)
-                    e.Graphics.FillRectangle(new SolidBrush(SystemColors.ControlLightLight), tabRect);
-                else
-                    e.Graphics.FillRectangle(new SolidBrush(SystemColors.ControlLight), tabRect);
-
-                e.Graphics.DrawString(title, f, TitleBrush, new Point(r.X, r.Y));
-
-                if (draw)
-                {
-                    //Close Image to draw
-                    Image img = Properties.Resources.cross_small;
-                    e.Graphics.DrawImage(img, new Point(r.X + (tab.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y));
-                }
-            }
-            catch { }
-        }
-
-        private void ZoneMouseClick(object sender, MouseEventArgs e)
-        {
-            try
-            {
-                TabControl tc = (TabControl)sender;
-                Point p = e.Location;
-                int _tabWidth = 0;
-                _tabWidth = tc.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
-                Rectangle r = tc.GetTabRect(tc.SelectedIndex);
-                r.Offset(_tabWidth, _imgHitArea.Y);
-                r.Width = 16;
-                r.Height = 16;
-                if (r.Contains(p))
-                {
-                    TabPage page = (TabPage)tc.TabPages[tc.SelectedIndex];
-                    //The tag specifies whether the user can manually close this tab
-                    if (page.Tag != null && ((IViewContent)page.Tag).AllowUserClose)
-                    {
-                        ((IViewContent)page.Tag).Close();
-                    }
-                }
-                else
-                {
-                    if (e.Button == MouseButtons.Right)
-                    {
-                        var pt = new Point(e.X, e.Y);
-                        for (int i = 0; i < tc.TabPages.Count; i++)
-                        {
-                            if (tc.GetTabRect(i).Contains(pt))
-                            {
-                                tc.SelectedIndex = i;
-                                break;
-                            }
-                        }
-
-                        if (this.DocumentTabContextMenuEnabled)
-                            return;
-
-                        ctxDocumentTabs.Show(tc, pt);
-                    }
-                }
-            }
-            catch { }
-        }
-
-        private void OnViewActivated(IViewContent content)
-        {
-            var handler = this.ViewActivated;
-            if (handler != null)
-                handler(this, content);
-        }
-
-        private void ZoneTabSelectedIndexChanged(object sender, EventArgs e)
-        {
-            TabControl tabs = (TabControl)sender;
-            var indx = tabs.SelectedIndex;
-            if (indx >= 0)
-            {
-                TabPage page = tabs.TabPages[indx];
-                OnViewActivated((IViewContent)page.Tag);
-            }
-        }
-
-        private void closeTabToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            if (this.DocumentTabContextMenuEnabled || documentTabs.SelectedIndex < 0)
-                return;
-
-            var tab = documentTabs.TabPages[documentTabs.SelectedIndex];
-            ((IViewContent)tab.Tag).Close();
-        }
-
-        private void closeAllButThisToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            if (this.DocumentTabContextMenuEnabled || documentTabs.SelectedIndex < 0)
-                return;
-
-            var tabs = new List<TabPage>();
-            for (int i = 0; i < documentTabs.TabPages.Count; i++)
-            {
-                if (i == documentTabs.SelectedIndex)
-                    continue;
-
-                var tab = documentTabs.TabPages[i];
-                tabs.Add(tab);
-            }
-            foreach (var tab in tabs)
-            {
-                ((IViewContent)tab.Tag).Close();
-            }
-        }
-
-        private void closeAllTabsToolStripMenuItem_Click(object sender, EventArgs e)
-        {
-            if (this.DocumentTabContextMenuEnabled)
-                return;
-
-            var tabs = new List<TabPage>();
-            for (int i = 0; i < documentTabs.TabPages.Count; i++)
-            {
-                var tab = documentTabs.TabPages[i];
-                tabs.Add(tab);
-            }
-            foreach (var tab in tabs)
-            {
-                ((IViewContent)tab.Tag).Close();
-            }
-        }
-
-        [DefaultValue(true)]
-        [Description("Indicates whether the document tabs context menu is enabled")]
-        public bool DocumentTabContextMenuEnabled
-        {
-            get;
-            set;
-        }
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/ZonedContainer.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/ZonedContainer.resx	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Base/ZonedContainer.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,531 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="docRightContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="docRightContainer.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="docBottomContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <data name="docBottomContainer.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="docBottomContainer.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
-    <value>Horizontal</value>
-  </data>
-  <data name="documentTabs.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <metadata name="docImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>239, 17</value>
-  </metadata>
-  <data name="docImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
-    <value>16, 16</value>
-  </data>
-  <data name="documentTabs.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="documentTabs.Padding" type="System.Drawing.Point, System.Drawing">
-    <value>12, 3</value>
-  </data>
-  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="documentTabs.ShowToolTips" type="System.Boolean, mscorlib">
-    <value>True</value>
-  </data>
-  <data name="documentTabs.Size" type="System.Drawing.Size, System.Drawing">
-    <value>240, 259</value>
-  </data>
-  <data name="documentTabs.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;documentTabs.Name" xml:space="preserve">
-    <value>documentTabs</value>
-  </data>
-  <data name="&gt;&gt;documentTabs.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;documentTabs.Parent" xml:space="preserve">
-    <value>docBottomContainer.Panel1</value>
-  </data>
-  <data name="&gt;&gt;documentTabs.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="docBottomContainer.Panel1.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
-    <value>No</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel1.Name" xml:space="preserve">
-    <value>docBottomContainer.Panel1</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel1.Parent" xml:space="preserve">
-    <value>docBottomContainer</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel1.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="bottomZone.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <metadata name="bottomImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>350, 17</value>
-  </metadata>
-  <data name="bottomImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
-    <value>16, 16</value>
-  </data>
-  <data name="bottomZone.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="bottomZone.Padding" type="System.Drawing.Point, System.Drawing">
-    <value>12, 3</value>
-  </data>
-  <data name="bottomZone.ShowToolTips" type="System.Boolean, mscorlib">
-    <value>True</value>
-  </data>
-  <data name="bottomZone.Size" type="System.Drawing.Size, System.Drawing">
-    <value>240, 181</value>
-  </data>
-  <data name="bottomZone.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;bottomZone.Name" xml:space="preserve">
-    <value>bottomZone</value>
-  </data>
-  <data name="&gt;&gt;bottomZone.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;bottomZone.Parent" xml:space="preserve">
-    <value>docBottomContainer.Panel2</value>
-  </data>
-  <data name="&gt;&gt;bottomZone.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="docBottomContainer.Panel2.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
-    <value>No</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel2.Name" xml:space="preserve">
-    <value>docBottomContainer.Panel2</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel2.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel2.Parent" xml:space="preserve">
-    <value>docBottomContainer</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Panel2.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
-  <data name="docBottomContainer.Panel2MinSize" type="System.Int32, mscorlib">
-    <value>100</value>
-  </data>
-  <data name="docBottomContainer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>240, 444</value>
-  </data>
-  <data name="docBottomContainer.SplitterDistance" type="System.Int32, mscorlib">
-    <value>259</value>
-  </data>
-  <data name="docBottomContainer.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Name" xml:space="preserve">
-    <value>docBottomContainer</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.Parent" xml:space="preserve">
-    <value>docRightContainer.Panel1</value>
-  </data>
-  <data name="&gt;&gt;docBottomContainer.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="docRightContainer.Panel1.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
-    <value>No</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel1.Name" xml:space="preserve">
-    <value>docRightContainer.Panel1</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel1.Parent" xml:space="preserve">
-    <value>docRightContainer</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel1.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="docRightContainer.Panel1MinSize" type="System.Int32, mscorlib">
-    <value>240</value>
-  </data>
-  <data name="rightZone.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <metadata name="rightImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>122, 17</value>
-  </metadata>
-  <data name="rightImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
-    <value>16, 16</value>
-  </data>
-  <data name="rightZone.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="rightZone.Padding" type="System.Drawing.Point, System.Drawing">
-    <value>12, 3</value>
-  </data>
-  <data name="rightZone.ShowToolTips" type="System.Boolean, mscorlib">
-    <value>True</value>
-  </data>
-  <data name="rightZone.Size" type="System.Drawing.Size, System.Drawing">
-    <value>138, 444</value>
-  </data>
-  <data name="rightZone.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;rightZone.Name" xml:space="preserve">
-    <value>rightZone</value>
-  </data>
-  <data name="&gt;&gt;rightZone.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;rightZone.Parent" xml:space="preserve">
-    <value>docRightContainer.Panel2</value>
-  </data>
-  <data name="&gt;&gt;rightZone.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="docRightContainer.Panel2.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
-    <value>No</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel2.Name" xml:space="preserve">
-    <value>docRightContainer.Panel2</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel2.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel2.Parent" xml:space="preserve">
-    <value>docRightContainer</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Panel2.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
-  <data name="docRightContainer.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
-    <value>No</value>
-  </data>
-  <data name="docRightContainer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>382, 444</value>
-  </data>
-  <data name="docRightContainer.SplitterDistance" type="System.Int32, mscorlib">
-    <value>240</value>
-  </data>
-  <data name="docRightContainer.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Name" xml:space="preserve">
-    <value>docRightContainer</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.Parent" xml:space="preserve">
-    <value>topContainer.Panel2</value>
-  </data>
-  <data name="&gt;&gt;docRightContainer.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="topContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <data name="topContainer.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="leftZone.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <metadata name="leftImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <data name="leftImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
-    <value>16, 16</value>
-  </data>
-  <data name="leftZone.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="leftZone.Padding" type="System.Drawing.Point, System.Drawing">
-    <value>12, 3</value>
-  </data>
-  <data name="leftZone.ShowToolTips" type="System.Boolean, mscorlib">
-    <value>True</value>
-  </data>
-  <data name="leftZone.Size" type="System.Drawing.Size, System.Drawing">
-    <value>240, 444</value>
-  </data>
-  <data name="leftZone.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;leftZone.Name" xml:space="preserve">
-    <value>leftZone</value>
-  </data>
-  <data name="&gt;&gt;leftZone.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;leftZone.Parent" xml:space="preserve">
-    <value>topContainer.Panel1</value>
-  </data>
-  <data name="&gt;&gt;leftZone.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel1.Name" xml:space="preserve">
-    <value>topContainer.Panel1</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel1.Parent" xml:space="preserve">
-    <value>topContainer</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel1.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
-  <data name="topContainer.Panel1MinSize" type="System.Int32, mscorlib">
-    <value>240</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel2.Name" xml:space="preserve">
-    <value>topContainer.Panel2</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel2.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel2.Parent" xml:space="preserve">
-    <value>topContainer</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Panel2.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
-  <data name="topContainer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>626, 444</value>
-  </data>
-  <data name="topContainer.SplitterDistance" type="System.Int32, mscorlib">
-    <value>240</value>
-  </data>
-  <data name="topContainer.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Name" xml:space="preserve">
-    <value>topContainer</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Type" xml:space="preserve">
-    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;topContainer.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name="&gt;&gt;topContainer.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
-  <metadata name="ctxDocumentTabs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>482, 17</value>
-  </metadata>
-  <data name="closeTabToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
-    <value>166, 22</value>
-  </data>
-  <data name="closeTabToolStripMenuItem.Text" xml:space="preserve">
-    <value>Close</value>
-  </data>
-  <data name="closeAllButThisToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
-    <value>166, 22</value>
-  </data>
-  <data name="closeAllButThisToolStripMenuItem.Text" xml:space="preserve">
-    <value>Close All But This</value>
-  </data>
-  <data name="closeAllTabsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
-    <value>166, 22</value>
-  </data>
-  <data name="closeAllTabsToolStripMenuItem.Text" xml:space="preserve">
-    <value>Close All Tabs</value>
-  </data>
-  <data name="ctxDocumentTabs.Size" type="System.Drawing.Size, System.Drawing">
-    <value>167, 92</value>
-  </data>
-  <data name="&gt;&gt;ctxDocumentTabs.Name" xml:space="preserve">
-    <value>ctxDocumentTabs</value>
-  </data>
-  <data name="&gt;&gt;ctxDocumentTabs.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
-    <value>626, 444</value>
-  </data>
-  <data name="&gt;&gt;docImgList.Name" xml:space="preserve">
-    <value>docImgList</value>
-  </data>
-  <data name="&gt;&gt;docImgList.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;bottomImgList.Name" xml:space="preserve">
-    <value>bottomImgList</value>
-  </data>
-  <data name="&gt;&gt;bottomImgList.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;rightImgList.Name" xml:space="preserve">
-    <value>rightImgList</value>
-  </data>
-  <data name="&gt;&gt;rightImgList.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;leftImgList.Name" xml:space="preserve">
-    <value>leftImgList</value>
-  </data>
-  <data name="&gt;&gt;leftImgList.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;closeTabToolStripMenuItem.Name" xml:space="preserve">
-    <value>closeTabToolStripMenuItem</value>
-  </data>
-  <data name="&gt;&gt;closeTabToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;closeAllButThisToolStripMenuItem.Name" xml:space="preserve">
-    <value>closeAllButThisToolStripMenuItem</value>
-  </data>
-  <data name="&gt;&gt;closeAllButThisToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;closeAllTabsToolStripMenuItem.Name" xml:space="preserve">
-    <value>closeAllTabsToolStripMenuItem</value>
-  </data>
-  <data name="&gt;&gt;closeAllTabsToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;$this.Name" xml:space="preserve">
-    <value>ZonedContainer</value>
-  </data>
-  <data name="&gt;&gt;$this.Type" xml:space="preserve">
-    <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-</root>
\ No newline at end of file

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ISubView.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ISubView.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ISubView.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ISubView.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    /// <summary>
+    /// A control sub view
+    /// </summary>
+    public interface ISubView
+    {
+        /// <summary>
+        /// The underlying control
+        /// </summary>
+        Control ContentControl { get; }
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/IViewContent.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/IViewContent.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/IViewContent.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/IViewContent.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,159 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.ComponentModel;
+
+namespace Maestro.Shared.UI
+{
+    /// <summary>
+    /// Abstract view interface.
+    /// </summary>
+    public interface IViewContent : ISubView
+    {
+        /// <summary>
+        /// The title of the view
+        /// </summary>
+        string Title { get; set; }
+        /// <summary>
+        /// The view's description, this is the ToolTip content
+        /// </summary>
+        string Description { get; set; }
+        /// <summary>
+        /// Raised when the description has changed
+        /// </summary>
+        event EventHandler DescriptionChanged;
+        /// <summary>
+        /// Fires when the title has been changed
+        /// </summary>
+        event EventHandler TitleChanged;
+        /// <summary>
+        /// Detrmines if this view can be closed by the user, note that this does not affect the <see cref="Close"/> method
+        /// in any way. All view content can still be programmatically closed if they inherit from <see cref="ViewContentBase"/> and
+        /// does not override the default implementation of <see cref="Close"/>
+        /// </summary>
+        bool AllowUserClose { get; }
+        /// <summary>
+        /// Makes this content active
+        /// </summary>
+        void Activate();
+        /// <summary>
+        /// Hides this view content. Can only be called when 
+        /// </summary>
+        void Hide();
+        /// <summary>
+        /// Closes the view. This raises the <see cref="ViewContentClosing"/> event
+        /// </summary>
+        /// <returns></returns>
+        void Close();
+        /// <summary>
+        /// Fired when the view is activating
+        /// </summary>
+        event EventHandler ViewContentActivating;
+        /// <summary>
+        /// Fired when the view has been closed internally
+        /// </summary>
+        event CancelEventHandler ViewContentClosing;
+        /// <summary>
+        /// Fired when the view has been closed internally
+        /// </summary>
+        event EventHandler ViewContentClosed;
+        /// <summary>
+        /// Fired when the view is going to hide
+        /// </summary>
+        event EventHandler ViewContentHiding;
+        /// <summary>
+        /// Fired when the view, which was hidden is now being shown 
+        /// </summary>
+        event EventHandler ViewContentShowing;
+        /// <summary>
+        /// Displays an exception message
+        /// </summary>
+        /// <param name="ex">The exception object</param>
+        void ShowError(Exception ex);
+        /// <summary>
+        /// Displays an error message
+        /// </summary>
+        /// <param name="message">The message</param>
+        void ShowError(string message);
+        /// <summary>
+        /// Displays an alert message
+        /// </summary>
+        /// <param name="title">The title of this message</param>
+        /// <param name="message">The message</param>
+        void ShowMessage(string title, string message);
+        /// <summary>
+        /// Make a request for confirmation
+        /// </summary>
+        /// <param name="title">The title of the confirmation message</param>
+        /// <param name="message">The message</param>
+        /// <returns>true if confirmed, false otherwise</returns>
+        bool Confirm(string title, string message);
+        /// <summary>
+        /// Make a request for confirmation
+        /// </summary>
+        /// <param name="title">The title of the confirmation message</param>
+        /// <param name="format">The message template</param>
+        /// <param name="args">The template values</param>
+        /// <returns>true if confirmed, false otherwise</returns>
+        bool ConfirmFormatted(string title, string format, params string[] args);
+        /// <summary>
+        /// Indicates whether this view is attached to a workbench
+        /// </summary>
+        bool IsAttached { get; }
+        /// <summary>
+        /// Indicates the default region this view content will be put in
+        /// </summary>
+        ViewRegion DefaultRegion { get; }
+    }
+
+    /// <summary>
+    /// Defines the possible regions of the user interface a <see cref="IViewContent"/> can reside in 
+    /// </summary>
+    public enum ViewRegion
+    {
+        /// <summary>
+        /// The view content will be docked to the left
+        /// </summary>
+        Left,
+        /// <summary>
+        /// The view content will be docked to the right
+        /// </summary>
+        Right,
+        /// <summary>
+        /// The view content will be docked to the bottom
+        /// </summary>
+        Bottom,
+        /// <summary>
+        /// The view content will be docked to the center, (in a tabbed document interface)
+        /// </summary>
+        Document,
+        /// <summary>
+        /// The view content will reside in a floating dialog
+        /// </summary>
+        Floating,
+        /// <summary>
+        /// The view content will reside in a modal dialog
+        /// </summary>
+        Dialog
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Shared.UI/IViewContentManager.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/IViewContentManager.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/IViewContentManager.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,38 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+
+namespace Maestro.Shared.UI
+{
+    public delegate T CreateFunc<T>();
+
+    public interface IViewContentManager
+    {
+        void HideContent<T>() where T : IViewContent;
+        void Initialize();
+        bool IsCreated<T>() where T : IViewContent;
+        T OpenContent<T>(ViewRegion region, CreateFunc<T> method) where T : IViewContent;
+        T OpenContent<T>(ViewRegion region) where T : IViewContent;
+        T OpenContent<T>(string title, string description, ViewRegion region, CreateFunc<T> method) where T : IViewContent;
+        T OpenContent<T>(string title, string description, ViewRegion region) where T : IViewContent;
+        void ShowContent<T>() where T : IViewContent;
+        event EventHandler ViewHidden;
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Shared.UI/IWorkbenchInitializer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/IWorkbenchInitializer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/IWorkbenchInitializer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,39 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    public interface IWorkbenchInitializer
+    {
+        Icon GetIcon();
+        MenuStrip GetMainMenu(WorkbenchBase workbench);
+        ToolStrip GetMainToolStrip(WorkbenchBase workbench);
+        void UpdateMenuItemStatus(MenuStrip menu, IEnumerable<ToolStrip> toolstrips);
+
+        IViewContentManager GetViewContentManager();
+
+        Image GetDocumentCloseIcon();
+    }
+}

Modified: trunk/Tools/Maestro/Maestro.Shared.UI/Maestro.Shared.UI.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/Maestro.Shared.UI.csproj	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/Maestro.Shared.UI.csproj	2011-12-30 14:16:32 UTC (rev 6387)
@@ -61,6 +61,10 @@
     <Compile Include="ErrorDialog.Designer.cs">
       <DependentUpon>ErrorDialog.cs</DependentUpon>
     </Compile>
+    <Compile Include="ISubView.cs" />
+    <Compile Include="IViewContent.cs" />
+    <Compile Include="IViewContentManager.cs" />
+    <Compile Include="IWorkbenchInitializer.cs" />
     <Compile Include="NumericBinder.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
@@ -68,7 +72,22 @@
       <DesignTime>True</DesignTime>
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
+    <Compile Include="ServiceBase.cs" />
+    <Compile Include="SingletonViewContent.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SingletonViewContent.Designer.cs">
+      <DependentUpon>SingletonViewContent.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TabFactory.cs" />
     <Compile Include="TextBoxBinder.cs" />
+    <Compile Include="ViewContentBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ViewContentBase.Designer.cs">
+      <DependentUpon>ViewContentBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ViewContentManagerBase.cs" />
     <Compile Include="WaitCursor.cs" />
     <Compile Include="ProgressDialog.cs">
       <SubType>Form</SubType>
@@ -76,6 +95,18 @@
     <Compile Include="ProgressDialog.designer.cs">
       <DependentUpon>ProgressDialog.cs</DependentUpon>
     </Compile>
+    <Compile Include="WorkbenchBase.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="WorkbenchBase.Designer.cs">
+      <DependentUpon>WorkbenchBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ZonedContainer.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ZonedContainer.Designer.cs">
+      <DependentUpon>ZonedContainer.cs</DependentUpon>
+    </Compile>
     <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
   </ItemGroup>
   <ItemGroup>
@@ -94,6 +125,20 @@
     <EmbeddedResource Include="ProgressDialog.resx">
       <DependentUpon>ProgressDialog.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="SingletonViewContent.resx">
+      <DependentUpon>SingletonViewContent.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ViewContentBase.resx">
+      <DependentUpon>ViewContentBase.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="WorkbenchBase.resx">
+      <DependentUpon>WorkbenchBase.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ZonedContainer.resx">
+      <DependentUpon>ZonedContainer.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <None Include="Resources\minus-white.png" />

Modified: trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.Designer.cs	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:2.0.50727.4952
+//     Runtime Version:2.0.50727.5448
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -75,6 +75,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to The specified view content type is not registered in any addin files: {0}.
+        /// </summary>
+        internal static string Error_ViewContent_Not_Registered {
+            get {
+                return ResourceManager.GetString("Error_ViewContent_Not_Registered", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The specified view content type is not a singleton: {0}.
+        /// </summary>
+        internal static string Error_ViewContent_Type_Not_Singleton {
+            get {
+                return ResourceManager.GetString("Error_ViewContent_Type_Not_Singleton", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Maestro Error Report
         ///====================
         ///

Modified: trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.resx	2011-12-30 10:52:33 UTC (rev 6386)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/Properties/Resources.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -136,4 +136,10 @@
   <data name="FileSaved" xml:space="preserve">
     <value>File saved</value>
   </data>
+  <data name="Error_ViewContent_Not_Registered" xml:space="preserve">
+    <value>The specified view content type is not registered in any addin files: {0}</value>
+  </data>
+  <data name="Error_ViewContent_Type_Not_Singleton" xml:space="preserve">
+    <value>The specified view content type is not a singleton: {0}</value>
+  </data>
 </root>
\ No newline at end of file

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ServiceBase.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/Services/ServiceBase.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ServiceBase.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ServiceBase.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,34 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Maestro.Shared.UI
+{
+    public abstract class ServiceBase
+    {
+        public virtual void Initialize() { }
+
+        public virtual void Load() { }
+
+        public virtual void Save() { }
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.Designer.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.Designer.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,43 @@
+namespace Maestro.Shared.UI
+{
+    partial class SingletonViewContent
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // SingletonViewContent
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.Name = "SingletonViewContent";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,58 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    public partial class SingletonViewContent : ViewContentBase
+    {
+        public SingletonViewContent()
+        {
+            InitializeComponent();
+        }
+
+        public override bool AllowUserClose
+        {
+            get
+            {
+                return false;
+            }
+        }
+
+        public override void Close()
+        {
+            //Do nothing. Singletons aren't closeable
+        }
+
+        public override ViewRegion DefaultRegion
+        {
+            get
+            {
+                return ViewRegion.Left;
+            }
+        }
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.resx (from rev 6352, trunk/Tools/Maestro/Maestro.Base/UI/SingletonViewContent.resx)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/SingletonViewContent.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>SingletonViewContent</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>Maestro.Base.ViewContentBase, Maestro.Base, Version=3.0.0.5334, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+</root>
\ No newline at end of file

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/TabFactory.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/TabFactory.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/TabFactory.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/TabFactory.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,192 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    internal class HiddenTab
+    {
+        public TabControl Parent { get; set; }
+        public TabPage Tab { get; set; }
+    }
+
+    /// <summary>
+    /// Platform check helper class. Use this class to determine if this assembly is executing
+    /// under the Mono Runtime environment.
+    /// </summary>
+    static class Platform
+    {
+        static Platform()
+        {
+            _mrtType = Type.GetType("Mono.Runtime");
+        }
+
+        private static Type _mrtType;
+
+        /// <summary>
+        /// Gets whether this application is running under the Mono CLR
+        /// </summary>
+        public static bool IsRunningOnMono
+        {
+            get
+            {
+                return _mrtType != null;
+            }
+        }
+    }
+
+    // A BIG NOTE TO ANYONE THINKING ABOUT HACKING THIS CODE:
+    //
+    // There are 2 ways to handle tab selections (setting/getting):
+    // - Using the SelectedTab property of TabControl
+    // - Using the SelectedIndex property of TabControl and fetching the relevant tab from its TabPages collection
+    //
+    // Mono (2.4) has a buggy implementation of TabControl and will do crazy things if you use the SelectedTab property. 
+    // So if you're ever hacking code that involves setting or getting a selected tab, NEVER USE THE SelectedTab PROPERTY!
+
+    internal static class TabFactory
+    {
+        private static List<HiddenTab> _hiddenTabs = new List<HiddenTab>();
+
+        static ContextMenuStrip smStrip;
+
+        internal static TabPage CreateTab(IViewContent content, string imgKey)
+        {
+            TabPage page = new TabPage();
+            page.ImageKey = imgKey;
+            page.Text = content.Title; 
+            page.ToolTipText = content.Description;
+            page.Tag = content;
+
+            if (smStrip == null)
+            {
+                smStrip = new ContextMenuStrip();
+                smStrip.Items.Add("Close This Tab");
+                smStrip.Items.Add("Close All But This");
+                smStrip.Items.Add("Close All");
+            }
+            
+            content.TitleChanged += (sender, e) => 
+            {
+                page.Text = content.Title; 
+            };
+            content.DescriptionChanged += (sender, e) =>
+            {
+                page.ToolTipText = content.Description;
+            };
+            content.ViewContentActivating += (sender, e) =>
+            {
+                //Find matching hidden tab entry, and restore
+                HiddenTab hiddenTab = null;
+                foreach (var htab in _hiddenTabs)
+                {
+                    if (htab.Tab == page)
+                    {
+                        hiddenTab = htab;
+                    }
+                }
+                if (hiddenTab != null)
+                {
+                    hiddenTab.Parent.TabPages.Add(page);
+                    var indx = hiddenTab.Parent.TabPages.IndexOf(page);
+                    hiddenTab.Parent.SelectedIndex = indx;
+                    _hiddenTabs.Remove(hiddenTab);
+                }
+                else //Wasn't hidden in the first place
+                {
+                    var tabs = page.Parent as TabControl;
+                    if (tabs != null)
+                    {
+                        var indx = tabs.TabPages.IndexOf(page);
+                        tabs.SelectedIndex = indx;
+                    }
+                }
+            };
+
+
+            content.ViewContentClosed += (sender, e) =>
+            {
+                //Remove itself from the tab control
+                var tabs = page.Parent as TabControl;
+                if (tabs != null && tabs.TabPages.Contains(page))
+                {
+                    if (!Platform.IsRunningOnMono)
+                    {
+                        var idx = tabs.TabPages.IndexOf(page);
+                        tabs.TabPages.Remove(page);
+                        if (idx > 0)
+                            tabs.SelectedIndex = --idx;
+                    }
+                    else
+                    {
+                        int idx = -1;
+                        //HACK: Mono (2.4) will chuck a hissy fit if we remove
+                        //a tab from a TabControl that has a selected tab so we
+                        //have to null the selected tab, but this cause weird
+                        //visual effects once the tab is removed, so we record
+                        //the selected index, so we can assign the one beside it
+                        //to be the selected tab after removal.
+                        if (tabs.SelectedTab == page)
+                        {
+                            idx = tabs.SelectedIndex;
+                            tabs.SelectedTab = null;
+                        }
+                        tabs.TabPages.Remove(page);
+
+                        if (idx > 0)
+                        {
+                            idx--;
+                            tabs.SelectedIndex = idx;
+                        }
+                        else
+                        {
+                            //Set to first tab if available.
+                            if (tabs.TabCount > 0)
+                            {
+                                tabs.SelectedIndex = 0;
+                            }
+                        }
+                    }
+                    page.Dispose();
+                }
+            };
+
+            content.ViewContentHiding += (sender, e) =>
+            {
+                //Store in hidden tabs collection
+                var tabs = page.Parent as TabControl;
+                if (tabs != null && tabs.TabPages.Contains(page))
+                {
+                    var htab = new HiddenTab() { Parent = tabs, Tab = page };
+                    _hiddenTabs.Add(htab);
+                    htab.Parent.TabPages.Remove(page);
+                }
+            };
+
+            content.ContentControl.Dock = DockStyle.Fill;
+            page.Controls.Add(content.ContentControl);
+
+            return page;
+        }
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.Designer.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ViewContentBase.Designer.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,43 @@
+namespace Maestro.Shared.UI
+{
+    partial class ViewContentBase
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // ViewContentBase
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.Name = "ViewContentBase";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ViewContentBase.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,263 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    /// <summary>
+    /// The base class of all view content. Provides the default implementation of <see cref="IViewContent"/>
+    /// </summary>
+    [ToolboxItem(false)]
+    public partial class ViewContentBase : UserControl, IViewContent
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ViewContentBase"/> class.
+        /// </summary>
+        public ViewContentBase()
+        {
+            InitializeComponent();
+        }
+
+        private string _title;
+
+        /// <summary>
+        /// The title of the view
+        /// </summary>
+        public string Title
+        {
+            get
+            {
+                return _title;
+            }
+            set
+            {
+                if (_title != value)
+                {
+                    _title = value;
+                    var handler = this.TitleChanged;
+                    if (handler != null)
+                        handler(this, EventArgs.Empty);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Fires when the title has been changed
+        /// </summary>
+        public event EventHandler TitleChanged;
+
+        /// <summary>
+        /// Detrmines if this view can be closed by the user, note that this does not affect the <see cref="Close"/> method
+        /// in any way. All view content can still be programmatically closed if they inherit from <see cref="ViewContentBase"/> and
+        /// does not override the default implementation of <see cref="Close"/>
+        /// </summary>
+        public virtual bool AllowUserClose
+        {
+            get { return true; }
+        }
+
+        /// <summary>
+        /// Closes the view. This raises the <see cref="ViewContentClosing"/> event
+        /// </summary>
+        public virtual void Close()
+        {
+            CancelEventArgs ce = new CancelEventArgs(false);
+            var ceHandler = this.ViewContentClosing;
+            if (ceHandler != null)
+                ceHandler(this, ce);
+
+            if (ce.Cancel)
+                return;
+
+            var handler = this.ViewContentClosed;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        /// <summary>
+        /// Fired when the view has been closed internally
+        /// </summary>
+        public event CancelEventHandler ViewContentClosing;
+
+        /// <summary>
+        /// Displays an exception message
+        /// </summary>
+        /// <param name="ex">The exception object</param>
+        public void ShowError(Exception ex)
+        {
+            ErrorDialog.Show(ex);
+        }
+
+        /// <summary>
+        /// Displays an error message
+        /// </summary>
+        /// <param name="message">The message</param>
+        public virtual void ShowError(string message)
+        {
+            //MessageService.ShowError(message);
+            ErrorDialog.Show(message, message);
+        }
+
+        /// <summary>
+        /// Displays an alert message
+        /// </summary>
+        /// <param name="title">The title of this message</param>
+        /// <param name="message">The message</param>
+        public virtual void ShowMessage(string title, string message)
+        {
+            //MessageService.ShowMessage(message, title);
+            MessageBox.Show(message, title);
+        }
+
+        /// <summary>
+        /// Make a request for confirmation
+        /// </summary>
+        /// <param name="title">The title of the confirmation message</param>
+        /// <param name="message">The message</param>
+        /// <returns>
+        /// true if confirmed, false otherwise
+        /// </returns>
+        public virtual bool Confirm(string title, string message)
+        {
+            //return MessageService.AskQuestion(message, title);
+            return MessageBox.Show(message, title, MessageBoxButtons.YesNo) == DialogResult.Yes;
+        }
+
+        /// <summary>
+        /// Make a request for confirmation
+        /// </summary>
+        /// <param name="title">The title of the confirmation message</param>
+        /// <param name="format">The message template</param>
+        /// <param name="args">The template values</param>
+        /// <returns>
+        /// true if confirmed, false otherwise
+        /// </returns>
+        public virtual bool ConfirmFormatted(string title, string format, params string[] args)
+        {
+            //return MessageService.AskQuestion(string.Format(format, args), title);
+            return MessageBox.Show(string.Format(format, args), title, MessageBoxButtons.YesNo) == DialogResult.Yes;
+        }
+
+        /// <summary>
+        /// The underlying control
+        /// </summary>
+        public Control ContentControl
+        {
+            get { return this; }
+        }
+
+        private string _description;
+
+        /// <summary>
+        /// The view's description, this is the ToolTip content
+        /// </summary>
+        public string Description
+        {
+            get
+            {
+                return _description;
+            }
+            set
+            {
+                if (_description != value)
+                {
+                    _description = value;
+                    var handler = this.DescriptionChanged;
+                    if (handler != null)
+                        handler(this, EventArgs.Empty);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Raised when the description has changed
+        /// </summary>
+        public event EventHandler DescriptionChanged;
+
+        /// <summary>
+        /// Makes this content active
+        /// </summary>
+        public void Activate()
+        {
+            var handler = this.ViewContentActivating;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        /// <summary>
+        /// Fired when the view is going to hide
+        /// </summary>
+        public event EventHandler ViewContentHiding;
+
+        /// <summary>
+        /// Fired when the view is activating
+        /// </summary>
+        public event EventHandler ViewContentActivating;
+
+        /// <summary>
+        /// Conceals the control from the user.
+        /// </summary>
+        /// <PermissionSet>
+        ///   <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
+        ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
+        ///   <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence"/>
+        ///   <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/>
+        ///   </PermissionSet>
+        void IViewContent.Hide()
+        {
+            var handler = this.ViewContentHiding;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        /// <summary>
+        /// Indicates whether this view is attached to a workbench
+        /// </summary>
+        public bool IsAttached
+        {
+            get;
+            internal set;
+        }
+
+        /// <summary>
+        /// Indicates the default region this view content will be put in
+        /// </summary>
+        public virtual ViewRegion DefaultRegion
+        {
+            get { return ViewRegion.Document; }
+        }
+
+        /// <summary>
+        /// Fired when the view has been closed internally
+        /// </summary>
+        public event EventHandler ViewContentClosed;
+
+        /// <summary>
+        /// Fired when the view, which was hidden is now being shown
+        /// </summary>
+        public event EventHandler ViewContentShowing;
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.resx (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ViewContentBase.resx)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentBase.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>ViewContentBase</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
\ No newline at end of file

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentManagerBase.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/Services/ViewContentManager.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentManagerBase.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ViewContentManagerBase.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,161 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Maestro.Shared.UI;
+
+namespace Maestro.Shared.UI
+{
+    public abstract class ViewContentManagerBase : ServiceBase, IViewContentManager
+    {
+        protected Dictionary<string, Type> _singletonViewContentTypes = new Dictionary<string, Type>();
+        protected List<IViewContent> _singletonInstances = new List<IViewContent>();
+
+        public event EventHandler ViewHidden;
+
+        protected abstract WorkbenchBase GetWorkbench();
+
+        /// <summary>
+        /// Initializes this instance. Subclasses must override this and populate the <see cref="_singletonViewContentTypes"/>
+        /// and <see cref="_singletonInstances"/> collections
+        /// </summary>
+        public override void Initialize()
+        {
+            base.Initialize();
+        }
+
+        public bool IsCreated<T>() where T : IViewContent
+        {
+            var type = typeof(T);
+            if (_singletonViewContentTypes.ContainsKey(type.Name))
+            {
+                foreach (var cnt in _singletonInstances)
+                {
+                    if (type.IsAssignableFrom(cnt.GetType()))
+                    {
+                        return true;
+                    }
+                }
+                return false;
+            }
+            else
+            {
+                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Type_Not_Singleton, type.Name));
+            }
+        }
+
+        public void HideContent<T>() where T : IViewContent
+        {
+            var type = typeof(T);
+            if (_singletonViewContentTypes.ContainsKey(type.Name))
+            {
+                foreach (var cnt in _singletonInstances)
+                {
+                    if (type.IsAssignableFrom(cnt.GetType()))
+                    {
+                        cnt.Hide();
+                        var handler = this.ViewHidden;
+                        if (handler != null)
+                            handler(this, EventArgs.Empty);
+
+                        var wb = GetWorkbench();
+                        if (wb != null)
+                            wb.CheckContainerStatus();
+                        return;
+                    }
+                }
+            }
+            else
+            {
+                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Type_Not_Singleton, type.Name));
+            }
+        }
+
+        public void ShowContent<T>() where T : IViewContent
+        {
+            var type = typeof(T);
+            if (_singletonViewContentTypes.ContainsKey(type.Name))
+            {
+                foreach (var cnt in _singletonInstances)
+                {
+                    if (type.IsAssignableFrom(cnt.GetType()))
+                    {
+                        var wb = GetWorkbench();
+                        if (!cnt.IsAttached)
+                            wb.ShowContent(cnt);
+                        cnt.Activate();
+                        wb.CheckContainerStatus();
+                        return;
+                    }
+                }
+            }
+            else
+            {
+                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Type_Not_Singleton, type.Name));
+            }
+        }
+
+        public T OpenContent<T>(ViewRegion region, CreateFunc<T> method) where T : IViewContent
+        {
+            return OpenContent<T>(null, null, region, method);
+        }
+
+        public T OpenContent<T>(ViewRegion region) where T : IViewContent
+        {
+            return OpenContent<T>(null, null, region);
+        }
+
+        public T OpenContent<T>(string title, string description, ViewRegion region) where T : IViewContent
+        {
+            return OpenContent<T>(title, description, region, () => { return (T)Activator.CreateInstance(typeof(T), true); });
+        }
+
+        public T OpenContent<T>(string title, string description, ViewRegion region, CreateFunc<T> method) where T : IViewContent
+        {
+            var type = typeof(T);
+            var wb = GetWorkbench();
+            if (_singletonViewContentTypes.ContainsKey(type.Name))
+            {
+                foreach (var cnt in _singletonInstances)
+                {
+                    if (type.IsAssignableFrom(cnt.GetType()))
+                    {
+                        if (!cnt.IsAttached)
+                            wb.ShowContent(cnt);
+                        cnt.Activate();
+                        wb.CheckContainerStatus();
+                        return (T)cnt;
+                    }
+                }
+            }
+
+            T obj = method(); //(T)Activator.CreateInstance(type, true);
+            SingletonViewContent svc = obj as SingletonViewContent;
+            if (svc != null)
+                throw new InvalidOperationException(string.Format(Properties.Resources.Error_ViewContent_Not_Registered, type.Name));
+
+            obj.Title = title;
+            obj.Description = description;
+            wb.ShowContent(obj);
+            return obj;
+        }
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.Designer.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/Workbench.Designer.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,47 @@
+namespace Maestro.Shared.UI
+{
+    partial class WorkbenchBase
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WorkbenchBase));
+            this.SuspendLayout();
+            // 
+            // Workbench
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            resources.ApplyResources(this, "$this");
+            this.Name = "Workbench";
+            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+    }
+}
\ No newline at end of file

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/Workbench.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,295 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    public partial class WorkbenchBase : Form
+    {
+        MenuStrip menu;
+        ToolStripContainer toolStripContainer;
+        ToolStrip toolbar;
+        
+        StatusStrip status;
+        ToolStripStatusLabel statusLabel;
+
+        ZonedContainer contentPanel;
+
+        ContextMenuStrip ctxToolbar;
+
+        private IWorkbenchInitializer _workbenchInitializer;
+
+        protected WorkbenchBase(IWorkbenchInitializer init)
+        {
+            InitializeComponent();
+            _workbenchInitializer = init;
+            _toolstrips = new Dictionary<string, ToolStrip>();
+            _toolstripRegions = new Dictionary<string, ToolbarRegion>();
+
+            this.Icon = _workbenchInitializer.GetIcon();
+
+            contentPanel = new ZonedContainer(_workbenchInitializer);
+            contentPanel.Dock = DockStyle.Fill;
+
+            contentPanel.ViewActivated += new ViewContentActivateEventHandler(OnViewActivated);
+
+            menu = _workbenchInitializer.GetMainMenu(this);
+
+            toolStripContainer = new ToolStripContainer();
+            toolStripContainer.ContentPanel.Controls.Add(contentPanel);
+            toolStripContainer.Dock = DockStyle.Fill;
+
+            this.Controls.Add(toolStripContainer);
+
+            ctxToolbar = new ContextMenuStrip();
+            menu.ContextMenuStrip = ctxToolbar;
+            toolStripContainer.TopToolStripPanel.ContextMenuStrip = ctxToolbar;
+            toolStripContainer.BottomToolStripPanel.ContextMenuStrip = ctxToolbar;
+            toolStripContainer.LeftToolStripPanel.ContextMenuStrip = ctxToolbar;
+            toolStripContainer.RightToolStripPanel.ContextMenuStrip = ctxToolbar;
+
+            toolbar = _workbenchInitializer.GetMainToolStrip(this);
+            toolbar.Stretch = true;
+
+            AddToolbar("Base", toolbar, ToolbarRegion.Top, true);
+            
+            status = new StatusStrip();
+            statusLabel = new ToolStripStatusLabel();
+            status.Items.Add(statusLabel);
+
+            this.Controls.Add(menu);
+            this.Controls.Add(status);
+
+            // Use the Idle event to update the status of menu and toolbar items.
+            Application.Idle += OnApplicationIdle;
+        }
+
+        protected virtual void OnViewActivated(object sender, IViewContent content) { }
+
+        private Dictionary<string, ToolStrip> _toolstrips;
+        private Dictionary<string, ToolbarRegion> _toolstripRegions;
+
+        /// <summary>
+        /// Adds the toolbar.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <param name="toolbar">The toolbar.</param>
+        /// <param name="region">The region.</param>
+        /// <param name="canToggleVisibility">if set to <c>true</c> [can toggle visibility].</param>
+        public void AddToolbar(string name, ToolStrip toolbar, ToolbarRegion region, bool canToggleVisibility)
+        {
+            _toolstrips.Add(name, toolbar);
+            _toolstripRegions.Add(name, region);
+
+            if (canToggleVisibility)
+            {
+                ToolStripMenuItem item = new ToolStripMenuItem();
+                item.Text = name;
+                item.Tag = name;
+                item.Checked = true;
+                item.CheckOnClick = true;
+                item.Click += delegate
+                {
+                    SetToolbarVisibility(name, item.Checked);
+                };
+                ctxToolbar.Items.Add(item);
+            }
+
+            switch (region)
+            {
+                case ToolbarRegion.Top:
+                    toolStripContainer.TopToolStripPanel.Controls.Add(toolbar);
+                    break;
+                case ToolbarRegion.Bottom:
+                    toolStripContainer.BottomToolStripPanel.Controls.Add(toolbar);
+                    break;
+                case ToolbarRegion.Left:
+                    toolStripContainer.LeftToolStripPanel.Controls.Add(toolbar);
+                    break;
+                case ToolbarRegion.Right:
+                    toolStripContainer.RightToolStripPanel.Controls.Add(toolbar);
+                    break;
+            }
+        }
+
+        /// <summary>
+        /// Sets the toolbar visibility.
+        /// </summary>
+        /// <param name="toolbarName">Name of the toolbar.</param>
+        /// <param name="visible">if set to <c>true</c> [visible].</param>
+        public void SetToolbarVisibility(string toolbarName, bool visible)
+        {
+            ToolStrip strip = GetToolbar(toolbarName);
+            if (strip != null)
+            {
+                ToolbarRegion region = _toolstripRegions[toolbarName];
+                if (visible)
+                {
+                    switch (region)
+                    {
+                        case ToolbarRegion.Bottom:
+                            toolStripContainer.BottomToolStripPanel.Controls.Add(strip);
+                            break;
+                        case ToolbarRegion.Left:
+                            toolStripContainer.LeftToolStripPanel.Controls.Add(strip);
+                            break;
+                        case ToolbarRegion.Right:
+                            toolStripContainer.RightToolStripPanel.Controls.Add(strip);
+                            break;
+                        case ToolbarRegion.Top:
+                            toolStripContainer.TopToolStripPanel.Controls.Add(strip);
+                            break;
+                    }
+                }
+                else
+                {
+                    switch (region)
+                    {
+                        case ToolbarRegion.Bottom:
+                            toolStripContainer.BottomToolStripPanel.Controls.Remove(strip);
+                            break;
+                        case ToolbarRegion.Left:
+                            toolStripContainer.LeftToolStripPanel.Controls.Remove(strip);
+                            break;
+                        case ToolbarRegion.Right:
+                            toolStripContainer.RightToolStripPanel.Controls.Remove(strip);
+                            break;
+                        case ToolbarRegion.Top:
+                            toolStripContainer.TopToolStripPanel.Controls.Remove(strip);
+                            break;
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// Gets the toolbar.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        public ToolStrip GetToolbar(string name)
+        {
+            if (_toolstrips.ContainsKey(name))
+                return _toolstrips[name];
+            return null;
+        }
+
+        /// <summary>
+        /// Gets the toolbar names.
+        /// </summary>
+        /// <value>The toolbar names.</value>
+        public ICollection<string> ToolbarNames
+        {
+            get { return _toolstrips.Keys; }
+        }
+
+        /// <summary>
+        /// Sets the status label.
+        /// </summary>
+        /// <param name="text">The text.</param>
+        public void SetStatusLabel(string text)
+        {
+            statusLabel.Text = text;
+        }
+
+        /// <summary>
+        /// Sets the title.
+        /// </summary>
+        /// <param name="title">The title.</param>
+        public void SetTitle(string title)
+        {
+            this.Text = title;
+        }
+
+        /// <summary>
+        /// Gets the active view in the document region
+        /// </summary>
+        public IViewContent ActiveDocumentView
+        {
+            get { return contentPanel.ActiveDocumentView; }
+        }
+
+        /// <summary>
+        /// Shows the content.
+        /// </summary>
+        /// <param name="vc">The vc.</param>
+        internal void ShowContent(IViewContent vc)
+        {
+            switch (vc.DefaultRegion)
+            {
+                case ViewRegion.Bottom:
+                case ViewRegion.Left:
+                case ViewRegion.Right:
+                case ViewRegion.Document:
+                    contentPanel.AddContent(vc);
+                    var vcb = vc as ViewContentBase;
+                    if (vcb != null)
+                        vcb.IsAttached = true;
+                    break;
+                case ViewRegion.Floating:
+                    throw new NotImplementedException();
+                case ViewRegion.Dialog:
+                    throw new NotImplementedException();
+            }
+        }
+
+        protected internal void CheckContainerStatus()
+        {
+            contentPanel.CheckContainerStatus();
+        }
+
+        void OnApplicationIdle(object sender, EventArgs e)
+        {
+            // Use the Idle event to update the status of menu and toolbar.
+            // Depending on your application and the number of menu items with complex conditions,
+            // you might want to update the status less frequently.
+            _workbenchInitializer.UpdateMenuItemStatus(menu, _toolstrips.Values);
+        }
+    }
+
+    /// <summary>
+    /// Defines the valid regions a toolbar can reside on a workbench
+    /// </summary>
+    public enum ToolbarRegion
+    {
+        /// <summary>
+        /// On the top
+        /// </summary>
+        Top,
+        /// <summary>
+        /// On the left
+        /// </summary>
+        Left,
+        /// <summary>
+        /// On the right
+        /// </summary>
+        Right,
+        /// <summary>
+        /// On the bottom
+        /// </summary>
+        Bottom
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.resx (from rev 6352, trunk/Tools/Maestro/Maestro.Base/Workbench.resx)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/WorkbenchBase.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>792, 566</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>Workbench</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
\ No newline at end of file

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.Designer.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ZonedContainer.Designer.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.Designer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,247 @@
+namespace Maestro.Shared.UI
+{
+    partial class ZonedContainer
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ZonedContainer));
+            this.docRightContainer = new System.Windows.Forms.SplitContainer();
+            this.docBottomContainer = new System.Windows.Forms.SplitContainer();
+            this.documentTabs = new System.Windows.Forms.TabControl();
+            this.docImgList = new System.Windows.Forms.ImageList(this.components);
+            this.bottomZone = new System.Windows.Forms.TabControl();
+            this.bottomImgList = new System.Windows.Forms.ImageList(this.components);
+            this.rightZone = new System.Windows.Forms.TabControl();
+            this.rightImgList = new System.Windows.Forms.ImageList(this.components);
+            this.topContainer = new System.Windows.Forms.SplitContainer();
+            this.leftZone = new System.Windows.Forms.TabControl();
+            this.leftImgList = new System.Windows.Forms.ImageList(this.components);
+            this.ctxDocumentTabs = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.closeTabToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.closeAllButThisToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.closeAllTabsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.docRightContainer.Panel1.SuspendLayout();
+            this.docRightContainer.Panel2.SuspendLayout();
+            this.docRightContainer.SuspendLayout();
+            this.docBottomContainer.Panel1.SuspendLayout();
+            this.docBottomContainer.Panel2.SuspendLayout();
+            this.docBottomContainer.SuspendLayout();
+            this.topContainer.Panel1.SuspendLayout();
+            this.topContainer.Panel2.SuspendLayout();
+            this.topContainer.SuspendLayout();
+            this.ctxDocumentTabs.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // docRightContainer
+            // 
+            resources.ApplyResources(this.docRightContainer, "docRightContainer");
+            this.docRightContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+            this.docRightContainer.Name = "docRightContainer";
+            // 
+            // docRightContainer.Panel1
+            // 
+            this.docRightContainer.Panel1.Controls.Add(this.docBottomContainer);
+            resources.ApplyResources(this.docRightContainer.Panel1, "docRightContainer.Panel1");
+            // 
+            // docRightContainer.Panel2
+            // 
+            this.docRightContainer.Panel2.Controls.Add(this.rightZone);
+            resources.ApplyResources(this.docRightContainer.Panel2, "docRightContainer.Panel2");
+            // 
+            // docBottomContainer
+            // 
+            resources.ApplyResources(this.docBottomContainer, "docBottomContainer");
+            this.docBottomContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+            this.docBottomContainer.Name = "docBottomContainer";
+            // 
+            // docBottomContainer.Panel1
+            // 
+            this.docBottomContainer.Panel1.Controls.Add(this.documentTabs);
+            resources.ApplyResources(this.docBottomContainer.Panel1, "docBottomContainer.Panel1");
+            // 
+            // docBottomContainer.Panel2
+            // 
+            this.docBottomContainer.Panel2.Controls.Add(this.bottomZone);
+            resources.ApplyResources(this.docBottomContainer.Panel2, "docBottomContainer.Panel2");
+            // 
+            // documentTabs
+            // 
+            resources.ApplyResources(this.documentTabs, "documentTabs");
+            this.documentTabs.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
+            this.documentTabs.HotTrack = true;
+            this.documentTabs.ImageList = this.docImgList;
+            this.documentTabs.Name = "documentTabs";
+            this.documentTabs.SelectedIndex = 0;
+            this.documentTabs.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
+            this.documentTabs.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
+            this.documentTabs.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            this.documentTabs.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            // 
+            // docImgList
+            // 
+            this.docImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            resources.ApplyResources(this.docImgList, "docImgList");
+            this.docImgList.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // bottomZone
+            // 
+            resources.ApplyResources(this.bottomZone, "bottomZone");
+            this.bottomZone.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
+            this.bottomZone.HotTrack = true;
+            this.bottomZone.ImageList = this.bottomImgList;
+            this.bottomZone.Name = "bottomZone";
+            this.bottomZone.SelectedIndex = 0;
+            this.bottomZone.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
+            this.bottomZone.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
+            this.bottomZone.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            this.bottomZone.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            // 
+            // bottomImgList
+            // 
+            this.bottomImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            resources.ApplyResources(this.bottomImgList, "bottomImgList");
+            this.bottomImgList.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // rightZone
+            // 
+            resources.ApplyResources(this.rightZone, "rightZone");
+            this.rightZone.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
+            this.rightZone.HotTrack = true;
+            this.rightZone.ImageList = this.rightImgList;
+            this.rightZone.Name = "rightZone";
+            this.rightZone.SelectedIndex = 0;
+            this.rightZone.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
+            this.rightZone.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
+            this.rightZone.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            this.rightZone.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            // 
+            // rightImgList
+            // 
+            this.rightImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            resources.ApplyResources(this.rightImgList, "rightImgList");
+            this.rightImgList.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // topContainer
+            // 
+            resources.ApplyResources(this.topContainer, "topContainer");
+            this.topContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+            this.topContainer.Name = "topContainer";
+            // 
+            // topContainer.Panel1
+            // 
+            this.topContainer.Panel1.Controls.Add(this.leftZone);
+            // 
+            // topContainer.Panel2
+            // 
+            this.topContainer.Panel2.Controls.Add(this.docRightContainer);
+            // 
+            // leftZone
+            // 
+            resources.ApplyResources(this.leftZone, "leftZone");
+            this.leftZone.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
+            this.leftZone.HotTrack = true;
+            this.leftZone.ImageList = this.leftImgList;
+            this.leftZone.Name = "leftZone";
+            this.leftZone.SelectedIndex = 0;
+            this.leftZone.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ZoneDrawItem);
+            this.leftZone.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ZoneMouseClick);
+            this.leftZone.TabIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            this.leftZone.SelectedIndexChanged += new System.EventHandler(this.ZoneTabSelectedIndexChanged);
+            // 
+            // leftImgList
+            // 
+            this.leftImgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            resources.ApplyResources(this.leftImgList, "leftImgList");
+            this.leftImgList.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // ctxDocumentTabs
+            // 
+            this.ctxDocumentTabs.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.closeTabToolStripMenuItem,
+            this.closeAllButThisToolStripMenuItem,
+            this.closeAllTabsToolStripMenuItem});
+            this.ctxDocumentTabs.Name = "ctxDocumentTabs";
+            resources.ApplyResources(this.ctxDocumentTabs, "ctxDocumentTabs");
+            // 
+            // closeTabToolStripMenuItem
+            // 
+            this.closeTabToolStripMenuItem.Name = "closeTabToolStripMenuItem";
+            resources.ApplyResources(this.closeTabToolStripMenuItem, "closeTabToolStripMenuItem");
+            this.closeTabToolStripMenuItem.Click += new System.EventHandler(this.closeTabToolStripMenuItem_Click);
+            // 
+            // closeAllButThisToolStripMenuItem
+            // 
+            this.closeAllButThisToolStripMenuItem.Name = "closeAllButThisToolStripMenuItem";
+            resources.ApplyResources(this.closeAllButThisToolStripMenuItem, "closeAllButThisToolStripMenuItem");
+            this.closeAllButThisToolStripMenuItem.Click += new System.EventHandler(this.closeAllButThisToolStripMenuItem_Click);
+            // 
+            // closeAllTabsToolStripMenuItem
+            // 
+            this.closeAllTabsToolStripMenuItem.Name = "closeAllTabsToolStripMenuItem";
+            resources.ApplyResources(this.closeAllTabsToolStripMenuItem, "closeAllTabsToolStripMenuItem");
+            this.closeAllTabsToolStripMenuItem.Click += new System.EventHandler(this.closeAllTabsToolStripMenuItem_Click);
+            // 
+            // ZonedContainer
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.Controls.Add(this.topContainer);
+            this.Name = "ZonedContainer";
+            resources.ApplyResources(this, "$this");
+            this.docRightContainer.Panel1.ResumeLayout(false);
+            this.docRightContainer.Panel2.ResumeLayout(false);
+            this.docRightContainer.ResumeLayout(false);
+            this.docBottomContainer.Panel1.ResumeLayout(false);
+            this.docBottomContainer.Panel2.ResumeLayout(false);
+            this.docBottomContainer.ResumeLayout(false);
+            this.topContainer.Panel1.ResumeLayout(false);
+            this.topContainer.Panel2.ResumeLayout(false);
+            this.topContainer.ResumeLayout(false);
+            this.ctxDocumentTabs.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.SplitContainer topContainer;
+        private System.Windows.Forms.SplitContainer docRightContainer;
+        private System.Windows.Forms.SplitContainer docBottomContainer;
+        private System.Windows.Forms.TabControl documentTabs;
+        private System.Windows.Forms.TabControl leftZone;
+        private System.Windows.Forms.TabControl bottomZone;
+        private System.Windows.Forms.TabControl rightZone;
+        private System.Windows.Forms.ImageList leftImgList;
+        private System.Windows.Forms.ImageList rightImgList;
+        private System.Windows.Forms.ImageList docImgList;
+        private System.Windows.Forms.ImageList bottomImgList;
+        private System.Windows.Forms.ContextMenuStrip ctxDocumentTabs;
+        private System.Windows.Forms.ToolStripMenuItem closeTabToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem closeAllButThisToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem closeAllTabsToolStripMenuItem;
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.cs (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ZonedContainer.cs)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.cs	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,293 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Windows.Forms.VisualStyles;
+using Maestro.Shared.UI;
+
+namespace Maestro.Shared.UI
+{
+    public delegate void ViewContentActivateEventHandler(object sender, IViewContent content);
+
+    internal partial class ZonedContainer : UserControl
+    {
+        private IViewContentManager _vcManager;
+        private IWorkbenchInitializer _init;
+
+        public ZonedContainer(IWorkbenchInitializer init)
+        {
+            InitializeComponent();
+            _init = init;
+            _vcManager = _init.GetViewContentManager();
+        }
+
+        public IViewContent ActiveDocumentView
+        {
+            get
+            {
+                if (documentTabs.TabCount == 0)
+                    return null;
+
+                var indx = documentTabs.SelectedIndex;
+                if (indx >= 0)
+                {
+                    var page = documentTabs.TabPages[indx];
+                    var cnt = (IViewContent)page.Tag;
+                    return cnt;
+                }
+                return null;
+            }
+        }
+
+        public event ViewContentActivateEventHandler ViewActivated;
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+
+            CheckContainerStatus();
+            _vcManager.ViewHidden += new EventHandler(OnViewHidden);
+        }
+
+        void OnViewHidden(object sender, EventArgs e)
+        {
+            CheckContainerStatus();
+        }
+
+        private IEnumerable<TabControl> AllTabs()
+        {
+            yield return bottomZone;
+            yield return documentTabs;
+            yield return leftZone;
+            yield return rightZone;
+        }
+
+        internal void CheckContainerStatus()
+        {
+            docBottomContainer.Panel2Collapsed = (bottomZone.TabPages.Count == 0);
+            topContainer.Panel1Collapsed = (leftZone.TabPages.Count == 0);
+            docRightContainer.Panel2Collapsed = (rightZone.TabPages.Count == 0) ;
+        }
+
+        public void AddContent(IViewContent content)
+        {
+            TabControl zone = null;
+            ImageList zoneImgList = null;
+            switch (content.DefaultRegion)
+            {
+                case ViewRegion.Bottom:
+                    zone = bottomZone;
+                    zoneImgList = bottomImgList;
+                    break;
+                case ViewRegion.Document:
+                    zone = documentTabs;
+                    zoneImgList = docImgList;
+                    break;
+                case ViewRegion.Left:
+                    zone = leftZone;
+                    zoneImgList = leftImgList;
+                    break;
+                case ViewRegion.Right:
+                    zone = rightZone;
+                    zoneImgList = rightImgList;
+                    break;
+                default: //Something further up should've handled this
+                    throw new InvalidOperationException("Not zoned content");
+            }
+
+            var page = TabFactory.CreateTab(content, null);
+            zone.TabPages.Add(page);
+            var idx = zone.TabPages.IndexOf(page);
+            if (zone.SelectedIndex != idx)
+                zone.SelectedIndex = idx;
+            else
+                OnViewActivated(content);
+
+            CheckContainerStatus();
+        }
+
+        // Close button on tabs implementation
+        //
+        // http://www.dotnetspider.com/resources/29206-Custom-drawn-Close-button-TabControl.aspx
+
+        private Point _imageLocation = new Point(17, 4);
+        private Point _imgHitArea = new Point(15, 2);
+
+        private void ZoneDrawItem(object sender, DrawItemEventArgs e)
+        {
+            TabControl tab = (TabControl)sender;
+            //The tag specifies whether the user can manually close this tab
+            var page = tab.TabPages[e.Index];
+
+            bool draw = (page.Tag != null && ((IViewContent)page.Tag).AllowUserClose);
+
+            try
+            {
+                Rectangle r = e.Bounds;
+                r = tab.GetTabRect(e.Index);
+                r.Offset(2, 2);
+
+                Brush TitleBrush = new SolidBrush(Color.Black);
+                Font f = this.Font;
+
+                string title = page.Text;
+
+                var tabRect = tab.GetTabRect(e.Index);
+
+                if (e.Index == tab.SelectedIndex)
+                    e.Graphics.FillRectangle(new SolidBrush(SystemColors.ControlLightLight), tabRect);
+                else
+                    e.Graphics.FillRectangle(new SolidBrush(SystemColors.ControlLight), tabRect);
+
+                e.Graphics.DrawString(title, f, TitleBrush, new Point(r.X, r.Y));
+
+                if (draw)
+                {
+                    //Close Image to draw
+                    Image img = _init.GetDocumentCloseIcon(); // Properties.Resources.cross_small;
+                    e.Graphics.DrawImage(img, new Point(r.X + (tab.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y));
+                }
+            }
+            catch { }
+        }
+
+        private void ZoneMouseClick(object sender, MouseEventArgs e)
+        {
+            try
+            {
+                TabControl tc = (TabControl)sender;
+                Point p = e.Location;
+                int _tabWidth = 0;
+                _tabWidth = tc.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
+                Rectangle r = tc.GetTabRect(tc.SelectedIndex);
+                r.Offset(_tabWidth, _imgHitArea.Y);
+                r.Width = 16;
+                r.Height = 16;
+                if (r.Contains(p))
+                {
+                    TabPage page = (TabPage)tc.TabPages[tc.SelectedIndex];
+                    //The tag specifies whether the user can manually close this tab
+                    if (page.Tag != null && ((IViewContent)page.Tag).AllowUserClose)
+                    {
+                        ((IViewContent)page.Tag).Close();
+                    }
+                }
+                else
+                {
+                    if (e.Button == MouseButtons.Right)
+                    {
+                        var pt = new Point(e.X, e.Y);
+                        for (int i = 0; i < tc.TabPages.Count; i++)
+                        {
+                            if (tc.GetTabRect(i).Contains(pt))
+                            {
+                                tc.SelectedIndex = i;
+                                break;
+                            }
+                        }
+
+                        if (this.DocumentTabContextMenuEnabled)
+                            return;
+
+                        ctxDocumentTabs.Show(tc, pt);
+                    }
+                }
+            }
+            catch { }
+        }
+
+        private void OnViewActivated(IViewContent content)
+        {
+            var handler = this.ViewActivated;
+            if (handler != null)
+                handler(this, content);
+        }
+
+        private void ZoneTabSelectedIndexChanged(object sender, EventArgs e)
+        {
+            TabControl tabs = (TabControl)sender;
+            var indx = tabs.SelectedIndex;
+            if (indx >= 0)
+            {
+                TabPage page = tabs.TabPages[indx];
+                OnViewActivated((IViewContent)page.Tag);
+            }
+        }
+
+        private void closeTabToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            if (this.DocumentTabContextMenuEnabled || documentTabs.SelectedIndex < 0)
+                return;
+
+            var tab = documentTabs.TabPages[documentTabs.SelectedIndex];
+            ((IViewContent)tab.Tag).Close();
+        }
+
+        private void closeAllButThisToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            if (this.DocumentTabContextMenuEnabled || documentTabs.SelectedIndex < 0)
+                return;
+
+            var tabs = new List<TabPage>();
+            for (int i = 0; i < documentTabs.TabPages.Count; i++)
+            {
+                if (i == documentTabs.SelectedIndex)
+                    continue;
+
+                var tab = documentTabs.TabPages[i];
+                tabs.Add(tab);
+            }
+            foreach (var tab in tabs)
+            {
+                ((IViewContent)tab.Tag).Close();
+            }
+        }
+
+        private void closeAllTabsToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            if (this.DocumentTabContextMenuEnabled)
+                return;
+
+            var tabs = new List<TabPage>();
+            for (int i = 0; i < documentTabs.TabPages.Count; i++)
+            {
+                var tab = documentTabs.TabPages[i];
+                tabs.Add(tab);
+            }
+            foreach (var tab in tabs)
+            {
+                ((IViewContent)tab.Tag).Close();
+            }
+        }
+
+        [DefaultValue(true)]
+        [Description("Indicates whether the document tabs context menu is enabled")]
+        public bool DocumentTabContextMenuEnabled
+        {
+            get;
+            set;
+        }
+    }
+}

Copied: trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.resx (from rev 6352, trunk/Tools/Maestro/Maestro.Base/ZonedContainer.resx)
===================================================================
--- trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Shared.UI/ZonedContainer.resx	2011-12-30 14:16:32 UTC (rev 6387)
@@ -0,0 +1,531 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="docRightContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="docRightContainer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="docBottomContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="docBottomContainer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="docBottomContainer.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
+    <value>Horizontal</value>
+  </data>
+  <data name="documentTabs.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <metadata name="docImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>239, 17</value>
+  </metadata>
+  <data name="docImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
+    <value>16, 16</value>
+  </data>
+  <data name="documentTabs.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="documentTabs.Padding" type="System.Drawing.Point, System.Drawing">
+    <value>12, 3</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="documentTabs.ShowToolTips" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="documentTabs.Size" type="System.Drawing.Size, System.Drawing">
+    <value>240, 259</value>
+  </data>
+  <data name="documentTabs.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;documentTabs.Name" xml:space="preserve">
+    <value>documentTabs</value>
+  </data>
+  <data name="&gt;&gt;documentTabs.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;documentTabs.Parent" xml:space="preserve">
+    <value>docBottomContainer.Panel1</value>
+  </data>
+  <data name="&gt;&gt;documentTabs.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="docBottomContainer.Panel1.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
+    <value>No</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel1.Name" xml:space="preserve">
+    <value>docBottomContainer.Panel1</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel1.Parent" xml:space="preserve">
+    <value>docBottomContainer</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel1.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="bottomZone.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <metadata name="bottomImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>350, 17</value>
+  </metadata>
+  <data name="bottomImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
+    <value>16, 16</value>
+  </data>
+  <data name="bottomZone.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="bottomZone.Padding" type="System.Drawing.Point, System.Drawing">
+    <value>12, 3</value>
+  </data>
+  <data name="bottomZone.ShowToolTips" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="bottomZone.Size" type="System.Drawing.Size, System.Drawing">
+    <value>240, 181</value>
+  </data>
+  <data name="bottomZone.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;bottomZone.Name" xml:space="preserve">
+    <value>bottomZone</value>
+  </data>
+  <data name="&gt;&gt;bottomZone.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;bottomZone.Parent" xml:space="preserve">
+    <value>docBottomContainer.Panel2</value>
+  </data>
+  <data name="&gt;&gt;bottomZone.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="docBottomContainer.Panel2.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
+    <value>No</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel2.Name" xml:space="preserve">
+    <value>docBottomContainer.Panel2</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel2.Parent" xml:space="preserve">
+    <value>docBottomContainer</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Panel2.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="docBottomContainer.Panel2MinSize" type="System.Int32, mscorlib">
+    <value>100</value>
+  </data>
+  <data name="docBottomContainer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>240, 444</value>
+  </data>
+  <data name="docBottomContainer.SplitterDistance" type="System.Int32, mscorlib">
+    <value>259</value>
+  </data>
+  <data name="docBottomContainer.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Name" xml:space="preserve">
+    <value>docBottomContainer</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.Parent" xml:space="preserve">
+    <value>docRightContainer.Panel1</value>
+  </data>
+  <data name="&gt;&gt;docBottomContainer.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="docRightContainer.Panel1.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
+    <value>No</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel1.Name" xml:space="preserve">
+    <value>docRightContainer.Panel1</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel1.Parent" xml:space="preserve">
+    <value>docRightContainer</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel1.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="docRightContainer.Panel1MinSize" type="System.Int32, mscorlib">
+    <value>240</value>
+  </data>
+  <data name="rightZone.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <metadata name="rightImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>122, 17</value>
+  </metadata>
+  <data name="rightImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
+    <value>16, 16</value>
+  </data>
+  <data name="rightZone.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="rightZone.Padding" type="System.Drawing.Point, System.Drawing">
+    <value>12, 3</value>
+  </data>
+  <data name="rightZone.ShowToolTips" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="rightZone.Size" type="System.Drawing.Size, System.Drawing">
+    <value>138, 444</value>
+  </data>
+  <data name="rightZone.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;rightZone.Name" xml:space="preserve">
+    <value>rightZone</value>
+  </data>
+  <data name="&gt;&gt;rightZone.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;rightZone.Parent" xml:space="preserve">
+    <value>docRightContainer.Panel2</value>
+  </data>
+  <data name="&gt;&gt;rightZone.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="docRightContainer.Panel2.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
+    <value>No</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel2.Name" xml:space="preserve">
+    <value>docRightContainer.Panel2</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel2.Parent" xml:space="preserve">
+    <value>docRightContainer</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Panel2.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="docRightContainer.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
+    <value>No</value>
+  </data>
+  <data name="docRightContainer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>382, 444</value>
+  </data>
+  <data name="docRightContainer.SplitterDistance" type="System.Int32, mscorlib">
+    <value>240</value>
+  </data>
+  <data name="docRightContainer.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Name" xml:space="preserve">
+    <value>docRightContainer</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.Parent" xml:space="preserve">
+    <value>topContainer.Panel2</value>
+  </data>
+  <data name="&gt;&gt;docRightContainer.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="topContainer.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="topContainer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="leftZone.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <metadata name="leftImgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="leftImgList.ImageSize" type="System.Drawing.Size, System.Drawing">
+    <value>16, 16</value>
+  </data>
+  <data name="leftZone.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="leftZone.Padding" type="System.Drawing.Point, System.Drawing">
+    <value>12, 3</value>
+  </data>
+  <data name="leftZone.ShowToolTips" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="leftZone.Size" type="System.Drawing.Size, System.Drawing">
+    <value>240, 444</value>
+  </data>
+  <data name="leftZone.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;leftZone.Name" xml:space="preserve">
+    <value>leftZone</value>
+  </data>
+  <data name="&gt;&gt;leftZone.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;leftZone.Parent" xml:space="preserve">
+    <value>topContainer.Panel1</value>
+  </data>
+  <data name="&gt;&gt;leftZone.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel1.Name" xml:space="preserve">
+    <value>topContainer.Panel1</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel1.Parent" xml:space="preserve">
+    <value>topContainer</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel1.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="topContainer.Panel1MinSize" type="System.Int32, mscorlib">
+    <value>240</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel2.Name" xml:space="preserve">
+    <value>topContainer.Panel2</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel2.Parent" xml:space="preserve">
+    <value>topContainer</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Panel2.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="topContainer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>626, 444</value>
+  </data>
+  <data name="topContainer.SplitterDistance" type="System.Int32, mscorlib">
+    <value>240</value>
+  </data>
+  <data name="topContainer.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Name" xml:space="preserve">
+    <value>topContainer</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;topContainer.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;topContainer.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <metadata name="ctxDocumentTabs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>482, 17</value>
+  </metadata>
+  <data name="closeTabToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>166, 22</value>
+  </data>
+  <data name="closeTabToolStripMenuItem.Text" xml:space="preserve">
+    <value>Close</value>
+  </data>
+  <data name="closeAllButThisToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>166, 22</value>
+  </data>
+  <data name="closeAllButThisToolStripMenuItem.Text" xml:space="preserve">
+    <value>Close All But This</value>
+  </data>
+  <data name="closeAllTabsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>166, 22</value>
+  </data>
+  <data name="closeAllTabsToolStripMenuItem.Text" xml:space="preserve">
+    <value>Close All Tabs</value>
+  </data>
+  <data name="ctxDocumentTabs.Size" type="System.Drawing.Size, System.Drawing">
+    <value>167, 92</value>
+  </data>
+  <data name="&gt;&gt;ctxDocumentTabs.Name" xml:space="preserve">
+    <value>ctxDocumentTabs</value>
+  </data>
+  <data name="&gt;&gt;ctxDocumentTabs.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
+    <value>626, 444</value>
+  </data>
+  <data name="&gt;&gt;docImgList.Name" xml:space="preserve">
+    <value>docImgList</value>
+  </data>
+  <data name="&gt;&gt;docImgList.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;bottomImgList.Name" xml:space="preserve">
+    <value>bottomImgList</value>
+  </data>
+  <data name="&gt;&gt;bottomImgList.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;rightImgList.Name" xml:space="preserve">
+    <value>rightImgList</value>
+  </data>
+  <data name="&gt;&gt;rightImgList.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;leftImgList.Name" xml:space="preserve">
+    <value>leftImgList</value>
+  </data>
+  <data name="&gt;&gt;leftImgList.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;closeTabToolStripMenuItem.Name" xml:space="preserve">
+    <value>closeTabToolStripMenuItem</value>
+  </data>
+  <data name="&gt;&gt;closeTabToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;closeAllButThisToolStripMenuItem.Name" xml:space="preserve">
+    <value>closeAllButThisToolStripMenuItem</value>
+  </data>
+  <data name="&gt;&gt;closeAllButThisToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;closeAllTabsToolStripMenuItem.Name" xml:space="preserve">
+    <value>closeAllTabsToolStripMenuItem</value>
+  </data>
+  <data name="&gt;&gt;closeAllTabsToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>ZonedContainer</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
\ No newline at end of file



More information about the mapguide-commits mailing list