[mapguide-commits] r6941 - in trunk/Tools/Maestro/Maestro.Editors: . Common

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Aug 20 05:57:10 PDT 2012


Author: jng
Date: 2012-08-20 05:57:10 -0700 (Mon, 20 Aug 2012)
New Revision: 6941

Added:
   trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.resx
Modified:
   trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs
   trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.resx
   trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj
Log:
#2095: Refactor out repository browsing functionality of the ResourcePicker into its own separate class (RepositoryView)

Added: trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryTreeModel.cs	2012-08-20 12:57:10 UTC (rev 6941)
@@ -0,0 +1,253 @@
+#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.Linq;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels.Common;
+using System.Drawing;
+using OSGeo.MapGuide.MaestroAPI;
+
+namespace Maestro.Editors.Common
+{
+    class DummyNode : TreeNode
+    {
+
+    }
+
+    internal class RepositoryModelItem
+    {
+        private IRepositoryItem _item;
+
+        public RepositoryModelItem(IRepositoryItem item)
+        {
+            _item = item;
+            if (this.IsRoot)
+            {
+                this.ImageIndex = RepositoryIcons.RES_ROOT;
+            }
+            else
+            {
+                if (this.IsFolder)
+                    this.ImageIndex = RepositoryIcons.RES_FOLDER;
+                else
+                    this.ImageIndex = RepositoryIcons.GetImageIndexForResourceType(_item.ResourceType);
+            }
+        }
+
+        public int ImageIndex { get; private set; }
+
+        public string Name { get { return _item.Name; } }
+
+        public string ResourceId { get { return _item.ResourceId; } }
+
+        public bool HasChildren { get { return _item.HasChildren; } }
+
+        public bool IsFolder
+        {
+            get { return _item.IsFolder; }
+        }
+
+        public bool IsRoot
+        {
+            get { return this.ResourceId == "Library://"; }
+        }
+
+        public IRepositoryItem Instance { get { return _item; } }
+    }
+
+    internal class RepositoryFolderTreeModel
+    {
+        internal event EventHandler ItemSelected;
+
+        private IResourceService _resSvc;
+        private TreeView _tree;
+
+        public RepositoryModelItem SelectedItem
+        {
+            get;
+            private set;
+        }
+
+        private void StartUpdate()
+        {
+            _tree.BeginUpdate();
+            _tree.Cursor = Cursors.WaitCursor;
+        }
+
+        private void EndUpdate()
+        {
+            _tree.EndUpdate();
+            _tree.Cursor = Cursors.Default;
+        }
+
+        private bool _bFoldersOnly;
+
+        public bool FoldersOnly { get { return _bFoldersOnly; } }
+
+        public RepositoryFolderTreeModel(IResourceService resSvc, TreeView tree, bool bFoldersOnly)
+        {
+            _resSvc = resSvc;
+            _tree = tree;
+            _bFoldersOnly = bFoldersOnly;
+
+            _tree.AfterExpand += new TreeViewEventHandler(OnNodeAfterExpand);
+            _tree.AfterSelect += new TreeViewEventHandler(OnNodeAfterSelect);
+
+            _tree.Nodes.Clear();
+            StartUpdate();
+            foreach (RepositoryModelItem folder in GetChildren(null))
+            {
+                var node = CreateNode(folder);
+                _tree.Nodes.Add(node);
+            }
+            EndUpdate();
+        }
+
+        void OnNodeAfterSelect(object sender, TreeViewEventArgs e)
+        {
+            RepositoryModelItem item = (RepositoryModelItem)e.Node.Tag;
+            SetSelectedItem(item);
+        }
+
+        private void SetSelectedItem(RepositoryModelItem item)
+        {
+            this.SelectedItem = item;
+            var handler = this.ItemSelected;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        bool IsNodeNotPopulated(TreeNode node)
+        {
+            return node.Nodes.Count == 1 && node.Nodes[0].GetType() == typeof(DummyNode);
+        }
+
+        void OnNodeAfterExpand(object sender, TreeViewEventArgs e)
+        {
+            UpdateNode(e.Node);
+        }
+
+        private void UpdateNode(TreeNode nodeToUpdate)
+        {
+            RepositoryModelItem folder = (RepositoryModelItem)nodeToUpdate.Tag;
+            if (IsNodeNotPopulated(nodeToUpdate))
+                nodeToUpdate.Nodes.Clear();
+
+            if (folder.HasChildren && nodeToUpdate.Nodes.Count == 0)
+            {
+                StartUpdate();
+                foreach (RepositoryModelItem f in GetChildren(folder))
+                {
+                    var node = CreateNode(f);
+                    nodeToUpdate.Nodes.Add(node);
+                }
+                EndUpdate();
+            }
+        }
+
+        private static TreeNode CreateNode(RepositoryModelItem item)
+        {
+            var node = new TreeNode();
+            node.Name = item.Name;
+            node.Text = item.Name;
+            node.Tag = item;
+            node.ImageIndex = node.SelectedImageIndex = item.IsRoot ? RepositoryIcons.RES_ROOT : RepositoryIcons.RES_FOLDER;
+            node.Nodes.Add(new DummyNode());
+            return node;
+        }
+
+        private System.Collections.IEnumerable GetSorted(ResourceList list)
+        {
+            //Sort them before returning them
+            SortedList<string, RepositoryModelItem> folders = new SortedList<string, RepositoryModelItem>();
+            foreach (var item in list.Children)
+            {
+                if (item.IsFolder)
+                    folders.Add(item.Name, new RepositoryModelItem(item));
+            }
+            foreach (var folder in folders.Values)
+            {
+                yield return folder;
+            }
+        }
+
+        public System.Collections.IEnumerable GetChildren(RepositoryModelItem item)
+        {
+            if (item == null)
+            {
+                var list = _resSvc.GetRepositoryResources("Library://", 0);
+                return GetSorted(list);
+            }
+            else
+            {
+                if (item.HasChildren)
+                {
+                    var list = _resSvc.GetRepositoryResources(item.ResourceId, _bFoldersOnly ? ResourceTypes.Folder.ToString() : "", 1, true);
+                    return GetSorted(list);
+                }
+                else
+                {
+                    return new RepositoryModelItem[0];
+                }
+            }
+        }
+
+        internal void NavigateTo(string folderId)
+        {
+            NavigateTo(folderId, null);
+        }
+
+        internal void NavigateTo(string folderId, TreeNode currentNode)
+        {
+            TreeNodeCollection nodeList = null;
+
+            if (currentNode == null)
+            {
+                nodeList = _tree.Nodes;
+            }
+            else
+            {
+                var item = (RepositoryModelItem)currentNode.Tag;
+                if (folderId.Equals(item.ResourceId))
+                {
+                    _tree.SelectedNode = currentNode;
+                    SetSelectedItem(item);
+                    return;
+                }
+                nodeList = currentNode.Nodes;
+            }
+
+            foreach (TreeNode node in nodeList)
+            {
+                var folder = (RepositoryModelItem)node.Tag;
+                if (folderId.StartsWith(folder.ResourceId))
+                {
+                    UpdateNode(node);
+                    node.Expand();
+                    NavigateTo(folderId, node);
+                    break;
+                }
+            }
+        }
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.Designer.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.Designer.cs	2012-08-20 12:57:10 UTC (rev 6941)
@@ -0,0 +1,68 @@
+namespace Maestro.Editors.Common
+{
+    partial class RepositoryView
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.trvRepository = new System.Windows.Forms.TreeView();
+            this.resImageList = new System.Windows.Forms.ImageList(this.components);
+            this.SuspendLayout();
+            // 
+            // trvRepository
+            // 
+            this.trvRepository.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.trvRepository.ImageIndex = 0;
+            this.trvRepository.ImageList = this.resImageList;
+            this.trvRepository.Location = new System.Drawing.Point(0, 0);
+            this.trvRepository.Name = "trvRepository";
+            this.trvRepository.SelectedImageIndex = 0;
+            this.trvRepository.Size = new System.Drawing.Size(150, 150);
+            this.trvRepository.TabIndex = 0;
+            // 
+            // resImageList
+            // 
+            this.resImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+            this.resImageList.ImageSize = new System.Drawing.Size(16, 16);
+            this.resImageList.TransparentColor = System.Drawing.Color.Transparent;
+            // 
+            // RepositoryView
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.trvRepository);
+            this.Name = "RepositoryView";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TreeView trvRepository;
+        private System.Windows.Forms.ImageList resImageList;
+    }
+}

Added: trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs	                        (rev 0)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/RepositoryView.cs	2012-08-20 12:57:10 UTC (rev 6941)
@@ -0,0 +1,88 @@
+#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 OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.MaestroAPI.Services;
+
+namespace Maestro.Editors.Common
+{
+    public partial class RepositoryView : UserControl
+    {
+        public RepositoryView()
+        {
+            InitializeComponent();
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+            RepositoryIcons.PopulateImageList(resImageList);
+        }
+
+        public void NavigateTo(string folderId)
+        {
+            if (_model != null)
+                _model.NavigateTo(folderId);
+        }
+
+        public void Init(IResourceService resSvc, bool bFoldersOnly)
+        {
+            if (_model != null)
+            {
+                _model.ItemSelected -= OnItemSelectedInternal;
+            }
+
+            _model = new RepositoryFolderTreeModel(resSvc, trvRepository, bFoldersOnly);
+            _model.ItemSelected += OnItemSelectedInternal; 
+        }
+
+        void OnItemSelectedInternal(object sender, EventArgs e)
+        {
+            var h = this.ItemSelected;
+            if (h != null)
+                h(this, EventArgs.Empty);
+        }
+
+        private RepositoryFolderTreeModel _model;
+
+        public IRepositoryItem SelectedItem
+        {
+            get
+            {
+                if (_model != null)
+                {
+                    var it = _model.SelectedItem;
+                    if (it != null)
+                        return it.Instance;
+                }
+                return null;
+            }
+        }
+
+        public event EventHandler ItemSelected;
+    }
+}

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

Modified: trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.Designer.cs	2012-08-20 11:43:34 UTC (rev 6940)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.Designer.cs	2012-08-20 12:57:10 UTC (rev 6941)
@@ -43,13 +43,13 @@
             this.label3 = new System.Windows.Forms.Label();
             this.label4 = new System.Windows.Forms.Label();
             this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-            this.trvFolders = new System.Windows.Forms.TreeView();
             this.folderImageList = new System.Windows.Forms.ImageList(this.components);
             this.label2 = new System.Windows.Forms.Label();
             this.txtFolder = new System.Windows.Forms.TextBox();
             this.label5 = new System.Windows.Forms.Label();
             this.txtName = new System.Windows.Forms.TextBox();
             this.resIdComponentPanel = new System.Windows.Forms.Panel();
+            this.repoView = new Maestro.Editors.Common.RepositoryView();
             ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
             this.splitContainer1.Panel1.SuspendLayout();
             this.splitContainer1.Panel2.SuspendLayout();
@@ -145,7 +145,7 @@
             // 
             // splitContainer1.Panel1
             // 
-            this.splitContainer1.Panel1.Controls.Add(this.trvFolders);
+            this.splitContainer1.Panel1.Controls.Add(this.repoView);
             this.splitContainer1.Panel1.Controls.Add(this.label3);
             // 
             // splitContainer1.Panel2
@@ -153,12 +153,6 @@
             this.splitContainer1.Panel2.Controls.Add(this.lstResources);
             this.splitContainer1.Panel2.Controls.Add(this.label4);
             // 
-            // trvFolders
-            // 
-            resources.ApplyResources(this.trvFolders, "trvFolders");
-            this.trvFolders.ImageList = this.folderImageList;
-            this.trvFolders.Name = "trvFolders";
-            // 
             // folderImageList
             // 
             this.folderImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
@@ -197,6 +191,11 @@
             this.resIdComponentPanel.Controls.Add(this.txtFolder);
             this.resIdComponentPanel.Name = "resIdComponentPanel";
             // 
+            // repoView
+            // 
+            resources.ApplyResources(this.repoView, "repoView");
+            this.repoView.Name = "repoView";
+            // 
             // ResourcePicker
             // 
             this.AcceptButton = this.btnOK;
@@ -246,7 +245,7 @@
         private System.Windows.Forms.Label label5;
         private System.Windows.Forms.TextBox txtName;
         private System.Windows.Forms.Panel resIdComponentPanel;
-        private System.Windows.Forms.TreeView trvFolders;
         private System.Windows.Forms.ImageList folderImageList;
+        private Common.RepositoryView repoView;
     }
 }
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs	2012-08-20 11:43:34 UTC (rev 6940)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.cs	2012-08-20 12:57:10 UTC (rev 6941)
@@ -30,6 +30,7 @@
 using OSGeo.MapGuide.ObjectModels.Common;
 using System.Security.AccessControl;
 using OSGeo.MapGuide.MaestroAPI.Resource;
