Browse Source

Fixed moving linked files in the project pad and other minor bugs.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@783 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
2e13b56e1d
  1. 16
      src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs
  2. 28
      src/AddIns/Misc/NAntAddIn/Project/Src/Gui/NAntPadContent.cs
  3. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Resources/Boo.xshd
  4. 3
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs
  5. 21
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs
  6. 159
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
  7. 11
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs
  8. 4
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs
  9. 9
      src/Main/Base/Project/Src/Project/Items/ProjectItem.cs
  10. 73
      src/Main/Base/Project/Src/Project/Solution/Solution.cs
  11. 17
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
  12. 18
      src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs

16
src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs

@ -168,19 +168,9 @@ namespace ICSharpCode.FormDesigner.Services
IProject GetProject() IProject GetProject()
{ {
if (_project != null) if (_project == null)
return _project; _project = ProjectService.GetProject(FileName);
if (ProjectService.OpenSolution != null) { return _project;
LoggingService.Warn(FileName);
foreach (IProject project in ProjectService.OpenSolution.Projects) {
if (project.IsFileInProject(FileName)) {
LoggingService.Warn("use project " + project.Name);
_project = project;
return project;
}
}
}
return null;
} }
#region System.ComponentModel.Design.IResourceService interface implementation #region System.ComponentModel.Design.IResourceService interface implementation

28
src/AddIns/Misc/NAntAddIn/Project/Src/Gui/NAntPadContent.cs

