示例#1
0
        private static void RouteConnectors([NotNull] LayoutState state, [NotNull] BoxTree visualTree)
        {
            visualTree.IterateParentFirst(node =>
            {
                if (node.Element.IsCollapsed || node.State.NumberOfSiblings == 0 && node.AssistantsRoot == null)
                {
                    return(false);
                }

                if (node.Level == 0)
                {
                    return(true);
                }

                if (!node.Element.IsSpecial || node.IsAssistantRoot)
                {
                    node.State.RequireLayoutStrategy().RouteConnectors(state, node);
                    return(true);
                }

                return(false);
            });
        }
示例#2
0
        private static void PreprocessVisualTree([NotNull] LayoutState state, [NotNull] BoxTree visualTree)
        {
            var defaultStrategy           = state.Diagram.LayoutSettings.RequireDefaultLayoutStrategy();
            var defaultAssistantsStrategy = state.Diagram.LayoutSettings.RequireDefaultAssistantLayoutStrategy();

            var regular = new Stack <LayoutStrategyBase>();

            regular.Push(defaultStrategy);
            var assistants = new Stack <LayoutStrategyBase>();

            assistants.Push(defaultAssistantsStrategy);

            visualTree.IterateParentFirst(node =>
            {
                if (node.State.IsHidden)
                {
                    return(false);
                }

                LayoutStrategyBase strategy = null;

                if (state.LayoutOptimizerFunc != null)
                {
                    var suggestedStrategyId = state.LayoutOptimizerFunc(node);
                    if (!string.IsNullOrEmpty(suggestedStrategyId))
                    {
                        strategy = state.Diagram.LayoutSettings.LayoutStrategies[suggestedStrategyId];
                    }
                }

                if (node.IsAssistantRoot)
                {
                    if (strategy == null)
                    {
                        strategy = node.ParentNode.Element.AssistantLayoutStrategyId != null
                            ? state.Diagram.LayoutSettings.LayoutStrategies[
                            node.ParentNode.Element.AssistantLayoutStrategyId]
                            : assistants.Peek();
                    }
                    assistants.Push(strategy);
                }
                else
                {
                    if (strategy == null)
                    {
                        strategy = node.Element.LayoutStrategyId != null
                            ? state.Diagram.LayoutSettings.LayoutStrategies[node.Element.LayoutStrategyId]
                            : regular.Peek();
                    }
                    regular.Push(strategy);

                    if (!strategy.SupportsAssistants)
                    {
                        node.SuppressAssistants();
                    }
                }

                // now let it pre-allocate special boxes etc
                node.State.EffectiveLayoutStrategy = strategy;
                node.State.RequireLayoutStrategy().PreProcessThisNode(state, node);

                return((!node.Element.IsCollapsed && node.ChildCount > 0) || node.AssistantsRoot != null);
            },
                                          node =>
            {
                if (!node.State.IsHidden)
                {
                    if (node.IsAssistantRoot)
                    {
                        assistants.Pop();
                    }
                    else
                    {
                        regular.Pop();
                    }
                }
            });
        }