[mapguide-commits] r7991 - in trunk/Tools/Maestro/Maestro.Editors: . LayerDefinition/Vector/Thematics

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Mar 21 05:06:43 PDT 2014


Author: jng
Date: 2014-03-21 05:06:43 -0700 (Fri, 21 Mar 2014)
New Revision: 7991

Modified:
   trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs
   trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.designer.cs
   trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.resx
   trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs
   trunk/Tools/Maestro/Maestro.Editors/Strings.resx
Log:
#2407: Support individual theme generation based on values in an external lookup table.

Modified: trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs	2014-03-20 09:44:15 UTC (rev 7990)
+++ trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs	2014-03-21 12:06:43 UTC (rev 7991)
@@ -35,6 +35,8 @@
 using Ldf = OSGeo.MapGuide.ObjectModels.LayerDefinition;
 using OSGeo.MapGuide.MaestroAPI.Schema;
 using System.Collections.Specialized;
+using Maestro.Editors.Generic;
+using Maestro.Shared.UI;
 
 namespace Maestro.Editors.LayerDefinition.Vector.Thematics
 {
@@ -42,14 +44,25 @@
     {
         private const int PREVIEW_ITEM_BOX_WIDTH = 20;
         private const int PREVIEW_ITEM_BOX_SPACING = 10;
+        const int MAX_NUMERIC_THEME_RULES = 100000;
+        const int MAX_INDIVIDUAL_THEME_RULES = 100;
+        const int THEME_RULE_WARNING_LIMIT = 1000;
 
         private static List<ColorBrewer> m_colorBrewer;
 
         private IEditorService m_editor;
         private ILayerDefinition m_layer;
-        private ClassDefinition m_schema;
+        private ClassDefinition m_featureClass;
         private Dictionary<object, long> m_values;
         private DataPropertyType m_dataType;
+
+        class LookupPair
+        {
+            public object Key;
+            public object Value;
+        }
+
+        private List<LookupPair> m_lookupValues;
         
         private object m_ruleCollection;
 
@@ -83,7 +96,7 @@
         {
             m_editor = editor;
             m_layer = layer;
-            m_schema = schema;
+            m_featureClass = schema;
             m_ruleCollection = ruleCollection;
 
             _factory = (ILayerElementFactory)editor.GetEditedResource();
@@ -149,6 +162,8 @@
 
             if (m_colorBrewer == null)
                 m_colorBrewer = ColorBrewer.ParseCSV(GetCsvPath());
+
+            UpdateThemeChoice();
         }
 
         private string GetCsvPath()
@@ -183,25 +198,18 @@
             ColumnCombo.Items.Add(Strings.SelectColumnPlaceholder);
             ColumnCombo.SelectedIndex = 0;
 
-            foreach (var col in m_schema.Properties)
+            foreach (var col in m_featureClass.Properties)
             {
                 if (col.Type == PropertyDefinitionType.Data)
                     ColumnCombo.Items.Add(col.Name);
             }
         }
 
-        private void ColumnCombo_SelectedIndexChanged(object sender, EventArgs e)
+        private void UpdateUIForClassSelection()
         {
             if (ColumnCombo.SelectedIndex == 0)
             {
-                //Dummy item selected, just disable the form
-                RuleCountPanel.Enabled =
-                GroupPanel.Enabled =
-                DisplayGroup.Enabled =
-                PreviewGroup.Enabled =
-                OKBtn.Enabled =
-                    false;
-
+                DisableThemeOptions();
             }
             else
             {
@@ -212,8 +220,8 @@
 
                 m_values = new Dictionary<object, long>();
 
-                PropertyDefinition col = m_schema.FindProperty(ColumnCombo.Text);
-                
+                PropertyDefinition col = m_featureClass.FindProperty(ColumnCombo.Text);
+
                 //Not really possible
                 if (col == null)
                     throw new Exception(Strings.InvalidColumnNameError);
@@ -237,14 +245,14 @@
                             //flag in the SELECTAGGREGATES operation that's exposed over HTTP. Either
                             //case, try this method first.
                             using (var rd = m_editor.FeatureService.AggregateQueryFeatureSource(
-                                                    vl.ResourceId, 
-                                                    m_schema.QualifiedName, 
-                                                    filter, 
+                                                    vl.ResourceId,
+                                                    m_featureClass.QualifiedName,
+                                                    filter,
                                                     new NameValueCollection() {
                                                         { "value", "UNIQUE(\"" + col.Name + "\")" } 
                                                     }))
                             {
-                                while (rd.ReadNext() && m_values.Count < 100000) //No more than 100.000 records in memory
+                                while (rd.ReadNext() && m_values.Count < MAX_NUMERIC_THEME_RULES) //No more than 100.000 records in memory
                                 {
                                     if (!rd.IsNull("value"))
                                     {
@@ -260,10 +268,10 @@
                         }
                         catch
                         {
-                            
-                            using (var rd = m_editor.FeatureService.QueryFeatureSource(vl.ResourceId, m_schema.QualifiedName, filter, new string[] { col.Name }))
+
+                            using (var rd = m_editor.FeatureService.QueryFeatureSource(vl.ResourceId, m_featureClass.QualifiedName, filter, new string[] { col.Name }))
                             {
-                                while (rd.ReadNext() && m_values.Count < 100000) //No more than 100.000 records in memory
+                                while (rd.ReadNext() && m_values.Count < MAX_NUMERIC_THEME_RULES) //No more than 100.000 records in memory
                                 {
                                     if (!rd.IsNull(col.Name))
                                     {
@@ -312,8 +320,8 @@
 
                     if (dp.IsNumericType())
                     {
-                        if (m_values.Count >= 100000)
-                            MessageBox.Show(this, string.Format(Strings.TooMuchDataWarning, 100000), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                        if (m_values.Count >= MAX_NUMERIC_THEME_RULES)
+                            MessageBox.Show(this, string.Format(Strings.TooMuchDataWarning, MAX_NUMERIC_THEME_RULES), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
 
                         GroupPanel.Enabled = true;
                         RuleCountPanel.Enabled = true;
@@ -322,7 +330,7 @@
                         if (m_values.Count <= 9)
                         {
                             AggregateCombo.SelectedIndex = AggregateCombo.Items.Count - 1;
-                            AggregateCombo_SelectedIndexChanged(sender, e);
+                            AggregateCombo_SelectedIndexChanged(this, EventArgs.Empty);
 
                             RefreshColorBrewerSet();
                         }
@@ -341,15 +349,15 @@
                     }
                     else //String type
                     {
-                        if (m_values.Count > 100)
+                        if (m_values.Count > MAX_INDIVIDUAL_THEME_RULES)
                         {
-                            MessageBox.Show(this, string.Format(Strings.TooManyValuesError, 100), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                            MessageBox.Show(this, string.Format(Strings.TooManyValuesError, MAX_INDIVIDUAL_THEME_RULES), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
                             ColumnCombo.SelectedIndex = 0;
                             return;
                         }
 
-                        RuleCountPanel.Enabled = 
-                        GroupPanel.Enabled = 
+                        RuleCountPanel.Enabled =
+                        GroupPanel.Enabled =
                             false;
 
                         RuleCount.Minimum = 0;
@@ -371,6 +379,36 @@
             }
         }
 
+        private void DisableThemeOptions()
+        {
+            //Dummy item selected, just disable the form
+            RuleCountPanel.Enabled =
+            GroupPanel.Enabled =
+            DisplayGroup.Enabled =
+            PreviewGroup.Enabled =
+            OKBtn.Enabled =
+                false;
+        }
+
+        private void ColumnCombo_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (ColumnCombo.SelectedIndex == 0)
+            {
+                DisableThemeOptions();
+            }
+            else
+            {
+                if (rdValuesFromClass.Checked)
+                {
+                    UpdateUIForClassSelection();
+                }
+                else if (rdValuesFromLookup.Checked)
+                {
+                    UpdateUIForExternalLookup();
+                }
+            }
+        }
+
         private void RefreshColorBrewerSet()
         {
             try
@@ -412,136 +450,173 @@
             Color[] colors = BuildColorSet(false);
             List<RuleItem> result = new List<RuleItem>();
 
-            if (AggregateCombo.SelectedIndex == 0 || AggregateCombo.SelectedIndex == 1 || AggregateCombo.SelectedIndex == 2)
+            if (rdValuesFromClass.Checked)
             {
-                double min = double.MaxValue;
-                double max = double.MinValue;
-                double mean = 0;
-                long count = 0;
-                foreach (KeyValuePair<object, long> entry in m_values)
+                if (AggregateCombo.SelectedIndex == 0 || AggregateCombo.SelectedIndex == 1 || AggregateCombo.SelectedIndex == 2)
                 {
-                    double value = Convert.ToDouble(entry.Key);
-                    min = Math.Min(value, min);
-                    max = Math.Max(value, max);
-                    mean += value * entry.Value;
-                    count += entry.Value;
-                }
+                    double min = double.MaxValue;
+                    double max = double.MinValue;
+                    double mean = 0;
+                    long count = 0;
+                    foreach (KeyValuePair<object, long> entry in m_values)
+                    {
+                        double value = Convert.ToDouble(entry.Key);
+                        min = Math.Min(value, min);
+                        max = Math.Max(value, max);
+                        mean += value * entry.Value;
+                        count += entry.Value;
+                    }
 
-                mean /= count;
+                    mean /= count;
 
-                if (AggregateCombo.SelectedIndex == 0) //Equal
-                {
-                    double chunksize = (max - min) / colors.Length;
-                    result.Add(new RuleItem(
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" <= {1}", ColumnCombo.Text, FormatValue(chunksize + min)),
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.LessThanLabel, FormatValue(chunksize + min)), 
-                        colors[0]));
-
-                    for (int i = 1; i < colors.Length - 1; i++)
+                    if (AggregateCombo.SelectedIndex == 0) //Equal
+                    {
+                        double chunksize = (max - min) / colors.Length;
                         result.Add(new RuleItem(
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1} AND \"{0}\" <= {2}", ColumnCombo.Text, FormatValue(min + (i * chunksize)), FormatValue(min + ((i + 1) * chunksize))),
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.BetweenLabel, FormatValue(min + (i * chunksize)), FormatValue(min + ((i + 1) * chunksize))),
-                            colors[i]));
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" <= {1}", ColumnCombo.Text, FormatValue(chunksize + min)),
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.LessThanLabel, FormatValue(chunksize + min)),
+                            colors[0]));
 
-                    result.Add(new RuleItem(
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1}", ColumnCombo.Text, FormatValue(max - chunksize)),
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.MoreThanLabel, FormatValue(max - chunksize)), 
-                        colors[colors.Length - 1]));
-                }
-                else if (AggregateCombo.SelectedIndex == 1) //Standard Deviation
-                {
-                    double dev = 0;
-                    foreach (KeyValuePair<object, long> entry in m_values)
-                        dev += ((Convert.ToDouble(entry.Key) - mean) * (Convert.ToDouble(entry.Key) - mean)) * entry.Value;
+                        for (int i = 1; i < colors.Length - 1; i++)
+                            result.Add(new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1} AND \"{0}\" <= {2}", ColumnCombo.Text, FormatValue(min + (i * chunksize)), FormatValue(min + ((i + 1) * chunksize))),
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.BetweenLabel, FormatValue(min + (i * chunksize)), FormatValue(min + ((i + 1) * chunksize))),
+                                colors[i]));
 
