Browse Source

Fix moving projects between solution folders.

pull/32/merge
Daniel Grunwald 12 years ago
parent
commit
7bfda47572
  1. 2
      src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs
  2. 60
      src/Main/Base/Project/Dom/SimpleModelCollection.cs
  3. 13
      src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs
  4. 32
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs
  5. 4
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs
  6. 14
      src/Main/SharpDevelop/Project/SolutionFolder.cs

2
src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs

@ -237,7 +237,7 @@ namespace Debugger
0, elementType); 0, elementType);
} }
default: default:
throw new System.Exception("Invalid value for TypeKind"); throw new System.Exception("Invalid value for TypeKind: " + type.Kind);
} }
} }

60
src/Main/Base/Project/Dom/SimpleModelCollection.cs

@ -122,13 +122,39 @@ namespace ICSharpCode.SharpDevelop.Dom
#region IMutableModelCollection implementation #region IMutableModelCollection implementation
/// <summary>
/// Called immediately when an item is removed; even within a batch.
/// The collection may be in an invalid state while this method is called.
/// </summary>
protected virtual void OnRemove(T item)
{
if (addedItems != null && addedItems.Remove(item))
return;
if (removedItems == null)
removedItems = new List<T>();
removedItems.Add(item);
}
/// <summary>
/// Called immediately when an item is added; even within a batch.
/// The collection may be in an invalid state while this method is called.
/// </summary>
protected virtual void OnAdd(T item)
{
if (removedItems != null && removedItems.Remove(item))
return;
if (addedItems == null)
addedItems = new List<T>();
addedItems.Add(item);
}
public void Clear() public void Clear()
{ {
CheckReentrancy(); CheckReentrancy();
addedItems = null; addedItems = null;
if (removedItems == null) for (int i = 0; i < list.Count; i++) {
removedItems = new List<T>(); OnRemove(list[i]);
removedItems.AddRange(list); }
list.Clear(); list.Clear();
RaiseEventIfNotInBatch(); RaiseEventIfNotInBatch();
} }
@ -137,11 +163,7 @@ namespace ICSharpCode.SharpDevelop.Dom
{ {
CheckReentrancy(); CheckReentrancy();
ValidateItem(item); ValidateItem(item);
if (removedItems != null) OnAdd(item);
removedItems.Remove(item);
if (addedItems == null)
addedItems = new List<T>();
addedItems.Add(item);
list.Add(item); list.Add(item);
RaiseEventIfNotInBatch(); RaiseEventIfNotInBatch();
} }
@ -155,15 +177,9 @@ namespace ICSharpCode.SharpDevelop.Dom
for (int i = 0; i < itemsList.Count; i++) { for (int i = 0; i < itemsList.Count; i++) {
ValidateItem(itemsList[i]); ValidateItem(itemsList[i]);
} }
if (removedItems != null) { for (int i = 0; i < itemsList.Count; i++) {
for (int i = 0; i < itemsList.Count; i++) { OnAdd(itemsList[i]);
removedItems.Remove(itemsList[i]);
}
} }
if (addedItems != null)
addedItems.AddRange(itemsList);
else
addedItems = itemsList;
list.AddRange(itemsList); list.AddRange(itemsList);
RaiseEventIfNotInBatch(); RaiseEventIfNotInBatch();
} }
@ -172,11 +188,7 @@ namespace ICSharpCode.SharpDevelop.Dom
{ {
CheckReentrancy(); CheckReentrancy();
if (list.Remove(item)) { if (list.Remove(item)) {
if (addedItems != null) OnRemove(item);
addedItems.Remove(item);
if (removedItems == null)
removedItems = new List<T>();
removedItems.Add(item);
RaiseEventIfNotInBatch(); RaiseEventIfNotInBatch();
return true; return true;
} else { } else {
@ -190,11 +202,7 @@ namespace ICSharpCode.SharpDevelop.Dom
int count = list.RemoveAll( int count = list.RemoveAll(
delegate(T obj) { delegate(T obj) {
if (predicate(obj)) { if (predicate(obj)) {
if (addedItems != null) OnRemove(obj);
addedItems.Remove(obj);
if (removedItems == null)
removedItems = new List<T>();
removedItems.Add(obj);
return true; return true;
} else { } else {
return false; return false;

13
src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs

@ -416,10 +416,15 @@ namespace ICSharpCode.SharpDevelop.Gui
// OnDragDrop raises without OnDragOver for the node. // OnDragDrop raises without OnDragOver for the node.
// So we have to call HandleDragOver to ensure that we don't call DoDragDrop for // So we have to call HandleDragOver to ensure that we don't call DoDragDrop for
// invalid operations. // invalid operations.
HandleDragOver(e, node); try {
if (e.Effect != DragDropEffects.None) { HandleDragOver(e, node);
node.DoDragDrop(e.Data, e.Effect); if (e.Effect != DragDropEffects.None) {
SortParentNodes(node); node.DoDragDrop(e.Data, e.Effect);
SortParentNodes(node);
}
} catch (Exception ex) {
// WinForms silently discards exceptions in the drag'n'drop events; so we need to catch+report any errors
SD.MessageService.ShowException(ex);
} }
} }
} }

32
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs

@ -169,14 +169,7 @@ namespace ICSharpCode.SharpDevelop.Project
Guid guid = Guid.Parse(dataObject.GetData(typeof(ISolutionItem).ToString()).ToString()); Guid guid = Guid.Parse(dataObject.GetData(typeof(ISolutionItem).ToString()).ToString());
ISolutionItem solutionItem = folderNode.Solution.GetItemByGuid(guid); ISolutionItem solutionItem = folderNode.Solution.GetItemByGuid(guid);
if (solutionItem != null) { if (solutionItem != null) {
// Use a batch update to move the item without causing projects MoveItem(solutionItem, folderNode.Folder);
// be removed from the solution (and thus disposed).
using (solutionItem.ParentFolder.Items.BatchUpdate()) {
using (folderNode.Folder.Items.BatchUpdate()) {
solutionItem.ParentFolder.Items.Remove(solutionItem);
folderNode.Folder.Items.Add(solutionItem);
}
}
ExtTreeView treeView = (ExtTreeView)folderTreeNode.TreeView; ExtTreeView treeView = (ExtTreeView)folderTreeNode.TreeView;
foreach (ExtTreeNode node in treeView.CutNodes) { foreach (ExtTreeNode node in treeView.CutNodes) {
ExtTreeNode oldParent = node.Parent as ExtTreeNode; ExtTreeNode oldParent = node.Parent as ExtTreeNode;
@ -192,7 +185,19 @@ namespace ICSharpCode.SharpDevelop.Project
} }
folderTreeNode.Expand(); folderTreeNode.Expand();
} }
internal static void MoveItem(ISolutionItem solutionItem, ISolutionFolder folder)
{
// Use a batch update to move the item without causing projects
// be removed from the solution (and thus disposed).
using (solutionItem.ParentFolder.Items.BatchUpdate()) {
using (folder.Items.BatchUpdate()) {
solutionItem.ParentFolder.Items.Remove(solutionItem);
folder.Items.Add(solutionItem);
}
}
}
public override bool EnablePaste { public override bool EnablePaste {
get { get {
return DoEnablePaste(this); return DoEnablePaste(this);
@ -255,7 +260,8 @@ namespace ICSharpCode.SharpDevelop.Project
folderNode.Remove(); folderNode.Remove();
folderNode.InsertSorted(this); folderNode.InsertSorted(this);
folderNode.EnsureVisible(); folderNode.EnsureVisible();
this.folder.Items.Add(folderNode.Folder); MoveItem(folderNode.Folder, this.folder);
if (parentNode != null) { if (parentNode != null) {
parentNode.Refresh(); parentNode.Refresh();
} }
@ -264,9 +270,7 @@ namespace ICSharpCode.SharpDevelop.Project
if (dataObject.GetDataPresent(typeof(SolutionItemNode))) { if (dataObject.GetDataPresent(typeof(SolutionItemNode))) {
SolutionItemNode solutionItemNode = (SolutionItemNode)dataObject.GetData(typeof(SolutionItemNode)); SolutionItemNode solutionItemNode = (SolutionItemNode)dataObject.GetData(typeof(SolutionItemNode));
ISolutionFolderNode folderNode = (ISolutionFolderNode)solutionItemNode.Parent; MoveItem(solutionItemNode.SolutionItem, this.folder);
folderNode.Folder.Items.Remove(solutionItemNode.SolutionItem);
Folder.Items.Add(solutionItemNode.SolutionItem);
solutionItemNode.Remove(); solutionItemNode.Remove();
solutionItemNode.InsertSorted(this); solutionItemNode.InsertSorted(this);
@ -282,7 +286,7 @@ namespace ICSharpCode.SharpDevelop.Project
projectNode.Remove(); projectNode.Remove();
projectNode.InsertSorted(this); projectNode.InsertSorted(this);
projectNode.EnsureVisible(); projectNode.EnsureVisible();
this.folder.Items.Add(projectNode.Project); MoveItem(projectNode.Project, this.folder);
if (projectNode.Parent != null) { if (projectNode.Parent != null) {
((ExtTreeNode)projectNode.Parent).Refresh(); ((ExtTreeNode)projectNode.Parent).Refresh();

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

@ -119,7 +119,7 @@ namespace ICSharpCode.SharpDevelop.Project
folderNode.Remove(); folderNode.Remove();
folderNode.InsertSorted(this); folderNode.InsertSorted(this);
this.solution.Items.Add(folderNode.Folder); SolutionFolderNode.MoveItem(folderNode.Folder, this.solution);
} }
if (dataObject.GetDataPresent(typeof(ProjectNode))) { if (dataObject.GetDataPresent(typeof(ProjectNode))) {
ProjectNode projectNode = (ProjectNode)dataObject.GetData(typeof(ProjectNode)); ProjectNode projectNode = (ProjectNode)dataObject.GetData(typeof(ProjectNode));
@ -128,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.Project
projectNode.Remove(); projectNode.Remove();
projectNode.InsertSorted(this); projectNode.InsertSorted(this);
projectNode.EnsureVisible(); projectNode.EnsureVisible();
this.solution.Items.Add(projectNode.Project); SolutionFolderNode.MoveItem(projectNode.Project, this.solution);
} }
if (parentNode != null) { if (parentNode != null) {

14
src/Main/SharpDevelop/Project/SolutionFolder.cs

@ -68,15 +68,25 @@ namespace ICSharpCode.SharpDevelop.Project
return new CompositeDisposable(base.BatchUpdate(), folder.parentSolution.ReportBatch()); return new CompositeDisposable(base.BatchUpdate(), folder.parentSolution.ReportBatch());
} }
protected override void OnAdd(ISolutionItem item)
{
base.OnAdd(item);
item.ParentFolder = folder;
}
protected override void OnRemove(ISolutionItem item)
{
base.OnRemove(item);
item.ParentFolder = null;
}
protected override void OnCollectionChanged(IReadOnlyCollection<ISolutionItem> removedItems, IReadOnlyCollection<ISolutionItem> addedItems) protected override void OnCollectionChanged(IReadOnlyCollection<ISolutionItem> removedItems, IReadOnlyCollection<ISolutionItem> addedItems)
{ {
using (folder.parentSolution.ReportBatch()) { using (folder.parentSolution.ReportBatch()) {
foreach (ISolutionItem item in removedItems) { foreach (ISolutionItem item in removedItems) {
folder.parentSolution.ReportRemovedItem(item); folder.parentSolution.ReportRemovedItem(item);
item.ParentFolder = null;
} }
foreach (ISolutionItem item in addedItems) { foreach (ISolutionItem item in addedItems) {
item.ParentFolder = folder;
folder.parentSolution.ReportAddedItem(item); folder.parentSolution.ReportAddedItem(item);
} }
} }

Loading…
Cancel
Save