+using Maestro.Editors.Common;
 
 namespace Maestro.Editors.Generic
 {
@@ -67,8 +68,6 @@
 
         private bool _resourceMode = false;
 
-        private RepositoryFolderTreeModel _model;
-
         /// <summary>
         /// Constructs a new instance. Use this overload to select any resource type. If only
         /// folder selection is desired, set <see cref="SelectFoldersOnly"/> to true before
@@ -80,8 +79,8 @@
             : this()
         {
             _resSvc = resSvc;
-            _model = new RepositoryFolderTreeModel(_resSvc, trvFolders);
-            _model.FolderSelected += OnFolderSelected;
+            repoView.Init(resSvc, true);
+            repoView.ItemSelected += OnFolderSelected;
             this.UseFilter = true;
             this.Mode = mode;
             SetStartingPoint(LastSelectedFolder.FolderId);
@@ -108,8 +107,8 @@
             if (!_resSvc.ResourceExists(folderId))
                 folderId = "Library://";
 
-            this.ActiveControl = trvFolders;
-            _model.NavigateTo(folderId);
+            this.ActiveControl = repoView;
+            repoView.NavigateTo(folderId);
             this.SelectedFolder = folderId;
 
             //HACK: Navigating to the specified folder takes away the focus to the 
@@ -309,24 +308,21 @@
         }
 
         private void UpdateDocumentList()
-        {   
-            if (_model != null)
+        {
+            IRepositoryItem folder = repoView.SelectedItem;
+            if (folder != null)
             {
-                RepositoryFolder folder = _model.SelectedFolder;
-                if (folder != null)
+                txtFolder.Text = folder.ResourceId;
+
+                if (!this.SelectFoldersOnly)
                 {
-                    txtFolder.Text = folder.ResourceId;
+                    ResourceList list = null;
+                    if (!this.UseFilter)
+                        list = _resSvc.GetRepositoryResources(folder.ResourceId, 1);
+                    else
+                        list = _resSvc.GetRepositoryResources(folder.ResourceId, this.Filter.ToString(), 1);
 
-                    if (!this.SelectFoldersOnly)
-                    {
-                        ResourceList list = null;
-                        if (!this.UseFilter)
-                            list = _resSvc.GetRepositoryResources(folder.ResourceId, 1);
-                        else
-                            list = _resSvc.GetRepositoryResources(folder.ResourceId, this.Filter.ToString(), 1);
-
-                        PopulateDocumentList(list);
-                    }
+                    PopulateDocumentList(list);
                 }
             }
         }
@@ -425,215 +421,4 @@
         /// </summary>
         OpenFolder
     }
-
-    internal class RepositoryFolder
-    {
-        private IRepositoryItem _item;
-
-        public RepositoryFolder(IRepositoryItem item)
-        {
-            _item = item;
-        }
-
-        public string Name { get { return _item.Name; } }
-
-        public string ResourceId { get { return _item.ResourceId; } }
-
-        public bool HasChildren { get { return _item.HasChildren; } }
-
-        public Image Icon
-        {
-            get
-            {
-                if (IsRoot)
-                {
-                    return Properties.Resources.server;
-                }
-                else
-                {
-                    return Properties.Resources.folder_horizontal;
-                }
-            }
-        }
-
-        public bool IsRoot
-        {
-            get { return this.ResourceId == "Library://"; }
-        }
-    }
-
-    internal class RepositoryFolderTreeModel
-    {
-        class DummyNode : TreeNode
-        {
-
-        }
-
-        internal event EventHandler FolderSelected;
-
-        private IResourceService _resSvc;
-        private TreeView _tree;
-
-        public RepositoryFolder SelectedFolder
-        {
-            get;
-            private set;
-        }
-
-        private void StartUpdate()
-        {
-            _tree.BeginUpdate();
-            _tree.Cursor = Cursors.WaitCursor;
-        }
-
-        private void EndUpdate()
-        {
-            _tree.EndUpdate();
-            _tree.Cursor = Cursors.Default;
-        }
-
-        public RepositoryFolderTreeModel(IResourceService resSvc, TreeView tree)
-        {
-            _resSvc = resSvc;
-            _tree = tree;
-
-            _tree.AfterExpand += new TreeViewEventHandler(OnNodeAfterExpand);
-            _tree.AfterSelect += new TreeViewEventHandler(OnNodeAfterSelect);
-
-            StartUpdate();
-            foreach (RepositoryFolder folder in GetChildren(null))
-            {
-                var node = CreateNode(folder);
-                _tree.Nodes.Add(node);
-            }
-            EndUpdate();
-        }
-
-        void OnNodeAfterSelect(object sender, TreeViewEventArgs e)
-        {
-            RepositoryFolder folder = (RepositoryFolder)e.Node.Tag;
-            SetSelectedFolder(folder);
-        }
-
-        private void SetSelectedFolder(RepositoryFolder folder)
-        {
-            this.SelectedFolder = folder;
-            var handler = this.FolderSelected;
-            if (handler != null)
-                handler(this, EventArgs.Empty);
-        }
-
-        bool IsNodeNotPopulated(TreeNode node)
-        {
-            return node.Nodes.Count == 1 && node.Nodes[0].GetType() == typeof(DummyNode);
-        }
-
-        void OnNodeAfterExpand(object sender, TreeViewEventArgs e)
-        {
-            UpdateNode(e.Node);
-        }
-
-        private void UpdateNode(TreeNode nodeToUpdate)
-        {
-            RepositoryFolder folder = (RepositoryFolder)nodeToUpdate.Tag;
-            if (IsNodeNotPopulated(nodeToUpdate))
-                nodeToUpdate.Nodes.Clear();
-
-            if (folder.HasChildren && nodeToUpdate.Nodes.Count == 0)
-            {
-                StartUpdate();
-                foreach (RepositoryFolder f in GetChildren(folder))
-                {
-                    var node = CreateNode(f);
-                    nodeToUpdate.Nodes.Add(node);
-                }
-                EndUpdate();
-            }
-        }
-
-        private static TreeNode CreateNode(RepositoryFolder folder)
-        {
-            var node = new TreeNode();
-            node.Name = folder.Name;
-            node.Text = folder.Name;
-            node.Tag = folder;
-            node.ImageIndex = node.SelectedImageIndex = folder.IsRoot ? RepositoryIcons.RES_ROOT : RepositoryIcons.RES_FOLDER;
-            node.Nodes.Add(new DummyNode());
-            return node;
-        }
-
-        private System.Collections.IEnumerable GetSorted(ResourceList list)
-        {
-            //Sort them before returning them
-            SortedList<string, RepositoryFolder> folders = new SortedList<string, RepositoryFolder>();
-            foreach (var item in list.Children)
-            {
-                if (item.IsFolder)
-                    folders.Add(item.Name, new RepositoryFolder(item));
-            }
-            foreach (var folder in folders.Values)
-            {
-                yield return folder;
-            }
-        }
-
-        public System.Collections.IEnumerable GetChildren(RepositoryFolder folder)
-        {
-            if (folder == null)
-            {
-                var list = _resSvc.GetRepositoryResources("Library://", 0);
-                return GetSorted(list);
-            }
-            else
-            {
-                if (folder.HasChildren)
-                {
-                    var list = _resSvc.GetRepositoryResources(folder.ResourceId, ResourceTypes.Folder.ToString(), 1, true);
-                    return GetSorted(list);
-                }
-                else
-                {
-                    return new RepositoryFolder[0];
-                }
-            }
-        }
-
-        internal void NavigateTo(string folderId)
-        {
-            NavigateTo(folderId, null);
-        }
-
-        internal void NavigateTo(string folderId, TreeNode currentNode)
-        {
-            TreeNodeCollection nodeList = null;
-
-            if (currentNode == null)
-            {
-                nodeList = _tree.Nodes;
-            }
-            else
-            {
-                var folder = (RepositoryFolder)currentNode.Tag;
-                if (folderId.Equals(folder.ResourceId))
-                {
-                    _tree.SelectedNode = currentNode;
-                    SetSelectedFolder(folder);
-                    return;
-                }
-                nodeList = currentNode.Nodes;
-            }
-
-            foreach (TreeNode node in nodeList)
-            {
-                var folder = (RepositoryFolder)node.Tag;
-                if (folderId.StartsWith(folder.ResourceId))
-                {
-                    UpdateNode(node);
-                    node.Expand();
-                    NavigateTo(folderId, node);
-                    break;
-                }
-            }
-        }
-    }
 }

