[mapguide-commits] r7514 - in trunk/Tools/Maestro: Maestro.AddIn.Local/Commands Maestro.AddIn.Local/Services Maestro.AddIn.Scripting/Services Maestro.Base Maestro.Base/Commands Maestro.Base/Editor Maestro.Base/Events Maestro.Base/Services Maestro.Base/UI Maestro.Editors Maestro.Editors/Common Maestro.Editors/Generic Maestro.Editors/MapDefinition Maestro.Editors/Preview Maestro.Editors/Properties Maestro.Editors/Resources Maestro.LiveMapEditor

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Tue May 21 09:34:18 PDT 2013


Author: jng
Date: 2013-05-21 09:34:18 -0700 (Tue, 21 May 2013)
New Revision: 7514

Added:
   trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.resx
   trunk/Tools/Maestro/Maestro.Editors/Preview/
   trunk/Tools/Maestro/Maestro.Editors/Preview/DefaultResourcePreviewer.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/IResourcePreviewer.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/IUrlLauncherService.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/LocalMapPreviewer.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.resx
   trunk/Tools/Maestro/Maestro.Editors/Preview/PreviewSettings.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewEngine.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewFactory.cs
   trunk/Tools/Maestro/Maestro.Editors/Preview/StubPreviewer.cs
   trunk/Tools/Maestro/Maestro.Editors/Resources/document-search-result.png
Removed:
   trunk/Tools/Maestro/Maestro.Base/Editor/ResourcePreviewEngine.cs
   trunk/Tools/Maestro/Maestro.Base/Services/ResourcePreviewerFactory.cs
   trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.cs
   trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.resx
Modified:
   trunk/Tools/Maestro/Maestro.AddIn.Local/Commands/StartupCommand.cs
   trunk/Tools/Maestro/Maestro.AddIn.Local/Services/LocalPreviewer.cs
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/Services/ScriptingClasses.cs
   trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs
   trunk/Tools/Maestro/Maestro.Base/Editor/EditorContentBase.cs
   trunk/Tools/Maestro/Maestro.Base/Editor/ResourceEditorService.cs
   trunk/Tools/Maestro/Maestro.Base/Editor/XmlEditor.cs
   trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs
   trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj
   trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs
   trunk/Tools/Maestro/Maestro.Base/Strings.Designer.cs
   trunk/Tools/Maestro/Maestro.Base/Strings.resx
   trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs
   trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs
   trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj
   trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.cs
   trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.resx
   trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorLegend.cs
   trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorRepositoryView.cs
   trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.resx
   trunk/Tools/Maestro/Maestro.Editors/ResourceEditorServiceBase.cs
   trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Strings.resx
   trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.Designer.cs
   trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.cs
   trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.resx
   trunk/Tools/Maestro/Maestro.LiveMapEditor/Program.cs
Log:
This mega-submission includes the following changes:
 - Move resource preview related functionality off to the Maestro.Editors library
 - #2018: Live Map Definition Editor improvements:
   - Support drag/drop layer/group restructuring in the Legend view
   - Show Feature Sources and Layer Definitions in the Repository View
   - Add basic edit/preview functionality for resources in the Repository View. This currently uses the generic XML editor as the code we use to resolve resource types to specialized editors is currently tightly wedded to the Maestro AddIn infrastructure.
   - Fix save not actually saving anything due to the missing SyncSessionCopy() call which actually flushes our in-memory Map Definition changes

Modified: trunk/Tools/Maestro/Maestro.AddIn.Local/Commands/StartupCommand.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Local/Commands/StartupCommand.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.AddIn.Local/Commands/StartupCommand.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -27,6 +27,7 @@
 using Maestro.Base.Services;
 using Maestro.AddIn.Local.Services;
 using OSGeo.MapGuide;
