public void Create(PrintElementNodeBuilder builder, ICollection <PrintElementNode> elements,
                           PrintElementNode elementNode)
        {
            elementNode.ElementChildrenTypes = TableColumns;
            elementNode.CanInsertChild       = BuildHelper.CanInsertChild(elementNode);
            elementNode.InsertChild          = InsertTableColumn(builder, elements, elementNode);

            elementNode.CanDeleteChild = BuildHelper.CanDeleteChild(elementNode);
            elementNode.DeleteChild    = DeleteTableColumn(elements, elementNode);

            elementNode.CanMoveChild = BuildHelper.CanMoveChild(elementNode);
            elementNode.MoveChild    = MoveTableColumn(elementNode);

            elementNode.CanPaste = BuildHelper.CanPaste(elementNode);
            elementNode.Paste    = BuildHelper.Paste(elementNode);

            builder.BuildElements(elements, elementNode, elementNode.ElementMetadata.Columns, "TableColumn");
        }
Beispiel #2
0
        public void Create(PrintElementNodeBuilder builder, ICollection <PrintElementNode> elements,
                           PrintElementNode elementNode)
        {
            elementNode.ElementChildrenTypes = BuildHelper.BlockTypes;
            elementNode.CanInsertChild       = BuildHelper.CanInsertChild(elementNode);
            elementNode.InsertChild          = BuildHelper.InsertChildToCollection(builder, elements, elementNode, "Blocks");

            elementNode.CanDeleteChild = BuildHelper.CanDeleteChild(elementNode);
            elementNode.DeleteChild    = BuildHelper.DeleteChildFromCollection(elements, elementNode, "Blocks");

            elementNode.CanMoveChild = BuildHelper.CanMoveChild(elementNode);
            elementNode.MoveChild    = BuildHelper.MoveChildInCollection(elementNode, "Blocks");

            elementNode.CanPaste = BuildHelper.CanPaste(elementNode);
            elementNode.Paste    = BuildHelper.Paste(elementNode);

            builder.BuildElements(elements, elementNode, elementNode.ElementMetadata.Blocks);
        }
        private static void ProcessChildElement(IList childElements, PrintElementNode childElementNode,
                                                Action <object> action, bool wrapElementMetadata)
        {
            if (childElements != null)
            {
                var childElementType     = childElementNode.ElementType;
                var childElementMetadata = childElementNode.ElementMetadata;

                foreach (dynamic element in childElements)
                {
                    if ((wrapElementMetadata && (element[childElementType] == childElementMetadata)) ||
                        (!wrapElementMetadata && (element == childElementMetadata)))
                    {
                        action(element);
                        break;
                    }
                }
            }
        }
        public void Create(PrintElementNodeBuilder builder, ICollection <PrintElementNode> elements,
                           PrintElementNode elementNode)
        {
            elementNode.ElementChildrenTypes = BuildHelper.BlockTypes;
            elementNode.CanInsertChild       = BuildHelper.CanInsertChild(elementNode);
            elementNode.InsertChild          = BuildHelper.InsertChildToContainer(builder, elements, elementNode, "Block");

            elementNode.CanDeleteChild = BuildHelper.CanDeleteChild(elementNode);
            elementNode.DeleteChild    = BuildHelper.DeleteChildFromContainer(elements, elementNode, "Block");

            elementNode.CanCut = BuildHelper.CanCut(elementNode);
            elementNode.Cut    = BuildHelper.Cut(elementNode);

            elementNode.CanCopy = BuildHelper.CanCopy(elementNode);
            elementNode.Copy    = BuildHelper.Copy(elementNode);

            elementNode.CanPaste = BuildHelper.CanPaste(elementNode);
            elementNode.Paste    = BuildHelper.Paste(elementNode);

            builder.BuildElement(elements, elementNode, elementNode.ElementMetadata.Block);
        }
        public static Func <PrintElementNode, int, bool> MoveChildInCollection(PrintElementNode parentElementNode,
                                                                               string childElementCollection, bool wrapElementMetadata = true)
        {
            return((childElementNode, delta) =>
            {
                if (parentElementNode.CanMoveChild.TryInvoke(childElementNode, delta))
                {
                    // Перемещение дочернего элемента в коллекции метаданных родительского элемента
                    var childElements = GetChildElementCollection(parentElementNode, childElementCollection, false);
                    ProcessChildElement(childElements, childElementNode,
                                        element => childElements.MoveItem(element, delta), wrapElementMetadata);

                    // Перемещение дочернего элемента в визуальном дереве элементов
                    parentElementNode.Nodes.MoveItem(childElementNode, delta);
                    RecalcChildNodes(parentElementNode);

                    return true;
                }

                return false;
            });
        }
        private static PrintElementNode CreateElementNode(PrintElementNode elementParent, BarItem elementItem,
                                                          bool useElementCache)
        {
            PrintElementNode elementNode;

            var elementType = elementItem.Tag as string ?? string.Empty;

            if (useElementCache)
            {
                if (!ElementNodeCache.TryGetValue(elementType, out elementNode))
                {
                    elementNode = new PrintElementNode(elementParent, elementType, new DynamicWrapper());
                    ElementNodeCache[elementType] = elementNode;
                }
            }
            else
            {
                elementNode = new PrintElementNode(elementParent, elementType, new DynamicWrapper());
            }

            return(elementNode);
        }
        private static Func <int> GetTableColumnCount(PrintElementNode parentElementNode)
        {
            return(() =>
            {
                // Узел с определением таблицы
                var tableNode = parentElementNode.Parent;

                if (tableNode != null)
                {
                    // Узел с определением столбцов таблицы
                    var columnsNode =
                        tableNode.Nodes.FirstOrDefault(
                            n => string.Equals(n.ElementType, "TableColumns", StringComparison.OrdinalIgnoreCase));

                    if (columnsNode != null)
                    {
                        return columnsNode.Nodes.Count;
                    }
                }

                return 0;
            });
        }
        private static Func <IEnumerable <PrintElementNode> > GetTableRows(PrintElementNode parentElementNode)
        {
            return(() =>
            {
                // Узел с определением таблицы
                var tableNode = parentElementNode.Parent;

                if (tableNode != null)
                {
                    // Узел с определением строк таблицы
                    var rowsNode =
                        tableNode.Nodes.FirstOrDefault(
                            n => string.Equals(n.ElementType, "TableRows", StringComparison.OrdinalIgnoreCase));

                    if (rowsNode != null)
                    {
                        return rowsNode.Nodes;
                    }
                }

                return null;
            });
        }
