Esempio n. 1
0
 public SideSliderParameter(SideSliderEdgeLabelModel model, SliderParameterLocation location,
                            ILabelModelParameter parameter)
 {
     this.model     = model;
     this.location  = location;
     this.parameter = parameter;
 }
Esempio n. 2
0
        /// <summary>
        /// Builds the properties for the labels's <see cref="ILabelModel"/> type.
        /// </summary>
        protected virtual void BuildModelProperties(IPropertyBuildContext <ILabel> context)
        {
            ValueGetterDelegate <Type> labelModelGetter = new ValueGetterDelegate <Type>(
                delegate {
                var type = context.CurrentInstance.LayoutParameter.Model.GetType();
                while (!type.IsPublic)
                {
                    type = type.BaseType;
                }
                return(type);
            });
            ValueSetterDelegate <Type> labelModelSetter = new ValueSetterDelegate <Type>(
                delegate(Type value) {
                IGraph graph = context.Lookup(typeof(IGraph)) as IGraph;
                if (graph != null)
                {
                    ILabelModel model = Activator.CreateInstance(value) as ILabelModel;
                    if (model != null)
                    {
                        ILabelModelParameterFinder finder =
                            model.Lookup(typeof(ILabelModelParameterFinder)) as ILabelModelParameterFinder;
                        ILabelModelParameter parameter;
                        ILabel subject = context.CurrentInstance;
                        if (finder != null)
                        {
                            parameter = finder.FindBestParameter(subject, model, subject.GetLayout());
                        }
                        else
                        {
                            parameter = model.CreateDefaultParameter();
                        }
                        graph.SetLabelLayoutParameter(subject, parameter);
                    }
                }
            });
            ILabel currentLabel;

            currentLabel = context.CurrentInstance;
            if (currentLabel == null)
            {
                return;
            }
            if (currentLabel.Owner is IEdge)
            {
                context.AddEntry(EdgeLabelModelProperty,
                                 labelModelGetter,
                                 labelModelSetter, null);
            }

            if (currentLabel.Owner is INode)
            {
                context.AddEntry(NodeLabelModelProperty, labelModelGetter, labelModelSetter, null);
            }

            if (currentLabel.Owner is IPort)
            {
                context.AddEntry(PortLabelModelProperty, labelModelGetter, labelModelSetter, null);
            }
        }
Esempio n. 3
0
            /// <summary>
            /// Returns a set of possible wrapped <see cref="ILabelModelParameter"/> instances.
            /// </summary>
            public IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
            {
                var wrapperModel = model as RotatableNodeLabelModelDecorator;
                var parameters   = wrappedProvider.GetParameters(label, wrapperModel.Wrapped);
                var result       = new List <ILabelModelParameter>();

                foreach (var parameter in parameters)
                {
                    result.Add(wrapperModel.CreateWrappingParameter(parameter));
                }
                return(result);
            }
        ///<inheritdoc/>
        public IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
        {
            List <ILabelModelParameter>     parameters = new List <ILabelModelParameter>();
            RotatedSideSliderEdgeLabelModel rotatedModel;
            var rotatedSideSliderEdgeLabelModel = model as RotatedSideSliderEdgeLabelModel;

            if (rotatedSideSliderEdgeLabelModel != null)
            {
                rotatedModel = rotatedSideSliderEdgeLabelModel;
            }
            else
            {
                rotatedModel = this;
            }
            var rightModel = rotatedModel.rightModel;
            var leftModel  = rotatedModel.leftModel;

            if (rightModel != null)
            {
                var parameterProvider = (ILabelModelParameterProvider)rightModel.Lookup(typeof(ILabelModelParameterProvider));
                if (parameterProvider != null)
                {
                    var innerParameters = parameterProvider.GetParameters(label, rightModel);
                    foreach (var innerParameter in innerParameters)
                    {
                        parameters.Add(new RotatedSideSliderParameter(innerParameter, rotatedModel));
                    }
                }
            }
            if (leftModel != null)
            {
                var parameterProvider = (ILabelModelParameterProvider)leftModel.Lookup(typeof(ILabelModelParameterProvider));
                if (parameterProvider != null)
                {
                    var innerParameters = parameterProvider.GetParameters(label, leftModel);
                    foreach (var innerParameter in innerParameters)
                    {
                        parameters.Add(new RotatedSideSliderParameter(innerParameter, rotatedModel));
                    }
                }
            }
            return(parameters);
        }