Modified: trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.resx	2012-08-20 11:43:34 UTC (rev 6940)
+++ trunk/Tools/Maestro/Maestro.Editors/Common/ResourcePicker.resx	2012-08-20 12:57:10 UTC (rev 6941)
@@ -375,40 +375,28 @@
   <data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
     <value>0, 0</value>
   </data>
-  <data name="trvFolders.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+  <data name="repoView.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Bottom, Left, Right</value>
   </data>
-  <data name="trvFolders.ImageIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <metadata name="folderImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>137, 17</value>
-  </metadata>
-  <data name="folderImageList.ImageSize" type="System.Drawing.Size, System.Drawing">
-    <value>16, 16</value>
-  </data>
-  <data name="trvFolders.Location" type="System.Drawing.Point, System.Drawing">
+  <data name="repoView.Location" type="System.Drawing.Point, System.Drawing">
     <value>12, 31</value>
   </data>
-  <data name="trvFolders.SelectedImageIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="trvFolders.Size" type="System.Drawing.Size, System.Drawing">
+  <data name="repoView.Size" type="System.Drawing.Size, System.Drawing">
     <value>178, 298</value>
   </data>
-  <data name="trvFolders.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
+  <data name="repoView.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
   </data>
-  <data name=">>trvFolders.Name" xml:space="preserve">
-    <value>trvFolders</value>
+  <data name=">>repoView.Name" xml:space="preserve">
+    <value>repoView</value>
   </data>