-                    dev /= count;
-                    dev = Math.Sqrt(dev);
+                        result.Add(new RuleItem(
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1}", ColumnCombo.Text, FormatValue(max - chunksize)),
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.MoreThanLabel, FormatValue(max - chunksize)),
+                            colors[colors.Length - 1]));
+                    }
+                    else if (AggregateCombo.SelectedIndex == 1) //Standard Deviation
+                    {
+                        double dev = 0;
+                        foreach (KeyValuePair<object, long> entry in m_values)
+                            dev += ((Convert.ToDouble(entry.Key) - mean) * (Convert.ToDouble(entry.Key) - mean)) * entry.Value;
 
-                    double span = (dev * (colors.Length / 2));
-                    double lower = mean < span ? span - mean : mean - span;
+                        dev /= count;
+                        dev = Math.Sqrt(dev);
 
-                    if (colors.Length % 2 == 1)
-                        lower += dev / 2; //The middle item goes half an alpha to each side
+                        double span = (dev * (colors.Length / 2));
+                        double lower = mean < span ? span - mean : mean - span;
 
-                    result.Add(new RuleItem(
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" < {1}", ColumnCombo.Text, FormatValue(lower + dev)),
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.LessThanLabel, FormatValue(lower + dev)),
-                        colors[0]));
+                        if (colors.Length % 2 == 1)
+                            lower += dev / 2; //The middle item goes half an alpha to each side
 
-                    for (int i = 1; i < colors.Length - 1; i++)
                         result.Add(new RuleItem(
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" >= {1} AND \"{0}\" < {2}", ColumnCombo.Text, FormatValue(lower + (i * dev)), FormatValue(lower + ((i + 1) * dev))),
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.BetweenLabel, FormatValue(lower + (i * dev)), FormatValue(lower + ((i + 1) * dev))),
-                            colors[i]));
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" < {1}", ColumnCombo.Text, FormatValue(lower + dev)),
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.LessThanLabel, FormatValue(lower + dev)),
+                            colors[0]));
 
-                    result.Add(new RuleItem(
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" >= {1}", ColumnCombo.Text, FormatValue(lower + (dev * (colors.Length - 1)))),
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.MoreThanLabel, FormatValue(lower + (dev * (colors.Length - 1)))),
-                        colors[colors.Length - 1]));
+                        for (int i = 1; i < colors.Length - 1; i++)
+                            result.Add(new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" >= {1} AND \"{0}\" < {2}", ColumnCombo.Text, FormatValue(lower + (i * dev)), FormatValue(lower + ((i + 1) * dev))),
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.BetweenLabel, FormatValue(lower + (i * dev)), FormatValue(lower + ((i + 1) * dev))),
+                                colors[i]));
 
-                }
-                else if (AggregateCombo.SelectedIndex == 2) //Quantile
-                {
-                    SortedDictionary<double, long> sort = new SortedDictionary<double, long>();
-                    foreach (KeyValuePair<object, long> entry in m_values)
-                        sort.Add(Convert.ToDouble(entry.Key), entry.Value);
+                        result.Add(new RuleItem(
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" >= {1}", ColumnCombo.Text, FormatValue(lower + (dev * (colors.Length - 1)))),
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.MoreThanLabel, FormatValue(lower + (dev * (colors.Length - 1)))),
+                            colors[colors.Length - 1]));
 
-                    double step = (1.0 / colors.Length) * count;
-                    List<double> separators = new List<double>();
-                    for(int i = 1; i < colors.Length; i++)
+                    }
+                    else if (AggregateCombo.SelectedIndex == 2) //Quantile
                     {
-                        long limit = (long)Math.Round(step * i);
-                        long cc = 0;
-                        double item = double.NaN;
+                        SortedDictionary<double, long> sort = new SortedDictionary<double, long>();
+                        foreach (KeyValuePair<object, long> entry in m_values)
+                            sort.Add(Convert.ToDouble(entry.Key), entry.Value);
 
-                        foreach(KeyValuePair<double, long> entry in sort)
+                        double step = (1.0 / colors.Length) * count;
+                        List<double> separators = new List<double>();
+                        for (int i = 1; i < colors.Length; i++)
                         {
-                            item = entry.Key;
-                            cc += entry.Value;
-                            if (cc >= limit)
-                                break;
+                            long limit = (long)Math.Round(step * i);
+                            long cc = 0;
+                            double item = double.NaN;
+
+                            foreach (KeyValuePair<double, long> entry in sort)
+                            {
+                                item = entry.Key;
+                                cc += entry.Value;
+                                if (cc >= limit)
+                                    break;
+                            }
+
+                            separators.Add(item);
                         }
 
-                        separators.Add(item);
-                    }
+                        result.Add(new RuleItem(
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" <= {1}", ColumnCombo.Text, FormatValue(separators[0])),
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.LessThanLabel, FormatValue(separators[0])),
+                            colors[0]));
 
-                    result.Add(new RuleItem(
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" <= {1}", ColumnCombo.Text, FormatValue(separators[0])),
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.LessThanLabel, FormatValue(separators[0])),
-                        colors[0]));
+                        for (int i = 1; i < colors.Length - 1; i++)
+                            result.Add(new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1} AND \"{0}\" <= {2}", ColumnCombo.Text, FormatValue(separators[i - 1]), FormatValue(separators[i])),
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.BetweenLabel, FormatValue(separators[i - 1]), FormatValue(separators[i])),
+                                colors[i]));
 