@ -211,38 +211,12 @@ namespace ICSharpCode.NAntAddIn.Gui
void AddBuildFile(string fileName) void AddBuildFile(string fileName)
{ {
IProject project = FindProjectContainingFile(fileName); IProject project = ProjectService.GetProject(fileName);
if (project != null) { if (project != null) {
treeView.AddBuildFile(project.Name, fileName); treeView.AddBuildFile(project.Name, fileName);
} }
} }
IProject FindProjectContainingFile(string fileName)
{
// Try selected project first.
IProject project = ProjectService.CurrentProject;
if (project != null) {
if (!project.IsFileInProject(fileName)) {
// Try all project's in the solution.
project = FindProjectContainingFile(fileName, ProjectService.OpenSolution);
}
}
return project;
}
IProject FindProjectContainingFile(string fileName, Solution solution)
{
foreach (IProject project in solution.Projects) {
if (project.IsFileInProject(fileName)) {
return project;
}
}
return null;
}
void ProjectItemAdded(object sender, ProjectItemEventArgs e) void ProjectItemAdded(object sender, ProjectItemEventArgs e)
{ {
LoggingService.Debug("ProjectItemAdded."); LoggingService.Debug("ProjectItemAdded.");

2
src/Libraries/ICSharpCode.TextEditor/Project/Resources/Boo.xshd

@ -271,7 +271,7 @@
<Key word="mixin"/> <Key word="mixin"/>
<Key word="callable"/> <Key word="callable"/>
<Key word="do" /> <Key word="do" />
<Key word="of" > <Key word="of" />
</KeyWords> </KeyWords>
</RuleSet> </RuleSet>

3
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs

@ -107,7 +107,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public class IncludeFileInProject : AbstractMenuCommand public class IncludeFileInProject : AbstractMenuCommand
{ {
public static void IncludeFileNode(FileNode fileNode) public static FileProjectItem IncludeFileNode(FileNode fileNode)
{ {
if (fileNode.Parent is FileNode) { if (fileNode.Parent is FileNode) {
if (((FileNode)fileNode.Parent).FileNodeStatus != FileNodeStatus.InProject) { if (((FileNode)fileNode.Parent).FileNodeStatus != FileNodeStatus.InProject) {
@ -134,6 +134,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
((ExtTreeNode)fileNode.Parent).UpdateVisibility(); ((ExtTreeNode)fileNode.Parent).UpdateVisibility();
} }
fileNode.Project.Save(); fileNode.Project.Save();
return newItem;
} }
public static ItemType GetDefaultItemType(IProject project, string fileName) public static ItemType GetDefaultItemType(IProject project, string fileName)

21
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs

@ -38,16 +38,18 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
return 0; return 0;
} }
public static void CopyDirectory(string directoryName, DirectoryNode node) public static void CopyDirectory(string directoryName, DirectoryNode node, bool includeInProject)
{ {
string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(directoryName)); string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(directoryName));
if (!FileUtility.IsEqualFileName(directoryName, copiedFileName)) { if (!FileUtility.IsEqualFileName(directoryName, copiedFileName)) {
FileUtility.DeepCopy(directoryName, copiedFileName, true); FileUtility.DeepCopy(directoryName, copiedFileName, true);
DirectoryNode newNode = new DirectoryNode(copiedFileName); DirectoryNode newNode = new DirectoryNode(copiedFileName);
newNode.AddTo(node); newNode.AddTo(node);
if (includeInProject) {
IncludeFileInProject.IncludeDirectoryNode(newNode, false);
}
newNode.Expanding(); newNode.Expanding();
IncludeFileInProject.IncludeDirectoryNode(newNode, true); } else if (includeInProject) {
} else {
foreach (TreeNode childNode in node.Nodes) { foreach (TreeNode childNode in node.Nodes) {
if (childNode is DirectoryNode) { if (childNode is DirectoryNode) {
DirectoryNode directoryNode = (DirectoryNode)childNode; DirectoryNode directoryNode = (DirectoryNode)childNode;
@ -59,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
} }
} }
public static void CopyFile(string fileName, DirectoryNode node, bool includeInProject) public static FileProjectItem CopyFile(string fileName, DirectoryNode node, bool includeInProject)
{ {
string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fileName)); string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fileName));
if (!FileUtility.IsEqualFileName(fileName, copiedFileName)) { if (!FileUtility.IsEqualFileName(fileName, copiedFileName)) {
@ -67,7 +69,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
FileNode newNode = new FileNode(copiedFileName); FileNode newNode = new FileNode(copiedFileName);
newNode.AddTo(node); newNode.AddTo(node);
if (includeInProject) { if (includeInProject) {
IncludeFileInProject.IncludeFileNode(newNode); return IncludeFileInProject.IncludeFileNode(newNode);
} }
} else if (includeInProject) { } else if (includeInProject) {
FileNode fileNode; FileNode fileNode;
@ -75,16 +77,15 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
if (childNode is FileNode) { if (childNode is FileNode) {
fileNode = (FileNode)childNode; fileNode = (FileNode)childNode;
if (FileUtility.IsEqualFileName(fileNode.FileName, copiedFileName)) { if (FileUtility.IsEqualFileName(fileNode.FileName, copiedFileName)) {
IncludeFileInProject.IncludeFileNode(fileNode); return IncludeFileInProject.IncludeFileNode(fileNode);
return;
} }
} }
} }
fileNode = new FileNode(fileName); fileNode = new FileNode(fileName);
fileNode.AddTo(node); fileNode.AddTo(node);
IncludeFileInProject.IncludeFileNode(fileNode); return IncludeFileInProject.IncludeFileNode(fileNode);
} }
return null;
} }
public override void Run() public override void Run()
@ -124,7 +125,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
FileNode fileNode = new FileNode(relFileName, FileNodeStatus.InProject); FileNode fileNode = new FileNode(relFileName, FileNodeStatus.InProject);
FileProjectItem fileProjectItem = new FileProjectItem(node.Project, IncludeFileInProject.GetDefaultItemType(node.Project, fileName)); FileProjectItem fileProjectItem = new FileProjectItem(node.Project, IncludeFileInProject.GetDefaultItemType(node.Project, fileName));
fileProjectItem.Include = relFileName; fileProjectItem.Include = relFileName;
fileProjectItem.Properties.Set("Link", Path.GetFileName(fileName)); fileProjectItem.Properties.Set("Link", Path.Combine(node.RelativePath, Path.GetFileName(fileName)));
fileNode.ProjectItem = fileProjectItem; fileNode.ProjectItem = fileProjectItem;
fileNode.AddTo(node); fileNode.AddTo(node);
ProjectService.AddProjectItem(node.Project, fileProjectItem); ProjectService.AddProjectItem(node.Project, fileProjectItem);

