Ejemplo n.º 1
0
        public void ToDockSide(DockSide side, bool isActive = false)
        {
            if (side != DockSide.Left && side != DockSide.Top && side != DockSide.Right && side != DockSide.Bottom)
            {
                return;
            }
            if (_container != null)
            {
                if (side != Side || Mode != DockMode.DockBar)
                {
                    var dockManager = DockManager;
                    _container.Detach(this);
                    _container = null;

                    Mode = DockMode.DockBar;
                    Side = side;
                    dockManager.Root.AddSideChild(this, Side);
                }

                if (isActive)
                {
                    _dockControl.SetActive();
                }
            }
        }
Ejemplo n.º 2
0
        public void ToDock()
        {
            if (!CanDock)
            {
                _dockControl.SetActive();
                return;
            }
            if (_container != null)
            {
                CanSelect = true;
                Mode      = DockMode.Normal;
                var dockManager = DockManager;
                var group       = _container as LayoutGroup;
                if (group?.AttachObj == null || !group.AttachObj.AttachTo())
                {
                    //默认向下停靠
                    if (Side == DockSide.None)
                    {
                        Side = DockSide.Bottom;
                    }
                    _container.Detach(this);
                    _container = null;
                    _ToRoot(dockManager);
                }

                _dockControl.SetActive();
            }
        }
Ejemplo n.º 3
0
 public void Dock()
 {
     if (this.PreviousContainer == null)
     {
         this.InternalDock();
     }
     else
     {
         ILayoutContainer parent        = base.Parent;
         int          num               = (parent is ILayoutGroup ? (parent as ILayoutGroup).IndexOfChild(this) : -1);
         ILayoutGroup previousContainer = this.PreviousContainer as ILayoutGroup;
         if (this.PreviousContainerIndex >= previousContainer.ChildrenCount)
         {
             previousContainer.InsertChildAt(previousContainer.ChildrenCount, this);
         }
         else
         {
             previousContainer.InsertChildAt(this.PreviousContainerIndex, this);
         }
         if (num <= -1)
         {
             this.PreviousContainer      = null;
             this.PreviousContainerIndex = 0;
         }
         else
         {
             this.PreviousContainer      = parent;
             this.PreviousContainerIndex = num;
         }
         this.IsSelected = true;
         this.IsActive   = true;
     }
     base.Root.CollectGarbage();
 }
Ejemplo n.º 4
0
        public void ToDockAsDocument(int index, bool isActive = true)
        {
            if (!CanDockAsDocument && isActive)
            {
                _dockControl.SetActive();
                return;
            }

            if (index < 0 || index >= DockManager.DocumentTabCount)
            {
                return;
            }

            if (_container != null)
            {
                CanSelect = true;
                var dockManager = DockManager;
                _container.Detach(this);
                _container = null;
                Side       = DockSide.None;
                Mode       = DockMode.Normal;

                dockManager.Root.DocumentModels[index].Attach(this, 0);

                if (isActive)
                {
                    _dockControl.SetActive();
                }
            }
        }
Ejemplo n.º 5
0
        public void Float()
        {
            if (this.PreviousContainer == null || this.PreviousContainer.FindParent <LayoutFloatingWindow>() == null)
            {
                base.Root.Manager.StartDraggingFloatingWindowForContent(this, false);
                this.IsSelected = true;
                this.IsActive   = true;
                return;
            }
            ILayoutPane  parent            = base.Parent as ILayoutPane;
            int          num               = (parent as ILayoutGroup).IndexOfChild(this);
            ILayoutGroup previousContainer = this.PreviousContainer as ILayoutGroup;

            if (this.PreviousContainerIndex >= previousContainer.ChildrenCount)
            {
                previousContainer.InsertChildAt(previousContainer.ChildrenCount, this);
            }
            else
            {
                previousContainer.InsertChildAt(this.PreviousContainerIndex, this);
            }
            this.PreviousContainer      = parent;
            this.PreviousContainerIndex = num;
            this.IsSelected             = true;
            this.IsActive = true;
            base.Root.CollectGarbage();
        }
