[mapguide-commits] r6707 - in trunk/Tools/Maestro: . Maestro Maestro.AddIn.ExtendedObjectModels Maestro.AddIn.FdoToolbox Maestro.AddIn.GeoRest Maestro.AddIn.Local Maestro.AddIn.Scripting Maestro.AddIn.Scripting/Commands Maestro.AddIn.Scripting/UI Maestro.AddInManager Maestro.AddInManager/Properties Maestro.Base Maestro.Base/UI/Preferences Thirdparty/SharpDevelop/ICSharpCode.Core.WinForms Thirdparty/SharpDevelop/ICSharpCode.TextEditor

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Tue May 29 06:59:30 PDT 2012


Author: jng
Date: 2012-05-29 06:59:28 -0700 (Tue, 29 May 2012)
New Revision: 6707

Added:
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.Designer.cs
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.cs
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.resx
   trunk/Tools/Maestro/Maestro.AddInManager/
   trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.cs
   trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.resx
   trunk/Tools/Maestro/Maestro.AddInManager/AddInControl.cs
   trunk/Tools/Maestro/Maestro.AddInManager/AddInManger.addin
   trunk/Tools/Maestro/Maestro.AddInManager/Commands.cs
   trunk/Tools/Maestro/Maestro.AddInManager/InstallableAddIn.cs
   trunk/Tools/Maestro/Maestro.AddInManager/Maestro.AddInManager.csproj
   trunk/Tools/Maestro/Maestro.AddInManager/ManagerForm.cs
   trunk/Tools/Maestro/Maestro.AddInManager/Properties/
   trunk/Tools/Maestro/Maestro.AddInManager/Properties/AssemblyInfo.cs
   trunk/Tools/Maestro/Maestro.AddInManager/Strings.Designer.cs
   trunk/Tools/Maestro/Maestro.AddInManager/Strings.resx
Modified:
   trunk/Tools/Maestro/Maestro.AddIn.ExtendedObjectModels/Manifest.addin
   trunk/Tools/Maestro/Maestro.AddIn.FdoToolbox/Manifest.addin
   trunk/Tools/Maestro/Maestro.AddIn.GeoRest/Manifest.addin
   trunk/Tools/Maestro/Maestro.AddIn.Local/Maestro.AddIn.Local.csproj
   trunk/Tools/Maestro/Maestro.AddIn.Local/Manifest.addin
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/Commands/StartupCommand.cs
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/Maestro.AddIn.Scripting.csproj
   trunk/Tools/Maestro/Maestro.AddIn.Scripting/Manifest.addin
   trunk/Tools/Maestro/Maestro.Base/Maestro.Base.addin
   trunk/Tools/Maestro/Maestro.Base/UI/Preferences/ConfigProperties.cs
   trunk/Tools/Maestro/Maestro/Maestro_All.sln
   trunk/Tools/Maestro/Maestro/changelog.txt
   trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj
   trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj
Log:
#2012: Incorporate an AddIn Manager into Maestro. This is to facilitate installation and management of 3rd party or out-of-band Maestro AddIns. This is a verbatim copy of the one from FDO Toolbox, which in turn is a verbatim copy of the SharpDevelop one.
#2010: Expose preference to toggle visibility of the IronPython console

Modified: trunk/Tools/Maestro/Maestro/Maestro_All.sln
===================================================================
--- trunk/Tools/Maestro/Maestro/Maestro_All.sln	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro/Maestro_All.sln	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,7 +1,6 @@
 
 Microsoft Visual Studio Solution File, Format Version 11.00
 # Visual Studio 2010
-# SharpDevelop 4.2.0.8783
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro", "Maestro.csproj", "{E0C36475-2B70-4F6D-ACE0-8943167806DC}"
 	ProjectSection(ProjectDependencies) = postProject
 		{B3A2B816-9F41-4857-A111-09D2DF2550D6} = {B3A2B816-9F41-4857-A111-09D2DF2550D6}
@@ -138,6 +137,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "..\Thirdparty\SharpDevelop\ICSharpCode.TextEditor\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maestro.AddInManager", "..\Maestro.AddInManager\Maestro.AddInManager.csproj", "{9CC51643-37D6-4B8F-A0EA-E7606AA561EB}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -316,10 +317,14 @@
 		{C75532C4-765B-418E-B09B-46D36B2ABDB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{C75532C4-765B-418E-B09B-46D36B2ABDB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C75532C4-765B-418E-B09B-46D36B2ABDB1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9CC51643-37D6-4B8F-A0EA-E7606AA561EB}.Debug|Any CPU.ActiveCfg = Debug|x86
+		{9CC51643-37D6-4B8F-A0EA-E7606AA561EB}.Debug|Any CPU.Build.0 = Debug|x86
+		{9CC51643-37D6-4B8F-A0EA-E7606AA561EB}.Release|Any CPU.ActiveCfg = Release|x86
+		{9CC51643-37D6-4B8F-A0EA-E7606AA561EB}.Release|Any CPU.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

Modified: trunk/Tools/Maestro/Maestro/changelog.txt
===================================================================
--- trunk/Tools/Maestro/Maestro/changelog.txt	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro/changelog.txt	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,5 +1,6 @@
 5.0 Beta 2
 ----------
+ - New AddIn Manager to manage and install thirdparty add-ins for Maestro
  - Upgrade SharpDevelop Core to 4.2
  - Revamped XML editor with ICSharpCode.TextEditor control
  - MgCooker tiling classes now part of the MaestroAPI

Modified: trunk/Tools/Maestro/Maestro.AddIn.ExtendedObjectModels/Manifest.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.ExtendedObjectModels/Manifest.addin	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.ExtendedObjectModels/Manifest.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,7 +1,7 @@
 <AddIn name="Maestro.AddIn.ExtendedObjectModels"
        author="Jackie Ng"
        url="http://trac.osgeo.org/mapguide/wiki/maestro"
-       description="MapGuide Maestro AddIn to support extended versions of the core MapGuide resource schemas"
+       description="MapGuide Maestro AddIn to support additional versions of the core MapGuide resource schemas"
        addInManagerHidden="preinstalled">
 
     <Manifest>

Modified: trunk/Tools/Maestro/Maestro.AddIn.FdoToolbox/Manifest.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.FdoToolbox/Manifest.addin	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.FdoToolbox/Manifest.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,7 +1,7 @@
 <AddIn name="Maestro.AddIn.FdoToolbox"
        author="Jackie Ng"
        url="http://trac.osgeo.org/mapguide/wiki/maestro"
-       description="FDO Toolbox AddIn for MapGuide Maestro"
+       description="AddIn for MapGuide Maestro for performing feature manipulation operations"
        addInManagerHidden="preinstalled">
 
     <Manifest>

Modified: trunk/Tools/Maestro/Maestro.AddIn.GeoRest/Manifest.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.GeoRest/Manifest.addin	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.GeoRest/Manifest.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,7 +1,7 @@
 <AddIn name="Maestro.AddIn.GeoRest"
        author="Jackie Ng"
        url="http://trac.osgeo.org/mapguide/wiki/maestro"
-       description="GeoRest AddIn for MapGuide Maestro"
+       description="MapGuide Maestro AddIn for communicating with and configuring a GeoRest server"
        addInManagerHidden="preinstalled">
 
     <Manifest>

Modified: trunk/Tools/Maestro/Maestro.AddIn.Local/Maestro.AddIn.Local.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Local/Maestro.AddIn.Local.csproj	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.Local/Maestro.AddIn.Local.csproj	2012-05-29 13:59:28 UTC (rev 6707)
@@ -333,6 +333,7 @@
     </Content>
     <Content Include="Manifest.addin">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+      <SubType>Designer</SubType>
     </Content>
     <Content Include="MapGuideDesktopUnmanagedApi.dll">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>

Modified: trunk/Tools/Maestro/Maestro.AddIn.Local/Manifest.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Local/Manifest.addin	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.Local/Manifest.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,7 +1,7 @@
 <AddIn name="Maestro.AddIn.Local"
        author="Jackie Ng"
        url="http://trac.osgeo.org/mapguide/wiki/maestro"
-       description="MapGuide Maestro AddIn to support local repository"
+       description="MapGuide Maestro AddIn to support authoring resources in a local mg-desktop repository"
        addInManagerHidden="preinstalled">
 
     <Manifest>

Modified: trunk/Tools/Maestro/Maestro.AddIn.Scripting/Commands/StartupCommand.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/Commands/StartupCommand.cs	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/Commands/StartupCommand.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -7,6 +7,8 @@
 using Maestro.AddIn.Scripting.UI;
 using Maestro.Shared.UI;
 using Maestro.Base.Services;
+using Props = ICSharpCode.Core.PropertyService;
+using Maestro.Base.UI.Preferences;
 
 namespace Maestro.AddIn.Scripting.Commands
 {
@@ -20,7 +22,8 @@
             Workbench.WorkbenchInitialized += (sender, e) =>
             {
                 var mgr = ServiceRegistry.GetService<ViewContentManager>();
-                mgr.OpenContent<IronPythonRepl>(ViewRegion.Bottom);
+                if (Props.Get(IronPythonPreferences.ShowIronPythonConsole, true))
+                    mgr.OpenContent<IronPythonRepl>(ViewRegion.Bottom);
             };
         }
     }

Modified: trunk/Tools/Maestro/Maestro.AddIn.Scripting/Maestro.AddIn.Scripting.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/Maestro.AddIn.Scripting.csproj	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/Maestro.AddIn.Scripting.csproj	2012-05-29 13:59:28 UTC (rev 6707)
@@ -78,6 +78,12 @@
     <Compile Include="Services\ScriptingService.cs" />
     <Compile Include="Services\ScriptingClasses.cs" />
     <Compile Include="UI\IPEWrapper.cs" />
+    <Compile Include="UI\IronPythonPreferences.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UI\IronPythonPreferences.Designer.cs">
+      <DependentUpon>IronPythonPreferences.cs</DependentUpon>
+    </Compile>
     <Compile Include="UI\IronPythonRepl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -126,6 +132,9 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
+    <EmbeddedResource Include="UI\IronPythonPreferences.resx">
+      <DependentUpon>IronPythonPreferences.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="UI\IronPythonRepl.resx">
       <DependentUpon>IronPythonRepl.cs</DependentUpon>
     </EmbeddedResource>

Modified: trunk/Tools/Maestro/Maestro.AddIn.Scripting/Manifest.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/Manifest.addin	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/Manifest.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -1,7 +1,7 @@
 <AddIn name="Maestro.AddIn.Scripting"
        author="Jackie Ng"
        url="http://trac.osgeo.org/mapguide/wiki/maestro"
-       description="Scripting AddIn for MapGuide Maestro"
+       description="MapGuide Maestro AddIn for providing scripting/automation capabilities via the IronPython scripting language"
        addInManagerHidden="preinstalled">
 
     <Manifest>
@@ -18,6 +18,11 @@
         <Class id="Startup" class="Maestro.AddIn.Scripting.Commands.StartupCommand" />
     </Path>
 
+    <!-- Registered preference tabs -->
+    <Path name="/Maestro/Preferences">
+        <Class id="IPyPrefs" class="Maestro.AddIn.Scripting.UI.IronPythonPreferences" />
+    </Path>
+
     <!-- Application-level services -->
     <Path name="/Maestro/ApplicationServices">
         <Class id="ScriptingService" class="Maestro.AddIn.Scripting.Services.ScriptingService" />

Added: trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.Designer.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,60 @@
+namespace Maestro.AddIn.Scripting.UI
+{
+    partial class IronPythonPreferences
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.chkShowOnStartup = new System.Windows.Forms.CheckBox();
+            this.SuspendLayout();
+            // 
+            // chkShowOnStartup
+            // 
+            this.chkShowOnStartup.AutoSize = true;
+            this.chkShowOnStartup.Location = new System.Drawing.Point(22, 21);
+            this.chkShowOnStartup.Name = "chkShowOnStartup";
+            this.chkShowOnStartup.Size = new System.Drawing.Size(105, 17);
+            this.chkShowOnStartup.TabIndex = 0;
+            this.chkShowOnStartup.Text = "Show on Startup";
+            this.chkShowOnStartup.UseVisualStyleBackColor = true;
+            // 
+            // IronPythonPreferences
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.chkShowOnStartup);
+            this.Name = "IronPythonPreferences";
+            this.Size = new System.Drawing.Size(193, 66);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.CheckBox chkShowOnStartup;
+    }
+}