Esempio n. 5
0
        /// <inheritdoc/>
        public IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
        {
            SideSliderEdgeLabelModel    mmodel = (SideSliderEdgeLabelModel)model;
            List <ILabelModelParameter> list   = new List <ILabelModelParameter>();

            foreach (
                SliderEdgeLabelModel.SliderParameter parameter in mmodel.leftSlider.GetParameters(label, mmodel.leftSlider))
            {
                list.Add(new SideSliderParameter(this,
                                                 SliderParameterLocation.Left |
                                                 (parameter.segmentIndex >= 0 ? SliderParameterLocation.FromSource : SliderParameterLocation.FromTarget),
                                                 parameter));
            }
            foreach (
                SliderEdgeLabelModel.SliderParameter parameter in mmodel.rightSlider.GetParameters(label, mmodel.rightSlider))
            {
                list.Add(new SideSliderParameter(this,
                                                 SliderParameterLocation.Right |
                                                 (parameter.segmentIndex >= 0 ? SliderParameterLocation.FromSource : SliderParameterLocation.FromTarget),
                                                 parameter));
            }
            return(list);
        }
Esempio n. 6
0
        public IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
        {
            var parameters = new List <ILabelModelParameter>();
            var node       = label.Owner as INode;

            if (node != null && node.Style is ChoreographyNodeStyle)
            {
                var nodeStyle = (ChoreographyNodeStyle)node.Style;
                for (var i = 0; i < nodeStyle.TopParticipants.Count; i++)
                {
                    parameters.Add(CreateParticipantParameter(true, i));
                }
                parameters.Add(TaskNameBand);
                for (var i = 0; i < nodeStyle.BottomParticipants.Count; i++)
                {
                    parameters.Add(CreateParticipantParameter(false, i));
                }
                parameters.Add(NorthMessage);
                parameters.Add(SouthMessage);
            }

            return(parameters);
        }