Ejemplo n.º 6
0
 protected abstract IDiagramNode CreateInstance(
     IModelNode modelNode,
     Size2D size,
     Point2D center,
     DateTime addedAt,
     ModelNodeId?parentNodeId,
     ILayoutGroup layoutGroup);
Ejemplo n.º 7
0
 public DiagramLayoutStructure([NotNull] IDiagram diagram)
 {
     _diagram                    = diagram;
     _nodeLayoutGroups           = CreateLayoutGroupForAllNodes();
     _crossLayoutGroupConnectors = GetCrossLayoutGroupConnectors();
     RootLayoutGroup             = CreateLayoutGroup(Maybe <ModelNodeId> .Nothing);
 }
Ejemplo n.º 8
0
        public LayoutInfo Calculate(ILayoutGroup layoutGroup)
        {
            var nodeLayout      = CalculateNodeRects(layoutGroup);
            var connectorLayout = CalculateConnectorRoutes(layoutGroup, nodeLayout);

            return(new LayoutInfo(nodeLayout, connectorLayout));
        }
        public GroupLayoutInfo Calculate(ILayoutGroup layoutGroup)
        {
            var nodeLayout      = CalculateNodePositions(layoutGroup).ToList();
            var connectorLayout = CalculateConnectorRoutes(layoutGroup, nodeLayout).ToList();

            return(new GroupLayoutInfo(nodeLayout, connectorLayout));
        }
Ejemplo n.º 10
0
        public void Hide(bool cancelable = true)
        {
            if (!this.IsVisible)
            {
                base.IsSelected = true;
                base.IsActive   = true;
                return;
            }
            if (cancelable)
            {
                CancelEventArgs cancelEventArg = new CancelEventArgs();
                this.OnHiding(cancelEventArg);
                if (cancelEventArg.Cancel)
                {
                    return;
                }
            }
            this.RaisePropertyChanging("IsHidden");
            this.RaisePropertyChanging("IsVisible");
            ILayoutGroup parent = base.Parent as ILayoutGroup;

            base.PreviousContainer      = parent;
            base.PreviousContainerIndex = parent.IndexOfChild(this);
            base.Root.Hidden.Add(this);
            this.RaisePropertyChanged("IsVisible");
            this.RaisePropertyChanged("IsHidden");
            this.NotifyIsVisibleChanged();
        }
Ejemplo n.º 11
0
        private GroupLayoutInfo LayoutRecursive(
            [NotNull] DiagramLayoutStructure layoutStructure,
            [NotNull] ILayoutGroup layoutGroup,
            [NotNull] IGroupLayoutAlgorithm layoutAlgorithm)
        {
            var childLayoutByParentNodeId = new Dictionary <ModelNodeId, GroupLayoutInfo>();

            foreach (var node in layoutGroup.Nodes)
            {
                var maybeLayoutGroup = layoutStructure.TryGetLayoutGroupByNodeId(node.Id);
                if (!maybeLayoutGroup.HasValue || maybeLayoutGroup.Value.IsEmpty)
                {
                    continue;
                }

                var nodeLayoutAlgorithm    = _layoutAlgorithmSelectionStrategy.GetForNode(node);
                var childrenAreaLayoutInfo = LayoutRecursive(layoutStructure, maybeLayoutGroup.Value, nodeLayoutAlgorithm);

                layoutGroup.SetChildrenAreaSize(node.Id, childrenAreaLayoutInfo.Rect.Size);
                childLayoutByParentNodeId.Add(node.Id, childrenAreaLayoutInfo);
            }

            var groupLayoutInfo = layoutAlgorithm.Calculate(layoutGroup);

            foreach (var nodeLayoutInfo in groupLayoutInfo.Nodes)
            {
                if (childLayoutByParentNodeId.TryGetValue(nodeLayoutInfo.Node.Id, out var childrenAreaLayoutInfo))
                {
                    nodeLayoutInfo.ChildrenArea = childrenAreaLayoutInfo;
                }
            }

            return(groupLayoutInfo);
        }