159
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs

@ -11,12 +11,12 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Project.Commands;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project namespace ICSharpCode.SharpDevelop.Project
{ {
[Serializable]
public class FileOperationClipboardObject : System.MarshalByRefObject public class FileOperationClipboardObject : System.MarshalByRefObject
{ {
string fileName; string fileName;
@ -36,6 +36,23 @@ namespace ICSharpCode.SharpDevelop.Project
this.fileName = fileName; this.fileName = fileName;
this.performMove = performMove; this.performMove = performMove;
} }
public static IDataObject CreateDataObject(FileNode node, bool performMove)
{
return new DataObject(typeof(FileNode).ToString(), new FileOperationClipboardObject(node.FileName, performMove));
}
public static IDataObject CreateDataObject(SolutionItemNode node, bool performMove)
{
return new DataObject(typeof(SolutionItemNode).ToString(),
new FileOperationClipboardObject(node.FileName, performMove));
}
public static IDataObject CreateDataObject(DirectoryNode node, bool performMove)
{
return new DataObject(typeof(DirectoryNode).ToString(),
new FileOperationClipboardObject(node.Directory, performMove));
}
} }
public enum SpecialFolder { public enum SpecialFolder {
@ -213,6 +230,23 @@ namespace ICSharpCode.SharpDevelop.Project
SetIcon(); SetIcon();
} }
void RecreateSubNodes()
{
if (autoClearNodes) {
Nodes.Clear();
} else {
List<TreeNode> removedNodes = new List<TreeNode>();
foreach (TreeNode node in Nodes) {
if (node is FileNode || node is DirectoryNode)
removedNodes.Add(node);
}
foreach (TreeNode node in removedNodes) {
Nodes.Remove(node);
}
}
Initialize();
}
protected override void Initialize() protected override void Initialize()
{ {
if (removeMe != null) { if (removeMe != null) {
@ -458,31 +492,27 @@ namespace ICSharpCode.SharpDevelop.Project
foreach (string fileName in files) { foreach (string fileName in files) {
if (System.IO.Directory.Exists(fileName)) { if (System.IO.Directory.Exists(fileName)) {
if (!FileUtility.IsBaseDirectory(fileName, Directory)) { if (!FileUtility.IsBaseDirectory(fileName, Directory)) {
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyDirectory(fileName, this); CopyDirectoryHere(fileName, false);
} }
} else { } else {
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyFile(fileName, this, true); CopyFileHere(fileName, false);
} }
} }
} else if (dataObject.GetDataPresent(typeof(FileNode))) { } else if (dataObject.GetDataPresent(typeof(FileNode))) {
FileOperationClipboardObject clipboardObject = (FileOperationClipboardObject)dataObject.GetData(typeof(FileNode).ToString()); FileOperationClipboardObject clipboardObject = (FileOperationClipboardObject)dataObject.GetData(typeof(FileNode).ToString());
if (File.Exists(clipboardObject.FileName)) { if (File.Exists(clipboardObject.FileName)) {
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyFile(clipboardObject.FileName, this, true); CopyFileHere(clipboardObject.FileName, clipboardObject.PerformMove);
if (clipboardObject.PerformMove) { if (clipboardObject.PerformMove) {
string copiedFileName = Path.Combine(Directory, Path.GetFileName(clipboardObject.FileName)); dataObject.SetData(null);
if (!FileUtility.IsEqualFileName(clipboardObject.FileName, copiedFileName)) {
FileService.RemoveFile(clipboardObject.FileName, false);
}
} }
} }
} else if (dataObject.GetDataPresent(typeof(DirectoryNode))) { } else if (dataObject.GetDataPresent(typeof(DirectoryNode))) {
FileOperationClipboardObject clipboardObject = (FileOperationClipboardObject)dataObject.GetData(typeof(DirectoryNode).ToString()); FileOperationClipboardObject clipboardObject = (FileOperationClipboardObject)dataObject.GetData(typeof(DirectoryNode).ToString());
if (System.IO.Directory.Exists(clipboardObject.FileName)) { if (System.IO.Directory.Exists(clipboardObject.FileName)) {
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyDirectory(clipboardObject.FileName, this); CopyDirectoryHere(clipboardObject.FileName, clipboardObject.PerformMove);
if (clipboardObject.PerformMove) { if (clipboardObject.PerformMove) {
FileService.RemoveFile(clipboardObject.FileName, true);
dataObject.SetData(null); dataObject.SetData(null);
} }
} }
@ -490,6 +520,87 @@ namespace ICSharpCode.SharpDevelop.Project
ProjectService.SaveSolution(); ProjectService.SaveSolution();
} }
public void CopyDirectoryHere(string fileName, bool performMove)
{
AddExistingItemsToProject.CopyDirectory(fileName, this, true);
if (performMove) {
FileService.RemoveFile(fileName, true);
}
}
public void CopyDirectoryHere(DirectoryNode node, bool performMove)
{
if (node.FileNodeStatus == FileNodeStatus.None) {
AddExistingItemsToProject.CopyDirectory(node.Directory, this, true);
if (performMove) {
FileService.RemoveFile(node.Directory, true);
}
} else {
CopyDirectoryHere(node.Directory, performMove);
}
}
public void CopyFileHere(string fileName, bool performMove)
{
string shortFileName = Path.GetFileName(fileName);
string copiedFileName = Path.Combine(Directory, shortFileName);
if (FileUtility.IsEqualFileName(fileName, copiedFileName))
return;
FileProjectItem newItem = AddExistingItemsToProject.CopyFile(fileName, this, true);
IProject sourceProject = Solution.FindProjectContainingFile(fileName);
if (sourceProject != null) {
string sourceDirectory = Path.GetDirectoryName(fileName);
bool dependendElementsCopied = false;
foreach (ProjectItem item in sourceProject.Items.ToArray()) {
FileProjectItem fileItem = item as FileProjectItem;
if (fileItem == null)
continue;
if (newItem != null && FileUtility.IsEqualFileName(fileItem.FileName, fileName)) {
fileItem.CopyExtraPropertiesTo(newItem);
}
if (!string.Equals(fileItem.DependentUpon, shortFileName, StringComparison.OrdinalIgnoreCase))
continue;
string itemPath = Path.Combine(sourceProject.Directory, fileItem.VirtualName);
if (!FileUtility.IsEqualFileName(sourceDirectory, Path.GetDirectoryName(itemPath)))
continue;
// this file is dependend on the file being copied/moved: copy it, too
CopyFileHere(itemPath, performMove);
dependendElementsCopied = true;
}
if (dependendElementsCopied)
RecreateSubNodes();
}
if (performMove) {
FileService.RemoveFile(fileName, false);
}
}
public void CopyFileHere(FileNode node, bool performMove)
{
if (node.FileNodeStatus == FileNodeStatus.None) {
AddExistingItemsToProject.CopyFile(node.FileName, this, false);
if (performMove) {
FileService.RemoveFile(node.FileName, false);
}
} else if (node.IsLink) {
string relFileName = FileUtility.GetRelativePath(Project.Directory, node.FileName);
FileNode fileNode = new FileNode(relFileName, FileNodeStatus.InProject);
FileProjectItem fileProjectItem = new FileProjectItem(Project, IncludeFileInProject.GetDefaultItemType(Project, node.FileName));
fileProjectItem.Include = relFileName;
fileProjectItem.Properties.Set("Link", Path.Combine(RelativePath, Path.GetFileName(node.FileName)));
fileNode.ProjectItem = fileProjectItem;
fileNode.AddTo(this);
ProjectService.AddProjectItem(Project, fileProjectItem);
if (performMove) {
ProjectService.RemoveProjectItem(node.Project, node.ProjectItem);
node.Remove();
}
} else {
CopyFileHere(node.FileName, performMove);
}
}
public override bool EnableCopy { public override bool EnableCopy {
get { get {
return true; return true;
@ -497,7 +608,7 @@ namespace ICSharpCode.SharpDevelop.Project
} }
public override void Copy() public override void Copy()
{ {
ClipboardWrapper.SetDataObject(new DataObject(typeof(DirectoryNode).ToString(), new FileOperationClipboardObject(Directory, false))); ClipboardWrapper.SetDataObject(FileOperationClipboardObject.CreateDataObject(this, false));
} }
public override bool EnableCut { public override bool EnableCut {
@ -509,7 +620,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void Cut() public override void Cut()
{ {
DoPerformCut = true; DoPerformCut = true;
ClipboardWrapper.SetDataObject(new DataObject(typeof(DirectoryNode).ToString(), new FileOperationClipboardObject(Directory, true))); ClipboardWrapper.SetDataObject(FileOperationClipboardObject.CreateDataObject(this, true));
} }
#endregion #endregion
@ -556,29 +667,23 @@ namespace ICSharpCode.SharpDevelop.Project
PerformInitialization(); PerformInitialization();
Expand(); Expand();
try { try {
if (dataObject.GetDataPresent(DataFormats.FileDrop)) { if (dataObject.GetDataPresent(typeof(FileNode))) {
FileNode fileNode = (FileNode)dataObject.GetData(typeof(FileNode));
CopyFileHere(fileNode, effect == DragDropEffects.Move);
} else if (dataObject.GetDataPresent(typeof(DirectoryNode))) {
DirectoryNode directoryNode = (DirectoryNode)dataObject.GetData(typeof(DirectoryNode));
CopyDirectoryHere(directoryNode, effect == DragDropEffects.Move);
} else if (dataObject.GetDataPresent(DataFormats.FileDrop)) {
string[] files = (string[])dataObject.GetData(DataFormats.FileDrop); string[] files = (string[])dataObject.GetData(DataFormats.FileDrop);
foreach (string fileName in files) { foreach (string fileName in files) {
if (System.IO.Directory.Exists(fileName)) { if (System.IO.Directory.Exists(fileName)) {
if (!FileUtility.IsBaseDirectory(fileName, Directory)) { if (!FileUtility.IsBaseDirectory(fileName, Directory)) {
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyDirectory(fileName, this); CopyDirectoryHere(fileName, false);
} }
} else { } else {
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyFile(fileName, this, true); CopyFileHere(fileName, false);
} }
} }
} else if (dataObject.GetDataPresent(typeof(FileNode))) {
FileNode fileNode = (FileNode)dataObject.GetData(typeof(FileNode));
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyFile(fileNode.FileName, this, fileNode.FileNodeStatus != FileNodeStatus.None);
if (effect == DragDropEffects.Move) {
FileService.RemoveFile(fileNode.FileName, false);
}
} else if (dataObject.GetDataPresent(typeof(DirectoryNode))) {
DirectoryNode directoryNode = (DirectoryNode)dataObject.GetData(typeof(DirectoryNode));
ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToProject.CopyDirectory(directoryNode.Directory, this);
if (effect == DragDropEffects.Move) {
FileService.RemoveFile(directoryNode.Directory, true);
}
} }
ProjectService.SaveSolution(); ProjectService.SaveSolution();

11
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs

@ -66,6 +66,11 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
} }
public bool IsLink {
get {
return projectItem is FileProjectItem && (projectItem as FileProjectItem).IsLink;
}
}
void SetIcon() void SetIcon()
{ {
switch (fileNodeStatus) { switch (fileNodeStatus) {
@ -73,7 +78,7 @@ namespace ICSharpCode.SharpDevelop.Project
SetIcon("ProjectBrowser.GhostFile"); SetIcon("ProjectBrowser.GhostFile");
break; break;
case FileNodeStatus.InProject: case FileNodeStatus.InProject:
if (projectItem is FileProjectItem && (projectItem as FileProjectItem).IsLink) if (IsLink)
SetIcon("ProjectBrowser.CodeBehind"); SetIcon("ProjectBrowser.CodeBehind");
else else
SetIcon(IconService.GetImageForFile(FileName)); SetIcon(IconService.GetImageForFile(FileName));
@ -198,7 +203,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void Copy() public override void Copy()
{ {
ClipboardWrapper.SetDataObject(new DataObject(typeof(FileNode).ToString(), new FileOperationClipboardObject(FileName, false))); ClipboardWrapper.SetDataObject(FileOperationClipboardObject.CreateDataObject(this, false));
} }
public override bool EnableCut { public override bool EnableCut {
@ -210,7 +215,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void Cut() public override void Cut()
{ {
DoPerformCut = true; DoPerformCut = true;
ClipboardWrapper.SetDataObject(new DataObject(typeof(FileNode).ToString(), new FileOperationClipboardObject(FileName, true))); ClipboardWrapper.SetDataObject(FileOperationClipboardObject.CreateDataObject(this, true));
} }

4
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs

@ -101,7 +101,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void Copy() public override void Copy()
{ {
DoPerformCut = true; DoPerformCut = true;
ClipboardWrapper.SetDataObject(new DataObject(typeof(SolutionItemNode).ToString(), new FileOperationClipboardObject(Path.Combine(Solution.Directory, item.Name), false))); ClipboardWrapper.SetDataObject(FileOperationClipboardObject.CreateDataObject(this, false));
} }
public override bool EnableCut { public override bool EnableCut {
@ -113,7 +113,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void Cut() public override void Cut()
{ {
DoPerformCut = true; DoPerformCut = true;
ClipboardWrapper.SetDataObject(new DataObject(typeof(SolutionItemNode).ToString(), new FileOperationClipboardObject(Path.Combine(Solution.Directory, item.Name), true))); ClipboardWrapper.SetDataObject(FileOperationClipboardObject.CreateDataObject(this, true));
} }
#endregion #endregion

9
src/Main/Base/Project/Src/Project/Items/ProjectItem.cs

@ -75,6 +75,13 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
public virtual void CopyExtraPropertiesTo(ProjectItem item)
{
string newInclude = item.Include;
item.Properties.Merge(this.Properties);
item.Include = newInclude;
}
[Browsable(false)] [Browsable(false)]
public PropertyGroup Properties { public PropertyGroup Properties {
get { get {
@ -148,7 +155,7 @@ namespace ICSharpCode.SharpDevelop.Project
} }
while (reader.Read()) { while (reader.Read()) {
switch (reader.NodeType) { switch (reader.NodeType) {
case XmlNodeType.EndElement: case XmlNodeType.EndElement:
if (reader.LocalName == "ItemGroup") { if (reader.LocalName == "ItemGroup") {
return; return;
} }

73
src/Main/Base/Project/Src/Project/Solution/Solution.cs

@ -28,17 +28,27 @@ namespace ICSharpCode.SharpDevelop.Project
string fileName = String.Empty; string fileName = String.Empty;
public class ProjectEnumerator { public IProject FindProjectContainingFile(string fileName)
Solution solution; {
public ProjectEnumerator(Solution solution) IProject currentProject = ProjectService.CurrentProject;
{ if (currentProject != null && currentProject.IsFileInProject(fileName))
this.solution = solution; return currentProject;
// Try all project's in the solution.
foreach (IProject project in Projects) {
if (project.IsFileInProject(fileName)) {
return project;
}
} }
public IEnumerator<IProject> GetEnumerator() return null;
{ }
[Browsable(false)]
public IEnumerable<IProject> Projects {
get {
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>(); Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>();
foreach (ISolutionFolder solutionFolder in solution.Folders) { foreach (ISolutionFolder solutionFolder in Folders) {
stack.Push(solutionFolder); stack.Push(solutionFolder);
} }
@ -58,26 +68,13 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
} }
ProjectEnumerator projectEnumerator;
[Browsable(false)] [Browsable(false)]
public ProjectEnumerator Projects { public IEnumerable<ISolutionFolderContainer> SolutionFolderContainers {
get { get {
return projectEnumerator;
}
}
public class SolutionFolderContainerEnumerator {
Solution solution;
public SolutionFolderContainerEnumerator(Solution solution)
{
this.solution = solution;
}
public IEnumerator<ISolutionFolderContainer> GetEnumerator()
{
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>(); Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>();
foreach (ISolutionFolder solutionFolder in solution.Folders) { foreach (ISolutionFolder solutionFolder in Folders) {
stack.Push(solutionFolder); stack.Push(solutionFolder);
} }
@ -94,25 +91,13 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
} }
SolutionFolderContainerEnumerator solutionFolderContainerEnumerator;
[Browsable(false)] [Browsable(false)]
public SolutionFolderContainerEnumerator SolutionFolderContainers { public IEnumerable<ISolutionFolder> SolutionFolders {
get { get {
return solutionFolderContainerEnumerator;
}
}
public class SolutionFolderEnumerator {
Solution solution;
public SolutionFolderEnumerator(Solution solution)
{
this.solution = solution;
}
public IEnumerator<ISolutionFolder> GetEnumerator()
{
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>(); Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>();
foreach (ISolutionFolder solutionFolder in solution.Folders) { foreach (ISolutionFolder solutionFolder in Folders) {
stack.Push(solutionFolder); stack.Push(solutionFolder);
} }
@ -130,13 +115,6 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
} }
SolutionFolderEnumerator solutionFolderEnumerator;
[Browsable(false)]
public SolutionFolderEnumerator SolutionFolders {
get {
return solutionFolderEnumerator;
}
}
[Browsable(false)] [Browsable(false)]
public IProject StartupProject { public IProject StartupProject {
@ -220,9 +198,6 @@ namespace ICSharpCode.SharpDevelop.Project
public Solution() public Solution()
{ {
preferences = new SolutionPreferences(this); preferences = new SolutionPreferences(this);
solutionFolderEnumerator = new SolutionFolderEnumerator(this);
solutionFolderContainerEnumerator = new SolutionFolderContainerEnumerator(this);
projectEnumerator = new ProjectEnumerator(this);
} }
public ISolutionFolder GetSolutionFolder(string guid) public ISolutionFolder GetSolutionFolder(string guid)

17
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -391,10 +391,10 @@ namespace ICSharpCode.Core
string file = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent.FileName string file = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent.FileName
?? WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent.UntitledName; ?? WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent.UntitledName;
if (file != null) { if (file != null) {
LanguageProperties language = GetParser(file).Language; IParser parser = GetParser(file);
if (language != null) { if (parser != null && parser.Language != null) {
defaultProjectContent.Language = language; defaultProjectContent.Language = parser.Language;
defaultProjectContent.DefaultImports = language.CreateDefaultImports(defaultProjectContent); defaultProjectContent.DefaultImports = parser.Language.CreateDefaultImports(defaultProjectContent);
} }
} }
} }
@ -417,12 +417,9 @@ namespace ICSharpCode.Core
if (fileContent == null) { if (fileContent == null) {
if (ProjectService.OpenSolution != null) { if (ProjectService.OpenSolution != null) {
foreach (IProject project in ProjectService.OpenSolution.Projects) { IProject project = ProjectService.OpenSolution.FindProjectContainingFile(fileName);
if (project.IsFileInProject(fileName)) { if (project != null)
fileContent = project.GetParseableFileContent(fileName); fileContent = project.GetParseableFileContent(fileName);
break;
}
}
} }
} }
try { try {

18
src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs

@ -39,13 +39,10 @@ namespace ICSharpCode.SharpDevelop.Project
public static IProject GetProject(string filename) public static IProject GetProject(string filename)
{ {
filename = Path.GetFullPath(filename).ToLower(); if (openSolution == null)
foreach (IProject project in OpenSolution.Projects) { return null;
if (FileUtility.IsEqualFileName(project.FileName, filename)) { else
return project; return openSolution.FindProjectContainingFile(filename);
}
}
return null;
} }
static bool initialized; static bool initialized;
@ -168,12 +165,7 @@ namespace ICSharpCode.SharpDevelop.Project
if (fileName == null) { if (fileName == null) {
return; return;
} }
foreach (IProject project in OpenSolution.Projects) { CurrentProject = GetProject(fileName) ?? CurrentProject;
if (project.IsFileInProject(fileName)) {
CurrentProject = project;
break;
}
}
} }
/// <summary> /// <summary>

Loading…
Cancel
Save