Beispiel #9
0
        private void ExpandElement(PrintElementNode element)
        {
            if (element != null)
            {
                var elementNode = TreeList.View.GetNodeByKeyValue(element);

                if (elementNode != null)
                {
                    var parentNodes = new Stack <TreeListNode>();

                    while (elementNode != null && !elementNode.IsExpanded)
                    {
                        parentNodes.Push(elementNode);
                        elementNode = elementNode.ParentNode;
                    }

                    foreach (var node in parentNodes)
                    {
                        node.IsExpanded = true;
                    }
                }
            }
        }
        private static Func <PrintElementNode, bool, bool> DeleteTableColumn(ICollection <PrintElementNode> elements,
                                                                             PrintElementNode parentElementNode)
        {
            // Удаление столбца удаляет соответствующие ячейки во всех строчках таблицы

            var getTableRowsFunc = GetTableRows(parentElementNode);
            var deleteChildFunc  = BuildHelper.DeleteChildFromCollection(elements, parentElementNode, "Columns", false);

            return((columnElementNode, accept) =>
            {
                var columnIndex = columnElementNode.Index;

                if (deleteChildFunc(columnElementNode, accept))
                {
                    var rows = getTableRowsFunc();

                    if (rows != null)
                    {
                        foreach (var row in rows)
                        {
                            foreach (var cell in row.Nodes)
                            {
                                if (cell.Index == columnIndex)
                                {
                                    row.DeleteChild.TryInvoke(cell, false);
                                    break;
                                }
                            }
                        }
                    }

                    return true;
                }

                return false;
            });
        }
        public static Func <PrintElementNode, bool, bool> DeleteChildFromContainer(
            ICollection <PrintElementNode> elements, PrintElementNode parentElementNode, string childElementContainer,
            bool wrapElementMetadata = true)
        {
            return((childElementNode, accept) =>
            {
                if (parentElementNode.CanDeleteChild.TryInvoke(childElementNode, accept))
                {
                    if (!accept || Helpers.AcceptQuestionMessage(Resources.DeleteElementQuestion, childElementNode))
                    {
                        // Удаление дочернего элемента из контейнера метаданных родительского элемента
                        parentElementNode.ElementMetadata[childElementContainer] = null;

                        // Удаление дочернего элемента из визуального дерева элементов
                        parentElementNode.Nodes.RemoveItem(childElementNode);
                        DeleteChildNodes(elements, childElementNode);

                        return true;
                    }
                }

                return false;
            });
        }
        private static Func <PrintElementNode, int, bool> MoveTableColumn(PrintElementNode parentElementNode)
        {
            // Перемещение столбца перемещает соответствующие ячейки во всех строчках таблицы

            var getTableRowsFunc = GetTableRows(parentElementNode);
            var moveChildFunc    = BuildHelper.MoveChildInCollection(parentElementNode, "Columns", false);

            return((columnElementNode, delta) =>
            {
                var columnIndex = columnElementNode.Index;

                if (moveChildFunc(columnElementNode, delta))
                {
                    var rows = getTableRowsFunc();

                    if (rows != null)
                    {
                        foreach (var row in rows)
                        {
                            foreach (var cell in row.Nodes)
                            {
                                if (cell.Index == columnIndex)
                                {
                                    row.MoveChild.TryInvoke(cell, delta);
                                    break;
                                }
                            }
                        }
                    }

                    return true;
                }

                return false;
            });
        }
