private static ContextMenu CreateReadonlyTextBoxContextMenu(CustomNodeTextBox textBox)
        {
            var menu        = new ContextMenu();
            var miCopyValue = new MenuItem("Copy");

            miCopyValue.Click += (sender, e) => textBox.Copy(textBox.EditorTextBox);
            menu.MenuItems.Add(miCopyValue);
            return(menu);
        }
        public void ReconfigureTreeColumns()
        {
            if (!DataLayer.IsConnected)
            {
                return;
            }

            tvWorkitems.HideEditor();
            tvWorkitems.Columns.Clear();
            tvWorkitems.NodeControls.Clear();
            columnToAttributeMappings.Clear();

            foreach (var column in configuration.GridSettings.Columns)
            {
                if (column.EffortTracking && !DataLayer.EffortTracking.TrackEffort)
                {
                    continue;
                }

                var dataPropertyName = DataLayer.LocalizerResolve(column.Name);

                columnToAttributeMappings.Add(dataPropertyName, column.Attribute);

                var treeColumn = new TreeColumn(dataPropertyName, column.Width)
                {
                    SortOrder = SortOrder.None, TooltipText = dataPropertyName
                };

                switch (column.Type)
                {
                case "String":
                case "Effort":
                    var textEditor = new CustomNodeTextBox();
                    ConfigureEditor(textEditor, dataPropertyName);
                    textEditor.EditEnabled               = !textEditor.IsReadOnly;
                    textEditor.IsColumnReadOnly          = column.ReadOnly;
                    textEditor.ParentColumn              = treeColumn;
                    textEditor.IsEditEnabledValueNeeded += CheckCellEditability;
                    tvWorkitems.NodeControls.Add(textEditor);
                    break;

                case "List":
                    var listEditor = new NodeComboBox();
                    ConfigureEditor(listEditor, dataPropertyName);
                    listEditor.EditEnabled               = !column.ReadOnly;
                    listEditor.ParentColumn              = treeColumn;
                    listEditor.IsEditEnabledValueNeeded += CheckCellEditability;
                    tvWorkitems.NodeControls.Add(listEditor);
                    break;

                case "Multi":
                    var listBoxEditor = new NodeListBox {
                        ParentTree = tvWorkitems
                    };
                    ConfigureEditor(listBoxEditor, dataPropertyName);
                    listBoxEditor.EditEnabled               = !column.ReadOnly;
                    listBoxEditor.ParentColumn              = treeColumn;
                    listBoxEditor.IsEditEnabledValueNeeded += CheckCellEditability;
                    tvWorkitems.NodeControls.Add(listBoxEditor);
                    break;

                default:
                    throw new NotSupportedException();
                }

                tvWorkitems.Columns.Add(treeColumn);
            }

            AddStateIcon();
        }