-                    for (int i = 1; i < colors.Length - 1; i++)
                         result.Add(new RuleItem(
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1} AND \"{0}\" <= {2}", ColumnCombo.Text, FormatValue(separators[i - 1]), FormatValue(separators[i])),
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.BetweenLabel, FormatValue(separators[i - 1]), FormatValue(separators[i])),
-                            colors[i]));
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1}", ColumnCombo.Text, FormatValue(separators[separators.Count - 1])),
+                            string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.MoreThanLabel, FormatValue(separators[separators.Count - 1])),
+                            colors[colors.Length - 1]));
+                    }
+                }
+                else if (AggregateCombo.SelectedIndex == 3) //Individual
+                {
+                    List<object> items = new List<object>(m_values.Keys);
+                    items.Sort(); //Handles types correctly
 
-                    result.Add(new RuleItem(
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" > {1}", ColumnCombo.Text, FormatValue(separators[separators.Count - 1])),
-                        string.Format(System.Globalization.CultureInfo.InvariantCulture, Strings.MoreThanLabel, FormatValue(separators[separators.Count - 1])),
-                        colors[colors.Length - 1]));
+                    for (int i = 0; i < colors.Length; i++)
+                        if (items[i] is string)
+                            result.Add(new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" = '{1}'", ColumnCombo.Text, items[i]),
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", items[i]),
+                                colors[i]));
+                        else
+                            result.Add(new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" = {1}", ColumnCombo.Text, items[i]),
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", items[i]),
+                                colors[i]));
+
                 }
             }
-            else if (AggregateCombo.SelectedIndex == 3) //Individual
+            else if (rdValuesFromLookup.Checked)
             {
-                List<object> items = new List<object>(m_values.Keys);
-                items.Sort(); //Handles types correctly
+                //We use the type of the primary property and not the secondary key property
+                //as the filter will be generated against the primary property
+                PropertyDefinition keyProp = m_featureClass.FindProperty(ColumnCombo.Text);
+                bool isStringKeyProp = false;
+                if (keyProp.Type == PropertyDefinitionType.Data)
+                {
+                    DataPropertyDefinition dp = (DataPropertyDefinition)keyProp;
+                    isStringKeyProp = (dp.DataType == DataPropertyType.String);
+                }
 
                 for (int i = 0; i < colors.Length; i++)
-                    if (items[i] is string)
-                        result.Add(new RuleItem(
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" = '{1}'", ColumnCombo.Text, items[i]),
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", items[i]), 
-                            colors[i]));
+                {
+                    var pair = m_lookupValues[i];
+                    if (isStringKeyProp)
+                    {
+                        result.Add(
+                            new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" = '{1}'", ColumnCombo.Text, pair.Key),
+                                pair.Value.ToString(),
+                                colors[i]
+                            ));
+                    }
                     else
-                        result.Add(new RuleItem(
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" = {1}", ColumnCombo.Text, items[i]),
-                            string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", items[i]), 
-                            colors[i])); 
-
+                    {
+                        result.Add(
+                            new RuleItem(
+                                string.Format(System.Globalization.CultureInfo.InvariantCulture, "\"{0}\" = {1}", ColumnCombo.Text, pair.Key),
+                                pair.Value.ToString(),
+                                colors[i]
+                            ));
+                    }
+                }
             }
 
-
             return result;
         }
 