Esempio n. 7
0
            /// <summary>
            /// Finds the label model parameter that describes the given label layout best.
            /// </summary>
            /// <remarks>
            /// Sometimes the layout cannot be met exactly, then the nearest location is used.
            /// </remarks>
            public ILabelModelParameter FindBestParameter(ILabel label, ILabelModel model, IOrientedRectangle labelLayout)
            {
                var wrapperModel = model as RotatableNodeLabelModelDecorator;
                var styleWrapper = wrapperModel.GetNodeStyleWrapper(label);

                if (!wrapperModel.UseNodeRotation || styleWrapper == null || styleWrapper.Angle == 0)
                {
                    return
                        (wrapperModel.CreateWrappingParameter(wrappedFinder.FindBestParameter(label, wrapperModel.Wrapped,
                                                                                              labelLayout)));
                }

                var node          = label.Owner as INode;
                var rotatedCenter = styleWrapper.GetRotatedPoint(labelLayout.GetCenter(), node, false);
                var rotatedLayout = styleWrapper.GetRotatedLayout(node);

                var rectangle = new OrientedRectangle(labelLayout);

                rectangle.Angle -= rotatedLayout.GetRadians();
                rectangle.SetCenter(rotatedCenter);

                return
                    (wrapperModel.CreateWrappingParameter(wrappedFinder.FindBestParameter(label, wrapperModel.Wrapped, rectangle)));
            }
        /// <summary>
        /// Does the label placement using the generic labeling algorithm. Before this, the model and size of the labels is
        /// set according to the option handlers settings.
        /// </summary>
        private async Task DoLabelPlacement()
        {
            if (inLayout)
            {
                return;
            }
            inLayout = true;

            toolStrip.Enabled = false;

            //desired label model
            ILabelModel labelModel = LabelModels[labelModelComboBox.SelectedItem.ToString()];
            //desired label size
            int size = Convert.ToInt32(sizeNumericUpDown.NumericUpDownControl.Text);

            foreach (var label in graphControl.Graph.Labels)
            {
                if (label.Owner is INode)
                {
                    // only update the label model parameter if the label model changed
                    if (labelModel != graphControl.Graph.NodeDefaults.Labels.LayoutParameter.Model)
                    {
                        graphControl.Graph.SetLabelLayoutParameter(label, labelModel.CreateDefaultParameter());
                    }
                    var cityLabelStyle = label.Style as CityLabelStyle;
                    if (cityLabelStyle != null && cityLabelStyle.InnerLabelStyle is DefaultLabelStyle)
                    {
                        var font = ((DefaultLabelStyle)cityLabelStyle.InnerLabelStyle).Font;
                        ((DefaultLabelStyle)cityLabelStyle.InnerLabelStyle).Font = new Font(font.FontFamily, size);
                    }
                    graphControl.Graph.AdjustLabelPreferredSize(label);
                }
            }
            {
                // set as default label model parameter
                graphControl.Graph.NodeDefaults.Labels.LayoutParameter = labelModel.CreateDefaultParameter();
                var cityLabelStyle = graphControl.Graph.NodeDefaults.Labels.Style as CityLabelStyle;
                if (cityLabelStyle != null && cityLabelStyle.InnerLabelStyle is DefaultLabelStyle)
                {
                    var font = ((DefaultLabelStyle)cityLabelStyle.InnerLabelStyle).Font;
                    ((DefaultLabelStyle)cityLabelStyle.InnerLabelStyle).Font = new Font(font.FontFamily, size);
                }
            }
            graphControl.Invalidate();

            // configure and run the layout algorithm
            var labelingAlgorithm = new GenericLabeling
            {
                MaximumDuration      = 0,
                OptimizationStrategy = OptimizationStrategy.Balanced,
                PlaceEdgeLabels      = false,
                PlaceNodeLabels      = true,
                ReduceLabelOverlaps  = true,
                ProfitModel          = new ExtendedLabelCandidateProfitModel(),
            };

            var layoutExecutor = new LayoutExecutor(graphControl, graphControl.Graph, labelingAlgorithm)
            {
                Duration          = TimeSpan.FromMilliseconds(500),
                EasedAnimation    = true,
                AnimateViewport   = false,
                UpdateContentRect = true
            };

            await layoutExecutor.Start();

            toolStrip.Enabled = true;
            inLayout          = false;
        }
Esempio n. 9
0
 /// <summary>
 /// Retrieves the <see cref="IOptionBuilder"/> to use for the label model of the provided label.
 /// </summary>
 /// <remarks>
 /// This implementation simply delegates to <see cref="IOptionBuilderContext.GetOptionBuilder(object)"/>.
 /// </remarks>
 /// <param name="context">The context to use.</param>
 /// <param name="model">The current model instance.</param>
 /// <returns>The builder or <see langword="null"/>.</returns>
 protected virtual IOptionBuilder GetLabelModelOptionBuilder(IOptionBuilderContext context, ILabelModel model)
 {
     return(context.GetOptionBuilder(model));
 }
        /// <summary>
        /// Does the label placement using the generic labeling algorithm. Before this, the model and size of the labels is
        /// set according to the option handlers settings.
        /// </summary>
        private async Task DoLabelPlacement()
        {
            if (inLayout)
            {
                return;
            }
            inLayout = true;

            toolBar.IsEnabled       = false;
            editorControl.IsEnabled = false;


            //desired label model
            ILabelModel labelModel = LabelModels[(string)handler[LABEL_MODEL].Value];
            int         size       = (int)handler[LABEL_SIZE].Value;

            foreach (var label in graphControl.Graph.Labels)
            {
                if (label.Owner is INode)
                {
                    // only update the label model parameter if the label model changed
                    if (labelModel != graphControl.Graph.NodeDefaults.Labels.LayoutParameter.Model)
                    {
                        graphControl.Graph.SetLabelLayoutParameter(label, labelModel.CreateDefaultParameter());
                    }
                    var cityLabelStyle = label.Style as CityLabelStyle;
                    if (cityLabelStyle != null && cityLabelStyle.InnerLabelStyle is DefaultLabelStyle)
                    {
                        ((DefaultLabelStyle)cityLabelStyle.InnerLabelStyle).TextSize = size;
                    }
                    graphControl.Graph.AdjustLabelPreferredSize(label);
                }
            }
            {
                // set as default label model parameter
                graphControl.Graph.NodeDefaults.Labels.LayoutParameter = labelModel.CreateDefaultParameter();
                var cityLabelStyle = graphControl.Graph.NodeDefaults.Labels.Style as CityLabelStyle;
                if (cityLabelStyle != null && cityLabelStyle.InnerLabelStyle is DefaultLabelStyle)
                {
                    ((DefaultLabelStyle)cityLabelStyle.InnerLabelStyle).TextSize = size;
                }
            }
            graphControl.Invalidate();

            // configure and run the layout algorithm
            var labelingAlgorithm = new GenericLabeling
            {
                MaximumDuration      = 0,
                OptimizationStrategy = OptimizationStrategy.Balanced,
                PlaceEdgeLabels      = false,
                PlaceNodeLabels      = true,
                ReduceLabelOverlaps  = true,
                ProfitModel          = new ExtendedLabelCandidateProfitModel(),
            };

            var layoutExecutor = new LayoutExecutor(graphControl, graphControl.Graph, labelingAlgorithm)
            {
                Duration          = TimeSpan.FromMilliseconds(500),
                EasedAnimation    = true,
                AnimateViewport   = false,
                UpdateContentRect = true
            };

            await layoutExecutor.Start();

            toolBar.IsEnabled       = true;
            editorControl.IsEnabled = true;
            inLayout = false;
        }
Esempio n. 11
0
 /// <summary>
 /// Creates a new instance for the passed model.
 /// </summary>
 /// <param name="wrapped">The label model to wrap.</param>
 public RotatableNodeLabelModelDecorator(ILabelModel wrapped)
 {
     this.Wrapped    = wrapped;
     UseNodeRotation = true;
 }
Esempio n. 12
0
 /// <summary>
 /// Retrieves the builder for the given label model.
 /// </summary>
 protected virtual IPropertyMapBuilder GetLabelModelPropertyMapBuilder(IPropertyBuildContext <ILabel> context, ILabelModel model)
 {
     return(context.GetPropertyMapBuilder(model));
 }
Esempio n. 13
0
 /// <summary>
 /// Creates a new instance wrapping the given parameter.
 /// </summary>
 public RotatableNodeLabelModelDecoratorParameter(ILabelModelParameter wrapped, ILabelModel model)
 {
     Wrapped = wrapped;
     Model   = model;
 }
        ILabelModelParameter ILabelModelParameterFinder.FindBestParameter(ILabel label, ILabelModel model,
                                                                          IOrientedRectangle labelLayout)
        {
            var    leftParam    = ((ILabelModelParameterFinder)leftModel).FindBestParameter(label, leftModel, labelLayout);
            var    rightParam   = ((ILabelModelParameterFinder)rightModel).FindBestParameter(label, rightModel, labelLayout);
            var    leftGeom     = ((ILabelModel)leftModel).GetGeometry(label, leftParam);
            var    rightGeom    = ((ILabelModel)rightModel).GetGeometry(label, rightParam);
            var    layoutCenter = labelLayout.GetCenter();
            double leftDist     = leftGeom.GetCenter().DistanceTo(layoutCenter);
            double rightDist    = rightGeom.GetCenter().DistanceTo(layoutCenter);

            return(leftDist < rightDist
        ? new RotatedSideSliderParameter(leftParam, this)
        : new RotatedSideSliderParameter(rightParam, this));
        }
