[mapguide-commits] r5023 - in sandbox/maestro-3.0: Generated Maestro.Base/Editor Maestro.Editors Maestro.Editors/Common Maestro.Editors/LayerDefinition/Vector Maestro.Editors/Properties Maestro.Editors/Resources OSGeo.MapGuide.MaestroAPI/Services OSGeo.MapGuide.MaestroAPI.Http

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Sat Jul 10 11:34:02 EDT 2010


Author: jng
Date: 2010-07-10 15:34:02 +0000 (Sat, 10 Jul 2010)
New Revision: 5023

Added:
   sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.resx
   sandbox/maestro-3.0/Maestro.Editors/Resources/block.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/funnel.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/grid.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/property.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/ruler.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/sum.png
   sandbox/maestro-3.0/Maestro.Editors/Resources/table.png
Modified:
   sandbox/maestro-3.0/Generated/FdoProviderCapabilities-1.0.0.designer.cs
   sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
Log:
This submission includes the following changes:
 - Port over the current expression editor with some minor tweaks in visuals/naming/usage
 - Enable Layer Definition Editor to use the Expression Editor for editing the Filter, Url and Tooltip properties
 - Add missing GetProviderCapabilities() API to IFeatureService
 - Fix generated code for FdoProviderCapabilities

Modified: sandbox/maestro-3.0/Generated/FdoProviderCapabilities-1.0.0.designer.cs
===================================================================
--- sandbox/maestro-3.0/Generated/FdoProviderCapabilities-1.0.0.designer.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Generated/FdoProviderCapabilities-1.0.0.designer.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -2272,7 +2272,7 @@
         private string descriptionField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
-        private FdoProviderCapabilitiesExpressionFunctionDefinitionReturnType returnTypeField;
+        private string returnTypeField;
         
         [EditorBrowsable(EditorBrowsableState.Never)]
         private BindingList<FdoProviderCapabilitiesExpressionFunctionDefinitionArgumentDefinition> argumentDefinitionListField;
@@ -2315,12 +2315,12 @@
             }
         }
         
