static NodeLabelingWindow()
        {
            LabelModels.Add(LABEL_MODEL_INTERIOR, new InteriorLabelModel());
            LabelModels.Add(LABEL_MODEL_EXTERIOR, new ExteriorLabelModel()
            {
                Insets = new InsetsD(10)
            });
            LabelModels.Add(LABEL_MODEL_FREENODE, new FreeNodeLabelModel());
            LabelModels.Add(LABEL_MODEL_SANDWICH, new SandwichLabelModel()
            {
                YOffset = 10
            });

            IList <ILabelModelParameter> list = new List <ILabelModelParameter>();
            var model = new ExteriorLabelModel()
            {
                Insets = new InsetsD(5)
            };

            list.Add(model.CreateParameter(ExteriorLabelModel.Position.North));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.South));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.East));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.West));
            model = new ExteriorLabelModel()
            {
                Insets = new InsetsD(10)
            };
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.North));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.South));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.East));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.West));
            model = new ExteriorLabelModel()
            {
                Insets = new InsetsD(15)
            };
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.North));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.South));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.East));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.West));


            var genericLabelModel = new GenericLabelModel(list[0]);

            foreach (var labelModelParameter in list)
            {
                // set different profits for various insets
                var    insets = ((ExteriorLabelModel)labelModelParameter.Model).Insets.Top;
                double profit = insets < 10 ? 1.0 : insets < 15 ? 0.9 : 0.8;
                genericLabelModel.AddParameter(labelModelParameter, new LabelCandidateDescriptor {
                    Profit = profit
                });
            }
            LabelModels.Add(LABEL_MODEL_THREE_DISTANCE, genericLabelModel);
        }
        /// <summary>
        /// Creates a sample graph and introduces all important graph elements present in
        /// yFiles WPF. Additionally, this method now overrides the label placement for some specific labels.
        /// </summary>
        private void PopulateGraph()
        {
            #region Sample Graph creation

            //////////// Sample node creation ///////////////////

            // Creates two nodes with the default node size
            // The location is specified for the _center_
            INode node1 = Graph.CreateNode(new PointD(50, 50));
            INode node2 = Graph.CreateNode(new PointD(150, 50));
            // Creates a third node with a different size of 80x40
            // In this case, the location of (360,380) describes the _upper left_
            // corner of the node bounds
            INode node3 = Graph.CreateNode(new RectD(360, 380, 80, 40));

            /////////////////////////////////////////////////////

            //////////// Sample edge creation ///////////////////

            // Creates some edges between the nodes
            IEdge edge1 = Graph.CreateEdge(node1, node2);
            IEdge edge2 = Graph.CreateEdge(node2, node3);

            /////////////////////////////////////////////////////

            //////////// Using Bends ////////////////////////////

            // Creates the first bend for edge2 at (400, 50)
            IBend bend1 = Graph.AddBend(edge2, new PointD(400, 50));

            /////////////////////////////////////////////////////

            //////////// Using Ports ////////////////////////////

            // Actually, edges connect "ports", not nodes directly.
            // If necessary, you can manually create ports at nodes
            // and let the edges connect to these.
            // Creates a port in the center of the node layout
            IPort port1AtNode1 = Graph.AddPort(node1, FreeNodePortLocationModel.NodeCenterAnchored);

            // Creates a port at the middle of the left border
            // Note to use absolute locations when placing ports using PointD.
            IPort port1AtNode3 = Graph.AddPort(node3, new PointD(node3.Layout.X, node3.Layout.GetCenter().Y));

            // Creates an edge that connects these specific ports
            IEdge edgeAtPorts = Graph.CreateEdge(port1AtNode1, port1AtNode3);

            /////////////////////////////////////////////////////

            //////////// Sample label creation ///////////////////

            // Adds labels to several graph elements
            Graph.AddLabel(node1, "N 1");
            Graph.AddLabel(node2, "N 2");
            var node3Label = Graph.AddLabel(node3, "N 3");
            Graph.AddLabel(edgeAtPorts, "Edge at Ports");

            /////////////////////////////////////////////////////
            /////////////////////////////////////////////////////

            #endregion

            ///////////////// New in this Sample /////////////////

            // Override default label placement

            // For our "special" label, we use a model that describes discrete positions
            // outside the node bounds
            ExteriorLabelModel exteriorLabelModel = new ExteriorLabelModel();

            // We use some extra insets from the label to the node bounds
            exteriorLabelModel.Insets = new InsetsD(5);

            // We assign this label a specific symbolic position out of the eight possible
            // external locations valid for ExteriorLabelModel
            Graph.SetLabelLayoutParameter(node3Label, exteriorLabelModel.CreateParameter(ExteriorLabelModel.Position.South));

            /////////////////////////////////////////////////////
        }
        /// <summary>
        /// Populates the ToolStrip's LabelModel combobox
        /// </summary>
        private void SetupOptions()
        {
            const string LABEL_MODEL_INTERIOR       = "Interior";
            const string LABEL_MODEL_EXTERIOR       = "Exterior";
            const string LABEL_MODEL_FREENODE       = "Free Node";
            const string LABEL_MODEL_SANDWICH       = "Sandwich";
            const string LABEL_MODEL_THREE_DISTANCE = "Three Distances";

            LabelModels.Add(LABEL_MODEL_INTERIOR, new InteriorLabelModel());
            LabelModels.Add(LABEL_MODEL_EXTERIOR, new ExteriorLabelModel()
            {
                Insets = new InsetsD(10)
            });
            LabelModels.Add(LABEL_MODEL_FREENODE, new FreeNodeLabelModel());
            LabelModels.Add(LABEL_MODEL_SANDWICH, new SandwichLabelModel()
            {
                YOffset = 10
            });

            IList <ILabelModelParameter> list = new List <ILabelModelParameter>();
            var model = new ExteriorLabelModel()
            {
                Insets = new InsetsD(5)
            };

            list.Add(model.CreateParameter(ExteriorLabelModel.Position.North));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.South));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.East));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.West));
            model = new ExteriorLabelModel()
            {
                Insets = new InsetsD(10)
            };
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.North));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.South));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.East));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.West));
            model = new ExteriorLabelModel()
            {
                Insets = new InsetsD(15)
            };
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.North));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.NorthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.South));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthEast));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.SouthWest));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.East));
            list.Add(model.CreateParameter(ExteriorLabelModel.Position.West));

            var genericLabelModel = new GenericLabelModel(list[0]);

            foreach (var labelModelParameter in list)
            {
                // set different profits for various insets
                var    insets = ((ExteriorLabelModel)labelModelParameter.Model).Insets.Top;
                double profit = insets < 10 ? 1.0 : insets < 15 ? 0.9 : 0.8;
                genericLabelModel.AddParameter(labelModelParameter, new LabelCandidateDescriptor {
                    Profit = profit
                });
            }
            LabelModels.Add(LABEL_MODEL_THREE_DISTANCE, genericLabelModel);
            // create the options
            foreach (var key in LabelModels.Keys)
            {
                labelModelComboBox.Items.Add(key);
            }
            labelModelComboBox.SelectedItem = LABEL_MODEL_EXTERIOR;
        }