⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 projectbrowser.cs

📁 c#精彩编程百例(源代码)
💻 CS
字号:
//  ProjectBrowser.cs 
//  Copyright (C) 2000 Mike Krueger
//
//  This program is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

using System;
using System.IO;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using System.Collections;
using System.Xml;
using System.Resources;

using SharpDevelop.Internal.Project;
using SharpDevelop.Tool.Function;
using SharpDevelop.Tool.Data;
using SharpDevelop.Gui.Window;
using SharpDevelop.Gui.Dialogs;

namespace SharpDevelop.Gui.Navigation.ProjectBrowser {
	
	/// <summary>
	/// This class is the project scout tree view
	/// </summary>
	public class ProjectBrowser : TreeView
	{
		bool            combinemode = false; 
		Combine         combine     = null;
		MainWindow      mainwindow  = null;
		
		ProjectBrowserEventHandler eventhandler = null;
		
		string          projectfilename   = "";
		
		public Combine  Combine {
			get {
				return combine;
			}
		}
		
		public ISdProject Project {
			get {
				return combine.MasterProject;
			}
//			set {
//				project = value;
//				
//				if (project != null && project.Icons != null && project.Icons["ProjectIcon"] != null)
//					ImageList.Images[0] = (Bitmap)project.Icons["ProjectIcon"];
//				
//				PopulateTreeView();
//			}
		}
		
		public ProjectBrowser(MainWindow mainwindow)
		{
			
			this.mainwindow = mainwindow;
			
			LabelEdit     = true;
			HotTracking   = true;
			AllowDrop     = true;
			HideSelection = false;
			
			InitImageList();
			eventhandler = new ProjectBrowserEventHandler(mainwindow, this);
		}
		
		void InitImageList()
		{
			ImageList imglist = new ImageList();

			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.SolutionIcon"));
			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.ClosedFolderBitmap"));
			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.OpenFolderBitmap"));
			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.ClosedReferenceFolder"));
			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.OpenReferenceFolder"));
			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.SolutionIcon"));
			imglist.Images.Add(Resource.GetBitmap("Icons.16x16.Reference"));
			
			foreach (Image img in FileUtility.ImageList.Images)
				imglist.Images.Add(img);
			
			ImageList = imglist;
		}
		
		ProjectBrowserNode GetNodeFromCollection(TreeNodeCollection collection, string title)
		{
			foreach (ProjectBrowserNode node in collection)
				if (node.Name == title)
					return node;
			return null;
		}
		
		void ConvertTreeToProject(ProjectBrowserNode node)
		{
			switch (node.ProjectNodeType) {
				case ProjectNodeType.Project:
					node.Project.Files.Clear();
					node.Project.Directories.Clear();
					node.Project.References.Clear();
					goto default;
					
				case ProjectNodeType.Reference:
					node.Project.References.Add(node.FileName);
					break;
					
				case ProjectNodeType.ResourceFile:
				case ProjectNodeType.TextFile:
					node.Project.Files.Add(node.FileName);
					break;
				
				default:					
					if (node.Nodes.Count == 0 && node.ProjectNodeType == ProjectNodeType.Folder)
						node.Project.Directories.Add(node.FileName);
					else
					foreach (ProjectBrowserNode childnode in node.Nodes)
						ConvertTreeToProject(childnode);
					break;
			}
		}
		
		public ProjectBrowserNode GetPath(string filename, ProjectBrowserNode root, bool create)
		{
			string directory    = Path.GetDirectoryName(filename);
			string[] treepath   = directory.Split(new char[] { '\\' });
			ProjectBrowserNode curpathnode = root;
			foreach (string path in treepath) {
				if (path.Length == 0) // TODO : find out, where this bug is from
					continue;
				ProjectBrowserNode node = GetNodeFromCollection(curpathnode.Nodes, path);
				if (node == null) {
					if (create) {
						ProjectBrowserNode newnode = new ProjectBrowserNode(curpathnode.Project, ProjectNodeType.Folder, path);
						curpathnode.Nodes.Add(newnode);
						curpathnode = newnode;
						continue;
					} else {
						return null;
					}
				}
				curpathnode = node;
			}
			return curpathnode;
		}
		