-        public FdoProviderCapabilitiesExpressionFunctionDefinitionReturnType ReturnType {
+        public string ReturnType {
             get {
                 return this.returnTypeField;
             }
             set {
-                if ((returnTypeField.Equals(value) != true)) {
+                if (returnTypeField != value) {
                     this.returnTypeField = value;
                     this.OnPropertyChanged("ReturnType");
                 }

Modified: sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -51,7 +51,15 @@
 
         public string EditExpression(string currentExpr, OSGeo.MapGuide.MaestroAPI.FeatureSourceDescription.FeatureSourceSchema schema, string providerName, string featureSourceId)
         {
-            throw new NotImplementedException();
+            var ed = new ExpressionEditor();
+            var caps = this.FeatureService.GetProviderCapabilities(providerName);
+            ed.Initialize(this.FeatureService, caps, schema, featureSourceId);
+            ed.Expression = currentExpr;
+            if (ed.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                return ed.Expression;
+            }
+            return null;
         }
 
         public IResource GetEditedResource()

Added: sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -0,0 +1,914 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels.Capabilities;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using Maestro.Shared.UI;
+
+namespace Maestro.Editors.Common
+{
+    /*
+     * Intellisense overview:
+     * 
+     * The intellisense of this expression editor consists of the following parts:
+     *  - An ImageListBox which is filled with auto-complete suggestions
+     *  - A System.Windows.Forms.ToolTip which is shown when an auto-complete choice is highlighted (but not selected)
+     * 
+     * In order to invoke intellisense, we listen for the KeyUp and KeyDown events
+     * on the textbox to determine what actions to take. Some actions include:
+     * 
+     * Key Up:
+     *  - Comma: Show auto-complete with all suggestions
+     *  - Quotes (Single or Double): Insert an extra quote of that type
+     *  - Up/Down: Move the auto-complete selection up/down one item if the auto-complete box is visible.
+     *  - Backspace: Invoke auto-complete with suggestions if there is a context buffer, otherwise hide auto-complete.
+     *  - Alt + Right: Invoke auto-complete with all suggestions
+     *  - Alphanumeric (no modifiers): Invoke auto-complete with suggestions
+     * 
+     * Key Down:
+     *  - Escape: Hide auto-complete
+     *  - Enter: Hide auto-complete
+     * 
+     * As part of the loading process, a full list of auto-complete items (functions/properties) is constructed (sorted by name)
+     * Everytime intellisense is invoked, this list is queried for possible suggestions.
+     * 
+     * In order to determine what items to suggest, the editor builds a context buffer from the current position of the caret
+     * in the textbox. The context buffer algorithm is as follows:
+     * 
+     *  1 - Start from caret position
+     *  2 - Can we move back one char?
+     *    2.1 - Get this char.
+     *    2.2 - If alpha numeric, goto 2.
+     *  3 - Get the string that represents the uninterrupted alphanumeric string sequence that ends at the caret position
+     *  4 - Get the list of completable items that starts with this alphanumeric string
+     *  5 - Add these items to the auto-complete box.
+     *  6 - Show the auto-complete box
+     */
+
+    public partial class ExpressionEditor : Form
+    {
+        private FeatureSourceDescription.FeatureSourceSchema m_schema;
+        
+        private IFeatureService _featSvc;
+        private string m_featureSource = null;
+
+        public ExpressionEditor()
+        {
+            InitializeComponent();
+            InitAutoComplete();
+        }
+
+        public string Expression
+        {
+            get { return ExpressionText.Text; }
+            set { ExpressionText.Text = value; }
+        }
+
+        public void Initialize(IFeatureService featSvc, FdoProviderCapabilities caps, FeatureSourceDescription.FeatureSourceSchema schema, string featuresSourceId)
+        {
+            try
+            {
+                m_schema = schema;
+                _featSvc = featSvc;
+                m_featureSource = featuresSourceId;
+
+                //TODO: Perhaps add column type and indication of primary key
+                SortedList<string, FeatureSetColumn> sortedCols = new SortedList<string, FeatureSetColumn>();
+                foreach (FeatureSetColumn col in m_schema.Columns)
+                {
+                    sortedCols.Add(col.Name, col);
+                }
+
+                ColumnName.Items.Clear();
+                ColumnName.Tag = sortedCols;
+
+                foreach (FeatureSetColumn col in sortedCols.Values)
+                {
+                    string name = col.Name;
+                    ToolStripButton btn = new ToolStripButton();
+                    btn.Name = name;
+                    btn.Text = name;
+                    btn.Click += delegate
+                    {
+                        InsertText(name);
+                    };
+                    btnProperties.DropDown.Items.Add(btn);
+
+                    ColumnName.Items.Add(name);
+                }
+
+                if (ColumnName.Items.Count > 0)
+                    ColumnName.SelectedIndex = 0;
+
+                LoadCompletableProperties(m_schema.Columns);
+
+                //TODO: Figure out how to translate the enums into something usefull
+
+                //Functions
+                SortedList<string, FdoProviderCapabilitiesExpressionFunctionDefinition> sortedFuncs = new SortedList<string, FdoProviderCapabilitiesExpressionFunctionDefinition>();
+                foreach (FdoProviderCapabilitiesExpressionFunctionDefinition func in caps.Expression.FunctionDefinitionList)
+                {
+                    sortedFuncs.Add(func.Name, func);
+                }
+
+                foreach (FdoProviderCapabilitiesExpressionFunctionDefinition func in sortedFuncs.Values)
+                {
+                    string name = func.Name;
+                    ToolStripButton btn = new ToolStripButton();
+                    btn.Name = name;
+                    btn.Text = name;
+                    btn.ToolTipText = func.Description;
+                    string fmt = "{0}({1})";
+                    List<string> args = new List<string>();
+                    foreach (FdoProviderCapabilitiesExpressionFunctionDefinitionArgumentDefinition argDef in func.ArgumentDefinitionList)
+                    {
+                        args.Add(argDef.Name.Trim());
+                    }
+                    string expr = string.Format(fmt, name, string.Join(", ", args.ToArray()));
+                    btn.Click += delegate
+                    {
+                        InsertText(expr);
+                    };
+                    btnFunctions.DropDown.Items.Add(btn);
+                }
+                LoadCompletableFunctions(caps.Expression.FunctionDefinitionList);
+
+                //Spatial Operators
+                foreach (FdoProviderCapabilitiesFilterOperation op in caps.Filter.Spatial)
+                {
+                    string name = op.ToString().ToUpper();
+                    ToolStripButton btn = new ToolStripButton();
+                    btn.Name = btn.Text = btn.ToolTipText = op.ToString();
+                    btn.Click += delegate
+                    {
+                        InsertFilter(name);
+                    };
+                    btnSpatial.DropDown.Items.Add(btn);
+                }
+
+                //Distance Operators
+                foreach (FdoProviderCapabilitiesFilterOperation1 op in caps.Filter.Distance)
+                {
+                    string name = op.ToString().ToUpper();
+                    ToolStripButton btn = new ToolStripButton();
+                    btn.Name = btn.Text = btn.ToolTipText = op.ToString();
+                    btn.Click += delegate
+                    {
+                        InsertFilter(name);
+                    };
+                    btnDistance.DropDown.Items.Add(btn);
+                }
+
+                //Conditional Operators
+                foreach (FdoProviderCapabilitiesFilterOperation op in caps.Filter.Condition)
+                {
+                    string name = op.ToString().ToUpper();
+                    ToolStripButton btn = new ToolStripButton();
+                    btn.Name = btn.Text = btn.ToolTipText = op.ToString();
+                    btn.Click += delegate
+                    {
+                        InsertFilter(name);
+                    };
+                    btnCondition.DropDown.Items.Add(btn);
+                }
+
+                /*try
+                {
+                    /*FdoProviderCapabilities cap = m_connection.GetProviderCapabilities(m_providername);
+                    foreach (FdoProviderCapabilitiesFilterType cmd in cap.Filter.Condition)
+                        FunctionCombo.Items.Add(cmd.ToString());
+
+                    FunctionLabel.Enabled = FunctionCombo.Enabled = true;
+                }
+                catch
+                {
+                    FunctionLabel.Enabled = FunctionCombo.Enabled = false;
+                }*/
+            }
+            catch
+            {
+            }
+
+        }
+
+        private void InsertText(string exprText)
+        {
+            int index = ExpressionText.SelectionStart;
+            if (ExpressionText.SelectionLength > 0)
+            {
+                ExpressionText.SelectedText = exprText;
+                ExpressionText.SelectionStart = index;
+            }
+            else
+            {
+                if (index > 0)
+                {
+                    string text = ExpressionText.Text;
+                    ExpressionText.Text = text.Insert(index, exprText);
+                    ExpressionText.SelectionStart = index;
+                }
+                else
+                {
+                    ExpressionText.Text = exprText;
+                    ExpressionText.SelectionStart = index;
+                }
+            }
+        }
+
+        private void InsertFilter(string op)
+        {
+            if (!string.IsNullOrEmpty(op))
+            {
+                string filterTemplate = "<geometry property> {0} GeomFromText('<FGF geometry text>')";
+                string exprText = string.Format(filterTemplate, op);
+                InsertText(exprText);
+            }
+        }
+
+        private void OKBtn_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+
+        private SortedList<string, AutoCompleteItem> _autoCompleteItems = new SortedList<string, AutoCompleteItem>();
+        private ImageListBox _autoBox;
+
+        enum AutoCompleteItemType : int
+        {
+            Property = 0,
+            Function = 1,
+        }
+
+        /// <summary>
+        /// Base auto-complete item
+        /// </summary>
+        abstract class AutoCompleteItem
+        {
+            public abstract AutoCompleteItemType Type { get; }
+
+            public abstract string Name { get; }
+
+            public abstract string ToolTipText { get; }
+
+            public abstract string AutoCompleteText { get; }
+        }
+
+        /// <summary>
+        /// Property auto-complete item
+        /// </summary>
+        class PropertyItem : AutoCompleteItem
+        {
+            private FeatureSetColumn _propDef;
+
+            public PropertyItem(FeatureSetColumn pd)
+            {
+                _propDef = pd;
+            }
+
+            public override AutoCompleteItemType Type
+            {
+                get { return AutoCompleteItemType.Property; }
+            }
+
+            public override string Name
+            {
+                get { return _propDef.Name; }
+            }
+
+            private string _ttText;
+
+            public override string ToolTipText
+            {
+                get
+                {
+                    if (string.IsNullOrEmpty(_ttText))
+                    {
+                        _ttText = string.Format(Properties.Resources.PropertyTooltip, _propDef.Name, _propDef.Type.Name);
+                    }
+                    return _ttText;
+                }
+            }
+
+            public override string AutoCompleteText
+            {
+                get { return this.Name; }
+            }
+        }
+
+        /// <summary>
+        /// Function auto-complete item
+        /// </summary>
+        class FunctionItem : AutoCompleteItem
+        {
+            private FdoProviderCapabilitiesExpressionFunctionDefinition _func;
+
+            public FunctionItem(FdoProviderCapabilitiesExpressionFunctionDefinition fd)
+            {
+                _func = fd;
+            }
+
+            public override AutoCompleteItemType Type
+            {
+                get { return AutoCompleteItemType.Function; }
+            }
+
+            public override string Name
+            {
+                get { return _func.Name; }
+            }
+
+            private string _ttText;
+
+            public override string ToolTipText
+            {
+                get
+                {
+                    if (string.IsNullOrEmpty(_ttText))
+                        _ttText = string.Format(Properties.Resources.FunctionTooltip, GetReturnTypeString(), _func.Name, GetArgumentString(), _func.Description);
+
+                    return _ttText;
+                }
+            }
+
+            private string _argStr;
+
+            private string GetArgumentString()
+            {
+                if (string.IsNullOrEmpty(_argStr))
+                {
+                    List<string> tokens = new List<string>();
+                    foreach (FdoProviderCapabilitiesExpressionFunctionDefinitionArgumentDefinition argDef in _func.ArgumentDefinitionList)
+                    {
+                        tokens.Add("[" + argDef.Name.Trim() + "]");
+                    }
+                    _argStr = string.Join(", ", tokens.ToArray());
+                }
+                return _argStr;
+            }
+
+            private string GetReturnTypeString()
+            {
+                return _func.ReturnType;
+            }
+
+            public override string AutoCompleteText
+            {
+                get
+                {
+                    return this.Name + "(" + GetArgumentString() + ")";
+                }
+            }
+        }
+
+        private void InitAutoComplete()
+        {
+            _autoBox = new ImageListBox();
+            _autoBox.Visible = false;
+            _autoBox.ImageList = new ImageList();
+            _autoBox.ImageList.Images.Add(Properties.Resources.property);  //Property
+            _autoBox.ImageList.Images.Add(Properties.Resources.block); //Function
+            _autoBox.DoubleClick += new EventHandler(OnAutoCompleteDoubleClick);
+            _autoBox.SelectedIndexChanged += new EventHandler(OnAutoCompleteSelectedIndexChanged);
+            _autoBox.KeyDown += new KeyEventHandler(OnAutoCompleteKeyDown);
+            _autoBox.KeyUp += new KeyEventHandler(OnAutoCompleteKeyUp);
+            _autoBox.ValueMember = "Name";
+            _autoBox.Font = new Font(FontFamily.GenericMonospace, 10.0f);
+            ExpressionText.Controls.Add(_autoBox);
+        }
+
+        void OnAutoCompleteKeyDown(object sender, KeyEventArgs e)
+        {
+            ExpressionText.Focus();
+        }
+
+        void OnAutoCompleteKeyUp(object sender, KeyEventArgs e)
+        {
+            if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Enter)
+            {
+                PutAutoCompleteSuggestion();
+                _autoBox.Hide();
+                _autoCompleteTooltip.Hide(this);
+            }
+        }
+
+        void OnAutoCompleteSelectedIndexChanged(object sender, EventArgs e)
+        {
+            ExpressionText.Focus();
+            if (_autoBox.Visible && _autoBox.SelectedIndex >= 0 && _autoBox.Items.Count > 0)
+            {
+                string tt = ((_autoBox.SelectedItem as ImageListBoxItem).Tag as AutoCompleteItem).ToolTipText;
+                Point pt = GetCaretPoint();
+                pt.X += _autoBox.Width + 10;
+                pt.Y += 65;
+
+                _autoCompleteTooltip.Show(tt, this, pt.X, pt.Y);
+            }
+        }
+
+        void OnAutoCompleteDoubleClick(object sender, EventArgs e)
+        {
+            PutAutoCompleteSuggestion();
+            _autoBox.Hide();
+            _autoCompleteTooltip.Hide(this);
+        }
+
+        private void MoveAutoCompleteSelectionDown()
+        {
+            if (_autoBox.SelectedIndex < 0)
+            {
+                _autoBox.SelectedIndex = 0;
+            }
+            else
+            {
+                int idx = _autoBox.SelectedIndex;
+                if ((idx + 1) <= _autoBox.Items.Count - 1)
+                {
+                    _autoBox.SelectedIndex = idx + 1;
+                }
+            }
+        }
+
+        private void MoveAutoCompleteSelectionUp()
+        {
+            if (_autoBox.SelectedIndex < 0)
+            {
+                _autoBox.SelectedIndex = 0;
+            }
+            else
+            {
+                int idx = _autoBox.SelectedIndex;
+                if ((idx - 1) >= 0)
+                {
+                    _autoBox.SelectedIndex = idx - 1;
+                }
+            }
+        }
+
+        private void LoadCompletableProperties(IEnumerable<FeatureSetColumn> cols)
+        {
+            foreach (FeatureSetColumn col in cols)
+            {
+                _autoCompleteItems[col.Name] = new PropertyItem(col);
+            }
+        }
+
+        private void LoadCompletableFunctions(IEnumerable<FdoProviderCapabilitiesExpressionFunctionDefinition> funcs)
+        {
+            foreach (FdoProviderCapabilitiesExpressionFunctionDefinition func in funcs)
+            {
+                _autoCompleteItems[func.Name] = new FunctionItem(func);
+            }
+        }
+
+        private void PutAutoCompleteSuggestion()
+        {
+            if (_autoBox.SelectedItems.Count == 1)
+            {
+                int pos = ExpressionText.SelectionStart;
+                string context;
+                char? c = GetContextBuffer(out context);
+
+                AutoCompleteItem aci = (_autoBox.SelectedItem as ImageListBoxItem).Tag as AutoCompleteItem;
+
+                string fullText = aci.AutoCompleteText;
+
+                int start = pos - context.Length;
+                int newPos = start + fullText.Length;
+                int selLength = -1;
+
+                //if it's a function, highlight the parameter (or the first parameter if there is multiple arguments
+                if (aci.Type == AutoCompleteItemType.Function)
+                {
+                    newPos = start + aci.Name.Length + 1; //Position the caret just after the opening bracket
+
+                    //Has at least two arguments
+                    int idx = fullText.IndexOf(",");
+                    if (idx > 0)
+                        selLength = idx - aci.Name.Length - 1;
+                    else
+                        selLength = fullText.IndexOf(")") - fullText.IndexOf("(") - 1;
+                }
+
+                string prefix = ExpressionText.Text.Substring(0, start);
+                string suffix = ExpressionText.Text.Substring(pos, ExpressionText.Text.Length - pos);
+
+                ExpressionText.Text = prefix + fullText + suffix;
+                ExpressionText.SelectionStart = newPos;
+                if (selLength > 0)
+                {
+                    ExpressionText.SelectionLength = selLength;
+                }
+                ExpressionText.ScrollToCaret();
+            }
+        }
+
+        private Point GetCaretPoint()
+        {
+            Point pt = ExpressionText.GetPositionFromCharIndex(ExpressionText.SelectionStart);
+            pt.Y += (int)Math.Ceiling(ExpressionText.Font.GetHeight()) + 2;
+            pt.X += 2; // for Courier, may need a better method
+            return pt;
+        }
+
+        private char? GetContextBuffer(out string buffer)
+        {
+            buffer = string.Empty;
+            int caretPos = ExpressionText.SelectionStart;
+            int currentPos = caretPos;
+            char? res = null;
+            if (caretPos > 0)
+            {
+                //Walk backwards
+                caretPos--;
+                char c = ExpressionText.Text[caretPos];
+                while (Char.IsLetterOrDigit(c))
+                {
+                    caretPos--;
+
+                    if (caretPos < 0)
+                        break;
+
+                    c = ExpressionText.Text[caretPos];
+                }
+
+                if (caretPos > 0)
+                {
+                    res = ExpressionText.Text[caretPos];
+                }
+                buffer = ExpressionText.Text.Substring(caretPos + 1, currentPos - caretPos - 1);
+            }
+            return res;
+        }
+
+        private void HandleKeyDown(KeyEventArgs e)
+        {
+            Keys code = e.KeyCode;
+            if (code == Keys.Escape)
+            {
+                if (_autoBox.Visible)
+                {
+                    e.SuppressKeyPress = true;
+                    _autoBox.Hide();
+                    _autoCompleteTooltip.Hide(this);
+                }
+            }
+            else if (code == Keys.Enter || code == Keys.Return)
+            {
+                if (_autoBox.Visible && _autoBox.SelectedItems.Count == 1)
+                {
+                    e.SuppressKeyPress = true;
+                    PutAutoCompleteSuggestion();
+                    _autoBox.Hide();
+                    _autoCompleteTooltip.Hide(this);
+                }
+            }
+        }
+
+        private void HandleKeyUp(KeyEventArgs e)
+        {
+            Keys code = e.KeyCode;
+            if (code == Keys.Oemcomma || code == Keys.OemOpenBrackets)
+            {
+                Complete(string.Empty);
+            }
+            else if (code == Keys.OemQuotes)
+            {
+                if (e.Modifiers == Keys.Shift)  // "
+                    InsertText("\"");
+                else                            // '
+                    InsertText("'");
+
+            }
+            else if (code == Keys.D9 && e.Modifiers == Keys.Shift) // (
+            {
+                InsertText(")");
+            }
+            else if (code == Keys.Up || code == Keys.Down)
+            {
+                if (_autoBox.Visible)
+                {
+                    if (code == Keys.Up)
+                    {
+                        MoveAutoCompleteSelectionUp();
+                    }
+                    else
+                    {
+                        MoveAutoCompleteSelectionDown();
+                    }
+                }
+            }
+            else if (code == Keys.Back)
+            {
+                string context;
+                char? c = GetContextBuffer(out context);
+                if (!string.IsNullOrEmpty(context))
+                {
+                    Complete(context);
+                }
+                else
+                {
+                    if (_autoBox.Visible)
+                    {
+                        _autoBox.Hide();
+                        _autoCompleteTooltip.Hide(this);
+                    }
+                }
+            }
+            else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Right)
+            {
+                string context;
+                char? c = GetContextBuffer(out context);
+                Complete(context);
+            }
+            else
+            {
+                if (e.Modifiers == Keys.None)
+                {
+                    bool alpha = (code >= Keys.A && code <= Keys.Z);
+                    bool numeric = (code >= Keys.D0 && code <= Keys.D9) || (code >= Keys.NumPad0 && code <= Keys.NumPad9);
+                    if (alpha || numeric)
+                    {
+                        string context;
+                        char? c = GetContextBuffer(out context);
+                        Complete(context);
+                    }
+                }
+            }
+        }
+
+        private List<AutoCompleteItem> GetItemsStartingWith(string text)
+        {
+            List<AutoCompleteItem> ati = new List<AutoCompleteItem>();
+            foreach (string key in _autoCompleteItems.Keys)
+            {
+                if (key.ToLower().StartsWith(text.Trim().ToLower()))
+                {
+                    ati.Add(_autoCompleteItems[key]);
+                }
+            }
+            return ati;
+        }
+
+        private void Complete(string text)
+        {
+            List<AutoCompleteItem> items = GetItemsStartingWith(text);
+            _autoBox.Items.Clear();
+
+            int width = 0;
+            foreach (AutoCompleteItem it in items)
+            {
+                ImageListBoxItem litem = new ImageListBoxItem();
+                litem.Text = it.Name;
+                litem.ImageIndex = (int)it.Type;
+                litem.Tag = it;
+
+                _autoBox.Items.Add(litem);
+                int length = TextRenderer.MeasureText(it.Name, _autoBox.Font).Width + 30; //For icon size
+                if (length > width)
+                    width = length;
+            }
+            _autoBox.Width = width;
+
+            if (!_autoBox.Visible)
+            {
+                if (_autoBox.Items.Count > 0)
+                {
+                    _autoBox.BringToFront();
+                    _autoBox.Show();
+                }
+            }
+
+            Point pt = GetCaretPoint();
+
+            _autoBox.Location = pt;
+        }
+
+        private void ExpressionText_KeyDown(object sender, KeyEventArgs e)
+        {
+            HandleKeyDown(e);
+        }
+
+        private void ExpressionText_KeyUp(object sender, KeyEventArgs e)
+        {
+            HandleKeyUp(e);
+        }
+
+        private void ColumnName_Click(object sender, EventArgs e)
+        {
+
+        }
+
+        private void ColumnName_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            ColumnValue.Enabled = false;
+            LookupValues.Enabled = ColumnName.SelectedIndex >= 0;
+        }
+
+        private void LookupValues_Click(object sender, EventArgs e)
+        {
+            using (new WaitCursor(this))
+            {
+                try
+                {
+                    SortedList<string, FeatureSetColumn> cols = (SortedList<string, FeatureSetColumn>)ColumnName.Tag;
+                    FeatureSetColumn col = cols[ColumnName.Text];
+
+                    bool retry = true;
+                    Exception rawEx = null;
+                    string filter = null;
+
+                    SortedList<string, string> values = new SortedList<string, string>();
+                    bool hasNull = false;
+
+                    while (retry)
+                    {
+                        try
+                        {
+                            retry = false;
+                            using (FeatureSetReader rd = _featSvc.QueryFeatureSource(m_featureSource, m_schema.FullnameDecoded, filter, new string[] { ColumnName.Text }))
+                            {
+                                while (rd.Read())
+                                {
+                                    if (rd.Row.IsValueNull(ColumnName.Text))
+                                        hasNull = true;
+                                    else
+                                        values[Convert.ToString(rd.Row[ColumnName.Text], System.Globalization.CultureInfo.InvariantCulture)] = null;
+                                }
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            if (filter == null && ex.Message.IndexOf("MgNullPropertyValueException") >= 0)
+                            {
+                                hasNull = true;
+                                rawEx = ex;
+                                retry = true;
+                                filter = ColumnName.Text + " != NULL";
+                            }
+                            else if (rawEx != null)
+                                throw rawEx;
+                            else
+                                throw;
+                        }
+                    }
+
+                    ColumnValue.Items.Clear();
+                    if (hasNull)
+                        ColumnValue.Items.Add("NULL");
+
+                    foreach (string s in values.Keys)
+                        ColumnValue.Items.Add(s);
+
+                    ColumnValue.Tag = col.Type;
+
+                    if (ColumnValue.Items.Count == 0)
+                        MessageBox.Show(this, Properties.Resources.NoColumnValuesError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                    else
+                    {
+                        ColumnValue.Enabled = true;
+                        ColumnValue.SelectedIndex = -1;
+                        ColumnValue.DroppedDown = true;
+                    }
+                }
+                catch (Exception ex)
+                {
+                    string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
+                    MessageBox.Show(this, string.Format(Properties.Resources.ColumnValueError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                }
+            }
+        }
+
+        private void ColumnValue_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (ColumnValue.SelectedIndex >= 0 && ColumnValue.Tag as Type != null)
+            {
+                if (ColumnValue.Tag == typeof(string) && (ColumnValue.SelectedIndex != 0 || ColumnValue.Text != "NULL"))
+                    ExpressionText.SelectedText = " '" + ColumnValue.Text + "' ";
+                else
+                    ExpressionText.SelectedText = " " + ColumnValue.Text + " ";
+            }
+        }
+    }
+
+    // ImageListBoxItem class 
+    public class ImageListBoxItem
+    {
+        private string _myText;
+        private int _myImageIndex;
+        // properties 
+        public string Text
+        {
+            get { return _myText; }
+            set { _myText = value; }
+        }
+        public int ImageIndex
+        {
+            get { return _myImageIndex; }
+            set { _myImageIndex = value; }
+        }
+        //constructor
+        public ImageListBoxItem(string text, int index)
+        {
+            _myText = text;
+            _myImageIndex = index;
+        }
+        public ImageListBoxItem(string text) : this(text, -1) { }
+        public ImageListBoxItem() : this("") { }
+
+        private object _tag;
+
+        public object Tag
+        {
+            get { return _tag; }
+            set { _tag = value; }
+        }
+
+        public override string ToString()
+        {
+            return _myText;
+        }
+    }//End of ImageListBoxItem class
+
+    // ImageListBox class 
+    //
+    // Based on GListBox
+    //
+    // http://www.codeproject.com/KB/combobox/glistbox.aspx
+    public class ImageListBox : ListBox
+    {
+        private ImageList _myImageList;
+        public ImageList ImageList
+        {
+            get { return _myImageList; }
+            set { _myImageList = value; }
+        }
+        public ImageListBox()
+        {
+            // Set owner draw mode
+            this.DrawMode = DrawMode.OwnerDrawFixed;
+        }
+        protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
+        {
+            e.DrawBackground();
+            e.DrawFocusRectangle();
+            ImageListBoxItem item;
+            Rectangle bounds = e.Bounds;
+            Size imageSize = _myImageList.ImageSize;
+            try
+            {
+                item = (ImageListBoxItem)Items[e.Index];
+                if (item.ImageIndex != -1)
+                {
+                    _myImageList.Draw(e.Graphics, bounds.Left, bounds.Top, item.ImageIndex);
+                    e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
+                        bounds.Left + imageSize.Width, bounds.Top);
+                }
+                else
+                {
+                    e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
+                        bounds.Left, bounds.Top);
+                }
+            }
+            catch
+            {
+                if (e.Index != -1)
+                {
+                    e.Graphics.DrawString(Items[e.Index].ToString(), e.Font,
+                        new SolidBrush(e.ForeColor), bounds.Left, bounds.Top);
+                }
+                else
+                {
+                    e.Graphics.DrawString(Text, e.Font, new SolidBrush(e.ForeColor),
+                        bounds.Left, bounds.Top);
+                }
+            }
+            base.OnDrawItem(e);
+        }
+    }//End of ImageListBox class
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.designer.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -0,0 +1,213 @@
+namespace Maestro.Editors.Common
+{
+    partial class ExpressionEditor
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExpressionEditor));
+            this.OKBtn = new System.Windows.Forms.Button();
+            this.CancelBtn = new System.Windows.Forms.Button();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.lblHint = new System.Windows.Forms.Label();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnFilter = new System.Windows.Forms.ToolStripDropDownButton();
+            this.btnCondition = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnSpatial = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnDistance = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.ColumnValue = new System.Windows.Forms.ToolStripComboBox();
+            this.LookupValues = new System.Windows.Forms.ToolStripButton();
+            this.ColumnName = new System.Windows.Forms.ToolStripComboBox();
+            this.ExpressionText = new System.Windows.Forms.TextBox();
+            this._autoCompleteTooltip = new System.Windows.Forms.ToolTip(this.components);
+            this.btnFunctions = new System.Windows.Forms.ToolStripDropDownButton();
+            this.btnProperties = new System.Windows.Forms.ToolStripDropDownButton();
+            this.panel1.SuspendLayout();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // OKBtn
+            // 
+            resources.ApplyResources(this.OKBtn, "OKBtn");
+            this.OKBtn.Name = "OKBtn";
+            this.OKBtn.UseVisualStyleBackColor = true;
+            this.OKBtn.Click += new System.EventHandler(this.OKBtn_Click);
+            // 
+            // CancelBtn
+            // 
+            resources.ApplyResources(this.CancelBtn, "CancelBtn");
+            this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.CancelBtn.Name = "CancelBtn";
+            this.CancelBtn.UseVisualStyleBackColor = true;
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.lblHint);
+            this.panel1.Controls.Add(this.CancelBtn);
+            this.panel1.Controls.Add(this.OKBtn);
+            resources.ApplyResources(this.panel1, "panel1");
+            this.panel1.Name = "panel1";
+            // 
+            // lblHint
+            // 
+            resources.ApplyResources(this.lblHint, "lblHint");
+            this.lblHint.Name = "lblHint";
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnProperties,
+            this.btnFunctions,
+            this.btnFilter,
+            this.toolStripSeparator1,
+            this.ColumnValue,
+            this.LookupValues,
+            this.ColumnName});
+            resources.ApplyResources(this.toolStrip1, "toolStrip1");
+            this.toolStrip1.Name = "toolStrip1";
+            // 
+            // btnFilter
+            // 
+            this.btnFilter.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnCondition,
+            this.btnSpatial,
+            this.btnDistance});
+            this.btnFilter.Image = global::Maestro.Editors.Properties.Resources.funnel;
+            resources.ApplyResources(this.btnFilter, "btnFilter");
+            this.btnFilter.Name = "btnFilter";
+            // 
+            // btnCondition
+            // 
+            this.btnCondition.Name = "btnCondition";
+            resources.ApplyResources(this.btnCondition, "btnCondition");
+            // 
+            // btnSpatial
+            // 
+            this.btnSpatial.Image = global::Maestro.Editors.Properties.Resources.grid;
+            this.btnSpatial.Name = "btnSpatial";
+            resources.ApplyResources(this.btnSpatial, "btnSpatial");
+            // 
+            // btnDistance
+            // 
+            this.btnDistance.Image = global::Maestro.Editors.Properties.Resources.ruler;
+            this.btnDistance.Name = "btnDistance";
+            resources.ApplyResources(this.btnDistance, "btnDistance");
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
+            // 
+            // ColumnValue
+            // 
+            this.ColumnValue.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+            this.ColumnValue.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.ColumnValue.DropDownWidth = 180;
+            resources.ApplyResources(this.ColumnValue, "ColumnValue");
+            this.ColumnValue.Name = "ColumnValue";
+            this.ColumnValue.SelectedIndexChanged += new System.EventHandler(this.ColumnValue_SelectedIndexChanged);
+            // 
+            // LookupValues
+            // 
+            this.LookupValues.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+            this.LookupValues.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            resources.ApplyResources(this.LookupValues, "LookupValues");
+            this.LookupValues.Image = global::Maestro.Editors.Properties.Resources.table__arrow;
+            this.LookupValues.Name = "LookupValues";
+            this.LookupValues.Click += new System.EventHandler(this.LookupValues_Click);
+            // 
+            // ColumnName
+            // 
+            this.ColumnName.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+            this.ColumnName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.ColumnName.DropDownWidth = 180;
+            this.ColumnName.Name = "ColumnName";
+            resources.ApplyResources(this.ColumnName, "ColumnName");
+            this.ColumnName.SelectedIndexChanged += new System.EventHandler(this.ColumnName_SelectedIndexChanged);
+            this.ColumnName.Click += new System.EventHandler(this.ColumnName_Click);
+            // 
+            // ExpressionText
+            // 
+            resources.ApplyResources(this.ExpressionText, "ExpressionText");
+            this.ExpressionText.HideSelection = false;
+            this.ExpressionText.Name = "ExpressionText";
+            this.ExpressionText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExpressionText_KeyDown);
+            this.ExpressionText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ExpressionText_KeyUp);
+            // 
+            // btnFunctions
+            // 
+            this.btnFunctions.Image = global::Maestro.Editors.Properties.Resources.function;
+            resources.ApplyResources(this.btnFunctions, "btnFunctions");
+            this.btnFunctions.Name = "btnFunctions";
+            // 
+            // btnProperties
+            // 
+            this.btnProperties.Image = global::Maestro.Editors.Properties.Resources.property;
+            resources.ApplyResources(this.btnProperties, "btnProperties");
+            this.btnProperties.Name = "btnProperties";
+            // 
+            // ExpressionEditor
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ControlBox = false;
+            this.Controls.Add(this.ExpressionText);
+            this.Controls.Add(this.toolStrip1);
+            this.Controls.Add(this.panel1);
+            this.Name = "ExpressionEditor";
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button OKBtn;
+        private System.Windows.Forms.Button CancelBtn;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.TextBox ExpressionText;
+        private System.Windows.Forms.ToolStripDropDownButton btnFilter;
+        private System.Windows.Forms.ToolStripMenuItem btnCondition;
+        private System.Windows.Forms.ToolStripMenuItem btnSpatial;
+        private System.Windows.Forms.ToolStripMenuItem btnDistance;
+        private System.Windows.Forms.ToolTip _autoCompleteTooltip;
+        private System.Windows.Forms.Label lblHint;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripComboBox ColumnName;
+        private System.Windows.Forms.ToolStripButton LookupValues;
+        private System.Windows.Forms.ToolStripComboBox ColumnValue;
+        private System.Windows.Forms.ToolStripDropDownButton btnProperties;
+        private System.Windows.Forms.ToolStripDropDownButton btnFunctions;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.resx	2010-07-10 15:34:02 UTC (rev 5023)
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="OKBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Right</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="OKBtn.Location" type="System.Drawing.Point, System.Drawing">
+    <value>342, 6</value>
+  </data>
+  <data name="OKBtn.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="OKBtn.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="OKBtn.Text" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Name" xml:space="preserve">
+    <value>OKBtn</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="CancelBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Right</value>
+  </data>
+  <data name="CancelBtn.Location" type="System.Drawing.Point, System.Drawing">
+    <value>423, 6</value>
+  </data>
+  <data name="CancelBtn.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="CancelBtn.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="CancelBtn.Text" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.Name" xml:space="preserve">
+    <value>CancelBtn</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;CancelBtn.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;lblHint.Name" xml:space="preserve">
+    <value>lblHint</value>
+  </data>
+  <data name="&gt;&gt;lblHint.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;lblHint.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;lblHint.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 249</value>
+  </data>
+  <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>510, 40</value>
+  </data>
+  <data name="panel1.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;panel1.Name" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;panel1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="lblHint.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="lblHint.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 11</value>
+  </data>
+  <data name="lblHint.Size" type="System.Drawing.Size, System.Drawing">
+    <value>202, 13</value>
+  </data>
+  <data name="lblHint.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="lblHint.Text" xml:space="preserve">
+    <value>Press Alt + Right to invoke auto-complete</value>
+  </data>
+  <data name="&gt;&gt;lblHint.Name" xml:space="preserve">
+    <value>lblHint</value>
+  </data>
+  <data name="&gt;&gt;lblHint.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;lblHint.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;lblHint.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="btnProperties.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
+    <value>Magenta</value>
+  </data>
+  <data name="btnProperties.Size" type="System.Drawing.Size, System.Drawing">
+    <value>85, 22</value>
+  </data>
+  <data name="btnProperties.Text" xml:space="preserve">
+    <value>Properties</value>
+  </data>
+  <data name="btnFunctions.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
+    <value>Magenta</value>
+  </data>
+  <data name="btnFunctions.Size" type="System.Drawing.Size, System.Drawing">
+    <value>82, 22</value>
+  </data>
+  <data name="btnFunctions.Text" xml:space="preserve">
+    <value>Functions</value>
+  </data>
+  <data name="btnFilter.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
+    <value>Magenta</value>
+  </data>
+  <data name="btnFilter.Size" type="System.Drawing.Size, System.Drawing">
+    <value>60, 22</value>
+  </data>
+  <data name="btnFilter.Text" xml:space="preserve">
+    <value>Filter</value>
+  </data>
+  <data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>6, 25</value>
+  </data>
+  <data name="ColumnValue.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="ColumnValue.Size" type="System.Drawing.Size, System.Drawing">
+    <value>110, 25</value>
+  </data>
+  <data name="LookupValues.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="LookupValues.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
+    <value>Magenta</value>
+  </data>
+  <data name="LookupValues.Size" type="System.Drawing.Size, System.Drawing">
+    <value>23, 22</value>
+  </data>
+  <data name="LookupValues.ToolTipText" xml:space="preserve">
+    <value>Click to lookup values from the selected column</value>
+  </data>
+  <data name="ColumnName.Size" type="System.Drawing.Size, System.Drawing">
+    <value>110, 25</value>
+  </data>
+  <data name="ColumnName.ToolTipText" xml:space="preserve">
+    <value>Select the column to read values from</value>
+  </data>
+  <data name="toolStrip1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="toolStrip1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>510, 25</value>
+  </data>
+  <data name="toolStrip1.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="toolStrip1.Text" xml:space="preserve">
+    <value>toolStrip1</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.Name" xml:space="preserve">
+    <value>toolStrip1</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;toolStrip1.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="btnCondition.Size" type="System.Drawing.Size, System.Drawing">
+    <value>152, 22</value>
+  </data>
+  <data name="btnCondition.Text" xml:space="preserve">
+    <value>Condition</value>
+  </data>
+  <data name="btnSpatial.Size" type="System.Drawing.Size, System.Drawing">
+    <value>152, 22</value>
+  </data>
+  <data name="btnSpatial.Text" xml:space="preserve">
+    <value>Spatial</value>
+  </data>
+  <data name="btnDistance.Size" type="System.Drawing.Size, System.Drawing">
+    <value>152, 22</value>
+  </data>
+  <data name="btnDistance.Text" xml:space="preserve">
+    <value>Distance</value>
+  </data>
+  <data name="ExpressionText.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="ExpressionText.Font" type="System.Drawing.Font, System.Drawing">
+    <value>Courier New, 12pt</value>
+  </data>
+  <data name="ExpressionText.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 25</value>
+  </data>
+  <data name="ExpressionText.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="ExpressionText.Size" type="System.Drawing.Size, System.Drawing">
+    <value>510, 224</value>
+  </data>
+  <data name="ExpressionText.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;ExpressionText.Name" xml:space="preserve">
+    <value>ExpressionText</value>
+  </data>
+  <data name="&gt;&gt;ExpressionText.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ExpressionText.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;ExpressionText.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="_autoCompleteTooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>116, 17</value>
+  </metadata>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>510, 289</value>
+  </data>
+  <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
+    <value>500, 300</value>
+  </data>
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+    <value>CenterParent</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>Expression Editor</value>
+  </data>
+  <data name="&gt;&gt;btnFilter.Name" xml:space="preserve">
+    <value>btnFilter</value>
+  </data>
+  <data name="&gt;&gt;btnFilter.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnCondition.Name" xml:space="preserve">
+    <value>btnCondition</value>
+  </data>
+  <data name="&gt;&gt;btnCondition.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnSpatial.Name" xml:space="preserve">
+    <value>btnSpatial</value>
+  </data>
+  <data name="&gt;&gt;btnSpatial.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnDistance.Name" xml:space="preserve">
+    <value>btnDistance</value>
+  </data>
+  <data name="&gt;&gt;btnDistance.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;toolStripSeparator1.Name" xml:space="preserve">
+    <value>toolStripSeparator1</value>
+  </data>
+  <data name="&gt;&gt;toolStripSeparator1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnValue.Name" xml:space="preserve">
+    <value>ColumnValue</value>
+  </data>
+  <data name="&gt;&gt;ColumnValue.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;LookupValues.Name" xml:space="preserve">
+    <value>LookupValues</value>
+  </data>
+  <data name="&gt;&gt;LookupValues.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnName.Name" xml:space="preserve">
+    <value>ColumnName</value>
+  </data>
+  <data name="&gt;&gt;ColumnName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_autoCompleteTooltip.Name" xml:space="preserve">
+    <value>_autoCompleteTooltip</value>
+  </data>
+  <data name="&gt;&gt;_autoCompleteTooltip.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolTip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnFunctions.Name" xml:space="preserve">
+    <value>btnFunctions</value>
+  </data>
+  <data name="&gt;&gt;btnFunctions.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnProperties.Name" xml:space="preserve">
+    <value>btnProperties</value>
+  </data>
+  <data name="&gt;&gt;btnProperties.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>ExpressionEditor</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.Designer.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.Designer.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -176,6 +176,7 @@
             this.btnEditTooltip.TabIndex = 8;
             this.btnEditTooltip.Text = "...";
             this.btnEditTooltip.UseVisualStyleBackColor = true;
