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();
}
}
}