/// <summary>
        /// Inserts the subconnectors.
        /// </summary>
        /// <param name="connector">The connector.</param>
        /// <param name="loadWhenNecessary">if set to <c>true</c> [load when necessary].</param>
        /// <param name="recursiveExpand">if set to <c>true</c> [recursive expand].</param>
        /// <param name="item">The item.</param>
        private void InsertSubconnectors(ExpressionConnectorViewModel connector, bool loadWhenNecessary, bool recursiveExpand, ExpressionConnector item)
        {
            var idx = ConnectorsIn.IndexOf(connector);
            var newConnectors = new List<ExpressionConnectorViewModel>();
            foreach (var sc in item.GetSubconnectors().OrderBy(x => x.Name))
            {
                item.SubconnectorsLoaded = true;
                var newConnector = new ExpressionConnectorViewModel(new ExpressionConnector(ConnectorType.In, sc), _diagramViewModel) { IndentLevel = connector.IndentLevel + 1 };
                ConnectorsIn.Insert(++idx, newConnector);
                newConnectors.Add(newConnector);
            }
            if (recursiveExpand)
            {
                foreach (var newConnector in newConnectors)
                {
                    var connectorItem = newConnector.Item as ExpressionConnector;
                    if (connectorItem != null &&
                        connectorItem.IsConnectorsGroup &&
                        connectorItem.IsConnectorsGroupCollapsed)
                    {
                        continue;
                    }

                    ExpandSubconnectors(newConnector, loadWhenNecessary, true);
                }
            }
        }
        /// <summary>
        /// Deletes the subconnectors.
        /// </summary>
        /// <param name="connector">The connector.</param>
        /// <param name="loadWhenNecessary">if set to <c>true</c> [load when necessary].</param>
        /// <param name="item">The item.</param>
        /// <param name="action">The action.</param>
        private void DeleteSubconnectors(ExpressionConnectorViewModel connector, bool loadWhenNecessary, ExpressionConnector item)
        {
            foreach (var sc in item.GetSubconnectors().OrderBy(x => x.Name))
            {
                var node = ConnectorsIn.FirstOrDefault(x => x.Item.Id == sc.Id);
                if (node != null)
                {
                    if (sc.HasSubfields)
                    {
                        var newConnector = new ExpressionConnectorViewModel(new ExpressionConnector(ConnectorType.Out, sc), _diagramViewModel) { IndentLevel = connector.IndentLevel };
                        CollapseSubconnectors(newConnector, loadWhenNecessary);
                    }
                    item.SubconnectorsLoaded = false;
                    ConnectorsIn.Remove(node);
                }
            }

            item.IsConnectorsGroupCollapsed = !item.SubconnectorsLoaded;

            item.ClearSubconnectors();
        }
        /// <summary>
        /// Expands the subconnectors.
        /// </summary>
        /// <param name="connector">The connector.</param>
        /// <param name="loadWhenNecessary">if set to <c>true</c> [load when necessary].</param>
        /// <param name="recursiveExpand">if set to <c>true</c> [recursive expand].</param>
        private void ExpandSubconnectors(ExpressionConnectorViewModel connector, bool loadWhenNecessary, bool recursiveExpand)
        {
            var item = (ExpressionConnector)connector.Item;
            if (item.HasSubconnectors)
            {
                if (loadWhenNecessary)
                {
                    _diagramViewModel.IsBusy = true;
                    item.LoadSubconnectors(() =>
                    {
                        InsertSubconnectors(connector, true, recursiveExpand, item);
                        item.IsConnectorsGroupCollapsed = !item.SubconnectorsLoaded;

                        _diagramViewModel.IsBusy = false;
                    });
                }
                else
                {
                    InsertSubconnectors(connector, false, recursiveExpand, item);
                    item.IsConnectorsGroupCollapsed = !item.SubconnectorsLoaded;
                }

                _diagramViewModel.Resize();
            }            
        }
        /// <summary>
        /// Determines whether the specified connector has connection.
        /// </summary>
        /// <param name="connector">The connector.</param>
        private bool HasConnection(ExpressionConnectorViewModel connector)
        {
            var item = (ExpressionConnector)connector.Item;

            if (item.HasSubconnectors)
            {
                foreach (var sc in item.GetSubconnectors().OrderBy(x => x.Name))
                {
                    var node = ConnectorsIn.FirstOrDefault(x => x.Item.Id == sc.Id);
                    if (node != null)
                    {
                        if (node.IsConnected) return true;

                        if (sc.HasSubfields)
                        {
                            var newConnector = new ExpressionConnectorViewModel(new ExpressionConnector(ConnectorType.Out, sc), _diagramViewModel) { IndentLevel = connector.IndentLevel };
                            if (HasConnection(newConnector))
                            {
                                return true;
                            }
                        }
                    }
                }
            }

            return false;
        }
        /// <summary>
        /// Collapses the subconnectors.
        /// </summary>
        /// <param name="connector">The connector.</param>
        /// <param name="loadWhenNecessary">if set to <c>true</c> [load when necessary].</param>
        private void CollapseSubconnectors(ExpressionConnectorViewModel connector, bool loadWhenNecessary)
        {
            var item = (ExpressionConnector)connector.Item;

            if (item.HasSubconnectors && loadWhenNecessary)
            {
                DeleteSubconnectors(connector, true, item);
            }

            _diagramViewModel.Resize();
        }
 /// <summary>
 /// Expands the subconnectors command execute.
 /// </summary>
 /// <param name="connector">The connector.</param>
 private void ExpandSubconnectorsCommandExecute(ExpressionConnectorViewModel connector)
 {
     ExpandSubconnectors(connector, true, false);
 }
        /// <summary>
        /// Collapses the subconnectors command execute.
        /// </summary>
        /// <param name="connector">The connector.</param>
        private void CollapseSubconnectorsCommandExecute(ExpressionConnectorViewModel connector)
        {
            if (HasConnection(connector))
            {
                _diagramViewModel.ThePopupFactory.NotifyFailure("Can not collapse.\nOne or more connections are used");

                return;
            }
            CollapseSubconnectors(connector, true);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="DestinationFieldsExpressionNode"/> class.
        /// </summary>
        /// <param name="diagramViewModel">The diagram view model.</param>
        /// <param name="expressionObject">The expression object.</param>
        /// <exception cref="System.ArgumentNullException">expressionObject</exception>
        public DestinationFieldsExpressionNode(IDiagramViewModel diagramViewModel, DestinationFieldList expressionObject)
            : base(expressionObject)
        {
            if (expressionObject == null) throw new ArgumentNullException("expressionObject");

            _diagramViewModel = diagramViewModel;
            _connectorsIn.CollectionChanged += ConnectorsInCollectionChanged;

            IsValidFunc = n => true;
            UpdateAction = n => { };

            foreach (var node in expressionObject.Fields)
            {
                var connector = new ExpressionConnectorViewModel(new ExpressionConnector(ConnectorType.In, node), diagramViewModel);
                ConnectorsIn.Add(connector);
                ExpandSubconnectors(connector, false, true);
                //ConnectorsIn.Add(new ExpressionConnectorViewModel(new ExpressionConnector(ConnectorType.In, node), diagramViewModel));
            }
        }