-  <data name=">>trvFolders.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>repoView.Type" xml:space="preserve">
+    <value>Maestro.Editors.Common.RepositoryView, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
-  <data name=">>trvFolders.Parent" xml:space="preserve">
+  <data name=">>repoView.Parent" xml:space="preserve">
     <value>splitContainer1.Panel1</value>
   </data>
-  <data name=">>trvFolders.ZOrder" xml:space="preserve">
+  <data name=">>repoView.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
   <data name=">>splitContainer1.Panel1.Name" xml:space="preserve">
@@ -456,6 +444,12 @@
   <data name=">>splitContainer1.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
+  <metadata name="folderImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>137, 17</value>
+  </metadata>
+  <data name="folderImageList.ImageSize" type="System.Drawing.Size, System.Drawing">
+    <value>16, 16</value>
+  </data>
   <data name="label2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Left</value>
   </data>

Modified: trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj	2012-08-20 11:43:34 UTC (rev 6940)
+++ trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj	2012-08-20 12:57:10 UTC (rev 6941)
@@ -127,6 +127,13 @@
       <DependentUpon>GenericItemSelectionDialog.cs</DependentUpon>
     </Compile>
     <Compile Include="Common\NsDoc.cs" />
+    <Compile Include="Common\RepositoryTreeModel.cs" />
+    <Compile Include="Common\RepositoryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Common\RepositoryView.Designer.cs">
+      <DependentUpon>RepositoryView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Common\ResourceDataCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -1282,6 +1289,9 @@
     <EmbeddedResource Include="Common\GenericItemSelectionDialog.resx">
       <DependentUpon>GenericItemSelectionDialog.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Common\RepositoryView.resx">
+      <DependentUpon>RepositoryView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Common\ResourceDataCtrl.resx">
       <DependentUpon>ResourceDataCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>



More information about the mapguide-commits mailing list