@@ -624,7 +699,11 @@
         /// <returns>A list of colors matching the user selection</returns>
         private Color[] BuildColorSet(bool forPreview)
         {
-            Color[] res = new Color[forPreview ? Math.Min((int)RuleCount.Value, 100) : (AggregateCombo.SelectedIndex == AggregateCombo.Items.Count - 1 ? m_values.Count : (int)RuleCount.Value)];
+            Color[] res = null;
+            if (rdValuesFromClass.Checked)
+                res = new Color[forPreview ? Math.Min((int)RuleCount.Value, MAX_INDIVIDUAL_THEME_RULES) : (AggregateCombo.SelectedIndex == AggregateCombo.Items.Count - 1 ? m_values.Count : (int)RuleCount.Value)];
+            else if (rdValuesFromLookup.Checked)
+                res = new Color[forPreview ? Math.Min((int)RuleCount.Value, MAX_INDIVIDUAL_THEME_RULES) : (AggregateCombo.SelectedIndex == AggregateCombo.Items.Count - 1 ? m_lookupValues.Count : (int)RuleCount.Value)];
 
             if (GradientColors.Checked)
             {
@@ -669,9 +748,9 @@
         {
             if (AggregateCombo.SelectedIndex == AggregateCombo.Items.Count - 1)
             {
-                if (m_values.Count > 100)
+                if (m_values.Count > MAX_INDIVIDUAL_THEME_RULES)
                 {
-                    MessageBox.Show(this, string.Format(Strings.TooManyIndiviualValuesError, 100), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                    MessageBox.Show(this, string.Format(Strings.TooManyIndiviualValuesError, MAX_INDIVIDUAL_THEME_RULES), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
                     AggregateCombo.SelectedIndex = 0;
                     return;
                 }
@@ -760,7 +839,7 @@
             {
                 List<RuleItem> rules = CalculateRuleSet();
 
-                if (rules.Count > 1000)
+                if (rules.Count > THEME_RULE_WARNING_LIMIT)
                 {
                     if (MessageBox.Show(this, Strings.TooManyRulesWarning, Application.ProductName, MessageBoxButtons.YesNoCancel) != DialogResult.Yes)
                         return;
@@ -949,5 +1028,173 @@
             }
             LoadColorBrewerOptions();
         }
+
+        private void UpdateThemeChoice()
+        {
+            GroupPanel.Enabled = rdValuesFromClass.Checked;
+            grpValuesFromLookup.Enabled = rdValuesFromLookup.Checked;
+        }
+
+        private void rdValuesFromClass_CheckedChanged(object sender, EventArgs e)
+        {
+            UpdateThemeChoice();
+            if (rdValuesFromClass.Checked)
+                UpdateUIForClassSelection();
+        }
+
+        private void rdValuesFromLookup_CheckedChanged(object sender, EventArgs e)
+        {
+            UpdateThemeChoice();
+            if (rdValuesFromLookup.Checked)
+                UpdateUIForExternalLookup();
+        }
+
+        private void UpdateUIForExternalLookup()
+        {
+            DisableThemeOptions();
+        }
+
+        private void btnBrowseFeatureSource_Click(object sender, EventArgs e)
+        {
+            using (var picker = new ResourcePicker(m_editor.ResourceService, ResourceTypes.FeatureSource, ResourcePickerMode.OpenResource))
+            {
+                if (picker.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+                {
+                    txtFeatureSource.Text = picker.ResourceID;
+                }
+            }
+        }
+
+        private void ClearExternalClassDropdowns()
+        {
+            cmbFeatureClass.DataSource = null;
+            cmbKeyProperty.DataSource = null;
+            cmbValueProperty.DataSource = null;
+            btnUpdateThemeParameters.Enabled = false;
+        }
+
+        private void txtFeatureSource_TextChanged(object sender, EventArgs e)
+        {
+            if (!string.IsNullOrEmpty(txtFeatureSource.Text))
+            {
+                var names = m_editor.FeatureService.GetClassNames(txtFeatureSource.Text, null);
+                if (names.Length > 0)
+                {
+                    cmbFeatureClass.DataSource = names;
+                    cmbFeatureClass.SelectedIndex = 0;
+                }
+                else
+                {
+                    ClearExternalClassDropdowns();
+                }
+            }
+            else
+            {
+                ClearExternalClassDropdowns();
+            }
+        }
+
+        private void cmbFeatureClass_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (cmbFeatureClass.SelectedItem != null)
+            {
+                var className = cmbFeatureClass.SelectedItem.ToString();
+                var clsDef = m_editor.FeatureService.GetClassDefinition(txtFeatureSource.Text, className);
+
+                var keyPropNames = new List<string>();
+                var valuePropNames = new List<string>();
+
+                foreach (var prop in clsDef.Properties)
+                {
+                    keyPropNames.Add(prop.Name);
+                    valuePropNames.Add(prop.Name);
+                }
+
+                cmbKeyProperty.DataSource = keyPropNames;
+                cmbValueProperty.DataSource = valuePropNames;
+
+                cmbKeyProperty.SelectedIndex = 0;
+                cmbValueProperty.SelectedIndex = 0;
+                btnUpdateThemeParameters.Enabled = true;
+            }
+            else
+            {
+                btnUpdateThemeParameters.Enabled = false;
+            }
+        }
+
+        private void btnUpdateThemeParameters_Click(object sender, EventArgs e)
+        {
+            string fsId = txtFeatureSource.Text;
+            string className = cmbFeatureClass.SelectedItem.ToString();
+            string key = cmbKeyProperty.SelectedItem.ToString();
+            string value = cmbValueProperty.SelectedItem.ToString();
+
+            BusyWaitDialog.Run(Strings.ComputingThemeParameters, 
+            () => { //Worker method
+                List<LookupPair> res = new List<LookupPair>();
+                using (var reader = m_editor.FeatureService.QueryFeatureSource(fsId, className, null, new string[] { key, value }))
+                {
+                    while(reader.ReadNext())
+                    {
+                        if (!reader.IsNull(key) && !reader.IsNull(value))
+                        {
+                            res.Add(new LookupPair()
+                            {
+                                Key = reader[key].ToString(),
+                                Value = reader[value].ToString()
+                            });
+                        }
+                    }
+                    reader.Close();
+                }
+                return res;
+            },
+            (res, ex) => { //Worker completion
+                if (ex != null)
+                {
+                    ErrorDialog.Show(ex);
+                }
+                else
+                {
+                    m_lookupValues = (List<LookupPair>)res;
+
+                    if (m_lookupValues.Count > MAX_INDIVIDUAL_THEME_RULES)
+                    {
+                        MessageBox.Show(this, string.Format(Strings.TooManyValuesError, MAX_INDIVIDUAL_THEME_RULES), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                        ColumnCombo.SelectedIndex = 0;
+                        return;
+                    }
+
+                    RuleCountPanel.Enabled =
+                    GroupPanel.Enabled =
+                        false;
+
+                    RuleCount.Minimum = 0;
+
+                    //Select "Individual"
+                    RuleCount.Value = m_lookupValues.Count;
+                    GradientColors.Checked = true;
+
+                    DisplayGroup.Enabled =
+                    PreviewGroup.Enabled =
+                    OKBtn.Enabled =
+                        true;
+
+                    RefreshColorBrewerSet();
+                    RefreshPreview();
+
+                    if (ColumnCombo.SelectedIndex == 0)
+                    {
+                        MessageBox.Show(Strings.ThemePrimaryKeyPropertyNotSelected);
+                        OKBtn.Enabled = false;
+                    }
+                    else
+                    {
+                        OKBtn.Enabled = true;
+                    }
+                }
+            });
+        }
     }
 }

Modified: trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.designer.cs	2014-03-20 09:44:15 UTC (rev 7990)
+++ trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.designer.cs	2014-03-21 12:06:43 UTC (rev 7991)
@@ -39,8 +39,22 @@
             this.RuleCount = new System.Windows.Forms.NumericUpDown();
             this.AggregateCombo = new System.Windows.Forms.ComboBox();
             this.DataGroup = new System.Windows.Forms.GroupBox();
+            this.rdValuesFromLookup = new System.Windows.Forms.RadioButton();
+            this.rdValuesFromClass = new System.Windows.Forms.RadioButton();
+            this.grpValuesFromLookup = new System.Windows.Forms.GroupBox();
+            this.btnUpdateThemeParameters = new System.Windows.Forms.Button();
+            this.btnBrowseFeatureSource = new System.Windows.Forms.Button();
+            this.cmbValueProperty = new System.Windows.Forms.ComboBox();
+            this.label8 = new System.Windows.Forms.Label();
+            this.cmbKeyProperty = new System.Windows.Forms.ComboBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.cmbFeatureClass = new System.Windows.Forms.ComboBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.txtFeatureSource = new System.Windows.Forms.TextBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.grpValuesFromClass = new System.Windows.Forms.GroupBox();
+            this.GroupPanel = new System.Windows.Forms.Panel();
             this.chkUseFirstRuleAsTemplate = new System.Windows.Forms.CheckBox();
-            this.GroupPanel = new System.Windows.Forms.Panel();
             this.RuleCountPanel = new System.Windows.Forms.Panel();
             this.DisplayGroup = new System.Windows.Forms.GroupBox();
             this.btnFlipColorBrewer = new System.Windows.Forms.Button();
@@ -60,9 +74,12 @@
             this.ButtonPanel = new System.Windows.Forms.Panel();
             this.CancelBtn = new System.Windows.Forms.Button();
             this.OKBtn = new System.Windows.Forms.Button();
+            this.grpThemeGeneration = new System.Windows.Forms.GroupBox();
             this.colorComboBox1 = new Maestro.Editors.Common.ColorComboBox();
             ((System.ComponentModel.ISupportInitialize)(this.RuleCount)).BeginInit();
             this.DataGroup.SuspendLayout();
+            this.grpValuesFromLookup.SuspendLayout();
+            this.grpValuesFromClass.SuspendLayout();
             this.GroupPanel.SuspendLayout();
             this.RuleCountPanel.SuspendLayout();
             this.DisplayGroup.SuspendLayout();
@@ -71,6 +88,7 @@
             this.PreviewGroup.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.PreviewPicture)).BeginInit();
             this.ButtonPanel.SuspendLayout();
+            this.grpThemeGeneration.SuspendLayout();
             this.SuspendLayout();
             // 
             // label1
@@ -142,16 +160,124 @@
             // DataGroup
             // 
             resources.ApplyResources(this.DataGroup, "DataGroup");
-            this.DataGroup.Controls.Add(this.chkUseFirstRuleAsTemplate);
-            this.DataGroup.Controls.Add(this.GroupPanel);
-            this.DataGroup.Controls.Add(this.RuleCountPanel);
+            this.DataGroup.Controls.Add(this.rdValuesFromLookup);
+            this.DataGroup.Controls.Add(this.rdValuesFromClass);
             this.DataGroup.Controls.Add(this.ColumnCombo);
-            this.DataGroup.Controls.Add(this.AppendRules);
-            this.DataGroup.Controls.Add(this.OverwriteRules);
             this.DataGroup.Controls.Add(this.label1);
+            this.DataGroup.Controls.Add(this.grpValuesFromLookup);
+            this.DataGroup.Controls.Add(this.grpValuesFromClass);
             this.DataGroup.Name = "DataGroup";
             this.DataGroup.TabStop = false;
             // 
+            // rdValuesFromLookup
+            // 
+            resources.ApplyResources(this.rdValuesFromLookup, "rdValuesFromLookup");
+            this.rdValuesFromLookup.Name = "rdValuesFromLookup";
+            this.rdValuesFromLookup.UseVisualStyleBackColor = true;
+            this.rdValuesFromLookup.CheckedChanged += new System.EventHandler(this.rdValuesFromLookup_CheckedChanged);
+            // 
+            // rdValuesFromClass
+            // 
+            resources.ApplyResources(this.rdValuesFromClass, "rdValuesFromClass");
+            this.rdValuesFromClass.Checked = true;
+            this.rdValuesFromClass.Name = "rdValuesFromClass";
+            this.rdValuesFromClass.TabStop = true;
+            this.rdValuesFromClass.UseVisualStyleBackColor = true;
+            this.rdValuesFromClass.CheckedChanged += new System.EventHandler(this.rdValuesFromClass_CheckedChanged);
+            // 
+            // grpValuesFromLookup
+            // 
+            resources.ApplyResources(this.grpValuesFromLookup, "grpValuesFromLookup");
+            this.grpValuesFromLookup.Controls.Add(this.btnUpdateThemeParameters);
+            this.grpValuesFromLookup.Controls.Add(this.btnBrowseFeatureSource);
+            this.grpValuesFromLookup.Controls.Add(this.cmbValueProperty);
+            this.grpValuesFromLookup.Controls.Add(this.label8);
+            this.grpValuesFromLookup.Controls.Add(this.cmbKeyProperty);
+            this.grpValuesFromLookup.Controls.Add(this.label7);
+            this.grpValuesFromLookup.Controls.Add(this.cmbFeatureClass);
+            this.grpValuesFromLookup.Controls.Add(this.label6);
+            this.grpValuesFromLookup.Controls.Add(this.txtFeatureSource);
+            this.grpValuesFromLookup.Controls.Add(this.label5);
+            this.grpValuesFromLookup.Name = "grpValuesFromLookup";
+            this.grpValuesFromLookup.TabStop = false;
+            // 
+            // btnUpdateThemeParameters
+            // 
+            resources.ApplyResources(this.btnUpdateThemeParameters, "btnUpdateThemeParameters");
+            this.btnUpdateThemeParameters.Name = "btnUpdateThemeParameters";
+            this.btnUpdateThemeParameters.UseVisualStyleBackColor = true;
+            this.btnUpdateThemeParameters.Click += new System.EventHandler(this.btnUpdateThemeParameters_Click);
+            // 
+            // btnBrowseFeatureSource
+            // 
+            resources.ApplyResources(this.btnBrowseFeatureSource, "btnBrowseFeatureSource");
+            this.btnBrowseFeatureSource.Name = "btnBrowseFeatureSource";
+            this.btnBrowseFeatureSource.UseVisualStyleBackColor = true;
+            this.btnBrowseFeatureSource.Click += new System.EventHandler(this.btnBrowseFeatureSource_Click);
+            // 
+            // cmbValueProperty
+            // 
+            resources.ApplyResources(this.cmbValueProperty, "cmbValueProperty");
+            this.cmbValueProperty.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbValueProperty.FormattingEnabled = true;
+            this.cmbValueProperty.Name = "cmbValueProperty";
+            // 
+            // label8
+            // 
+            resources.ApplyResources(this.label8, "label8");
+            this.label8.Name = "label8";
+            // 
+            // cmbKeyProperty
+            // 
+            resources.ApplyResources(this.cmbKeyProperty, "cmbKeyProperty");
+            this.cmbKeyProperty.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbKeyProperty.FormattingEnabled = true;
+            this.cmbKeyProperty.Name = "cmbKeyProperty";
+            // 
+            // label7
+            // 
+            resources.ApplyResources(this.label7, "label7");
+            this.label7.Name = "label7";
+            // 
+            // cmbFeatureClass
+            // 
+            resources.ApplyResources(this.cmbFeatureClass, "cmbFeatureClass");
+            this.cmbFeatureClass.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbFeatureClass.FormattingEnabled = true;
+            this.cmbFeatureClass.Name = "cmbFeatureClass";
+            this.cmbFeatureClass.SelectedIndexChanged += new System.EventHandler(this.cmbFeatureClass_SelectedIndexChanged);
+            // 
+            // label6
+            // 
+            resources.ApplyResources(this.label6, "label6");
+            this.label6.Name = "label6";
+            // 
+            // txtFeatureSource
+            // 
+            resources.ApplyResources(this.txtFeatureSource, "txtFeatureSource");
+            this.txtFeatureSource.Name = "txtFeatureSource";
+            this.txtFeatureSource.ReadOnly = true;
+            this.txtFeatureSource.TextChanged += new System.EventHandler(this.txtFeatureSource_TextChanged);
+            // 
+            // label5
+            // 
+            resources.ApplyResources(this.label5, "label5");
+            this.label5.Name = "label5";
+            // 
+            // grpValuesFromClass
+            // 
+            resources.ApplyResources(this.grpValuesFromClass, "grpValuesFromClass");
+            this.grpValuesFromClass.Controls.Add(this.GroupPanel);
+            this.grpValuesFromClass.Name = "grpValuesFromClass";
+            this.grpValuesFromClass.TabStop = false;
+            // 
+            // GroupPanel
+            // 
+            resources.ApplyResources(this.GroupPanel, "GroupPanel");
+            this.GroupPanel.Controls.Add(this.AggregateLabel);
+            this.GroupPanel.Controls.Add(this.AggregateCombo);
+            this.GroupPanel.Name = "GroupPanel";
+            // 
             // chkUseFirstRuleAsTemplate
             // 
             resources.ApplyResources(this.chkUseFirstRuleAsTemplate, "chkUseFirstRuleAsTemplate");
@@ -160,13 +286,6 @@
             this.chkUseFirstRuleAsTemplate.Name = "chkUseFirstRuleAsTemplate";
             this.chkUseFirstRuleAsTemplate.UseVisualStyleBackColor = true;
             // 
-            // GroupPanel
-            // 
-            this.GroupPanel.Controls.Add(this.AggregateLabel);
-            this.GroupPanel.Controls.Add(this.AggregateCombo);
-            resources.ApplyResources(this.GroupPanel, "GroupPanel");
-            this.GroupPanel.Name = "GroupPanel";
-            // 
             // RuleCountPanel
             // 
             resources.ApplyResources(this.RuleCountPanel, "RuleCountPanel");
@@ -306,6 +425,16 @@
             this.OKBtn.UseVisualStyleBackColor = true;
             this.OKBtn.Click += new System.EventHandler(this.OKBtn_Click);
             // 
+            // grpThemeGeneration
+            // 
+            resources.ApplyResources(this.grpThemeGeneration, "grpThemeGeneration");
+            this.grpThemeGeneration.Controls.Add(this.RuleCountPanel);
+            this.grpThemeGeneration.Controls.Add(this.OverwriteRules);
+            this.grpThemeGeneration.Controls.Add(this.AppendRules);
+            this.grpThemeGeneration.Controls.Add(this.chkUseFirstRuleAsTemplate);
+            this.grpThemeGeneration.Name = "grpThemeGeneration";
+            this.grpThemeGeneration.TabStop = false;
+            // 
             // colorComboBox1
             // 
             resources.ApplyResources(this.colorComboBox1, "colorComboBox1");
@@ -315,6 +444,8 @@
             // 
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
             resources.ApplyResources(this, "$this");
+            this.ControlBox = false;
+            this.Controls.Add(this.grpThemeGeneration);
             this.Controls.Add(this.ButtonPanel);
             this.Controls.Add(this.PreviewGroup);
             this.Controls.Add(this.DisplayGroup);
@@ -324,6 +455,9 @@
             ((System.ComponentModel.ISupportInitialize)(this.RuleCount)).EndInit();
             this.DataGroup.ResumeLayout(false);
             this.DataGroup.PerformLayout();
+            this.grpValuesFromLookup.ResumeLayout(false);
+            this.grpValuesFromLookup.PerformLayout();
+            this.grpValuesFromClass.ResumeLayout(false);
             this.GroupPanel.ResumeLayout(false);
             this.GroupPanel.PerformLayout();
             this.RuleCountPanel.ResumeLayout(false);
@@ -337,6 +471,8 @@
             this.PreviewGroup.ResumeLayout(false);
             ((System.ComponentModel.ISupportInitialize)(this.PreviewPicture)).EndInit();
             this.ButtonPanel.ResumeLayout(false);
+            this.grpThemeGeneration.ResumeLayout(false);
+            this.grpThemeGeneration.PerformLayout();
             this.ResumeLayout(false);
 
         }
@@ -374,5 +510,20 @@
         private System.Windows.Forms.LinkLabel ColorBrewerLabel;
         private System.Windows.Forms.CheckBox chkUseFirstRuleAsTemplate;
         private System.Windows.Forms.Button btnFlipColorBrewer;
+        private System.Windows.Forms.GroupBox grpValuesFromLookup;
+        private System.Windows.Forms.GroupBox grpValuesFromClass;
+        private System.Windows.Forms.Button btnBrowseFeatureSource;
+        private System.Windows.Forms.ComboBox cmbValueProperty;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.ComboBox cmbKeyProperty;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.ComboBox cmbFeatureClass;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.TextBox txtFeatureSource;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.RadioButton rdValuesFromLookup;
+        private System.Windows.Forms.RadioButton rdValuesFromClass;
+        private System.Windows.Forms.GroupBox grpThemeGeneration;
+        private System.Windows.Forms.Button btnUpdateThemeParameters;
     }
 }