Ejemplo n.º 12
0
 protected override IDiagramNode CreateInstance(
     IModelNode modelNode,
     Size2D size,
     Point2D center,
     DateTime addedAt,
     ModelNodeId?parentNodeId,
     ILayoutGroup layoutGroup)
 => new RoslynTypeDiagramNode((IRoslynTypeNode)modelNode, size, center, addedAt, parentNodeId, layoutGroup);
Ejemplo n.º 13
0
        public void ToFloat(bool isActive = true)
        {
            if (!CanFloat && isActive)
            {
                _dockControl.SetActive();
                return;
            }
            if (_container != null)
            {
                CanSelect = true;
                //注意切换模式
                Mode = DockMode.Float;
                var dockManager = DockManager;
                _container.Detach(this);
                _container = null;
                BaseFloatWindow  wnd;
                BaseGroupControl groupctrl;
                if (!IsDocument)
                {
                    var group = new LayoutGroup(Side, Mode, dockManager);
                    group.Attach(this);
                    groupctrl = new AnchorSideGroupControl(group)
                    {
                        DesiredHeight = DesiredHeight, DesiredWidth = DesiredWidth
                    };
                    wnd = new AnchorGroupWindow(dockManager)
                    {
                        Height = DesiredHeight,
                        Width  = DesiredWidth,
                        Left   = FloatLeft,
                        Top    = FloatTop
                    };
                }
                else
                {
                    var group = new LayoutDocumentGroup(Mode, dockManager);
                    group.Attach(this);
                    groupctrl = new LayoutDocumentGroupControl(group)
                    {
                        DesiredHeight = DesiredHeight, DesiredWidth = DesiredWidth
                    };
                    wnd = new DocumentGroupWindow(dockManager)
                    {
                        Height = DesiredHeight,
                        Width  = DesiredWidth,
                        Left   = FloatLeft,
                        Top    = FloatTop
                    };
                }
                wnd.AttachChild(groupctrl, AttachMode.None, 0);
                wnd.Show();

                if (isActive)
                {
                    _dockControl.SetActive();
                }
            }
        }
 private static Route GetRoute(
     [NotNull] ILayoutGroup layoutGroup,
     [NotNull] IList <NodeLayoutInfo> nodeLayout,
     [NotNull] IDiagramConnector connector)
 {
     return(new Route(
                GetNodeCenter(layoutGroup, nodeLayout, connector.Source),
                GetNodeCenter(layoutGroup, nodeLayout, connector.Target)));
 }
Ejemplo n.º 15
0
 private static Route GetRoute(
     [NotNull] ILayoutGroup layoutGroup,
     [NotNull] IDictionary <ModelNodeId, Rect2D> nodeRects,
     [NotNull] IDiagramConnector connector)
 {
     return(new Route(
                GetNodeCenter(layoutGroup, nodeRects, connector.Source),
                GetNodeCenter(layoutGroup, nodeRects, connector.Target)));
 }
Ejemplo n.º 16
0
 private TestDiagramNode(
     IModelNode modelNode,
     Size2D size,
     Point2D center,
     DateTime addedAt,
     ModelNodeId?parentNodeId,
     ILayoutGroup layoutGroup)
     : base(modelNode, size, center, addedAt, parentNodeId, layoutGroup)
 {
 }
Ejemplo n.º 17
0
 protected override IDiagramNode CreateInstance(
     IModelNode modelNode,
     Size2D size,
     Point2D center,
     DateTime addedAt,
     ModelNodeId?parentNodeId,
     ILayoutGroup layoutGroup)
 {
     return(new TestDiagramNode(modelNode, size, center, addedAt, parentNodeId, layoutGroup));
 }
Ejemplo n.º 18
0
        private static Point2D GetNodeCenter(
            [NotNull] ILayoutGroup layoutGroup,
            [NotNull] IDictionary <ModelNodeId, Rect2D> nodeRects,
            ModelNodeId nodeId)
        {
            var originalNode       = layoutGroup.GetNode(nodeId);
            var newTopLeftPosition = nodeRects[nodeId].TopLeft;

            return(FromTopLeftToCenter(newTopLeftPosition, originalNode.Size));
        }
        private static Point2D GetNodeCenter(
            [NotNull] ILayoutGroup layoutGroup,
            [NotNull] IList <NodeLayoutInfo> nodeLayout,
            ModelNodeId nodeId)
        {
            var originalNode       = layoutGroup.GetNode(nodeId);
            var newTopLeftPosition = nodeLayout.Single(i => i.Node.Id == nodeId).Rect.TopLeft;

            return(FromTopLeftToCenter(newTopLeftPosition, originalNode.Size));
        }
Ejemplo n.º 20
0
 public RoslynTypeDiagramNode(
     IRoslynTypeNode roslynTypeNode,
     Size2D size,
     Point2D center,
     DateTime addedAt,
     ModelNodeId?parentNodeId,
     ILayoutGroup layoutGroup)
     : base(roslynTypeNode, size, center, addedAt, parentNodeId, layoutGroup)
 {
 }
Ejemplo n.º 21
0
 protected ContainerDiagramNodeBase(
     IModelNode modelNode,
     Size2D size,
     Point2D center,
     DateTime addedAt,
     ModelNodeId?parentNodeId,
     ILayoutGroup layoutGroup)
     : base(modelNode, size, center, addedAt, parentNodeId)
 {
     LayoutGroup = layoutGroup;
 }
Ejemplo n.º 22
0
        private Diagram(
            [NotNull] ILayoutGroup rootLayoutGroup,
            [NotNull] IImmutableDictionary <ModelRelationshipId, IDiagramConnector> crossLayoutGroupConnectors)
        {
            RootLayoutGroup             = rootLayoutGroup;
            _crossLayoutGroupConnectors = crossLayoutGroupConnectors;

            Nodes           = RootLayoutGroup.NodesRecursive;
            Connectors      = RootLayoutGroup.ConnectorsRecursive.Union(CrossLayoutGroupConnectors);
            _allShapesGraph = DiagramGraph.Create(Nodes, Connectors);
        }
Ejemplo n.º 23
0
        LayoutContent FindLayoutContentByID(ILayoutElement layoutElement,
                                            string contentID)
        {
            if (layoutElement == null)
            {
                return(null);
            }

            LayoutContent content = layoutElement as LayoutContent;

            if (content != null)
            {
                if (content.ContentId == contentID)
                {
                    return(content);
                }
            }

            IEnumerable <ILayoutElement> children = null;
            LayoutRoot           root             = layoutElement as LayoutRoot;
            LayoutFloatingWindow fw    = layoutElement as LayoutFloatingWindow;
            ILayoutGroup         group = layoutElement as ILayoutGroup;

            if (root != null)
            {
                children = root.Children;
            }
            if (fw != null)
            {
                children = fw.Children;
            }
            if (group != null)
            {
                children = group.Children;
            }

            if (children == null)
            {
                return(null);
            }

            foreach (ILayoutElement i in children)
            {
                content = FindLayoutContentByID(i, contentID);
                if (content != null)
                {
                    return(content);
                }
            }

            return(null);
        }
        private IEnumerable <NodeLayoutInfo> CalculateNodePositions([NotNull] ILayoutGroup layoutGroup)
        {
            var orderedNodes = layoutGroup.Nodes.OrderBy(i => i.ModelNode.Name).ToList();

            double yPos = 0;

            foreach (var node in orderedNodes)
            {
                yield return(new NodeLayoutInfo(node, new Point2D(0, yPos)));

                yPos += node.Size.Height + _gapBetweenNodes;
            }
        }
