using System; using System.Drawing; using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Controls; using Core.Common.Gui; using Core.Common.Utils.Aop; using Core.Plugins.ProjectExplorer.NodePresenters; using TreeView = Core.Common.Controls.Swf.TreeViewControls.TreeView; namespace Core.Plugins.ProjectExplorer { /// /// TODO: extract Clipboard-related methods into Ringtoets Clipboard class /// public partial class ProjectTreeView : UserControl, IView { private readonly TreeView treeView; private GuiPlugin guiPlugin; private ApplicationCore applicationCore; private IGui gui; private Project project; private bool selectingNode; public ProjectTreeView(GuiPlugin guiPlugin) : this() { GuiPlugin = guiPlugin; } public ProjectTreeView() { InitializeComponent(); treeView = new TreeView { AllowDrop = true }; treeView.NodeMouseClick += TreeViewNodeMouseClick; treeView.DoubleClick += TreeViewDoubleClick; treeView.SelectedNodeChanged += TreeViewSelectedNodeChanged; treeView.Dock = DockStyle.Fill; treeView.OnProcessCmdKey = OnProcessCmdKey; Controls.Add(treeView); } public GuiPlugin GuiPlugin { get { return guiPlugin; } set { guiPlugin = value; applicationCore = guiPlugin.Gui.ApplicationCore; gui = guiPlugin.Gui; gui.SelectionChanged += GuiSelectionChanged; // nodepresenters alter default behaviour of treeview to suite project dataobject var projectNodePresenter = new ProjectNodePresenter(guiPlugin); var treeFolderNodePresenter = new TreeFolderNodePresenter(guiPlugin); treeView.NodePresenters.Add(projectNodePresenter); treeView.NodePresenters.Add(treeFolderNodePresenter); } } public ITreeView TreeView { get { return treeView; } } public Project Project { get { return project; } set { Data = value; } } public object Data { get { return project; } set { if (IsDisposed) //only set value in case form is not disposed. { return; } if (project != null) { UnsubscribeProjectEvents(); } project = value as Project; treeView.Data = project; if (project != null) { SubscribeProjectEvents(); } } } public Image Image { get; set; } public ViewInfo ViewInfo { get; set; } public ContextMenuStrip GetContextMenu(object nodeTag) { //TODO: let go of menu's here but compose a menu on the fly based on selection. if (nodeTag is Project) { buttonFolderAdd.Enabled = true; buttonFolderAddNewItem.Enabled = applicationCore.GetSupportedDataItemInfos(nodeTag).Any(); buttonFolderDelete.Available = treeView.SelectedNodeCanDelete(); buttonFolderRename.Enabled = treeView.SelectedNodeCanRename(); buttonFolderImportFolder.Enabled = gui.CommandHandler.CanImportToGuiSelection(); return contextMenuProject; } return null; } public new void Dispose() { if (gui != null) { gui.SelectionChanged -= GuiSelectionChanged; } if (applicationCore != null) { UnsubscribeProjectEvents(); } treeView.Data = null; treeView.Dispose(); base.Dispose(); applicationCore = null; } public void EnsureVisible(object item) {} /// /// Update selected node when selection in gui changes. /// /// /// [InvokeRequired] protected virtual void GuiSelectionChanged(object sender, EventArgs e) { if (selectingNode || gui.Selection == null || (treeView.SelectedNode != null && treeView.SelectedNode.Tag == gui.Selection)) { return; } ITreeNode node = treeView.GetNodeByTag(gui.Selection); if (node != null) { ((ITreeView) treeView).SelectedNode = node; } } private void TreeViewSelectedNodeChanged(object sender, EventArgs e) { selectingNode = true; var tag = treeView.SelectedNode != null ? treeView.SelectedNode.Tag : null; gui.Selection = tag; selectingNode = false; } private bool OnProcessCmdKey(Keys keyData) { if (treeView.SelectedNode == null) { return false; } var control = (keyData & Keys.Control) == Keys.Control; var alt = (keyData & Keys.Alt) == Keys.Alt; if (keyData == Keys.Enter) { gui.CommandHandler.OpenViewForSelection(); return true; } if (keyData == Keys.Delete) { treeView.TryDeleteSelectedNodeData(); return true; } if (control) {} if (keyData == Keys.Escape) { if (gui.DocumentViews.ActiveView != null) { ((Control) gui.DocumentViews.ActiveView).Focus(); } return true; } return false; } private void TreeViewNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { treeView.SelectedNode = ((ITreeNode) e.Node); } private void SubscribeProjectEvents() { gui.ProjectOpened += ApplicationCoreProjectOpened; } private void UnsubscribeProjectEvents() { if (project != null) { gui.ProjectOpened -= ApplicationCoreProjectOpened; } } private void ApplicationCoreProjectOpened(Project project) { Project = project; } private void buttonsAddNewDataClick(object sender, EventArgs e) { gui.CommandHandler.AddNewItem(gui.Selection); } /// /// Delete dataitem from the project. /// /// /// private void deleteMenuItemClick(object sender, EventArgs e) { treeView.TryDeleteSelectedNodeData(); } private void TreeViewDoubleClick(object sender, EventArgs e) { if (!Equals(gui.Selection, TreeView.SelectedNode.Tag)) { // Necessary if WinForms skips single click event (see TOOLS-8722)... gui.Selection = TreeView.SelectedNode.Tag; } gui.CommandHandler.OpenViewForSelection(); } private void buttonFolderImportClick(object sender, EventArgs e) { gui.CommandHandler.ImportToGuiSelection(); } private void buttonsRenameClick(object sender, EventArgs e) { treeView.StartLabelEdit(); } private void buttonsPropertiesClick(object sender, EventArgs e) { gui.CommandHandler.ShowProperties(); } private void ButtonExportClick(object sender, EventArgs e) { gui.CommandHandler.ExportSelectedItem(); } private void buttonFolderExpandAll_Click(object sender, EventArgs e) { treeView.ExpandAll(treeView.SelectedNode); } private void buttonFolderCollapseAll_Click(object sender, EventArgs e) { treeView.CollapseAll(treeView.SelectedNode); } ~ProjectTreeView() { if (gui == null) { return; } gui.SelectionChanged -= GuiSelectionChanged; UnsubscribeProjectEvents(); } } }