\ No newline at end of file

Modified: trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.resx	2014-03-20 09:44:15 UTC (rev 7990)
+++ trunk/Tools/Maestro/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.resx	2014-03-21 12:06:43 UTC (rev 7991)
@@ -121,18 +121,22 @@
   <data name="label1.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="label1.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 16</value>
+    <value>17, 22</value>
   </data>
   <data name="label1.Size" type="System.Drawing.Size, System.Drawing">
-    <value>42, 13</value>
+    <value>46, 13</value>
   </data>
   <data name="label1.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
   </data>
   <data name="label1.Text" xml:space="preserve">
-    <value>Column</value>
+    <value>Property</value>
   </data>
   <data name=">>label1.Name" xml:space="preserve">
     <value>label1</value>
@@ -144,22 +148,25 @@
     <value>DataGroup</value>
   </data>
   <data name=">>label1.ZOrder" xml:space="preserve">
-    <value>6</value>
+    <value>3</value>
   </data>
   <data name="label2.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="label2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="label2.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
+    <value>3, 2</value>
   </data>
   <data name="label2.Size" type="System.Drawing.Size, System.Drawing">
-    <value>56, 13</value>
+    <value>60, 13</value>
   </data>
   <data name="label2.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
   </data>
   <data name="label2.Text" xml:space="preserve">
-    <value>Rulecount</value>
+    <value>Rule Count</value>
   </data>
   <data name=">>label2.Name" xml:space="preserve">
     <value>label2</value>
@@ -176,8 +183,11 @@
   <data name="AggregateLabel.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="AggregateLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="AggregateLabel.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
+    <value>0, 3</value>
   </data>
   <data name="AggregateLabel.Size" type="System.Drawing.Size, System.Drawing">
     <value>74, 13</value>
@@ -203,8 +213,11 @@
   <data name="OverwriteRules.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="OverwriteRules.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="OverwriteRules.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 88</value>
+    <value>10, 49</value>
   </data>
   <data name="OverwriteRules.Size" type="System.Drawing.Size, System.Drawing">
     <value>133, 17</value>
@@ -222,16 +235,19 @@
     <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>OverwriteRules.Parent" xml:space="preserve">
-    <value>DataGroup</value>
+    <value>grpThemeGeneration</value>
   </data>
   <data name=">>OverwriteRules.ZOrder" xml:space="preserve">
-    <value>5</value>
+    <value>1</value>
   </data>
   <data name="AppendRules.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="AppendRules.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="AppendRules.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 112</value>