Ejemplo n.º 25
0
 public void Dispose()
 {
     if (_isDisposed)
     {
         return;
     }
     _container?.Detach(this);
     _dockControl = null;
     if (_content is IDockSource)
     {
         (_content as IDockSource).DockControl = null;
     }
     _content    = null;
     _container  = null;
     _isDisposed = true;
 }
Ejemplo n.º 26
0
        private IDictionary <ModelNodeId, Rect2D> CalculateNodeRects([NotNull] ILayoutGroup layoutGroup)
        {
            var result       = new Dictionary <ModelNodeId, Rect2D>();
            var orderedNodes = layoutGroup.Nodes.OrderBy(i => i.ModelNode.Name).ToList();

            double yPos = 0;

            foreach (var node in orderedNodes)
            {
                result.Add(node.Id, new Rect2D(new Point2D(0, yPos), node.Size));

                yPos += node.Size.Height + _gapBetweenNodes;
            }

            return(result);
        }
Ejemplo n.º 27
0
        public virtual void UpdateLayout()
        {
            ILayoutGroup layoutGroup = pickerLayoutGroup;

            if (layoutGroup != null)
            {
                if (horizontal)
                {
                    layoutGroup.SetLayoutHorizontal();
                }
                if (vertical)
                {
                    layoutGroup.SetLayoutVertical();
                }
            }
        }
Ejemplo n.º 28
0
        protected override void OnParentChanged(ILayoutContainer oldValue, ILayoutContainer newValue)
        {
            ILayoutGroup layoutGroup = oldValue as ILayoutGroup;

            if (layoutGroup != null)
            {
                layoutGroup.ChildrenCollectionChanged -= new EventHandler(this.OnParentChildrenCollectionChanged);
            }
            this.RaisePropertyChanged("IsDirectlyHostedInFloatingWindow");
            ILayoutGroup layoutGroup1 = newValue as ILayoutGroup;

            if (layoutGroup1 != null)
            {
                layoutGroup1.ChildrenCollectionChanged += new EventHandler(this.OnParentChildrenCollectionChanged);
            }
            base.OnParentChanged(oldValue, newValue);
        }
Ejemplo n.º 29
0
 internal BaseGroupControl(ILayoutGroup model, double desiredWidth = Constants.DockDefaultWidthLength, double desiredHeight = Constants.DockDefaultHeightLength)
 {
     Model = model;
     SetBinding(ItemsSourceProperty, new Binding("Model.Children_CanSelect")
     {
         Source = this
     });
     if (model.Children.Count() > 0)
     {
         DesiredWidth  = model.Children.First().DesiredWidth;
         DesiredHeight = model.Children.First().DesiredHeight;
     }
     else
     {
         DesiredWidth  = desiredWidth;
         DesiredHeight = desiredHeight;
     }
 }
        public LayoutInfo Calculate(ILayoutGroup layoutGroup)
        {
            var diagramNodeToLayoutVertexMap    = new Map <ModelNodeId, DiagramNodeLayoutVertex>();
            var diagramConnectorToLayoutPathMap = new Map <ModelRelationshipId, LayoutPath>();

            var layoutVertices = layoutGroup.Nodes
                                 .Select(i => CreateLayoutVertex(i, diagramNodeToLayoutVertexMap))
                                 .OrderBy(i => i.DiagramNode.AddedAt)
                                 .ThenBy(i => i.Name)
                                 .ToList();

            var layoutPaths = layoutGroup.Connectors
                              .Select(i => CreateLayoutPath(i, diagramNodeToLayoutVertexMap, diagramConnectorToLayoutPathMap))
                              .ToList();

            var relativeLayout = RelativeLayoutCalculator.Calculate(layoutVertices, layoutPaths);

            return(new AbsolutePositionCalculator(relativeLayout, HorizontalGap, VerticalGap).CalculateLayout());
        }