Added: trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,84 @@
+#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 System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Props = ICSharpCode.Core.PropertyService;
+using Maestro.Base.UI.Preferences;
+
+namespace Maestro.AddIn.Scripting.UI
+{
+    public partial class IronPythonPreferences : UserControl, IPreferenceSheet
+    {
+        public IronPythonPreferences()
+        {
+            InitializeComponent();
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+
+            var bShow = Props.Get(ShowIronPythonConsole, true);
+            chkShowOnStartup.Checked = bShow;
+        }
+
+        public string Title
+        {
+            get { return Properties.Resources.Title_IronPython_Console; }
+        }
+
+        public Control ContentControl
+        {
+            get { return this; }
+        }
+
+        public const string ShowIronPythonConsole = "Scripting.ShowIronPythonConsole";
+
+        public bool ApplyChanges()
+        {
+            bool restart = false;
+
+            if (Apply(ShowIronPythonConsole, chkShowOnStartup.Checked))
+                restart = true;
+
+            return restart;
+        }
+
+        private bool Apply<T>(string key, T newValue)
+        {
+            if (Props.Get(key).Equals((object)newValue))
+                return false;
+
+            Props.Set(key, newValue);
+            return true;
+        }
+
+        public void ApplyDefaults()
+        {
+            Props.Set(ShowIronPythonConsole, true);
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddIn.Scripting/UI/IronPythonPreferences.resx	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,120 @@
+<?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>
+</root>
\ No newline at end of file


Property changes on: trunk/Tools/Maestro/Maestro.AddInManager
___________________________________________________________________
Added: svn:ignore
   + bin
obj
*.user


Added: trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,216 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.Core;
+
+namespace ICSharpCode.AddInManager
+{
+	public class AboutForm : System.Windows.Forms.Form
+	{
+		Font boldFont;
+		
+		public AboutForm(AddIn addIn)
+		{
+			//
+			// The InitializeComponent() call is required for Windows Forms designer support.
+			//
+			InitializeComponent();
+			
+			boldFont = new Font(Font, FontStyle.Bold);
+			
+			List<string> titles = new List<string>();
+			List<string> values = new List<string>();
+			
+			this.Text = addIn.Name;
+			closeButton.Text = ResourceService.GetString("Global.CloseButtonText");
+			
+			titles.Add("AddIn name");
+			values.Add(addIn.Name);
+			
+			if (addIn.Manifest.PrimaryVersion != null && addIn.Manifest.PrimaryVersion.ToString() != "0.0.0.0") {
+				titles.Add("Version");
+				values.Add(addIn.Manifest.PrimaryVersion.ToString());
+			}
+			
+			if (addIn.Properties["author"].Length > 0) {
+				titles.Add("Author");
+				values.Add(addIn.Properties["author"]);
+			}
+			
+			if (addIn.Properties["copyright"].Length > 0) {
+				if (!addIn.Properties["copyright"].StartsWith("prj:")) {
+					titles.Add("Copyright");
+					values.Add(addIn.Properties["copyright"]);
+				}
+			}
+			
+			if (addIn.Properties["license"].Length > 0) {
+				titles.Add("License");
+				values.Add(addIn.Properties["license"]);
+			}
+			
+			if (addIn.Properties["url"].Length > 0) {
+				titles.Add("Website");
+				values.Add(addIn.Properties["url"]);
+			}
+			
+			if (addIn.Properties["description"].Length > 0) {
+				titles.Add("Description");
+				values.Add(addIn.Properties["description"]);
+			}
+			
+			titles.Add("AddIn file");
+			values.Add(FileUtility.NormalizePath(addIn.FileName));
+			
+			titles.Add("Internal name");
+			values.Add(addIn.Manifest.PrimaryIdentity);
+			
+			table.RowCount = titles.Count + 1;
+			table.RowStyles.Clear();
+			for (int i = 0; i < titles.Count; i++) {
+				table.RowStyles.Add(new RowStyle(SizeType.AutoSize));
+				AddRow(titles[i], values[i], i);
+			}
+		}
+		
+		protected override void Dispose(bool disposing)
+		{
+			base.Dispose(disposing);
+			if (disposing) {
+				if (boldFont != null)
+					boldFont.Dispose();
+			}
+		}
+		
+		void AddRow(string desc, string val, int rowIndex)
+		{
+			Label descLabel = new Label();
+			descLabel.AutoSize = true;
+			descLabel.Anchor = AnchorStyles.Top | AnchorStyles.Right;
+			descLabel.Font = boldFont;
+			descLabel.Text = StringParser.Parse(desc) + ":";
+			table.Controls.Add(descLabel, 0, rowIndex);
+			
+			Label valLabel;
+			string link = GetLink(val);
+			if (link != null) {
+				LinkLabel linkLabel = new LinkLabel();
+				linkLabel.LinkClicked += delegate {
+					try {
+						System.Diagnostics.Process.Start(link);
+					} catch (Exception ex) {
+						MessageService.ShowMessage(ex.ToString());
+					}
+				};
+				valLabel = linkLabel;
+			} else {
+				valLabel = new Label();
+			}
+			valLabel.AutoSize = true;
+			valLabel.Text = val;
+			table.Controls.Add(valLabel, 1, rowIndex);
+		}
+		
+		string GetLink(string text)
+		{
+			if (text == null)
+				return null;
+			switch (text) {
+				case "GNU General Public License":
+				case "GPL":
+					return "http://www.gnu.org/licenses/gpl.html";
+				case "LGPL":
+				case "GNU Lesser General Public License":
+					return "http://www.gnu.org/licenses/lgpl.html";
+				default:
+					if (text.StartsWith("http://"))
+						return text;
+					if (text.StartsWith("www."))
+						return "http://" + text;
+					return null;
+			}
+		}
+		
+		#region Windows Forms Designer generated code
+		/// <summary>
+		/// This method is required for Windows Forms designer support.
+		/// Do not change the method contents inside the source code editor. The Forms designer might
+		/// not be able to load this method if it was changed manually.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			System.Windows.Forms.Panel bottomPanel;
+			this.closeButton = new System.Windows.Forms.Button();
+			this.table = new System.Windows.Forms.TableLayoutPanel();
+			bottomPanel = new System.Windows.Forms.Panel();
+			bottomPanel.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// bottomPanel
+			// 
+			bottomPanel.Controls.Add(this.closeButton);
+			bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+			bottomPanel.Location = new System.Drawing.Point(0, 233);
+			bottomPanel.Name = "bottomPanel";
+			bottomPanel.Size = new System.Drawing.Size(351, 35);
+			bottomPanel.TabIndex = 0;
+			// 
+			// closeButton
+			// 
+			this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+			this.closeButton.Location = new System.Drawing.Point(264, 6);
+			this.closeButton.Name = "closeButton";
+			this.closeButton.Size = new System.Drawing.Size(75, 23);
+			this.closeButton.TabIndex = 0;
+			this.closeButton.Text = "Close";
+			this.closeButton.UseCompatibleTextRendering = true;
+			this.closeButton.UseVisualStyleBackColor = true;
+			this.closeButton.Click += new System.EventHandler(this.CloseButtonClick);
+			// 
+			// table
+			// 
+			this.table.ColumnCount = 2;
+			this.table.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+			this.table.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+			this.table.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.table.Location = new System.Drawing.Point(0, 8);
+			this.table.Name = "table";
+			this.table.RowCount = 2;
+			this.table.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+			this.table.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+			this.table.Size = new System.Drawing.Size(351, 225);
+			this.table.TabIndex = 1;
+			// 
+			// AboutForm
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.BackColor = System.Drawing.SystemColors.Info;
+			this.ClientSize = new System.Drawing.Size(351, 268);
+			this.Controls.Add(this.table);
+			this.Controls.Add(bottomPanel);
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "AboutForm";
+			this.Padding = new System.Windows.Forms.Padding(0, 8, 0, 0);
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "AboutForm";
+			bottomPanel.ResumeLayout(false);
+			this.ResumeLayout(false);
+		}
+		private System.Windows.Forms.Button closeButton;
+		private System.Windows.Forms.TableLayoutPanel table;
+		#endregion
+		
+		void CloseButtonClick(object sender, EventArgs e)
+		{
+			Close();
+		}
+	}
+}

Added: trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/AboutForm.resx	2012-05-29 13:59:28 UTC (rev 6707)
@@ -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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="bottomPanel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.AddInManager/AddInControl.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/AddInControl.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/AddInControl.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,227 @@
+#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 System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.Core;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+using System.ComponentModel;
+using ICSharpCode.Core.WinForms;
+
+namespace Maestro.AddInManager
+{
+    [ToolboxItem(false)]
+    public class AddInControl : Control
+    {
+        AddIn addIn;
+        bool isExternal;
+
+        public AddIn AddIn
+        {
+            get
+            {
+                return addIn;
+            }
+        }
+
+        public AddInControl(AddIn addIn)
+        {
+            this.addIn = addIn;
+            this.BackColor = SystemColors.Window;
+            this.ContextMenuStrip = MenuService.CreateContextMenu(this, "/AddIns/AddInManager/ContextMenu");
+
+            isExternal = !FileUtility.IsBaseDirectory(FileUtility.ApplicationRootPath, addIn.FileName)
+                && !FileUtility.IsBaseDirectory(PropertyService.ConfigDirectory, addIn.FileName);
+
+            this.ClientSize = new Size(100, isExternal ? 35 + pathHeight : 35);
+            this.SetStyle(ControlStyles.Selectable, true);
+            this.SetStyle(ControlStyles.UserPaint, true);
+            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+            this.SetStyle(ControlStyles.ResizeRedraw, true);
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+        }
+
+        bool selected;
+
+        public bool Selected
+        {
+            get
+            {
+                return selected;
+            }
+            set
+            {
+                if (selected != value)
+                {
+                    selected = value;
+                    Invalidate();
+                }
+            }
+        }
+
+        protected override void OnClick(EventArgs e)
+        {
+            base.OnClick(e);
+            Focus();
+        }
+
+        Color Mix(Color c1, Color c2, double perc)
+        {
+            double p1 = 1 - perc;
+            double p2 = perc;
+            return Color.FromArgb((int)(c1.R * p1 + c2.R * p2),
+                                  (int)(c1.G * p1 + c2.G * p2),
+                                  (int)(c1.B * p1 + c2.B * p2));
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            Graphics g = e.Graphics;
+            Rectangle bounds = this.ClientRectangle;
+            bounds.Offset(1, 1);
+            bounds.Inflate(-2, -2);
+            Color startColor = SystemColors.ControlLightLight;
+            Color endColor = SystemColors.Control;
+            if (selected)
+            {
+                startColor = Mix(SystemColors.ControlLightLight, SystemColors.Highlight, 0.1);
+                endColor = Mix(SystemColors.ControlLightLight, SystemColors.Highlight, 0.65);
+            }
+            Brush gradient = new LinearGradientBrush(bounds,
+                                                     startColor,
+                                                     endColor,
+                                                     LinearGradientMode.ForwardDiagonal);
+
+            GraphicsPath path = new GraphicsPath();
+
+            const int egdeRadius = 3;
+            const int innerMargin = egdeRadius + 2;
+
+            RectangleF arcRect = new RectangleF(bounds.Location, new SizeF(egdeRadius * 2, egdeRadius * 2));
+            //top left Arc
+            path.AddArc(arcRect, 180, 90);
+            path.AddLine(bounds.X + egdeRadius, bounds.Y, bounds.Right - egdeRadius, bounds.Y);
+            // top right arc
+            arcRect.X = bounds.Right - egdeRadius * 2;
+            path.AddArc(arcRect, 270, 90);
+            path.AddLine(bounds.Right, bounds.Left + egdeRadius, bounds.Right, bounds.Bottom - egdeRadius);
+            // bottom right arc
+            arcRect.Y = bounds.Bottom - egdeRadius * 2;
+            path.AddArc(arcRect, 0, 90);
+            path.AddLine(bounds.X + egdeRadius, bounds.Bottom, bounds.Right - egdeRadius, bounds.Bottom);
+            // bottom left arc
+            arcRect.X = bounds.Left;
+            path.AddArc(arcRect, 90, 90);
+            path.AddLine(bounds.X, bounds.Left + egdeRadius, bounds.X, bounds.Bottom - egdeRadius);
+
+            g.FillPath(gradient, path);
+            g.DrawPath(SystemPens.ControlText, path);
+            path.Dispose();
+            gradient.Dispose();
+            Brush textBrush;
+            string description = GetText(out textBrush);
+            int titleWidth;
+            using (Font boldFont = new Font("Arial", 8, FontStyle.Bold))
+            {
+                g.DrawString(addIn.Name, boldFont, textBrush, innerMargin, innerMargin);
+                titleWidth = (int)g.MeasureString(addIn.Name, boldFont).Width + 1;
+            }
+            if (addIn.Version != null && addIn.Version.ToString() != "0.0.0.0")
+            {
+                g.DrawString(addIn.Version.ToString(), Font, textBrush, innerMargin + titleWidth + 4, innerMargin);
+            }
+            RectangleF textBounds = bounds;
+            textBounds.Offset(innerMargin, innerMargin);
+            textBounds.Inflate(-innerMargin * 2, -innerMargin * 2 + 2);
+            if (isExternal)
+                textBounds.Height -= pathHeight;
+            using (StringFormat sf = new StringFormat(StringFormatFlags.LineLimit))
+            {
+                sf.Trimming = StringTrimming.EllipsisWord;
+                g.DrawString(description, Font, textBrush, textBounds, sf);
+            }
+            if (isExternal)
+            {
+                textBounds.Y = textBounds.Bottom + 2;
+                textBounds.Height = pathHeight + 2;
+                using (Font font = new Font(Font.Name, 7, FontStyle.Italic))
+                {
+                    using (StringFormat sf = new StringFormat(StringFormatFlags.NoWrap))
+                    {
+                        sf.Trimming = StringTrimming.EllipsisPath;
+                        sf.Alignment = StringAlignment.Far;
+                        g.DrawString(addIn.FileName, font,
+                                     selected ? SystemBrushes.HighlightText : SystemBrushes.ControlText,
+                                     textBounds, sf);
+                    }
+                }
+            }
+        }
+
+        const int pathHeight = 10;
+
+        string GetText(out Brush textBrush)
+        {
+            switch (addIn.Action)
+            {
+                case AddInAction.Enable:
+                    if (addIn.Enabled)
+                    {
+                        textBrush = SystemBrushes.ControlText;
+                        return addIn.Properties["description"];
+                    }
+                    else
+                    {
+                        textBrush = SystemBrushes.ActiveCaption;
+                        return ResourceService.GetString("AddInManager.AddInEnabled");
+                    }
+                case AddInAction.Disable:
+                    textBrush = SystemBrushes.GrayText;
+                    if (addIn.Enabled)
+                        return ResourceService.GetString("AddInManager.AddInWillBeDisabled");
+                    else
+                        return ResourceService.GetString("AddInManager.AddInDisabled");
+                case AddInAction.Install:
+                    textBrush = SystemBrushes.ActiveCaption;
+                    return ResourceService.GetString("AddInManager.AddInInstalled");
+                case AddInAction.Uninstall:
+                    textBrush = SystemBrushes.GrayText;
+                    return ResourceService.GetString("AddInManager.AddInRemoved");
+                case AddInAction.Update:
+                    textBrush = SystemBrushes.ActiveCaption;
+                    return ResourceService.GetString("AddInManager.AddInUpdated");
+                case AddInAction.InstalledTwice:
+                    textBrush = Brushes.Red;
+                    return ResourceService.GetString("AddInManager.AddInInstalledTwice");
+                case AddInAction.DependencyError:
+                    textBrush = Brushes.Red;
+                    return ResourceService.GetString("AddInManager.AddInDependencyFailed");
+                case AddInAction.CustomError:
+                    textBrush = Brushes.Red;
+                    return StringParser.Parse(addIn.CustomErrorMessage);
+                default:
+                    textBrush = Brushes.Yellow;
+                    return addIn.Action.ToString();
+            }
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.AddInManager/AddInManger.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/AddInManger.addin	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/AddInManger.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,75 @@
+<AddIn name="Add-In Manager"
+       author="Jackie Ng"
+       url="http://trac.osgeo.org/mapguide/wiki/maestro"
+       description="Add-In Manager"
+       addInManagerHidden="true">
+
+    <Manifest>
+        <Identity name="Maestro.AddInManager" />
+    </Manifest>
+
+    <Runtime>
+        <Import assembly="Maestro.AddInManager.dll">
+            <ConditionEvaluator name="AddInManagerAddInState" class="Maestro.AddInManager.AddInManagerAddInStateConditionEvaluator"/>
+        </Import>
+    </Runtime>
+
+    <Path name = "/Workspace/Tools">
+        <MenuItem id = "ShowAddInManager"
+		          label = "${res:CMD_AddInManager}"
+                  icon = "plugin" 
+                  insertbefore="PrefSeparator" 
+		          class = "Maestro.AddInManager.ShowCommand"/>
+    </Path>
+
+    <Path name="/Workbench/Toolbar">
+        <MenuItem id = "ShowAddInManager"
+                  icon = "plugin"
+                  tooltip="${res:CMD_AddInManager}" 
+		          class = "Maestro.AddInManager.ShowCommand"/>
+    </Path>
+
+    <Path name = "/AddIns/AddInManager/ContextMenu">
+        <Condition name="AddInManagerAddInState" states="Enable">
+            <MenuItem id="Disable"
+			          label="${res:AddInManager.ActionDisable}"
+			          class="Maestro.AddInManager.DisableCommand"/>
+        </Condition>
+        <Condition name="AddInManagerAddInState" states="Disable">
+            <MenuItem id="Enable"
+			          label="${res:AddInManager.ActionEnable}"
+			          class="Maestro.AddInManager.EnableCommand"/>
+        </Condition>
+        <Condition name="AddInManagerAddInState" states="Enable,Disable,InstalledTwice,DependencyError">
+            <MenuItem id="Uninstall"
+			          label="${res:AddInManager.ActionUninstall}"
+			          class="Maestro.AddInManager.UninstallCommand"/>
+        </Condition>
+        <Condition name="AddInManagerAddInState" states="Install">
+            <MenuItem id="AbortInstall"
+			          label="${res:AddInManager.ActionCancelInstallation}"
+			          class="Maestro.AddInManager.AbortInstallCommand"/>
+        </Condition>
+        <Condition name="AddInManagerAddInState" states="Uninstall">
+            <MenuItem id="AbortUninstall"
+			          label="${res:AddInManager.ActionCancelDeinstallation}"
+			          class="Maestro.AddInManager.EnableCommand"/>
+        </Condition>
+        <Condition name="AddInManagerAddInState" states="Update">
+            <MenuItem id="AbortUpdate"
+			          label="${res:AddInManager.ActionCancelUpdate}"
+			          class="Maestro.AddInManager.AbortUpdateCommand"/>
+        </Condition>
+        <MenuItem id="Separator1" type="Separator"/>
+        <MenuItem id="GoToHomepage"
+		          label="${res:AddInManager.OpenWebsite}"
+		          class="Maestro.AddInManager.OpenHomepageCommand"
+		          loadclasslazy="false"/>
+    </Path>
+    
+    <!-- Auto-start commands -->
+    <Path name="/Workspace/Autostart">
+        <Class id="Startup" class="Maestro.AddInManager.StartupCommand" />
+    </Path>
+    
+</AddIn>

Added: trunk/Tools/Maestro/Maestro.AddInManager/Commands.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/Commands.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/Commands.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,116 @@
+#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 System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.Core;
+
+namespace Maestro.AddInManager
+{
+    public class ShowCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ManagerForm.ShowForm();
+        }
+    }
+
+    public class StartupCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ResourceService.RegisterNeutralStrings(Strings.ResourceManager);
+        }
+    }
+
+    public class AddInManagerAddInStateConditionEvaluator : IConditionEvaluator
+    {
+        public bool IsValid(object caller, Condition condition)
+        {
+            string states = condition.Properties["states"];
+            string action = ((AddInControl)caller).AddIn.Action.ToString();
+            foreach (string state in states.Split(','))
+            {
+                if (state == action)
+                    return true;
+            }
+            return false;
+        }
+    }
+
+    public class DisableCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ManagerForm.Instance.TryRunAction(((AddInControl)Owner).AddIn, AddInAction.Disable);
+        }
+    }
+
+    public class EnableCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ManagerForm.Instance.TryRunAction(((AddInControl)Owner).AddIn, AddInAction.Enable);
+        }
+    }
+
+    public class AbortInstallCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ManagerForm.Instance.TryRunAction(((AddInControl)Owner).AddIn, AddInAction.Uninstall);
+        }
+    }
+
+    public class AbortUpdateCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ManagerForm.Instance.TryRunAction(((AddInControl)Owner).AddIn, AddInAction.InstalledTwice);
+        }
+    }
+
+    public class UninstallCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            ManagerForm.Instance.TryUninstall(((AddInControl)Owner).AddIn);
+        }
+    }
+
+    public class OpenHomepageCommand : AbstractMenuCommand
+    {
+        public override bool IsEnabled
+        {
+            get
+            {
+                return ((AddInControl)Owner).AddIn.Properties["url"].Length > 0;
+            }
+        }
+
+        public override void Run()
+        {
+			try {
+				System.Diagnostics.Process.Start(((AddInControl)Owner).AddIn.Properties["url"]);
+			} catch {}
+            ManagerForm.Instance.Close();
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.AddInManager/InstallableAddIn.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/InstallableAddIn.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/InstallableAddIn.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,162 @@
+#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 System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.Core;
+using ICSharpCode.SharpZipLib.Zip;
+using System.IO;
+
+namespace Maestro.AddInManager
+{
+    public class InstallableAddIn
+    {
+        string fileName;
+        bool isPackage;
+        AddIn addIn;
+
+        public AddIn AddIn
+        {
+            get
+            {
+                return addIn;
+            }
+        }
+
+        public InstallableAddIn(string fileName, bool isPackage)
+        {
+            this.fileName = fileName;
+            this.isPackage = isPackage;
+            if (isPackage)
+            {
+                ZipFile file = new ZipFile(fileName);
+                try
+                {
+                    LoadAddInFromZip(file);
+                }
+                finally
+                {
+                    file.Close();
+                }
+            }
+            else
+            {
+                addIn = AddIn.Load(fileName);
+            }
+            if (addIn.Manifest.PrimaryIdentity == null)
+                throw new AddInLoadException(ResourceService.GetString("AddInManager.AddInMustHaveIdentity"));
+        }
+
+        void LoadAddInFromZip(ZipFile file)
+        {
+            ZipEntry addInEntry = null;
+            foreach (ZipEntry entry in file)
+            {
+                if (entry.Name.EndsWith(".addin"))
+                {
+                    if (addInEntry != null)
+                        throw new AddInLoadException("The package may only contain one .addin file.");
+                    addInEntry = entry;
+                }
+            }
+            if (addInEntry == null)
+                throw new AddInLoadException("The package must contain one .addin file.");
+            using (Stream s = file.GetInputStream(addInEntry))
+            {
+                using (StreamReader r = new StreamReader(s))
+                {
+                    addIn = AddIn.Load(r);
+                }
+            }
+        }
+
+        public void Install(bool isUpdate)
+        {
+            foreach (string identity in addIn.Manifest.Identities.Keys)
+            {
+                ICSharpCode.Core.AddInManager.AbortRemoveUserAddInOnNextStart(identity);
+            }
+            if (isPackage)
+            {
+                string targetDir = Path.Combine(ICSharpCode.Core.AddInManager.AddInInstallTemp,
+                                                addIn.Manifest.PrimaryIdentity);
+                if (Directory.Exists(targetDir))
+                    Directory.Delete(targetDir, true);
+                Directory.CreateDirectory(targetDir);
+                FastZip fastZip = new FastZip();
+                fastZip.CreateEmptyDirectories = true;
+                fastZip.ExtractZip(fileName, targetDir, null);
+
+                addIn.Action = AddInAction.Install;
+                if (!isUpdate)
+                {
+                    AddInTree.InsertAddIn(addIn);
+                }
+            }
+            else
+            {
+                ICSharpCode.Core.AddInManager.AddExternalAddIns(new AddIn[] { addIn });
+            }
+        }
+
+        public static void CancelUpdate(IList<AddIn> addIns)
+        {
+            foreach (AddIn addIn in addIns)
+            {
+                foreach (string identity in addIn.Manifest.Identities.Keys)
+                {
+                    // delete from installation temp (if installation or update is pending)
+                    string targetDir = Path.Combine(ICSharpCode.Core.AddInManager.AddInInstallTemp,
+                                                    identity);
+                    if (Directory.Exists(targetDir))
+                        Directory.Delete(targetDir, true);
+                }
+            }
+        }
+
+        public static void Uninstall(IList<AddIn> addIns)
+        {
+            CancelUpdate(addIns);
+            foreach (AddIn addIn in addIns)
+            {
+                foreach (string identity in addIn.Manifest.Identities.Keys)
+                {
+                    // remove the user AddIn
+                    string targetDir = Path.Combine(ICSharpCode.Core.AddInManager.UserAddInPath, identity);
+                    if (Directory.Exists(targetDir))
+                    {
+                        if (!addIn.Enabled)
+                        {
+                            try
+                            {
+                                Directory.Delete(targetDir, true);
+                                continue;
+                            }
+                            catch
+                            {
+                            }
+                        }
+                        ICSharpCode.Core.AddInManager.RemoveUserAddInOnNextStart(identity);
+                    }
+                }
+            }
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.AddInManager/Maestro.AddInManager.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/Maestro.AddInManager.csproj	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/Maestro.AddInManager.csproj	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectGuid>{9CC51643-37D6-4B8F-A0EA-E7606AA561EB}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Maestro.AddInManager</RootNamespace>
+    <AssemblyName>Maestro.AddInManager</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <OutputPath>bin\Debug\</OutputPath>
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>Full</DebugType>
+    <Optimize>False</Optimize>
+    <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <DebugSymbols>False</DebugSymbols>
+    <DebugType>None</DebugType>
+    <Optimize>True</Optimize>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <DefineConstants>TRACE</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\out\Debug\AddIns\AddInManager\</OutputPath>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\out\Release\AddIns\AddInManager\</OutputPath>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ICSharpCode.SharpZipLib">
+      <HintPath>..\Thirdparty\SharpZipLib\ICSharpCode.SharpZipLib.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\Properties\GlobalAssemblyInfo.cs">
+      <Link>GlobalAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\Properties\SignedAssemblyInfo2.cs">
+      <Link>SignedAssemblyInfo2.cs</Link>
+    </Compile>
+    <Compile Include="AboutForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddInControl.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Commands.cs" />
+    <Compile Include="InstallableAddIn.cs" />
+    <Compile Include="ManagerForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Strings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Strings.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AboutForm.resx">
+      <DependentUpon>AboutForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Strings.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Strings.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Thirdparty\SharpDevelop\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj">
+      <Project>{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}</Project>
+      <Name>ICSharpCode.Core.WinForms</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Thirdparty\SharpDevelop\ICSharpCode.Core\ICSharpCode.Core.csproj">
+      <Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
+      <Name>ICSharpCode.Core</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="AddInManger.addin">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
+</Project>
\ No newline at end of file

Added: trunk/Tools/Maestro/Maestro.AddInManager/ManagerForm.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/ManagerForm.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/ManagerForm.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,1053 @@
+#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 System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using ICSharpCode.Core;
+using System.Drawing;
+using System.IO;
+using ICSharpCode.Core.WinForms;
+
+namespace Maestro.AddInManager
+{
+    public class ManagerForm : System.Windows.Forms.Form
+    {
+        #region Form Initialization
+        static ManagerForm instance;
+
+        public static ManagerForm Instance
+        {
+            get
+            {
+                return instance;
+            }
+        }
+
+        public static void ShowForm()
+        {
+            if (instance == null)
+            {
+                instance = new ManagerForm();
+                instance.Show();
+            }
+            else
+            {
+                instance.Activate();
+            }
+        }
+
+        public ManagerForm()
+        {
+            //
+            // The InitializeComponent() call is required for Windows Forms designer support.
+            //
+            InitializeComponent();
+
+            installButton.Text = ResourceService.GetString("AddInManager.InstallButton");
+            uninstallButton.Text = ResourceService.GetString("AddInManager.ActionUninstall");
+            closeButton.Text = ResourceService.GetString("TextClose");
+            showPreinstalledAddInsCheckBox.Text = ResourceService.GetString("AddInManager.ShowPreinstalledAddIns");
+            this.Text = ResourceService.GetString("AddInManager.Title");
+            RightToLeftConverter.ConvertRecursive(this);
+
+            CreateAddInList();
+        }
+
+        void OnSplitContainerPanel1Paint(object sender, PaintEventArgs e)
+        {
+            if (visibleAddInCount == 0)
+            {
+                Rectangle rect = splitContainer.Panel1.ClientRectangle;
+                rect.Offset(16, 16);
+                rect.Inflate(-32, -32);
+                e.Graphics.DrawString(ResourceService.GetString("AddInManager.NoAddInsInstalled"),
+                                      Font, SystemBrushes.WindowText, rect);
+            }
+        }
+
+        void CreateAddInList()
+        {
+            Stack<AddInControl> stack = new Stack<AddInControl>();
+            int index = 0;
+            AddInControl addInControl;
+
+            List<AddIn> addInList = new List<AddIn>(AddInTree.AddIns);
+            addInList.Sort(delegate(AddIn a, AddIn b)
+            {
+                return a.Name.CompareTo(b.Name);
+            });
+            foreach (AddIn addIn in addInList)
+            {
+                string identity = addIn.Manifest.PrimaryIdentity;
+                if (addIn.Properties["addInManagerHidden"] == "true")
+                    continue;
+                addInControl = new AddInControl(addIn);
+                addInControl.Dock = DockStyle.Top;
+                addInControl.TabIndex = index++;
+                stack.Push(addInControl);
+                addInControl.Enter += OnControlEnter;
+                addInControl.Click += OnControlClick;
+            }
+            while (stack.Count > 0)
+            {
+                splitContainer.Panel1.Controls.Add(stack.Pop());
+            }
+            ShowPreinstalledAddInsCheckBoxCheckedChanged(null, null);
+
+			showPreinstalledAddInsCheckBox.Checked = true;
+
+            splitContainer.Panel2Collapsed = true;
+        }
+
+        void RefreshAddInList()
+        {
+            List<AddIn> oldSelected = selected;
+            foreach (Control ctl in splitContainer.Panel1.Controls)
+            {
+                ctl.Dispose();
+            }
+            splitContainer.Panel1.Controls.Clear();
+            CreateAddInList();
+            if (oldSelected != null)
+            {
+                foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+                {
+                    if (oldSelected.Contains(ctl.AddIn))
+                        ctl.Selected = true;
+                }
+            }
+            UpdateActionBox();
+        }
+        #endregion
+
+        #region AddInList-Management
+        int visibleAddInCount = 0;
+
+        void ShowPreinstalledAddInsCheckBoxCheckedChanged(object sender, EventArgs e)
+        {
+            visibleAddInCount = 0;
+            foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+            {
+                ctl.Selected = false;
+                bool visible;
+                if (showPreinstalledAddInsCheckBox.Checked)
+                {
+                    visible = true;
+                }
+                else
+                {
+                    if (ctl == oldFocus)
+                        oldFocus = null;
+                    visible = !FileUtility.IsBaseDirectory(FileUtility.ApplicationRootPath, ctl.AddIn.FileName);
+                }
+                if (visible)
+                    visibleAddInCount += 1;
+                ctl.Visible = visible;
+            }
+            UpdateActionBox();
+        }
+
+        void OnControlClick(object sender, EventArgs e)
+        {
+            // clicking again on already focused item:
+            // remove selection of other items / or with Ctrl: toggle selection
+            if (((Control)sender).Focused)
+                OnControlEnter(sender, e);
+        }
+
+        AddInControl oldFocus;
+        bool ignoreFocusChange;
+
+        void OnControlEnter(object sender, EventArgs e)
+        {
+            if (ignoreFocusChange)
+                return;
+            bool ctrl = (ModifierKeys & Keys.Control) == Keys.Control;
+            if ((ModifierKeys & Keys.Shift) == Keys.Shift && sender != oldFocus)
+            {
+                bool sel = false;
+                foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+                {
+                    if (!ctl.Visible) continue;
+                    if (ctl == sender || ctl == oldFocus)
+                    {
+                        sel = !sel;
+                        ctl.Selected = true;
+                    }
+                    else
+                    {
+                        if (sel || !ctrl)
+                        {
+                            ctl.Selected = sel;
+                        }
+                    }
+                }
+            }
+            else if (ctrl)
+            {
+                foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+                {
+                    if (ctl == sender)
+                        ctl.Selected = !ctl.Selected;
+                }
+                oldFocus = (AddInControl)sender;
+            }
+            else
+            {
+                foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+                {
+                    ctl.Selected = ctl == sender;
+                }
+                oldFocus = (AddInControl)sender;
+            }
+            UpdateActionBox();
+        }
+        #endregion
+
+        #region UpdateActionBox
+        List<AddIn> selected;
+        AddInAction selectedAction;
+
+        static bool IsErrorAction(AddInAction action)
+        {
+            return action == AddInAction.DependencyError
+                || action == AddInAction.InstalledTwice
+                || action == AddInAction.CustomError;
+        }
+
+        void UpdateActionBox()
+        {
+            ignoreFocusChange = true;
+            selected = new List<AddIn>();
+            foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+            {
+                if (ctl.Selected)
+                    selected.Add(ctl.AddIn);
+            }
+            splitContainer.Panel2Collapsed = selected.Count == 0;
+            if (selected.Count > 0)
+            {
+                dependencyTable.Visible = false;
+                runActionButton.Visible = true;
+                uninstallButton.Visible = true;
+
+                bool allHaveIdentity = true;
+                bool allEnabled = true;
+                bool allDisabled = true;
+                bool allInstalling = true;
+                bool allUninstalling = true;
+                bool allUpdating = true;
+                bool allUninstallable = true;
+                bool hasErrors = false;
+                foreach (AddIn addIn in selected)
+                {
+                    if (addIn.Manifest.PrimaryIdentity == null)
+                    {
+                        allHaveIdentity = false;
+                        break;
+                    }
+                    allEnabled &= addIn.Action == AddInAction.Enable;
+                    if (IsErrorAction(addIn.Action))
+                        hasErrors = true;
+                    else
+                        allDisabled &= addIn.Action == AddInAction.Disable;
+                    allUpdating &= addIn.Action == AddInAction.Update;
+                    allInstalling &= addIn.Action == AddInAction.Install;
+                    allUninstalling &= addIn.Action == AddInAction.Uninstall;
+                    if (allUninstallable)
+                    {
+                        if (FileUtility.IsBaseDirectory(FileUtility.ApplicationRootPath, addIn.FileName))
+                        {
+                            allUninstallable = false;
+                        }
+                    }
+                }
+                if (allEnabled == true || allHaveIdentity == false)
+                {
+                    selectedAction = AddInAction.Disable;
+                    actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionDisable");
+                    actionDescription.Text = ResourceService.GetString("AddInManager.DescriptionDisable");
+                    if (allHaveIdentity)
+                        runActionButton.Enabled = ShowDependencies(selected, ShowDependencyMode.Disable);
+                    else
+                        runActionButton.Enabled = false;
+                    uninstallButton.Enabled = allUninstallable && runActionButton.Enabled;
+                }
+                else if (allDisabled)
+                {
+                    selectedAction = AddInAction.Enable;
+                    actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionEnable");
+                    actionDescription.Text = ResourceService.GetString("AddInManager.DescriptionEnable");
+                    runActionButton.Enabled = ShowDependencies(selected, ShowDependencyMode.Enable);
+                    if (hasErrors)
+                        runActionButton.Enabled = false;
+                    uninstallButton.Enabled = allUninstallable;
+                }
+                else if (allInstalling)
+                {
+                    selectedAction = AddInAction.Uninstall;
+                    actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionCancelInstallation");
+                    actionDescription.Text = ResourceService.GetString("AddInManager.DescriptionCancelInstall");
+                    runActionButton.Enabled = ShowDependencies(selected, ShowDependencyMode.Disable);
+                    uninstallButton.Visible = false;
+                }
+                else if (allUninstalling)
+                {
+                    selectedAction = AddInAction.Enable;
+                    actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionCancelDeinstallation");
+                    actionDescription.Text = ResourceService.GetString("AddInManager.DescriptionCancelDeinstallation");
+                    runActionButton.Enabled = ShowDependencies(selected, ShowDependencyMode.Enable);
+                    uninstallButton.Visible = false;
+                }
+                else if (allUpdating)
+                {
+                    selectedAction = AddInAction.InstalledTwice;
+                    actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionCancelUpdate");
+                    actionDescription.Text = ResourceService.GetString("AddInManager.DescriptionCancelUpdate");
+                    runActionButton.Enabled = ShowDependencies(selected, ShowDependencyMode.CancelUpdate);
+                    uninstallButton.Visible = false;
+                }
+                else
+                {
+                    actionGroupBox.Text = "";
+                    actionDescription.Text = ResourceService.GetString("AddInManager.DescriptionInconsistentSelection");
+                    runActionButton.Visible = false;
+                    uninstallButton.Visible = false;
+                }
+            }
+            ignoreFocusChange = false;
+        }
+
+        enum ShowDependencyMode
+        {
+            Disable,
+            Enable,
+            CancelUpdate
+        }
+
+        bool ShowDependencies(IList<AddIn> addIns, ShowDependencyMode mode)
+        {
+            List<AddInReference> dependencies = new List<AddInReference>(); // only used with enable=true
+            List<KeyValuePair<AddIn, AddInReference>> dependenciesToSel = new List<KeyValuePair<AddIn, AddInReference>>();
+            Dictionary<string, Version> addInDict = new Dictionary<string, Version>();
+            Dictionary<string, Version> modifiedAddIns = new Dictionary<string, Version>();
+
+            // add available addins
+            foreach (AddIn addIn in AddInTree.AddIns)
+            {
+                if (addIn.Action != AddInAction.Enable && addIn.Action != AddInAction.Install)
+                    continue;
+                if (addIns.Contains(addIn))
+                    continue;
+                foreach (KeyValuePair<string, Version> pair in addIn.Manifest.Identities)
+                {
+                    addInDict[pair.Key] = pair.Value;
+                }
+            }
+
+            // create list of modified addin names
+            foreach (AddIn addIn in addIns)
+            {
+                foreach (KeyValuePair<string, Version> pair in addIn.Manifest.Identities)
+                {
+                    modifiedAddIns[pair.Key] = pair.Value;
+                }
+            }
+
+            // add new addins
+            if (mode != ShowDependencyMode.Disable)
+            {
+                foreach (AddIn addIn in addIns)
+                {
+                    if (mode == ShowDependencyMode.CancelUpdate && !addIn.Enabled)
+                    {
+                        continue;
+                    }
+                    foreach (KeyValuePair<string, Version> pair in addIn.Manifest.Identities)
+                    {
+                        addInDict[pair.Key] = pair.Value;
+                    }
+                    foreach (AddInReference dep in addIn.Manifest.Dependencies)
+                    {
+                        if (!dependencies.Contains(dep))
+                            dependencies.Add(dep);
+                    }
+                }
+            }
+
+            // add dependencies to the to-be-changed addins
+            foreach (AddIn addIn in AddInTree.AddIns)
+            {
+                if (addIn.Action != AddInAction.Enable && addIn.Action != AddInAction.Install)
+                    continue;
+                if (addIns.Contains(addIn))
+                    continue;
+                foreach (AddInReference dep in addIn.Manifest.Dependencies)
+                {
+                    if (modifiedAddIns.ContainsKey(dep.Name))
+                    {
+                        dependenciesToSel.Add(new KeyValuePair<AddIn, AddInReference>(addIn, dep));
+                    }
+                }
+            }
+
+            foreach (Control ctl in dependencyTable.Controls)
+            {
+                ctl.Dispose();
+            }
+            dependencyTable.Controls.Clear();
+            bool allDepenciesOK = true;
+            if (dependencies.Count > 0 || dependenciesToSel.Count > 0)
+            {
+                if (dependencies.Count == 0)
+                {
+                    dependencyTable.RowCount = 1 + dependenciesToSel.Count;
+                }
+                else if (dependenciesToSel.Count == 0)
+                {
+                    dependencyTable.RowCount = 1 + dependencies.Count;
+                }
+                else
+                {
+                    dependencyTable.RowCount = 2 + dependencies.Count + dependenciesToSel.Count;
+                }
+                while (dependencyTable.RowStyles.Count < dependencyTable.RowCount)
+                {
+                    dependencyTable.RowStyles.Add(new RowStyle(SizeType.AutoSize));
+                }
+                int rowIndex = 0;
+                if (dependencies.Count > 0)
+                {
+                    AddLabelRow(rowIndex++, ResourceService.GetString("AddInManager.RequiredDependencies"));
+                    foreach (AddInReference dep in dependencies)
+                    {
+                        if (!AddDependencyRow(addInDict, dep, rowIndex++, null))
+                            allDepenciesOK = false;
+                    }
+                }
+                if (dependenciesToSel.Count > 0)
+                {
+                    AddLabelRow(rowIndex++, ResourceService.GetString("AddInManager.RequiredBy"));
+                    foreach (KeyValuePair<AddIn, AddInReference> pair in dependenciesToSel)
+                    {
+                        if (!AddDependencyRow(addInDict, pair.Value, rowIndex++, pair.Key.Name))
+                            allDepenciesOK = false;
+                    }
+                }
+                dependencyTable.Visible = true;
+            }
+            return allDepenciesOK;
+        }
+
+        bool AddDependencyRow(Dictionary<string, Version> addInDict, AddInReference dep, int rowIndex, string requiredByName)
+        {
+            string text = requiredByName ?? GetDisplayName(dep.Name);
+            Version versionFound;
+            Label label = new Label();
+            label.AutoSize = true;
+            label.Text = text;
+            PictureBox box = new PictureBox();
+            box.BorderStyle = BorderStyle.None;
+            box.Size = new Size(16, 16);
+            bool isOK = dep.Check(addInDict, out versionFound);
+            box.SizeMode = PictureBoxSizeMode.CenterImage;
+            //box.Image = isOK ? ResourceService.GetBitmap("Icons.16x16.OK") : ResourceService.GetBitmap("Icons.16x16.DeleteIcon");
+            dependencyTable.Controls.Add(label, 1, rowIndex);
+            dependencyTable.Controls.Add(box, 0, rowIndex);
+            return isOK;
+        }
+
+        void AddLabelRow(int rowIndex, string text)
+        {
+            Label label = new Label();
+            label.AutoSize = true;
+            label.Text = text;
+            dependencyTable.Controls.Add(label, 0, rowIndex);
+            dependencyTable.SetColumnSpan(label, 2);
+        }
+
+        string GetDisplayName(string identity)
+        {
+            foreach (AddIn addIn in AddInTree.AddIns)
+            {
+                if (addIn.Manifest.Identities.ContainsKey(identity))
+                    return addIn.Name;
+            }
+            return identity;
+        }
+        #endregion
+
+        #region Install new AddIns
+        void InstallButtonClick(object sender, EventArgs e)
+        {
+            using (OpenFileDialog dlg = new OpenFileDialog())
+            {
+                dlg.Filter = ResourceService.GetString("AddInManager.FileFilter");
+                dlg.Multiselect = true;
+                if (dlg.ShowDialog() == DialogResult.OK)
+                {
+                    if (ShowInstallableAddIns(dlg.FileNames))
+                    {
+                        if (runActionButton.Visible && runActionButton.Enabled)
+                            runActionButton.PerformClick();
+                    }
+                }
+            }
+        }
+
+        public bool ShowInstallableAddIns(IEnumerable<string> fileNames)
+        {
+            foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+            {
+                ctl.Selected = false;
+            }
+            UpdateActionBox();
+            List<InstallableAddIn> list = new List<InstallableAddIn>();
+            foreach (string file in fileNames)
+            {
+                try
+                {
+                    // Same file-extension check is in Panel1DragEnter
+                    switch (Path.GetExtension(file).ToLowerInvariant())
+                    {
+                        case ".addin":
+                            if (FileUtility.IsBaseDirectory(FileUtility.ApplicationRootPath, file))
+                            {
+                                MessageService.ShowMessage("${res:AddInManager.CannotInstallIntoApplicationDirectory}");
+                                return false;
+                            }
+                            list.Add(new InstallableAddIn(file, false));
+                            break;
+                        case ".sdaddin":
+                        case ".zip":
+                            list.Add(new InstallableAddIn(file, true));
+                            break;
+                        default:
+                            MessageService.ShowMessage("${res:AddInManager.UnknownFileFormat} " + Path.GetExtension(file));
+                            return false;
+                    }
+                }
+                catch (AddInLoadException ex)
+                {
+                    MessageService.ShowMessage("Error loading " + file + ":\n" + ex.Message);
+                    return false;
+                }
+            }
+            ShowInstallableAddIns(list);
+            return true;
+        }
+
+        IList<InstallableAddIn> shownAddInPackages;
+
+        void ShowInstallableAddIns(IList<InstallableAddIn> addInPackages)
+        {
+            shownAddInPackages = addInPackages;
+            ignoreFocusChange = true;
+            splitContainer.Panel2Collapsed = false;
+            dependencyTable.Visible = false;
+            runActionButton.Visible = true;
+            uninstallButton.Visible = false;
+
+            selectedAction = AddInAction.Install;
+            List<string> installAddIns = new List<string>();
+            List<string> updateAddIns = new List<string>();
+            foreach (InstallableAddIn addInPackage in addInPackages)
+            {
+                string identity = addInPackage.AddIn.Manifest.PrimaryIdentity;
+                AddIn foundAddIn = null;
+                foreach (AddIn addIn in AddInTree.AddIns)
+                {
+                    if (addIn.Action != AddInAction.Install
+                        && addIn.Manifest.Identities.ContainsKey(identity))
+                    {
+                        foundAddIn = addIn;
+                        break;
+                    }
+                }
+                if (foundAddIn != null)
+                {
+                    updateAddIns.Add(addInPackage.AddIn.Name);
+                }
+                else
+                {
+                    installAddIns.Add(addInPackage.AddIn.Name);
+                }
+            }
+
+            if (updateAddIns.Count == 0)
+            {
+                actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionInstall");
+            }
+            else if (installAddIns.Count == 0)
+            {
+                actionGroupBox.Text = runActionButton.Text = ResourceService.GetString("AddInManager.ActionUpdate");
+            }
+            else
+            {
+                actionGroupBox.Text = runActionButton.Text =
+                    ResourceService.GetString("AddInManager.ActionInstall")
+                    + " + " +
+                    ResourceService.GetString("AddInManager.ActionUpdate");
+            }
+            List<AddIn> addInList = new List<AddIn>();
+            StringBuilder b = new StringBuilder();
+            if (installAddIns.Count == 1)
+            {
+                b.Append("Installs the AddIn " + installAddIns[0]);
+            }
+            else if (installAddIns.Count > 1)
+            {
+                b.Append("Installs the AddIns " + string.Join(",", installAddIns.ToArray()));
+            }
+            if (updateAddIns.Count > 0 && installAddIns.Count > 0)
+                b.Append("; ");
+            if (updateAddIns.Count == 1)
+            {
+                b.Append("Updates the AddIn " + updateAddIns[0]);
+            }
+            else if (updateAddIns.Count > 1)
+            {
+                b.Append("Updates the AddIns " + string.Join(",", updateAddIns.ToArray()));
+            }
+            actionDescription.Text = b.ToString();
+            runActionButton.Enabled = ShowDependencies(addInList, ShowDependencyMode.Enable);
+        }
+
+        void RunInstallation()
+        {
+            // install new AddIns
+            foreach (InstallableAddIn addInPackage in shownAddInPackages)
+            {
+                string identity = addInPackage.AddIn.Manifest.PrimaryIdentity;
+                AddIn foundAddIn = null;
+                foreach (AddIn addIn in AddInTree.AddIns)
+                {
+                    if (addIn.Manifest.Identities.ContainsKey(identity))
+                    {
+                        foundAddIn = addIn;
+                        break;
+                    }
+                }
+                if (foundAddIn != null)
+                {
+                    addInPackage.Install(true);
+                    if (foundAddIn.Action != AddInAction.Enable)
+                    {
+                        ICSharpCode.Core.AddInManager.Enable(new AddIn[] { foundAddIn });
+                    }
+                    if (foundAddIn.Action != AddInAction.Install)
+                    {
+                        foundAddIn.Action = AddInAction.Update;
+                    }
+                }
+                else
+                {
+                    addInPackage.Install(false);
+                }
+            }
+            RefreshAddInList();
+        }
+        #endregion
+
+        #region Uninstall AddIns
+        void UninstallButtonClick(object sender, EventArgs e)
+        {
+            ICSharpCode.Core.AddInManager.RemoveExternalAddIns(selected);
+            InstallableAddIn.Uninstall(selected);
+            RefreshAddInList();
+        }
+        #endregion
+
+        #region Drag'N'Drop
+        void Panel1DragEnter(object sender, DragEventArgs e)
+        {
+            if (!e.Data.GetDataPresent(DataFormats.FileDrop))
+            {
+                e.Effect = DragDropEffects.None;
+                return;
+            }
+            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+            int addInCount = 0;
+            int packageCount = 0;
+            foreach (string file in files)
+            {
+                switch (Path.GetExtension(file).ToLowerInvariant())
+                {
+                    case ".addin":
+                        addInCount += 1;
+                        break;
+                    case ".sdaddin":
+                    case ".zip":
+                        packageCount += 1;
+                        break;
+                    default:
+                        e.Effect = DragDropEffects.None;
+                        return;
+                }
+            }
+            if (addInCount == 0 && packageCount == 0)
+            {
+                e.Effect = DragDropEffects.None;
+            }
+            else if (addInCount == 0)
+            {
+                e.Effect = DragDropEffects.Copy;
+            }
+            else
+            {
+                e.Effect = DragDropEffects.Link;
+            }
+        }
+
+        void Panel1DragDrop(object sender, DragEventArgs e)
+        {
+            if (!e.Data.GetDataPresent(DataFormats.FileDrop))
+                return;
+            ShowInstallableAddIns((string[])e.Data.GetData(DataFormats.FileDrop));
+        }
+        #endregion
+
+        void CloseButtonClick(object sender, EventArgs e)
+        {
+            Close();
+        }
+
+        protected override void OnClosed(EventArgs e)
+        {
+            base.OnClosed(e);
+            instance = null;
+        }
+
+        public void TryRunAction(AddIn addIn, AddInAction action)
+        {
+            foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+            {
+                ctl.Selected = ctl.AddIn == addIn;
+            }
+            UpdateActionBox();
+            if (selectedAction == action && runActionButton.Visible && runActionButton.Enabled)
+                runActionButton.PerformClick();
+        }
+
+        public void TryUninstall(AddIn addIn)
+        {
+            foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+            {
+                ctl.Selected = ctl.AddIn == addIn;
+            }
+            UpdateActionBox();
+            if (uninstallButton.Visible && uninstallButton.Enabled)
+                uninstallButton.PerformClick();
+        }
+
+        void RunActionButtonClick(object sender, EventArgs e)
+        {
+            switch (selectedAction)
+            {
+                case AddInAction.Disable:
+                    for (int i = 0; i < selected.Count; i++)
+                    {
+                        if (selected[i].Manifest.PrimaryIdentity == "ICSharpCode.AddInManager")
+                        {
+                            MessageService.ShowMessage("${res:AddInManager.CannotDisableAddInManager}");
+                            selected.RemoveAt(i--);
+                        }
+                    }
+                    ICSharpCode.Core.AddInManager.Disable(selected);
+                    break;
+                case AddInAction.Enable:
+                    ICSharpCode.Core.AddInManager.Enable(selected);
+                    break;
+                case AddInAction.Install:
+                    RunInstallation();
+                    return;
+                case AddInAction.Uninstall:
+                    UninstallButtonClick(sender, e);
+                    return;
+                case AddInAction.InstalledTwice: // used to cancel installation of update
+                    InstallableAddIn.CancelUpdate(selected);
+                    foreach (AddIn addIn in selected)
+                    {
+                        addIn.Action = addIn.Enabled ? AddInAction.Enable : AddInAction.Disable;
+                    }
+                    break;
+                default:
+                    throw new NotImplementedException();
+            }
+            foreach (AddInControl ctl in splitContainer.Panel1.Controls)
+            {
+                ctl.Invalidate();
+            }
+            UpdateActionBox();
+        }
+
+        #region Windows Forms Designer generated code
+        /// <summary>
+        /// This method is required for Windows Forms designer support.
+        /// Do not change the method contents inside the source code editor. The Forms designer might
+        /// not be able to load this method if it was changed manually.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.topPanel = new System.Windows.Forms.Panel();
+            this.bottomPanel = new System.Windows.Forms.Panel();
+            this.installButton = new System.Windows.Forms.Button();
+            this.closeButton = new System.Windows.Forms.Button();
+            this.showPreinstalledAddInsCheckBox = new System.Windows.Forms.CheckBox();
+            this.splitContainer = new System.Windows.Forms.SplitContainer();
+            this.actionGroupBox = new System.Windows.Forms.GroupBox();
+            this.actionFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+            this.actionDescription = new System.Windows.Forms.Label();
+            this.dependencyTable = new System.Windows.Forms.TableLayoutPanel();
+            this.dummyLabel1 = new System.Windows.Forms.Label();
+            this.dummyLabel2 = new System.Windows.Forms.Label();
+            this.runActionButton = new System.Windows.Forms.Button();
+            this.uninstallButton = new System.Windows.Forms.Button();
+            this.bottomPanel.SuspendLayout();
+            this.splitContainer.Panel2.SuspendLayout();
+            this.splitContainer.SuspendLayout();
+            this.actionGroupBox.SuspendLayout();
+            this.actionFlowLayoutPanel.SuspendLayout();
+            this.dependencyTable.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // topPanel
+            // 
+            this.topPanel.Dock = System.Windows.Forms.DockStyle.Top;
+            this.topPanel.Location = new System.Drawing.Point(0, 0);
+            this.topPanel.Name = "topPanel";
+            this.topPanel.Size = new System.Drawing.Size(460, 33);
+            this.topPanel.TabIndex = 1;
+            this.topPanel.Visible = false;
+            // 
+            // bottomPanel
+            // 
+            this.bottomPanel.Controls.Add(this.installButton);
+            this.bottomPanel.Controls.Add(this.closeButton);
+            this.bottomPanel.Controls.Add(this.showPreinstalledAddInsCheckBox);
+            this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.bottomPanel.Location = new System.Drawing.Point(0, 355);
+            this.bottomPanel.Name = "bottomPanel";
+            this.bottomPanel.Size = new System.Drawing.Size(460, 35);
+            this.bottomPanel.TabIndex = 0;
+            // 
+            // installButton
+            // 
+            this.installButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.installButton.Location = new System.Drawing.Point(274, 6);
+            this.installButton.Name = "installButton";
+            this.installButton.Size = new System.Drawing.Size(93, 23);
+            this.installButton.TabIndex = 1;
+            this.installButton.Text = "Install AddIn";
+            this.installButton.UseCompatibleTextRendering = true;
+            this.installButton.UseVisualStyleBackColor = true;
+            this.installButton.Click += new System.EventHandler(this.InstallButtonClick);
+            // 
+            // closeButton
+            // 
+            this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.closeButton.Location = new System.Drawing.Point(373, 6);
+            this.closeButton.Name = "closeButton";
+            this.closeButton.Size = new System.Drawing.Size(75, 23);
+            this.closeButton.TabIndex = 2;
+            this.closeButton.Text = "Close";
+            this.closeButton.UseCompatibleTextRendering = true;
+            this.closeButton.UseVisualStyleBackColor = true;
+            this.closeButton.Click += new System.EventHandler(this.CloseButtonClick);
+            // 
+            // showPreinstalledAddInsCheckBox
+            // 
+            this.showPreinstalledAddInsCheckBox.Location = new System.Drawing.Point(3, 6);
+            this.showPreinstalledAddInsCheckBox.Name = "showPreinstalledAddInsCheckBox";
+            this.showPreinstalledAddInsCheckBox.Size = new System.Drawing.Size(169, 24);
+            this.showPreinstalledAddInsCheckBox.TabIndex = 0;
+            this.showPreinstalledAddInsCheckBox.Text = "Show preinstalled AddIns";
+            this.showPreinstalledAddInsCheckBox.UseCompatibleTextRendering = true;
+            this.showPreinstalledAddInsCheckBox.UseVisualStyleBackColor = true;
+            this.showPreinstalledAddInsCheckBox.CheckedChanged += new System.EventHandler(this.ShowPreinstalledAddInsCheckBoxCheckedChanged);
+            // 
+            // splitContainer
+            // 
+            this.splitContainer.BackColor = System.Drawing.SystemColors.Window;
+            this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+            this.splitContainer.Location = new System.Drawing.Point(0, 33);
+            this.splitContainer.Name = "splitContainer";
+            // 
+            // splitContainer.Panel1
+            // 
+            this.splitContainer.Panel1.AllowDrop = true;
+            this.splitContainer.Panel1.AutoScroll = true;
+            this.splitContainer.Panel1.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel1DragDrop);
+            this.splitContainer.Panel1.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel1DragEnter);
+            this.splitContainer.Panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.OnSplitContainerPanel1Paint);
+            this.splitContainer.Panel1MinSize = 100;
+            // 
+            // splitContainer.Panel2
+            // 
+            this.splitContainer.Panel2.Controls.Add(this.actionGroupBox);
+            this.splitContainer.Panel2MinSize = 100;
+            this.splitContainer.Size = new System.Drawing.Size(460, 322);
+            this.splitContainer.SplitterDistance = 248;
+            this.splitContainer.TabIndex = 2;
+            // 
+            // actionGroupBox
+            // 
+            this.actionGroupBox.Controls.Add(this.actionFlowLayoutPanel);
+            this.actionGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.actionGroupBox.Location = new System.Drawing.Point(0, 0);
+            this.actionGroupBox.Name = "actionGroupBox";
+            this.actionGroupBox.Size = new System.Drawing.Size(208, 322);
+            this.actionGroupBox.TabIndex = 0;
+            this.actionGroupBox.TabStop = false;
+            this.actionGroupBox.Text = "actionGroupBox";
+            this.actionGroupBox.UseCompatibleTextRendering = true;
+            // 
+            // actionFlowLayoutPanel
+            // 
+            this.actionFlowLayoutPanel.AutoScroll = true;
+            this.actionFlowLayoutPanel.Controls.Add(this.actionDescription);
+            this.actionFlowLayoutPanel.Controls.Add(this.dependencyTable);
+            this.actionFlowLayoutPanel.Controls.Add(this.runActionButton);
+            this.actionFlowLayoutPanel.Controls.Add(this.uninstallButton);
+            this.actionFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.actionFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
+            this.actionFlowLayoutPanel.ForeColor = System.Drawing.SystemColors.WindowText;
+            this.actionFlowLayoutPanel.Location = new System.Drawing.Point(3, 17);
+            this.actionFlowLayoutPanel.Name = "actionFlowLayoutPanel";
+            this.actionFlowLayoutPanel.Size = new System.Drawing.Size(202, 302);
+            this.actionFlowLayoutPanel.TabIndex = 0;
+            this.actionFlowLayoutPanel.WrapContents = false;
+            // 
+            // actionDescription
+            // 
+            this.actionDescription.AutoSize = true;
+            this.actionDescription.Location = new System.Drawing.Point(3, 0);
+            this.actionDescription.Name = "actionDescription";
+            this.actionDescription.Size = new System.Drawing.Size(90, 18);
+            this.actionDescription.TabIndex = 0;
+            this.actionDescription.Text = "actionDescription";
+            this.actionDescription.UseCompatibleTextRendering = true;
+            // 
+            // dependencyTable
+            // 
+            this.dependencyTable.AutoSize = true;
+            this.dependencyTable.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+            this.dependencyTable.ColumnCount = 2;
+            this.dependencyTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+            this.dependencyTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+            this.dependencyTable.Controls.Add(this.dummyLabel1, 1, 0);
+            this.dependencyTable.Controls.Add(this.dummyLabel2, 1, 1);
+            this.dependencyTable.Location = new System.Drawing.Point(3, 21);
+            this.dependencyTable.Name = "dependencyTable";
+            this.dependencyTable.RowCount = 2;
+            this.dependencyTable.RowStyles.Add(new System.Windows.Forms.RowStyle());
+            this.dependencyTable.RowStyles.Add(new System.Windows.Forms.RowStyle());
+            this.dependencyTable.Size = new System.Drawing.Size(55, 36);
+            this.dependencyTable.TabIndex = 1;
+            // 
+            // dummyLabel1
+            // 
+            this.dummyLabel1.AutoSize = true;
+            this.dummyLabel1.Location = new System.Drawing.Point(23, 0);
+            this.dummyLabel1.Name = "dummyLabel1";
+            this.dummyLabel1.Size = new System.Drawing.Size(29, 18);
+            this.dummyLabel1.TabIndex = 0;
+            this.dummyLabel1.Text = "dep1";
+            this.dummyLabel1.UseCompatibleTextRendering = true;
+            // 
+            // dummyLabel2
+            // 
+            this.dummyLabel2.AutoSize = true;
+            this.dummyLabel2.Location = new System.Drawing.Point(23, 18);
+            this.dummyLabel2.Name = "dummyLabel2";
+            this.dummyLabel2.Size = new System.Drawing.Size(29, 18);
+            this.dummyLabel2.TabIndex = 1;
+            this.dummyLabel2.Text = "dep2";
+            this.dummyLabel2.UseCompatibleTextRendering = true;
+            // 
+            // runActionButton
+            // 
+            this.runActionButton.AutoSize = true;
+            this.runActionButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+            this.runActionButton.Location = new System.Drawing.Point(3, 63);
+            this.runActionButton.MinimumSize = new System.Drawing.Size(91, 25);
+            this.runActionButton.Name = "runActionButton";
+            this.runActionButton.Size = new System.Drawing.Size(91, 25);
+            this.runActionButton.TabIndex = 2;
+            this.runActionButton.Text = "runAction";
+            this.runActionButton.UseCompatibleTextRendering = true;
+            this.runActionButton.UseVisualStyleBackColor = true;
+            this.runActionButton.Click += new System.EventHandler(this.RunActionButtonClick);
+            // 
+            // uninstallButton
+            // 
+            this.uninstallButton.AutoSize = true;
+            this.uninstallButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+            this.uninstallButton.Location = new System.Drawing.Point(3, 94);
+            this.uninstallButton.MinimumSize = new System.Drawing.Size(91, 25);
+            this.uninstallButton.Name = "uninstallButton";
+            this.uninstallButton.Size = new System.Drawing.Size(91, 25);
+            this.uninstallButton.TabIndex = 3;
+            this.uninstallButton.Text = "Uninstall";
+            this.uninstallButton.UseCompatibleTextRendering = true;
+            this.uninstallButton.UseVisualStyleBackColor = true;
+            this.uninstallButton.Click += new System.EventHandler(this.UninstallButtonClick);
+            // 
+            // ManagerForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(460, 390);
+            this.Controls.Add(this.splitContainer);
+            this.Controls.Add(this.bottomPanel);
+            this.Controls.Add(this.topPanel);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+            this.MinimumSize = new System.Drawing.Size(250, 200);
+            this.Name = "ManagerForm";
+            this.Text = "AddIn Manager";
+            this.bottomPanel.ResumeLayout(false);
+            this.splitContainer.Panel2.ResumeLayout(false);
+            this.splitContainer.ResumeLayout(false);
+            this.actionGroupBox.ResumeLayout(false);
+            this.actionFlowLayoutPanel.ResumeLayout(false);
+            this.actionFlowLayoutPanel.PerformLayout();
+            this.dependencyTable.ResumeLayout(false);
+            this.dependencyTable.PerformLayout();
+            this.ResumeLayout(false);
+        }
+        private System.Windows.Forms.Label dummyLabel2;
+        private System.Windows.Forms.Label dummyLabel1;
+        private System.Windows.Forms.CheckBox showPreinstalledAddInsCheckBox;
+        private System.Windows.Forms.Button installButton;
+        private System.Windows.Forms.Button uninstallButton;
+        private System.Windows.Forms.Button runActionButton;
+        private System.Windows.Forms.TableLayoutPanel dependencyTable;
+        private System.Windows.Forms.Label actionDescription;
+        private System.Windows.Forms.FlowLayoutPanel actionFlowLayoutPanel;
+        private System.Windows.Forms.GroupBox actionGroupBox;
+        private System.Windows.Forms.Button closeButton;
+        private System.Windows.Forms.SplitContainer splitContainer;
+        private System.Windows.Forms.Panel bottomPanel;
+        private System.Windows.Forms.Panel topPanel;
+        #endregion
+    }
+}


Property changes on: trunk/Tools/Maestro/Maestro.AddInManager/Properties
___________________________________________________________________
Added: bugtraq:number
   + true

Added: trunk/Tools/Maestro/Maestro.AddInManager/Properties/AssemblyInfo.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/Properties/AssemblyInfo.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/Properties/AssemblyInfo.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,20 @@
+#region Using directives
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+#endregion
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Maestro.AddInManager")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyProduct("Maestro.AddInManager")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible(false)]

Added: trunk/Tools/Maestro/Maestro.AddInManager/Strings.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/Strings.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/Strings.Designer.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,379 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.225
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Maestro.AddInManager {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Strings {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Strings() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Maestro.AddInManager.Strings", typeof(Strings).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to About.
+        /// </summary>
+        internal static string AddInManager_About {
+            get {
+                return ResourceManager.GetString("AddInManager.About", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cancel deinstallation.
+        /// </summary>
+        internal static string AddInManager_ActionCancelDeinstallation {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionCancelDeinstallation", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cancel installation.
+        /// </summary>
+        internal static string AddInManager_ActionCancelInstallation {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionCancelInstallation", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cancel update.
+        /// </summary>
+        internal static string AddInManager_ActionCancelUpdate {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionCancelUpdate", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Disable.
+        /// </summary>
+        internal static string AddInManager_ActionDisable {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionDisable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enable.
+        /// </summary>
+        internal static string AddInManager_ActionEnable {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionEnable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Install.
+        /// </summary>
+        internal static string AddInManager_ActionInstall {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionInstall", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Uninstall.
+        /// </summary>
+        internal static string AddInManager_ActionUninstall {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionUninstall", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Update.
+        /// </summary>
+        internal static string AddInManager_ActionUpdate {
+            get {
+                return ResourceManager.GetString("AddInManager.ActionUpdate", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to A dependency for this AddIn was not found. Install it to enable this AddIn..
+        /// </summary>
+        internal static string AddInManager_AddInDependencyFailed {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInDependencyFailed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Disabled.
+        /// </summary>
+        internal static string AddInManager_AddInDisabled {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInDisabled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn will be enabled after restarting Maestro.
+        /// </summary>
+        internal static string AddInManager_AddInEnabled {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInEnabled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn will be installed after restarting Maestro.
+        /// </summary>
+        internal static string AddInManager_AddInInstalled {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInInstalled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to This AddIns is installed twice. Please uninstall one  copy..
+        /// </summary>
+        internal static string AddInManager_AddInInstalledTwice {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInInstalledTwice", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn will be removed after restarting Maestro.
+        /// </summary>
+        internal static string AddInManager_AddInRemoved {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInRemoved", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn will be updated after restarting Maestro.
+        /// </summary>
+        internal static string AddInManager_AddInUpdated {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInUpdated", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn will be disabled after restarting Maestro.
+        /// </summary>
+        internal static string AddInManager_AddInWillBeDisabled {
+            get {
+                return ResourceManager.GetString("AddInManager.AddInWillBeDisabled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Aborts the deinstallation of the selected AddIn(s)..
+        /// </summary>
+        internal static string AddInManager_DescriptionCancelDeinstallation {
+            get {
+                return ResourceManager.GetString("AddInManager.DescriptionCancelDeinstallation", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Aborts the installation of the selected AddIn(s)..
+        /// </summary>
+        internal static string AddInManager_DescriptionCancelInstall {
+            get {
+                return ResourceManager.GetString("AddInManager.DescriptionCancelInstall", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Aborts the update of the selected AddIn(s)..
+        /// </summary>
+        internal static string AddInManager_DescriptionCancelUpdate {
+            get {
+                return ResourceManager.GetString("AddInManager.DescriptionCancelUpdate", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Disables the selected AddIn(s)..
+        /// </summary>
+        internal static string AddInManager_DescriptionDisable {
+            get {
+                return ResourceManager.GetString("AddInManager.DescriptionDisable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enables the selected AddIn(s)..
+        /// </summary>
+        internal static string AddInManager_DescriptionEnable {
+            get {
+                return ResourceManager.GetString("AddInManager.DescriptionEnable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The selection is inconsistent, please select only AddIns with the same status..
+        /// </summary>
+        internal static string AddInManager_DescriptionInconsistentSelection {
+            get {
+                return ResourceManager.GetString("AddInManager.DescriptionInconsistentSelection", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn Installation Package.
+        /// </summary>
+        internal static string AddInManager_FileAssociation {
+            get {
+                return ResourceManager.GetString("AddInManager.FileAssociation", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIn Files|*.addin;*.sdaddin|All files|*.*.
+        /// </summary>
+        internal static string AddInManager_FileFilter {
+            get {
+                return ResourceManager.GetString("AddInManager.FileFilter", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &Install AddIn.
+        /// </summary>
+        internal static string AddInManager_InstallButton {
+            get {
+                return ResourceManager.GetString("AddInManager.InstallButton", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to You don't have any AddIns installed.
+        ///Download an AddIn from the Internet, then click 'Install AddIn' and choose the downloaded file to install it..
+        /// </summary>
+        internal static string AddInManager_NoAddInsInstalled {
+            get {
+                return ResourceManager.GetString("AddInManager.NoAddInsInstalled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Open Website.
+        /// </summary>
+        internal static string AddInManager_OpenWebsite {
+            get {
+                return ResourceManager.GetString("AddInManager.OpenWebsite", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Options.
+        /// </summary>
+        internal static string AddInManager_Options {
+            get {
+                return ResourceManager.GetString("AddInManager.Options", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to AddIns are required by:.
+        /// </summary>
+        internal static string AddInManager_RequiredBy {
+            get {
+                return ResourceManager.GetString("AddInManager.RequiredBy", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Required dependencies:.
+        /// </summary>
+        internal static string AddInManager_RequiredDependencies {
+            get {
+                return ResourceManager.GetString("AddInManager.RequiredDependencies", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Show preinstalled AddIns.
+        /// </summary>
+        internal static string AddInManager_ShowPreinstalledAddIns {
+            get {
+                return ResourceManager.GetString("AddInManager.ShowPreinstalledAddIns", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Add-In Manager.
+        /// </summary>
+        internal static string AddInManager_Title {
+            get {
+                return ResourceManager.GetString("AddInManager.Title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Add-In Manager.
+        /// </summary>
+        internal static string CMD_AddInManager {
+            get {
+                return ResourceManager.GetString("CMD_AddInManager", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Close.
+        /// </summary>
+        internal static string TextClose {
+            get {
+                return ResourceManager.GetString("TextClose", resourceCulture);
+            }
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.AddInManager/Strings.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.AddInManager/Strings.resx	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.AddInManager/Strings.resx	2012-05-29 13:59:28 UTC (rev 6707)
@@ -0,0 +1,226 @@
+<?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>
+  <data name="AddInManager.About" xml:space="preserve">
+    <value>About</value>
+  </data>
+  <data name="AddInManager.ActionCancelDeinstallation" xml:space="preserve">
+    <value>Cancel deinstallation</value>
+  </data>
+  <data name="AddInManager.ActionCancelInstallation" xml:space="preserve">
+    <value>Cancel installation</value>
+  </data>
+  <data name="AddInManager.ActionCancelUpdate" xml:space="preserve">
+    <value>Cancel update</value>
+  </data>
+  <data name="AddInManager.ActionDisable" xml:space="preserve">
+    <value>Disable</value>
+  </data>
+  <data name="AddInManager.ActionEnable" xml:space="preserve">
+    <value>Enable</value>
+  </data>
+  <data name="AddInManager.ActionInstall" xml:space="preserve">
+    <value>Install</value>
+  </data>
+  <data name="AddInManager.ActionUninstall" xml:space="preserve">
+    <value>Uninstall</value>
+  </data>
+  <data name="AddInManager.ActionUpdate" xml:space="preserve">
+    <value>Update</value>
+  </data>
+  <data name="AddInManager.AddInDependencyFailed" xml:space="preserve">
+    <value>A dependency for this AddIn was not found. Install it to enable this AddIn.</value>
+  </data>
+  <data name="AddInManager.AddInDisabled" xml:space="preserve">
+    <value>Disabled</value>
+  </data>
+  <data name="AddInManager.AddInEnabled" xml:space="preserve">
+    <value>AddIn will be enabled after restarting Maestro</value>
+  </data>
+  <data name="AddInManager.AddInInstalled" xml:space="preserve">
+    <value>AddIn will be installed after restarting Maestro</value>
+  </data>
+  <data name="AddInManager.AddInInstalledTwice" xml:space="preserve">
+    <value>This AddIns is installed twice. Please uninstall one  copy.</value>
+  </data>
+  <data name="AddInManager.AddInRemoved" xml:space="preserve">
+    <value>AddIn will be removed after restarting Maestro</value>
+  </data>
+  <data name="AddInManager.AddInUpdated" xml:space="preserve">
+    <value>AddIn will be updated after restarting Maestro</value>
+  </data>
+  <data name="AddInManager.AddInWillBeDisabled" xml:space="preserve">
+    <value>AddIn will be disabled after restarting Maestro</value>
+  </data>
+  <data name="AddInManager.DescriptionCancelDeinstallation" xml:space="preserve">
+    <value>Aborts the deinstallation of the selected AddIn(s).</value>
+  </data>
+  <data name="AddInManager.DescriptionCancelInstall" xml:space="preserve">
+    <value>Aborts the installation of the selected AddIn(s).</value>
+  </data>
+  <data name="AddInManager.DescriptionCancelUpdate" xml:space="preserve">
+    <value>Aborts the update of the selected AddIn(s).</value>
+  </data>
+  <data name="AddInManager.DescriptionDisable" xml:space="preserve">
+    <value>Disables the selected AddIn(s).</value>
+  </data>
+  <data name="AddInManager.DescriptionEnable" xml:space="preserve">
+    <value>Enables the selected AddIn(s).</value>
+  </data>
+  <data name="AddInManager.DescriptionInconsistentSelection" xml:space="preserve">
+    <value>The selection is inconsistent, please select only AddIns with the same status.</value>
+  </data>
+  <data name="AddInManager.FileAssociation" xml:space="preserve">
+    <value>AddIn Installation Package</value>
+  </data>
+  <data name="AddInManager.FileFilter" xml:space="preserve">
+    <value>AddIn Files|*.addin;*.sdaddin|All files|*.*</value>
+  </data>
+  <data name="AddInManager.InstallButton" xml:space="preserve">
+    <value>&Install AddIn</value>
+  </data>
+  <data name="AddInManager.NoAddInsInstalled" xml:space="preserve">
+    <value>You don't have any AddIns installed.
+Download an AddIn from the Internet, then click 'Install AddIn' and choose the downloaded file to install it.</value>
+  </data>
+  <data name="AddInManager.OpenWebsite" xml:space="preserve">
+    <value>Open Website</value>
+  </data>
+  <data name="AddInManager.Options" xml:space="preserve">
+    <value>Options</value>
+  </data>
+  <data name="AddInManager.RequiredBy" xml:space="preserve">
+    <value>AddIns are required by:</value>
+  </data>
+  <data name="AddInManager.RequiredDependencies" xml:space="preserve">
+    <value>Required dependencies:</value>
+  </data>
+  <data name="AddInManager.ShowPreinstalledAddIns" xml:space="preserve">
+    <value>Show preinstalled AddIns</value>
+  </data>
+  <data name="AddInManager.Title" xml:space="preserve">
+    <value>Add-In Manager</value>
+  </data>
+  <data name="CMD_AddInManager" xml:space="preserve">
+    <value>Add-In Manager</value>
+  </data>
+  <data name="TextClose" xml:space="preserve">
+    <value>Close</value>
+  </data>
+</root>
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Base/Maestro.Base.addin
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/Maestro.Base.addin	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.Base/Maestro.Base.addin	2012-05-29 13:59:28 UTC (rev 6707)
@@ -2,7 +2,7 @@
        author="Jackie Ng"
        url="http://trac.osgeo.org/mapguide/wiki/maestro"
        description="Base Component for MapGuide Maestro"
-       addInManagerHidden="preinstalled">
+       addInManagerHidden="true">
 
     <Manifest>
         <Identity name="Maestro.Base" />
@@ -193,6 +193,11 @@
                   type="Menu"
                   label="${res:Menu_Tools}">
             <Include id="ToolList" path="/Workspace/Tools" />
+            <MenuItem type="Separator" />
+            <MenuItem id="Menu_Tools_Options"
+                      label="${res:Menu_Tools_Options}"
+                      icon="application_task"
+                      class="Maestro.Base.Commands.OptionsCommand"/>
         </MenuItem>
         <MenuItem id="Menu_Window"
                   type="Menu"
@@ -690,11 +695,6 @@
         <MenuItem id="CacheView"
                   label="${res:CacheView}"
                   class="Maestro.Base.Commands.CacheViewerCommand"/>
-        <MenuItem type="Separator" />
-        <MenuItem id="Menu_Tools_Options"
-                  label="${res:Menu_Tools_Options}"
-                  icon="application_task"
-                  class="Maestro.Base.Commands.OptionsCommand"/>
     </Path>
     
 </AddIn>

Modified: trunk/Tools/Maestro/Maestro.Base/UI/Preferences/ConfigProperties.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Base/UI/Preferences/ConfigProperties.cs	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Maestro.Base/UI/Preferences/ConfigProperties.cs	2012-05-29 13:59:28 UTC (rev 6707)
@@ -75,7 +75,7 @@
         public static string DefaultLocalFsPreviewPath { get { return Path.Combine(FileUtility.ApplicationRootPath, "MaestroFsPreview.exe"); } }
 
         public static string DefaultRtMapInspectorPath { get { return Path.Combine(FileUtility.ApplicationRootPath, "RtMapInspector.exe"); } }
-
+        
         public static Color DefaultOpenColor { get { return Color.LightGreen; } }
 
         public static Color DefaultDirtyColor { get { return Color.Pink; } }
@@ -83,7 +83,7 @@
         public static bool DefaultShowMessages { get { return true; } }
 
         public static bool DefaultShowOutboundRequests { get { return true; } }
-
+        
         public static bool DefaultValidateOnSave { get { return true; } }
 
         public static string DefaultXsdSchemaPath { get { return Path.Combine(FileUtility.ApplicationRootPath, "Schemas"); } }

Modified: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj	2012-05-29 13:59:28 UTC (rev 6707)
@@ -55,39 +55,66 @@
     </Compile>
     <Compile Include="Menu\IStatusUpdate.cs" />
     <Compile Include="Menu\ISubmenuBuilder.cs" />
-    <Compile Include="Menu\Menu.cs" />
-    <Compile Include="Menu\MenuCheckBox.cs" />
-    <Compile Include="Menu\MenuCommand.cs" />
-    <Compile Include="Menu\MenuSeparator.cs" />
+    <Compile Include="Menu\Menu.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Menu\MenuCheckBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Menu\MenuCommand.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Menu\MenuSeparator.cs">
+      <SubType>Component</SubType>
+    </Compile>
     <Compile Include="Menu\MenuService.cs" />
-    <Compile Include="MessageService\CustomDialog.cs" />
+    <Compile Include="MessageService\CustomDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
     <Compile Include="MessageService\IDialogMessageService.cs" />
-    <Compile Include="MessageService\InputBox.cs" />
-    <Compile Include="MessageService\SaveErrorChooseDialog.cs" />
-    <Compile Include="MessageService\SaveErrorInformDialog.cs" />
+    <Compile Include="MessageService\InputBox.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MessageService\SaveErrorChooseDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MessageService\SaveErrorInformDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
     <Compile Include="MessageService\WinFormsMessageService.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ToolBar\ToolBarCheckBox.cs" />
-    <Compile Include="ToolBar\ToolBarComboBox.cs" />
-    <Compile Include="ToolBar\ToolBarCommand.cs" />
-    <Compile Include="ToolBar\ToolBarDropDownButton.cs" />
-    <Compile Include="ToolBar\ToolBarLabel.cs" />
-    <Compile Include="ToolBar\ToolBarSeparator.cs" />
+    <Compile Include="ToolBar\ToolBarCheckBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ToolBar\ToolBarComboBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ToolBar\ToolBarCommand.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ToolBar\ToolBarDropDownButton.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ToolBar\ToolBarLabel.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ToolBar\ToolBarSeparator.cs">
+      <SubType>Component</SubType>
+    </Compile>
     <Compile Include="ToolBar\ToolBarService.cs" />
-    <Compile Include="ToolBar\ToolBarSplitButton.cs" />
-    <Compile Include="ToolBar\ToolBarTextBox.cs" />
+    <Compile Include="ToolBar\ToolBarSplitButton.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ToolBar\ToolBarTextBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
     <Compile Include="Util\ClipboardWrapper.cs" />
     <Compile Include="Util\NativeMethods.cs" />
     <Compile Include="Util\RightToLeftConverter.cs" />
     <Compile Include="WinFormsResourceService.cs" />
   </ItemGroup>
+  <ItemGroup />
   <ItemGroup>
-    <Folder Include="Menu" />
-    <Folder Include="MessageService" />
-    <Folder Include="ToolBar" />
-    <Folder Include="Util" />
-  </ItemGroup>
-  <ItemGroup>
     <ProjectReference Include="..\ICSharpCode.Core\ICSharpCode.Core.csproj">
       <Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
       <Name>ICSharpCode.Core</Name>

Modified: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj	2012-05-29 12:27:02 UTC (rev 6706)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj	2012-05-29 13:59:28 UTC (rev 6707)
@@ -147,7 +147,7 @@
     <Compile Include="Src\Document\ITextEditorProperties.cs" />
     <Compile Include="Src\Gui\Caret.cs" />
     <Compile Include="Src\Gui\TextArea.cs">
-      <SubType>UserControl</SubType>
+      <SubType>Component</SubType>
     </Compile>
     <Compile Include="Src\Gui\TextEditorControl.cs">
       <SubType>UserControl</SubType>
@@ -189,7 +189,7 @@
     </Compile>
     <Compile Include="Src\Gui\BrushRegistry.cs" />
     <Compile Include="Src\Gui\HRuler.cs">
-      <SubType>UserControl</SubType>
+      <SubType>Component</SubType>
     </Compile>
     <Compile Include="Src\Document\BookmarkManager\Bookmark.cs" />
     <Compile Include="Src\Document\BookmarkManager\BookmarkEventHandler.cs" />



More information about the mapguide-commits mailing list