+    <value>10, 73</value>
   </data>
   <data name="AppendRules.Size" type="System.Drawing.Size, System.Drawing">
     <value>87, 17</value>
@@ -249,20 +265,19 @@
     <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>AppendRules.Parent" xml:space="preserve">
-    <value>DataGroup</value>
+    <value>grpThemeGeneration</value>
   </data>
   <data name=">>AppendRules.ZOrder" xml:space="preserve">
-    <value>4</value>
+    <value>2</value>
   </data>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="ColumnCombo.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
   <data name="ColumnCombo.Location" type="System.Drawing.Point, System.Drawing">
-    <value>104, 16</value>
+    <value>111, 19</value>
   </data>
   <data name="ColumnCombo.Size" type="System.Drawing.Size, System.Drawing">
-    <value>208, 21</value>
+    <value>198, 21</value>
   </data>
   <data name="ColumnCombo.TabIndex" type="System.Int32, mscorlib">
     <value>6</value>
@@ -277,7 +292,7 @@
     <value>DataGroup</value>
   </data>
   <data name=">>ColumnCombo.ZOrder" xml:space="preserve">
-    <value>3</value>
+    <value>2</value>
   </data>
   <data name="RuleCount.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
@@ -286,7 +301,7 @@
     <value>96, 0</value>
   </data>
   <data name="RuleCount.Size" type="System.Drawing.Size, System.Drawing">
-    <value>208, 20</value>
+    <value>211, 20</value>
   </data>
   <data name="RuleCount.TabIndex" type="System.Int32, mscorlib">
     <value>7</value>
@@ -319,10 +334,10 @@
     <value>Individual</value>
   </data>
   <data name="AggregateCombo.Location" type="System.Drawing.Point, System.Drawing">
-    <value>96, 0</value>
+    <value>97, 0</value>
   </data>
   <data name="AggregateCombo.Size" type="System.Drawing.Size, System.Drawing">
-    <value>208, 21</value>
+    <value>198, 21</value>
   </data>
   <data name="AggregateCombo.TabIndex" type="System.Int32, mscorlib">
     <value>8</value>
@@ -342,38 +357,368 @@
   <data name="DataGroup.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
-  <data name="chkUseFirstRuleAsTemplate.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Bottom, Left, Right</value>
+  <data name="rdValuesFromLookup.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
   </data>
-  <data name="chkUseFirstRuleAsTemplate.Location" type="System.Drawing.Point, System.Drawing">
-    <value>147, 94</value>
+  <data name="rdValuesFromLookup.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
   </data>
-  <data name="chkUseFirstRuleAsTemplate.Size" type="System.Drawing.Size, System.Drawing">
-    <value>165, 36</value>
+  <data name="rdValuesFromLookup.Location" type="System.Drawing.Point, System.Drawing">
+    <value>17, 133</value>
   </data>
-  <data name="chkUseFirstRuleAsTemplate.TabIndex" type="System.Int32, mscorlib">
+  <data name="rdValuesFromLookup.Size" type="System.Drawing.Size, System.Drawing">
+    <value>244, 17</value>
+  </data>
+  <data name="rdValuesFromLookup.TabIndex" type="System.Int32, mscorlib">
+    <value>18</value>
+  </data>
+  <data name="rdValuesFromLookup.Text" xml:space="preserve">
+    <value>Theme based on values from an external class</value>
+  </data>
+  <data name=">>rdValuesFromLookup.Name" xml:space="preserve">
+    <value>rdValuesFromLookup</value>
+  </data>
+  <data name=">>rdValuesFromLookup.Type" xml:space="preserve">
+    <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>rdValuesFromLookup.Parent" xml:space="preserve">
+    <value>DataGroup</value>
+  </data>
+  <data name=">>rdValuesFromLookup.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="rdValuesFromClass.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="rdValuesFromClass.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="rdValuesFromClass.Location" type="System.Drawing.Point, System.Drawing">
+    <value>17, 61</value>
+  </data>
+  <data name="rdValuesFromClass.Size" type="System.Drawing.Size, System.Drawing">
+    <value>245, 17</value>
+  </data>
+  <data name="rdValuesFromClass.TabIndex" type="System.Int32, mscorlib">
     <value>11</value>
   </data>
-  <data name="chkUseFirstRuleAsTemplate.Text" xml:space="preserve">
-    <value>Use geometry and label style from current first rule</value>
+  <data name="rdValuesFromClass.Text" xml:space="preserve">
+    <value>Theme based on values/ranges from this class</value>
   </data>
-  <data name=">>chkUseFirstRuleAsTemplate.Name" xml:space="preserve">
-    <value>chkUseFirstRuleAsTemplate</value>
+  <data name=">>rdValuesFromClass.Name" xml:space="preserve">
+    <value>rdValuesFromClass</value>
   </data>
-  <data name=">>chkUseFirstRuleAsTemplate.Type" xml:space="preserve">
-    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name=">>rdValuesFromClass.Type" xml:space="preserve">
+    <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name=">>chkUseFirstRuleAsTemplate.Parent" xml:space="preserve">
+  <data name=">>rdValuesFromClass.Parent" xml:space="preserve">
     <value>DataGroup</value>
   </data>