Esempio n. 15
0
        /// <summary>
        /// Returns possible parameters for the given label and model.
        /// </summary>
        /// <param name="label">The label for which to retrieve the parameters</param>
        /// <param name="model"> must be <c>this</c> or at least of this type.</param>
        public virtual IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
        {
            RotatingEdgeLabelModel      rotatingEdgeLabelModel = (RotatingEdgeLabelModel)model;
            List <ILabelModelParameter> candidates             = new List <ILabelModelParameter>();

            for (int i = 0; i <= 10; i++)
            {
                candidates.Add(new RatioParameter(rotatingEdgeLabelModel, i * 0.1));
            }
            return(candidates);
        }
        /// <summary>
        /// Tries to find a parameter that best matches the given layout for the
        /// provided label instance.
        /// </summary>
        /// <remarks>By default, this method is only called when <b>no discrete</b> candidates are specified (i.e. here for <see cref="CandidateCount"/> = 0.
        /// This implementation just calculates the rotation angle for the center of <paramref name="labelLayout"/>
        /// and creates a parameter for exactly this angle which <see cref="CreateParameter"/>.</remarks>
        ILabelModelParameter ILabelModelParameterFinder.FindBestParameter(ILabel label, ILabelModel model, IOrientedRectangle labelLayout)
        {
            var labelModel = model as MyNodeLabelModel;
            var node       = label.Owner as INode;

            if (labelModel != null && node != null)
            {
                var    direction = (labelLayout.GetCenter() - node.Layout.GetCenter()).Normalized;
                double ratio     = Math.Atan2(direction.Y, -direction.X) / (Math.PI * 2.0d);
                return(labelModel.CreateParameter(ratio));
            }
            else
            {
                return(DefaultLabelModelParameterFinder.Instance.FindBestParameter(label, model, labelLayout));
            }
        }
        /// <summary>
        /// Returns an enumerator over a set of possible <see cref="ILabelModelParameter"/>
        /// instances that can be used for the given label and model.
        /// </summary>
        /// <remarks>Since in <see cref="Lookup"/>, we return an instance of this class only for positive <see cref="CandidateCount"/>s,
        /// this method is only called for <b>discrete</b> candidates.</remarks>
        IEnumerable <ILabelModelParameter> ILabelModelParameterProvider.GetParameters(ILabel label, ILabelModel model)
        {
            var parameters = new ILabelModelParameter[candidateCount];

            for (int i = 0; i < parameters.Length; i++)
            {
                parameters[i] = new MyNodeLabelModelParameter(this, (double)i / (parameters.Length));
            }
            return(parameters);
        }
Esempio n. 18
0
        ///<inheritdoc/>
        public virtual IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
        {
            SliderEdgeLabelModel        sliderEdgeLabelModel = (SliderEdgeLabelModel)model;
            List <ILabelModelParameter> result = new List <ILabelModelParameter>();
            IEdge         edge     = (IEdge)label.Owner;
            IPathGeometry geometry = GetPathGeometry(edge);

            if (geometry != null)
            {
                int count = geometry.GetSegmentCount();
                for (int i = 0; i < count; i++)
                {
                    result.Add(sliderEdgeLabelModel.CreateParameterFromSource(i, 0));
                    result.Add(sliderEdgeLabelModel.CreateParameterFromSource(i, 0.5));
                    result.Add(sliderEdgeLabelModel.CreateParameterFromSource(i, 1));
                }
            }
            return(result);
        }
Esempio n. 19
0
 private static void SetPreferredSide(PreferredPlacementDescriptor newDescriptor,
                                      PreferredPlacementDescriptor oldDescriptor, ILabelModel model)
 {
     if (model is EdgeSegmentLabelModel)
     {
         var rotatedModel = model as EdgeSegmentLabelModel;
         var onEdge       = (rotatedModel.SideOfEdge & EdgeSides.OnEdge) == EdgeSides.OnEdge;
         newDescriptor.SideOfEdge     = onEdge ? LabelPlacements.OnEdge : LabelPlacements.RightOfEdge | LabelPlacements.LeftOfEdge;
         newDescriptor.DistanceToEdge = rotatedModel.Distance;
     }
 }
 public IEnumerable <ILabelModelParameter> GetParameters(ILabel label, ILabelModel model)
 {
     return(parameters);
 }