+            this.btnEditTooltip.Click += new System.EventHandler(this.btnEditTooltip_Click);
             // 
             // btnEditHyperlink
             // 
@@ -186,6 +187,7 @@
             this.btnEditHyperlink.TabIndex = 7;
             this.btnEditHyperlink.Text = "...";
             this.btnEditHyperlink.UseVisualStyleBackColor = true;
+            this.btnEditHyperlink.Click += new System.EventHandler(this.btnEditHyperlink_Click);
             // 
             // btnEditFilter
             // 
@@ -196,6 +198,7 @@
             this.btnEditFilter.TabIndex = 6;
             this.btnEditFilter.Text = "...";
             this.btnEditFilter.UseVisualStyleBackColor = true;
+            this.btnEditFilter.Click += new System.EventHandler(this.btnEditFilter_Click);
             // 
             // txtTooltip
             // 

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -28,6 +28,7 @@
 using System.Diagnostics;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Editors.Generic;
+using OSGeo.MapGuide.ObjectModels.FeatureSource;
 
 namespace Maestro.Editors.LayerDefinition.Vector
 {
@@ -112,7 +113,82 @@
             if (picker.ShowDialog() == DialogResult.OK)
             {
                 txtFeatureSource.Text = picker.ResourceID;
+                //Invalidate
+                _cachedFs = null;
             }
         }
