private void SetDefaultColumnValue(AnnotaionStyleType annotationStyleType = AnnotaionStyleType.LayerStyle)
        {
            var lastFeature = TrackShapeLayer.InternalFeatures.LastOrDefault();

            switch (annotationStyleType)
            {
            case AnnotaionStyleType.LayerStyle:
                if (lastFeature != null && !lastFeature.ColumnValues.ContainsKey(valueStyleMatchColumnName))
                {
                    WellKnownType wktype             = lastFeature.GetWellKnownType();
                    var           availableValueItem = layerStyle.ValueItems.Last(tmpValueItem =>
                    {
                        switch (wktype)
                        {
                        case WellKnownType.Point:
                        case WellKnownType.Multipoint:
                            return(tmpValueItem.DefaultPointStyle != null);

                        case WellKnownType.Polygon:
                        case WellKnownType.Multipolygon:
                            return(tmpValueItem.DefaultAreaStyle != null);

                        case WellKnownType.Line:
                        case WellKnownType.Multiline:
                            return(tmpValueItem.DefaultLineStyle != null);

                        default: return(false);
                        }
                    });

                    lastFeature.ColumnValues.Add(valueStyleMatchColumnName, availableValueItem.Value);
                }
                break;

            case AnnotaionStyleType.FileLinkStyle:
                if (lastFeature != null && lastFeature.GetShape() is PointShape && lastFeature.ColumnValues.ContainsKey(LinkFileStyleColumnName) && !string.IsNullOrEmpty(lastFeature.ColumnValues[LinkFileStyleColumnName]))
                {
                    var availableValueItem = fileLinkStyle.ValueItems.LastOrDefault();

                    if (!lastFeature.ColumnValues[LinkFileStyleColumnName].Contains("||"))
                    {
                        string value = availableValueItem.Value + "||" + lastFeature.ColumnValues[LinkFileStyleColumnName];
                        lastFeature.ColumnValues[LinkFileStyleColumnName] = value;
                    }
                }
                break;
            }
        }
        private void ApplyNewStyle <T>(string propertyName, T newStyle, AnnotaionStyleType annotationStyleType = AnnotaionStyleType.LayerStyle) where T : Styles.Style
        {
            ValueItem valueItem = layerStyle.ValueItems.LastOrDefault().CloneDeep();

            if (annotationStyleType == AnnotaionStyleType.FileLinkStyle)
            {
                valueItem     = fileLinkStyle.ValueItems.LastOrDefault().CloneDeep();
                newStyle.Name = "FileLinkStyle";
            }
            valueItem.Value = RandomString();
            valueItem.GetType().GetProperty(propertyName).GetSetMethod().Invoke(valueItem, new object[] { newStyle });
            TextStyle textStyle = newStyle as TextStyle;

            if (textStyle != null)
            {
                switch (annotationStyleType)
                {
                case AnnotaionStyleType.LayerStyle:
                default:
                    valueItem.DefaultTextStyle.PointPlacement = PointPlacement.LowerRight;
                    break;

                case AnnotaionStyleType.FileLinkStyle:
                    valueItem.DefaultTextStyle.PointPlacement = PointPlacement.LowerCenter;
                    break;
                }
            }

            switch (annotationStyleType)
            {
            case AnnotaionStyleType.FileLinkStyle:
                fileLinkStyle.ValueItems.Add(valueItem);
                break;

            case AnnotaionStyleType.LayerStyle:
            default:
                layerStyle.ValueItems.Add(valueItem);
                break;
            }
        }
        //public T GetLatestStyle<T>(bool returnRealStyle = true) where T : Style
        //{
        //    return GetLatestStyle<T>(String.Empty, returnRealStyle);
        //}

        public T GetLatestStyle <T>(AnnotaionStyleType annotaionStyleType, bool returnRealStyle = true) where T : Styles.Style
        {
            ValueItem lastValueItem = null;

            switch (annotaionStyleType)
            {
            case AnnotaionStyleType.LayerStyle:
                lastValueItem = layerStyle.ValueItems.LastOrDefault();
                break;

            case AnnotaionStyleType.FileLinkStyle:
                lastValueItem = fileLinkStyle.ValueItems.LastOrDefault();
                break;
            }

            if (lastValueItem != null)
            {
                var styles = new Collection <Styles.Style>();

                if (returnRealStyle)
                {
                    styles.Add(lastValueItem.DefaultAreaStyle.CustomAreaStyles.Count > 0 ? lastValueItem.DefaultAreaStyle.CustomAreaStyles[0] : lastValueItem.DefaultAreaStyle);
                    styles.Add(lastValueItem.DefaultLineStyle.CustomLineStyles.Count > 0 ? lastValueItem.DefaultLineStyle.CustomLineStyles[0] : lastValueItem.DefaultLineStyle);
                    styles.Add(lastValueItem.DefaultPointStyle.CustomPointStyles.Count > 0 ? lastValueItem.DefaultPointStyle.CustomPointStyles[0] : lastValueItem.DefaultPointStyle);
                    styles.Add(lastValueItem.DefaultTextStyle.CustomTextStyles.Count > 0 ? lastValueItem.DefaultTextStyle.CustomTextStyles[0] : lastValueItem.DefaultTextStyle);
                }
                else
                {
                    styles.Add(lastValueItem.DefaultAreaStyle);
                    styles.Add(lastValueItem.DefaultLineStyle);
                    styles.Add(lastValueItem.DefaultPointStyle);
                    styles.Add(lastValueItem.DefaultTextStyle);
                }

                return(styles.OfType <T>().FirstOrDefault());
            }
            return(null);
        }
        public void ChangeAppliedStyle(Styles.Style style, AnnotaionStyleType annotationStyleType)
        {
            AreaStyle  areaStyle  = style as AreaStyle;
            LineStyle  lineStyle  = style as LineStyle;
            TextStyle  textStyle  = style as TextStyle;
            PointStyle pointStyle = style as PointStyle;

            if (areaStyle != null)
            {
                ApplyNewStyle(defaultStyleKeys[2], areaStyle);
            }
            else if (lineStyle != null)
            {
                ApplyNewStyle(defaultStyleKeys[1], lineStyle);
            }
            else if (textStyle != null)
            {
                ApplyNewStyle(defaultStyleKeys[3], textStyle, annotationStyleType);
            }
            else if (pointStyle != null)
            {
                ApplyNewStyle(defaultStyleKeys[0], pointStyle, annotationStyleType);
            }
        }
        internal static void EditAnnotationStyle <T>(AnnotaionStyleType annotationStyleType) where T : Style
        {
            AreaStyle areaStyle = (AreaStyle)(ViewModel.CurrentAnnotationOverlay.GetLatestStyle <AreaStyle>(AnnotaionStyleType.LayerStyle, false)).CloneDeep();

            areaStyle.Name = "Annotation Area Style";
            LineStyle lineStyle = (LineStyle)(ViewModel.CurrentAnnotationOverlay.GetLatestStyle <LineStyle>(AnnotaionStyleType.LayerStyle, false)).CloneDeep();

            lineStyle.Name = "Annotation Line Style";
            PointStyle pointStyle = (PointStyle)(ViewModel.CurrentAnnotationOverlay.GetLatestStyle <PointStyle>(AnnotaionStyleType.LayerStyle, false)).CloneDeep();

            pointStyle.Name = "Annotation Point Style";
            TextStyle textStyle = (TextStyle)(ViewModel.CurrentAnnotationOverlay.GetLatestStyle <TextStyle>(AnnotaionStyleType.LayerStyle, false)).CloneDeep();

            textStyle.Name = "Annotation Text Style";
            PointStyle fileLinkPointStyle = (PointStyle)(ViewModel.CurrentAnnotationOverlay.GetLatestStyle <PointStyle>(AnnotaionStyleType.FileLinkStyle, false)).CloneDeep();

            fileLinkPointStyle.Name = "File Link Point Style";
            TextStyle fileLinkTextStyle = (TextStyle)(ViewModel.CurrentAnnotationOverlay.GetLatestStyle <TextStyle>(AnnotaionStyleType.FileLinkStyle, false)).CloneDeep();

            fileLinkTextStyle.Name = "File Link Text Style";

            CompositeStyle compositeStyle = new CompositeStyle();

            compositeStyle.Styles.Add(areaStyle);
            compositeStyle.Styles.Add(lineStyle);
            compositeStyle.Styles.Add(pointStyle);
            compositeStyle.Styles.Add(textStyle);
            compositeStyle.Styles.Add(fileLinkPointStyle);
            compositeStyle.Styles.Add(fileLinkTextStyle);

            StyleBuilderArguments styleArguments = new StyleBuilderArguments();

            styleArguments.IsSubStyleReadonly       = true;
            styleArguments.AvailableUIElements      = StyleBuilderUIElements.StyleList;
            styleArguments.AvailableStyleCategories = StyleCategories.Area | StyleCategories.Line | StyleCategories.Point;
            styleArguments.StyleToEdit     = compositeStyle;
            styleArguments.FeatureLayer    = ViewModel.CurrentAnnotationOverlay.TrackShapeLayer;
            styleArguments.AppliedCallback = (result) =>
            {
                var AnnotationStyle = result.CompositeStyle;
                ViewModel.AnnotationPreview = AnnotationStyle.GetPreviewImage(32, 32);
            };

            var resultStyle = GisEditor.StyleManager.EditStyle(styleArguments);

            if (resultStyle != null && resultStyle.CompositeStyle != null)
            {
                var annotationStyle = resultStyle.CompositeStyle;
                foreach (var item in annotationStyle.Styles)
                {
                    if (item.Name == "Annotation Area Style" ||
                        item.Name == "Annotation Line Style" ||
                        item.Name == "Annotation Point Style" ||
                        item.Name == "Annotation Text Style")
                    {
                        ViewModel.CurrentAnnotationOverlay.ChangeAppliedStyle(item, AnnotaionStyleType.LayerStyle);
                    }
                    else if (item.Name == "File Link Point Style" || item.Name == "File Link Text Style")
                    {
                        ViewModel.CurrentAnnotationOverlay.ChangeAppliedStyle(item, AnnotaionStyleType.FileLinkStyle);
                    }
                }
                ViewModel.AnnotationPreview = annotationStyle.GetPreviewImage(32, 32);
            }
        }