		void AddProjectTree(ISdProject project)
		{
			ProjectBrowserNode projectnode   = new ProjectBrowserNode(project, ProjectNodeType.Project, project.Name);
			ProjectBrowserNode resfilenode   = new ProjectBrowserNode(project, ProjectNodeType.ResourceFolder, Resource.GetString("ProjectComponent.ResourceFilesString"));
			ProjectBrowserNode referencefilenode = new ProjectBrowserNode(project, ProjectNodeType.ReferenceFolder, "References");
			
			projectnode.Nodes.Add(resfilenode);
			projectnode.Nodes.Add(referencefilenode);
			
			for (int i = 0; i < project.Directories.Count; ++i) {
				string relativefile = FileUtility.MakeRelative(project.Directories[i].ToString(), project.WorkingDirectory);
				string filename     = Path.GetFileName(project.Directories[i].ToString());
				ProjectBrowserNode curpathnode = GetPath(relativefile, projectnode, true);
				curpathnode.Nodes.Add(new ProjectBrowserNode(project, ProjectNodeType.Folder, filename));
			}
			
			for (int i = 0; i < project.Files.Count; ++i) {
				string relativefile = FileUtility.MakeRelative(project.Files[i].ToString(), project.WorkingDirectory);
				
				string filename     = Path.GetFileName(project.Files[i].ToString());
				
				
				FileType filetype = FSTypeUtility.GetFileType(filename);
				switch (filetype) {
					case FileType.Resource:
						resfilenode.Nodes.Add(new ProjectBrowserNode(project, ProjectNodeType.ResourceFile, filename));
						break;
					
					default:
						ProjectBrowserNode curpathnode = GetPath(relativefile, projectnode, true);
						curpathnode.Nodes.Add(new ProjectBrowserNode(project, filename));
						break;
				}
			}
			
			for (int i = 0; i < project.References.Count; ++i) {
				string filename = Path.GetFileName(project.References[i].ToString());
				referencefilenode.Nodes.Add(new ProjectBrowserNode(project, ProjectNodeType.Reference, filename));
			}
			
			Nodes.Add(projectnode);
		}
		
		void PopulateTreeView()
		{
			Nodes.Clear();
			
			if (combine == null)
				return;
			
			foreach (ISdProject project in combine.Projects) 
				AddProjectTree(project);
		}
		
		public void NewProject()
		{
			projectfilename = null;
			Nodes.Clear();
		}
		
		public void OpenCombine(string filename)
		{
			if (!FSTypeUtility.TestFileExists(filename))
				return;
			
			projectfilename = filename;
			combinemode = true;
			combine = new Combine();
			combine.LoadCombine(filename);
			PopulateTreeView();
		}
		
		public void OpenProject(string filename)
		{
			if (!FSTypeUtility.TestFileExists(filename))
				return;
			projectfilename = filename;
			combinemode = false;
			combine = new Combine();
			ISdProject project = combine.AddProject(filename, 1);
			if (project == null) {
				NewProject();
				return;
			}
			combine.MasterProjectName = project.Name;
			PopulateTreeView();
		}
		
		public void AddProject(string filename)
		{
			if (!combinemode)
				projectfilename = null;
			if (!FSTypeUtility.TestFileExists(filename))
				return;
			combinemode = true;
			AddProjectTree(combine.AddProject(filename, 1));
		}
		
		public void SaveProject(string filename)
		{
			if (combinemode) {
				combine.SaveCombine(filename);
				combine.SaveAllProjects();
			} else {
				foreach (ProjectBrowserNode node in Nodes)
					ConvertTreeToProject(node);
				combine.SaveProject(Project.Name, filename);
			}
		}
		
		public void SaveProject()
		{
			if (projectfilename == null) {
				SaveFileDialog fdiag = new SaveFileDialog();
				
				fdiag.OverwritePrompt = true;
				fdiag.AddExtension    = true;
				fdiag.Filter          = Resource.GetString("ProjectComponent.SaveProjectFileFilter");
				
				if (fdiag.ShowDialog() == DialogResult.OK) {
					MessageBox.Show(fdiag.FileName, Resource.GetString("ProjectComponent.ProjectFileSaveMessage"), MessageBoxButtons.OK);
					projectfilename = fdiag.FileName;
				} else {
					fdiag.Dispose();
					return;
				}
				fdiag.Dispose();
			} 
			SaveProject(projectfilename);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -