// "Add Member" clicked void OnClick(object sender, RoutedEventArgs e) { Button button = e.OriginalSource as Button; UMLClassNode diag = sender as UMLClassNode; Border buttonFirstParent = button.Parent as Border; Grid grid = buttonFirstParent.Parent as Grid; switch (button.Name) { case "BtAddMember": if (Parent == null) { return; } else { // add a row to the node's grid, set focus on the textbox of the new row... var rowDefinition = new RowDefinition(); rowDefinition.Height = GridLength.Auto; grid.RowDefinitions.Add(rowDefinition); var newTextbox = new TextBox(); grid.Children.Add(newTextbox); newTextbox.Focus(); Grid.SetRow(newTextbox, grid.RowDefinitions.Count - 2); Grid.SetRow(buttonFirstParent, grid.RowDefinitions.Count - 1); } break; } }
// this checks the dragged node type and creates the right custom node for it... // this checks the dragged node type and creates the right custom node for it... #region Node created private void DiagramNodeCreated(ShapeNode node) { // check if the node is a connector if (node.Shape.Id == "InheritanceLink") { // replace the dummy connector node with a DiagramLink var bounds = node.Bounds; diagram.Items.Remove(node); var link = diagram.Factory.CreateDiagramLink( bounds.TopLeft, bounds.BottomRight); link.SegmentCount = 2; link.Shape = LinkShape.Cascading; link.HeadShape = ArrowHeads.Triangle; ConnectToNearbyNode(link); } else if (node.Shape.Id == "InterfaceLink") { var bounds = node.Bounds; diagram.Items.Remove(node); var link = diagram.Factory.CreateDiagramLink( bounds.TopLeft, bounds.BottomRight); link.SegmentCount = 1; link.Shape = LinkShape.Cascading; System.Windows.Media.DashStyle dash = new System.Windows.Media.DashStyle(); dash.Dashes = new DoubleCollection(new double[] { 1, 7 }); Pen pen = new Pen(Brushes.Black, 1); pen.DashStyle = dash; link.Pen = pen; link.HeadShape = ArrowHeads.Triangle; ConnectToNearbyNode(link); } else if (node.Shape.Id == "RelationshipLink") { // replace the dummy connector node with a DiagramLink var bounds = node.Bounds; diagram.Items.Remove(node); var link = diagram.Factory.CreateDiagramLink( bounds.TopLeft, bounds.BottomRight); link.SegmentCount = 1; link.Shape = LinkShape.Cascading; link.HeadShape = ArrowHeads.DefaultFlow; // might need a custom arrowhead here, supposed to be a straight line with 2 link.BaseShape = ArrowHeads.RevWithLine; // vertical || across (see visio) ConnectToNearbyNode(link); } else { //node.AnchorPattern = AnchorPattern.Decision2In2Out; ConnectToNearbyLink(node); } // no other actions needed if diagram type is basic flowchart if (node.Name.Equals("processNode") || node.Name.Equals("startEndNode") || node.Name.Equals("decisionNode") || node.Name.Equals("dataNode") || node.Name.Equals("subprocessNode") || node.Name.Equals("documentNode")) { return; } diagram.Items.Remove(node); // dont add the default shape // UML Nodes if (node.Name.Equals("classNode")) { var node1 = new UMLClassNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 160), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("interfaceNode")) { var node1 = new UMLInterfaceNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 160), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("memberNode")) { var node1 = new UMLMember { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 25), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("separatorNode")) { var node1 = new UMLSeparatorNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 5), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("packageNode")) { var node1 = new UMLPackageNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 160), }; diagram.Nodes.Add(node1); } // // Crow's foot nodes else if (node.Name.Equals("entityNode")) { var node1 = new CrowsFootEntity { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 160), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("primaryKeyNode")) { var node1 = new CFPrimaryKeyNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 25), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("attributeNode")) { var node1 = new CFAttributeNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 25), }; diagram.Nodes.Add(node1); } else if (node.Name.Equals("primaryKeySeparatorNode")) { var node1 = new CFPrimaryKeySeparatorNode { Bounds = new Rect(node.Bounds.Left, node.Bounds.Top, 300, 5), }; diagram.Nodes.Add(node1); } else { return; } }