/// <summary>
 /// Initializes a new instance of the <see cref="StylePlugin" /> class.
 /// </summary>
 protected StylePlugin()
 {
     UseRandomColor       = true;
     styleCategories      = StyleCategories.Point | StyleCategories.Line | StyleCategories.Area | StyleCategories.Label;
     styleCandidates      = new ObservableCollection <Style>();
     styleCandidatesIndex = 0;
 }
        private CoreStyle GetDefaultStyle <CoreStyle>(StyleCategories styleProviderTypes) where CoreStyle : Styles.Style
        {
            var provider = GisEditor.StyleManager.GetDefaultStylePlugin(styleProviderTypes);

            if (provider != null)
            {
                var styleProviderOptionUI = provider.GetSettingsUI();

                if (styleProviderOptionUI != null)
                {
                    bool useRandomColors = GetUseRandomColorsOption <CoreStyle>(provider.UseRandomColor, styleProviderTypes);
                    if (useRandomColors)
                    {
                        return(null);
                    }
                }

                CoreStyle tmpStyle = provider.GetDefaultStyle() as CoreStyle;
                if (tmpStyle != null)
                {
                    return((CoreStyle)tmpStyle.CloneDeep());
                }
            }

            return(null);
        }
        public static StyleCategories GetStyleCategoriesByFeatureLayer(FeatureLayer featureLayer)
        {
            StyleCategories resultStyleCategories = StyleCategories.None;
            var             featureLayerPlugin    = GisEditor.LayerManager.GetLayerPlugins(featureLayer.GetType()).FirstOrDefault() as FeatureLayerPlugin;

            if (featureLayerPlugin != null)
            {
                var type = featureLayerPlugin.GetFeatureSimpleShapeType(featureLayer);
                switch (type)
                {
                case SimpleShapeType.Point:
                    resultStyleCategories = StyleCategories.Point | StyleCategories.Label | StyleCategories.Composite;
                    break;

                case SimpleShapeType.Line:
                    resultStyleCategories = StyleCategories.Line | StyleCategories.Label | StyleCategories.Composite;
                    break;

                case SimpleShapeType.Area:
                    resultStyleCategories = StyleCategories.Area | StyleCategories.Label | StyleCategories.Composite;
                    break;

                case SimpleShapeType.Unknown:
                default:
                    resultStyleCategories = StyleCategories.Point | StyleCategories.Line | StyleCategories.Area | StyleCategories.Label | StyleCategories.Composite;
                    break;
                }
            }

            return(resultStyleCategories);
        }
        private bool GetUseRandomColorsOption <CoreStyle>(bool useRandomColor, StyleCategories styleProviderTypes) where CoreStyle : Styles.Style
        {
            if (styleProviderTypes == StyleCategories.Area ||
                styleProviderTypes == StyleCategories.Line ||
                styleProviderTypes == StyleCategories.Point)
            {
                return(useRandomColor);
            }

            return(false);
        }
        /// <summary>
        /// Gets the default style plugin core.
        /// </summary>
        /// <param name="styleProviderTypes">The style provider types.</param>
        /// <returns></returns>
        protected virtual StylePlugin GetDefaultStylePluginCore(StyleCategories styleProviderTypes)
        {
            var allSupportedProviders = GetStylePlugins(styleProviderTypes);
            var styleProvider         = allSupportedProviders.FirstOrDefault(p => p.IsDefault);

            if (styleProvider == null)
            {
                styleProvider = allSupportedProviders.FirstOrDefault();
            }

            return(styleProvider);
        }
        /// <summary>
        /// Gets the style plugins core.
        /// </summary>
        /// <param name="styleCategories">The style categories.</param>
        /// <returns></returns>
        protected virtual Collection <StylePlugin> GetStylePluginsCore(StyleCategories styleCategories)
        {
            Collection <StylePlugin> stylePlugins = new Collection <StylePlugin>();
            var activeStylePlugins = GetActiveStylePlugins();

            foreach (var stylePlugin in activeStylePlugins.Where(p => styleCategories.HasFlag(p.StyleCategories)).OrderBy(p => p.Index))
            {
                stylePlugins.Add(stylePlugin);
            }

            return(stylePlugins);
        }
 private void InitializeAvailableStyleProviders(StyleCategories supportStyleType, bool reset = true)
 {
     if (reset)
     {
         availableStylePlugins.Clear();
     }
     GisEditor.StyleManager.GetStylePlugins(supportStyleType)
     .Where(tmpProvider => !tmpProvider.StyleCategories.ToString().Contains(','))
     .ForEach(tmpProvider =>
     {
         var defaultStyle = tmpProvider.GetDefaultStyle();
         availableStylePlugins.Add(tmpProvider, defaultStyle.CloneDeep());
     });
 }
        public static T GetDefaultStyle <T>(StyleCategories styleProviderTypes) where T : Style
        {
            var provider = GisEditor.StyleManager.GetDefaultStylePlugin(styleProviderTypes);

            if (provider != null)
            {
                T tmpStyle = provider.GetDefaultStyle() as T;
                if (tmpStyle != null)
                {
                    return((T)tmpStyle.CloneDeep());
                }
            }
            return(null);
        }
        private static StyleBuilderArguments GetDuplicateStyleArguments(StyleCategories styleCategories, StyleBuilderArguments styleArguments)
        {
            StyleBuilderArguments newStyleBuilderArguments = new StyleBuilderArguments
            {
                AppliedCallback          = styleArguments.AppliedCallback,
                AvailableStyleCategories = styleCategories | StyleCategories.Label | StyleCategories.Composite,
                AvailableUIElements      = styleArguments.AvailableUIElements,
                FeatureLayer             = styleArguments.FeatureLayer,
                FromZoomLevelIndex       = styleArguments.FromZoomLevelIndex,
                SelectedConcreteObject   = styleArguments.SelectedConcreteObject,
                StyleToEdit      = styleArguments.StyleToEdit,
                ToZoomLevelIndex = styleArguments.ToZoomLevelIndex
            };

            newStyleBuilderArguments.FillRequiredColumnNames();

            return(newStyleBuilderArguments);
        }
 /// <summary>
 /// Gets the default style plugin.
 /// </summary>
 /// <param name="styleProviderTypes">The style provider types.</param>
 /// <returns></returns>
 public StylePlugin GetDefaultStylePlugin(StyleCategories styleProviderTypes)
 {
     return(GetDefaultStylePluginCore(styleProviderTypes));
 }
 /// <summary>
 /// Gets the style plugins.
 /// </summary>
 /// <param name="styleCategories">The style categories.</param>
 /// <returns></returns>
 public Collection <StylePlugin> GetStylePlugins(StyleCategories styleCategories)
 {
     return(GetStylePluginsCore(styleCategories));
 }
        private static void AddSubMenuItemsForStyle(StyleBuilderArguments styleArguments, StyleCategories styleCategories
                                                    , string categoryName
                                                    , MenuItem rootMenuItem
                                                    , StyleItemViewModel currentStyleItemViewModel
                                                    , bool hasCompositedStyle)
        {
            if (hasCompositedStyle &&
                styleCategories != StyleCategories.None &&
                !styleCategories.HasFlag(StyleCategories.Label))
            {
                styleCategories = styleCategories | StyleCategories.Composite;
            }

            var plugins = GisEditor.StyleManager.GetStylePlugins(styleCategories);

            if (plugins.Count > 0)
            {
                var menuItems = plugins.Select(plugin =>
                {
                    if (plugin.RequireColumnNames && styleArguments.ColumnNames.Count == 0)
                    {
                        return(null);
                    }

                    MenuItem subMenuItem = new MenuItem();
                    subMenuItem.Header   = plugin.Name;
                    subMenuItem.Icon     = new Image {
                        Source = plugin.SmallIcon, Width = 16, Height = 16
                    };
                    subMenuItem.CommandParameter = new Tuple <StylePlugin, StyleCategories>(plugin, styleCategories);
                    subMenuItem.Command          = new RelayCommand <Tuple <StylePlugin, StyleCategories> >(commandParameter =>
                    {
                        StylePlugin tmpStylePlugin = commandParameter.Item1;
                        Styles.Style style         = tmpStylePlugin.GetDefaultStyle();
                        style.Name = tmpStylePlugin.Name;

                        StyleLayerListItem styleItem = GisEditor.StyleManager.GetStyleLayerListItem(style);
                        if (styleItem != null)
                        {
                            currentStyleItemViewModel.StyleItem.Children.Insert(0, styleItem);
                            currentStyleItemViewModel.StyleItem.UpdateConcreteObject();
                            var styleItemUI = currentStyleItemViewModel.StyleItem.GetUI(GetDuplicateStyleArguments(styleCategories, styleArguments));
                            if (styleItemUI != null)
                            {
                                currentStyleItemViewModel.StyleItem.UpdateUI(styleItemUI);
                            }

                            var addedStyleItemViewModel = currentStyleItemViewModel.StyleItemViewModels.FirstOrDefault(vm => vm.StyleItem == styleItem);
                            if (addedStyleItemViewModel != null)
                            {
                                if (commandParameter.Item2 == StyleCategories.Label)
                                {
                                    addedStyleItemViewModel.IsSelected = true;
                                }
                                else
                                {
                                    StyleItemViewModel rootStyleItemViewModel = GetRootViewModel(currentStyleItemViewModel);

                                    tmpStyleCategories    = commandParameter.Item2;
                                    var tmpStyleArguments = rootStyleItemViewModel.StyleBuilder.StyleArguments;
                                    rootStyleItemViewModel.StyleBuilder.PropertyChanged -= StyleBuilder_PropertyChanged;
                                    rootStyleItemViewModel.StyleBuilder.PropertyChanged += StyleBuilder_PropertyChanged;

                                    addedStyleItemViewModel.IsSelected = true;

                                    rootStyleItemViewModel.StyleBuilder.PropertyChanged -= StyleBuilder_PropertyChanged;
                                    rootStyleItemViewModel.StyleBuilder.StyleArguments   = tmpStyleArguments;
                                }
                            }
                        }
                    });
                    return(subMenuItem);
                }).Where(i => i != null).ToArray();

                foreach (var item in menuItems)
                {
                    rootMenuItem.Items.Add(item);
                }
            }
        }
        private void InitValueItem <T>(StyleCategories styleProviderType, DistinctColumnValue columnValueGroup, string columnName) where T : Style
        {
            Collection <Style> styles = new Collection <Style>();

            if (styleProviderType == StyleCategories.Composite)
            {
                Collection <StylePlugin> plugins = new Collection <StylePlugin>();
                var areaPlugin = GisEditor.StyleManager.GetDefaultStylePlugin(StyleCategories.Area);
                if (areaPlugin != null)
                {
                    plugins.Add(areaPlugin);
                }
                var linePlugin = GisEditor.StyleManager.GetDefaultStylePlugin(StyleCategories.Line);
                if (linePlugin != null)
                {
                    plugins.Add(linePlugin);
                }
                var pointPlugin = GisEditor.StyleManager.GetDefaultStylePlugin(StyleCategories.Point);
                if (pointPlugin != null)
                {
                    plugins.Add(pointPlugin);
                }
                foreach (var item in plugins)
                {
                    Style style = GetStyleByPlugin(item);
                    if (style != null)
                    {
                        styles.Add(style);
                    }
                }
            }
            else
            {
                var styleProvider = GisEditor.StyleManager.GetDefaultStylePlugin(styleProviderType);
                if (styleProvider != null)
                {
                    Style style = GetStyleByPlugin(styleProvider);
                    if (style != null)
                    {
                        styles.Add(style);
                    }
                }
            }

            if (styles.Count > 0)
            {
                ValueItem valueItem = new ValueItem();
                valueItem.Value = columnValueGroup.ColumnValue;
                styles.ForEach(s => valueItem.CustomStyles.Add(s));

                ValueItemEntity valueItemEntity = ValueItems.FirstOrDefault(tmpItem
                                                                            => tmpItem.MatchedValue.Equals(columnValueGroup.ColumnValue, StringComparison.Ordinal));

                if (valueItemEntity == null)
                {
                    valueItem       = new ValueItem();
                    valueItem.Value = columnValueGroup.ColumnValue;
                    styles.ForEach(s => valueItem.CustomStyles.Add(s));

                    var image = StyleHelper.GetImageFromStyle(styles);
                    var newValueItemEntity = GetValueItemEntity(image, columnValueGroup.ColumnValue, valueItem);
                    newValueItemEntity.Count = columnValueGroup.ColumnValueCount;
                    ValueItems.Add(newValueItemEntity);
                }
                else
                {
                    //valueItemEntity.Update(valueItem);
                    valueItemEntity.Count = columnValueGroup.ColumnValueCount;
                }
            }
        }