+using Maestro.Editors.Preview;
 
 namespace Maestro.AddIn.Local.Commands
 {

Modified: trunk/Tools/Maestro/Maestro.AddIn.Local/Services/LocalPreviewer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Local/Services/LocalPreviewer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.AddIn.Local/Services/LocalPreviewer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -30,6 +30,7 @@
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using Maestro.Editors;
+using Maestro.Editors.Preview;
 
 namespace Maestro.AddIn.Local.Services
 {

Modified: trunk/Tools/Maestro/Maestro.AddIn.Scripting/Services/ScriptingClasses.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/Services/ScriptingClasses.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/Services/ScriptingClasses.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -35,6 +35,7 @@
 using Maestro.Editors.Generic;
 using Maestro.Base.Editor;
 using Microsoft.Scripting.Hosting.Providers;
+using Maestro.Editors.Preview;
 
 namespace Maestro.AddIn.Scripting.Services
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Commands/StartupCommand.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -31,6 +31,7 @@
 using Maestro.Base.UI.Preferences;
 using System.Windows.Forms;
 using Maestro.Shared.UI;
+using Maestro.Editors.Preview;
 
 namespace Maestro.Base.Commands
 {
@@ -40,14 +41,18 @@
         {
             ResourceService.RegisterNeutralImages(Properties.Resources.ResourceManager);
             ResourceService.RegisterNeutralStrings(Strings.ResourceManager);
-
-            ResourcePreviewerFactory.RegisterPreviewer("Maestro.Http", new DefaultResourcePreviewer()); //NOXLATE
-            //A stub previewer does nothing, but will use local map previews for applicable resources if the configuration
-            //property is set
-            ResourcePreviewerFactory.RegisterPreviewer("Maestro.LocalNative", new StubPreviewer()); //NOXLATE
             
             Workbench.WorkbenchInitialized += (sender, e) =>
             {
+                PreviewSettings.UseAjaxViewer = PropertyService.Get(ConfigProperties.PreviewViewerType, "AJAX") == "AJAX"; //NOXLATE
+                PreviewSettings.UseLocalPreview = PropertyService.Get(ConfigProperties.UseLocalPreview, ConfigProperties.DefaultUseLocalPreview);
+
+                var urlLauncher = ServiceRegistry.GetService<UrlLauncherService>();
+                ResourcePreviewerFactory.RegisterPreviewer("Maestro.Http", new LocalMapPreviewer(new DefaultResourcePreviewer(urlLauncher), urlLauncher)); //NOXLATE
+                //A stub previewer does nothing, but will use local map previews for applicable resources if the configuration
+                //property is set
+                ResourcePreviewerFactory.RegisterPreviewer("Maestro.LocalNative", new LocalMapPreviewer(new StubPreviewer(), urlLauncher)); //NOXLATE
+
                 ServiceRegistry.GetService<NewItemTemplateService>().InitUserTemplates();
                 var wb = Workbench.Instance;
                 wb.FormClosing += new System.Windows.Forms.FormClosingEventHandler(OnWorkbenchClosing);

Modified: trunk/Tools/Maestro/Maestro.Base/Editor/EditorContentBase.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Editor/EditorContentBase.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Editor/EditorContentBase.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -35,6 +35,7 @@
 using OSGeo.MapGuide.MaestroAPI.Resource.Conversion;
 using System.IO;
 using Maestro.Base.Services;
+using Maestro.Editors.Preview;
 
 namespace Maestro.Base.Editor
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Editor/ResourceEditorService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Editor/ResourceEditorService.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Editor/ResourceEditorService.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -32,6 +32,7 @@
 using Maestro.Base.UI;
 using OSGeo.MapGuide.MaestroAPI.Schema;
 using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
+using Maestro.Editors.Preview;
 
 namespace Maestro.Base.Editor
 {

Deleted: trunk/Tools/Maestro/Maestro.Base/Editor/ResourcePreviewEngine.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Editor/ResourcePreviewEngine.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Editor/ResourcePreviewEngine.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,319 +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 Maestro.Editors;
-using OSGeo.MapGuide.ObjectModels.LayerDefinition;
-using OSGeo.MapGuide.ObjectModels;
-using OSGeo.MapGuide.MaestroAPI.Resource;
-using Maestro.Base.UI.Preferences;
-using ICSharpCode.Core;
-using OSGeo.MapGuide.ObjectModels.MapDefinition;
-using OSGeo.MapGuide.ObjectModels.WebLayout;
-using OSGeo.MapGuide.MaestroAPI;
-using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
-using OSGeo.MapGuide.ObjectModels.WatermarkDefinition;
-
-namespace Maestro.Base.Editor
-{
-    internal class ResourcePreviewEngine
-    {
-        private string _rootUrl;
-        private IEditorService _edSvc;
-
-        public ResourcePreviewEngine(string rootUrl, IEditorService edSvc)
-        {
-            _rootUrl = rootUrl;
-            _edSvc = edSvc;
-        }
-
-        static string GetLocale(string locale)
-        {
-            return string.IsNullOrEmpty(locale) ? "en" : locale; //NOXLATE
-        }
-
-        private string GenerateFeatureSourcePreviewUrl(IResource res, string locale)
-        {
-            string url = _rootUrl;
-            if (!url.EndsWith("/")) //NOXLATE
-                url += "/"; //NOXLATE
-
-            var resId = res.ResourceID;
-            var sessionId = _edSvc.SessionID;
-            url += "schemareport/describeschema.php?viewer=basic&schemaName=&className=&resId=" + resId + "&sessionId=" + sessionId + "&locale=" + GetLocale(locale); //NOXLATE
-
-            return url;
-        }
-
-        private string GenerateLayerPreviewUrl(IResource res, string locale)
-        {
-            string url = _rootUrl;
-            if (!url.EndsWith("/")) //NOXLATE
-                url += "/"; //NOXLATE
-
-            var ldf = (ILayerDefinition)res;
-            var sessionId = _edSvc.SessionID;
-            var conn = res.CurrentConnection;
-
-            string layerName = string.Empty;
-            //Use feature source as name/label if new and unsaved
-            if (_edSvc.IsNew)
-                layerName = ResourceIdentifier.GetName(ldf.SubLayer.ResourceId);
-            else
-                layerName = ResourceIdentifier.GetName(_edSvc.ResourceID);
-
-            var mdf = CreateLayerPreviewMapDefinition(ldf, sessionId, layerName, conn);
-            if (PropertyService.Get(ConfigProperties.PreviewViewerType, "AJAX").Equals("AJAX")) //NOXLATE
-            {
-                //Create temp web layout to house this map
-                var wl = ObjectFactory.CreateWebLayout(_edSvc.GetEditedResource().CurrentConnection, new Version(1, 0, 0), mdf.ResourceID);
-
-                //Add a custom zoom command (to assist previews of layers that aren't [0, infinity] scale)
-                AttachPreviewCommands(wl);
-
-                var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".WebLayout"; //NOXLATE
-
-                conn.ResourceService.SaveResourceAs(wl, resId);
-                url += "mapviewerajax/?WEBLAYOUT=" + resId + "&SESSION=" + sessionId + "&LOCALE=" + GetLocale(locale); //NOXLATE
-            }
-            else
-            {
-                throw new NotImplementedException();
-                ////Create temp flex layout
-                //var appDef = ObjectFactory.CreatePreviewFlexLayout(conn);
-                //var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition"; //NOXLATE
-                //appDef.AddMapGroup("previewmap", true, mdfId); //NOXLATE
-
-                //conn.ResourceService.SaveResourceAs(appDef, resId);
-                //url += "fusion/templates/mapguide/preview/index.html?Session=" + sessionId + "&ApplicationDefinition=" + resId; //NOXLATE
-            }
-
-            return url;
-        }
-
-        internal static IMapDefinition CreateLayerPreviewMapDefinition(ILayerDefinition ldf, string sessionId, string layerName, IServerConnection conn)
-        {
-            //Create temp map definition to house our current layer
-            var mdfId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".MapDefinition"; //NOXLATE
-            string csWkt;
-            var extent = ldf.GetSpatialExtent(true, out csWkt);
-            if (extent == null)
-                throw new ApplicationException(Strings.FailedToCalculateFeatureSourceExtents);
-
-            //TODO: Based on the visible scales in this layer, size this extents accordingly
-            var mdf = ObjectFactory.CreateMapDefinition(conn, Strings.PreviewMap, csWkt, extent);
-
-            var layer = mdf.AddLayer(null, layerName, ldf.ResourceID);
-            conn.ResourceService.SaveResourceAs(mdf, mdfId);
-            mdf.ResourceID = mdfId;
-            return mdf;
-        }
-
-        private static void AttachPreviewCommands(IWebLayout wl)
-        {
-            var cmd = wl.CreateInvokeScriptCommand();
-            cmd.Name = "ZoomScale"; //NOXLATE
-            cmd.Label = Strings.Label_ZoomToScale;
-            cmd.Tooltip = Strings.Desc_ZoomToScale;
-            cmd.Script = @"
-                var map = parent.parent.GetMapFrame();
-                var center = map.GetCenter();
-                var scale = parseFloat(prompt('Enter the scale:'));
-                map.ZoomToView(center.X, center.Y, scale, true);
-                "; //NOXLATE
-
-            cmd.TargetViewer = TargetViewerType.Ajax;
-            cmd.ImageURL = "../stdicons/icon_zoom.gif"; //NOXLATE
-
-            wl.CommandSet.AddCommand(cmd);
-
-            var cmd2 = wl.CreateInvokeScriptCommand();
-            cmd2.Name = "GetMapKml"; //NOXLATE
-            cmd2.Label = Strings.Label_GetMapKml;
-            cmd2.Description = Strings.Desc_GetMapKml;
-            cmd2.Tooltip = Strings.Desc_GetMapKml;
-
-            cmd2.Script = @"
-                var map = parent.parent.GetMapFrame();
-                var url = ""../mapagent/mapagent.fcgi?OPERATION=GETMAPKML&VERSION=1.0.0&FORMAT=KML&DISPLAYDPI=96&MAPDEFINITION=" + wl.Map.ResourceId + @""";
-                url += ""&SESSION="" + map.GetSessionId();
-                window.open(url);"; //NOXLATE
-
-            cmd2.TargetViewer = TargetViewerType.Ajax;
-            cmd2.ImageURL = "../stdicons/icon_invokescript.gif"; //NOXLATE
-
-            wl.CommandSet.AddCommand(cmd2);
-
-            var cmd3 = wl.CreateInvokeScriptCommand();
-            cmd3.Name = "GetExtents"; //NOXLATE
-            cmd3.Label = Strings.Label_GetExtents;
-            cmd3.Description = Strings.Desc_GetExtents;
-            cmd3.Tooltip = Strings.Desc_GetExtents;
-
-            cmd3.Script = @"
-                var map = parent.parent.GetMapFrame();
-                alert('Map Extents\n\nLower Left: ' + map.extX1 + ', ' + map.extY2 + '\nUpper Right: ' + map.extX2 + ', ' + map.extY1);
-                "; //NOXLATE
-
-            cmd3.TargetViewer = TargetViewerType.Ajax;
-            cmd3.ImageURL = "../stdicons/icon_invokescript.gif"; //NOXLATE
-
-            wl.CommandSet.AddCommand(cmd3);
-            
-            var zoomScale = wl.CreateCommandItem(cmd.Name);
-            var menu = wl.CreateFlyout(Strings.Label_Tools, Strings.Label_Tools, Strings.Label_ExtraTools, string.Empty, string.Empty,
-                wl.CreateCommandItem("ZoomScale"), //NOXLATE
-                wl.CreateCommandItem("GetMapKml"), //NOXLATE
-                wl.CreateCommandItem("GetExtents") //NOXLATE
-            );
-            wl.ToolBar.AddItem(menu);
-        }
-
-        private string GenerateWatermarkPreviewUrl(IWatermarkDefinition wmd, string locale)
-        {
-            //We demand a 2.3.0 Map Definition or higher
-            if (wmd.CurrentConnection.SiteVersion < new Version(2, 3))
-                throw new InvalidOperationException(Strings.SiteVersionDoesntSupportWatermarks);
-
-            IMapDefinition2 map = CreateWatermarkPreviewMapDefinition(wmd);
-            return GenerateMapPreviewUrl(map, locale);
-        }
-
-        internal static IMapDefinition2 CreateWatermarkPreviewMapDefinition(IWatermarkDefinition wmd)
-        {
-            IMapDefinition2 map = (IMapDefinition2)ObjectFactory.CreateMapDefinition(wmd.CurrentConnection, wmd.SupportedMapDefinitionVersion, "Watermark Definition Preview"); //NOXLATE
-            map.CoordinateSystem = @"LOCAL_CS[""*XY-M*"", LOCAL_DATUM[""*X-Y*"", 10000], UNIT[""Meter"", 1], AXIS[""X"", EAST], AXIS[""Y"", NORTH]]"; //NOXLATE
-            map.Extents = ObjectFactory.CreateEnvelope(-1000000, -1000000, 1000000, 1000000);
-            map.AddWatermark(wmd);
-            return map;
-        }
-
-        private string GenerateMapPreviewUrl(IResource res, string locale)
-        {
-            string url = _rootUrl;
-            if (!url.EndsWith("/")) //NOXLATE
-                url += "/"; //NOXLATE
-
-            var sessionId = _edSvc.SessionID;
-            var mdfId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".MapDefinition"; //NOXLATE
-            var mdf = (IMapDefinition)res;
-
-            var conn = mdf.CurrentConnection;
-            conn.ResourceService.SaveResourceAs(mdf, mdfId);
-
-            if (PropertyService.Get(ConfigProperties.PreviewViewerType, "AJAX").Equals("AJAX")) //NOXLATE
-            {
-                //Create temp web layout to house this map
-                var wl = ObjectFactory.CreateWebLayout(_edSvc.GetEditedResource().CurrentConnection, new Version(1, 0, 0), mdfId);
-
-                //Add a custom zoom command (to assist previews of layers that aren't [0, infinity] scale)
-                AttachPreviewCommands(wl);
-
-                var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".WebLayout"; //NOXLATE
-
-                conn.ResourceService.SaveResourceAs(wl, resId);
-                url += "mapviewerajax/?WEBLAYOUT=" + resId + "&SESSION=" + sessionId + "&LOCALE=" + GetLocale(locale); //NOXLATE
-            }
-            else
-            {
-                throw new NotImplementedException();
-                ////Create temp flex layout
-                //var appDef = ObjectFactory.CreateFlexibleLayout(conn);
-                //var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition"; //NOXLATE
-                //appDef.AddMapGroup("previewmap", true, mdfId); //NOXLATE
-
-                //conn.ResourceService.SaveResourceAs(appDef, resId);
-                //url += "fusion/templates/mapguide/preview/index.html?Session=" + sessionId + "&ApplicationDefinition=" + resId; //NOXLATE
-            }
-
-            return url;
-        }
-
-        private string GenerateWebLayoutPreviewUrl(IResource res, string locale)
-        {
-            string url = _rootUrl;
-            if (!url.EndsWith("/")) //NOXLATE
-                url += "/"; //NOXLATE
-
-            var sessionId = _edSvc.SessionID;
-            var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".WebLayout"; //NOXLATE
-            var conn = res.CurrentConnection;
-
-            conn.ResourceService.SaveResourceAs(res, resId);
-            url += "mapviewerajax/?WEBLAYOUT=" + resId + "&SESSION=" + sessionId + "&LOCALE=" + GetLocale(locale); //NOXLATE
-
-            return url;
-        }
-
-        private string GenerateFlexLayoutPreviewUrl(IResource res, string locale)
-        {
-            string url = _rootUrl;
-            if (!url.EndsWith("/")) //NOXLATE
-                url += "/"; //NOXLATE
-
-            //Create temp flex layout
-            var sessionId = _edSvc.SessionID;
-            var appDef = (IApplicationDefinition)res;
-            var conn = appDef.CurrentConnection;
-            var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition"; //NOXLATE
-            
-            conn.ResourceService.SaveResourceAs(appDef, resId);
-            url += appDef.TemplateUrl + "?Session=" + sessionId + "&ApplicationDefinition=" + resId + "&locale=" + GetLocale(locale); //NOXLATE
-            return url;
-        }
-
-        public string GeneratePreviewUrl(IResource res, string locale)
-        {
-            switch (res.ResourceType)
-            {
-                case ResourceTypes.FeatureSource:
-                    return GenerateFeatureSourcePreviewUrl(res, locale);
-                case ResourceTypes.ApplicationDefinition:
-                    return GenerateFlexLayoutPreviewUrl(res, locale);
-                case ResourceTypes.LayerDefinition:
-                    return GenerateLayerPreviewUrl(res, locale);
-                case ResourceTypes.MapDefinition:
-                    return GenerateMapPreviewUrl(res, locale);
-                case ResourceTypes.WebLayout:
-                    return GenerateWebLayoutPreviewUrl(res, locale);
-                case ResourceTypes.WatermarkDefinition:
-                    return GenerateWatermarkPreviewUrl((IWatermarkDefinition)res, locale);
-                default:
-                    throw new InvalidOperationException(Strings.UnpreviewableResourceType);
-            }
-        }
-
-        private static ResourceTypes[] PREVIEWABLE_RESOURCE_TYPES = new ResourceTypes[] 
-        {
-            ResourceTypes.FeatureSource,
-            ResourceTypes.ApplicationDefinition,
-            ResourceTypes.LayerDefinition,
-            ResourceTypes.MapDefinition,
-            ResourceTypes.WebLayout,
-            ResourceTypes.WatermarkDefinition
-        };
-
-        internal static bool IsPreviewableType(OSGeo.MapGuide.MaestroAPI.ResourceTypes rt)
-        {
-            return Array.IndexOf(PREVIEWABLE_RESOURCE_TYPES, rt) >= 0;
-        }
-    }
-}

Modified: trunk/Tools/Maestro/Maestro.Base/Editor/XmlEditor.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Editor/XmlEditor.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Editor/XmlEditor.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -37,6 +37,7 @@
 using Maestro.Base.UI.Preferences;
 using Maestro.Base.Services;
 using Maestro.Editors.Common;
+using Maestro.Editors.Preview;
 
 namespace Maestro.Base.Editor
 {

Modified: trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Events/EventWatcher.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -29,6 +29,7 @@
 using System.Windows.Forms;
 using Maestro.Shared.UI;
 using Maestro.Base.UI.Preferences;
+using Maestro.Editors.Preview;
 
 namespace Maestro.Base.Events
 {
@@ -43,6 +44,7 @@
             _keepAliveTimer.Tick += OnKeepAliveTimerElapsed;
             var svc = ServiceRegistry.GetService<ServerConnectionManager>();
             Debug.Assert(svc != null);
+            PropertyService.PropertyChanged += OnAppPropertyChanged;
 
             svc.ConnectionAdded += new ServerConnectionEventHandler(OnConnectionAdded);
             svc.ConnectionRemoved += new ServerConnectionEventHandler(OnConnectionRemoved);
@@ -51,6 +53,21 @@
             _keepAliveTimer.Start();
         }
 
+        private static void OnAppPropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            switch (e.Key)
+            {
+                case ConfigProperties.UseLocalPreview:
+                    PreviewSettings.UseLocalPreview = Convert.ToBoolean(e.NewValue);
+                    LoggingService.Info("Use Local Preview setting is now: " + PreviewSettings.UseLocalPreview); //NOXLATE
+                    break;
+                case ConfigProperties.PreviewViewerType:
+                    PreviewSettings.UseAjaxViewer = (e.NewValue.ToString() == "AJAX"); //NOXLATE
+                    LoggingService.Info("Use AJAX Viewer setting is now: " + PreviewSettings.UseAjaxViewer);
+                    break;
+            }
+        }
+
         static bool smShowingError = false;
 
         static void OnKeepAliveTimerElapsed(object sender, EventArgs e)

Modified: trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Maestro.Base.csproj	2013-05-21 16:34:18 UTC (rev 7514)
@@ -208,7 +208,6 @@
       <DependentUpon>PrintLayoutEditor.cs</DependentUpon>
     </Compile>
     <Compile Include="Editor\ResourceEditorService.cs" />
-    <Compile Include="Editor\ResourcePreviewEngine.cs" />
     <Compile Include="Editor\SymbolDefinitionEditor.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -263,7 +262,6 @@
     <Compile Include="Services\IDragDropHandler.cs" />
     <Compile Include="Services\NewItemTemplateService.cs" />
     <Compile Include="Services\OpenResourceManager.cs" />
-    <Compile Include="Services\ResourcePreviewerFactory.cs" />
     <Compile Include="Services\ServerConnectionManager.cs" />
     <Compile Include="Services\ServiceRegistry.cs" />
     <Compile Include="Services\UrlLauncherService.cs" />
@@ -326,12 +324,6 @@
     <Compile Include="UI\LabelLocalizationDialog.Designer.cs">
       <DependentUpon>LabelLocalizationDialog.cs</DependentUpon>
     </Compile>
-    <Compile Include="UI\MapPreviewDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="UI\MapPreviewDialog.Designer.cs">
-      <DependentUpon>MapPreviewDialog.cs</DependentUpon>
-    </Compile>
     <Compile Include="UI\MessageViewer.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -608,9 +600,6 @@
     <EmbeddedResource Include="UI\LabelLocalizationDialog.resx">
       <DependentUpon>LabelLocalizationDialog.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="UI\MapPreviewDialog.resx">
-      <DependentUpon>MapPreviewDialog.cs</DependentUpon>
-    </EmbeddedResource>
     <EmbeddedResource Include="UI\MessageViewer.resx">
       <DependentUpon>MessageViewer.cs</DependentUpon>
       <SubType>Designer</SubType>

Deleted: trunk/Tools/Maestro/Maestro.Base/Services/ResourcePreviewerFactory.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/ResourcePreviewerFactory.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Services/ResourcePreviewerFactory.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,396 +0,0 @@
-#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 OSGeo.MapGuide.MaestroAPI.Resource;
-using OSGeo.MapGuide.MaestroAPI;
-using Maestro.Base.Editor;
-using Maestro.Editors;
-using System.Drawing;
-using OSGeo.MapGuide.ObjectModels.LayerDefinition;
-using OSGeo.MapGuide.ObjectModels;
-using OSGeo.MapGuide.MaestroAPI.Services;
-using Maestro.Editors.SymbolDefinition;
-using ICSharpCode.Core;
-using Maestro.Base.UI.Preferences;
-using OSGeo.MapGuide.ObjectModels.MapDefinition;
-using OSGeo.MapGuide.ObjectModels.WatermarkDefinition;
-using Maestro.Base.UI;
-using OSGeo.MapGuide.MaestroAPI.Mapping;
-
-namespace Maestro.Base.Services
-{
-    /// <summary>
-    /// Defines an interface for previewing resources
-    /// </summary>
-    public interface IResourcePreviewer
-    {
-        /// <summary>
-        /// Gets whether the specified resource can be previewed
-        /// </summary>
-        /// <param name="res"></param>
-        /// <returns></returns>
-        bool IsPreviewable(IResource res);
-
-        /// <summary>
-        /// Previews the specified resource
-        /// </summary>
-        /// <param name="res">The resource to be previewed</param>
-        /// <param name="edSvc">The editor service</param>
-        void Preview(IResource res, IEditorService edSvc);
-
-        /// <summary>
-        /// Previews the specified resource using the given locale
-        /// </summary>
-        /// <param name="res">The resource to be previewed</param>
-        /// <param name="edSvc">The editor service</param>
-        /// <param name="locale">The locale</param>
-        /// <remarks>
-        /// The locale parameter should be treated as a hint. The underlying <see cref="T:OSGeo.MapGuide.MaestroAPI.IServerConnection"/> implementation
-        /// may not actually respect this value.
-        /// </remarks>
-        void Preview(IResource res, IEditorService edSvc, string locale);
-    }
-
-    internal class StubPreviewer : IResourcePreviewer
-    {
-        public bool IsPreviewable(IResource res)
-        {
-            return false;
-        }
-
-        public void Preview(IResource res, IEditorService edSvc)
-        {
-            
-        }
-
-        public void Preview(IResource res, IEditorService edSvc, string locale)
-        {
-            
-        }
-    }
-
-
-    public class LocalMapPreviewer : IResourcePreviewer
-    {
-        private IResourcePreviewer _inner;
-
-        public LocalMapPreviewer(IResourcePreviewer inner)
-        {
-            _inner = inner;
-        }
-
-        public bool UseLocal
-        {
-            get { return PropertyService.Get(ConfigProperties.UseLocalPreview, ConfigProperties.DefaultUseLocalPreview); }
-        }
-
-        public bool IsPreviewable(IResource res)
-        {
-            if (this.UseLocal)
-            {
-                if (IsLocalPreviewableType(res))
-                {
-                    return true;
-                }
-            }
-            return _inner.IsPreviewable(res);
-        }
-
-        private static bool IsLocalPreviewableType(IResource res)
-        {
-            return res.ResourceType == ResourceTypes.LayerDefinition ||
-                   res.ResourceType == ResourceTypes.MapDefinition ||
-                   res.ResourceType == ResourceTypes.WatermarkDefinition;
-        }
-
-        public void Preview(IResource res, IEditorService edSvc)
-        {
-            Preview(res, edSvc, null);
-        }
-
-        static bool SupportsMappingService(IServerConnection conn)
-        {
-            return Array.IndexOf(conn.Capabilities.SupportedServices, (int)ServiceType.Mapping) >= 0;
-        }
-
-        public void Preview(IResource res, IEditorService edSvc, string locale)
-        {
-            IServerConnection conn = res.CurrentConnection;
-            if (this.UseLocal && IsLocalPreviewableType(res) && SupportsMappingService(conn))
-            {
-                BusyWaitDelegate worker = () =>
-                {
-                    IMappingService mapSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping);
-                    IMapDefinition previewMdf = null;
-                    switch (res.ResourceType)
-                    {
-                        case ResourceTypes.LayerDefinition:
-                            {
-                                ILayerDefinition ldf = (ILayerDefinition)res;
-                                string layerName = string.Empty;
-                                if (edSvc.IsNew)
-                                    layerName = ResourceIdentifier.GetName(ldf.SubLayer.ResourceId);
-                                else
-                                    layerName = ResourceIdentifier.GetName(edSvc.ResourceID);
-                                previewMdf = ResourcePreviewEngine.CreateLayerPreviewMapDefinition(ldf, edSvc.SessionID, layerName, conn);
-                            }
-                            break;
-                        case ResourceTypes.WatermarkDefinition:
-                            {
-                                previewMdf = ResourcePreviewEngine.CreateWatermarkPreviewMapDefinition((IWatermarkDefinition)res);
-                            }
-                            break;
-                        case ResourceTypes.MapDefinition:
-                            {
-                                previewMdf = (IMapDefinition)res;
-                            }
-                            break;
-                    }
-                    if (previewMdf != null)
-                        return mapSvc.CreateMap(previewMdf);
-                    else
-                        return null;
-                };
-                Action<object, Exception> onComplete = (obj, ex) =>
-                {
-                    if (ex != null)
-                        throw ex;
-
-                    if (obj != null)
-                    {
-                        var rtMap = (RuntimeMap)obj;
-                        var launcher = ServiceRegistry.GetService<UrlLauncherService>();
-                        var diag = new MapPreviewDialog(rtMap, launcher, (edSvc.IsNew) ? null : edSvc.ResourceID);
-                        diag.Show(null);
-                    }
-                    else //Fallback, shouldn't happen
-                    {
-                        _inner.Preview(res, edSvc, locale);
-                    }
-                };
-                BusyWaitDialog.Run(Strings.PrgPreparingResourcePreview, worker, onComplete);
-            }
-            else
-            {
-                _inner.Preview(res, edSvc, locale);
-            }
-        }
-    }
-
-    /// <summary>
-    /// The default resource previewer implementation
-    /// </summary>
-    public class DefaultResourcePreviewer : IResourcePreviewer
-    {
-        abstract class PreviewResult
-        { 
-            
-        }
-
-        class UrlPreviewResult : PreviewResult 
-        {
-            public string Url { get; set; }
-        }
-
-        class ImagePreviewResult : PreviewResult
-        {
-            public Image ImagePreview { get; set; }
-        }
-
-        /// <summary>
-        /// Previews the specified resource
-        /// </summary>
-        /// <param name="res">The resource to be previewed</param>
-        /// <param name="edSvc">The editor service</param>
-        public void Preview(IResource res, IEditorService edSvc)
-        {
-            Preview(res, edSvc, edSvc.PreviewLocale);
-        }
-
-        /// <summary>
-        /// Previews the specified resource
-        /// </summary>
-        /// <param name="res">The resource to be previewed</param>
-        /// <param name="edSvc">The editor service</param>
-        public void Preview(IResource res, IEditorService edSvc, string locale)
-        {
-            //TODO: Prompt for symbol parameters if there are any, as these can affect the rendered output
-            //and it is a nice way to test symbol parameters wrt to rendering
-
-            IServerConnection conn = res.CurrentConnection;
-            BusyWaitDelegate worker = () => {
-                string mapguideRootUrl = (string)conn.GetCustomProperty("BaseUrl"); //NOXLATE
-                //Save the current resource to another session copy
-                string resId = "Session:" + edSvc.SessionID + "//" + res.ResourceType.ToString() + "Preview" + Guid.NewGuid() + "." + res.ResourceType.ToString(); //NOXLATE
-                
-                edSvc.ResourceService.SaveResourceAs(res, resId);
-                edSvc.ResourceService.CopyResource(res.ResourceID, resId, true);
-                var previewCopy = edSvc.ResourceService.GetResource(resId);
-
-                if (previewCopy.ResourceType == ResourceTypes.SymbolDefinition && conn.SiteVersion >= new Version(2, 0))
-                {
-                    //For Symbol Definition previews, we make a placeholder Layer Definition with the 
-                    ILayerDefinition layerDef = ObjectFactory.CreateDefaultLayer(conn, LayerType.Vector);
-                    IVectorLayerDefinition2 vl = layerDef.SubLayer as IVectorLayerDefinition2;
-                    if (vl != null)
-                    {
-                        //HACK-ish: We are flubbing a completely invalid Layer Definition under normal circumstances, 
-                        //but one that has the minimum required content model to generate an appropriate GETLEGENDIMAGE preview for
-                        vl.FeatureName = string.Empty;
-                        vl.ResourceId = string.Empty;
-                        vl.Geometry = string.Empty;
-                        vl.ToolTip = string.Empty;
-                        var vsr = vl.GetScaleRangeAt(0) as IVectorScaleRange2;
-                        if (vsr != null)
-                        {
-                            vsr.AreaStyle = null;
-                            vsr.LineStyle = null;
-                            vsr.PointStyle = null;
-                            var cs = layerDef.CreateDefaultCompositeStyle();
-                            var cr = cs.GetRuleAt(0);
-                            var csym = cr.CompositeSymbolization;
-                            var si = csym.CreateSymbolReference(previewCopy.ResourceID);
-                            csym.AddSymbolInstance(si);
-                            vsr.CompositeStyle = new List<ICompositeTypeStyle>() { cs };
-
-                            var ldfId = "Session:" + edSvc.SessionID + "//" + res.ResourceType.ToString() + "Preview" + Guid.NewGuid() + ".LayerDefinition"; //NOXLATE
-                            edSvc.ResourceService.SaveResourceAs(layerDef, ldfId);
-
-                            var mappingSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping);
-                            var img = mappingSvc.GetLegendImage(42, ldfId, 0, 4, 100, 100, "PNG"); //NOXLATE
-                            return new ImagePreviewResult() { ImagePreview = img };
-                        }
-                    }
-
-                    return null;
-                }
-                else
-                {
-                    //Now feed it to the preview engine
-                    var url = new ResourcePreviewEngine(mapguideRootUrl, edSvc).GeneratePreviewUrl(previewCopy, locale);
-                    return new UrlPreviewResult() { Url = url };
-                }
-            };
-            Action<object, Exception> onComplete = (result, ex) => {
-                if (ex != null)
-                {
-                    ErrorDialog.Show(ex);
-                }
-                else
-                {
-                    var urlResult = result as UrlPreviewResult;
-                    var imgResult = result as ImagePreviewResult;
-                    if (urlResult != null)
-                    {
-                        var url = urlResult.Url;
-                        var launcher = ServiceRegistry.GetService<UrlLauncherService>();
-                        launcher.OpenUrl(url);
-                    }
-                    else if (imgResult != null)
-                    {
-                        new SymbolPreviewDialog(imgResult.ImagePreview).Show(null);
-                    }
-                }
-            };
-            BusyWaitDialog.Run(Strings.PrgPreparingResourcePreview, worker, onComplete);
-        }
-
-        /// <summary>
-        /// Gets whether the specified resource can be previewed
-        /// </summary>
-        /// <param name="res"></param>
-        /// <returns></returns>
-        public bool IsPreviewable(IResource res)
-        {
-            var rt = res.ResourceType;
-            if (res.CurrentConnection.Capabilities.SupportsResourcePreviews)
-            {
-                if (rt == ResourceTypes.SymbolDefinition)
-                {
-                    return res.CurrentConnection.SiteVersion >= new Version(2, 0) && Array.IndexOf(res.CurrentConnection.Capabilities.SupportedServices, (int)ServiceType.Mapping) >= 0;
-                }
-                else
-                {
-                    return ResourcePreviewEngine.IsPreviewableType(rt);
-                }
-            }
-            return false;
-        }
-    }
-
-    /// <summary>
-    /// A simple <see cref="T:Maestro.Base.Service.IResourcePreviewer"/> resolution container
-    /// </summary>
-    public static class ResourcePreviewerFactory
-    {
-        static Dictionary<string, IResourcePreviewer> _previewers = new Dictionary<string, IResourcePreviewer>();
-
-        /// <summary>
-        /// Registers the given <see cref="T:Maestro.Base.Service.IResourcePreviewer"/> for a given connection provider
-        /// </summary>
-        /// <param name="provider">The name of the connection provider</param>
-        /// <param name="previewer">The previewer implementation</param>
-        public static void RegisterPreviewer(string provider, IResourcePreviewer previewer)
-        {
-            _previewers[provider.ToUpper()] = new LocalMapPreviewer(previewer);
-        }
-
-        /// <summary>
-        /// Gets whether a previewer has been registered for the given connection provider
-        /// </summary>
-        /// <param name="provider"></param>
-        /// <returns></returns>
-        public static bool HasPreviewer(string provider)
-        {
-            return _previewers.ContainsKey(provider.ToUpper());
-        }
-        
-        /// <summary>
-        /// Gets whether the given resource type is previewable for the given connection provider
-        /// </summary>
-        /// <param name="provider"></param>
-        /// <param name="resource"></param>
-        /// <returns></returns>
-        public static bool IsPreviewable(string provider, IResource resource)
-        {
-            var preview = GetPreviewer(provider);
-            if (preview != null)
-                return preview.IsPreviewable(resource);
-
-            return false;
-        }
-
-        /// <summary>
-        /// Gets the registered previewer for the specified connection provider
-        /// </summary>
-        /// <param name="provider"></param>
-        /// <returns></returns>
-        public static IResourcePreviewer GetPreviewer(string provider)
-        {
-            if (HasPreviewer(provider))
-                return _previewers[provider.ToUpper()];
-
-            return null;
-        }
-    }
-}

Modified: trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Services/UrlLauncherService.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -25,22 +25,11 @@
 using Maestro.Base.UI;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Shared.UI;
+using Maestro.Editors.Preview;
 
 namespace Maestro.Base.Services
 {
     /// <summary>
-    /// Defines an interface for launching URLs
-    /// </summary>
-    public interface IUrlLauncherService
-    {
-        /// <summary>
-        /// Opens the specified url using the system default web browser
-        /// </summary>
-        /// <param name="url"></param>
-        void OpenUrl(string url);
-    }
-
-    /// <summary>
     /// An application-level service for launching URLs
     /// </summary>
     public class UrlLauncherService : ServiceBase, IUrlLauncherService

Modified: trunk/Tools/Maestro/Maestro.Base/Strings.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Strings.Designer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Strings.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.18034
+//     Runtime Version:4.0.30319.18047
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -506,33 +506,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Displays the current map extents.
-        /// </summary>
-        internal static string Desc_GetExtents {
-            get {
-                return ResourceManager.GetString("Desc_GetExtents", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to Gets the current map as a KML document.
-        /// </summary>
-        internal static string Desc_GetMapKml {
-            get {
-                return ResourceManager.GetString("Desc_GetMapKml", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to Zoom to a specified scale.
-        /// </summary>
-        internal static string Desc_ZoomToScale {
-            get {
-                return ResourceManager.GetString("Desc_ZoomToScale", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Create a Drawing Source.
         /// </summary>
         internal static string DwfHandlerAction {
@@ -605,15 +578,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Could not calculate the extents of the Feature Source. Preview is not possible.
-        /// </summary>
-        internal static string FailedToCalculateFeatureSourceExtents {
-            get {
-                return ResourceManager.GetString("FailedToCalculateFeatureSourceExtents", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Validation detected errors in your resource, please fix them before saving this resource.
         /// </summary>
         internal static string FixErrorsBeforeSaving {
@@ -776,33 +740,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Extra Tools.
-        /// </summary>
-        internal static string Label_ExtraTools {
-            get {
-                return ResourceManager.GetString("Label_ExtraTools", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to Get Extents.
-        /// </summary>
-        internal static string Label_GetExtents {
-            get {
-                return ResourceManager.GetString("Label_GetExtents", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to Get KML.
-        /// </summary>
-        internal static string Label_GetMapKml {
-            get {
-                return ResourceManager.GetString("Label_GetMapKml", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Go.
         /// </summary>
         internal static string Label_Go {
@@ -830,24 +767,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Tools.
-        /// </summary>
-        internal static string Label_Tools {
-            get {
-                return ResourceManager.GetString("Label_Tools", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to Zoom to Scale.
-        /// </summary>
-        internal static string Label_ZoomToScale {
-            get {
-                return ResourceManager.GetString("Label_ZoomToScale", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Could not determine the sub-layer type or this type is not currently supported.
         /// </summary>
         internal static string LayerSubTypeNotSupported {
@@ -1325,24 +1244,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Preview Map.
-        /// </summary>
-        internal static string PreviewMap {
-            get {
-                return ResourceManager.GetString("PreviewMap", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Looks up a localized string similar to Preparing resource preview.
-        /// </summary>
-        internal static string PrgPreparingResourcePreview {
-            get {
-                return ResourceManager.GetString("PrgPreparingResourcePreview", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Performing pre-save validation...
         ///
         ///You can disable pre-save validation in Maestro options.
@@ -2141,15 +2042,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to The site version of this current connection is not known to support watermarks.
-        /// </summary>
-        internal static string SiteVersionDoesntSupportWatermarks {
-            get {
-                return ResourceManager.GetString("SiteVersionDoesntSupportWatermarks", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Skipping resource: {0}.
         /// </summary>
         internal static string SkippingResource {
@@ -2537,15 +2429,6 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to The resource type cannot be previewed.
-        /// </summary>
-        internal static string UnpreviewableResourceType {
-            get {
-                return ResourceManager.GetString("UnpreviewableResourceType", resourceCulture);
-            }
-        }
-        
-        /// <summary>
         ///   Looks up a localized string similar to Open editor updated to {0}.
         /// </summary>
         internal static string UpdatedOpenEditor {

Modified: trunk/Tools/Maestro/Maestro.Base/Strings.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Strings.resx	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/Strings.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -272,15 +272,6 @@
   <data name="DefaultSymbolName" xml:space="preserve">
     <value>MySymbol</value>
   </data>
-  <data name="Desc_GetExtents" xml:space="preserve">
-    <value>Displays the current map extents</value>
-  </data>
-  <data name="Desc_GetMapKml" xml:space="preserve">
-    <value>Gets the current map as a KML document</value>
-  </data>
-  <data name="Desc_ZoomToScale" xml:space="preserve">
-    <value>Zoom to a specified scale</value>
-  </data>
   <data name="DwfHandlerAction" xml:space="preserve">
     <value>Create a Drawing Source</value>
   </data>
@@ -356,21 +347,6 @@
   <data name="KeepAliveFailed" xml:space="preserve">
     <value>Failed to keep session ({0}) alive. This would happen if connectivity to the MapGuide Server has been lost (it has been stopped or restarted). Refresh the Site Explorer to create a new session. Also close any existing editors and re-open them.</value>
   </data>
-  <data name="Label_ExtraTools" xml:space="preserve">
-    <value>Extra Tools</value>
-  </data>
-  <data name="Label_GetExtents" xml:space="preserve">
-    <value>Get Extents</value>
-  </data>
-  <data name="Label_GetMapKml" xml:space="preserve">
-    <value>Get KML</value>
-  </data>
-  <data name="Label_Tools" xml:space="preserve">
-    <value>Tools</value>
-  </data>
-  <data name="Label_ZoomToScale" xml:space="preserve">
-    <value>Zoom to Scale</value>
-  </data>
   <data name="LayerSubTypeNotSupported" xml:space="preserve">
     <value>Could not determine the sub-layer type or this type is not currently supported</value>
   </data>
@@ -530,12 +506,6 @@
   <data name="Prefs_General" xml:space="preserve">
     <value>General</value>
   </data>
-  <data name="PreviewMap" xml:space="preserve">
-    <value>Preview Map</value>
-  </data>
-  <data name="PrgPreparingResourcePreview" xml:space="preserve">
-    <value>Preparing resource preview</value>
-  </data>
   <data name="PrgPreSaveValidation" xml:space="preserve">
     <value>Performing pre-save validation...
 
@@ -794,9 +764,6 @@
   <data name="SiteExplorer_ValidateResources" xml:space="preserve">
     <value>Validate</value>
   </data>
-  <data name="SiteVersionDoesntSupportWatermarks" xml:space="preserve">
-    <value>The site version of this current connection is not known to support watermarks</value>
-  </data>
   <data name="SITE_EXPLORER_TOOLTIP_TEMPLATE" xml:space="preserve">
     <value>Resource Name: {1}{0}Resource Type: {2}{0}Created: {3}{0}Last Modified: {4}{0}Owner: {5}</value>
   </data>
@@ -929,9 +896,6 @@
   <data name="TPL_WL_NAME" xml:space="preserve">
     <value>Web Layout (v1.0.0)</value>
   </data>
-  <data name="UnpreviewableResourceType" xml:space="preserve">
-    <value>The resource type cannot be previewed</value>
-  </data>
   <data name="UpdatedOpenEditor" xml:space="preserve">
     <value>Open editor updated to {0}</value>
   </data>
@@ -974,24 +938,12 @@
   <data name="ErrorNoActiveConnection" xml:space="preserve">
     <value>No Active Connection</value>
   </data>
-  <data name="Label_Go" xml:space="preserve">
-    <value>Go</value>
-  </data>
-  <data name="Label_ResourceID" xml:space="preserve">
-    <value>Resource ID:</value>
-  </data>
-  <data name="Label_OpenResource" xml:space="preserve">
-    <value>Open this resource</value>
-  </data>
   <data name="SiteExplorer_SelectedItem_CompileDependencyList" xml:space="preserve">
     <value>Compile Full Dependency List</value>
   </data>
   <data name="ConfirmDeleteFolders" xml:space="preserve">
     <value>You about to delete one or more folders which may contain dependent resources. Are you sure you want to proceed with delete?</value>
   </data>
-  <data name="FailedToCalculateFeatureSourceExtents" xml:space="preserve">
-    <value>Could not calculate the extents of the Feature Source. Preview is not possible</value>
-  </data>
   <data name="SiteExplorer_CreateLayersFromFeatureSource" xml:space="preserve">
     <value>Create Layers from Feature Source</value>
   </data>
@@ -1004,4 +956,13 @@
   <data name="ConnectionTestOk" xml:space="preserve">
     <value>Connection Test OK</value>
   </data>
+  <data name="Label_Go" xml:space="preserve">
+    <value>Go</value>
+  </data>
+  <data name="Label_OpenResource" xml:space="preserve">
+    <value>Open this resource</value>
+  </data>
+  <data name="Label_ResourceID" xml:space="preserve">
+    <value>Resource ID:</value>
+  </data>
 </root>
\ No newline at end of file

Deleted: trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.Designer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,423 +0,0 @@
-namespace Maestro.Base.UI
-{
-    partial class MapPreviewDialog
-    {
-        /// <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()
-        {
-            this.defaultToolbar = new Maestro.MapViewer.DefaultToolbar();
-            this.mapViewer = new Maestro.MapViewer.MapViewer();
-            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
-            this.lblCoordinates = new System.Windows.Forms.ToolStripStatusLabel();
-            this.lblSelected = new System.Windows.Forms.ToolStripStatusLabel();
-            this.lblScale = new System.Windows.Forms.ToolStripStatusLabel();
-            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-            this.legend = new Maestro.MapViewer.Legend();
-            this.mapStatusTracker = new Maestro.MapViewer.MapStatusTracker();
-            this.splitContainer2 = new System.Windows.Forms.SplitContainer();
-            this.panel1 = new System.Windows.Forms.Panel();
-            this.grpOtherTools = new System.Windows.Forms.GroupBox();
-            this.btnGetMapKml = new System.Windows.Forms.Button();
-            this.lnkZoomToScale = new System.Windows.Forms.LinkLabel();
-            this.numZoomToScale = new System.Windows.Forms.NumericUpDown();
-            this.label5 = new System.Windows.Forms.Label();
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.txtMaxY = new System.Windows.Forms.TextBox();
-            this.label4 = new System.Windows.Forms.Label();
-            this.txtMaxX = new System.Windows.Forms.TextBox();
-            this.label3 = new System.Windows.Forms.Label();
-            this.txtMinY = new System.Windows.Forms.TextBox();
-            this.label2 = new System.Windows.Forms.Label();
-            this.txtMinX = new System.Windows.Forms.TextBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.label6 = new System.Windows.Forms.Label();
-            this.txtCoordinateSystem = new System.Windows.Forms.TextBox();
-            this.statusStrip1.SuspendLayout();
-            this.splitContainer1.Panel1.SuspendLayout();
-            this.splitContainer1.Panel2.SuspendLayout();
-            this.splitContainer1.SuspendLayout();
-            this.splitContainer2.Panel1.SuspendLayout();
-            this.splitContainer2.Panel2.SuspendLayout();
-            this.splitContainer2.SuspendLayout();
-            this.panel1.SuspendLayout();
-            this.grpOtherTools.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.numZoomToScale)).BeginInit();
-            this.groupBox1.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // defaultToolbar
-            // 
-            this.defaultToolbar.Location = new System.Drawing.Point(0, 0);
-            this.defaultToolbar.Name = "defaultToolbar";
-            this.defaultToolbar.Size = new System.Drawing.Size(784, 25);
-            this.defaultToolbar.TabIndex = 0;
-            this.defaultToolbar.Viewer = this.mapViewer;
-            // 
-            // mapViewer
-            // 
-            this.mapViewer.Cursor = System.Windows.Forms.Cursors.Default;
-            this.mapViewer.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.mapViewer.Location = new System.Drawing.Point(0, 0);
-            this.mapViewer.MaxScale = 1000000000;
-            this.mapViewer.MinScale = 10;
-            this.mapViewer.MouseWheelDelayRenderInterval = 800;
-            this.mapViewer.Name = "mapViewer";
-            this.mapViewer.PointPixelBuffer = 2;
-            this.mapViewer.SelectionColor = System.Drawing.Color.Blue;
-            this.mapViewer.Size = new System.Drawing.Size(381, 515);
-            this.mapViewer.TabIndex = 0;
-            this.mapViewer.TooltipDelayInterval = 1000;
-            this.mapViewer.ZoomInFactor = 0.5D;
-            this.mapViewer.ZoomOutFactor = 2D;
-            this.mapViewer.MapScaleChanged += new System.EventHandler(this.mapViewer_MapScaleChanged);
-            this.mapViewer.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(this.mapViewer_PropertyChanged);
-            // 
-            // statusStrip1
-            // 
-            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.lblCoordinates,
-            this.lblSelected,
-            this.lblScale});
-            this.statusStrip1.Location = new System.Drawing.Point(0, 540);
-            this.statusStrip1.Name = "statusStrip1";
-            this.statusStrip1.Size = new System.Drawing.Size(784, 22);
-            this.statusStrip1.TabIndex = 1;
-            this.statusStrip1.Text = "statusStrip1";
-            // 
-            // lblCoordinates
-            // 
-            this.lblCoordinates.Name = "lblCoordinates";
-            this.lblCoordinates.Size = new System.Drawing.Size(0, 17);
-            // 
-            // lblSelected
-            // 
-            this.lblSelected.Name = "lblSelected";
-            this.lblSelected.Size = new System.Drawing.Size(769, 17);
-            this.lblSelected.Spring = true;
-            this.lblSelected.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
-            // 
-            // lblScale
-            // 
-            this.lblScale.Name = "lblScale";
-            this.lblScale.Size = new System.Drawing.Size(0, 17);
-            // 
-            // splitContainer1
-            // 
-            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
-            this.splitContainer1.Location = new System.Drawing.Point(0, 0);
-            this.splitContainer1.Name = "splitContainer1";
-            // 
-            // splitContainer1.Panel1
-            // 
-            this.splitContainer1.Panel1.Controls.Add(this.legend);
-            // 
-            // splitContainer1.Panel2
-            // 
-            this.splitContainer1.Panel2.Controls.Add(this.mapViewer);
-            this.splitContainer1.Size = new System.Drawing.Size(584, 515);
-            this.splitContainer1.SplitterDistance = 199;
-            this.splitContainer1.TabIndex = 2;
-            // 
-            // legend
-            // 
-            this.legend.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.legend.GroupContextMenu = null;
-            this.legend.LayerContextMenu = null;
-            this.legend.Location = new System.Drawing.Point(0, 0);
-            this.legend.Name = "legend";
-            this.legend.SelectOnRightClick = false;
-            this.legend.ShowAllLayersAndGroups = false;
-            this.legend.ShowTooltips = true;
-            this.legend.Size = new System.Drawing.Size(199, 515);
-            this.legend.TabIndex = 0;
-            this.legend.ThemeCompressionLimit = 25;
-            this.legend.Viewer = this.mapViewer;
-            // 
-            // mapStatusTracker
-            // 
-            this.mapStatusTracker.CoordinatesLabel = this.lblCoordinates;
-            this.mapStatusTracker.ScaleLabel = this.lblScale;
-            this.mapStatusTracker.SelectedLabel = this.lblSelected;
-            this.mapStatusTracker.Viewer = this.mapViewer;
-            // 
-            // splitContainer2
-            // 
-            this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
-            this.splitContainer2.Location = new System.Drawing.Point(0, 25);
-            this.splitContainer2.Name = "splitContainer2";
-            // 
-            // splitContainer2.Panel1
-            // 
-            this.splitContainer2.Panel1.Controls.Add(this.splitContainer1);
-            // 
-            // splitContainer2.Panel2
-            // 
-            this.splitContainer2.Panel2.Controls.Add(this.panel1);
-            this.splitContainer2.Size = new System.Drawing.Size(784, 515);
-            this.splitContainer2.SplitterDistance = 584;
-            this.splitContainer2.TabIndex = 3;
-            // 
-            // panel1
-            // 
-            this.panel1.AutoScroll = true;
-            this.panel1.Controls.Add(this.grpOtherTools);
-            this.panel1.Controls.Add(this.groupBox1);
-            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.panel1.Location = new System.Drawing.Point(0, 0);
-            this.panel1.Name = "panel1";
-            this.panel1.Size = new System.Drawing.Size(196, 515);
-            this.panel1.TabIndex = 1;
-            // 
-            // grpOtherTools
-            // 
-            this.grpOtherTools.Controls.Add(this.btnGetMapKml);
-            this.grpOtherTools.Controls.Add(this.lnkZoomToScale);
-            this.grpOtherTools.Controls.Add(this.numZoomToScale);
-            this.grpOtherTools.Controls.Add(this.label5);
-            this.grpOtherTools.Location = new System.Drawing.Point(16, 367);
-            this.grpOtherTools.Name = "grpOtherTools";
-            this.grpOtherTools.Size = new System.Drawing.Size(165, 115);
-            this.grpOtherTools.TabIndex = 1;
-            this.grpOtherTools.TabStop = false;
-            this.grpOtherTools.Text = "Other Tools";
-            // 
-            // btnGetMapKml
-            // 
-            this.btnGetMapKml.Location = new System.Drawing.Point(10, 74);
-            this.btnGetMapKml.Name = "btnGetMapKml";
-            this.btnGetMapKml.Size = new System.Drawing.Size(94, 23);
-            this.btnGetMapKml.TabIndex = 4;
-            this.btnGetMapKml.Text = "Get Map KML";
-            this.btnGetMapKml.UseVisualStyleBackColor = true;
-            this.btnGetMapKml.Click += new System.EventHandler(this.btnGetMapKml_Click);
-            // 
-            // lnkZoomToScale
-            // 
-            this.lnkZoomToScale.AutoSize = true;
-            this.lnkZoomToScale.Location = new System.Drawing.Point(93, 32);
-            this.lnkZoomToScale.Name = "lnkZoomToScale";
-            this.lnkZoomToScale.Size = new System.Drawing.Size(40, 13);
-            this.lnkZoomToScale.TabIndex = 3;
-            this.lnkZoomToScale.TabStop = true;
-            this.lnkZoomToScale.Text = "(Zoom)";
-            this.lnkZoomToScale.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkZoomToScale_LinkClicked);
-            // 
-            // numZoomToScale
-            // 
-            this.numZoomToScale.Location = new System.Drawing.Point(10, 48);
-            this.numZoomToScale.Name = "numZoomToScale";
-            this.numZoomToScale.Size = new System.Drawing.Size(135, 20);
-            this.numZoomToScale.TabIndex = 2;
-            // 
-            // label5
-            // 
-            this.label5.AutoSize = true;
-            this.label5.Location = new System.Drawing.Point(7, 32);
-            this.label5.Name = "label5";
-            this.label5.Size = new System.Drawing.Size(80, 13);
-            this.label5.TabIndex = 1;
-            this.label5.Text = "Zoom To Scale";
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.groupBox1.Controls.Add(this.txtCoordinateSystem);
-            this.groupBox1.Controls.Add(this.label6);
-            this.groupBox1.Controls.Add(this.txtMaxY);
-            this.groupBox1.Controls.Add(this.label4);
-            this.groupBox1.Controls.Add(this.txtMaxX);
-            this.groupBox1.Controls.Add(this.label3);
-            this.groupBox1.Controls.Add(this.txtMinY);
-            this.groupBox1.Controls.Add(this.label2);
-            this.groupBox1.Controls.Add(this.txtMinX);
-            this.groupBox1.Controls.Add(this.label1);
-            this.groupBox1.Location = new System.Drawing.Point(16, 10);
-            this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(165, 351);
-            this.groupBox1.TabIndex = 0;
-            this.groupBox1.TabStop = false;
-            this.groupBox1.Text = "Current Extents";
-            // 
-            // txtMaxY
-            // 
-            this.txtMaxY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtMaxY.Location = new System.Drawing.Point(10, 167);
-            this.txtMaxY.Name = "txtMaxY";
-            this.txtMaxY.ReadOnly = true;
-            this.txtMaxY.Size = new System.Drawing.Size(135, 20);
-            this.txtMaxY.TabIndex = 7;
-            // 
-            // label4
-            // 
-            this.label4.AutoSize = true;
-            this.label4.Location = new System.Drawing.Point(7, 150);
-            this.label4.Name = "label4";
-            this.label4.Size = new System.Drawing.Size(37, 13);
-            this.label4.TabIndex = 6;
-            this.label4.Text = "Max Y";
-            // 
-            // txtMaxX
-            // 
-            this.txtMaxX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtMaxX.Location = new System.Drawing.Point(10, 129);
-            this.txtMaxX.Name = "txtMaxX";
-            this.txtMaxX.ReadOnly = true;
-            this.txtMaxX.Size = new System.Drawing.Size(135, 20);
-            this.txtMaxX.TabIndex = 5;
-            // 
-            // label3
-            // 
-            this.label3.AutoSize = true;
-            this.label3.Location = new System.Drawing.Point(7, 112);
-            this.label3.Name = "label3";
-            this.label3.Size = new System.Drawing.Size(37, 13);
-            this.label3.TabIndex = 4;
-            this.label3.Text = "Max X";
-            // 
-            // txtMinY
-            // 
-            this.txtMinY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtMinY.Location = new System.Drawing.Point(10, 89);
-            this.txtMinY.Name = "txtMinY";
-            this.txtMinY.ReadOnly = true;
-            this.txtMinY.Size = new System.Drawing.Size(135, 20);
-            this.txtMinY.TabIndex = 3;
-            // 
-            // label2
-            // 
-            this.label2.AutoSize = true;
-            this.label2.Location = new System.Drawing.Point(7, 72);
-            this.label2.Name = "label2";
-            this.label2.Size = new System.Drawing.Size(34, 13);
-            this.label2.TabIndex = 2;
-            this.label2.Text = "Min Y";
-            // 
-            // txtMinX
-            // 
-            this.txtMinX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtMinX.Location = new System.Drawing.Point(10, 49);
-            this.txtMinX.Name = "txtMinX";
-            this.txtMinX.ReadOnly = true;
-            this.txtMinX.Size = new System.Drawing.Size(135, 20);
-            this.txtMinX.TabIndex = 1;
-            // 
-            // label1
-            // 
-            this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(7, 32);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(34, 13);
-            this.label1.TabIndex = 0;
-            this.label1.Text = "Min X";
-            // 
-            // label6
-            // 
-            this.label6.AutoSize = true;
-            this.label6.Location = new System.Drawing.Point(7, 190);
-            this.label6.Name = "label6";
-            this.label6.Size = new System.Drawing.Size(95, 13);
-            this.label6.TabIndex = 8;
-            this.label6.Text = "Coordinate System";
-            // 
-            // txtCoordinateSystem
-            // 
-            this.txtCoordinateSystem.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtCoordinateSystem.Location = new System.Drawing.Point(10, 207);
-            this.txtCoordinateSystem.Multiline = true;
-            this.txtCoordinateSystem.Name = "txtCoordinateSystem";
-            this.txtCoordinateSystem.ReadOnly = true;
-            this.txtCoordinateSystem.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-            this.txtCoordinateSystem.Size = new System.Drawing.Size(135, 123);
-            this.txtCoordinateSystem.TabIndex = 9;
-            // 
-            // MapPreviewDialog
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(784, 562);
-            this.Controls.Add(this.splitContainer2);
-            this.Controls.Add(this.statusStrip1);
-            this.Controls.Add(this.defaultToolbar);
-            this.Name = "MapPreviewDialog";
-            this.Text = "Map Preview";
-            this.statusStrip1.ResumeLayout(false);
-            this.statusStrip1.PerformLayout();
-            this.splitContainer1.Panel1.ResumeLayout(false);
-            this.splitContainer1.Panel2.ResumeLayout(false);
-            this.splitContainer1.ResumeLayout(false);
-            this.splitContainer2.Panel1.ResumeLayout(false);
-            this.splitContainer2.Panel2.ResumeLayout(false);
-            this.splitContainer2.ResumeLayout(false);
-            this.panel1.ResumeLayout(false);
-            this.grpOtherTools.ResumeLayout(false);
-            this.grpOtherTools.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.numZoomToScale)).EndInit();
-            this.groupBox1.ResumeLayout(false);
-            this.groupBox1.PerformLayout();
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private MapViewer.DefaultToolbar defaultToolbar;
-        private System.Windows.Forms.StatusStrip statusStrip1;
-        private System.Windows.Forms.ToolStripStatusLabel lblCoordinates;
-        private System.Windows.Forms.ToolStripStatusLabel lblSelected;
-        private System.Windows.Forms.ToolStripStatusLabel lblScale;
-        private System.Windows.Forms.SplitContainer splitContainer1;
-        private MapViewer.Legend legend;
-        private MapViewer.MapViewer mapViewer;
-        private MapViewer.MapStatusTracker mapStatusTracker;
-        private System.Windows.Forms.SplitContainer splitContainer2;
-        private System.Windows.Forms.Panel panel1;
-        private System.Windows.Forms.GroupBox grpOtherTools;
-        private System.Windows.Forms.LinkLabel lnkZoomToScale;
-        private System.Windows.Forms.NumericUpDown numZoomToScale;
-        private System.Windows.Forms.Label label5;
-        private System.Windows.Forms.GroupBox groupBox1;
-        private System.Windows.Forms.TextBox txtMaxY;
-        private System.Windows.Forms.Label label4;
-        private System.Windows.Forms.TextBox txtMaxX;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.TextBox txtMinY;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.TextBox txtMinX;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Button btnGetMapKml;
-        private System.Windows.Forms.TextBox txtCoordinateSystem;
-        private System.Windows.Forms.Label label6;
-    }
-}
\ No newline at end of file

Deleted: trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,112 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2012, 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 Maestro.Base.Services;
-using OSGeo.MapGuide.MaestroAPI;
-using OSGeo.MapGuide.MaestroAPI.Mapping;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Globalization;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-
-namespace Maestro.Base.UI
-{
-    internal partial class MapPreviewDialog : Form
-    {
-        private RuntimeMap _map;
-        private IUrlLauncherService _launcher;
-        private IServerConnection _conn;
-
-        public MapPreviewDialog(RuntimeMap map, IUrlLauncherService urlLauncher, string resourceId)
-        {
-            InitializeComponent();
-            _map = map;
-            if (!string.IsNullOrEmpty(resourceId))
-                this.Text += " - " + resourceId;
-
-            txtCoordinateSystem.Text = map.CoordinateSystem;
-            numZoomToScale.Minimum = 1;
-            numZoomToScale.Maximum = Int32.MaxValue;
-            _launcher = urlLauncher;
-            _conn = map.CurrentConnection;
-            btnGetMapKml.Enabled = (_conn.ProviderName.ToUpper() == "MAESTRO.HTTP"); //NOXLATE
-        }
-
-        protected override void OnLoad(EventArgs e)
-        {
-            base.OnLoad(e);
-            if (_map.Layers.Count == 1) //Single-layer preview
-            {
-                var maxScale = _map.Layers.Max(x => x.ScaleRanges.Max(y => y.MaxScale));
-                var initScale = Math.Floor(maxScale - 0.5);
-                var env = _map.MapExtent;
-                double mcsW = env.MaxX - env.MinX;
-                double mcsH = env.MaxY - env.MinY;
-                var bboxScale = Maestro.MapViewer.MapViewer.CalculateScale(_map, mcsW, mcsH, mapViewer.Width, mapViewer.Height);
-                double desiredScale = Math.Min(initScale, bboxScale);
-                mapViewer.LoadMap(_map, desiredScale);
-            }
-            else
-            {
-                mapViewer.LoadMap(_map);
-            }
-        }
-
-        private void mapViewer_MapScaleChanged(object sender, EventArgs e)
-        {
-            numZoomToScale.Value = Convert.ToDecimal(mapViewer.GetMap().ViewScale);
-        }
-
-        private void lnkZoomToScale_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
-        {
-            mapViewer.ZoomToScale(Convert.ToDouble(numZoomToScale.Value));
-        }
-
-        private void mapViewer_PropertyChanged(object sender, PropertyChangedEventArgs e)
-        {
-            if (e.PropertyName == "IsBusy") //NOXLATE
-            {
-                grpOtherTools.Enabled = !mapViewer.IsBusy;
-
-                if (!mapViewer.IsBusy)
-                {
-                    double minx, miny, maxx, maxy;
-                    mapViewer.GetViewExtent(out minx, out miny, out maxx, out maxy);
-
-                    txtMinX.Text = minx.ToString(CultureInfo.InvariantCulture);
-                    txtMinY.Text = miny.ToString(CultureInfo.InvariantCulture);
-                    txtMaxX.Text = maxx.ToString(CultureInfo.InvariantCulture);
-                    txtMaxY.Text = maxy.ToString(CultureInfo.InvariantCulture);
-                }
-            }
-        }
-
-        private void btnGetMapKml_Click(object sender, EventArgs e)
-        {
-            var mapagent = _conn.GetCustomProperty("BaseUrl").ToString(); //NOXLATE
-            mapagent += "mapagent/mapagent.fcgi?SESSION=" + _conn.SessionID + "&VERSION=1.0.0&OPERATION=GETMAPKML&DPI=96&MAPDEFINITION=" + _map.MapDefinition + "&FORMAT=KML&CLIENTAGENT=Maestro Local Map Previewer"; //NOXLATE
-            _launcher.OpenUrl(mapagent);
-        }
-    }
-}

Deleted: trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.resx	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Base/UI/MapPreviewDialog.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="defaultToolbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>155, 17</value>
-  </metadata>
-  <metadata name="mapStatusTracker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>271, 17</value>
-  </metadata>
-</root>
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,89 @@
+namespace Maestro.Editors.Common
+{
+    partial class EditorWindow
+    {
+        /// <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()
+        {
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnSave = new System.Windows.Forms.ToolStripButton();
+            this.btnPreview = new System.Windows.Forms.ToolStripButton();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnSave,
+            this.btnPreview});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(540, 25);
+            this.toolStrip1.TabIndex = 0;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // btnSave
+            // 
+            this.btnSave.Enabled = false;
+            this.btnSave.Image = global::Maestro.Editors.Properties.Resources.disk;
+            this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnSave.Name = "btnSave";
+            this.btnSave.Size = new System.Drawing.Size(51, 22);
+            this.btnSave.Text = "Save";
+            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+            // 
+            // btnPreview
+            // 
+            this.btnPreview.Enabled = false;
+            this.btnPreview.Image = global::Maestro.Editors.Properties.Resources.document_search_result;
+            this.btnPreview.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnPreview.Name = "btnPreview";
+            this.btnPreview.Size = new System.Drawing.Size(68, 22);
+            this.btnPreview.Text = "Preview";
+            this.btnPreview.Click += new System.EventHandler(this.btnPreview_Click);
+            // 
+            // EditorWindow
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(540, 410);
+            this.Controls.Add(this.toolStrip1);
+            this.Name = "EditorWindow";
+            this.Text = "Editor";
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripButton btnSave;
+        private System.Windows.Forms.ToolStripButton btnPreview;
+    }
+}
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,191 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 Maestro.Editors.Preview;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Common
+{
+    /// <summary>
+    /// A window container for any resource editor
+    /// </summary>
+    public partial class EditorWindow : Form
+    {
+        class DefaultResourceEditorService : ResourceEditorServiceBase
+        {
+            public DefaultResourceEditorService(string resourceID, IServerConnection conn)
+                : base(resourceID, conn)
+            { }
+
+            /// <summary>
+            /// Called when an editor requires to open a particular resource. In Maestro, this would
+            /// spawn a new resource editor (or activate an existing one) for the selected resource id.
+            /// </summary>
+            /// <param name="resourceId"></param>
+            public override void OpenResource(string resourceId)
+            {
+            
+            }
+
+            /// <summary>
+            /// Called when an editor requires opening a url. 
+            /// </summary>
+            /// <param name="url"></param>
+            public override void OpenUrl(string url)
+            {
+                System.Diagnostics.Process.Start(url);
+            }
+
+            /// <summary>
+            /// Called when the editor requires a refresh of the site explorer for a specific folder
+            /// </summary>
+            /// <param name="folderId"></param>
+            public override void RequestRefresh(string folderId)
+            {
+            
+            }
+
+            /// <summary>
+            /// Called when the editor requires a refresh of the entire site explorer
+            /// </summary>
+            public override void RequestRefresh()
+            {
+            
+            }
+
+            /// <summary>
+            /// Called when the editor needs to prompt the user to select an unmanaged resource. Currently not used
+            /// </summary>
+            /// <param name="startPath"></param>
+            /// <param name="fileTypes"></param>
+            /// <returns></returns>
+            public override string SelectUnmanagedData(string startPath, System.Collections.Specialized.NameValueCollection fileTypes)
+            {
+                throw new NotImplementedException();
+            }
+
+            public override void RunProcess(string processName, params string[] args)
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        private EditorWindow()
+        {
+            InitializeComponent();
+            _ed = new Generic.XmlEditorCtrl();
+        }
+
+        private IServerConnection _conn;
+        private DefaultResourceEditorService _svc;
+
+        //TODO: The reason we are using a generic XML editor is because the mechanism
+        //for resolving specialized editor types is currently part of the Maestro AddIn
+        //infrastructure and not available in this standalone library
+        private Generic.XmlEditorCtrl _ed;
+
+        public EditorWindow(IServerConnection conn, string resourceId)
+            : this()
+        {
+            _conn = conn;
+            this.Text = this.Text + " - " + resourceId;
+            _svc = new DefaultResourceEditorService(resourceId, conn);
+            _svc.DirtyStateChanged += OnDirtyStateChanged;
+            _ed.Dock = DockStyle.Fill;
+            btnPreview.Enabled = ResourcePreviewEngine.IsPreviewableType(ResourceIdentifier.GetResourceType(resourceId));
+            this.Controls.Add(_ed);
+            _ed.Bind(_svc);
+            _ed.ReadyForEditing();
+            _ed.TextChanged += OnXmlContentChanged;
+        }
+
+        private void OnXmlContentChanged(object sender, EventArgs e)
+        {
+            _svc.MarkDirty();
+        }
+
+        const string DIRTY_PREFIX = "* ";
+
+        void OnDirtyStateChanged(object sender, EventArgs e)
+        {
+            if (_svc.IsDirty)
+            {
+                btnSave.Enabled = true;
+                if (!this.Text.StartsWith(DIRTY_PREFIX))
+                    this.Text = DIRTY_PREFIX + this.Text;
+            }
+            else
+            {
+                btnSave.Enabled = false;
+                if (this.Text.StartsWith(DIRTY_PREFIX))
+                    this.Text = this.Text.Substring(DIRTY_PREFIX.Length);
+            }
+        }
+
+        private void btnPreview_Click(object sender, EventArgs e)
+        {
+            if (SyncXml())
+            {
+                var previewer = ResourcePreviewerFactory.GetPreviewer(_conn.ProviderName);
+                if (previewer != null)
+                    previewer.Preview(_svc.GetEditedResource(), _svc);
+                else
+                    MessageBox.Show(string.Format(Strings.NoRegisteredPreviewerForProvider, _conn.ProviderName));
+            }
+        }
+
+        private void btnSave_Click(object sender, EventArgs e)
+        {
+            if (SyncXml())
+            {
+                _svc.Save();
+                OnDirtyStateChanged(this, EventArgs.Empty);
+            }
+        }
+
+        private bool SyncXml()
+        {
+            //Force XML sync back to session repo before beginning save
+            string xml = _ed.XmlContent;
+            try
+            {
+                using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
+                {
+                    _svc.ResourceService.SetResourceXmlData(_svc.EditedResourceID, ms);
+                }
+                return true;
+            }
+            catch (Exception ex)
+            {
+                XmlContentErrorDialog.CheckAndHandle(ex, xml, false);
+                return false;
+            }
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/EditorWindow.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,123 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -100,15 +100,20 @@
             _tree.Cursor = Cursors.Default;
         }
 
+        private bool _bOmitEmptyFolders;
+
         private bool _bFoldersOnly;
 
         public bool FoldersOnly { get { return _bFoldersOnly; } }
 
-        public RepositoryFolderTreeModel(IResourceService resSvc, TreeView tree, bool bFoldersOnly)
+        public bool OmitEmptyFolders { get { return _bOmitEmptyFolders; } }
+
+        public RepositoryFolderTreeModel(IResourceService resSvc, TreeView tree, bool bFoldersOnly, bool bOmitEmptyFolders)
         {
             _resSvc = resSvc;
             _tree = tree;
             _bFoldersOnly = bFoldersOnly;
+            _bOmitEmptyFolders = bOmitEmptyFolders;
 
             _tree.AfterExpand += new TreeViewEventHandler(OnNodeAfterExpand);
             _tree.AfterSelect += new TreeViewEventHandler(OnNodeAfterSelect);
@@ -189,6 +194,9 @@
             SortedList<string, RepositoryModelItem> docs = new SortedList<string, RepositoryModelItem>();
             foreach (var item in list.Children)
             {
+                if (item.IsFolder && !item.HasChildren && this.OmitEmptyFolders)
+                    continue;
+
                 if (item.IsFolder)
                     folders.Add(item.ResourceId, new RepositoryModelItem(item));
                 else if (!HasFilteredTypes() || (HasFilteredTypes() && IsFilteredType(item.ResourceType)))

Modified: trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -70,14 +70,15 @@
         /// </summary>
         /// <param name="resSvc"></param>
         /// <param name="bFoldersOnly"></param>
-        public void Init(IResourceService resSvc, bool bFoldersOnly)
+        /// <param name="bOmitEmptyFolders"></param>
+        public void Init(IResourceService resSvc, bool bFoldersOnly, bool bOmitEmptyFolders)
         {
             if (_model != null)
             {
                 _model.ItemSelected -= OnItemSelectedInternal;
             }
 
-            _model = new RepositoryFolderTreeModel(resSvc, trvRepository, bFoldersOnly);
+            _model = new RepositoryFolderTreeModel(resSvc, trvRepository, bFoldersOnly, bOmitEmptyFolders);
             _model.ItemSelected += OnItemSelectedInternal; 
         }
 

Modified: trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -79,7 +79,7 @@
             : this()
         {
             _resSvc = resSvc;
-            repoView.Init(resSvc, true);
+            repoView.Init(resSvc, true, false);
             repoView.ItemSelected += OnFolderSelected;
             this.UseFilter = true;
             this.Mode = mode;

Modified: trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -175,6 +175,15 @@
         }
 
         /// <summary>
+        /// Raised when XML content changes
+        /// </summary>
+        public event EventHandler TextChanged
+        {
+            add { txtXmlContent.TextChanged += value; }
+            remove { txtXmlContent.TextChanged -= value; }
+        }
+
+        /// <summary>
         /// Gets or sets the content of the XML.
         /// </summary>
         /// <value>The content of the XML.</value>

Modified: trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj	2013-05-21 16:34:18 UTC (rev 7514)
@@ -102,6 +102,12 @@
     <Compile Include="Common\EditorBindableCollapsiblePanel.cs">
       <SubType>UserControl</SubType>
     </Compile>
+    <Compile Include="Common\EditorWindow.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Common\EditorWindow.Designer.cs">
+      <DependentUpon>EditorWindow.cs</DependentUpon>
+    </Compile>
     <Compile Include="Common\ExpressionEditor.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -916,6 +922,20 @@
     <Compile Include="Packaging\PackageEditorDialog.designer.cs">
       <DependentUpon>PackageEditorDialog.cs</DependentUpon>
     </Compile>
+    <Compile Include="Preview\DefaultResourcePreviewer.cs" />
+    <Compile Include="Preview\IResourcePreviewer.cs" />
+    <Compile Include="Preview\IUrlLauncherService.cs" />
+    <Compile Include="Preview\LocalMapPreviewer.cs" />
+    <Compile Include="Preview\MapPreviewDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Preview\MapPreviewDialog.Designer.cs">
+      <DependentUpon>MapPreviewDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Preview\PreviewSettings.cs" />
+    <Compile Include="Preview\ResourcePreviewEngine.cs" />
+    <Compile Include="Preview\ResourcePreviewFactory.cs" />
+    <Compile Include="Preview\StubPreviewer.cs" />
     <Compile Include="PrintLayout\LogoDialog.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -1199,6 +1219,9 @@
     <EmbeddedResource Include="Common\EditorBindableCollapsiblePanel.resx">
       <DependentUpon>EditorBindableCollapsiblePanel.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Common\EditorWindow.resx">
+      <DependentUpon>EditorWindow.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Common\ExpressionEditor.resx">
       <DependentUpon>ExpressionEditor.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -1619,6 +1642,9 @@
     <EmbeddedResource Include="Migration\MigrateDialog.resx">
       <DependentUpon>MigrateDialog.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Preview\MapPreviewDialog.resx">
+      <DependentUpon>MapPreviewDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="PrintLayout\LogoDialog.resx">
       <DependentUpon>LogoDialog.cs</DependentUpon>
     </EmbeddedResource>
@@ -2242,6 +2268,7 @@
     <Content Include="OdbcDriverMap.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <None Include="Resources\document-search-result.png" />
     <None Include="Resources\arrow-split.png" />
     <None Include="Resources\folder-horizontal-open.png" />
     <None Include="Resources\water.png" />

Modified: trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.Designer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -52,15 +52,18 @@
             this.lblSelected = new System.Windows.Forms.ToolStripStatusLabel();
             this.lblScale = new System.Windows.Forms.ToolStripStatusLabel();
             this.mapStatusTracker = new Maestro.MapViewer.MapStatusTracker();
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
             this.splitContainer1.Panel1.SuspendLayout();
             this.splitContainer1.Panel2.SuspendLayout();
             this.splitContainer1.SuspendLayout();
             this.tabLayersAndGroups.SuspendLayout();
             this.TAB_LEGEND.SuspendLayout();
             this.TAB_DRAW_ORDER.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();
             this.splitContainer3.Panel1.SuspendLayout();
             this.splitContainer3.Panel2.SuspendLayout();
             this.splitContainer3.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
             this.splitContainer2.Panel1.SuspendLayout();
             this.splitContainer2.Panel2.SuspendLayout();
             this.splitContainer2.SuspendLayout();
@@ -109,6 +112,7 @@
             this.legendCtrl.Viewer = this.viewer;
             this.legendCtrl.NodeDeleted += new Maestro.MapViewer.NodeEventHandler(this.legendCtrl_NodeDeleted);
             this.legendCtrl.NodeSelected += new Maestro.MapViewer.NodeEventHandler(this.legendCtrl_NodeSelected);
+            this.legendCtrl.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.legendCtrl_ItemDrag);
             this.legendCtrl.DragDrop += new System.Windows.Forms.DragEventHandler(this.legendCtrl_DragDrop);
             this.legendCtrl.DragEnter += new System.Windows.Forms.DragEventHandler(this.legendCtrl_DragEnter);
             this.legendCtrl.DragOver += new System.Windows.Forms.DragEventHandler(this.legendCtrl_DragOver);
@@ -272,15 +276,18 @@
             resources.ApplyResources(this, "$this");
             this.splitContainer1.Panel1.ResumeLayout(false);
             this.splitContainer1.Panel2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
             this.splitContainer1.ResumeLayout(false);
             this.tabLayersAndGroups.ResumeLayout(false);
             this.TAB_LEGEND.ResumeLayout(false);
             this.TAB_DRAW_ORDER.ResumeLayout(false);
             this.splitContainer3.Panel1.ResumeLayout(false);
             this.splitContainer3.Panel2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit();
             this.splitContainer3.ResumeLayout(false);
             this.splitContainer2.Panel1.ResumeLayout(false);
             this.splitContainer2.Panel2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
             this.splitContainer2.ResumeLayout(false);
             this.tabRepo.ResumeLayout(false);
             this.TAB_REPO.ResumeLayout(false);

Modified: trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -90,6 +90,11 @@
         private IMapDefinition _shadowCopy;
         private IMappingService _mapSvc;
 
+        public RuntimeMap Map
+        {
+            get { return _rtMap; }
+        }
+
         /// <summary>
         /// Binds the specified editor service to this editor
         /// </summary>
@@ -103,7 +108,11 @@
             _mapSvc = (IMappingService)_shadowCopy.CurrentConnection.GetService((int)ServiceType.Mapping);
             _rtMap = _mapSvc.CreateMap(_shadowCopy);
             repoView.Init(service.ResourceService, new ResourceTypes[] {
-                ResourceTypes.LayerDefinition
+                ResourceTypes.LayerDefinition,
+                ResourceTypes.FeatureSource
+            }, new ResourceTypes[] {
+                ResourceTypes.LayerDefinition,
+                ResourceTypes.FeatureSource
             });
 
             viewer.LoadMap(_rtMap);
@@ -156,7 +165,10 @@
 
         private void repoView_RequestEdit(object sender, EventArgs e)
         {
-            MessageBox.Show(Strings.FeatureNotImplemented);
+            var res = repoView.SelectedItem;
+
+            var ed = new Maestro.Editors.Common.EditorWindow(_shadowCopy.CurrentConnection, res.ResourceId);
+            ed.ShowDialog();
         }
 
         private void repoView_ItemSelected(object sender, EventArgs e)
@@ -166,6 +178,7 @@
 
         private void repoView_ItemDrag(object sender, ItemDragEventArgs e)
         {
+            viewer.ActiveTool = MapViewer.MapActiveTool.None;
             var item = repoView.SelectedItem;
             if (item != null && !item.IsFolder)
                 repoView.DoDragDrop(new ResourceDragMessage(item.ResourceId), DragDropEffects.Copy);
@@ -185,5 +198,10 @@
         {
             legendCtrl.HandleDragDrop(e);
         }
+
+        private void legendCtrl_ItemDrag(object sender, ItemDragEventArgs e)
+        {
+            legendCtrl.HandleItemDrag(e);
+        }
     }
 }

Modified: trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.resx	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapDefinitionEditorCtrl.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -272,7 +272,7 @@
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABw
-        CwAAAk1TRnQBSQFMAgEBBAEAAVABAAFQAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        CwAAAk1TRnQBSQFMAgEBBAEAAVgBAAFYAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
         AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

Modified: trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorLegend.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorLegend.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorLegend.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -224,7 +224,11 @@
         /// <summary>
         /// Raised when a drag occurs
         /// </summary>
-        public event ItemDragEventHandler ItemDrag;
+        public event ItemDragEventHandler ItemDrag
+        {
+            add { legendCtrl.ItemDrag += value; }
+            remove { legendCtrl.ItemDrag -= value; }
+        }
 
         internal void HandleDragDrop(DragEventArgs e)
         {
@@ -242,14 +246,22 @@
                     {
                         if (groupMeta.Name != layer.GroupName)
                         {
-                            MessageBox.Show("Handle layer drop into (" + groupMeta.Name + ")");
+                            var map = this.Viewer.GetMap();
+                            var layerObj = map.Layers[layer.LayerName];
+                            layerObj.Group = groupMeta.Name;
+                            map.Save();
+                            this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
                         }
                     }
                     else if (group != null)
                     {
                         if (groupMeta.Name != group.GroupName)
                         {
-                            MessageBox.Show("Handle group drop into (" + groupMeta.Name + ")");
+                            var map = this.Viewer.GetMap();
+                            var groupObj = map.Groups[group.GroupName];
+                            groupObj.Group = groupMeta.Name;
+                            map.Save();
+                            this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
                         }
                     }
                     else if (res != null)
@@ -265,11 +277,19 @@
             {
                 if (layer != null)
                 {
-                    MessageBox.Show("Handle layer drop into root");
+                    var map = this.Viewer.GetMap();
+                    var layerObj = map.Layers[layer.LayerName];
+                    layerObj.Group = string.Empty;
+                    map.Save();
+                    this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
                 }
                 else if (group != null)
                 {
-                    MessageBox.Show("Handle group drop into root");
+                    var map = this.Viewer.GetMap();
+                    var groupObj = map.Groups[group.GroupName];
+                    groupObj.Group = string.Empty;
+                    map.Save();
+                    this.legendCtrl.RefreshLegend(); //No viewer refresh. Group structure changes do not affect draw order
                 }
                 else if (res != null)
                 {
@@ -335,5 +355,23 @@
         {
             Trace.TraceInformation("HandleDragEnter(e)");
         }
+
+        internal void HandleItemDrag(ItemDragEventArgs e)
+        {
+            var node = e.Item as TreeNode;
+            if (node != null)
+            {
+                var layerMeta = node.Tag as LayerNodeMetadata;
+                var groupMeta = node.Tag as GroupNodeMetadata;
+                if (layerMeta != null)
+                {
+                    this.DoDragDrop(new LayerDragMessage(layerMeta.ParentGroupName, layerMeta.Name), DragDropEffects.Copy);
+                }
+                else if (groupMeta != null)
+                {
+                    this.DoDragDrop(new GroupDragMessage(groupMeta.Name), DragDropEffects.Copy);
+                }
+            }
+        }
     }
 }

Modified: trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorRepositoryView.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorRepositoryView.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/MapDefinition/LiveMapEditorRepositoryView.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -43,20 +43,27 @@
         public LiveMapEditorRepositoryView()
         {
             InitializeComponent();
+            _editableTypes = new HashSet<ResourceTypes>();
         }
 
+        private HashSet<ResourceTypes> _editableTypes;
+
         /// <summary>
         /// Initializes this view
         /// </summary>
-        /// <param name="resSvc"></param>
-        /// <param name="filteredTypes"></param>
-        public void Init(IResourceService resSvc, ResourceTypes[] filteredTypes)
+        /// <param name="resSvc">The resource service</param>
+        /// <param name="visibleType">An array of resource types that will be visible</param>
+        /// <param name="editableTypes">An array of resource types that are editable when selected</param>
+        public void Init(IResourceService resSvc, ResourceTypes[] visibleType, ResourceTypes[] editableTypes)
         {
-            repoView.Init(resSvc, false);
+            _editableTypes.Clear();
+            foreach (var rt in editableTypes)
+                _editableTypes.Add(rt);
+            repoView.Init(resSvc, false, true);
             repoView.ClearResourceTypeFilters();
-            if (filteredTypes != null)
+            if (visibleType != null)
             {
-                foreach (var rt in filteredTypes)
+                foreach (var rt in visibleType)
                 {
                     repoView.AddResourceTypeFilter(rt);
                 }
@@ -108,14 +115,20 @@
         private void repoView_ItemSelected(object sender, EventArgs e)
         {
             var item = repoView.SelectedItem;
-            var condition = (item != null && !item.IsFolder && (item.ResourceType == ResourceTypes.LayerDefinition));
-            btnAddToMap.Enabled = btnEdit.Enabled = condition;
+            var condition = (item != null && !item.IsFolder);
+            btnAddToMap.Enabled = condition && (item.ResourceType == ResourceTypes.LayerDefinition);
+            btnEdit.Enabled = condition && IsEditableType(item.ResourceType);
             btnRefresh.Enabled = !condition;
             var h = this.ItemSelected;
             if (h != null)
                 h(this, EventArgs.Empty);
         }
 
+        private bool IsEditableType(ResourceTypes rt)
+        {
+            return _editableTypes.Contains(rt);
+        }
+
         private void btnRefresh_Click(object sender, EventArgs e)
         {
             var item = repoView.SelectedItem;


Property changes on: trunk/Tools/Maestro/Maestro.Editors/Preview
___________________________________________________________________
Added: bugtraq:number
   + true

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/DefaultResourcePreviewer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/DefaultResourcePreviewer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/DefaultResourcePreviewer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,183 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 Maestro.Editors.SymbolDefinition;
+using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    /// <summary>
+    /// The default resource previewer implementation
+    /// </summary>
+    public class DefaultResourcePreviewer : IResourcePreviewer
+    {
+        private IUrlLauncherService _launcher;
+
+        public DefaultResourcePreviewer(IUrlLauncherService launcher)
+        {
+            _launcher = launcher;
+        }
+
+        abstract class PreviewResult
+        {
+
+        }
+
+        class UrlPreviewResult : PreviewResult
+        {
+            public string Url { get; set; }
+        }
+
+        class ImagePreviewResult : PreviewResult
+        {
+            public Image ImagePreview { get; set; }
+        }
+
+        /// <summary>
+        /// Previews the specified resource
+        /// </summary>
+        /// <param name="res">The resource to be previewed</param>
+        /// <param name="edSvc">The editor service</param>
+        public void Preview(IResource res, IEditorService edSvc)
+        {
+            Preview(res, edSvc, edSvc.PreviewLocale);
+        }
+
+        /// <summary>
+        /// Previews the specified resource
+        /// </summary>
+        /// <param name="res">The resource to be previewed</param>
+        /// <param name="edSvc">The editor service</param>
+        public void Preview(IResource res, IEditorService edSvc, string locale)
+        {
+            //TODO: Prompt for symbol parameters if there are any, as these can affect the rendered output
+            //and it is a nice way to test symbol parameters wrt to rendering
+
+            IServerConnection conn = res.CurrentConnection;
+            BusyWaitDelegate worker = () =>
+            {
+                string mapguideRootUrl = (string)conn.GetCustomProperty("BaseUrl"); //NOXLATE
+                //Save the current resource to another session copy
+                string resId = "Session:" + edSvc.SessionID + "//" + res.ResourceType.ToString() + "Preview" + Guid.NewGuid() + "." + res.ResourceType.ToString(); //NOXLATE
+
+                edSvc.ResourceService.SaveResourceAs(res, resId);
+                edSvc.ResourceService.CopyResource(res.ResourceID, resId, true);
+                var previewCopy = edSvc.ResourceService.GetResource(resId);
+
+                if (previewCopy.ResourceType == ResourceTypes.SymbolDefinition && conn.SiteVersion >= new Version(2, 0))
+                {
+                    //For Symbol Definition previews, we make a placeholder Layer Definition with the 
+                    ILayerDefinition layerDef = ObjectFactory.CreateDefaultLayer(conn, LayerType.Vector);
+                    IVectorLayerDefinition2 vl = layerDef.SubLayer as IVectorLayerDefinition2;
+                    if (vl != null)
+                    {
+                        //HACK-ish: We are flubbing a completely invalid Layer Definition under normal circumstances, 
+                        //but one that has the minimum required content model to generate an appropriate GETLEGENDIMAGE preview for
+                        vl.FeatureName = string.Empty;
+                        vl.ResourceId = string.Empty;
+                        vl.Geometry = string.Empty;
+                        vl.ToolTip = string.Empty;
+                        var vsr = vl.GetScaleRangeAt(0) as IVectorScaleRange2;
+                        if (vsr != null)
+                        {
+                            vsr.AreaStyle = null;
+                            vsr.LineStyle = null;
+                            vsr.PointStyle = null;
+                            var cs = layerDef.CreateDefaultCompositeStyle();
+                            var cr = cs.GetRuleAt(0);
+                            var csym = cr.CompositeSymbolization;
+                            var si = csym.CreateSymbolReference(previewCopy.ResourceID);
+                            csym.AddSymbolInstance(si);
+                            vsr.CompositeStyle = new List<ICompositeTypeStyle>() { cs };
+
+                            var ldfId = "Session:" + edSvc.SessionID + "//" + res.ResourceType.ToString() + "Preview" + Guid.NewGuid() + ".LayerDefinition"; //NOXLATE
+                            edSvc.ResourceService.SaveResourceAs(layerDef, ldfId);
+
+                            var mappingSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping);
+                            var img = mappingSvc.GetLegendImage(42, ldfId, 0, 4, 100, 100, "PNG"); //NOXLATE
+                            return new ImagePreviewResult() { ImagePreview = img };
+                        }
+                    }
+
+                    return null;
+                }
+                else
+                {
+                    //Now feed it to the preview engine
+                    var url = new ResourcePreviewEngine(mapguideRootUrl, edSvc).GeneratePreviewUrl(previewCopy, locale);
+                    return new UrlPreviewResult() { Url = url };
+                }
+            };
+            Action<object, Exception> onComplete = (result, ex) =>
+            {
+                if (ex != null)
+                {
+                    ErrorDialog.Show(ex);
+                }
+                else
+                {
+                    var urlResult = result as UrlPreviewResult;
+                    var imgResult = result as ImagePreviewResult;
+                    if (urlResult != null)
+                    {
+                        var url = urlResult.Url;
+                        _launcher.OpenUrl(url);
+                    }
+                    else if (imgResult != null)
+                    {
+                        new SymbolPreviewDialog(imgResult.ImagePreview).Show(null);
+                    }
+                }
+            };
+            BusyWaitDialog.Run(Strings.PrgPreparingResourcePreview, worker, onComplete);
+        }
+
+        /// <summary>
+        /// Gets whether the specified resource can be previewed
+        /// </summary>
+        /// <param name="res"></param>
+        /// <returns></returns>
+        public bool IsPreviewable(IResource res)
+        {
+            var rt = res.ResourceType;
+            if (res.CurrentConnection.Capabilities.SupportsResourcePreviews)
+            {
+                if (rt == ResourceTypes.SymbolDefinition)
+                {
+                    return res.CurrentConnection.SiteVersion >= new Version(2, 0) && Array.IndexOf(res.CurrentConnection.Capabilities.SupportedServices, (int)ServiceType.Mapping) >= 0;
+                }
+                else
+                {
+                    return ResourcePreviewEngine.IsPreviewableType(rt);
+                }
+            }
+            return false;
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/IResourcePreviewer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/IResourcePreviewer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/IResourcePreviewer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,59 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 OSGeo.MapGuide.MaestroAPI.Resource;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    /// <summary>
+    /// Defines an interface for previewing resources
+    /// </summary>
+    public interface IResourcePreviewer
+    {
+        /// <summary>
+        /// Gets whether the specified resource can be previewed
+        /// </summary>
+        /// <param name="res"></param>
+        /// <returns></returns>
+        bool IsPreviewable(IResource res);
+
+        /// <summary>
+        /// Previews the specified resource
+        /// </summary>
+        /// <param name="res">The resource to be previewed</param>
+        /// <param name="edSvc">The editor service</param>
+        void Preview(IResource res, IEditorService edSvc);
+
+        /// <summary>
+        /// Previews the specified resource using the given locale
+        /// </summary>
+        /// <param name="res">The resource to be previewed</param>
+        /// <param name="edSvc">The editor service</param>
+        /// <param name="locale">The locale</param>
+        /// <remarks>
+        /// The locale parameter should be treated as a hint. The underlying <see cref="T:OSGeo.MapGuide.MaestroAPI.IServerConnection"/> implementation
+        /// may not actually respect this value.
+        /// </remarks>
+        void Preview(IResource res, IEditorService edSvc, string locale);
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/IUrlLauncherService.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/IUrlLauncherService.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/IUrlLauncherService.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,38 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    /// <summary>
+    /// Defines an interface for launching URLs
+    /// </summary>
+    public interface IUrlLauncherService
+    {
+        /// <summary>
+        /// Opens the specified url using the system default web browser
+        /// </summary>
+        /// <param name="url"></param>
+        void OpenUrl(string url);
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/LocalMapPreviewer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/LocalMapPreviewer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/LocalMapPreviewer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,142 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Mapping;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.ObjectModels.MapDefinition;
+using OSGeo.MapGuide.ObjectModels.WatermarkDefinition;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    public class LocalMapPreviewer : IResourcePreviewer
+    {
+        private IResourcePreviewer _inner;
+        private IUrlLauncherService _launcher;
+        
+        public LocalMapPreviewer(IResourcePreviewer inner, IUrlLauncherService launcher)
+        {
+            _inner = inner;
+            _launcher = launcher;
+        }
+
+        public bool UseLocal
+        {
+            get { return PreviewSettings.UseLocalPreview; }
+        }
+
+        public bool IsPreviewable(IResource res)
+        {
+            if (this.UseLocal)
+            {
+                if (IsLocalPreviewableType(res))
+                {
+                    return true;
+                }
+            }
+            return _inner.IsPreviewable(res);
+        }
+
+        private static bool IsLocalPreviewableType(IResource res)
+        {
+            return res.ResourceType == ResourceTypes.LayerDefinition ||
+                   res.ResourceType == ResourceTypes.MapDefinition ||
+                   res.ResourceType == ResourceTypes.WatermarkDefinition;
+        }
+
+        public void Preview(IResource res, IEditorService edSvc)
+        {
+            Preview(res, edSvc, null);
+        }
+
+        static bool SupportsMappingService(IServerConnection conn)
+        {
+            return Array.IndexOf(conn.Capabilities.SupportedServices, (int)ServiceType.Mapping) >= 0;
+        }
+
+        public void Preview(IResource res, IEditorService edSvc, string locale)
+        {
+            IServerConnection conn = res.CurrentConnection;
+            if (this.UseLocal && IsLocalPreviewableType(res) && SupportsMappingService(conn))
+            {
+                BusyWaitDelegate worker = () =>
+                {
+                    IMappingService mapSvc = (IMappingService)conn.GetService((int)ServiceType.Mapping);
+                    IMapDefinition previewMdf = null;
+                    switch (res.ResourceType)
+                    {
+                        case ResourceTypes.LayerDefinition:
+                            {
+                                ILayerDefinition ldf = (ILayerDefinition)res;
+                                string layerName = string.Empty;
+                                if (edSvc.IsNew)
+                                    layerName = ResourceIdentifier.GetName(ldf.SubLayer.ResourceId);
+                                else
+                                    layerName = ResourceIdentifier.GetName(edSvc.ResourceID);
+                                previewMdf = ResourcePreviewEngine.CreateLayerPreviewMapDefinition(ldf, edSvc.SessionID, layerName, conn);
+                            }
+                            break;
+                        case ResourceTypes.WatermarkDefinition:
+                            {
+                                previewMdf = ResourcePreviewEngine.CreateWatermarkPreviewMapDefinition((IWatermarkDefinition)res);
+                            }
+                            break;
+                        case ResourceTypes.MapDefinition:
+                            {
+                                previewMdf = (IMapDefinition)res;
+                            }
+                            break;
+                    }
+                    if (previewMdf != null)
+                        return mapSvc.CreateMap(previewMdf);
+                    else
+                        return null;
+                };
+                Action<object, Exception> onComplete = (obj, ex) =>
+                {
+                    if (ex != null)
+                        throw ex;
+
+                    if (obj != null)
+                    {
+                        var rtMap = (RuntimeMap)obj;
+                        var diag = new MapPreviewDialog(rtMap, _launcher, (edSvc.IsNew) ? null : edSvc.ResourceID);
+                        diag.Show(null);
+                    }
+                    else //Fallback, shouldn't happen
+                    {
+                        _inner.Preview(res, edSvc, locale);
+                    }
+                };
+                BusyWaitDialog.Run(Strings.PrgPreparingResourcePreview, worker, onComplete);
+            }
+            else
+            {
+                _inner.Preview(res, edSvc, locale);
+            }
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,423 @@
+namespace Maestro.Editors.Preview
+{
+    partial class MapPreviewDialog
+    {
+        /// <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()
+        {
+            this.defaultToolbar = new Maestro.MapViewer.DefaultToolbar();
+            this.mapViewer = new Maestro.MapViewer.MapViewer();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.lblCoordinates = new System.Windows.Forms.ToolStripStatusLabel();
+            this.lblSelected = new System.Windows.Forms.ToolStripStatusLabel();
+            this.lblScale = new System.Windows.Forms.ToolStripStatusLabel();
+            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+            this.legend = new Maestro.MapViewer.Legend();
+            this.mapStatusTracker = new Maestro.MapViewer.MapStatusTracker();
+            this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.grpOtherTools = new System.Windows.Forms.GroupBox();
+            this.btnGetMapKml = new System.Windows.Forms.Button();
+            this.lnkZoomToScale = new System.Windows.Forms.LinkLabel();
+            this.numZoomToScale = new System.Windows.Forms.NumericUpDown();
+            this.label5 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtMaxY = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.txtMaxX = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.txtMinY = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtMinX = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.txtCoordinateSystem = new System.Windows.Forms.TextBox();
+            this.statusStrip1.SuspendLayout();
+            this.splitContainer1.Panel1.SuspendLayout();
+            this.splitContainer1.Panel2.SuspendLayout();
+            this.splitContainer1.SuspendLayout();
+            this.splitContainer2.Panel1.SuspendLayout();
+            this.splitContainer2.Panel2.SuspendLayout();
+            this.splitContainer2.SuspendLayout();
+            this.panel1.SuspendLayout();
+            this.grpOtherTools.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numZoomToScale)).BeginInit();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // defaultToolbar
+            // 
+            this.defaultToolbar.Location = new System.Drawing.Point(0, 0);
+            this.defaultToolbar.Name = "defaultToolbar";
+            this.defaultToolbar.Size = new System.Drawing.Size(784, 25);
+            this.defaultToolbar.TabIndex = 0;
+            this.defaultToolbar.Viewer = this.mapViewer;
+            // 
+            // mapViewer
+            // 
+            this.mapViewer.Cursor = System.Windows.Forms.Cursors.Default;
+            this.mapViewer.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.mapViewer.Location = new System.Drawing.Point(0, 0);
+            this.mapViewer.MaxScale = 1000000000;
+            this.mapViewer.MinScale = 10;
+            this.mapViewer.MouseWheelDelayRenderInterval = 800;
+            this.mapViewer.Name = "mapViewer";
+            this.mapViewer.PointPixelBuffer = 2;
+            this.mapViewer.SelectionColor = System.Drawing.Color.Blue;
+            this.mapViewer.Size = new System.Drawing.Size(381, 515);
+            this.mapViewer.TabIndex = 0;
+            this.mapViewer.TooltipDelayInterval = 1000;
+            this.mapViewer.ZoomInFactor = 0.5D;
+            this.mapViewer.ZoomOutFactor = 2D;
+            this.mapViewer.MapScaleChanged += new System.EventHandler(this.mapViewer_MapScaleChanged);
+            this.mapViewer.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(this.mapViewer_PropertyChanged);
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.lblCoordinates,
+            this.lblSelected,
+            this.lblScale});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 540);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(784, 22);
+            this.statusStrip1.TabIndex = 1;
+            this.statusStrip1.Text = "statusStrip1";
+            // 
+            // lblCoordinates
+            // 
+            this.lblCoordinates.Name = "lblCoordinates";
+            this.lblCoordinates.Size = new System.Drawing.Size(0, 17);
+            // 
+            // lblSelected
+            // 
+            this.lblSelected.Name = "lblSelected";
+            this.lblSelected.Size = new System.Drawing.Size(769, 17);
+            this.lblSelected.Spring = true;
+            this.lblSelected.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // lblScale
+            // 
+            this.lblScale.Name = "lblScale";
+            this.lblScale.Size = new System.Drawing.Size(0, 17);
+            // 
+            // splitContainer1
+            // 
+            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+            this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+            this.splitContainer1.Name = "splitContainer1";
+            // 
+            // splitContainer1.Panel1
+            // 
+            this.splitContainer1.Panel1.Controls.Add(this.legend);
+            // 
+            // splitContainer1.Panel2
+            // 
+            this.splitContainer1.Panel2.Controls.Add(this.mapViewer);
+            this.splitContainer1.Size = new System.Drawing.Size(584, 515);
+            this.splitContainer1.SplitterDistance = 199;
+            this.splitContainer1.TabIndex = 2;
+            // 
+            // legend
+            // 
+            this.legend.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.legend.GroupContextMenu = null;
+            this.legend.LayerContextMenu = null;
+            this.legend.Location = new System.Drawing.Point(0, 0);
+            this.legend.Name = "legend";
+            this.legend.SelectOnRightClick = false;
+            this.legend.ShowAllLayersAndGroups = false;
+            this.legend.ShowTooltips = true;
+            this.legend.Size = new System.Drawing.Size(199, 515);
+            this.legend.TabIndex = 0;
+            this.legend.ThemeCompressionLimit = 25;
+            this.legend.Viewer = this.mapViewer;
+            // 
+            // mapStatusTracker
+            // 
+            this.mapStatusTracker.CoordinatesLabel = this.lblCoordinates;
+            this.mapStatusTracker.ScaleLabel = this.lblScale;
+            this.mapStatusTracker.SelectedLabel = this.lblSelected;
+            this.mapStatusTracker.Viewer = this.mapViewer;
+            // 
+            // splitContainer2
+            // 
+            this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+            this.splitContainer2.Location = new System.Drawing.Point(0, 25);
+            this.splitContainer2.Name = "splitContainer2";
+            // 
+            // splitContainer2.Panel1
+            // 
+            this.splitContainer2.Panel1.Controls.Add(this.splitContainer1);
+            // 
+            // splitContainer2.Panel2
+            // 
+            this.splitContainer2.Panel2.Controls.Add(this.panel1);
+            this.splitContainer2.Size = new System.Drawing.Size(784, 515);
+            this.splitContainer2.SplitterDistance = 584;
+            this.splitContainer2.TabIndex = 3;
+            // 
+            // panel1
+            // 
+            this.panel1.AutoScroll = true;
+            this.panel1.Controls.Add(this.grpOtherTools);
+            this.panel1.Controls.Add(this.groupBox1);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panel1.Location = new System.Drawing.Point(0, 0);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(196, 515);
+            this.panel1.TabIndex = 1;
+            // 
+            // grpOtherTools
+            // 
+            this.grpOtherTools.Controls.Add(this.btnGetMapKml);
+            this.grpOtherTools.Controls.Add(this.lnkZoomToScale);
+            this.grpOtherTools.Controls.Add(this.numZoomToScale);
+            this.grpOtherTools.Controls.Add(this.label5);
+            this.grpOtherTools.Location = new System.Drawing.Point(16, 367);
+            this.grpOtherTools.Name = "grpOtherTools";
+            this.grpOtherTools.Size = new System.Drawing.Size(165, 115);
+            this.grpOtherTools.TabIndex = 1;
+            this.grpOtherTools.TabStop = false;
+            this.grpOtherTools.Text = "Other Tools";
+            // 
+            // btnGetMapKml
+            // 
+            this.btnGetMapKml.Location = new System.Drawing.Point(10, 74);
+            this.btnGetMapKml.Name = "btnGetMapKml";
+            this.btnGetMapKml.Size = new System.Drawing.Size(94, 23);
+            this.btnGetMapKml.TabIndex = 4;
+            this.btnGetMapKml.Text = "Get Map KML";
+            this.btnGetMapKml.UseVisualStyleBackColor = true;
+            this.btnGetMapKml.Click += new System.EventHandler(this.btnGetMapKml_Click);
+            // 
+            // lnkZoomToScale
+            // 
+            this.lnkZoomToScale.AutoSize = true;
+            this.lnkZoomToScale.Location = new System.Drawing.Point(93, 32);
+            this.lnkZoomToScale.Name = "lnkZoomToScale";
+            this.lnkZoomToScale.Size = new System.Drawing.Size(40, 13);
+            this.lnkZoomToScale.TabIndex = 3;
+            this.lnkZoomToScale.TabStop = true;
+            this.lnkZoomToScale.Text = "(Zoom)";
+            this.lnkZoomToScale.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkZoomToScale_LinkClicked);
+            // 
+            // numZoomToScale
+            // 
+            this.numZoomToScale.Location = new System.Drawing.Point(10, 48);
+            this.numZoomToScale.Name = "numZoomToScale";
+            this.numZoomToScale.Size = new System.Drawing.Size(135, 20);
+            this.numZoomToScale.TabIndex = 2;
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(7, 32);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(80, 13);
+            this.label5.TabIndex = 1;
+            this.label5.Text = "Zoom To Scale";
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.txtCoordinateSystem);
+            this.groupBox1.Controls.Add(this.label6);
+            this.groupBox1.Controls.Add(this.txtMaxY);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.txtMaxX);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.txtMinY);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.txtMinX);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(16, 10);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(165, 351);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Current Extents";
+            // 
+            // txtMaxY
+            // 
+            this.txtMaxY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtMaxY.Location = new System.Drawing.Point(10, 167);
+            this.txtMaxY.Name = "txtMaxY";
+            this.txtMaxY.ReadOnly = true;
+            this.txtMaxY.Size = new System.Drawing.Size(135, 20);
+            this.txtMaxY.TabIndex = 7;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(7, 150);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(37, 13);
+            this.label4.TabIndex = 6;
+            this.label4.Text = "Max Y";
+            // 
+            // txtMaxX
+            // 
+            this.txtMaxX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtMaxX.Location = new System.Drawing.Point(10, 129);
+            this.txtMaxX.Name = "txtMaxX";
+            this.txtMaxX.ReadOnly = true;
+            this.txtMaxX.Size = new System.Drawing.Size(135, 20);
+            this.txtMaxX.TabIndex = 5;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(7, 112);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(37, 13);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "Max X";
+            // 
+            // txtMinY
+            // 
+            this.txtMinY.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtMinY.Location = new System.Drawing.Point(10, 89);
+            this.txtMinY.Name = "txtMinY";
+            this.txtMinY.ReadOnly = true;
+            this.txtMinY.Size = new System.Drawing.Size(135, 20);
+            this.txtMinY.TabIndex = 3;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(7, 72);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(34, 13);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "Min Y";
+            // 
+            // txtMinX
+            // 
+            this.txtMinX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtMinX.Location = new System.Drawing.Point(10, 49);
+            this.txtMinX.Name = "txtMinX";
+            this.txtMinX.ReadOnly = true;
+            this.txtMinX.Size = new System.Drawing.Size(135, 20);
+            this.txtMinX.TabIndex = 1;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(7, 32);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(34, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Min X";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(7, 190);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(95, 13);
+            this.label6.TabIndex = 8;
+            this.label6.Text = "Coordinate System";
+            // 
+            // txtCoordinateSystem
+            // 
+            this.txtCoordinateSystem.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtCoordinateSystem.Location = new System.Drawing.Point(10, 207);
+            this.txtCoordinateSystem.Multiline = true;
+            this.txtCoordinateSystem.Name = "txtCoordinateSystem";
+            this.txtCoordinateSystem.ReadOnly = true;
+            this.txtCoordinateSystem.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+            this.txtCoordinateSystem.Size = new System.Drawing.Size(135, 123);
+            this.txtCoordinateSystem.TabIndex = 9;
+            // 
+            // MapPreviewDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(784, 562);
+            this.Controls.Add(this.splitContainer2);
+            this.Controls.Add(this.statusStrip1);
+            this.Controls.Add(this.defaultToolbar);
+            this.Name = "MapPreviewDialog";
+            this.Text = "Map Preview";
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
+            this.splitContainer1.Panel1.ResumeLayout(false);
+            this.splitContainer1.Panel2.ResumeLayout(false);
+            this.splitContainer1.ResumeLayout(false);
+            this.splitContainer2.Panel1.ResumeLayout(false);
+            this.splitContainer2.Panel2.ResumeLayout(false);
+            this.splitContainer2.ResumeLayout(false);
+            this.panel1.ResumeLayout(false);
+            this.grpOtherTools.ResumeLayout(false);
+            this.grpOtherTools.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.numZoomToScale)).EndInit();
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private MapViewer.DefaultToolbar defaultToolbar;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private System.Windows.Forms.ToolStripStatusLabel lblCoordinates;
+        private System.Windows.Forms.ToolStripStatusLabel lblSelected;
+        private System.Windows.Forms.ToolStripStatusLabel lblScale;
+        private System.Windows.Forms.SplitContainer splitContainer1;
+        private MapViewer.Legend legend;
+        private MapViewer.MapViewer mapViewer;
+        private MapViewer.MapStatusTracker mapStatusTracker;
+        private System.Windows.Forms.SplitContainer splitContainer2;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.GroupBox grpOtherTools;
+        private System.Windows.Forms.LinkLabel lnkZoomToScale;
+        private System.Windows.Forms.NumericUpDown numZoomToScale;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TextBox txtMaxY;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox txtMaxX;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TextBox txtMinY;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox txtMinX;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Button btnGetMapKml;
+        private System.Windows.Forms.TextBox txtCoordinateSystem;
+        private System.Windows.Forms.Label label6;
+    }
+}
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,111 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Mapping;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Editors.Preview
+{
+    internal partial class MapPreviewDialog : Form
+    {
+        private RuntimeMap _map;
+        private IUrlLauncherService _launcher;
+        private IServerConnection _conn;
+
+        public MapPreviewDialog(RuntimeMap map, IUrlLauncherService urlLauncher, string resourceId)
+        {
+            InitializeComponent();
+            _map = map;
+            if (!string.IsNullOrEmpty(resourceId))
+                this.Text += " - " + resourceId;
+
+            txtCoordinateSystem.Text = map.CoordinateSystem;
+            numZoomToScale.Minimum = 1;
+            numZoomToScale.Maximum = Int32.MaxValue;
+            _launcher = urlLauncher;
+            _conn = map.CurrentConnection;
+            btnGetMapKml.Enabled = (_conn.ProviderName.ToUpper() == "MAESTRO.HTTP"); //NOXLATE
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+            if (_map.Layers.Count == 1) //Single-layer preview
+            {
+                var maxScale = _map.Layers.Max(x => x.ScaleRanges.Max(y => y.MaxScale));
+                var initScale = Math.Floor(maxScale - 0.5);
+                var env = _map.MapExtent;
+                double mcsW = env.MaxX - env.MinX;
+                double mcsH = env.MaxY - env.MinY;
+                var bboxScale = Maestro.MapViewer.MapViewer.CalculateScale(_map, mcsW, mcsH, mapViewer.Width, mapViewer.Height);
+                double desiredScale = Math.Min(initScale, bboxScale);
+                mapViewer.LoadMap(_map, desiredScale);
+            }
+            else
+            {
+                mapViewer.LoadMap(_map);
+            }
+        }
+
+        private void mapViewer_MapScaleChanged(object sender, EventArgs e)
+        {
+            numZoomToScale.Value = Convert.ToDecimal(mapViewer.GetMap().ViewScale);
+        }
+
+        private void lnkZoomToScale_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            mapViewer.ZoomToScale(Convert.ToDouble(numZoomToScale.Value));
+        }
+
+        private void mapViewer_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == "IsBusy") //NOXLATE
+            {
+                grpOtherTools.Enabled = !mapViewer.IsBusy;
+
+                if (!mapViewer.IsBusy)
+                {
+                    double minx, miny, maxx, maxy;
+                    mapViewer.GetViewExtent(out minx, out miny, out maxx, out maxy);
+
+                    txtMinX.Text = minx.ToString(CultureInfo.InvariantCulture);
+                    txtMinY.Text = miny.ToString(CultureInfo.InvariantCulture);
+                    txtMaxX.Text = maxx.ToString(CultureInfo.InvariantCulture);
+                    txtMaxY.Text = maxy.ToString(CultureInfo.InvariantCulture);
+                }
+            }
+        }
+
+        private void btnGetMapKml_Click(object sender, EventArgs e)
+        {
+            var mapagent = _conn.GetCustomProperty("BaseUrl").ToString(); //NOXLATE
+            mapagent += "mapagent/mapagent.fcgi?SESSION=" + _conn.SessionID + "&VERSION=1.0.0&OPERATION=GETMAPKML&DPI=96&MAPDEFINITION=" + _map.MapDefinition + "&FORMAT=KML&CLIENTAGENT=Maestro Local Map Previewer"; //NOXLATE
+            _launcher.OpenUrl(mapagent);
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/MapPreviewDialog.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="defaultToolbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>155, 17</value>
+  </metadata>
+  <metadata name="mapStatusTracker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>271, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/PreviewSettings.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/PreviewSettings.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/PreviewSettings.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,48 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    /// <summary>
+    /// Settings that control resource preview functionality
+    /// </summary>
+    public static class PreviewSettings
+    {
+        static PreviewSettings()
+        {
+            UseAjaxViewer = true;
+            UseLocalPreview = true;
+        }
+
+        /// <summary>
+        /// Determines if a local map viewer should be used over launching a viewer URL
+        /// </summary>
+        public static bool UseLocalPreview { get; set; }
+
+        /// <summary>
+        /// Determines if the AJAX viewer should be used over the Fusion viewer
+        /// </summary>
+        public static bool UseAjaxViewer { get; set; }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewEngine.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewEngine.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewEngine.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,319 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
+using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.ObjectModels.MapDefinition;
+using OSGeo.MapGuide.ObjectModels.WatermarkDefinition;
+using OSGeo.MapGuide.ObjectModels.WebLayout;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    public class ResourcePreviewEngine
+    {
+        private string _rootUrl;
+        private IEditorService _edSvc;
+
+        public ResourcePreviewEngine(string rootUrl, IEditorService edSvc)
+        {
+            _rootUrl = rootUrl;
+            _edSvc = edSvc;
+        }
+
+        static string GetLocale(string locale)
+        {
+            return string.IsNullOrEmpty(locale) ? "en" : locale; //NOXLATE
+        }
+
+        private string GenerateFeatureSourcePreviewUrl(IResource res, string locale)
+        {
+            string url = _rootUrl;
+            if (!url.EndsWith("/")) //NOXLATE
+                url += "/"; //NOXLATE
+
+            var resId = res.ResourceID;
+            var sessionId = _edSvc.SessionID;
+            url += "schemareport/describeschema.php?viewer=basic&schemaName=&className=&resId=" + resId + "&sessionId=" + sessionId + "&locale=" + GetLocale(locale); //NOXLATE
+
+            return url;
+        }
+
+        private string GenerateLayerPreviewUrl(IResource res, string locale)
+        {
+            string url = _rootUrl;
+            if (!url.EndsWith("/")) //NOXLATE
+                url += "/"; //NOXLATE
+
+            var ldf = (ILayerDefinition)res;
+            var sessionId = _edSvc.SessionID;
+            var conn = res.CurrentConnection;
+
+            string layerName = string.Empty;
+            //Use feature source as name/label if new and unsaved
+            if (_edSvc.IsNew)
+                layerName = ResourceIdentifier.GetName(ldf.SubLayer.ResourceId);
+            else
+                layerName = ResourceIdentifier.GetName(_edSvc.ResourceID);
+
+            var mdf = CreateLayerPreviewMapDefinition(ldf, sessionId, layerName, conn);
+            //if (PropertyService.Get(ConfigProperties.PreviewViewerType, "AJAX").Equals("AJAX")) //NOXLATE
+            if (PreviewSettings.UseAjaxViewer)
+            {
+                //Create temp web layout to house this map
+                var wl = ObjectFactory.CreateWebLayout(_edSvc.GetEditedResource().CurrentConnection, new Version(1, 0, 0), mdf.ResourceID);
+
+                //Add a custom zoom command (to assist previews of layers that aren't [0, infinity] scale)
+                AttachPreviewCommands(wl);
+
+                var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".WebLayout"; //NOXLATE
+
+                conn.ResourceService.SaveResourceAs(wl, resId);
+                url += "mapviewerajax/?WEBLAYOUT=" + resId + "&SESSION=" + sessionId + "&LOCALE=" + GetLocale(locale); //NOXLATE
+            }
+            else
+            {
+                throw new NotImplementedException();
+                ////Create temp flex layout
+                //var appDef = ObjectFactory.CreatePreviewFlexLayout(conn);
+                //var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition"; //NOXLATE
+                //appDef.AddMapGroup("previewmap", true, mdfId); //NOXLATE
+
+                //conn.ResourceService.SaveResourceAs(appDef, resId);
+                //url += "fusion/templates/mapguide/preview/index.html?Session=" + sessionId + "&ApplicationDefinition=" + resId; //NOXLATE
+            }
+
+            return url;
+        }
+
+        internal static IMapDefinition CreateLayerPreviewMapDefinition(ILayerDefinition ldf, string sessionId, string layerName, IServerConnection conn)
+        {
+            //Create temp map definition to house our current layer
+            var mdfId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".MapDefinition"; //NOXLATE
+            string csWkt;
+            var extent = ldf.GetSpatialExtent(true, out csWkt);
+            if (extent == null)
+                throw new ApplicationException(Strings.FailedToCalculateFeatureSourceExtents);
+
+            //TODO: Based on the visible scales in this layer, size this extents accordingly
+            var mdf = ObjectFactory.CreateMapDefinition(conn, Strings.PreviewMap, csWkt, extent);
+
+            var layer = mdf.AddLayer(null, layerName, ldf.ResourceID);
+            conn.ResourceService.SaveResourceAs(mdf, mdfId);
+            mdf.ResourceID = mdfId;
+            return mdf;
+        }
+
+        private static void AttachPreviewCommands(IWebLayout wl)
+        {
+            var cmd = wl.CreateInvokeScriptCommand();
+            cmd.Name = "ZoomScale"; //NOXLATE
+            cmd.Label = Strings.Label_ZoomToScale;
+            cmd.Tooltip = Strings.Desc_ZoomToScale;
+            cmd.Script = @"
+                var map = parent.parent.GetMapFrame();
+                var center = map.GetCenter();
+                var scale = parseFloat(prompt('Enter the scale:'));
+                map.ZoomToView(center.X, center.Y, scale, true);
+                "; //NOXLATE
+
+            cmd.TargetViewer = TargetViewerType.Ajax;
+            cmd.ImageURL = "../stdicons/icon_zoom.gif"; //NOXLATE
+
+            wl.CommandSet.AddCommand(cmd);
+
+            var cmd2 = wl.CreateInvokeScriptCommand();
+            cmd2.Name = "GetMapKml"; //NOXLATE
+            cmd2.Label = Strings.Label_GetMapKml;
+            cmd2.Description = Strings.Desc_GetMapKml;
+            cmd2.Tooltip = Strings.Desc_GetMapKml;
+
+            cmd2.Script = @"
+                var map = parent.parent.GetMapFrame();
+                var url = ""../mapagent/mapagent.fcgi?OPERATION=GETMAPKML&VERSION=1.0.0&FORMAT=KML&DISPLAYDPI=96&MAPDEFINITION=" + wl.Map.ResourceId + @""";
+                url += ""&SESSION="" + map.GetSessionId();
+                window.open(url);"; //NOXLATE
+
+            cmd2.TargetViewer = TargetViewerType.Ajax;
+            cmd2.ImageURL = "../stdicons/icon_invokescript.gif"; //NOXLATE
+
+            wl.CommandSet.AddCommand(cmd2);
+
+            var cmd3 = wl.CreateInvokeScriptCommand();
+            cmd3.Name = "GetExtents"; //NOXLATE
+            cmd3.Label = Strings.Label_GetExtents;
+            cmd3.Description = Strings.Desc_GetExtents;
+            cmd3.Tooltip = Strings.Desc_GetExtents;
+
+            cmd3.Script = @"
+                var map = parent.parent.GetMapFrame();
+                alert('Map Extents\n\nLower Left: ' + map.extX1 + ', ' + map.extY2 + '\nUpper Right: ' + map.extX2 + ', ' + map.extY1);
+                "; //NOXLATE
+
+            cmd3.TargetViewer = TargetViewerType.Ajax;
+            cmd3.ImageURL = "../stdicons/icon_invokescript.gif"; //NOXLATE
+
+            wl.CommandSet.AddCommand(cmd3);
+
+            var zoomScale = wl.CreateCommandItem(cmd.Name);
+            var menu = wl.CreateFlyout(Strings.Label_Tools, Strings.Label_Tools, Strings.Label_ExtraTools, string.Empty, string.Empty,
+                wl.CreateCommandItem("ZoomScale"), //NOXLATE
+                wl.CreateCommandItem("GetMapKml"), //NOXLATE
+                wl.CreateCommandItem("GetExtents") //NOXLATE
+            );
+            wl.ToolBar.AddItem(menu);
+        }
+
+        private string GenerateWatermarkPreviewUrl(IWatermarkDefinition wmd, string locale)
+        {
+            //We demand a 2.3.0 Map Definition or higher
+            if (wmd.CurrentConnection.SiteVersion < new Version(2, 3))
+                throw new InvalidOperationException(Strings.SiteVersionDoesntSupportWatermarks);
+
+            IMapDefinition2 map = CreateWatermarkPreviewMapDefinition(wmd);
+            return GenerateMapPreviewUrl(map, locale);
+        }
+
+        internal static IMapDefinition2 CreateWatermarkPreviewMapDefinition(IWatermarkDefinition wmd)
+        {
+            IMapDefinition2 map = (IMapDefinition2)ObjectFactory.CreateMapDefinition(wmd.CurrentConnection, wmd.SupportedMapDefinitionVersion, "Watermark Definition Preview"); //NOXLATE
+            map.CoordinateSystem = @"LOCAL_CS[""*XY-M*"", LOCAL_DATUM[""*X-Y*"", 10000], UNIT[""Meter"", 1], AXIS[""X"", EAST], AXIS[""Y"", NORTH]]"; //NOXLATE
+            map.Extents = ObjectFactory.CreateEnvelope(-1000000, -1000000, 1000000, 1000000);
+            map.AddWatermark(wmd);
+            return map;
+        }
+
+        private string GenerateMapPreviewUrl(IResource res, string locale)
+        {
+            string url = _rootUrl;
+            if (!url.EndsWith("/")) //NOXLATE
+                url += "/"; //NOXLATE
+
+            var sessionId = _edSvc.SessionID;
+            var mdfId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".MapDefinition"; //NOXLATE
+            var mdf = (IMapDefinition)res;
+
+            var conn = mdf.CurrentConnection;
+            conn.ResourceService.SaveResourceAs(mdf, mdfId);
+
+            //if (PropertyService.Get(ConfigProperties.PreviewViewerType, "AJAX").Equals("AJAX")) //NOXLATE
+            if (PreviewSettings.UseAjaxViewer)
+            {
+                //Create temp web layout to house this map
+                var wl = ObjectFactory.CreateWebLayout(_edSvc.GetEditedResource().CurrentConnection, new Version(1, 0, 0), mdfId);
+
+                //Add a custom zoom command (to assist previews of layers that aren't [0, infinity] scale)
+                AttachPreviewCommands(wl);
+
+                var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".WebLayout"; //NOXLATE
+
+                conn.ResourceService.SaveResourceAs(wl, resId);
+                url += "mapviewerajax/?WEBLAYOUT=" + resId + "&SESSION=" + sessionId + "&LOCALE=" + GetLocale(locale); //NOXLATE
+            }
+            else
+            {
+                throw new NotImplementedException();
+                ////Create temp flex layout
+                //var appDef = ObjectFactory.CreateFlexibleLayout(conn);
+                //var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition"; //NOXLATE
+                //appDef.AddMapGroup("previewmap", true, mdfId); //NOXLATE
+
+                //conn.ResourceService.SaveResourceAs(appDef, resId);
+                //url += "fusion/templates/mapguide/preview/index.html?Session=" + sessionId + "&ApplicationDefinition=" + resId; //NOXLATE
+            }
+
+            return url;
+        }
+
+        private string GenerateWebLayoutPreviewUrl(IResource res, string locale)
+        {
+            string url = _rootUrl;
+            if (!url.EndsWith("/")) //NOXLATE
+                url += "/"; //NOXLATE
+
+            var sessionId = _edSvc.SessionID;
+            var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".WebLayout"; //NOXLATE
+            var conn = res.CurrentConnection;
+
+            conn.ResourceService.SaveResourceAs(res, resId);
+            url += "mapviewerajax/?WEBLAYOUT=" + resId + "&SESSION=" + sessionId + "&LOCALE=" + GetLocale(locale); //NOXLATE
+
+            return url;
+        }
+
+        private string GenerateFlexLayoutPreviewUrl(IResource res, string locale)
+        {
+            string url = _rootUrl;
+            if (!url.EndsWith("/")) //NOXLATE
+                url += "/"; //NOXLATE
+
+            //Create temp flex layout
+            var sessionId = _edSvc.SessionID;
+            var appDef = (IApplicationDefinition)res;
+            var conn = appDef.CurrentConnection;
+            var resId = "Session:" + sessionId + "//" + Guid.NewGuid() + ".ApplicationDefinition"; //NOXLATE
+
+            conn.ResourceService.SaveResourceAs(appDef, resId);
+            url += appDef.TemplateUrl + "?Session=" + sessionId + "&ApplicationDefinition=" + resId + "&locale=" + GetLocale(locale); //NOXLATE
+            return url;
+        }
+
+        public string GeneratePreviewUrl(IResource res, string locale)
+        {
+            switch (res.ResourceType)
+            {
+                case ResourceTypes.FeatureSource:
+                    return GenerateFeatureSourcePreviewUrl(res, locale);
+                case ResourceTypes.ApplicationDefinition:
+                    return GenerateFlexLayoutPreviewUrl(res, locale);
+                case ResourceTypes.LayerDefinition:
+                    return GenerateLayerPreviewUrl(res, locale);
+                case ResourceTypes.MapDefinition:
+                    return GenerateMapPreviewUrl(res, locale);
+                case ResourceTypes.WebLayout:
+                    return GenerateWebLayoutPreviewUrl(res, locale);
+                case ResourceTypes.WatermarkDefinition:
+                    return GenerateWatermarkPreviewUrl((IWatermarkDefinition)res, locale);
+                default:
+                    throw new InvalidOperationException(Strings.UnpreviewableResourceType);
+            }
+        }
+
+        private static ResourceTypes[] PREVIEWABLE_RESOURCE_TYPES = new ResourceTypes[] 
+        {
+            ResourceTypes.FeatureSource,
+            ResourceTypes.ApplicationDefinition,
+            ResourceTypes.LayerDefinition,
+            ResourceTypes.MapDefinition,
+            ResourceTypes.WebLayout,
+            ResourceTypes.WatermarkDefinition
+        };
+
+        internal static bool IsPreviewableType(OSGeo.MapGuide.MaestroAPI.ResourceTypes rt)
+        {
+            return Array.IndexOf(PREVIEWABLE_RESOURCE_TYPES, rt) >= 0;
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewFactory.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewFactory.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/ResourcePreviewFactory.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,84 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 OSGeo.MapGuide.MaestroAPI.Resource;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    /// <summary>
+    /// A simple <see cref="T:Maestro.Editors.Preview.IResourcePreviewer"/> resolution container
+    /// </summary>
+    public static class ResourcePreviewerFactory
+    {
+        static Dictionary<string, IResourcePreviewer> _previewers = new Dictionary<string, IResourcePreviewer>();
+
+        /// <summary>
+        /// Registers the given <see cref="T:Maestro.Editors.Preview.IResourcePreviewer"/> for a given connection provider
+        /// </summary>
+        /// <param name="provider">The name of the connection provider</param>
+        /// <param name="previewer">The previewer implementation</param>
+        /// <param name="launcher">The URL launcher</param>
+        public static void RegisterPreviewer(string provider, IResourcePreviewer previewer)
+        {
+            _previewers[provider.ToUpper()] = previewer;
+        }
+
+        /// <summary>
+        /// Gets whether a previewer has been registered for the given connection provider
+        /// </summary>
+        /// <param name="provider"></param>
+        /// <returns></returns>
+        public static bool HasPreviewer(string provider)
+        {
+            return _previewers.ContainsKey(provider.ToUpper());
+        }
+
+        /// <summary>
+        /// Gets whether the given resource type is previewable for the given connection provider
+        /// </summary>
+        /// <param name="provider"></param>
+        /// <param name="resource"></param>
+        /// <returns></returns>
+        public static bool IsPreviewable(string provider, IResource resource)
+        {
+            var preview = GetPreviewer(provider);
+            if (preview != null)
+                return preview.IsPreviewable(resource);
+
+            return false;
+        }
+
+        /// <summary>
+        /// Gets the registered previewer for the specified connection provider
+        /// </summary>
+        /// <param name="provider"></param>
+        /// <returns></returns>
+        public static IResourcePreviewer GetPreviewer(string provider)
+        {
+            if (HasPreviewer(provider))
+                return _previewers[provider.ToUpper()];
+
+            return null;
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Preview/StubPreviewer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Preview/StubPreviewer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Preview/StubPreviewer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -0,0 +1,49 @@
+#region Disclaimer / License
+// Copyright (C) 2013, 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 OSGeo.MapGuide.MaestroAPI.Resource;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Maestro.Editors.Preview
+{
+    /// <summary>
+    /// A previewer that does nothing. Primarily used to connect to a <see cref="T:Maestro.Editors.Preview.LocalMapPreviewer"/> when
+    /// a non-local preview method does not exist
+    /// </summary>
+    public class StubPreviewer : IResourcePreviewer
+    {
+        public bool IsPreviewable(IResource res)
+        {
+            return false;
+        }
+
+        public void Preview(IResource res, IEditorService edSvc)
+        {
+
+        }
+
+        public void Preview(IResource res, IEditorService edSvc, string locale)
+        {
+
+        }
+    }
+}

Modified: trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.Designer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.17929
+//     Runtime Version:4.0.30319.18047
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -427,6 +427,16 @@
         /// <summary>
         ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
+        internal static System.Drawing.Bitmap document_search_result {
+            get {
+                object obj = ResourceManager.GetObject("document-search-result", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
         internal static System.Drawing.Bitmap document_task {
             get {
                 object obj = ResourceManager.GetObject("document_task", resourceCulture);

Modified: trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.resx	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Properties/Resources.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -284,15 +284,26 @@
         /ltycf5WuDgTZ9+86lPm38A/lieNoGpgVUMAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="function" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_plotdwf_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABIElEQVQ4T6WTsU4CQRRFdwnE
-        EIkxKBL5BkKjDRQWFljQEwq0pCI2FFT8ABV+gB0dxMrEBAsTowmVxs5f8CvWc/GtWcdZDWGSk3nvvnl3
-        Zmd3gyiKgk0IwjD00UafG4q967Sxr3BMww2cQtXitQx6NM1gL23nWE87wYQFV/81q+4ajBHvHGqJvGum
-        ZdO6vhPUKd6DZj33hc0d03UvU2j6TqCGS1hAyXmEBvmD8X2hvhNcs0i4t95CewK9oVQD7foIA8dA38HS
-        OPvL4ITiC2gONJiHpilW7dwMFH+9hcQYEb9B2bQ+83uiHufSWtKTBnXyZ7j9Yfk7KSCJ1YgNPojFKxzB
-        PhRhF3ZgG/KwBTnIQgbC2KBCcgg6+sHaBpv8yur9BCINtCQt9llRAAAAAElFTkSuQmCC
+        R0lGODlhEAAQAIecAP7+/rW6x9PW48TD1uHg6ba6x////8HBxMTFyMC/wrK+y/r6+v39/cTD173JyMLG
+        0fT09/P09d3d5qGprPX3+MPFxtXW2dLT1vj4+JOjqcXFxujo6OLk5+Dl58TFyba7x8fIy7a6xuDi4+Li
+        4drb3cHG0Onp6cLP29vb3u7w8ODg6LG2utjc4IeSk+Tx6dTr5dLV4urq6palqp2ho6ezwL69vrTBz8TD
+        1ebu9rvI1Lq+vKSvvdzm89XY3r+/wtLV2PX3+dTX3tHQ3Ymbj+Lk6b/KxOvt8PD1+bS5xvz9/aGvvPX3
+        98LOzLa6yJ+suuvr66CsurzKyM7Q0OHf6NHT1uzu8sTGyb3KyMrKztLX5M3L2b2+wdbY3O3u8sTGyODg
+        6cbIyNrb4Le9v8rLzrq+y5GunKvMuNna3eHi5fDx8qayu7u7vpShq/Py9fX19ZKop8LU2Jmps+nq67TN
+        x5eosPn6++/1+bO/zKCsu/T398XR36Goqp+rutbX2r/AwdHe6tPW5O3v787M2sfL1fz8/K22v/X199ze
+        4t3c5rW6xr/Dz/n5+c7Q0cnKzdze5MTGyoaSiJenndPW4o+ul+Df6MDAxL3BzcHDxcvX1Jyws8XD142g
+        lv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAACcACwAAAAAEAAQAAAI8QA5CRwoEJODKHcUMElBcOCCQA5c
+        2OFx4k0GDAMNCRkw4MqLIzj+5NgEaQUnQVoGAACwqMMcM3D0KJDRYganBitXMoBQZFKZTDTwsNlz8wkA
+        AwAYAOAQaQgdJTvUiBGoKacBFQR0TIhTyIYTNwNvACBA4EsYDzU08IEih2AASlO4gNjiBwaYNX0GEioR
+        4MClClIESKKQ5wKZgQWojAEkQoCAJUDONDoQADGAQxayAEBBAkGCEAESDQzAAkAVNF6sPEIgIc0GLKN7
+        dEnwIwAjRBGSmBBgaSCRD0Yq+QjQpE4MRUHaNFzwAEkBTiMGOWrIKSAAOw==
 </value>
   </data>
   <data name="icon_maptip_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -306,25 +317,6 @@
         syYUpEiAFm3BBm3VskULoUFBFHjxXkjBIS9eCilCePDgt/BgDwkHGCjs14ABigIJqkSoMCAAOw==
 </value>
   </data>
-  <data name="layers-stack-arrange-back" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAC20lEQVQ4T4WQa0hTYRjHz5c+
-        RV+iog9dIOmKFGYEfakgiyAkQfqQIeYNK8TEvGDYBbpgUFEjB1oLTGXOtebmdG5q25w7c21ubi53OdvZ
-        dnY7u29uK4Tg7X1XyhCpF36cc3if/+/Pc7DDZa+x4o6pHDVPw1jts0h53fMoCQH/gUSz62EkONuJYxVd
-        FClQJhPuSFbqCmcmNwPdoRk0my/YByVXS1q0oEfiMHWPWuc24+24XS420HwylJGU3jWDdcHJdmmZzBwe
-        Hcdp4Apnw45g2r8RJ50JqKxR6qXQKrMH0qJz1XM5Qa4ZCpioubVvETAlzjhjggjl0zftpKXGEGWH4kcc
-        s/K7NzVWVD4BsLVmrSNmRs0aSxTA5p+wIbsGEUz/UFkjmZ5JRxAGqc4ho8LoTgoOXeYBrKhNUon2ES0E
-        1CZPyif+FgB6MpHVOeMr+dj8K9kXfEsQBqnWfoNC50zwD5RwAXbinrgK7cPX+HAYpIS4H2iIeEZtj6Xy
-        WaJSmSdccwBK3U0snRze8QouCgB2vGWiGu3DUXlwDRGjeEofmF2OpKdMoYTYEIyLFoKxsYVATGmJph6w
-        TQHcFnPd6tXIZy0R3tErMwArbBbVon0+yck5xXLExRJ7gEDrT36e90Xz+WoOJzsGFv1whqx5p1bA55ei
-        ch3AjjUJ69E+jAmbAgbtzDH36oDM+4ur9iZHEPgfppdC6Y4BQxg2+5pZWgODQ0fP3CBI7EjjaAO0DT/m
-        mGZ48z7iw5THxRB4Vt/wKZAPW0aDim4D6BWGwal6PThf43cXXmBVYgdv8+5MLtKDD4eN0o8zTpKDewm2
-        irJvBP4TCjWzpgnRnpuDdRiG7YZsxQoauI1SI815JbT03x/Uy9r7dXhbHugb0Se1Le2tHhLtuMZs3na6
-        qnjL9v0wDw+yvZfahBIjPTKuD7I3A92hmb/NBbnmtYNsyLrzOqvrX6CZrYWll2Bu13oYvvwGlvytQyev
-        aMIAAAAASUVORK5CYII=
-</value>
-  </data>
   <data name="database--plus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -382,6 +374,18 @@
         GETC8uhhg6Fz5zOq2pgREAA7
 </value>
   </data>
+  <data name="icon_invokescript" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIU6AEtypf///9bn92+wPq3D3hExZKq+r3ugdmupO1WHSD14K7fH3Jiymb7M37HMxlmP
+        RFeLTVyTSVuQRY/SS6DfUZjYTl6fN1iORJ6xxny6Qn+og4jHR5vbTzJpMpvbUIjGR3Gad4/RS4nISHvB
+        RIrOSXCzP5/eUaDeUJ7dUJPVTYfKSIbLSIDGRnWPsoLHR2WkOT95LD11Pp3cUJPVTIPCRZ6+rIPDRWak
+        OZfYTnGzQAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAA6ACwAAAAAEAAQ
+        AAAIuAB1CNSBAYDBgwgxDNRhsEGAhxADNACwEMBEARgzYqQ4EEAAhCA5CvRIoKRJAgUWGjgQAwYEDQ4y
+        ohzIQAKCATJEIIhQA+NMHQYkZBgQYAAFChkixPx5AMEJokVRmECgQcDPBB84QC3qYQMEqyl1KKiAY2vR
+        CgoItAibgEaKrSFm2OhQoMACgQdeTICqgsSEGyAW3BVo4MEAoixcrBjwwMBCgQwuWMgxooSFCwweD1yZ
+        QEGCA441BwQAOw==
+</value>
+  </data>
   <data name="database_share" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -441,26 +445,17 @@
         kjRK4GmAAQ01mgxQ1SpWjA8jFuAK4edPhgQNHghQdoDbrxcF/oQbl+HVunjrBgQAOw==
 </value>
   </data>
-  <data name="icon_plotdwf_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="edit-indent" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIecAP7+/rW6x9PW48TD1uHg6ba6x////8HBxMTFyMC/wrK+y/r6+v39/cTD173JyMLG
-        0fT09/P09d3d5qGprPX3+MPFxtXW2dLT1vj4+JOjqcXFxujo6OLk5+Dl58TFyba7x8fIy7a6xuDi4+Li
-        4drb3cHG0Onp6cLP29vb3u7w8ODg6LG2utjc4IeSk+Tx6dTr5dLV4urq6palqp2ho6ezwL69vrTBz8TD
-        1ebu9rvI1Lq+vKSvvdzm89XY3r+/wtLV2PX3+dTX3tHQ3Ymbj+Lk6b/KxOvt8PD1+bS5xvz9/aGvvPX3
-        98LOzLa6yJ+suuvr66CsurzKyM7Q0OHf6NHT1uzu8sTGyb3KyMrKztLX5M3L2b2+wdbY3O3u8sTGyODg
-        6cbIyNrb4Le9v8rLzrq+y5GunKvMuNna3eHi5fDx8qayu7u7vpShq/Py9fX19ZKop8LU2Jmps+nq67TN
-        x5eosPn6++/1+bO/zKCsu/T398XR36Goqp+rutbX2r/AwdHe6tPW5O3v787M2sfL1fz8/K22v/X199ze
-        4t3c5rW6xr/Dz/n5+c7Q0cnKzdze5MTGyoaSiJenndPW4o+ul+Df6MDAxL3BzcHDxcvX1Jyws8XD142g
-        lv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAACcACwAAAAAEAAQAAAI8QA5CRwoEJODKHcUMElBcOCCQA5c
-        2OFx4k0GDAMNCRkw4MqLIzj+5NgEaQUnQVoGAACwqMMcM3D0KJDRYganBitXMoBQZFKZTDTwsNlz8wkA
-        AwAYAOAQaQgdJTvUiBGoKacBFQR0TIhTyIYTNwNvACBA4EsYDzU08IEih2AASlO4gNjiBwaYNX0GEioR
-        4MClClIESKKQ5wKZgQWojAEkQoCAJUDONDoQADGAQxayAEBBAkGCEAESDQzAAkAVNF6sPEIgIc0GLKN7
-        dEnwIwAjRBGSmBBgaSCRD0Yq+QjQpE4MRUHaNFzwAEkBTiMGOWrIKSAAOw==
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABjElEQVQ4T5XTS0sCURQH8OOm
+        rVmL1E0UGhRWJqGGBUapQZE9NpWQSBBtg4i2EkF9iXa10srHFJHUWNGDgmhTqyjaRASt293+Z3AmXyM0
+        8PPO3Hse98oMCSHIYDCwOCQgWbCHcR8OIAVpyIIEW5zDucpPocC/x/IC3LlWV+oNrClcQ6vkHFzR3wEH
+        qMHquLj5TaqFjS+Kxj/+CjQ7Y8Ts7iVlIbb+KSNI6OH1kgL983li3rlTCi8/MXH+8KOL1zlO+w/cMzkC
+        4RhP+z2zOeqLnMn8rIfXuaFWwB5KELyB4PvO8BG1j6YrdIxlyTl1yM2UHWsFbMEUgWgdTvjtoQyKZWR+
+        Lsfz9pBEXRPH1DN9UrwDCUkStY1I1D15w6qen+cL60qctoNGW4RYvdlLjuAutvcqD0TfRTmedwR2yNjk
+        Ib5030ST1UctrpUKJotPSVSv8gIy3sQ8XMAlXME13MId3MMjkp/hpeYO9L6NkvbFR8C9EUnbNbomEWMt
+        sGBsgDrtCFwAzEVBanC1saTAL88kUjz8yRfZAAAAAElFTkSuQmCC
 </value>
   </data>
   <data name="gear--exclamation" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -655,6 +650,13 @@
         TOWYChrHTeUDco2eqWuyNTHhnhChDbMm5RYStRflX/AP4Mv/7H+tMgIAAAAASUVORK5CYII=
 </value>
   </data>
+  <data name="icon_null" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIECANji87HH6f///wAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAACACwAAAAAEAAQ
+        AAAIRAAFCBxIsKDBgwYDKFzIUCHBAAAiSpwY4OHEiwAqDoSIUaJGgRw7ZrQocuTGkiZBovwoIGRHli4x
+        wlz5sKFNhDhzHgwIADs=
+</value>
+  </data>
   <data name="globe--minus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -735,6 +737,20 @@
         A+jKfnCib2Agtm9o6O7/wLN06O4ALt15PeGOvdAAAAAASUVORK5CYII=
 </value>
   </data>
+  <data name="sort-number" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABuElEQVQ4T42TTUsCYRSFJwMJ
+        QWoXCFKEtAhqE/4EN4E7V+nGELUsAyUcUdC9W8Ef4cKtG3+BuJGgtQiCX/iFIn7d7rk5Mg4JCg/nfe89
+        58yIqKiqqiSTyT3S6bSSyWQcTBCKu9GDHBEpyoEChEJsICjjOFiQSCRuuOSZCenZbDa0Xq8JatzBj5y8
+        QTwe97Zare/VakV6lsslaRh38CMnBdFo9HWxWNB8Pj8a+JGTgnA4/IbwdDqlUqlEhUJBznoqlYrMoZjD
+        j5wU+P3+yGw2o/F4LORyud3ZONN28CMnBV6v930ymdBgMBBSqZRovV7fnYvFopy1HfzISYHH4/kYjUbU
+        6/WESCSyO2szaLVapVgsJjv4kZMCt9sdxRPb7TZls1ny+XyiuGvk83kKBAJULpdlBj9yUuByuT77/T7x
+        T3M08CMnBU6n86VWq/10u13qdDo7ms0maejn8MGPnBTY7fZbm80WZL70DIdDajQaBDXu4EdOCviiWCyW
+        Pcxm8x2j4rtCcTd6rFbr359p+zGxnjNXzD3zaDKZnhgVijvzwFwzF8wpcvqCE76fbZeXrLZ/wBxh+PBA
+        KfgFcqFa2BgtJlQAAAAASUVORK5CYII=
+</value>
+  </data>
   <data name="icon_pan" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIUAAAAAALe7woCEiVNYYTtBSuHi5Keqr2hsc9HT1uzt7pSYnHB3g8fJyrG0t////19k
@@ -808,66 +824,83 @@
         AABJRU5ErkJggg==
 </value>
   </data>
-  <data name="icon_clearselect" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="applications_stack" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIZXAAEBAYSChPn6+b2/vvrond3Th9bm63CrvN7Vh6+8mOCnnLK8mnJ+jOzNYuTfi627
-        nIeZk3l+jvX28+LaiamMOSE7NSwuLMfd47SVnNDi6O7sj2ZdZIBoKdfn67TA0O/swv3///vKwd+zDV+y
-        qu3Zh395RpiimK26xaiouLC9xcjd5JRCL7m/0sytJvP19vL09qyuq4GCmd/s7/Lv+s/i6HV+hHk/Odet
-        EXqChdjMhURNV/vok+nljbuRAamDAfz8+6+9os3h5zU7L/n6+ujjjJ6iorS8yOLdisDZ4J+dlnpaWa3B
-        xY53O/nonIiSmbO/yrqAfbTAy914aNuvDUBeXLePAclWRv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABXACwAAAAAEAAQAAAIoACvCBxIcOCTBR8CXFHIcOHAEwl2NChIMcqDJjdaKATAkaPDFEAITKlCQSAA
-        DTwcABDowQQJET2YJNlI5AiClQxYzCjhg8MACSYnFMgBwAgKEEsOCIHxw2FHADowKIAwgkoRARQFxggh
-        ZUUFHEMGKrzSMQIUKzZquKAIQIaBIBY2KHHyouDGDjQurBybFUAGFUhWZnVI1iPhwYgJNlycNSAAOw==
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABc0lEQVQ4T5WSMWvCQBiGv8Ut
+        pZMIxcVMri4ZI4hjBhUdikvpYKmLS5cu/Qv5Bw4OdXCRokYQHKoGETooLhldgw5ZxMm399kkikZJAw+5
+        cHdv7uU5IvdJp9NULBZ9SqWSLHgUVK7AczJFo1E63VwoFMilbJrm0rIsLBZzzGYzTCYmxuMpptM5DON7
+        KdaVz/96+M7lcszrYDBAv99Hp9NBu91Gq9VCs9lEo9FAvV5HJBKpXASIYxEjgl72+z1uwWuu9s7n85+G
+        YaDb7foMh0OsVitst1vsdjtomlY9BITtPRr9oNfrYb1ew3EcZDKZmnfc0L11XYdt29hsNlAU5e0Q8J/e
+        qqp+JRKJDyYejz/zZt93mN7ZbPZdXJ0Hl3vuf9N3UO9UKuXdPwrl+7y36E7JZPIvJIzv896xWIwYSZKI
+        2CU7ZbdB8NxF72MBInbJTtltEJ5vWZZPtx3H7JKdstsgfN9Ed4EJwuWT5/XaW6yputouMn4B8esdOkQY
+        S3EAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="table" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_zoomout_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABzUlEQVQ4T52RzUtiUQDF71ba
-        R7RrGW5aVIQUNVPQYjCIwU2LNg3ZjMwUSViPzGKmmf6oiigcs+zZF5FSFn3iGJbo8yOfnrnnwXskuMkL
-        B8598Dv8uE+4AgGnzGSDcYrPfr8bDR6yYlRRpqpyYCgCDO5X8XGvgg9hHf2hV/QFi+jdycOxraFnK4vu
-        zQy6Nl7Quf4MMmTFiM/3Ta9WjYG1NIyB1ZSOX//KxkDgPg//bc4YUK4zmE88GwNkyIpPXq+nVKlYBl9U
-        DavHKfw8TGJFfcRy5B5L+3dYDN9ACV1j4e8V5oMJkCErhqenvxd03TL4ffyEV3lngmdnVt86OrL6+sEB
-        yJAVQx7Pj1y5bBlwIByPI3R+jsNEAjunp9g+OUFEftuMRrGhquCAwUhWDLjdM5lSqcZAk3eGBmangdk5
-        QIas6J2YmE0Xi3UN1MtLy2AvFqsxIENW9IyPe1OFQo1BRt4ZGpidBmanARmyonNsbC6Zz9c1iFxcWAa7
-        8k3evgEZsqLD5fI9aFqNQVreGRqYnQZmpwEZsqLd6VTucrm6Bhww/wIH3hqQIStaHI6VpHzRm2z2XSFD
-        Vtja2r422e1/GglZIY9Nplmm9Z0hY/sP0fXQjui6fQYAAAAASUVORK5CYII=
+        R0lGODlhEAAQAIZpAJySh3aFlJ6tvO7z9eDPvpubm+ru8LKysqGhoZ2dncvFwOLm6Z+fn+ru8dbc4t/j
+        56ioqNvf5KOjo+bp68rT3Kqqqp6ensnKyufr7tDX38rQ2MPIzre3t62trfL29+7y9brBybjAyMPJzsDK
+        0trf48XL0s3Q0sDBxO3x9Lu8vLy9va62wLm5uf39/ebp7aWlpc3Nzautrs/Pz9Pe49HY39bd4qyyt5+m
+        rtLY3K+vr8nP1NHX3bOzs9PZ4Nvg5czU3K24w83V3crS2uXp7OTo7JycnNDe47e+x+Hl6Ovv8rm7vL7F
+        y6Kkpefq7dff5M/a4M7d48vT3M7W3ujs75+goOTo6/b4+aWmp5qamtXX2NDQ0MrDv7O2uc3S15GSk9Td
+        47rCy7CwsM3e49fZ2qKiora2tqiim/H09t7i5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABpACwAAAAAEAAQAAAIwADTCEyTIwGWAi+0DFyYhoOECxMGGBhzoALDNGU6GBgw4EOSKS5U8GBIxkAL
+        KygaYBiy4MEBGQPDXBjg4YzKKkjQRDBhUSCDiAKCChXgYAeDgQUGEAnAtGkAGlIsDLTQBEeXlj6cfMkQ
+        RAOCgRCy6NhAIkKNGUagUDjBYiCMAyKWlHDQ44mYEUK+LpQQA8QRMD+iULiBIMUWhhCY2FgBJASXBF7M
+        EFDAUAmVIgUSXBEIAMDki6A7fwbNUDTpi50DAgA7
 </value>
   </data>
-  <data name="gear--arrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_copy" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACfklEQVQ4T6WQXUhTcRjG/7Yt
-        GWbozexrI0qRUMPOwG11MbDEmov8uojQZFBIq66kgVERgogglG1hEJRSGdRNihG0TFA7ws6JnX2YmsuW
-        bTq8l8ibt/9zjpZCdNOBH+/L8z7PwzmHERH7H9Swy+Vibreb1dXVsfr6enU2NjY6OK3rODbf4EUGbCmo
-        ra09yo2X+NyLuba2Rqurq7RZg+evBTU1Ncd8Pt/dlZUV8ng817np8tJSmgB2aLjBA++WN6iurmacq8lk
-        kiQpROl0ikZGRuZTqRQB7IlEQr3BA+96RvsEh8PBnE7nvoaGhluRiEKKEqaFhS+0uPhNBTs03OCBFxmb
-        zaYV2O12JxfawMBAfyIej9Hg4LOZ0tLS+wA7NNw2fMj8LhAEwSfLEo2NvaepKZGi0SiVlR3u0ul0DGCH
-        hhs88CLD0d6gpKSkfXJykoLBIGHGYp+ovFzoyMrKYgA7tM0eZDhaQVFRUVVhYeEN4PcHvobDcRoefhe2
-        WituAuzQcKu49lw60nz7JTIcrcBisTCz2bxfEKw9oijT6OgEzc2lKJP5oYIdGm72bilj6/0cs/kXmviH
-        aQUmkwl0iKJCQ0NvaXxcpkDgYTIUipP3sULHe6Sfbn+ETt75SKcDUepLE/GwXNapNKkF+fn54FRlZdVT
-        SZql4uJDvXl5eZ2iGKMT3VN07zuRd5qoOfKHtlmig+0TslqAR6/XM6PR6MrJyenKzs4+gDkzs0wX+0Jk
-        ahlYLmh9FVPnhRfz9g9Eu7yv5d1X3mhvgDyngMN/K7MCg8HQwou6AfYNPfds/3TuuSeRnU2D53mJ9g/4
-        s42zg2Pi7PkX2888eGRw93rWM+wXiN3yhzE1UjYAAAAASUVORK5CYII=
+        R0lGODlhEAAQAIeMAEF1pURzq0Rzqezx9URzp0JyokJxp0F1p0J0p0B0pkN1pkZwoEZ2pERvokd2runz
+        9eDo6sHZ3ebw8ev19ufy+D5xqPv69vr4+0Z3otDi5J/Byvv7+d3p6fD28j93qENwqfj8/fn9/EFzqObu
+        8T90qL3U3MTb4z50o/r5/kBxqd3o6kVzpEVwp9Pk6/z1/PXz+NTh59nn6Pj3/UVyrb3N50J0qT9zo/r7
+        9sDY2OTs77zV2Uhyrvf89ery9aXH0LXS1uPr7qfH0src5srd5ENvrKHGzkRypkN0r0BzorfL1pnDz7bT
+        293r7L7V297o56zK0sne46PD0O3x9EdyqajI06THzerv8+jt8KrP2Ofx8sDS3rPK0J3CyEVyq6fFz6TC
+        zbrV4LnQ2LrT2Eh0ocXY3rDN05/EykJ1rrrR193m7aLCzcTY36LDzENwp8rb46rL0t/p6KrE0eDu78Tc
+        4KHBzMbb3tXj5rLP1z93quvy+EV0rLPQ1sHY3qLEza7G0KrI0ElyqKDCzKC+ycHU2z12rdzn66nD0EVu
+        pER0pNbg6T1xoaHCx////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAACMACwAAAAAEAAQAAAI3AAZCRxIsCAjBwASAGiAAQGLAyQY
+        FBQQYoOMDg8gcMgQoYINgjNuWHgxYYSKFiZKLKBxYmANFAgVMnQIkUEBgQouULSIUSNHjwJFgAg5suTJ
+        lCtbenDxkseALExi1GmChtChMQUIDMiZpweQQkJw/EjyxJASPAYoCJVyxUmiOVr2YKlihg6iFBKWWsmR
+        BgoZMFv8BNEgCNCKD1rlwIGxRseSN3G8fOESQGDaGDDcDApzh0qfIhoCKRKI184QPmLK/PERhY2aRWcE
+        HibSZsqOLgH0HBEQAIkRg8AHBgQAOw==
 </value>
   </data>
-  <data name="icon_zoomselect" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_viewoptions" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIZvAISChAEBAXBJJai7zsfb8Nrn9M/a5Nnm81tgZNDh8sXa77jH16jR4+fu9dDh8brT
-        7erv89jm8uzw9ODq9Ku0vNHh8mRrcvT3+aStttri6oOGiJqbncrc7oaKjZ+fn9Di6JSVl67C1a6yt5u2
-        0F5cWsjd5IiOlM3U2Tg3N398ezAvLujjjKCnr5u83uXq73V5fnh3d+nv9OLaid/s76/N6pyzy9fn65mi
-        rLCurXahzJDO1tfb3+Do8dDg8UdKTb7L2EpMTFhYWZy20K22v6jG5KWqsaq8z+7sj7C/z6amp6C50uLr
-        9evw9aTF52RgX250esjQ2ISAf2xtb7S3u+Tr8WBocMPT43yQo7vU7cbb7+Hr9JGRkt7m7YSFiL7H0cza
-        6IWUo7bBzeqxd6uvs6uoqOLs9c7X31xbXbe/x+fs8evv84SHi8vY5XyPoq7L5wAAAAAAAAAAAAAAAAAA
+        R0lGODlhEAAQAIYAAAAAAP////7+//39/vv8/gkiTxAwYzhfl4KSqYGRqHuNpnyOp32Pp3+QqICRqLfC
+        0WCW0q++zqy8za29zbHAz7TC0LPBz/n7/fj6/Ory+PH2+vX5/ODs9OXv9uzz+PD2+u/1+djo8tvq89rp
+        8tzq897r8+Tv9uPu9efx9+z0+fP4+9bn8djo8d7s9OLu9eXw9uny9+jx9u71+dXn8Nfo8d3s9Nzr89vq
+        8t7s8+Dt9OTw9uPv9efx9uz0+PH3+vX5+9nq8tjp8eLv9dvr8unz9/D3+vP4+u72+fn8/ff7/Pz+/vv9
+        /f3+/qbQrqfQrnS0fKzSsXS1e3W1e6zTsHe2fHm3fXu5fgB3AP7//v///wAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
         AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABvACwAAAAAEAAQAAAIwgABvBFIcOCbgwgTJsQRxUkKMgkFBpj4xsMULz/CFNmiMMCRNxugcEkTg8cX
-        JGsOSlyRRAQENRcaTIjAAQwIhAFkwDghIQMVLQd6KKhxxuBEEi6YsLFSoIKCB0RQKJSyo0GZAgmyMKAh
-        xIfBNwFMjFlywAEBBjqaXHmCcwaaLmYSEMDSIoeSKhSM2njDQsONEG5GtLGAIGGADyXeDOkQRAWQFxgQ
-        CBAjECxFAwuMLDDwZoAAAQpDI/RcsHToAaJTvwkIADs=
+        AABZACwAAAAAEAAQAAAIywCzCBxIsGCWAwgTKlyIEILDhxAhFjhgoKLFixcnBhAwYAkSDD9UiCwiIwWR
+        iViYEECS5IeRDzCPpMjAY6ISj1OuqPAho2ePDCh0TCRwBcqVKj4QJFjqoEEHFxMvWDmqAcSDClgtUBCS
+        YyLIKiR7EEFB9sWJHC0mblChwckVIjxMyN2Ro8aNiSquNLkSBQWDBYAV4CAxYqIGKlekxHgRYYJjCSJG
+        sJgIoscTFB1OcKjBeciIIDQmeoCB+WwJG6iBhFgxY2KB17Bjyw4IADs=
 </value>
   </data>
+  <data name="icon_invokeurl" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIU/AP///0typRExZG+wPtbn963D3maPxcyZALfH3FWHSGupO3ugdqq+r5iymaDfUY/S
+        S1iORF6fN56xxmKWSj14K5jYTqqRCT95LHy6Ql6PT5Gzh4fKSIPCRY/RS2akOShXQp/eUZ7dUIrOSYLH
+        R1V8IHvBRFmPRInISH+og0mCPpfYTp3cUJPVTIDGRojHR1eNRIPDRYjGR0dzh5vbT6DeUHCzP7jOsU+E
+        SVuQRZvbUHGzQIbLSJPVTZq0sWWkOQAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAA/ACwAAAAAEAAQ
+        AAAIugB//JAQoKDBgwUlCAxgoKHDhgAMRBSwEKHFABR/BCDAsaNHjhk3AhhJsmSBjDJQZLiQQYOFAzAP
+        ADj5o0EKBQNWnFAwwYZJAQxwYBgAYIADBxgmvJR5coECGkSLhgChQAPJkwlizIhaNIcLEjBnCqBQQQXX
+        ohUuXBWQgAMPrh1YwLhRoG5THw+ibhDxwMMHAYABMzAxgGiLETsGvOiBoHHjmhAi6ChRIwKEBgIzZ2aw
+        IAGFBAsYaM4cEAA7
+</value>
+  </data>
   <data name="icon_search_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIYAAAAAAP///+np6q+xtc3O0JeboqKlqqSnrKOmq5OXncXJz5SZn7q/xaOnrKSqsMLH
@@ -884,21 +917,6 @@
         LMH9gFm+PAvzgAA7
 </value>
   </data>
-  <data name="databases-relation" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACD0lEQVQ4T42SvW8ScRzGb+B9
-        0oSBl8EAIWGAOLIhgyMkLCxOJgaNbwlDBzGVsz3BPwAxosH42qiHl1LbhuRsKJQ3y3bm0pqI9dQj7VWM
-        k+vj3UktR7DyS57ll3ue3+f73JeIx+PEFDorf3NzkqYxE5FI5LwkSej1euB5HrXaJlZWWlhf5zB1QL/f
-        R7fbBcuyePFyEQ+KJZSYNTVgIpp8r2CrDygE4wH3izRohgUxjsRxXyGKvxCNRi/FYjFCOW63O5RIJN4U
-        CgXk83mQJIlUKgWKokCMIzWaPD4LP9UAn8+n+E9mb2dpTQcb71BerYKtdQ4DDpA2Whx2hIEaoJipbIb+
-        /mMAzQivGNx79BwLi0sgxpFyuRySyWTF6/WemcvconcH+0iTZFUTQDO4+/gJnpWZYQcjSF1uGzuiBDJD
-        0d/29zBLpqsej+fc0R2MIK21O/ggfIEg7eJ6+kZVp9OdCoVCCU0HjTaYSgXL9bfDDkaQ2HYTW8InXEvP
-        qman00n4/f6LmhFKr3HnaREPlxb+3UEwGDxttVoJk8lE2O32GS1BC6XKMsr1yrCDEaTG+01six8RDocv
-        uFwu5TeeMJvNV4xG45xMdCBKr9dTBoOB+rMHI0irHRacwCMQCFy22WxKwDFZdlmOiVI3sXGIVOea4MUt
-        OByOGdlwXF3Fo84Q6y+SPPO8xWKZl7GvKlv8P/9vysUMoJZl8vEAAAAASUVORK5CYII=
-</value>
-  </data>
   <data name="icon_plotdwf" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIe1AP///Vpuov7//f7//////7643ltsoVltoUt+spij2f7+/JGVoZKUo01/s11toLOx
@@ -921,19 +939,18 @@
         PNiyiMHAADJGBVpyAIyEGowqtKoz0NOfD1xiHRCjKswPV0MazgiyykCtJKUwNawVEAA7
 </value>
   </data>
-  <data name="icon_zoomprev_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="layer" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIZpAK2km+XXyfX29+Xn6ZWdqJScqNPa4JqirsHCwq6vsLm+xNfY2dfZ29vg5cTGx6Oq
-        tMbJzZObpq2trJWcqqSkpcPJ0J2ksODj5ZKapszNzc/Pz87Q0vL197u8vezt7rW2tru7u7GztaiuuLe5
-        upWcqZScqefp6u/y9ZWdqb69veLp78LHy9ni6tfd4snLz5aWltbW1tbX2NLS0pafrMC/v9fZ3c7T2MzQ
-        1K2trfr7+8PExcLHzMXQ2vX2+MTJ0Ofn6N3g45WdqqSkpOHk5+fs8aurq+jt8fT19tTT0+jq7JOcqbm/
-        yLe9wrq1sOvv86CosqertsfKzb3Byc7R1fP09Z6ksLi9w6qwuP///5ubm9Xb4bCvr8nKytHU19rb3Pb3
-        +KOrtPDy9Nri6amvt8LDxPP19rO1ttPZ3+7w8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABpACwAAAAAEAAQAAAIqgDTCIRBY0sKJFOidBHIUKAGLxeGAHmipAqUMQ3TZBgQ5ogAC0GWkEljxQVD
-        GQsEYMlRIYIIIxC4pGHCEISJL2jKHMBgg8gZHGl8MJRA5QeYEgRmtFAhJkvGDx561EBBYsKBKwYoZHQQ
-        g8OJBwUKKGCxY0TGNAiSOBlAQAoPLSEYnEW7ocENAyvMJJgrUEeRF0I6pEkAIADfswAKH86Y2PBiho0f
-        Q24iOWNAADs=
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABwElEQVQ4T6XS6ytDcRzH8e8z
+        yTMkUUpJLsntP/AP8ERJuSV3kdwe+QvkkrtaybXUMcPmNilmdjEP7IHNZbScmWNnmLtH8/sclvFAR1av
+        zvme832fXRr5/X76D8pu10Ick8sUyoRdNERZbeuQZzrxrlz73iyC79X8G+xgFw1aymxdgyLh7nXP6XnS
+        yoFdNGgpo2UVit23L4Zz4XFNDuyiQUvpzStQ6vI+60/dD8tyYBcNWkpr0kAZ++g6G3+vDnbgvFPq7eKE
+        1no1pN6/7J03851gPPHOoEFLqY1LUH4mPG1Znb4F2D+75Vg0OmfiuznjRZfE8EVn80yhQUspDYtQcex+
+        2GShcvvQMzlvdvVxBr6XM0p6pCPmj2s9Ops4gwYtJdWroOqQv9/YsArj7F0H5ozf9LM5QLrHHjCLBi0l
+        1iqhxuK40ShN/Agz/AnnwTOuS7PO7uHQoKWEag7q9EeiSmV2KQLY11AA5p/nO3ZRhQYtxVfMQgP7ZTUL
+        FteYZO/zGJiDj+wedtGgpZDoZIotmayc3nKssr/o8u6RqP4NdrCLBi1e4WFpuTkR+YNNkQWKDjmwiwYt
+        HhDKRDExf4Qm9B0h5nPvHST9+wAAAABJRU5ErkJggg==
 </value>
   </data>
   <data name="sql-join" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -1123,21 +1140,6 @@
         QoSYcOLEgxYtFsyY8SHHjh8/OhxJsqRJkwEBADs=
 </value>
   </data>
-  <data name="script--arrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACA0lEQVQ4T43TT0iTYRzA8d/o
-        DylIsEOUOyS85qGZhxXULsGG0kCrQ60uG3aIZ7iNZIZ/VuhFbSQIug5dUrpK4KGIIII0iQi3WtFCR6XD
-        3jne+Ta3uSG67dfvCZ7q9ODhA+/h9+X9Pc/LCx39/cBdCgbh6tCQlbC9ujI4WP8n5i4ODFhfLi4+q1Sr
-        WK5UpPKl0satyck79NLjcCEQEFihXMZMoSCV29nB8OzsY0dPTyN/MZzv6hKYurWFy+m0FJ+hhtn8fmjt
-        7gY409kpsGQ+j19UVYrPUMNEByedToGt0fpfUykpPkMNEx00tLcL7Cett0RHkOEz1DDRwRG7XWDrxSJ+
-        0zQpPkMNEx3UWa0Cy5RKmNR1KT5DDRMdHLRYBPZrextTm5tSw3M6Kp7x6Yab98HkHgYwNDcLnjx94w26
-        JBn3jIqnxz4mzz744WoJfQaApibBV9zdxRyt+L+7T1fQObX817XpBD5UESmOnBqNuQBMJgBF4QJaLofp
-        bBY1OkaGnnXapiMcxfAaojeO6P70z+0lRCW4EAEwGnlsvuzzPXkVjeJ8LIbv4nH8kEhgfHUVPY/eo21k
-        Du2j89h67w22hRbw3FvEo97nkWP+Fy4wGI1ms8Mxoel6tko/khQinvDOFOquT32vtfd56AIOgaGmpmWf
-        ooT26oCt9/V+y40+iunscPg3qfGIS2EPRjUAAAAASUVORK5CYII=
-</value>
-  </data>
   <data name="magnifier" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -1221,24 +1223,6 @@
         1EDgYYYIIjMDlMlygoEMJ00gGCnw4AKFBajZNDgQoQKCMEJsuDhgQY1ChWgOkFmjMCAAOw==
 </value>
   </data>
-  <data name="cross-circle-frame" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACw0lEQVQ4T22SXUhTYRjHXxI5
-        LG+UmWNSiAoLvFBJRZhswZHZUNyHU7tRU7ILZXThbpwM+7gQL6OMWiLTE4gfS01DJDJnq6a1dtxaR3Nz
-        ExVZBl504+XT+7wcQaMHfjsPz/P/vTsvHGI2m4nFYiENDQ3EZrORxsbGS01NTXoK1m0Z7PW4wwxm0UGX
-        /cgHcHSpczgcvWtra5GjoyM4PDxkYB8IBCI9PT29mKEHcP8ewFmt1nqPxzOGwveJCfjscMAyzzOwj9DZ
-        wcE+jIyMjGGWHsCxNzCZTMh1uhCSySSsdnSAaDTCL/r8093NSLW3Q6imhu3i8Ri43W4BHXRJXV2dym63
-        u3Z3k/CurRV+2myAlWhuPgfOfphMLLO1tQVdXV0udInRaORXVt5HPw6/gC/V1Uw+rW8GAyBny6/Tgd/9
-        HBYW5qPoEoPB0IKvtdjZCZLZDNOFhSx/cnICqVQKEokExGIx2NnZgeGsLFgsLmbZYPAroEt4nreLogiv
-        KiogUlsLSzQwqlRCKBSCcDgMkiTRe8fBQ2WBMpOXx7J+vx/QJXq9/m4wGITJsjJYr6qCmexs8NLgWXlv
-        b4/NkNdqNcv6fD5Al2i12g5R3ICZtluwWlQES/+RT78F3L1RqVjW5/sA6JLKysobU1PezbePn8JcQcG5
-        f56jAoIf0vHxMWM6NxeWHg2BxyNsokvKy8vVVqttIBSKwqTJAkJODrvzIhU3ZLBHWaDXw8z6+gZYLNYB
-        dElpaSkpKSkx9vc/9IbDMXhZWw9DmZnwiUpRGexxhjtR3AaX64EXHXSJSqUi+fn5Co1G0+J03p+VpANY
-        fjYKws1WGFTnMrDHmSTtg9N5bxaz6KCLdYFykeO4y0qlslWr1T0ZH5+Pb2//hrPgDHeYodkr6MguSaON
-        kqKhXEtPT+cVCsWdjIyMPsqgTB/OcIcZylXZSfsLjyUbBUyIGBQAAAAASUVORK5CYII=
-</value>
-  </data>
   <data name="icon_restorecenter_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIUtAKq7y5+svcbS2MPQ1tTc4MvW29DZ3sTR17nH0tDZ3crV2tLa38fT2dHa3snU2tPb
@@ -1278,38 +1262,23 @@
         AEiwtKnDqQGYTmSZ1epEAFq3cggrVmFAADs=
 </value>
   </data>
-  <data name="applications_stack" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="gear--plus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABc0lEQVQ4T5WSMWvCQBiGv8Ut
-        pZMIxcVMri4ZI4hjBhUdikvpYKmLS5cu/Qv5Bw4OdXCRokYQHKoGETooLhldgw5ZxMm399kkikZJAw+5
-        cHdv7uU5IvdJp9NULBZ9SqWSLHgUVK7AczJFo1E63VwoFMilbJrm0rIsLBZzzGYzTCYmxuMpptM5DON7
-        KdaVz/96+M7lcszrYDBAv99Hp9NBu91Gq9VCs9lEo9FAvV5HJBKpXASIYxEjgl72+z1uwWuu9s7n85+G
-        YaDb7foMh0OsVitst1vsdjtomlY9BITtPRr9oNfrYb1ew3EcZDKZmnfc0L11XYdt29hsNlAU5e0Q8J/e
-        qqp+JRKJDyYejz/zZt93mN7ZbPZdXJ0Hl3vuf9N3UO9UKuXdPwrl+7y36E7JZPIvJIzv896xWIwYSZKI
-        2CU7ZbdB8NxF72MBInbJTtltEJ5vWZZPtx3H7JKdstsgfN9Ed4EJwuWT5/XaW6yputouMn4B8esdOkQY
-        S3EAAAAASUVORK5CYII=
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACeklEQVQ4T6WQUUhTURzGz9zm
+        GNMxJSasHFEbKzZDNmhbESNLRnMPc9pzDCKR6ikaFC1EKBEsCvWhslBovtSL4lNmgskV3IVtbrikpWts
+        Tgx6k9CXf+e7d4VGPXXhx/nz/b/v29lhRMT+BykcCARYMBhknZ2dLBwOS2d3d7eX01PFu38HLzLgQEEo
+        FDrDjb38PIxzb2+PdnZ2aL8Gz18LOjo6zkaj0Sfb29sUiUTuctP1zc0yAczQsIMH3gM38Pv9jHOzUChQ
+        IrFM5XKJZmZmPpdKJQKY8/m8tIMH3mpG/gter5f5fL4jXV1d99PpFKVSSVpf/0LF4lcJzNCwgwdeZNxu
+        t1zg8Xh8XLgFJibG89lshiYn4zmHwzEKMEPD7pcPmd8FTqczKooJmp//QEtLAq2srFBLy6kBpVLJAGZo
+        2MEDLzIc+QZ2u/3O4uIizc7OEs5MZpVaW539CoWCAczQ9nuQ4cgFVqu13WKx3APDwyMbyWSWpqffJ12u
+        0zGAGdqFt6Fd1fOmcn3MlECGIxeYzWbW3Nx81Ol0DQmCSHNzH2ltrURbWz8kMEM78cZLV7/fJsX4oYy2
+        z8jYy0a5wGg0gn5BSNHU1DtaWBBpZORFYXk5S+BiPLxri7vJMuGiy9+ukfJx4yYPi2ys8ZlU0NDQAC61
+        tbW/TiQ+kc128qnBYHggCBkCNQ8NlfOVMP0JGzWIUgE+lUrFtFptQKfTDWg0mmM4c7kKf9AiqSL1ScWg
+        PqOI6SuO4jliQ3pR4pFevgHynCYOf1bmAmq1+govGgSYJT2mWzVt2In11aXZcf6LQ3r5DfhXw6nj8Jdh
+        pn/SW/uK9ajT7EbtWDXDfgLZQt8vMfwSKAAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="icon_ctxarrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        R0lGODlhBAAIAIcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/////
-        /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm
-        mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD/
-        /zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZ
-        MzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA
-        mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ
-        /2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkz
-        M5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM
-        mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz
-        /8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/
-        M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m
-        mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP//
-        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQAAAAAACwAAAAABAAIAAAIFAABPBgIQOCDggIRKlR40KDBBwEB
-        ADs=
-</value>
-  </data>
   <data name="icon_selectpolygon_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIMLAM3Jzs6lqZ+svcTM083Cx828wdbcyMvSxsTEy8LKxM3DxwAAAAAAAAAAAAAAAAAA
@@ -1334,26 +1303,19 @@
         rkJggg==
 </value>
   </data>
-  <data name="icon_copy" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_zoom_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIeMAEF1pURzq0Rzqezx9URzp0JyokJxp0F1p0J0p0B0pkN1pkZwoEZ2pERvokd2runz
-        9eDo6sHZ3ebw8ev19ufy+D5xqPv69vr4+0Z3otDi5J/Byvv7+d3p6fD28j93qENwqfj8/fn9/EFzqObu
-        8T90qL3U3MTb4z50o/r5/kBxqd3o6kVzpEVwp9Pk6/z1/PXz+NTh59nn6Pj3/UVyrb3N50J0qT9zo/r7
-        9sDY2OTs77zV2Uhyrvf89ery9aXH0LXS1uPr7qfH0src5srd5ENvrKHGzkRypkN0r0BzorfL1pnDz7bT
-        293r7L7V297o56zK0sne46PD0O3x9EdyqajI06THzerv8+jt8KrP2Ofx8sDS3rPK0J3CyEVyq6fFz6TC
-        zbrV4LnQ2LrT2Eh0ocXY3rDN05/EykJ1rrrR193m7aLCzcTY36LDzENwp8rb46rL0t/p6KrE0eDu78Tc
-        4KHBzMbb3tXj5rLP1z93quvy+EV0rLPQ1sHY3qLEza7G0KrI0ElyqKDCzKC+ycHU2z12rdzn66nD0EVu
-        pER0pNbg6T1xoaHCx////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        R0lGODlhEAAQAIZfAHaFlJ2Sh9HW3Ojt8uDPvuPp79Tg5fP19uzw9O3x9OLo7t3l7PP1956foLa2t52d
+        nZ2dnM/R0tPU1ZKSk6SmqPX2987P0NHT1vDz9eDl6b29veTn6dzg5KqsreTo7KKkpsbZ26enqNba3e/y
+        9b+/wJubm7zEy4eHh7rH09Lc5tbY2tfg6M/OzvHz9sXHysvMzsrKypKTk9vd4LGwsKymoP///4KCgra8
+        wvDy87q7vdTZ3cvO0MvT28XFxeDj5a2trczT2+zw8+jp6uPl5tTd5uTo683V3Le4ucjKzLa8wcLDw7q/
+        w/T2983X4evt76GgoOTq7/n6+u/x9K2vsNjh6dTa4LSzs8vR2fHz9ba3uO3v8c/S1PH09szLy/L09QAA
         AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAACMACwAAAAAEAAQAAAI3AAZCRxIsCAjBwASAGiAAQGLAyQY
-        FBQQYoOMDg8gcMgQoYINgjNuWHgxYYSKFiZKLKBxYmANFAgVMnQIkUEBgQouULSIUSNHjwJFgAg5suTJ
-        lCtbenDxkseALExi1GmChtChMQUIDMiZpweQQkJw/EjyxJASPAYoCJVyxUmiOVr2YKlihg6iFBKWWsmR
-        BgoZMFv8BNEgCNCKD1rlwIGxRseSN3G8fOESQGDaGDDcDApzh0qfIhoCKRKI184QPmLK/PERhY2aRWcE
-        HibSZsqOLgH0HBEQAIkRg8AHBgQAOw==
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABfACwAAAAAEAAQAAAIqwC/CGRh5cmMLgITAkj4pYcEGRxEvNDAcKFAJT60eDkgxYOOLF8AiBQJI8KB
+        GlEYjAgCZQkJgRZ/DKngBAsGBAMUXHkAUyAEHEyKZEiQcwGREwy/hBDCgAvRAgaoAJlgYiSAHBZa4IQK
+        IsWNDklVONgwoMCCJiiMfNiS9AsSBy6qrOCRhEKDtgIvHClhI8aUHQ0CEMDbVkAAwYSTGkacOOHiwY0F
+        GqYR2bHAgAA7
 </value>
   </data>
   <data name="image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -1386,6 +1348,17 @@
         bZidsgs0CWg2ms3j1U1Nz/SoctZ+N7iMEcP1w9/YIUw7Q/B728HeTjIAAAAASUVORK5CYII=
 </value>
   </data>
+  <data name="function" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABIElEQVQ4T6WTsU4CQRRFdwnE
+        EIkxKBL5BkKjDRQWFljQEwq0pCI2FFT8ABV+gB0dxMrEBAsTowmVxs5f8CvWc/GtWcdZDWGSk3nvvnl3
+        Zmd3gyiKgk0IwjD00UafG4q967Sxr3BMww2cQtXitQx6NM1gL23nWE87wYQFV/81q+4ajBHvHGqJvGum
+        ZdO6vhPUKd6DZj33hc0d03UvU2j6TqCGS1hAyXmEBvmD8X2hvhNcs0i4t95CewK9oVQD7foIA8dA38HS
+        OPvL4ITiC2gONJiHpilW7dwMFH+9hcQYEb9B2bQ+83uiHufSWtKTBnXyZ7j9Yfk7KSCJ1YgNPojFKxzB
+        PhRhF3ZgG/KwBTnIQgbC2KBCcgg6+sHaBpv8yur9BCINtCQt9llRAAAAAElFTkSuQmCC
+</value>
+  </data>
   <data name="folder--minus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -1408,23 +1381,6 @@
         i0cNoEYYMDExVVCCR2OBGrFASUYaHHkBAGwz1S9OnHZ7AAAAAElFTkSuQmCC
 </value>
   </data>
-  <data name="gear--pencil" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACkElEQVQ4T6WPUUjTURTG799N
-        zNnD9GGJpcRQJOZMNtCtGTPNxG0POn3oLUYPUREEwcCsMCmEiMpcTxW6UiNWgTYLNNNs/MVttOlGJi1b
-        son4nA58Od3vvyUTeuvCj3P4zne+ey8jIvY/SMsWi4XZbDbW3t7O7Ha7VDs7O42ccxmM2TN4sQP2BLS1
-        tR3jxvO8HkTd2dmhra0tytbg+WeA1Wo1OZ3OB5ubm+RwOK5y08X19SQB9NAwgwfePS9oaWlhnEvxeJwC
-        AT8lkwnyer3fE4kEAfSxWEyawQNvZif9BaPRyMxm86GOjo4bi4thCodDtLr6g9bWfkmgh4YZPPBiZ0EQ
-        0gEGg8HMhSvA7R6KRaMRGh0dWa6qqnoE0EPD7K8PO7sBOp3OGQwGaGbmI83Pi7S0tERabXWfTCZjAD00
-        zOD5MjRIMwpFVBSEBukFGo2my+fz0dTUFKFGIl+ppkbXK/AnAvTQMPN4POTu7ibq6aExQfgkBVRUVDSX
-        l5dfAwMDrp+hUJTGxz+E9Pra6wC9pHlubptMJm8qlaKmkpJXg4ydkgLKyspYaWnpYZ1Of1cUgzQ9/ZlW
-        VhK0sZGSQD/93kXvRo5Tar2L1Gr1vaKiouonjB8EqFQq0CuKYRobm6S5uSC5XI/jfn+UwMSbO9sTw/XS
-        sru/lmprlM94ADutUKQDCgsLQWtjY/NwIPCNKiuP9CuVytuiGKHZyafk6pHHsPz8oYFO1he/hjezkw7A
-        kcvlLD8/31JQUNCXl5enRg0t+GjyZZN08/0uYb7u6L4X8MC7ezIBUA5wNBw9yM3NPeNolfno9wrdupyz
-        fKKOXcjMtLwW404pJBOQw9v9HBWnJAs6axXe2hsEW5aGi+DFDvsDd0bcBZIplukAAAAASUVORK5CYII=
-</value>
-  </data>
   <data name="icon_zoomselect_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIZYAMDAwICAgK2km+vv8+/y9fb3+Ofs8fL19/X29/X2+K6vsNPa4MHCwtrl6ejt8sLH
@@ -1479,23 +1435,19 @@
         4TljhiHBBg7Q6Natx1AeNBkFphlOfI+hNMEPqVm+fA3zgAA7
 </value>
   </data>
-  <data name="icon_popupscrolldown" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_zoomprev_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/////
-        /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm
-        mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD/
-        /zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZ
-        MzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA
-        mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ
-        /2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkz
-        M5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM
-        mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz
-        /8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/
-        M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m
-        mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP//
-        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQAAAAAACwAAAAAEAAQAAAIMQAfCBxIsKDBgwgTKlzIUOCPhxAj
-        SvzxYKJFig4vQiyoESNHiwknLozY8GHDkygbBgQAOw==
+        R0lGODlhEAAQAIZpAK2km+XXyfX29+Xn6ZWdqJScqNPa4JqirsHCwq6vsLm+xNfY2dfZ29vg5cTGx6Oq
+        tMbJzZObpq2trJWcqqSkpcPJ0J2ksODj5ZKapszNzc/Pz87Q0vL197u8vezt7rW2tru7u7GztaiuuLe5
+        upWcqZScqefp6u/y9ZWdqb69veLp78LHy9ni6tfd4snLz5aWltbW1tbX2NLS0pafrMC/v9fZ3c7T2MzQ
+        1K2trfr7+8PExcLHzMXQ2vX2+MTJ0Ofn6N3g45WdqqSkpOHk5+fs8aurq+jt8fT19tTT0+jq7JOcqbm/
+        yLe9wrq1sOvv86CosqertsfKzb3Byc7R1fP09Z6ksLi9w6qwuP///5ubm9Xb4bCvr8nKytHU19rb3Pb3
+        +KOrtPDy9Nri6amvt8LDxPP19rO1ttPZ3+7w8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABpACwAAAAAEAAQAAAIqgDTCIRBY0sKJFOidBHIUKAGLxeGAHmipAqUMQ3TZBgQ5ogAC0GWkEljxQVD
+        GQsEYMlRIYIIIxC4pGHCEISJL2jKHMBgg8gZHGl8MJRA5QeYEgRmtFAhJkvGDx561EBBYsKBKwYoZHQQ
+        g8OJBwUKKGCxY0TGNAiSOBlAQAoPLSEYnEW7ocENAyvMJJgrUEeRF0I6pEkAIADfswAKH86Y2PBiho0f
+        Q24iOWNAADs=
 </value>
   </data>
   <data name="scissors-blue" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -1514,6 +1466,24 @@
         ooW1fN/DWMlYznAuYQXPVYw1XV4XCn4Cnzlvq0a0CiQAAAAASUVORK5CYII=
 </value>
   </data>
+  <data name="icon_zoomselect" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIZvAISChAEBAXBJJai7zsfb8Nrn9M/a5Nnm81tgZNDh8sXa77jH16jR4+fu9dDh8brT
+        7erv89jm8uzw9ODq9Ku0vNHh8mRrcvT3+aStttri6oOGiJqbncrc7oaKjZ+fn9Di6JSVl67C1a6yt5u2
+        0F5cWsjd5IiOlM3U2Tg3N398ezAvLujjjKCnr5u83uXq73V5fnh3d+nv9OLaid/s76/N6pyzy9fn65mi
+        rLCurXahzJDO1tfb3+Do8dDg8UdKTb7L2EpMTFhYWZy20K22v6jG5KWqsaq8z+7sj7C/z6amp6C50uLr
+        9evw9aTF52RgX250esjQ2ISAf2xtb7S3u+Tr8WBocMPT43yQo7vU7cbb7+Hr9JGRkt7m7YSFiL7H0cza
+        6IWUo7bBzeqxd6uvs6uoqOLs9c7X31xbXbe/x+fs8evv84SHi8vY5XyPoq7L5wAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABvACwAAAAAEAAQAAAIwgABvBFIcOCbgwgTJsQRxUkKMgkFBpj4xsMULz/CFNmiMMCRNxugcEkTg8cX
+        JGsOSlyRRAQENRcaTIjAAQwIhAFkwDghIQMVLQd6KKhxxuBEEi6YsLFSoIKCB0RQKJSyo0GZAgmyMKAh
+        xIfBNwFMjFlywAEBBjqaXHmCcwaaLmYSEMDSIoeSKhSM2njDQsONEG5GtLGAIGGADyXeDOkQRAWQFxgQ
+        CBAjECxFAwuMLDDwZoAAAQpDI/RcsHToAaJTvwkIADs=
+</value>
+  </data>
+  <data name="arrow-split" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-split.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="sql-join-right" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -1533,6 +1503,22 @@
         kqwM0gsAucRqK8NQIioAAAAASUVORK5CYII=
 </value>
   </data>
+  <data name="drive-download" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACTklEQVQ4T42OXWhSYRjHH4KK
+        iBNkX9AHWx9QeaQuDpTsZgu7CsRJGjIcqyAFiY0xhm7RFqxTdLPoqtjCm+jCPsCwUhtL86O0nRo2zZy5
+        tXWR3qztYuUkfHqfsSOOsdWRHzz+n9//4YV6ZwFWQXB+xwYxUW5ge2E1D47d/FTh+K0xqLs7LWO79/XP
+        9Y7AvMgym5yTU92B2s5AhQOOEBy9NgJCf4Z4fCe1kLJ6ZlJsfkQZ7cip7qw4cKg7CoevxoDv+yj1vZ/D
+        M4NfkGbKaLfmgf32N7eZ4FtCsoVmUHV/Atl/Sc7JWfaCvW2vQGZPq9988Eoo1Z4o4SVpAQXfPG5zzWH9
+        8C80RH9jjSOYJKe6UylTuPuyFxQXn5p3tfuT2pEybveWcd2zMqqCZdzR5kvSjpxlB060iECcPH8Djlic
+        sPXCE9hsemDeYnUn66KItcOInMWdpIx25JAr90Cn0y2i1+vBaDTCaZMN9p3rh/WNg+aNLa6xDQyaKaMd
+        OeTKvRUHSCBOnbUA39hZQ9As52sd4AwGQxPD+g+a2Au4ygu0Wi0s0RwOh8cTiQTG4zEMBl+j1/sSPR4P
+        4znDzwigy/VinPnNcg8EQQCNRkO0lkolLBaLODv7E/P5Hzg19Q1zuRxjgjGNkpTGTCaP5FKHuosfz/Og
+        Vqs7CoUCut1uFEURe3t7sKvLgXY70cMQ0cJ+sVgayaWO/G1iw06lUtnNnjuZzWYxnf6Mo6MfmPwOI5EI
+        I8qI49DQWxwYeDhJLnUY1AUFQ8VxnEmhUIj/A7nUoe5fouy03kA6Jw4AAAAASUVORK5CYII=
+</value>
+  </data>
   <data name="cross-script" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -1575,6 +1561,13 @@
         QmCC
 </value>
   </data>
+  <data name="icon_print_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIIAAJmZmdra2rS2uLe5u7W1vbq6uv///wAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        BwAGACwAAAAAEAAQAAAIYgANCBQAoKBBAAUEKhQIIIDDhwEKJFxooCFEhwUiUrR4MaNGhRcfShwpcMDB
+        ggMuAmAYkqPDlQRbCoAIwKTLlwgfFsR58KXOmyp/hqT586TRokAN6rTZEsDMggJKGh1A0UBAADs=
+</value>
+  </data>
   <data name="icon_maptip" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIU/APT19/Dx89HV3PX292tpdYuKld3g5N3g5by9xdnc4c7S2dXY3snO1sbHzJGQmdXY
@@ -1623,21 +1616,6 @@
         HJIr03vAAAAAAElFTkSuQmCC
 </value>
   </data>
-  <data name="icon_zoomout_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        R0lGODlhEAAQAIZpAJySh3aFlJ6tvO7z9eDPvpubm+ru8LKysqGhoZ2dncvFwOLm6Z+fn+ru8dbc4t/j
-        56ioqNvf5KOjo+bp68rT3Kqqqp6ensnKyufr7tDX38rQ2MPIzre3t62trfL29+7y9brBybjAyMPJzsDK
-        0trf48XL0s3Q0sDBxO3x9Lu8vLy9va62wLm5uf39/ebp7aWlpc3Nzautrs/Pz9Pe49HY39bd4qyyt5+m
-        rtLY3K+vr8nP1NHX3bOzs9PZ4Nvg5czU3K24w83V3crS2uXp7OTo7JycnNDe47e+x+Hl6Ovv8rm7vL7F
-        y6Kkpefq7dff5M/a4M7d48vT3M7W3ujs75+goOTo6/b4+aWmp5qamtXX2NDQ0MrDv7O2uc3S15GSk9Td
-        47rCy7CwsM3e49fZ2qKiora2tqiim/H09t7i5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABpACwAAAAAEAAQAAAIwADTCEyTIwGWAi+0DFyYhoOECxMGGBhzoALDNGU6GBgw4EOSKS5U8GBIxkAL
-        KygaYBiy4MEBGQPDXBjg4YzKKkjQRDBhUSCDiAKCChXgYAeDgQUGEAnAtGkAGlIsDLTQBEeXlj6cfMkQ
-        RAOCgRCy6NhAIkKNGUagUDjBYiCMAyKWlHDQ44mYEUK+LpQQA8QRMD+iULiBIMUWhhCY2FgBJASXBF7M
-        EFDAUAmVIgUSXBEIAMDki6A7fwbNUDTpi50DAgA7
-</value>
-  </data>
   <data name="icon_pandown_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIZuAJumsOTY2MS5uK+2vcW5uJumstrOzsi9vOHV1eHU1ZunsuXZ2dve4d7S0aaxvuTX
@@ -1737,6 +1715,9 @@
         HE7cl2HkyZUtSx6QWfOXzpZnsAkIADs=
 </value>
   </data>
+  <data name="magnifier-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\magnifier-left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="icon_zoomout" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIZ6AG1LJgE0ZkV2qN7s9bK8xuqvdtfk7LOcjH+AgLrK25i1019fX6OmqdDc41lZWV1d
@@ -1769,6 +1750,35 @@
         BRw2EpGNiOwf0IdolyPBL48SEnGn6e/kAAAAAElFTkSuQmCC
 </value>
   </data>
+  <data name="icon_tasks_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIQAAAAAAP////39/vz8/fv7/Pr6+/n5+vj4+fb2936EjuDi5YyTnM7T2bG3vvf4+fb3
+        +PX29/T19vP09fb4+PT29v3+/vz9/fr7+/n6+vj5+ff4+P7+/v39/fz8/Pv7+////yH/C05FVFNDQVBF
+        Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIogA/CBxIsKDABggTKlR4kEGDDBAzNGBAkWKCgwsaKNio
+        YIHHjxc/NAjQYMOGChw6dCDQ4IKBkCNLLrzQAEMGmBsaoByw8kKBhzcP5uSgsACGhxpgCmigkoCHCzYb
+        aJgAk2iHhRInPIBpoYHTAgYyHHDQ4AEEmFdpIjwwtQEECjBZGoU49UEDChFgelioMELeg2AhOpiA4K1f
+        CTATKF7MePGHgAA7
+</value>
+  </data>
+  <data name="map--plus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAC6klEQVQ4T53Rf0zUdRzH8fdq
+        1srNWv2R6eZy8x9Hg9babKRTNmd/FG5l9Idbru2Cw8PjBII7EfAHKjI8ZcJR14DidjQOhniB2ImAml2C
+        h07lPH+gB3IHIpMyTpCJPP186s/Wan63xz7/vJ7f7fv9SMqOHclK2jNI/qyoSGRDYaGRZ3h0p4h8kp+f
+        PqdeUH+2gJbevZztryQ4UE9g4ATuK/3s6YlgOxMlyxfF3BrFdCSK3utOEVlvtZpm5+b4viuPjgE7PREn
+        vSEnE9NdXJ28TsNojCJ/lOIgFATA5I2i97pTRD7KycmYefIEpy+LttA+um6X47tg5+7kUcan/Jz7fYiy
+        82FKb8DOy7CldRi9150i8qHFYp6enaWyNYPvTmTjOpWPt6+E7kvlXL7moud6Ow2hELv9g+R1D2E5PoTe
+        604RWZuRkRl7/JhDzek0BLbj7S/GfXo7vw1/S3jCw/2pTjqDnXhG/8R+a47sjkH0XneKyBqjceuDmRns
+        P6bh9ltpvFBIdUcuJ28dom+khpEHLfSFmtSnDFIzPIOtO4ze604RWWkwZE88esTBWiN1p3Op77FRdczC
+        sWv7ORU+TPCei0B/DcOxAL7xMXaeuYne604ReX/Tppzx6WnKq0yU/ZDKgYZUHO1mvmnfSu1JG42/7MYf
+        rCJwpY6PfZ+z5GgiX/ZmoTtF5L2NG3PHpqaoLDfj9tqo6/yaA55UPH0FeIN71NUe5Mive4n80UxC2wq+
+        mshVZxK6W1ywQuSdlBTryMOHOMoseBoLcbXlsd9twH3OStPFInW1JSQ1riSuOZ6ElndJGU8jvmU18xxv
+        RqT6NacsT07Oj8RiOEozqSjLxF6RTmmNgdJ6A/YmIxU/mXmrehlJo5/+gzheDcjCxMRdY+qv3pmc/Fdf
+        /LyF+LoP/vL2nVUkuFbxfPHrI2Jf4JSXli7dPD8uruT/eG7bK6OLwnHoU3ey7kXRz8vKG8qi/7T5hVpJ
+        m3dJTOr8u5Onl817ThS42NsAAAAASUVORK5CYII=
+</value>
+  </data>
   <data name="icon_popupscrollup" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/////
@@ -1788,21 +1798,6 @@
         QoSYcOLEgxYtFsyY8SHHjh8/OhxJsqRJkwEBADs=
 </value>
   </data>
-  <data name="icon_viewoptions" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        R0lGODlhEAAQAIYAAAAAAP////7+//39/vv8/gkiTxAwYzhfl4KSqYGRqHuNpnyOp32Pp3+QqICRqLfC
-        0WCW0q++zqy8za29zbHAz7TC0LPBz/n7/fj6/Ory+PH2+vX5/ODs9OXv9uzz+PD2+u/1+djo8tvq89rp
-        8tzq897r8+Tv9uPu9efx9+z0+fP4+9bn8djo8d7s9OLu9eXw9uny9+jx9u71+dXn8Nfo8d3s9Nzr89vq
-        8t7s8+Dt9OTw9uPv9efx9uz0+PH3+vX5+9nq8tjp8eLv9dvr8unz9/D3+vP4+u72+fn8/ff7/Pz+/vv9
-        /f3+/qbQrqfQrnS0fKzSsXS1e3W1e6zTsHe2fHm3fXu5fgB3AP7//v///wAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABZACwAAAAAEAAQAAAIywCzCBxIsGCWAwgTKlyIEILDhxAhFjhgoKLFixcnBhAwYAkSDD9UiCwiIwWR
-        iViYEECS5IeRDzCPpMjAY6ISj1OuqPAho2ePDCh0TCRwBcqVKj4QJFjqoEEHFxMvWDmqAcSDClgtUBCS
-        YyLIKiR7EEFB9sWJHC0mblChwckVIjxMyN2Ro8aNiSquNLkSBQWDBYAV4CAxYqIGKlekxHgRYYJjCSJG
-        sJgIoscTFB1OcKjBeciIIDQmeoCB+WwJG6iBhFgxY2KB17Bjyw4IADs=
-</value>
-  </data>
   <data name="icon_back_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIQfAIaKkNjZ27a4vNbe4szS2dvh5M7U29LY39DW3c3T2vP198nP1s/V3MbM09Xb39vf
@@ -1812,6 +1807,25 @@
         CFRK4WWAq1ivDlTqc+IHmF29wpTqdSrZshMDAgA7
 </value>
   </data>
+  <data name="icon_popupscrolldown" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhEAAQAIcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/////
+        /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm
+        mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD/
+        /zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZ
+        MzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA
+        mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ
+        /2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkz
+        M5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM
+        mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz
+        /8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/
+        M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m
+        mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP//
+        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQAAAAAACwAAAAAEAAQAAAIMQAfCBxIsKDBgwgTKlzIUOCPhxAj
+        SvzxYKJFig4vQiyoESNHiwknLozY8GHDkygbBgQAOw==
+</value>
+  </data>
   <data name="icon_zoomprev" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIZ7AHBJJai7zuqxd9nFsxc5ZrjH11tgZOnv9CpGdRc2bGV7kpu20IiOlKm1w6u0vKqx
@@ -1827,35 +1841,23 @@
         7AkAYHHjwA0pW8acubIAzp3ngM5MZk9AADs=
 </value>
   </data>
-  <data name="arrow-curve-180-left" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="gear--pencil" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACGElEQVQ4T2P4//8/AyWYIs0g
-        ixk0G88wGHRdZTCbdJfBeuYTBvt5Lz2AeKbd3BcMIGzYcx2OQeq0m88xqNUcZ1CpPALGqAbMeOwBNOQM
-        FDOYTLhNggET73gAXXFm5tP//0G0cd9NFM0gl+B0gX7nFQ+gJFhz9/U//0FsJHwayN4GxL1AdaYYXtBo
-        OO0BDIcz0x///1+078v/qmPf/jed+/G/8eyP/w1nfvyvP/39f/mRzz+TN798Y9V/5TJQbSUwDLjgYaBU
-        fujM5Pt//2dseY+CEze8/h+y/PF/z3m3/jvPuPrfcdql/17zb/wx7T57F6inUqFkP4N80V4GBpn8XR7S
-        eTvPdF379T9t07v/6Ts+/g/b+eG/w6Y3/63Xv/5vvvbVf8PVr/5rr3j5X2XJi/+aS5//ka86fFkqd4ep
-        ZPY2BgagZgbR1A0eIinrz+Sc+fVfZ++f/yA2DIumbTwrlrf9okTlweuSbeceCC948VF4+oPXQPleIGZg
-        4DOPZeD3bmbgi1nuwRu97IzR4f//QbRgwmoGoaS1DPyxK1iAWBCINYDYHSjXy5uz/SyQ3gbEDHDALK7J
-        wGZf4cERMv8MCDOLaSAkkVhsukEgdVXIahiB8qxAzAXEAsyG8SHM1sULgWwVINYEYj0gNgJiY2QMVAOy
-        XgFkNsgAZqghHECaG4j5gVgIiEWBWByIJYFYCgsWoDwzUZKVQXoB+7/02cSOHsEAAAAASUVORK5CYII=
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACkElEQVQ4T6WPUUjTURTG799N
+        zNnD9GGJpcRQJOZMNtCtGTPNxG0POn3oLUYPUREEwcCsMCmEiMpcTxW6UiNWgTYLNNNs/MVttOlGJi1b
+        son4nA58Od3vvyUTeuvCj3P4zne+ey8jIvY/SMsWi4XZbDbW3t7O7Ha7VDs7O42ccxmM2TN4sQP2BLS1
+        tR3jxvO8HkTd2dmhra0tytbg+WeA1Wo1OZ3OB5ubm+RwOK5y08X19SQB9NAwgwfePS9oaWlhnEvxeJwC
+        AT8lkwnyer3fE4kEAfSxWEyawQNvZif9BaPRyMxm86GOjo4bi4thCodDtLr6g9bWfkmgh4YZPPBiZ0EQ
+        0gEGg8HMhSvA7R6KRaMRGh0dWa6qqnoE0EPD7K8PO7sBOp3OGQwGaGbmI83Pi7S0tERabXWfTCZjAD00
+        zOD5MjRIMwpFVBSEBukFGo2my+fz0dTUFKFGIl+ppkbXK/AnAvTQMPN4POTu7ibq6aExQfgkBVRUVDSX
+        l5dfAwMDrp+hUJTGxz+E9Pra6wC9pHlubptMJm8qlaKmkpJXg4ydkgLKyspYaWnpYZ1Of1cUgzQ9/ZlW
+        VhK0sZGSQD/93kXvRo5Tar2L1Gr1vaKiouonjB8EqFQq0CuKYRobm6S5uSC5XI/jfn+UwMSbO9sTw/XS
+        sru/lmprlM94ADutUKQDCgsLQWtjY/NwIPCNKiuP9CuVytuiGKHZyafk6pHHsPz8oYFO1he/hjezkw7A
+        kcvlLD8/31JQUNCXl5enRg0t+GjyZZN08/0uYb7u6L4X8MC7ezIBUA5wNBw9yM3NPeNolfno9wrdupyz
+        fKKOXcjMtLwW404pJBOQw9v9HBWnJAs6axXe2hsEW5aGi+DFDvsDd0bcBZIplukAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="layer" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABwElEQVQ4T6XS6ytDcRzH8e8z
-        yTMkUUpJLsntP/AP8ERJuSV3kdwe+QvkkrtaybXUMcPmNilmdjEP7IHNZbScmWNnmLtH8/sclvFAR1av
-        zvme832fXRr5/X76D8pu10Ick8sUyoRdNERZbeuQZzrxrlz73iyC79X8G+xgFw1aymxdgyLh7nXP6XnS
-        yoFdNGgpo2UVit23L4Zz4XFNDuyiQUvpzStQ6vI+60/dD8tyYBcNWkpr0kAZ++g6G3+vDnbgvFPq7eKE
-        1no1pN6/7J03851gPPHOoEFLqY1LUH4mPG1Znb4F2D+75Vg0OmfiuznjRZfE8EVn80yhQUspDYtQcex+
-        2GShcvvQMzlvdvVxBr6XM0p6pCPmj2s9Ops4gwYtJdWroOqQv9/YsArj7F0H5ozf9LM5QLrHHjCLBi0l
-        1iqhxuK40ShN/Agz/AnnwTOuS7PO7uHQoKWEag7q9EeiSmV2KQLY11AA5p/nO3ZRhQYtxVfMQgP7ZTUL
-        FteYZO/zGJiDj+wedtGgpZDoZIotmayc3nKssr/o8u6RqP4NdrCLBi1e4WFpuTkR+YNNkQWKDjmwiwYt
-        HhDKRDExf4Qm9B0h5nPvHST9+wAAAABJRU5ErkJggg==
-</value>
-  </data>
   <data name="icon_select" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIZdAOvsxmuAjjRRfpOhtpOitjRQeDVQejtTfDZUdzBMejtXf///1/385///74OTl3WE
@@ -1971,37 +1973,35 @@
         AgYTKwZIyICycEMDLAkQlKDwxEdHHTyQVLjQEQsQCFMKBgQAOw==
 </value>
   </data>
-  <data name="icon_invokeurl_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_panright_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIU4ANrf46y7zJ6rvLXLss/Z4cXQ2rPD1M3Fo8fR2rjHwK/BtbTJsb3TtcLXt8TOzsDL
-        ycTDpbrQtL7UtrnNs7DCtMHWt6m9rqm9rcHL1LHDtrDDtLPIsb7MxMDVtrLEtbHHsLbMs6u8xK/CtK++
-        q6y/ssDWtrrPtLjPtLrRtLzRtLvStb/VtqS1s7nJw8jSz63AtbzQtMDWt7bMsrvRtcHXt7zStcDMz7zR
-        tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAA4ACwAAAAAEAAQ
-        AAAIuQBx4MAQoKDBgwUxCAxgoKHDhgAMRBSwEKHFABRxBCDAsaNHjhk3AhhJsmSBjCFaZLCQgQOEAzAP
-        ADiJ4wGJBQMq3FjgwYVJihomDAAwoEGDCR5eyjyZYEGDoUQr0FjAgeRJBTBKQCUaI8UImDMFXOiwYivR
-        DhasClBgQsJWBhIivChAl+kGBlBn1GCwgYWAv38daBgwNAIKFQNE2EDAmHFNCh9AnJDxgcIDgZgxO0ig
-        4IKCBA4yYw4IADs=
+        R0lGODlhEAAQAIZuAJumsOTY2MS5uK+2vcW5uJumstrOzsi9vOHV1eHU1ZunsuXZ2dve4d7S0aaxvuTX
+        2ObZ2aaxvePY2NnNzODU0+HT1Ofb2sTJ0c7Jyfjz9J+rttvPztrPzpumsdbS0pqmsdfR0dbS0aSvupum
+        s9zPz9/T08/ExMzFxNbKydfOzdXJyqOuutjMy9zQz8fP1tvPz97R0dLLytfLysG2ttPQ08vEw6Ouucq9
+        vs/Dw6eyvuLW1eXX1+TY1+DW1sa8u+LV1vj09dTQ0NPHx8i/v9fKy+PX1pynsc3BwaSvu+fZ2tTIx+PX
+        18m9vJqlsNLMzMK4t8zAv9zQ0P///9TR0KGsuObY2Mu/v6CrtqSwu6mxu8m/vubZ2pqmst7T0tXKydXJ
+        yc/Jyca9vcbL0si8u7e9xK+3v5+rt8zDw9PHxtjPztrX1+fa28/S2NTMzAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABuACwAAAAAEAAQAAAIvwDdCBxIcOAABgUTAli40IibFwEIpACT0M1BNz2gcIAgwIIWNRXd1FhAgMQD
+        AWvOBKl4wkQAAQZ4CNjSpU1FH2iqENjwQEgSCTEqzmgRQAmFCgkWSAhRcUyAJSUo/NgRIE3BI1EQ3JhQ
+        AUECHUUg0CAI4kmDBjhUyDAAw0AGNgMIehiCYoIXFl+IABETwUyZgk6sHDjARMoFDRGwXMmScAqGMC4U
+        jBDhYAWXkG7IFCjQhEoOG5jdICnwoYMCBwEBADs=
 </value>
   </data>
-  <data name="icon_viewoptions_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="table" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIUAAAAAAP////39/vv7/Pr6+/n5+vj4+fb299DR1M/Q0+bn6eXm6OPk5n6Ejs3P0oyT
-        nM7T2bG3vs/R087Q0vf4+fb3+PX29/T19vP09ebn6OXm5+Tl5uPl5vb4+PT29v3+/vz9/fr7+/n6+vj5
-        +ff4+Pb3987Uz8/W0M7Vz4qgitHX0dDW0OLm4uTn5P7+/v39/fz8/Pv7+////wAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAyACwAAAAAEAAQ
-        AAAItgBlCBxIsKCMCAgTKlyIEILDhxAhNojwoKLFixcnBgjgwsWHFzBCwhgQIkQBjR0/hhzAsqSIERNT
-        tkgxsmQIAi9hRnCRYuaKAQgkCJWQYASJiQJUpPgZQ0GGpws0kOgwEeTPmwVGaB1BoUOFiSBGskiR1YDZ
-        rhUsTISRYiyKERPiTnBQwoKHiQNOpHg7YgOHvwzsXpgYg4AJrRQqKE7r4cLgCASycu1wwILlxhcwTGzA
-        ubPnzwEBADs=
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABzUlEQVQ4T52RzUtiUQDF71ba
+        R7RrGW5aVIQUNVPQYjCIwU2LNg3ZjMwUSViPzGKmmf6oiigcs+zZF5FSFn3iGJbo8yOfnrnnwXskuMkL
+        B8598Dv8uE+4AgGnzGSDcYrPfr8bDR6yYlRRpqpyYCgCDO5X8XGvgg9hHf2hV/QFi+jdycOxraFnK4vu
+        zQy6Nl7Quf4MMmTFiM/3Ta9WjYG1NIyB1ZSOX//KxkDgPg//bc4YUK4zmE88GwNkyIpPXq+nVKlYBl9U
+        DavHKfw8TGJFfcRy5B5L+3dYDN9ACV1j4e8V5oMJkCErhqenvxd03TL4ffyEV3lngmdnVt86OrL6+sEB
+        yJAVQx7Pj1y5bBlwIByPI3R+jsNEAjunp9g+OUFEftuMRrGhquCAwUhWDLjdM5lSqcZAk3eGBmangdk5
+        QIas6J2YmE0Xi3UN1MtLy2AvFqsxIENW9IyPe1OFQo1BRt4ZGpidBmanARmyonNsbC6Zz9c1iFxcWAa7
+        8k3evgEZsqLD5fI9aFqNQVreGRqYnQZmpwEZsqLd6VTucrm6Bhww/wIH3hqQIStaHI6VpHzRm2z2XSFD
+        Vtja2r422e1/GglZIY9Nplmm9Z0hY/sP0fXQjui6fQYAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="icon_print_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        R0lGODlhEAAQAIIAAJmZmdra2rS2uLe5u7W1vbq6uv///wAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        BwAGACwAAAAAEAAQAAAIYgANCBQAoKBBAAUEKhQIIIDDhwEKJFxooCFEhwUiUrR4MaNGhRcfShwpcMDB
-        ggMuAmAYkqPDlQRbCoAIwKTLlwgfFsR58KXOmyp/hqT586TRokAN6rTZEsDMggJKGh1A0UBAADs=
-</value>
-  </data>
   <data name="icon_fitwindow_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIUzAKq7y6u8zZ+svdbd4dfcztje4tbcyNfcy9Pb39Tc4NXc4MbS2MTR19ne3cTP2MjU
@@ -2029,51 +2029,6 @@
         aIiQYcWFFDModDABk4Dnz6A/DwkIADs=
 </value>
   </data>
-  <data name="icon_panright_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        R0lGODlhEAAQAIZuAJumsOTY2MS5uK+2vcW5uJumstrOzsi9vOHV1eHU1ZunsuXZ2dve4d7S0aaxvuTX
-        2ObZ2aaxvePY2NnNzODU0+HT1Ofb2sTJ0c7Jyfjz9J+rttvPztrPzpumsdbS0pqmsdfR0dbS0aSvupum
-        s9zPz9/T08/ExMzFxNbKydfOzdXJyqOuutjMy9zQz8fP1tvPz97R0dLLytfLysG2ttPQ08vEw6Ouucq9
-        vs/Dw6eyvuLW1eXX1+TY1+DW1sa8u+LV1vj09dTQ0NPHx8i/v9fKy+PX1pynsc3BwaSvu+fZ2tTIx+PX
-        18m9vJqlsNLMzMK4t8zAv9zQ0P///9TR0KGsuObY2Mu/v6CrtqSwu6mxu8m/vubZ2pqmst7T0tXKydXJ
-        yc/Jyca9vcbL0si8u7e9xK+3v5+rt8zDw9PHxtjPztrX1+fa28/S2NTMzAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABuACwAAAAAEAAQAAAIvwDdCBxIcOAABgUTAli40IibFwEIpACT0M1BNz2gcIAgwIIWNRXd1FhAgMQD
-        AWvOBKl4wkQAAQZ4CNjSpU1FH2iqENjwQEgSCTEqzmgRQAmFCgkWSAhRcUyAJSUo/NgRIE3BI1EQ3JhQ
-        AUECHUUg0CAI4kmDBjhUyDAAw0AGNgMIehiCYoIXFl+IABETwUyZgk6sHDjARMoFDRGwXMmScAqGMC4U
-        jBDhYAWXkG7IFCjQhEoOG5jdICnwoYMCBwEBADs=
-</value>
-  </data>
-  <data name="control" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABeklEQVQ4T2P4//8/AyUYRbP9
-        3BcMDvNezgTiGJtZTxkspj5gMO67yaDXfolBo/4UVotQBEGagPgMFMeQbABIAxCfmfn0/38QbTHlfgxJ
-        LgApBuIzHVd+/5/++P9/ENu490YM0V4AKQTiM/Wnv//P2vbx/4Q7f/+D+LptF2OICgOQIiA+U3Xs6//E
-        tS//hy++/7/hzMf/IDH1upMx2GILJRCVyg8xAPGZtC1P/7tMOvffeeJZMM7f8/w/SJygATJ5OxmA+EzA
-        uif/TWbeBOOE3a/+g8Rk83cRdoFY2kYGID5jufn9f9klr/577f30H8QXT98UAzKcoAsE4lcxAPEZxR2/
-        /5vs//0fxBZMWB0DMlg0qJuwAdwRixmA+Izq/v//QTRP5JIYHvd6BlZJHQYQIOgCFi1/BraguWdAmNWu
-        LIZZTBOsEQYIGgBUyMFkVbyIySi5BMg2AGINIFYAYgkgZifGABagQjEgloJqEgHSAkDMA8QsBA0gJ1sD
-        AE2BbRvnALnyAAAAAElFTkSuQmCC
-</value>
-  </data>
-  <data name="gear--plus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACeklEQVQ4T6WQUUhTURzGz9zm
-        GNMxJSasHFEbKzZDNmhbESNLRnMPc9pzDCKR6ikaFC1EKBEsCvWhslBovtSL4lNmgskV3IVtbrikpWts
-        Tgx6k9CXf+e7d4VGPXXhx/nz/b/v29lhRMT+BykcCARYMBhknZ2dLBwOS2d3d7eX01PFu38HLzLgQEEo
-        FDrDjb38PIxzb2+PdnZ2aL8Gz18LOjo6zkaj0Sfb29sUiUTuctP1zc0yAczQsIMH3gM38Pv9jHOzUChQ
-        IrFM5XKJZmZmPpdKJQKY8/m8tIMH3mpG/gter5f5fL4jXV1d99PpFKVSSVpf/0LF4lcJzNCwgwdeZNxu
-        t1zg8Xh8XLgFJibG89lshiYn4zmHwzEKMEPD7pcPmd8FTqczKooJmp//QEtLAq2srFBLy6kBpVLJAGZo
-        2MEDLzIc+QZ2u/3O4uIizc7OEs5MZpVaW539CoWCAczQ9nuQ4cgFVqu13WKx3APDwyMbyWSWpqffJ12u
-        0zGAGdqFt6Fd1fOmcn3MlECGIxeYzWbW3Nx81Ol0DQmCSHNzH2ltrURbWz8kMEM78cZLV7/fJsX4oYy2
-        z8jYy0a5wGg0gn5BSNHU1DtaWBBpZORFYXk5S+BiPLxri7vJMuGiy9+ukfJx4yYPi2ys8ZlU0NDQAC61
-        tbW/TiQ+kc128qnBYHggCBkCNQ8NlfOVMP0JGzWIUgE+lUrFtFptQKfTDWg0mmM4c7kKf9AiqSL1ScWg
-        PqOI6SuO4jliQ3pR4pFevgHynCYOf1bmAmq1+govGgSYJT2mWzVt2In11aXZcf6LQ3r5DfhXw6nj8Jdh
-        pn/SW/uK9ajT7EbtWDXDfgLZQt8vMfwSKAAAAABJRU5ErkJggg==
-</value>
-  </data>
   <data name="globe--arrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -2130,16 +2085,35 @@
         iEmUMn62FGwxJMMJPTzUHKlQgwYShA/kaCFi4E4TCRgsRBzEBQGCOTbcwNk8iA2FHQ4MyAgIADs=
 </value>
   </data>
-  <data name="icon_tasks_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="document" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIQAAAAAAP////39/vz8/fv7/Pr6+/n5+vj4+fb2936EjuDi5YyTnM7T2bG3vvf4+fb3
-        +PX29/T19vP09fb4+PT29v3+/vz9/fr7+/n6+vj5+ff4+P7+/v39/fz8/Pv7+////yH/C05FVFNDQVBF
-        Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIogA/CBxIsKDABggTKlR4kEGDDBAzNGBAkWKCgwsaKNio
-        YIHHjxc/NAjQYMOGChw6dCDQ4IKBkCNLLrzQAEMGmBsaoByw8kKBhzcP5uSgsACGhxpgCmigkoCHCzYb
-        aJgAk2iHhRInPIBpoYHTAgYyHHDQ4AEEmFdpIjwwtQEECjBZGoU49UEDChFgelioMELeg2AhOpiA4K1f
-        CTATKF7MePGHgAA7
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABp0lEQVQ4T42SzUoCYRSGz1ba
+        tahVC0FbSNCiRdIiIQgSKooMWrhxUSk6yIgoVhq06QK6BbuANl5A11CLVlGgRUjl//h7es/gCYIa++CB
+        meE8L+c7cyhUKJCwf36+BY4m4NnL52n35IR2cjkbkg9jjluDAX90u/zWbnO52eTnRoOf6nWbm9tbRt0x
+        8P4IkJcx0Uavx1WIL7UaP1ar/PD6yveVCt+Vy3xdKrEc1EaB97uD7WyWxsSaCHhvtX4NuSoWWfEGg2eA
+        BNpMp5V4u9/nT7T/V4h0IteBE1ePNkxTSXQwg3qn4xgiAXAS6tG6YSiGhYCmZTmGyGDhGOrRWiymJHvD
+        IbcxB6cQ+TtwkurR6uGhYvYRYGEOTiFvuCIcUz1aiUSU1GA04i6u4RQiewInpR4th8NKeogA6cIppI4r
+        wkmrR0sHB0pmhEUZIMApRJYNTkY98gQCtBgKCVnZtBG6cAppYUZSK4649pnz+2k+GDy1d3VCiCyb1Iqj
+        x4WHmVm//0ID7BAgM5HBypXkF8uedPEuteIAcWkaLLjc7tSUz3f5H6RWHHG/API/kG3WfDzsAAAAAElF
+        TkSuQmCC
 </value>
   </data>
+  <data name="databases-relation" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACD0lEQVQ4T42SvW8ScRzGb+B9
+        0oSBl8EAIWGAOLIhgyMkLCxOJgaNbwlDBzGVsz3BPwAxosH42qiHl1LbhuRsKJQ3y3bm0pqI9dQj7VWM
+        k+vj3UktR7DyS57ll3ue3+f73JeIx+PEFDorf3NzkqYxE5FI5LwkSej1euB5HrXaJlZWWlhf5zB1QL/f
+        R7fbBcuyePFyEQ+KJZSYNTVgIpp8r2CrDygE4wH3izRohgUxjsRxXyGKvxCNRi/FYjFCOW63O5RIJN4U
+        CgXk83mQJIlUKgWKokCMIzWaPD4LP9UAn8+n+E9mb2dpTQcb71BerYKtdQ4DDpA2Whx2hIEaoJipbIb+
+        /mMAzQivGNx79BwLi0sgxpFyuRySyWTF6/WemcvconcH+0iTZFUTQDO4+/gJnpWZYQcjSF1uGzuiBDJD
+        0d/29zBLpqsej+fc0R2MIK21O/ggfIEg7eJ6+kZVp9OdCoVCCU0HjTaYSgXL9bfDDkaQ2HYTW8InXEvP
+        qman00n4/f6LmhFKr3HnaREPlxb+3UEwGDxttVoJk8lE2O32GS1BC6XKMsr1yrCDEaTG+01six8RDocv
+        uFwu5TeeMJvNV4xG45xMdCBKr9dTBoOB+rMHI0irHRacwCMQCFy22WxKwDFZdlmOiVI3sXGIVOea4MUt
+        OByOGdlwXF3Fo84Q6y+SPPO8xWKZl7GvKlv8P/9vysUMoJZl8vEAAAAASUVORK5CYII=
+</value>
+  </data>
   <data name="icon_fitwindow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIZlAEJyokd1qBU2aPLyl/PzoPj4yvT0rJi2zPn9/O729/L4+PT1rLnS2eny8+fx87zV
@@ -2184,46 +2158,31 @@
         AbE4EEthwRJAMTEgFgFiAahGkHqQZhYgZqI8M1GSlUF6AcIC84BckOgRAAAAAElFTkSuQmCC
 </value>
   </data>
-  <data name="icon_invokeurl" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_invokeurl_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIU/AP///0typRExZG+wPtbn963D3maPxcyZALfH3FWHSGupO3ugdqq+r5iymaDfUY/S
-        S1iORF6fN56xxmKWSj14K5jYTqqRCT95LHy6Ql6PT5Gzh4fKSIPCRY/RS2akOShXQp/eUZ7dUIrOSYLH
-        R1V8IHvBRFmPRInISH+og0mCPpfYTp3cUJPVTIDGRojHR1eNRIPDRYjGR0dzh5vbT6DeUHCzP7jOsU+E
-        SVuQRZvbUHGzQIbLSJPVTZq0sWWkOQAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAA/ACwAAAAAEAAQ
-        AAAIugB//JAQoKDBgwUlCAxgoKHDhgAMRBSwEKHFABR/BCDAsaNHjhk3AhhJsmSBjDJQZLiQQYOFAzAP
-        ADj5o0EKBQNWnFAwwYZJAQxwYBgAYIADBxgmvJR5coECGkSLhgChQAPJkwlizIhaNIcLEjBnCqBQQQXX
-        ohUuXBWQgAMPrh1YwLhRoG5THw+ibhDxwMMHAYABMzAxgGiLETsGvOiBoHHjmhAi6ChRIwKEBgIzZ2aw
-        IAGFBAsYaM4cEAA7
+        R0lGODlhEAAQAIU4ANrf46y7zJ6rvLXLss/Z4cXQ2rPD1M3Fo8fR2rjHwK/BtbTJsb3TtcLXt8TOzsDL
+        ycTDpbrQtL7UtrnNs7DCtMHWt6m9rqm9rcHL1LHDtrDDtLPIsb7MxMDVtrLEtbHHsLbMs6u8xK/CtK++
+        q6y/ssDWtrrPtLjPtLrRtLzRtLvStb/VtqS1s7nJw8jSz63AtbzQtMDWt7bMsrvRtcHXt7zStcDMz7zR
+        tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAA4ACwAAAAAEAAQ
+        AAAIuQBx4MAQoKDBgwUxCAxgoKHDhgAMRBSwEKHFABRxBCDAsaNHjhk3AhhJsmSBjCFaZLCQgQOEAzAP
+        ADiJ4wGJBQMq3FjgwYVJihomDAAwoEGDCR5eyjyZYEGDoUQr0FjAgeRJBTBKQCUaI8UImDMFXOiwYivR
+        DhasClBgQsJWBhIivChAl+kGBlBn1GCwgYWAv38daBgwNAIKFQNE2EDAmHFNCh9AnJDxgcIDgZgxO0ig
+        4IKCBA4yYw4IADs=
 </value>
   </data>
-  <data name="edit-indent" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="control" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABjElEQVQ4T5XTS0sCURQH8OOm
-        rVmL1E0UGhRWJqGGBUapQZE9NpWQSBBtg4i2EkF9iXa10srHFJHUWNGDgmhTqyjaRASt293+Z3AmXyM0
-        8PPO3Hse98oMCSHIYDCwOCQgWbCHcR8OIAVpyIIEW5zDucpPocC/x/IC3LlWV+oNrClcQ6vkHFzR3wEH
-        qMHquLj5TaqFjS+Kxj/+CjQ7Y8Ts7iVlIbb+KSNI6OH1kgL983li3rlTCi8/MXH+8KOL1zlO+w/cMzkC
-        4RhP+z2zOeqLnMn8rIfXuaFWwB5KELyB4PvO8BG1j6YrdIxlyTl1yM2UHWsFbMEUgWgdTvjtoQyKZWR+
-        Lsfz9pBEXRPH1DN9UrwDCUkStY1I1D15w6qen+cL60qctoNGW4RYvdlLjuAutvcqD0TfRTmedwR2yNjk
-        Ib5030ST1UctrpUKJotPSVSv8gIy3sQ8XMAlXME13MId3MMjkp/hpeYO9L6NkvbFR8C9EUnbNbomEWMt
-        sGBsgDrtCFwAzEVBanC1saTAL88kUjz8yRfZAAAAAElFTkSuQmCC
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABeklEQVQ4T2P4//8/AyUYRbP9
+        3BcMDvNezgTiGJtZTxkspj5gMO67yaDXfolBo/4UVotQBEGagPgMFMeQbABIAxCfmfn0/38QbTHlfgxJ
+        LgApBuIzHVd+/5/++P9/ENu490YM0V4AKQTiM/Wnv//P2vbx/4Q7f/+D+LptF2OICgOQIiA+U3Xs6//E
+        tS//hy++/7/hzMf/IDH1upMx2GILJRCVyg8xAPGZtC1P/7tMOvffeeJZMM7f8/w/SJygATJ5OxmA+EzA
+        uif/TWbeBOOE3a/+g8Rk83cRdoFY2kYGID5jufn9f9klr/577f30H8QXT98UAzKcoAsE4lcxAPEZxR2/
+        /5vs//0fxBZMWB0DMlg0qJuwAdwRixmA+Izq/v//QTRP5JIYHvd6BlZJHQYQIOgCFi1/BraguWdAmNWu
+        LIZZTBOsEQYIGgBUyMFkVbyIySi5BMg2AGINIFYAYgkgZifGABagQjEgloJqEgHSAkDMA8QsBA0gJ1sD
+        AE2BbRvnALnyAAAAAElFTkSuQmCC
 </value>
   </data>
-  <data name="icon_panup_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        R0lGODlhEAAQAIZuAJumsOTY2MS5uK+2vcW5uJumstrOzsi9vOHV1eHU1ZunsuXZ2dve4d7S0aaxvuTX
-        2ObZ2aaxvePY2NnNzODU0+HT1Ofb2sTJ0c7Jyfjz9J+rttvPztrPzpumsdbS0pqmsdfR0dbS0aSvupum
-        s9zPz9/T08/ExMzFxNbKydfOzdXJyqOuutjMy9zQz8fP1tvPz97R0dLLytfLysG2ttPQ08vEw6Ouucq9
-        vs/Dw6eyvuLW1eXX1+TY1+DW1sa8u+LV1vj09dTQ0NPHx8i/v9fKy+PX1pynsc3BwaSvu+fZ2tTIx+PX
-        18m9vJqlsNLMzMK4t8zAv9zQ0P///9TR0KGsuObY2Mu/v6CrtqSwu6mxu8m/vubZ2pqmst7T0tXKydXJ
-        yc/Jyca9vcbL0si8u7e9xK+3v5+rt8zDw9PHxtjPztrX1+fa28/S2NTMzAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABuACwAAAAAEAAQAAAIxADdCBxIcKCRgggHMgDAQOCLAARSgEE4AMAANz2gcIAgwIIWNQUBCKyxgACJ
-        BwLWnAlCUKSbEyYCCDDAQ8CWLm0GunTjA00VAhseCEkiIUbCGS0CKKFQIcECCSESjgmwpASFHzsCpCl4
-        JAqCGxMqIEigowgEGgRBPGnQAIcKGQZgGMjA5uJAD0NQTPDC4gsRIGIimClT0ImVAweYSLmgIQKWK1kQ
-        TsEQxoWCESIcrOCSUCCZAgWaUMlho7NAJAU+dFDgICAAOw==
-</value>
-  </data>
   <data name="icon_selectwithin" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIUwAMnY6Ud1qBU2aAEBAYBoKfLyl+Tfi97Vh+nljZeirOLaicjd5Pf3vPX2s+Ldimp9
@@ -2250,23 +2209,19 @@
         ZOHTRoMQHTMDABEB5YWDGUmU6KHxQAwGBKj95EkRIw6LFVV6fEig5oJChVHMbOijMCAAOw==
 </value>
   </data>
-  <data name="map--plus" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="script--arrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAC6klEQVQ4T53Rf0zUdRzH8fdq
-        1srNWv2R6eZy8x9Hg9babKRTNmd/FG5l9Idbru2Cw8PjBII7EfAHKjI8ZcJR14DidjQOhniB2ImAml2C
-        h07lPH+gB3IHIpMyTpCJPP186s/Wan63xz7/vJ7f7fv9SMqOHclK2jNI/qyoSGRDYaGRZ3h0p4h8kp+f
-        PqdeUH+2gJbevZztryQ4UE9g4ATuK/3s6YlgOxMlyxfF3BrFdCSK3utOEVlvtZpm5+b4viuPjgE7PREn
-        vSEnE9NdXJ28TsNojCJ/lOIgFATA5I2i97pTRD7KycmYefIEpy+LttA+um6X47tg5+7kUcan/Jz7fYiy
-        82FKb8DOy7CldRi9150i8qHFYp6enaWyNYPvTmTjOpWPt6+E7kvlXL7moud6Ow2hELv9g+R1D2E5PoTe
-        604RWZuRkRl7/JhDzek0BLbj7S/GfXo7vw1/S3jCw/2pTjqDnXhG/8R+a47sjkH0XneKyBqjceuDmRns
-        P6bh9ltpvFBIdUcuJ28dom+khpEHLfSFmtSnDFIzPIOtO4ze604RWWkwZE88esTBWiN1p3Op77FRdczC
-        sWv7ORU+TPCei0B/DcOxAL7xMXaeuYne604ReX/Tppzx6WnKq0yU/ZDKgYZUHO1mvmnfSu1JG42/7MYf
-        rCJwpY6PfZ+z5GgiX/ZmoTtF5L2NG3PHpqaoLDfj9tqo6/yaA55UPH0FeIN71NUe5Mive4n80UxC2wq+
-        mshVZxK6W1ywQuSdlBTryMOHOMoseBoLcbXlsd9twH3OStPFInW1JSQ1riSuOZ6ElndJGU8jvmU18xxv
-        RqT6NacsT07Oj8RiOEozqSjLxF6RTmmNgdJ6A/YmIxU/mXmrehlJo5/+gzheDcjCxMRdY+qv3pmc/Fdf
-        /LyF+LoP/vL2nVUkuFbxfPHrI2Jf4JSXli7dPD8uruT/eG7bK6OLwnHoU3ey7kXRz8vKG8qi/7T5hVpJ
-        m3dJTOr8u5Onl817ThS42NsAAAAASUVORK5CYII=
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACA0lEQVQ4T43TT0iTYRzA8d/o
+        DylIsEOUOyS85qGZhxXULsGG0kCrQ60uG3aIZ7iNZIZ/VuhFbSQIug5dUrpK4KGIIII0iQi3WtFCR6XD
+        3jne+Ta3uSG67dfvCZ7q9ODhA+/h9+X9Pc/LCx39/cBdCgbh6tCQlbC9ujI4WP8n5i4ODFhfLi4+q1Sr
+        WK5UpPKl0satyck79NLjcCEQEFihXMZMoSCV29nB8OzsY0dPTyN/MZzv6hKYurWFy+m0FJ+hhtn8fmjt
+        7gY409kpsGQ+j19UVYrPUMNEByedToGt0fpfUykpPkMNEx00tLcL7Cett0RHkOEz1DDRwRG7XWDrxSJ+
+        0zQpPkMNEx3UWa0Cy5RKmNR1KT5DDRMdHLRYBPZrextTm5tSw3M6Kp7x6Yab98HkHgYwNDcLnjx94w26
+        JBn3jIqnxz4mzz744WoJfQaApibBV9zdxRyt+L+7T1fQObX817XpBD5UESmOnBqNuQBMJgBF4QJaLofp
+        bBY1OkaGnnXapiMcxfAaojeO6P70z+0lRCW4EAEwGnlsvuzzPXkVjeJ8LIbv4nH8kEhgfHUVPY/eo21k
+        Du2j89h67w22hRbw3FvEo97nkWP+Fy4wGI1ms8Mxoel6tko/khQinvDOFOquT32vtfd56AIOgaGmpmWf
+        ooT26oCt9/V+y40+iunscPg3qfGIS2EPRjUAAAAASUVORK5CYII=
 </value>
   </data>
   <data name="marker" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2299,13 +2254,37 @@
         TkSuQmCC
 </value>
   </data>
-  <data name="icon_null" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_clearselect" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIECANji87HH6f///wAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAACACwAAAAAEAAQ
-        AAAIRAAFCBxIsKDBgwYDKFzIUCHBAAAiSpwY4OHEiwAqDoSIUaJGgRw7ZrQocuTGkiZBovwoIGRHli4x
-        wlz5sKFNhDhzHgwIADs=
+        R0lGODlhEAAQAIZXAAEBAYSChPn6+b2/vvrond3Th9bm63CrvN7Vh6+8mOCnnLK8mnJ+jOzNYuTfi627
+        nIeZk3l+jvX28+LaiamMOSE7NSwuLMfd47SVnNDi6O7sj2ZdZIBoKdfn67TA0O/swv3///vKwd+zDV+y
+        qu3Zh395RpiimK26xaiouLC9xcjd5JRCL7m/0sytJvP19vL09qyuq4GCmd/s7/Lv+s/i6HV+hHk/Odet
+        EXqChdjMhURNV/vok+nljbuRAamDAfz8+6+9os3h5zU7L/n6+ujjjJ6iorS8yOLdisDZ4J+dlnpaWa3B
+        xY53O/nonIiSmbO/yrqAfbTAy914aNuvDUBeXLePAclWRv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABXACwAAAAAEAAQAAAIoACvCBxIcOCTBR8CXFHIcOHAEwl2NChIMcqDJjdaKATAkaPDFEAITKlCQSAA
+        DTwcABDowQQJET2YJNlI5AiClQxYzCjhg8MACSYnFMgBwAgKEEsOCIHxw2FHADowKIAwgkoRARQFxggh
+        ZUUFHEMGKrzSMQIUKzZquKAIQIaBIBY2KHHyouDGDjQurBybFUAGFUhWZnVI1iPhwYgJNlycNSAAOw==
 </value>
   </data>
+  <data name="gear--arrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACfklEQVQ4T6WQXUhTcRjG/7Yt
+        GWbozexrI0qRUMPOwG11MbDEmov8uojQZFBIq66kgVERgogglG1hEJRSGdRNihG0TFA7ws6JnX2YmsuW
+        bTq8l8ibt/9zjpZCdNOBH+/L8z7PwzmHERH7H9Swy+Vibreb1dXVsfr6enU2NjY6OK3rODbf4EUGbCmo
+        ra09yo2X+NyLuba2Rqurq7RZg+evBTU1Ncd8Pt/dlZUV8ng817np8tJSmgB2aLjBA++WN6iurmacq8lk
+        kiQpROl0ikZGRuZTqRQB7IlEQr3BA+96RvsEh8PBnE7nvoaGhluRiEKKEqaFhS+0uPhNBTs03OCBFxmb
+        zaYV2O12JxfawMBAfyIej9Hg4LOZ0tLS+wA7NNw2fMj8LhAEwSfLEo2NvaepKZGi0SiVlR3u0ul0DGCH
+        hhs88CLD0d6gpKSkfXJykoLBIGHGYp+ovFzoyMrKYgA7tM0eZDhaQVFRUVVhYeEN4PcHvobDcRoefhe2
+        WituAuzQcKu49lw60nz7JTIcrcBisTCz2bxfEKw9oijT6OgEzc2lKJP5oYIdGm72bilj6/0cs/kXmviH
+        aQUmkwl0iKJCQ0NvaXxcpkDgYTIUipP3sULHe6Sfbn+ETt75SKcDUepLE/GwXNapNKkF+fn54FRlZdVT
+        SZql4uJDvXl5eZ2iGKMT3VN07zuRd5qoOfKHtlmig+0TslqAR6/XM6PR6MrJyenKzs4+gDkzs0wX+0Jk
+        ahlYLmh9FVPnhRfz9g9Eu7yv5d1X3mhvgDyngMN/K7MCg8HQwou6AfYNPfds/3TuuSeRnU2D53mJ9g/4
+        s42zg2Pi7PkX2888eGRw93rWM+wXiN3yhzE1UjYAAAAASUVORK5CYII=
+</value>
+  </data>
   <data name="icon_pan_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         R0lGODlhEAAQAIQAAGtra7/Dy6Smq5KWm9bW1o2Rlri6veTl5q6wtPDx8czMzMPFx5mZmdzd3q6zuqir
@@ -2346,18 +2325,16 @@
         XJSSklIlIzIqTeti98UmIUWSxBaJretEdpI29JTlb+APrpaoVzbDpskAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="sort-number" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_viewoptions_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABuElEQVQ4T42TTUsCYRSFJwMJ
-        QWoXCFKEtAhqE/4EN4E7V+nGELUsAyUcUdC9W8Ef4cKtG3+BuJGgtQiCX/iFIn7d7rk5Mg4JCg/nfe89
-        58yIqKiqqiSTyT3S6bSSyWQcTBCKu9GDHBEpyoEChEJsICjjOFiQSCRuuOSZCenZbDa0Xq8JatzBj5y8
-        QTwe97Zare/VakV6lsslaRh38CMnBdFo9HWxWNB8Pj8a+JGTgnA4/IbwdDqlUqlEhUJBznoqlYrMoZjD
-        j5wU+P3+yGw2o/F4LORyud3ZONN28CMnBV6v930ymdBgMBBSqZRovV7fnYvFopy1HfzISYHH4/kYjUbU
-        6/WESCSyO2szaLVapVgsJjv4kZMCt9sdxRPb7TZls1ny+XyiuGvk83kKBAJULpdlBj9yUuByuT77/T7x
-        T3M08CMnBU6n86VWq/10u13qdDo7ms0maejn8MGPnBTY7fZbm80WZL70DIdDajQaBDXu4EdOCviiWCyW
-        Pcxm8x2j4rtCcTd6rFbr359p+zGxnjNXzD3zaDKZnhgVijvzwFwzF8wpcvqCE76fbZeXrLZ/wBxh+PBA
-        KfgFcqFa2BgtJlQAAAAASUVORK5CYII=
+        R0lGODlhEAAQAIUAAAAAAP////39/vv7/Pr6+/n5+vj4+fb299DR1M/Q0+bn6eXm6OPk5n6Ejs3P0oyT
+        nM7T2bG3vs/R087Q0vf4+fb3+PX29/T19vP09ebn6OXm5+Tl5uPl5vb4+PT29v3+/vz9/fr7+/n6+vj5
+        +ff4+Pb3987Uz8/W0M7Vz4qgitHX0dDW0OLm4uTn5P7+/v39/fz8/Pv7+////wAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAyACwAAAAAEAAQ
+        AAAItgBlCBxIsKCMCAgTKlyIEILDhxAhNojwoKLFixcnBgjgwsWHFzBCwhgQIkQBjR0/hhzAsqSIERNT
+        tkgxsmQIAi9hRnCRYuaKAQgkCJWQYASJiQJUpPgZQ0GGpws0kOgwEeTPmwVGaB1BoUOFiSBGskiR1YDZ
+        rhUsTISRYiyKERPiTnBQwoKHiQNOpHg7YgOHvwzsXpgYg4AJrRQqKE7r4cLgCASycu1wwILlxhcwTGzA
+        ubPnzwEBADs=
 </value>
   </data>
   <data name="globe--pencil" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2380,20 +2357,19 @@
         SERpAYmqu0eidU38ZHf2zvaEMJvlmccfIWXM8KMbnf+DySzPPPIbH8MN9etvR7oAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="drive-download" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="arrow-curve-180-left" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACTklEQVQ4T42OXWhSYRjHH4KK
-        iBNkX9AHWx9QeaQuDpTsZgu7CsRJGjIcqyAFiY0xhm7RFqxTdLPoqtjCm+jCPsCwUhtL86O0nRo2zZy5
-        tXWR3qztYuUkfHqfsSOOsdWRHzz+n9//4YV6ZwFWQXB+xwYxUW5ge2E1D47d/FTh+K0xqLs7LWO79/XP
-        9Y7AvMgym5yTU92B2s5AhQOOEBy9NgJCf4Z4fCe1kLJ6ZlJsfkQZ7cip7qw4cKg7CoevxoDv+yj1vZ/D
-        M4NfkGbKaLfmgf32N7eZ4FtCsoVmUHV/Atl/Sc7JWfaCvW2vQGZPq9988Eoo1Z4o4SVpAQXfPG5zzWH9
-        8C80RH9jjSOYJKe6UylTuPuyFxQXn5p3tfuT2pEybveWcd2zMqqCZdzR5kvSjpxlB060iECcPH8Djlic
-        sPXCE9hsemDeYnUn66KItcOInMWdpIx25JAr90Cn0y2i1+vBaDTCaZMN9p3rh/WNg+aNLa6xDQyaKaMd
-        OeTKvRUHSCBOnbUA39hZQ9As52sd4AwGQxPD+g+a2Au4ygu0Wi0s0RwOh8cTiQTG4zEMBl+j1/sSPR4P
-        4znDzwigy/VinPnNcg8EQQCNRkO0lkolLBaLODv7E/P5Hzg19Q1zuRxjgjGNkpTGTCaP5FKHuosfz/Og
-        Vqs7CoUCut1uFEURe3t7sKvLgXY70cMQ0cJ+sVgayaWO/G1iw06lUtnNnjuZzWYxnf6Mo6MfmPwOI5EI
-        I8qI49DQWxwYeDhJLnUY1AUFQ8VxnEmhUIj/A7nUoe5fouy03kA6Jw4AAAAASUVORK5CYII=
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACGElEQVQ4T2P4//8/AyWYIs0g
+        ixk0G88wGHRdZTCbdJfBeuYTBvt5Lz2AeKbd3BcMIGzYcx2OQeq0m88xqNUcZ1CpPALGqAbMeOwBNOQM
+        FDOYTLhNggET73gAXXFm5tP//0G0cd9NFM0gl+B0gX7nFQ+gJFhz9/U//0FsJHwayN4GxL1AdaYYXtBo
+        OO0BDIcz0x///1+078v/qmPf/jed+/G/8eyP/w1nfvyvP/39f/mRzz+TN798Y9V/5TJQbSUwDLjgYaBU
+        fujM5Pt//2dseY+CEze8/h+y/PF/z3m3/jvPuPrfcdql/17zb/wx7T57F6inUqFkP4N80V4GBpn8XR7S
+        eTvPdF379T9t07v/6Ts+/g/b+eG/w6Y3/63Xv/5vvvbVf8PVr/5rr3j5X2XJi/+aS5//ka86fFkqd4ep
+        ZPY2BgagZgbR1A0eIinrz+Sc+fVfZ++f/yA2DIumbTwrlrf9okTlweuSbeceCC948VF4+oPXQPleIGZg
+        4DOPZeD3bmbgi1nuwRu97IzR4f//QbRgwmoGoaS1DPyxK1iAWBCINYDYHSjXy5uz/SyQ3gbEDHDALK7J
+        wGZf4cERMv8MCDOLaSAkkVhsukEgdVXIahiB8qxAzAXEAsyG8SHM1sULgWwVINYEYj0gNgJiY2QMVAOy
+        XgFkNsgAZqghHECaG4j5gVgIiEWBWByIJYFYCgsWoDwzUZKVQXoB+7/02cSOHsEAAAAASUVORK5CYII=
 </value>
   </data>
   <data name="color" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2415,18 +2391,22 @@
         RaQn6HMAAAAASUVORK5CYII=
 </value>
   </data>
-  <data name="document" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="cross-circle-frame" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABp0lEQVQ4T42SzUoCYRSGz1ba
-        tahVC0FbSNCiRdIiIQgSKooMWrhxUSk6yIgoVhq06QK6BbuANl5A11CLVlGgRUjl//h7es/gCYIa++CB
-        meE8L+c7cyhUKJCwf36+BY4m4NnL52n35IR2cjkbkg9jjluDAX90u/zWbnO52eTnRoOf6nWbm9tbRt0x
-        8P4IkJcx0Uavx1WIL7UaP1ar/PD6yveVCt+Vy3xdKrEc1EaB97uD7WyWxsSaCHhvtX4NuSoWWfEGg2eA
-        BNpMp5V4u9/nT7T/V4h0IteBE1ePNkxTSXQwg3qn4xgiAXAS6tG6YSiGhYCmZTmGyGDhGOrRWiymJHvD
-        IbcxB6cQ+TtwkurR6uGhYvYRYGEOTiFvuCIcUz1aiUSU1GA04i6u4RQiewInpR4th8NKeogA6cIppI4r
-        wkmrR0sHB0pmhEUZIMApRJYNTkY98gQCtBgKCVnZtBG6cAppYUZSK4649pnz+2k+GDy1d3VCiCyb1Iqj
-        x4WHmVm//0ID7BAgM5HBypXkF8uedPEuteIAcWkaLLjc7tSUz3f5H6RWHHG/API/kG3WfDzsAAAAAElF
-        TkSuQmCC
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACw0lEQVQ4T22SXUhTYRjHXxI5
+        LG+UmWNSiAoLvFBJRZhswZHZUNyHU7tRU7ILZXThbpwM+7gQL6OMWiLTE4gfS01DJDJnq6a1dtxaR3Nz
+        ExVZBl504+XT+7wcQaMHfjsPz/P/vTsvHGI2m4nFYiENDQ3EZrORxsbGS01NTXoK1m0Z7PW4wwxm0UGX
+        /cgHcHSpczgcvWtra5GjoyM4PDxkYB8IBCI9PT29mKEHcP8ewFmt1nqPxzOGwveJCfjscMAyzzOwj9DZ
+        wcE+jIyMjGGWHsCxNzCZTMh1uhCSySSsdnSAaDTCL/r8093NSLW3Q6imhu3i8Ri43W4BHXRJXV2dym63
+        u3Z3k/CurRV+2myAlWhuPgfOfphMLLO1tQVdXV0udInRaORXVt5HPw6/gC/V1Uw+rW8GAyBny6/Tgd/9
+        HBYW5qPoEoPB0IKvtdjZCZLZDNOFhSx/cnICqVQKEokExGIx2NnZgeGsLFgsLmbZYPAroEt4nreLogiv
+        KiogUlsLSzQwqlRCKBSCcDgMkiTRe8fBQ2WBMpOXx7J+vx/QJXq9/m4wGITJsjJYr6qCmexs8NLgWXlv
+        b4/NkNdqNcv6fD5Al2i12g5R3ICZtluwWlQES/+RT78F3L1RqVjW5/sA6JLKysobU1PezbePn8JcQcG5
+        f56jAoIf0vHxMWM6NxeWHg2BxyNsokvKy8vVVqttIBSKwqTJAkJODrvzIhU3ZLBHWaDXw8z6+gZYLNYB
+        dElpaSkpKSkx9vc/9IbDMXhZWw9DmZnwiUpRGexxhjtR3AaX64EXHXSJSqUi+fn5Co1G0+J03p+VpANY
+        fjYKws1WGFTnMrDHmSTtg9N5bxaz6KCLdYFykeO4y0qlslWr1T0ZH5+Pb2//hrPgDHeYodkr6MguSaON
+        kqKhXEtPT+cVCsWdjIyMPsqgTB/OcIcZylXZSfsLjyUbBUyIGBQAAAAASUVORK5CYII=
 </value>
   </data>
   <data name="funnel" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2474,19 +2454,23 @@
         SUVORK5CYII=
 </value>
   </data>
-  <data name="icon_zoom_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_ctxarrow" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIZfAHaFlJ2Sh9HW3Ojt8uDPvuPp79Tg5fP19uzw9O3x9OLo7t3l7PP1956foLa2t52d
-        nZ2dnM/R0tPU1ZKSk6SmqPX2987P0NHT1vDz9eDl6b29veTn6dzg5KqsreTo7KKkpsbZ26enqNba3e/y
-        9b+/wJubm7zEy4eHh7rH09Lc5tbY2tfg6M/OzvHz9sXHysvMzsrKypKTk9vd4LGwsKymoP///4KCgra8
-        wvDy87q7vdTZ3cvO0MvT28XFxeDj5a2trczT2+zw8+jp6uPl5tTd5uTo683V3Le4ucjKzLa8wcLDw7q/
-        w/T2983X4evt76GgoOTq7/n6+u/x9K2vsNjh6dTa4LSzs8vR2fHz9ba3uO3v8c/S1PH09szLy/L09QAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
-        AABfACwAAAAAEAAQAAAIqwC/CGRh5cmMLgITAkj4pYcEGRxEvNDAcKFAJT60eDkgxYOOLF8AiBQJI8KB
-        GlEYjAgCZQkJgRZ/DKngBAsGBAMUXHkAUyAEHEyKZEiQcwGREwy/hBDCgAvRAgaoAJlgYiSAHBZa4IQK
-        IsWNDklVONgwoMCCJiiMfNiS9AsSBy6qrOCRhEKDtgIvHClhI8aUHQ0CEMDbVkAAwYSTGkacOOHiwY0F
-        GqYR2bHAgAA7
+        R0lGODlhBAAIAIcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/////
+        /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm
+        mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD/
+        /zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZ
+        MzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA
+        mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ
+        /2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkz
+        M5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM
+        mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz
+        /8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/
+        M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m
+        mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP//
+        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQAAAAAACwAAAAABAAIAAAIFAABPBgIQOCDggIRKlR40KDBBwEB
+        ADs=
 </value>
   </data>
   <data name="icon_selectwithin_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2513,16 +2497,19 @@
         QmCC
 </value>
   </data>
-  <data name="icon_invokescript" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="icon_panup_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
-        R0lGODlhEAAQAIU6AEtypf///9bn92+wPq3D3hExZKq+r3ugdmupO1WHSD14K7fH3Jiymb7M37HMxlmP
-        RFeLTVyTSVuQRY/SS6DfUZjYTl6fN1iORJ6xxny6Qn+og4jHR5vbTzJpMpvbUIjGR3Gad4/RS4nISHvB
-        RIrOSXCzP5/eUaDeUJ7dUJPVTYfKSIbLSIDGRnWPsoLHR2WkOT95LD11Pp3cUJPVTIPCRZ6+rIPDRWak
-        OZfYTnGzQAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAA6ACwAAAAAEAAQ
-        AAAIuAB1CNSBAYDBgwgxDNRhsEGAhxADNACwEMBEARgzYqQ4EEAAhCA5CvRIoKRJAgUWGjgQAwYEDQ4y
-        ohzIQAKCATJEIIhQA+NMHQYkZBgQYAAFChkixPx5AMEJokVRmECgQcDPBB84QC3qYQMEqyl1KKiAY2vR
-        CgoItAibgEaKrSFm2OhQoMACgQdeTICqgsSEGyAW3BVo4MEAoixcrBjwwMBCgQwuWMgxooSFCwweD1yZ
-        QEGCA441BwQAOw==
+        R0lGODlhEAAQAIZuAJumsOTY2MS5uK+2vcW5uJumstrOzsi9vOHV1eHU1ZunsuXZ2dve4d7S0aaxvuTX
+        2ObZ2aaxvePY2NnNzODU0+HT1Ofb2sTJ0c7Jyfjz9J+rttvPztrPzpumsdbS0pqmsdfR0dbS0aSvupum
+        s9zPz9/T08/ExMzFxNbKydfOzdXJyqOuutjMy9zQz8fP1tvPz97R0dLLytfLysG2ttPQ08vEw6Ouucq9
+        vs/Dw6eyvuLW1eXX1+TY1+DW1sa8u+LV1vj09dTQ0NPHx8i/v9fKy+PX1pynsc3BwaSvu+fZ2tTIx+PX
+        18m9vJqlsNLMzMK4t8zAv9zQ0P///9TR0KGsuObY2Mu/v6CrtqSwu6mxu8m/vubZ2pqmst7T0tXKydXJ
+        yc/Jyca9vcbL0si8u7e9xK+3v5+rt8zDw9PHxtjPztrX1+fa28/S2NTMzAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB
+        AABuACwAAAAAEAAQAAAIxADdCBxIcKCRgggHMgDAQOCLAARSgEE4AMAANz2gcIAgwIIWNQUBCKyxgACJ
+        BwLWnAlCUKSbEyYCCDDAQ8CWLm0GunTjA00VAhseCEkiIUbCGS0CKKFQIcECCSESjgmwpASFHzsCpCl4
+        JAqCGxMqIEigowgEGgRBPGnQAIcKGQZgGMjA5uJAD0NQTPDC4gsRIGIimClT0ImVAweYSLmgIQKWK1kQ
+        TsEQxoWCESIcrOCSUCCZAgWaUMlho7NAJAU+dFDgICAAOw==
 </value>
   </data>
   <data name="clipboard-paste" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2560,8 +2547,24 @@
         bwAAAABJRU5ErkJggg==
 </value>
   </data>
-  <data name="magnifier-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\magnifier-left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="layers-stack-arrange-back" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAC20lEQVQ4T4WQa0hTYRjHz5c+
+        RV+iog9dIOmKFGYEfakgiyAkQfqQIeYNK8TEvGDYBbpgUFEjB1oLTGXOtebmdG5q25w7c21ubi53OdvZ
+        dnY7u29uK4Tg7X1XyhCpF36cc3if/+/Pc7DDZa+x4o6pHDVPw1jts0h53fMoCQH/gUSz62EkONuJYxVd
+        FClQJhPuSFbqCmcmNwPdoRk0my/YByVXS1q0oEfiMHWPWuc24+24XS420HwylJGU3jWDdcHJdmmZzBwe
+        Hcdp4Apnw45g2r8RJ50JqKxR6qXQKrMH0qJz1XM5Qa4ZCpioubVvETAlzjhjggjl0zftpKXGEGWH4kcc
+        s/K7NzVWVD4BsLVmrSNmRs0aSxTA5p+wIbsGEUz/UFkjmZ5JRxAGqc4ho8LoTgoOXeYBrKhNUon2ES0E
+        1CZPyif+FgB6MpHVOeMr+dj8K9kXfEsQBqnWfoNC50zwD5RwAXbinrgK7cPX+HAYpIS4H2iIeEZtj6Xy
+        WaJSmSdccwBK3U0snRze8QouCgB2vGWiGu3DUXlwDRGjeEofmF2OpKdMoYTYEIyLFoKxsYVATGmJph6w
+        TQHcFnPd6tXIZy0R3tErMwArbBbVon0+yck5xXLExRJ7gEDrT36e90Xz+WoOJzsGFv1whqx5p1bA55ei
+        ch3AjjUJ69E+jAmbAgbtzDH36oDM+4ur9iZHEPgfppdC6Y4BQxg2+5pZWgODQ0fP3CBI7EjjaAO0DT/m
+        mGZ48z7iw5THxRB4Vt/wKZAPW0aDim4D6BWGwal6PThf43cXXmBVYgdv8+5MLtKDD4eN0o8zTpKDewm2
+        irJvBP4TCjWzpgnRnpuDdRiG7YZsxQoauI1SI815JbT03x/Uy9r7dXhbHugb0Se1Le2tHhLtuMZs3na6
+        qnjL9v0wDw+yvZfahBIjPTKuD7I3A92hmb/NBbnmtYNsyLrzOqvrX6CZrYWll2Bu13oYvvwGlvytQyev
+        aMIAAAAASUVORK5CYII=
+</value>
   </data>
   <data name="icon_copy_disabled" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
@@ -4429,7 +4432,7 @@
         nagM8+uBnL1H396Bua0rYfjwB5D4p3X4gwOzAAAAAElFTkSuQmCC
 </value>
   </data>
-  <data name="arrow-split" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-split.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="document-search-result" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\document-search-result.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
 </root>
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Editors/ResourceEditorServiceBase.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/ResourceEditorServiceBase.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/ResourceEditorServiceBase.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -32,7 +32,7 @@
 namespace Maestro.Editors
 {
     /// <summary>
-    /// A base class for providing editor services
+    /// A base class for providing editor services for a given resource being edited
     /// </summary>
     public abstract class ResourceEditorServiceBase : IEditorService
     {
@@ -50,6 +50,17 @@
         /// </summary>
         /// <param name="resourceID">The resource ID.</param>
         /// <param name="conn">The conn.</param>
+        /// <remarks>
+        /// The editor service does not do live edits of the resource you pass in to this constructor
+        /// 
+        /// When an editor is modifying a resource, it is not modifying the resource you specify here. It is instead modifying a
+        /// session-based copy of the resource that is created internally by the editor service. On a save action (a call to 
+        /// <see cref="M:Maestro.Editors.ResourceEditorServiceBase.Save"/>), the session-based copy is copied back into the resource 
+        /// id you specified, overwriting its contents and data files.
+        /// 
+        /// This provides an extra level of safety against unintentional edits, as such edits will only apply to the session-copy, only
+        /// being committed back to the resource id you specified on an explicit save action.
+        /// </remarks>
         protected ResourceEditorServiceBase(string resourceID, IServerConnection conn)
         {
             this.IsNew = ResourceIdentifier.IsSessionBased(resourceID);

Added: trunk/Tools/Maestro/Maestro.Editors/Resources/document-search-result.png
===================================================================
(Binary files differ)


Property changes on: trunk/Tools/Maestro/Maestro.Editors/Resources/document-search-result.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.18034
+//     Runtime Version:4.0.30319.18047
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -439,6 +439,33 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Displays the current map extents.
+        /// </summary>
+        internal static string Desc_GetExtents {
+            get {
+                return ResourceManager.GetString("Desc_GetExtents", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gets the current map as a KML document.
+        /// </summary>
+        internal static string Desc_GetMapKml {
+            get {
+                return ResourceManager.GetString("Desc_GetMapKml", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Zoom to a specified scale.
+        /// </summary>
+        internal static string Desc_ZoomToScale {
+            get {
+                return ResourceManager.GetString("Desc_ZoomToScale", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Diverging.
         /// </summary>
         internal static string DivergingName {
@@ -583,6 +610,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Could not calculate the extents of the Feature Source. Preview is not possible.
+        /// </summary>
+        internal static string FailedToCalculateFeatureSourceExtents {
+            get {
+                return ResourceManager.GetString("FailedToCalculateFeatureSourceExtents", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Failed to enumerate data stores. Reason: {0}.
         /// </summary>
         internal static string FailEnumDataStores {
@@ -1319,6 +1355,51 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Extra Tools.
+        /// </summary>
+        internal static string Label_ExtraTools {
+            get {
+                return ResourceManager.GetString("Label_ExtraTools", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Get Extents.
+        /// </summary>
+        internal static string Label_GetExtents {
+            get {
+                return ResourceManager.GetString("Label_GetExtents", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Get KML.
+        /// </summary>
+        internal static string Label_GetMapKml {
+            get {
+                return ResourceManager.GetString("Label_GetMapKml", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tools.
+        /// </summary>
+        internal static string Label_Tools {
+            get {
+                return ResourceManager.GetString("Label_Tools", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Zoom to Scale.
+        /// </summary>
+        internal static string Label_ZoomToScale {
+            get {
+                return ResourceManager.GetString("Label_ZoomToScale", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Last Updated: .
         /// </summary>
         internal static string LastUpdated {
@@ -1481,6 +1562,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to No registered previewer for connection: {0}.
+        /// </summary>
+        internal static string NoRegisteredPreviewerForProvider {
+            get {
+                return ResourceManager.GetString("NoRegisteredPreviewerForProvider", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to You have selected to restore the package at another location, but not entered one.
         ///This will cause the package to be restored a the root of the resource tree.
         ///Are you sure this is what you want?.
@@ -1681,6 +1771,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Preview Map.
+        /// </summary>
+        internal static string PreviewMap {
+            get {
+                return ResourceManager.GetString("PreviewMap", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Preview Completed in {0}ms.
         /// </summary>
         internal static string PreviewQueryElapsed {
@@ -1708,6 +1807,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Preparing resource preview.
+        /// </summary>
+        internal static string PrgPreparingResourcePreview {
+            get {
+                return ResourceManager.GetString("PrgPreparingResourcePreview", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Processed: {0}.
         /// </summary>
         internal static string ProcessedItem {
@@ -2054,6 +2162,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to The site version of this current connection is not known to support watermarks.
+        /// </summary>
+        internal static string SiteVersionDoesntSupportWatermarks {
+            get {
+                return ResourceManager.GetString("SiteVersionDoesntSupportWatermarks", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to {0} spatial contexts found.
         /// </summary>
         internal static string SpatialContextsFound {
@@ -2461,6 +2578,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to The resource type cannot be previewed.
+        /// </summary>
+        internal static string UnpreviewableResourceType {
+            get {
+                return ResourceManager.GetString("UnpreviewableResourceType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Invoking MgCooker is not supported for this connection type: {0}.
         /// </summary>
         internal static string UnsupportedConnectionType {

Modified: trunk/Tools/Maestro/Maestro.Editors/Strings.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Strings.resx	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.Editors/Strings.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -1464,4 +1464,46 @@
   <data name="LoadingFeatureClasses" xml:space="preserve">
     <value>Loading Feature Classes</value>
   </data>
+  <data name="Desc_GetExtents" xml:space="preserve">
+    <value>Displays the current map extents</value>
+  </data>
+  <data name="Desc_GetMapKml" xml:space="preserve">
+    <value>Gets the current map as a KML document</value>
+  </data>
+  <data name="Desc_ZoomToScale" xml:space="preserve">
+    <value>Zoom to a specified scale</value>
+  </data>
+  <data name="FailedToCalculateFeatureSourceExtents" xml:space="preserve">
+    <value>Could not calculate the extents of the Feature Source. Preview is not possible</value>
+  </data>
+  <data name="Label_ExtraTools" xml:space="preserve">
+    <value>Extra Tools</value>
+  </data>
+  <data name="Label_GetExtents" xml:space="preserve">
+    <value>Get Extents</value>
+  </data>
+  <data name="Label_GetMapKml" xml:space="preserve">
+    <value>Get KML</value>
+  </data>
+  <data name="Label_Tools" xml:space="preserve">
+    <value>Tools</value>
+  </data>
+  <data name="Label_ZoomToScale" xml:space="preserve">
+    <value>Zoom to Scale</value>
+  </data>
+  <data name="PreviewMap" xml:space="preserve">
+    <value>Preview Map</value>
+  </data>
+  <data name="PrgPreparingResourcePreview" xml:space="preserve">
+    <value>Preparing resource preview</value>
+  </data>
+  <data name="SiteVersionDoesntSupportWatermarks" xml:space="preserve">
+    <value>The site version of this current connection is not known to support watermarks</value>
+  </data>
+  <data name="UnpreviewableResourceType" xml:space="preserve">
+    <value>The resource type cannot be previewed</value>
+  </data>
+  <data name="NoRegisteredPreviewerForProvider" xml:space="preserve">
+    <value>No registered previewer for connection: {0}</value>
+  </data>
 </root>
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.Designer.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.Designer.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -37,6 +37,10 @@
             this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
             this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.debugToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.runtimeMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.toolStrip1 = new System.Windows.Forms.ToolStrip();
             this.btnNewMap = new System.Windows.Forms.ToolStripButton();
             this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
@@ -46,8 +50,6 @@
             this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
             this.btnMapProperties = new System.Windows.Forms.ToolStripButton();
             this.rootPanel = new System.Windows.Forms.Panel();
-            this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.menuStrip1.SuspendLayout();
             this.toolStrip1.SuspendLayout();
             this.SuspendLayout();
@@ -56,6 +58,7 @@
             // 
             this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.fileToolStripMenuItem,
+            this.debugToolStripMenuItem,
             this.helpToolStripMenuItem});
             resources.ApplyResources(this.menuStrip1, "menuStrip1");
             this.menuStrip1.Name = "menuStrip1";
@@ -111,6 +114,32 @@
             resources.ApplyResources(this.exitToolStripMenuItem, "exitToolStripMenuItem");
             this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
             // 
+            // debugToolStripMenuItem
+            // 
+            this.debugToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.runtimeMapToolStripMenuItem});
+            this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
+            resources.ApplyResources(this.debugToolStripMenuItem, "debugToolStripMenuItem");
+            // 
+            // runtimeMapToolStripMenuItem
+            // 
+            this.runtimeMapToolStripMenuItem.Name = "runtimeMapToolStripMenuItem";
+            resources.ApplyResources(this.runtimeMapToolStripMenuItem, "runtimeMapToolStripMenuItem");
+            this.runtimeMapToolStripMenuItem.Click += new System.EventHandler(this.runtimeMapToolStripMenuItem_Click);
+            // 
+            // helpToolStripMenuItem
+            // 
+            this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.aboutToolStripMenuItem});
+            this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+            resources.ApplyResources(this.helpToolStripMenuItem, "helpToolStripMenuItem");
+            // 
+            // aboutToolStripMenuItem
+            // 
+            this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+            resources.ApplyResources(this.aboutToolStripMenuItem, "aboutToolStripMenuItem");
+            this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+            // 
             // toolStrip1
             // 
             this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -179,19 +208,6 @@
             resources.ApplyResources(this.rootPanel, "rootPanel");
             this.rootPanel.Name = "rootPanel";
             // 
-            // helpToolStripMenuItem
-            // 
-            this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.aboutToolStripMenuItem});
-            this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
-            resources.ApplyResources(this.helpToolStripMenuItem, "helpToolStripMenuItem");
-            // 
-            // aboutToolStripMenuItem
-            // 
-            this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
-            resources.ApplyResources(this.aboutToolStripMenuItem, "aboutToolStripMenuItem");
-            this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
-            // 
             // MainForm
             // 
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
@@ -231,5 +247,7 @@
         private System.Windows.Forms.ToolStripButton btnMapProperties;
         private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
         private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem debugToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem runtimeMapToolStripMenuItem;
     }
 }
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -124,8 +124,9 @@
 
         private void DoSave()
         {
-            _mapEditor.SyncMap();
-            _mapEditor.EditorService.Save();
+            _mapEditor.SyncMap();                       //RuntimeMap to IMapDefinition
+            _mapEditor.EditorService.SyncSessionCopy(); //IMapDefinition to session-copy
+            _mapEditor.EditorService.Save();            //Session-copy to original resource
             EvaluateCommandStates();
         }
 
@@ -135,8 +136,9 @@
             {
                 if (picker.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                 {
-                    _mapEditor.SyncMap();
-                    _mapEditor.EditorService.SaveAs(picker.ResourceID);
+                    _mapEditor.SyncMap();                               //RuntimeMap to IMapDefinition
+                    _mapEditor.EditorService.SyncSessionCopy();         //IMapDefinition to session-copy
+                    _mapEditor.EditorService.SaveAs(picker.ResourceID); //Session-copy to specified resource
                 }
             }
             EvaluateCommandStates();
@@ -183,5 +185,20 @@
         {
             new AboutDialog().ShowDialog();
         }
+
+        private void runtimeMapToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            using (var form = new Form())
+            {
+                form.Text = "Runtime Map";
+                var propGrid = new PropertyGrid();
+                propGrid.Dock = DockStyle.Fill;
+                form.Controls.Add(propGrid);
+
+                propGrid.SelectedObject = _mapEditor.Map;
+
+                form.ShowDialog();
+            }
+        }
     }
 }

Modified: trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.resx	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.LiveMapEditor/MainForm.resx	2013-05-21 16:34:18 UTC (rev 7514)
@@ -121,43 +121,6 @@
     <value>17, 17</value>
   </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
-    <value>37, 20</value>
-  </data>
-  <data name="fileToolStripMenuItem.Text" xml:space="preserve">
-    <value>File</value>
-  </data>
-  <data name="helpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
-    <value>44, 20</value>
-  </data>
-  <data name="helpToolStripMenuItem.Text" xml:space="preserve">
-    <value>Help</value>
-  </data>
-  <data name="menuStrip1.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="menuStrip1.Size" type="System.Drawing.Size, System.Drawing">
-    <value>1008, 24</value>
-  </data>
-  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="menuStrip1.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="menuStrip1.Text" xml:space="preserve">
-    <value>menuStrip1</value>
-  </data>
-  <data name=">>menuStrip1.Name" xml:space="preserve">
-    <value>menuStrip1</value>
-  </data>
-  <data name=">>menuStrip1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>menuStrip1.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name=">>menuStrip1.ZOrder" xml:space="preserve">
-    <value>2</value>
-  </data>
   <data name="newMapToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
     <value>130, 22</value>
   </data>
@@ -170,6 +133,7 @@
   <data name="openMapToolStripMenuItem.Text" xml:space="preserve">
     <value>Open Map</value>
   </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="saveToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
     <value>False</value>
   </data>
@@ -197,6 +161,63 @@
   <data name="exitToolStripMenuItem.Text" xml:space="preserve">
     <value>Exit</value>
   </data>
+  <data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>37, 20</value>
+  </data>
+  <data name="fileToolStripMenuItem.Text" xml:space="preserve">
+    <value>File</value>
+  </data>
+  <data name="runtimeMapToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>152, 22</value>
+  </data>
+  <data name="runtimeMapToolStripMenuItem.Text" xml:space="preserve">
+    <value>Runtime Map</value>
+  </data>
+  <data name="debugToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>54, 20</value>
+  </data>
+  <data name="debugToolStripMenuItem.Text" xml:space="preserve">
+    <value>Debug</value>
+  </data>
+  <data name="debugToolStripMenuItem.Visible" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="aboutToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>107, 22</value>
+  </data>
+  <data name="aboutToolStripMenuItem.Text" xml:space="preserve">
+    <value>About</value>
+  </data>
+  <data name="helpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+    <value>44, 20</value>
+  </data>
+  <data name="helpToolStripMenuItem.Text" xml:space="preserve">
+    <value>Help</value>
+  </data>
+  <data name="menuStrip1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="menuStrip1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>1008, 24</value>
+  </data>
+  <data name="menuStrip1.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="menuStrip1.Text" xml:space="preserve">
+    <value>menuStrip1</value>
+  </data>
+  <data name=">>menuStrip1.Name" xml:space="preserve">
+    <value>menuStrip1</value>
+  </data>
+  <data name=">>menuStrip1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>menuStrip1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name=">>menuStrip1.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
   <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>132, 17</value>
   </metadata>
@@ -309,12 +330,6 @@
   <data name=">>rootPanel.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
-  <data name="aboutToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
-    <value>152, 22</value>
-  </data>
-  <data name="aboutToolStripMenuItem.Text" xml:space="preserve">
-    <value>About</value>
-  </data>
   <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
@@ -872,6 +887,30 @@
   <data name=">>exitToolStripMenuItem.Type" xml:space="preserve">
     <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
+  <data name=">>debugToolStripMenuItem.Name" xml:space="preserve">
+    <value>debugToolStripMenuItem</value>
+  </data>
+  <data name=">>debugToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>runtimeMapToolStripMenuItem.Name" xml:space="preserve">
+    <value>runtimeMapToolStripMenuItem</value>
+  </data>
+  <data name=">>runtimeMapToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>helpToolStripMenuItem.Name" xml:space="preserve">
+    <value>helpToolStripMenuItem</value>
+  </data>
+  <data name=">>helpToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>aboutToolStripMenuItem.Name" xml:space="preserve">
+    <value>aboutToolStripMenuItem</value>
+  </data>
+  <data name=">>aboutToolStripMenuItem.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
   <data name=">>btnNewMap.Name" xml:space="preserve">
     <value>btnNewMap</value>
   </data>
@@ -914,18 +953,6 @@
   <data name=">>btnMapProperties.Type" xml:space="preserve">
     <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name=">>helpToolStripMenuItem.Name" xml:space="preserve">
-    <value>helpToolStripMenuItem</value>
-  </data>
-  <data name=">>helpToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>aboutToolStripMenuItem.Name" xml:space="preserve">
-    <value>aboutToolStripMenuItem</value>
-  </data>
-  <data name=">>aboutToolStripMenuItem.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
   <data name=">>$this.Name" xml:space="preserve">
     <value>MainForm</value>
   </data>

Modified: trunk/Tools/Maestro/Maestro.LiveMapEditor/Program.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.LiveMapEditor/Program.cs	2013-05-21 16:18:00 UTC (rev 7513)
+++ trunk/Tools/Maestro/Maestro.LiveMapEditor/Program.cs	2013-05-21 16:34:18 UTC (rev 7514)
@@ -23,11 +23,21 @@
 using System.Windows.Forms;
 using Maestro.Shared.UI;
 using OSGeo.MapGuide.ExtendedObjectModels;
+using Maestro.Editors.Preview;
+using System.Diagnostics;
 
 namespace Maestro.LiveMapEditor
 {
     static class Program
     {
+        class OurUrlLauncher : IUrlLauncherService
+        {
+            public void OpenUrl(string url)
+            {
+                Process.Start(url);
+            }
+        }
+
         /// <summary>
         /// The main entry point for the application.
         /// </summary>
@@ -39,6 +49,13 @@
             Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
             Application.SetCompatibleTextRenderingDefault(false);
 
+            //Register previewers
+            var urlLauncher = new OurUrlLauncher();
+            ResourcePreviewerFactory.RegisterPreviewer("Maestro.Http", new LocalMapPreviewer(new DefaultResourcePreviewer(urlLauncher), urlLauncher)); //NOXLATE
+            //A stub previewer does nothing, but will use local map previews for applicable resources if the configuration
+            //property is set
+            ResourcePreviewerFactory.RegisterPreviewer("Maestro.LocalNative", new LocalMapPreviewer(new StubPreviewer(), urlLauncher)); //NOXLATE
+
             var login = new Login.LoginDialog();
             if (login.ShowDialog() == DialogResult.OK)
             {



More information about the mapguide-commits mailing list