Beispiel #13
0
        public void Create(PrintElementNodeBuilder builder, ICollection <PrintElementNode> elements,
                           PrintElementNode elementNode)
        {
            elementNode.ElementChildrenTypes = TableCells;
            elementNode.CanInsertChild       = CanInsertTableRowCell(elementNode);
            elementNode.InsertChild          = BuildHelper.InsertChildToCollection(builder, elements, elementNode, "Cells", false);

            elementNode.CanDeleteChild = CanDeleteTableRowCell(elementNode);
            elementNode.DeleteChild    = BuildHelper.DeleteChildFromCollection(elements, elementNode, "Cells", false);

            elementNode.CanMoveChild = BuildHelper.CanMoveChild(elementNode);
            elementNode.MoveChild    = BuildHelper.MoveChildInCollection(elementNode, "Cells", false);

            elementNode.CanCut = BuildHelper.CanCut(elementNode);
            elementNode.Cut    = BuildHelper.Cut(elementNode);

            elementNode.CanCopy = BuildHelper.CanCopy(elementNode);
            elementNode.Copy    = BuildHelper.Copy(elementNode);

            elementNode.CanPaste = BuildHelper.CanPaste(elementNode);
            elementNode.Paste    = BuildHelper.Paste(elementNode);

            builder.BuildElements(elements, elementNode, elementNode.ElementMetadata.Cells, "TableCell");
        }
 private static Func <PrintElementNode, bool, bool> DeleteTableRow(ICollection <PrintElementNode> elements,
                                                                   PrintElementNode parentElementNode)
 {
     return(BuildHelper.DeleteChildFromCollection(elements, parentElementNode, "Rows", false));
 }
        // Copy

        public static Func <bool> CanCopy(PrintElementNode parentElementNode)
        {
            return(() => (parentElementNode.Copy != null));
        }
        private static Func <PrintElementNode, bool> InsertTableColumn(PrintElementNodeBuilder builder,
                                                                       ICollection <PrintElementNode> elements, PrintElementNode parentElementNode)
        {
            // Добавление столбца добавляет ячейку во все строки таблицы

            var getTableRowsFunc = GetTableRows(parentElementNode);
            var insertChildFunc  = BuildHelper.InsertChildToCollection(builder, elements, parentElementNode, "Columns",
                                                                       false);

            return(columnElementNode =>
            {
                if (insertChildFunc(columnElementNode))
                {
                    var rows = getTableRowsFunc();

                    if (rows != null)
                    {
                        foreach (var row in rows)
                        {
                            row.InsertChild.TryInvoke(new PrintElementNode(row, "TableCell", new DynamicWrapper()));
                        }
                    }

                    return true;
                }

                return false;
            });
        }
        public static Func <PrintElementNode, bool> InsertChildToContainer(PrintElementNodeBuilder builder,
                                                                           ICollection <PrintElementNode> elements, PrintElementNode parentElementNode, string childElementContainer,
                                                                           bool wrapElementMetadata = true)
        {
            return(childElementNode =>
            {
                if (parentElementNode.CanInsertChild.TryInvoke(childElementNode))
                {
                    var oldChildElement = parentElementNode.Nodes.FirstOrDefault();

                    if (oldChildElement == null ||
                        Helpers.AcceptQuestionMessage(Resources.ReplaceElementQuestion, parentElementNode,
                                                      childElementNode))
                    {
                        // Создание метаданных нового дочернего элемента
                        object newChildElementMetadata = childElementNode.ElementMetadata ?? new DynamicWrapper();

                        // Добавление дочернего элемента в контейнер метаданных родительского элемента
                        parentElementNode.ElementMetadata[childElementContainer] = wrapElementMetadata
                            ? WrapElementMetadata(childElementNode.ElementType, newChildElementMetadata)
                            : newChildElementMetadata;

                        if (oldChildElement != null)
                        {
                            // Удаление старого дочернего элемента из визуального дерева элементов
                            parentElementNode.Nodes.RemoveItem(oldChildElement);
                            DeleteChildNodes(elements, oldChildElement);
                        }

                        // Добавление дочернего элемента в визуальное дерево элементов
                        builder.BuildElement(elements, parentElementNode, newChildElementMetadata,
                                             childElementNode.ElementType);

                        return true;
                    }
                }

                return false;
            });
        }
        private static void DeleteChildNodes(ICollection <PrintElementNode> elements, PrintElementNode parentElementNode)
        {
            elements.Remove(parentElementNode);

            foreach (var childElementNode in parentElementNode.Nodes)
            {
                DeleteChildNodes(elements, childElementNode);
            }
        }
        // Move

        public static Func <PrintElementNode, int, bool> CanMoveChild(PrintElementNode parentElementNode)
        {
            return((childElementNode, delta) => (childElementNode != null) && (parentElementNode.MoveChild != null));
        }
 private static Func <PrintElementNode, int, bool> MoveTableRow(PrintElementNode parentElementNode)
 {
     return(BuildHelper.MoveChildInCollection(parentElementNode, "Rows", false));
 }
        public static Func <PrintElementNode, bool> InsertChildToCollection(PrintElementNodeBuilder builder,
                                                                            ICollection <PrintElementNode> elements, PrintElementNode parentElementNode, string childElementCollection,
                                                                            bool wrapElementMetadata = true)
        {
            return(childElementNode =>
            {
                if (parentElementNode.CanInsertChild.TryInvoke(childElementNode))
                {
                    // Создание метаданных нового дочернего элемента
                    object newChildElementMetadata = childElementNode.ElementMetadata ?? new DynamicWrapper();

                    // Добавление дочернего элемента в коллекцию метаданных родительского элемента
                    var childElements = GetChildElementCollection(parentElementNode, childElementCollection, true);
                    childElements.AddItem(wrapElementMetadata
                        ? WrapElementMetadata(childElementNode.ElementType, newChildElementMetadata)
                        : newChildElementMetadata);

                    // Добавление дочернего элемента в визуальное дерево элементов
                    builder.BuildElement(elements, parentElementNode, newChildElementMetadata,
                                         childElementNode.ElementType);

                    return true;
                }

                return false;
            });
        }