+
+        private FeatureSourceDescription.FeatureSourceSchema GetSelectedClass()
+        {
+            if (cmbSchema.SelectedItem != null)
+            {
+                foreach (var schema in _cachedDesc.Schemas)
+                {
+                    if (schema.Fullname == cmbSchema.SelectedItem.ToString())
+                    {
+                        return schema;
+                    }
+                }
+            }
+            return null;
+        }
+
+        private FeatureSourceType _cachedFs;
+
+        private FeatureSourceType GetFeatureSource()
+        {
+            if (_cachedFs == null)
+                _cachedFs = (FeatureSourceType)_edsvc.ResourceService.GetResource(txtFeatureSource.Text);
+
+            return _cachedFs;
+        }
+
+        private void btnEditFilter_Click(object sender, EventArgs e)
+        {
+            var cls = GetSelectedClass();
+            if (cls != null)
+            {
+                var fs = GetFeatureSource();
+                var expr = _edsvc.EditExpression(txtFilter.Text, cls, fs.Provider, fs.ResourceID);
+                if (expr != null)
+                {
+                    txtFilter.Text = expr;
+                    //HACK: Force databinding update
+                    txtFilter.DataBindings[0].WriteValue();
+                }
+            }
+        }
+
+        private void btnEditHyperlink_Click(object sender, EventArgs e)
+        {
+            var cls = GetSelectedClass();
+            if (cls != null)
+            {
+                var fs = GetFeatureSource();
+                var expr = _edsvc.EditExpression(txtHyperlink.Text, cls, fs.Provider, fs.ResourceID);
+                if (expr != null)
+                {
+                    txtHyperlink.Text = expr;
+                    //HACK: Force databinding update
+                    txtHyperlink.DataBindings[0].WriteValue();
+                }
+            }
+        }
+
+        private void btnEditTooltip_Click(object sender, EventArgs e)
+        {
+            var cls = GetSelectedClass();
+            if (cls != null)
+            {
+                var fs = GetFeatureSource();
+                var expr = _edsvc.EditExpression(txtTooltip.Text, cls, fs.Provider, fs.ResourceID);
+                if (expr != null)
+                {
+                    txtTooltip.Text = expr;
+                    //HACK: Force databinding update
+                    txtTooltip.DataBindings[0].WriteValue();
+                }
+            }
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-07-10 15:34:02 UTC (rev 5023)
@@ -73,6 +73,12 @@
     <Compile Include="Common\FdoProviderPicker.Designer.cs">
       <DependentUpon>FdoProviderPicker.cs</DependentUpon>
     </Compile>
+    <Compile Include="Common\ExpressionEditor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Common\ExpressionEditor.designer.cs">
+      <DependentUpon>ExpressionEditor.cs</DependentUpon>
+    </Compile>
     <Compile Include="Common\ResourceDataCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -447,6 +453,10 @@
       <DependentUpon>FdoProviderPicker.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="Common\ExpressionEditor.resx">
+      <DependentUpon>ExpressionEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="Common\ResourceDataCtrl.resx">
       <DependentUpon>ResourceDataCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -859,6 +869,30 @@
     <None Include="Resources\layer.png" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="Resources\property.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\block.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\table.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\sum.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\function1.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\funnel.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\grid.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\ruler.png" />
+  </ItemGroup>
+  <ItemGroup>
     <Folder Include="DrawingSource\Preview\" />
     <Folder Include="FeatureSource\Providers\Rdbms\" />
     <Folder Include="LayerDefinition\Geometry\" />

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -144,6 +144,13 @@
             }
         }
         
+        internal static System.Drawing.Bitmap block {
+            get {
+                object obj = ResourceManager.GetObject("block", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap clipboard_paste {
             get {
                 object obj = ResourceManager.GetObject("clipboard-paste", resourceCulture);
@@ -151,6 +158,15 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to An error occured while reading column values: {0}.
+        /// </summary>
+        internal static string ColumnValueError {
+            get {
+                return ResourceManager.GetString("ColumnValueError", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap control {
             get {
                 object obj = ResourceManager.GetObject("control", resourceCulture);
@@ -329,6 +345,24 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Function: {1}({2})
+        ///Description: {3}
+        ///Returns: {0}.
+        /// </summary>
+        internal static string FunctionTooltip {
+            get {
+                return ResourceManager.GetString("FunctionTooltip", resourceCulture);
+            }
+        }
+        
+        internal static System.Drawing.Bitmap funnel {
+            get {
+                object obj = ResourceManager.GetObject("funnel", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap globe__arrow {
             get {
                 object obj = ResourceManager.GetObject("globe--arrow", resourceCulture);
@@ -357,6 +391,13 @@
             }
         }
         
+        internal static System.Drawing.Bitmap grid {
+            get {
+                object obj = ResourceManager.GetObject("grid", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to infinite.
         /// </summary>
@@ -440,6 +481,15 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to No values found in selected column.
+        /// </summary>
+        internal static string NoColumnValuesError {
+            get {
+                return ResourceManager.GetString("NoColumnValuesError", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap plus_circle {
             get {
                 object obj = ResourceManager.GetObject("plus-circle", resourceCulture);
@@ -447,6 +497,30 @@
             }
         }
         
+        internal static System.Drawing.Bitmap property {
+            get {
+                object obj = ResourceManager.GetObject("property", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Property: {0}
+        ///Type: {1}.
+        /// </summary>
+        internal static string PropertyTooltip {
+            get {
+                return ResourceManager.GetString("PropertyTooltip", resourceCulture);
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ruler {
+            get {
+                object obj = ResourceManager.GetObject("ruler", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap scissors_blue {
             get {
                 object obj = ResourceManager.GetObject("scissors-blue", resourceCulture);
@@ -510,6 +584,20 @@
             }
         }
         
+        internal static System.Drawing.Bitmap sum {
+            get {
+                object obj = ResourceManager.GetObject("sum", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap table {
+            get {
+                object obj = ResourceManager.GetObject("table", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap table__arrow {
             get {
                 object obj = ResourceManager.GetObject("table--arrow", resourceCulture);

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-07-10 15:34:02 UTC (rev 5023)
@@ -118,228 +118,268 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="sql-join" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql-join.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="exclamation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\exclamation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="minus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\minus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="plus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\plus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="tick" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\tick.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="application-search-result" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application-search-result.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="TestConnectionNoErrors" xml:space="preserve">
-    <value>Provider reported no errors</value>
+  <data name="document--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\document--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="globe--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\globe--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="application--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="cross-script" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\cross-script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="XmlDocIsValid" xml:space="preserve">
+    <value>Document is valid</value>
   </data>
-  <data name="sql-join-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql-join-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="globe--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\globe--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="application--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="application-import" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application-import.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="drive-upload" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\drive-upload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="InfiniteValue" xml:space="preserve">
     <value>infinite</value>
     <comment>A value that is displayed when the value assigned is infinite</comment>
   </data>
-  <data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="sql" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="magnifier" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FindEmptyString" xml:space="preserve">
+    <value>Cannot Find an Empty String</value>
   </data>
-  <data name="sql-join-inner" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql-join-inner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="property" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\property.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="plus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\plus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="edit-indent" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\edit-indent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="scissors-blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\scissors-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="tick" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\tick.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="XmlDocIsValid" xml:space="preserve">
-    <value>Document is valid</value>
+  <data name="control" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\control.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="TransparentName" xml:space="preserve">
-    <value>Transparent</value>
+  <data name="application-export" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application-export.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="control-stop-square" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\control-stop-square.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="arrow-270" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-270.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="edit-indent" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\edit-indent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="databases-relation" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\databases-relation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="application-search-result" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application-search-result.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="layer--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\layer--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="arrow-return-180" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-return-180.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="XmlEditorCursorTemplate" xml:space="preserve">
+    <value>Line {0}, Column {1}</value>
+  </data>
+  <data name="sql-join-right" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql-join-right.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="clipboard-paste" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\clipboard-paste.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="InvalidValueError" xml:space="preserve">
-    <value>Invalid value</value>
-    <comment>An error message that is displayed when the entered value is invalid</comment>
+  <data name="sql-join" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql-join.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FileDownloaded" xml:space="preserve">
-    <value>File Downloaded</value>
+  <data name="tick-circle-frame" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\tick-circle-frame.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="globe--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\globe--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="NoColumnValuesError" xml:space="preserve">
+    <value>No values found in selected column</value>
+    <comment>A message displayed when the column has no values</comment>
   </data>
-  <data name="document--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\document--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="layers-stack-arrange" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\layers-stack-arrange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="control-stop-square" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\control-stop-square.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="document--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\document--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="control" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\control.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="arrow-curve" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-curve.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="folder_horizontal" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\folder-horizontal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FunctionTooltip" xml:space="preserve">
+    <value>Function: {1}({2})
+Description: {3}
+Returns: {0}</value>
+    <comment>The tooltip displayed in the text editor when the cursor is over a function name</comment>
   </data>
-  <data name="arrow-090" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-090.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="minus-circle" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\minus-circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FindNothing" xml:space="preserve">
-    <value>Could not find specified string or end of document reached</value>
+  <data name="scissors-blue" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\scissors-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="exclamation" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\exclamation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TitleError" xml:space="preserve">
+    <value>Error</value>
   </data>
-  <data name="arrow-return-180" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-return-180.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TransparentName" xml:space="preserve">
+    <value>Transparent</value>
   </data>
-  <data name="table--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\table--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="globe--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\globe--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="FindReplaceNothing" xml:space="preserve">
+    <value>Nothing to replace</value>
+  </data>
+  <data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="block" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\block.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="application--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="globe--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\globe--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="table" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\table.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="arrow-circle-135" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-circle-135.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="layer--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\layer--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="document-copy" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\document-copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="MgCooker" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHrSURBVDhPhZLtS1NhGMb9T/rQx6ACyUVDyQjDaKAGQYOB
+        Ew2K9ilifrA+LDAMablFb1IM03DbMXMwj4O15VZ5iPly2Go0yzCzF0iwr4OdX3seOxK1owcunofzPPfv
+        vq77nLo6i2d44j0Xb8elgk90rO7VfN80dB13coLmyUFalCMcHjvJ+fBnHkdLu4Psty5wKhZgz9022tUw
+        9oiHpuQy+1IG7umNnQGdfkV2bA4fq3ZtpCP+EI9u4NAM6mMJDkaDuPoj1pCGgUt/LDfiSYV4sFzGm6/g
+        zBkcGOtj/4gTm/+cNeBqvIBttIeexDDqlwqhjxX6ixVcc1/lHITawn5rwBVlVRa0x4ZoVc7i1V5JBx3p
+        nIwk4wU6rQG+e3m8ehlnMrodxaGOc+K1gS21waHRMzh6B3cepHDRrf2UHe3jp2mZXaf+hcHeRBnxeXf9
+        H4L3Z3HfnOJoyMVxtUSD+ovW55t03SnguzZNOp2xhiws6GjaPJPPXnLDn8Hnn6NvIMvl3qcEApHq2Rsp
+        SxcCUHj7QUrsTaAo0vUSi0vv5JklxCwUl0Wxuf4NE3vLGCuf1rdtii7Z7JZlASoWV1G6uslEpsjlFmvH
+        WFv7wcxM6j8JZ9++bzL/aISV/Ja7mnNYqmY07YouQubg/l1NwG/XLb2y/7oFegAAAABJRU5ErkJggg==
+</value>
   </data>
-  <data name="databases-relation" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\databases-relation.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="TestConnectionNoErrors" xml:space="preserve">
+    <value>Provider reported no errors</value>
   </data>
-  <data name="globe--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\globe--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="magnifier" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="MoreColorsName" xml:space="preserve">
-    <value>More colors...</value>
-  </data>
-  <data name="script--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\script--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="sort-number" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\sort-number.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="tick-circle-frame" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\tick-circle-frame.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="arrow-090" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-090.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FindEmptyString" xml:space="preserve">
-    <value>Cannot Find an Empty String</value>
+  <data name="globe--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\globe--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="arrow-270" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-270.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="application--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\application--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="globe--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\globe--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="document-copy" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\document-copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="sql-join-right" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql-join-right.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FileDownloaded" xml:space="preserve">
+    <value>File Downloaded</value>
   </data>
-  <data name="folder--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\folder--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="function" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\function.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="application--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="folder--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\folder--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="TitleError" xml:space="preserve">
-    <value>Error</value>
+  <data name="sum" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sum.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="arrow-circle-135" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-circle-135.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="MoreColorsName" xml:space="preserve">
+    <value>More colors...</value>
   </data>
-  <data name="document--pencil" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\document--pencil.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="InvalidValueError" xml:space="preserve">
+    <value>Invalid value</value>
+    <comment>An error message that is displayed when the entered value is invalid</comment>
   </data>
-  <data name="layer--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\layer--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="cross" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\cross.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="drive-upload" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\drive-upload.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="cross-script" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\cross-script.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="cross-circle-frame" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\cross-circle-frame.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="arrow-curve" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-curve.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="layer" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\layer.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="arrow-curve-180-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\arrow-curve-180-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ColumnValueError" xml:space="preserve">
+    <value>An error occured while reading column values: {0}</value>
+    <comment>An error message that is displayed when the column values could not be read</comment>
+  </data>
   <data name="drive-download" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\drive-download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="application--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="sql-join-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql-join-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="FindReplaceNothing" xml:space="preserve">
-    <value>Nothing to replace</value>
-  </data>
-  <data name="application-export" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application-export.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="database--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\database--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="folder--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\folder--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="script--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\script--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="XmlEditorCursorTemplate" xml:space="preserve">
-    <value>Line {0}, Column {1}</value>
+  <data name="folder_horizontal" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\folder-horizontal.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="arrow-curve-180-left" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\arrow-curve-180-left.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="FindNothing" xml:space="preserve">
+    <value>Could not find specified string or end of document reached</value>
   </data>
-  <data name="sql" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\sql.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="document--plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\document--plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="function" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\function.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="table--arrow" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\table--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="application-import" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\application-import.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="folder--minus" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\folder--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="layers-stack-arrange" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\layers-stack-arrange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
   <data name="layers-stack-arrange-back" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\layers-stack-arrange-back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="layer" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\layer.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="funnel" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\funnel.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="FiniteDisplayScales" xml:space="preserve">
     <value>Finite Display Scales</value>
   </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="MgCooker" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHrSURBVDhPhZLtS1NhGMb9T/rQx6ACyUVDyQjDaKAGQYOB
-        Ew2K9ilifrA+LDAMablFb1IM03DbMXMwj4O15VZ5iPly2Go0yzCzF0iwr4OdX3seOxK1owcunofzPPfv
-        vq77nLo6i2d44j0Xb8elgk90rO7VfN80dB13coLmyUFalCMcHjvJ+fBnHkdLu4Psty5wKhZgz9022tUw
-        9oiHpuQy+1IG7umNnQGdfkV2bA4fq3ZtpCP+EI9u4NAM6mMJDkaDuPoj1pCGgUt/LDfiSYV4sFzGm6/g
-        zBkcGOtj/4gTm/+cNeBqvIBttIeexDDqlwqhjxX6ixVcc1/lHITawn5rwBVlVRa0x4ZoVc7i1V5JBx3p
-        nIwk4wU6rQG+e3m8ehlnMrodxaGOc+K1gS21waHRMzh6B3cepHDRrf2UHe3jp2mZXaf+hcHeRBnxeXf9
-        H4L3Z3HfnOJoyMVxtUSD+ovW55t03SnguzZNOp2xhiws6GjaPJPPXnLDn8Hnn6NvIMvl3qcEApHq2Rsp
-        SxcCUHj7QUrsTaAo0vUSi0vv5JklxCwUl0Wxuf4NE3vLGCuf1rdtii7Z7JZlASoWV1G6uslEpsjlFmvH
-        WFv7wcxM6j8JZ9++bzL/aISV/Ja7mnNYqmY07YouQubg/l1NwG/XLb2y/7oFegAAAABJRU5ErkJggg==
-</value>
+  <data name="PropertyTooltip" xml:space="preserve">
+    <value>Property: {0}
+Type: {1}</value>
+    <comment>The tooltip displayed in the text editor when the cursor is over a property</comment>
   </data>
+  <data name="sql-join-inner" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\sql-join-inner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="grid" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\grid.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ruler" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ruler.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/block.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/block.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/funnel.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/funnel.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/grid.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/grid.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/property.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/property.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/ruler.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/ruler.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/sum.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/sum.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: sandbox/maestro-3.0/Maestro.Editors/Resources/table.png
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/Maestro.Editors/Resources/table.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -36,6 +36,7 @@
         /// </summary>
         void DescribeSchema();
 
+        OSGeo.MapGuide.ObjectModels.Capabilities.FdoProviderCapabilities GetProviderCapabilities(string provider);
         ObjCommon.FeatureProviderRegistryFeatureProvider[] FeatureProviders { get; }
         string TestConnection(string providername, NameValueCollection parameters);
         string TestConnection(string featureSourceId);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-07-10 14:38:40 UTC (rev 5022)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-07-10 15:34:02 UTC (rev 5023)
@@ -35,6 +35,7 @@
 using OSGeo.MapGuide.MaestroAPI.Exceptions;
 using OSGeo.MapGuide.MaestroAPI.Http;
 using System.IO;
+using OSGeo.MapGuide.ObjectModels.Capabilities;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -1722,5 +1723,21 @@
         {
             throw new NotImplementedException();
         }
+
+
+        public FdoProviderCapabilities GetProviderCapabilities(string provider)
+        {
+            if (m_cachedProviderCapabilities == null)
+                m_cachedProviderCapabilities = new Hashtable();
+
+			if (m_cachedProviderCapabilities.ContainsKey(provider))
+				return (FdoProviderCapabilities)m_cachedProviderCapabilities[provider];
+
+			string req = m_reqBuilder.GetProviderCapabilities(provider);
+
+			//TODO: Cache?
+			FdoProviderCapabilities o = (FdoProviderCapabilities)DeserializeObject(typeof(FdoProviderCapabilities), this.OpenRead(req));
+			return o;
+        }
     }
 }



More information about the mapguide-commits mailing list