#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

175 lines
5.2 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// Description of ProjectBrowserPanel.
/// </summary>
public class ProjectBrowserPanel : System.Windows.Forms.UserControl
{
ToolStrip toolStrip;
ProjectBrowserControl projectBrowserControl;
ToolStripItem[] standardItems;
public AbstractProjectBrowserTreeNode SelectedNode {
get {
return projectBrowserControl.SelectedNode;
}
}
public AbstractProjectBrowserTreeNode RootNode {
get {
return projectBrowserControl.RootNode;
}
}
public ProjectBrowserControl ProjectBrowserControl {
get {
return projectBrowserControl;
}
}
public ProjectBrowserPanel()
{
projectBrowserControl = new ProjectBrowserControl();
projectBrowserControl.Dock = DockStyle.Fill;
Controls.Add(projectBrowserControl);
toolStrip = ToolbarService.CreateToolStrip(this, "/SharpDevelop/Pads/ProjectBrowser/ToolBar/Standard");
toolStrip.ShowItemToolTips = true;
toolStrip.Dock = DockStyle.Top;
toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
toolStrip.Stretch = true;
standardItems = new ToolStripItem[toolStrip.Items.Count];
toolStrip.Items.CopyTo(standardItems, 0);
Controls.Add(toolStrip);
projectBrowserControl.TreeView.BeforeSelect += TreeViewBeforeSelect;
}
void TreeViewBeforeSelect(object sender, TreeViewCancelEventArgs e)
{
UpdateToolStrip(e.Node as AbstractProjectBrowserTreeNode);
}
void UpdateToolStrip(AbstractProjectBrowserTreeNode node)
{
toolStrip.Items.Clear();
toolStrip.Items.AddRange(standardItems);
ToolbarService.UpdateToolbar(toolStrip);
if (node != null && node.ToolbarAddinTreePath != null) {
toolStrip.Items.Add(new ToolStripSeparator());
toolStrip.Items.AddRange((ToolStripItem[])AddInTree.BuildItems(node.ToolbarAddinTreePath, node, false).ToArray(typeof(ToolStripItem)));
}
}
public void ViewSolution(Solution solution)
{
UpdateToolStrip(null);
projectBrowserControl.ViewSolution(solution);
}
/// <summary>
/// Writes the current view state into the memento.
/// </summary>
public void StoreViewState(Properties memento)
{
memento.Set("ProjectBrowserState", GetViewStateString(projectBrowserControl.TreeView));
}
/// <summary>
/// Reads the view state from the memento.
/// </summary>
public void ReadViewState(Properties memento)
{
ApplyViewStateString(memento.Get("ProjectBrowserState", ""), projectBrowserControl.TreeView);
}
// example ViewStateString:
// [Main[ICSharpCode.SharpDevelop[Src[Gui[Pads[ProjectBrowser[]]]]Services[]]]]
// -> every node name is terminated by opening bracket
// -> only expanded nodes are included in the view state string
// -> after an opening bracket, an identifier or closing bracket must follow
// -> after a closing bracket, an identifier or closing bracket must follow
// -> nodes whose text contains '[' can not be saved
public static string GetViewStateString(TreeView treeView)
{
if (treeView.Nodes.Count == 0) return "";
StringBuilder b = new StringBuilder();
WriteViewStateString(b, treeView.Nodes[0]);
return b.ToString();
}
static void WriteViewStateString(StringBuilder b, TreeNode node)
{
b.Append('[');
foreach (TreeNode subNode in node.Nodes) {
if (subNode.IsExpanded && subNode.Text.IndexOf('[') < 0) {
b.Append(subNode.Text);
WriteViewStateString(b, subNode);
}
}
b.Append(']');
}
public static void ApplyViewStateString(string viewState, TreeView treeView)
{
if (viewState.Length == 0)
return;
int i = 0;
ApplyViewStateString(treeView.Nodes[0], viewState, ref i);
System.Diagnostics.Debug.Assert(i == viewState.Length - 1);
}
static void ApplyViewStateString(TreeNode node, string viewState, ref int pos)
{
if (viewState[pos++] != '[')
throw new ArgumentException("pos must point to '['");
// expect an identifier or an closing bracket
while (viewState[pos] != ']') {
StringBuilder nameBuilder = new StringBuilder();
char ch;
while ((ch = viewState[pos++]) != '[') {
nameBuilder.Append(ch);
}
pos -= 1; // go back to '[' character
string nodeText = nameBuilder.ToString();
// find the node in question
TreeNode subNode = null;
if (node != null) {
foreach (TreeNode n in node.Nodes) {
if (n.Text == nodeText) {
subNode = n;
break;
}
}
}
if (subNode != null) {
subNode.Expand();
}
ApplyViewStateString(subNode, viewState, ref pos);
// pos now points to the closing bracket of the inner view state
pos += 1; // move to next character
}
}
public void Clear()
{
projectBrowserControl.Clear();
UpdateToolStrip(null);
}
public void SelectFile(string fileName)
{
projectBrowserControl.SelectFile(fileName);
}
}
}