Beispiel #22
0
 private static Func <string> BuildVisibility(PrintElementNode elementNode)
 {
     return(() => elementNode.ElementMetadata.Visibility as string);
 }
Beispiel #23
0
 private void OnTreeListSelectedItemChanged(object sender, SelectedItemChangedEventArgs e)
 {
     SelectedElement = e.NewItem as PrintElementNode;
 }
Beispiel #24
0
 public void Create(PrintElementNodeBuilder builder, ICollection <PrintElementNode> elements,
                    PrintElementNode elementNode)
 {
     builder.BuildElement(elements, elementNode, elementNode.ElementMetadata, "PrintViewStyles");
     builder.BuildElement(elements, elementNode, elementNode.ElementMetadata, "PrintViewBlocks");
 }
Beispiel #25
0
 private static Func <int> GetTableRowCellCount(PrintElementNode parentElementNode)
 {
     return(() => parentElementNode.Nodes.Count);
 }
        // Paste

        public static Func <bool> CanPaste(PrintElementNode parentElementNode)
        {
            return(() => (parentElementNode.Paste != null) && AppClipboard.Default.ContainsData <PrintElementNode>());
        }
Beispiel #27
0
 private void SelectElement(PrintElementNode element)
 {
     TreeList.SelectedItem = element;
 }
 private static Func <PrintElementNode> GetLastTableRow(PrintElementNode parentElementNode)
 {
     return(() => parentElementNode.Nodes.LastOrDefault());
 }
        private static Func <PrintElementNode, bool> InsertTableRow(PrintElementNodeBuilder builder,
                                                                    ICollection <PrintElementNode> elements, PrintElementNode parentElementNode)
        {
            // Добавление строки добавляет в нее недостающие ячейки или удаляет из нее лишние

            var getColumnCountFunc  = GetTableColumnCount(parentElementNode);
            var getLastTableRowFunc = GetLastTableRow(parentElementNode);
            var insertChildFunc     = BuildHelper.InsertChildToCollection(builder, elements, parentElementNode, "Rows",
                                                                          false);

            return(rowElementNode =>
            {
                if (insertChildFunc(rowElementNode))
                {
                    var insertedRow = getLastTableRowFunc();

                    if (insertedRow != null)
                    {
                        var columnCount = getColumnCountFunc();
                        var insertedRowCellCount = insertedRow.Nodes.Count;

                        // Добавление недостающих ячеек
                        if (insertedRowCellCount < columnCount)
                        {
                            for (var i = insertedRowCellCount; i < columnCount; ++i)
                            {
                                var cellNode = new PrintElementNode(insertedRow, "TableCell", new DynamicWrapper());

                                insertedRow.InsertChild.TryInvoke(cellNode);
                            }
                        }
                        // Удаление лишних ячеек
                        else if (insertedRowCellCount > columnCount)
                        {
                            for (var i = insertedRowCellCount - 1; i >= columnCount; --i)
                            {
                                var cellNode = insertedRow.Nodes[i];

                                insertedRow.DeleteChild.TryInvoke(cellNode, false);
                            }
                        }
                    }

                    return true;
                }

                return false;
            });
        }
        // Delete

        public static Func <PrintElementNode, bool, bool> CanDeleteChild(PrintElementNode parentElementNode)
        {
            return((childElementNode, accept) => (childElementNode != null) && (parentElementNode.DeleteChild != null));
        }