-  <data name=">>chkUseFirstRuleAsTemplate.ZOrder" xml:space="preserve">
+  <data name=">>rdValuesFromClass.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="grpValuesFromLookup.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="btnUpdateThemeParameters.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="btnUpdateThemeParameters.Location" type="System.Drawing.Point, System.Drawing">
+    <value>246, 70</value>
+  </data>
+  <data name="btnUpdateThemeParameters.Size" type="System.Drawing.Size, System.Drawing">
+    <value>57, 48</value>
+  </data>
+  <data name="btnUpdateThemeParameters.TabIndex" type="System.Int32, mscorlib">
+    <value>18</value>
+  </data>
+  <data name="btnUpdateThemeParameters.Text" xml:space="preserve">
+    <value>Update</value>
+  </data>
+  <data name=">>btnUpdateThemeParameters.Name" xml:space="preserve">
+    <value>btnUpdateThemeParameters</value>
+  </data>
+  <data name=">>btnUpdateThemeParameters.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>btnUpdateThemeParameters.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>btnUpdateThemeParameters.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
+  <data name="btnBrowseFeatureSource.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="btnBrowseFeatureSource.Location" type="System.Drawing.Point, System.Drawing">
+    <value>271, 15</value>
+  </data>
+  <data name="btnBrowseFeatureSource.Size" type="System.Drawing.Size, System.Drawing">
+    <value>25, 23</value>
+  </data>
+  <data name="btnBrowseFeatureSource.TabIndex" type="System.Int32, mscorlib">
+    <value>17</value>
+  </data>
+  <data name="btnBrowseFeatureSource.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name=">>btnBrowseFeatureSource.Name" xml:space="preserve">
+    <value>btnBrowseFeatureSource</value>
+  </data>
+  <data name=">>btnBrowseFeatureSource.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>btnBrowseFeatureSource.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>btnBrowseFeatureSource.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="cmbValueProperty.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="cmbValueProperty.Location" type="System.Drawing.Point, System.Drawing">
+    <value>103, 97</value>
+  </data>
+  <data name="cmbValueProperty.Size" type="System.Drawing.Size, System.Drawing">
+    <value>137, 21</value>
+  </data>
+  <data name="cmbValueProperty.TabIndex" type="System.Int32, mscorlib">
+    <value>16</value>
+  </data>
+  <data name=">>cmbValueProperty.Name" xml:space="preserve">
+    <value>cmbValueProperty</value>
+  </data>
+  <data name=">>cmbValueProperty.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>cmbValueProperty.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>cmbValueProperty.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="label8.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label8.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="label8.Location" type="System.Drawing.Point, System.Drawing">
+    <value>7, 100</value>
+  </data>
+  <data name="label8.Size" type="System.Drawing.Size, System.Drawing">
+    <value>76, 13</value>
+  </data>
+  <data name="label8.TabIndex" type="System.Int32, mscorlib">
+    <value>15</value>
+  </data>
+  <data name="label8.Text" xml:space="preserve">
+    <value>Value Property</value>
+  </data>
+  <data name=">>label8.Name" xml:space="preserve">
+    <value>label8</value>
+  </data>
+  <data name=">>label8.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>label8.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>label8.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="cmbKeyProperty.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="cmbKeyProperty.Location" type="System.Drawing.Point, System.Drawing">
+    <value>103, 70</value>
+  </data>
+  <data name="cmbKeyProperty.Size" type="System.Drawing.Size, System.Drawing">
+    <value>137, 21</value>
+  </data>
+  <data name="cmbKeyProperty.TabIndex" type="System.Int32, mscorlib">
+    <value>14</value>
+  </data>
+  <data name=">>cmbKeyProperty.Name" xml:space="preserve">
+    <value>cmbKeyProperty</value>
+  </data>
+  <data name=">>cmbKeyProperty.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>cmbKeyProperty.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>cmbKeyProperty.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="label7.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label7.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="label7.Location" type="System.Drawing.Point, System.Drawing">
+    <value>7, 73</value>
+  </data>
+  <data name="label7.Size" type="System.Drawing.Size, System.Drawing">
+    <value>67, 13</value>
+  </data>
+  <data name="label7.TabIndex" type="System.Int32, mscorlib">
+    <value>13</value>
+  </data>
+  <data name="label7.Text" xml:space="preserve">
+    <value>Key Property</value>
+  </data>
+  <data name=">>label7.Name" xml:space="preserve">
+    <value>label7</value>
+  </data>
+  <data name=">>label7.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>label7.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>label7.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="cmbFeatureClass.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="cmbFeatureClass.Location" type="System.Drawing.Point, System.Drawing">
+    <value>103, 43</value>
+  </data>
+  <data name="cmbFeatureClass.Size" type="System.Drawing.Size, System.Drawing">
+    <value>200, 21</value>
+  </data>
+  <data name="cmbFeatureClass.TabIndex" type="System.Int32, mscorlib">
+    <value>12</value>
+  </data>
+  <data name=">>cmbFeatureClass.Name" xml:space="preserve">
+    <value>cmbFeatureClass</value>
+  </data>
+  <data name=">>cmbFeatureClass.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>cmbFeatureClass.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>cmbFeatureClass.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="label6.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label6.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="label6.Location" type="System.Drawing.Point, System.Drawing">
+    <value>7, 46</value>
+  </data>
+  <data name="label6.Size" type="System.Drawing.Size, System.Drawing">
+    <value>71, 13</value>
+  </data>
+  <data name="label6.TabIndex" type="System.Int32, mscorlib">
+    <value>11</value>
+  </data>
+  <data name="label6.Text" xml:space="preserve">
+    <value>Feature Class</value>
+  </data>
+  <data name=">>label6.Name" xml:space="preserve">
+    <value>label6</value>
+  </data>
+  <data name=">>label6.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>label6.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>label6.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="txtFeatureSource.Location" type="System.Drawing.Point, System.Drawing">
+    <value>103, 17</value>
+  </data>
+  <data name="txtFeatureSource.Size" type="System.Drawing.Size, System.Drawing">
+    <value>162, 20</value>
+  </data>
+  <data name="txtFeatureSource.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name=">>txtFeatureSource.Name" xml:space="preserve">
+    <value>txtFeatureSource</value>
+  </data>
+  <data name=">>txtFeatureSource.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>txtFeatureSource.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>txtFeatureSource.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="label5.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="label5.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="label5.Location" type="System.Drawing.Point, System.Drawing">
+    <value>7, 20</value>
+  </data>
+  <data name="label5.Size" type="System.Drawing.Size, System.Drawing">
+    <value>80, 13</value>
+  </data>
+  <data name="label5.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="label5.Text" xml:space="preserve">
+    <value>Feature Source</value>
+  </data>
+  <data name=">>label5.Name" xml:space="preserve">
+    <value>label5</value>
+  </data>
+  <data name=">>label5.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>label5.Parent" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>label5.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="grpValuesFromLookup.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 139</value>
+  </data>
+  <data name="grpValuesFromLookup.Size" type="System.Drawing.Size, System.Drawing">
+    <value>308, 124</value>
+  </data>
+  <data name="grpValuesFromLookup.TabIndex" type="System.Int32, mscorlib">
+    <value>13</value>
+  </data>
+  <data name=">>grpValuesFromLookup.Name" xml:space="preserve">
+    <value>grpValuesFromLookup</value>
+  </data>
+  <data name=">>grpValuesFromLookup.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>grpValuesFromLookup.Parent" xml:space="preserve">
+    <value>DataGroup</value>
+  </data>
+  <data name=">>grpValuesFromLookup.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="grpValuesFromClass.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="GroupPanel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
   <data name="GroupPanel.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 40</value>
+    <value>5, 19</value>
   </data>
   <data name="GroupPanel.Size" type="System.Drawing.Size, System.Drawing">
-    <value>304, 24</value>
+    <value>295, 24</value>
   </data>
   <data name="GroupPanel.TabIndex" type="System.Int32, mscorlib">
     <value>10</value>
@@ -385,40 +730,37 @@
     <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
   <data name=">>GroupPanel.Parent" xml:space="preserve">
-    <value>DataGroup</value>
+    <value>grpValuesFromClass</value>
   </data>
   <data name=">>GroupPanel.ZOrder" xml:space="preserve">
-    <value>1</value>
+    <value>0</value>
   </data>
-  <data name="RuleCountPanel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Left, Right</value>
+  <data name="grpValuesFromClass.Location" type="System.Drawing.Point, System.Drawing">
+    <value>9, 65</value>
   </data>
-  <data name="RuleCountPanel.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 64</value>
+  <data name="grpValuesFromClass.Size" type="System.Drawing.Size, System.Drawing">
+    <value>307, 52</value>
   </data>
-  <data name="RuleCountPanel.Size" type="System.Drawing.Size, System.Drawing">
-    <value>304, 24</value>
+  <data name="grpValuesFromClass.TabIndex" type="System.Int32, mscorlib">
+    <value>12</value>
   </data>
-  <data name="RuleCountPanel.TabIndex" type="System.Int32, mscorlib">
-    <value>9</value>
+  <data name=">>grpValuesFromClass.Name" xml:space="preserve">
+    <value>grpValuesFromClass</value>
   </data>
-  <data name=">>RuleCountPanel.Name" xml:space="preserve">
-    <value>RuleCountPanel</value>
+  <data name=">>grpValuesFromClass.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name=">>RuleCountPanel.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name=">>RuleCountPanel.Parent" xml:space="preserve">
+  <data name=">>grpValuesFromClass.Parent" xml:space="preserve">
     <value>DataGroup</value>
   </data>
-  <data name=">>RuleCountPanel.ZOrder" xml:space="preserve">
-    <value>2</value>
+  <data name=">>grpValuesFromClass.ZOrder" xml:space="preserve">
+    <value>5</value>
   </data>
   <data name="DataGroup.Location" type="System.Drawing.Point, System.Drawing">
     <value>8, 8</value>
   </data>
   <data name="DataGroup.Size" type="System.Drawing.Size, System.Drawing">
-    <value>320, 136</value>
+    <value>330, 271</value>
   </data>
   <data name="DataGroup.TabIndex" type="System.Int32, mscorlib">
     <value>9</value>
@@ -436,14 +778,71 @@
     <value>$this</value>
   </data>
   <data name=">>DataGroup.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="chkUseFirstRuleAsTemplate.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="chkUseFirstRuleAsTemplate.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="chkUseFirstRuleAsTemplate.Location" type="System.Drawing.Point, System.Drawing">
+    <value>158, 49</value>
+  </data>
+  <data name="chkUseFirstRuleAsTemplate.Size" type="System.Drawing.Size, System.Drawing">
+    <value>165, 48</value>
+  </data>
+  <data name="chkUseFirstRuleAsTemplate.TabIndex" type="System.Int32, mscorlib">
+    <value>11</value>
+  </data>
+  <data name="chkUseFirstRuleAsTemplate.Text" xml:space="preserve">
+    <value>Use geometry and label style from current first rule</value>
+  </data>
+  <data name=">>chkUseFirstRuleAsTemplate.Name" xml:space="preserve">
+    <value>chkUseFirstRuleAsTemplate</value>
+  </data>
+  <data name=">>chkUseFirstRuleAsTemplate.Type" xml:space="preserve">
+    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>chkUseFirstRuleAsTemplate.Parent" xml:space="preserve">
+    <value>grpThemeGeneration</value>
+  </data>
+  <data name=">>chkUseFirstRuleAsTemplate.ZOrder" xml:space="preserve">
     <value>3</value>
   </data>
+  <data name="RuleCountPanel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="RuleCountPanel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>10, 19</value>
+  </data>
+  <data name="RuleCountPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>307, 24</value>
+  </data>
+  <data name="RuleCountPanel.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name=">>RuleCountPanel.Name" xml:space="preserve">
+    <value>RuleCountPanel</value>
+  </data>
+  <data name=">>RuleCountPanel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>RuleCountPanel.Parent" xml:space="preserve">
+    <value>grpThemeGeneration</value>
+  </data>
+  <data name=">>RuleCountPanel.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
   <data name="DisplayGroup.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
   <data name="btnFlipColorBrewer.Enabled" type="System.Boolean, mscorlib">
     <value>False</value>
   </data>
+  <data name="btnFlipColorBrewer.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="btnFlipColorBrewer.Location" type="System.Drawing.Point, System.Drawing">
     <value>112, 78</value>
   </data>
@@ -471,6 +870,9 @@
   <data name="label3.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="label3.Location" type="System.Drawing.Point, System.Drawing">
     <value>90, 3</value>
   </data>
@@ -529,7 +931,7 @@
     <value>ColorBrewerColorSet</value>
   </data>
   <data name=">>ColorBrewerColorSet.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.CustomCombo, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
+    <value>Maestro.Editors.Common.CustomCombo, Maestro.Editors, Version=5.1.0.0, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
   <data name=">>ColorBrewerColorSet.Parent" xml:space="preserve">
     <value>ColorBrewerPanel</value>
@@ -561,6 +963,9 @@
   <data name="ColorBrewerLabel.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="ColorBrewerLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="ColorBrewerLabel.Location" type="System.Drawing.Point, System.Drawing">
     <value>33, 48</value>
   </data>
@@ -598,7 +1003,7 @@
     <value>GradientToColor</value>
   </data>
   <data name=">>GradientToColor.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.ColorComboBox, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
+    <value>Maestro.Editors.Common.ColorComboBox, Maestro.Editors, Version=5.1.0.0, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
   <data name=">>GradientToColor.Parent" xml:space="preserve">
     <value>panel2</value>
@@ -619,7 +1024,7 @@
     <value>GradientFromColor</value>
   </data>
   <data name=">>GradientFromColor.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.ColorComboBox, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
+    <value>Maestro.Editors.Common.ColorComboBox, Maestro.Editors, Version=5.1.0.0, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
   <data name=">>GradientFromColor.Parent" xml:space="preserve">
     <value>panel2</value>
@@ -630,6 +1035,9 @@
   <data name="label4.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="label4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="label4.Location" type="System.Drawing.Point, System.Drawing">
     <value>90, 4</value>
   </data>
@@ -678,6 +1086,9 @@
   <data name="ColorBrewerColors.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="ColorBrewerColors.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="ColorBrewerColors.Location" type="System.Drawing.Point, System.Drawing">
     <value>16, 48</value>
   </data>
@@ -702,6 +1113,9 @@
   <data name="GradientColors.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
+  <data name="GradientColors.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="GradientColors.Location" type="System.Drawing.Point, System.Drawing">
     <value>16, 24</value>
   </data>
@@ -727,10 +1141,10 @@
     <value>5</value>
   </data>
   <data name="DisplayGroup.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 152</value>
+    <value>8, 394</value>
   </data>
   <data name="DisplayGroup.Size" type="System.Drawing.Size, System.Drawing">
-    <value>320, 112</value>
+    <value>330, 112</value>
   </data>
   <data name="DisplayGroup.TabIndex" type="System.Int32, mscorlib">
     <value>10</value>
@@ -748,16 +1162,22 @@
     <value>$this</value>
   </data>
   <data name=">>DisplayGroup.ZOrder" xml:space="preserve">
-    <value>2</value>
+    <value>3</value>
   </data>
   <data name="PreviewGroup.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
+  <data name="PreviewPicture.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="PreviewPicture.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="PreviewPicture.Location" type="System.Drawing.Point, System.Drawing">
     <value>8, 16</value>
   </data>
   <data name="PreviewPicture.Size" type="System.Drawing.Size, System.Drawing">
-    <value>304, 24</value>
+    <value>309, 24</value>
   </data>
   <data name="PreviewPicture.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
@@ -775,10 +1195,10 @@
     <value>0</value>
   </data>
   <data name="PreviewGroup.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 272</value>
+    <value>8, 512</value>
   </data>
   <data name="PreviewGroup.Size" type="System.Drawing.Size, System.Drawing">
-    <value>320, 48</value>
+    <value>330, 48</value>
   </data>
   <data name="PreviewGroup.TabIndex" type="System.Int32, mscorlib">
     <value>11</value>
@@ -796,13 +1216,16 @@
     <value>$this</value>
   </data>
   <data name=">>PreviewGroup.ZOrder" xml:space="preserve">
-    <value>1</value>
+    <value>2</value>
   </data>
   <data name="CancelBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top</value>
   </data>
+  <data name="CancelBtn.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="CancelBtn.Location" type="System.Drawing.Point, System.Drawing">
-    <value>176, 7</value>
+    <value>181, 7</value>
   </data>
   <data name="CancelBtn.Size" type="System.Drawing.Size, System.Drawing">
     <value>75, 23</value>
@@ -828,8 +1251,11 @@
   <data name="OKBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top</value>
   </data>
+  <data name="OKBtn.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
   <data name="OKBtn.Location" type="System.Drawing.Point, System.Drawing">
-    <value>88, 8</value>
+    <value>93, 8</value>
   </data>
   <data name="OKBtn.Size" type="System.Drawing.Size, System.Drawing">
     <value>75, 23</value>
@@ -856,10 +1282,10 @@
     <value>Bottom</value>
   </data>
   <data name="ButtonPanel.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 327</value>
+    <value>0, 569</value>
   </data>
   <data name="ButtonPanel.Size" type="System.Drawing.Size, System.Drawing">
-    <value>333, 36</value>
+    <value>343, 36</value>
   </data>
   <data name="ButtonPanel.TabIndex" type="System.Int32, mscorlib">
     <value>12</value>
@@ -874,6 +1300,33 @@
     <value>$this</value>
   </data>
   <data name=">>ButtonPanel.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="grpThemeGeneration.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="grpThemeGeneration.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 285</value>
+  </data>
+  <data name="grpThemeGeneration.Size" type="System.Drawing.Size, System.Drawing">
+    <value>330, 103</value>
+  </data>
+  <data name="grpThemeGeneration.TabIndex" type="System.Int32, mscorlib">
+    <value>13</value>
+  </data>
+  <data name="grpThemeGeneration.Text" xml:space="preserve">
+    <value>Theme Generation</value>
+  </data>
+  <data name=">>grpThemeGeneration.Name" xml:space="preserve">
+    <value>grpThemeGeneration</value>
+  </data>
+  <data name=">>grpThemeGeneration.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name=">>grpThemeGeneration.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name=">>grpThemeGeneration.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
   <data name="colorComboBox1.Location" type="System.Drawing.Point, System.Drawing">
@@ -889,16 +1342,19 @@
     <value>colorComboBox1</value>
   </data>
   <data name=">>colorComboBox1.Type" xml:space="preserve">
-    <value>Maestro.Editors.Common.ColorComboBox, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
+    <value>Maestro.Editors.Common.ColorComboBox, Maestro.Editors, Version=5.1.0.0, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
   </data>
   <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
   <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
-    <value>333, 363</value>
+    <value>343, 605</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>Theme Creator</value>
+    <value>Create Theme</value>
   </data>
   <data name=">>$this.Name" xml:space="preserve">
     <value>ThemeCreator</value>

Modified: trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs	2014-03-20 09:44:15 UTC (rev 7990)
+++ trunk/Tools/Maestro/Maestro.Editors/Strings.Designer.cs	2014-03-21 12:06:43 UTC (rev 7991)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.18213
+//     Runtime Version:4.0.30319.18444
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -331,6 +331,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Computing Theme Parameters ....
+        /// </summary>
+        internal static string ComputingThemeParameters {
+            get {
+                return ResourceManager.GetString("ComputingThemeParameters", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Configuration Document has been reset.
         /// </summary>
         internal static string ConfigurationDocumentReset {
@@ -2540,6 +2549,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Property not selected. Please select the Property which connects to the selected Key Property in the external class.
+        /// </summary>
+        internal static string ThemePrimaryKeyPropertyNotSelected {
+            get {
+                return ResourceManager.GetString("ThemePrimaryKeyPropertyNotSelected", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Buffer Units.
         /// </summary>
         internal static string TitleBufferUnits {

Modified: trunk/Tools/Maestro/Maestro.Editors/Strings.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Strings.resx	2014-03-20 09:44:15 UTC (rev 7990)
+++ trunk/Tools/Maestro/Maestro.Editors/Strings.resx	2014-03-21 12:06:43 UTC (rev 7991)
@@ -1548,4 +1548,10 @@
   <data name="SelectedItemCount" xml:space="preserve">
     <value>{0} selected items</value>
   </data>
+  <data name="ComputingThemeParameters" xml:space="preserve">
+    <value>Computing Theme Parameters ...</value>
+  </data>
+  <data name="ThemePrimaryKeyPropertyNotSelected" xml:space="preserve">
+    <value>Property not selected. Please select the Property which connects to the selected Key Property in the external class</value>
+  </data>
 </root>
\ No newline at end of file



More information about the mapguide-commits mailing list