// ************ modification ************ internal override void startModify(PointF org, int handle, InteractionState ist) { base.startModify(org, handle, ist); relatedInteraction = ist; ptLastTopLeft.X = rect.Left; ptLastTopLeft.Y = rect.Top; ptLastTopLeft = flowChart.AlignPointToGrid(ptLastTopLeft); if (handle == 8 && selectedItems.Count > 0) { foreach (ChartObject obj in selectedItems) if (!obj.getModifying() && obj.canModify(handle)) obj.startModify(org, 0, ist); } // find arrows whose both ends are selected arrowsToMove.Clear(); MethodCallVisitor visitor = new MethodCallVisitor( new VisitOperation(HV_TranslateArrow)); visitHierarchy(visitor); }
internal void removeItem(ChartObject item) { selection.RemoveObject(item); if (item == autoHandlesObj) autoHandlesObj = null; if (item == autoAnchorsObj) autoAnchorsObj = null; switch (item.getType()) { case ItemType.Box: boxes.Remove((Box)item); break; case ItemType.ControlHost: controlHosts.Remove((ControlHost)item); break; case ItemType.Table: tables.Remove((Table)item); break; case ItemType.Arrow: arrows.Remove((Arrow)item); break; } removeFromZOrder(item); MethodCallVisitor visitor = new MethodCallVisitor(new VisitOperation(removeFromSelection)); switch (item.getType()) { case ItemType.ControlHost: { ControlHost host = (ControlHost)item; host.visitArrows(visitor); host.deleteArrows(); } break; case ItemType.Box: { Box box = (Box)item; box.visitArrows(visitor); box.deleteArrows(); } break; case ItemType.Table: { Table table = (Table)item; table.visitArrows(visitor); table.deleteArrows(); } break; case ItemType.Arrow: { Arrow arrow = (Arrow)item; arrow.resetCrossings(); arrow.getDestLink().removeArrowFromObj(); arrow.getOrgnLink().removeArrowFromObj(); } break; } item.onRemove(); // update document size if needed if (autoSizeDoc != MindFusion.FlowChartX.AutoSize.None) sizeDocForItems(); }
internal override void completeModify(PointF end, InteractionState ist) { base.completeModify(end, ist); relatedInteraction = null; RectangleF rcBounding = new RectangleF(0, 0, 0, 0); if (modifyHandle == 8) { MethodCallVisitor visitor = new MethodCallVisitor( new VisitOperation(updateNSARect)); visitHierarchy(visitor); foreach (ChartObject obj in selectedItems) { RectangleF rcObj = obj.getRotatedBounds(); rcBounding = Utilities.unionNonEmptyRects(rcBounding, rcObj); } rect = rcBounding; // beware of arrow routing; obj.completeModify invokations // might route many arrows repetitively flowChart.DontRouteForAwhile = true; // call EndModify method of all selected objects foreach (ChartObject obj in selectedItems) if (obj.getModifying() && obj.canModify(modifyHandle)) obj.completeModify(); // now that would route an arrow only once flowChart.DontRouteForAwhile = false; flowChart.routeAllArrows(this); // fire SelectionMoved event, for that was exactly what happened flowChart.fireSelectionMoved(); } }
private void drawHierarchy(Graphics g, ChartObject obj, bool shadows) { if (!sortGroupsByZ) { PainterVisitor painter = new PainterVisitor(g, shadows); obj.visitHierarchy(painter); } else { MethodCallVisitor visitor = new MethodCallVisitor(new VisitOperation(addToSortedList)); obj.visitHierarchy(visitor); foreach (ChartObject item in sortedByZ.Keys) item.Draw(g, shadows); sortedByZ.Clear(); } }