Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@novell.com>2010-03-15 18:18:47 +0300
committerLluis Sanchez <lluis@novell.com>2010-03-15 18:18:47 +0300
commit5da93a505741c9b330af5c6d82f03ee061a331eb (patch)
tree67ed8bc36c6aad8c444e1e74333bf95021df59b0 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components
parent9bbe850bf8b6f7edb180198dba468403c60d1d63 (diff)
* MonoDevelop.Ide.Gui.Components/DragOperation.cs:
* MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs: * MonoDevelop.Ide.Gui.Components/NodeCommandHandler.cs: Added DropPosition parameter to the drop methods. svn path=/trunk/monodevelop/; revision=153591
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/DragOperation.cs6
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs143
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeCommandHandler.cs31
3 files changed, 125 insertions, 55 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/DragOperation.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/DragOperation.cs
index 27443cf478..388ee97a86 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/DragOperation.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/DragOperation.cs
@@ -35,4 +35,10 @@ namespace MonoDevelop.Ide.Gui.Components
Copy = 1,
Move = 2
}
+
+ public enum DropPosition {
+ Into = 0,
+ Before = 1,
+ After = 2
+ }
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
index 6a21de6de8..23e1706424 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
@@ -74,7 +74,7 @@ namespace MonoDevelop.Ide.Gui.Components
Pango.FontDescription customFont;
TreePadOption[] options;
- TreeOptions globalOptions;
+ TreeOptions globalOptions;
Dictionary<Gtk.TreeIter, TreeOptions> nodeOptions;
TreeNodeNavigator workNode;
@@ -237,8 +237,37 @@ namespace MonoDevelop.Ide.Gui.Components
this.Add (tree);
this.ShowAll ();
+
+// GLib.Timeout.Add (3000, Checker);
}
+ /* Verifies the consistency of the tree view. Disabled by default
+ HashSet<object> ochecked = new HashSet<object> ();
+ bool Checker ()
+ {
+ int nodes = 0;
+ foreach (DictionaryEntry e in nodeHash) {
+ if (e.Value is Gtk.TreeIter) {
+ nodes++;
+ if (!store.IterIsValid ((Gtk.TreeIter)e.Value) && ochecked.Add (e.Key)) {
+ Console.WriteLine ("Found invalid iter in tree pad - Object: " + e.Key);
+ MessageService.ShowError ("Found invalid iter in tree pad", "Object: " + e.Key);
+ }
+ } else {
+ Gtk.TreeIter[] iters = (Gtk.TreeIter[]) e.Value;
+ for (int n=0; n<iters.Length; n++) {
+ Gtk.TreeIter it = iters [n];
+ if (!store.IterIsValid (it) && ochecked.Add (e.Key)) {
+ Console.WriteLine ("Found invalid iter in tree pad - Object: " + e.Key + ", index:" + n);
+ MessageService.ShowError ("Found invalid iter in tree pad", "Object: " + e.Key + ", index:" + n);
+ }
+ nodes++;
+ }
+ }
+ }
+ return true;
+ }*/
+
public void UpdateBuilders (NodeBuilder[] builders, TreePadOption[] options)
{
// Save the current state
@@ -363,6 +392,14 @@ namespace MonoDevelop.Ide.Gui.Components
bool foundHandler = false;
DragOperation oper = ctx.Action == Gdk.DragAction.Copy ? DragOperation.Copy : DragOperation.Move;
+ DropPosition dropPos;
+ if (pos == Gtk.TreeViewDropPosition.After)
+ dropPos = DropPosition.After;
+ else if (pos == Gtk.TreeViewDropPosition.Before)
+ dropPos = DropPosition.Before;
+ else
+ dropPos = DropPosition.Into;
+
bool updatesLocked = false;
try {
@@ -370,14 +407,14 @@ namespace MonoDevelop.Ide.Gui.Components
try {
NodeCommandHandler handler = nb.CommandHandler;
handler.SetCurrentNode (nav);
- if (handler.CanDropMultipleNodes (obj, oper)) {
+ if (handler.CanDropMultipleNodes (obj, oper, dropPos)) {
foundHandler = true;
if (drop) {
if (!updatesLocked) {
LockUpdates ();
updatesLocked = true;
}
- handler.OnMultipleNodeDrop (obj, oper);
+ handler.OnMultipleNodeDrop (obj, oper, dropPos);
}
}
} catch (Exception ex) {
@@ -507,7 +544,7 @@ namespace MonoDevelop.Ide.Gui.Components
foreach (object dataObject in obs)
NotifyNodeRemoved (dataObject, null);
- nodeHash = new Hashtable ();
+ nodeHash = new Hashtable ();
nodeOptions.Clear ();
store.Clear ();
}
@@ -995,9 +1032,9 @@ namespace MonoDevelop.Ide.Gui.Components
foreach (NodeBuilder b in chain) {
NodeCommandHandler handler = b.CommandHandler;
handler.SetCurrentNode (node);
- if (handler.CanDropMultipleNodes (copyObjects, currentTransferOperation)) {
+ if (handler.CanDropMultipleNodes (copyObjects, currentTransferOperation, DropPosition.Into)) {
node.MoveToPosition (pos);
- handler.OnMultipleNodeDrop (copyObjects, currentTransferOperation);
+ handler.OnMultipleNodeDrop (copyObjects, currentTransferOperation, DropPosition.Into);
}
node.MoveToPosition (pos);
}
@@ -1024,7 +1061,7 @@ namespace MonoDevelop.Ide.Gui.Components
foreach (NodeBuilder b in chain) {
NodeCommandHandler handler = b.CommandHandler;
handler.SetCurrentNode (node);
- if (handler.CanDropMultipleNodes (copyObjects, currentTransferOperation)) {
+ if (handler.CanDropMultipleNodes (copyObjects, currentTransferOperation, DropPosition.Into)) {
info.Enabled = true;
return;
}
@@ -1279,9 +1316,9 @@ namespace MonoDevelop.Ide.Gui.Components
else if (it is Gtk.TreeIter)
return false; // There is only one node, GetFirstNode returned it
else {
- Gtk.TreeIter[] its = (Gtk.TreeIter[]) it;
+ Gtk.TreeIter[] its = (Gtk.TreeIter[]) it;
Gtk.TreePath iterPath = store.GetPath (iter);
- for (int n=0; n<its.Length; n++) {
+ for (int n=0; n<its.Length; n++) {
if (store.GetPath (its[n]).Equals (iterPath)) {
if (n < its.Length - 1) {
iter = its [n+1];
@@ -1322,7 +1359,7 @@ namespace MonoDevelop.Ide.Gui.Components
internal void UnregisterNode (object dataObject, Gtk.TreeIter iter, NodeBuilder[] chain)
{
// Remove object from copy list
-
+
if (copyObjects != null) {
int i = Array.IndexOf (copyObjects, dataObject);
if (i != -1) {
@@ -1465,8 +1502,8 @@ namespace MonoDevelop.Ide.Gui.Components
internal void ClearOptions (Gtk.TreeIter iter)
{
if (nodeOptions.Count == 0)
- return;
-
+ return;
+
List<Gtk.TreeIter> toDelete = new List<Gtk.TreeIter> ();
string path = store.GetPath (iter).ToString () + ":";
@@ -1474,8 +1511,8 @@ namespace MonoDevelop.Ide.Gui.Components
string npath = store.GetPath (nit).ToString () + ":";
if (npath.StartsWith (path))
toDelete.Add (nit);
- }
-
+ }
+
foreach (Gtk.TreeIter ob in toDelete)
nodeOptions.Remove (ob);
}
@@ -1528,21 +1565,21 @@ namespace MonoDevelop.Ide.Gui.Components
internal TreeOptions GetNodeOptions (ITreeNavigator nav)
{
TreeNode node = nav.CurrentPosition._node as TreeNode;
- if (node != null && node.HasIter) {
- TreeOptions ops;
- if (nodeOptions.TryGetValue (node.NodeIter, out ops))
- return ops;
- else
+ if (node != null && node.HasIter) {
+ TreeOptions ops;
+ if (nodeOptions.TryGetValue (node.NodeIter, out ops))
+ return ops;
+ else
return null;
}
else if (node != null)
return null;
- else {
- TreeOptions ops;
- if (nodeOptions.TryGetValue (nav.CurrentPosition._iter, out ops))
- return ops;
- else
- return null;
+ else {
+ TreeOptions ops;
+ if (nodeOptions.TryGetValue (nav.CurrentPosition._iter, out ops))
+ return ops;
+ else
+ return null;
}
}
@@ -1988,37 +2025,37 @@ namespace MonoDevelop.Ide.Gui.Components
target.SetCurrentNodes (nodes);
return target;
}
- }
-
- class IterComparer: IEqualityComparer<Gtk.TreeIter>
- {
- Gtk.TreeStore store;
-
- public IterComparer (Gtk.TreeStore store)
- {
- this.store = store;
- }
+ }
+
+ class IterComparer: IEqualityComparer<Gtk.TreeIter>
+ {
+ Gtk.TreeStore store;
+
+ public IterComparer (Gtk.TreeStore store)
+ {
+ this.store = store;
+ }
public bool Equals (Gtk.TreeIter x, Gtk.TreeIter y)
{
if (!store.IterIsValid (x) || !store.IterIsValid (y))
return false;
- Gtk.TreePath px = store.GetPath (x);
- Gtk.TreePath py = store.GetPath (y);
- if (px == null || py == null)
- return false;
- return x.Equals (y);
- }
-
- public int GetHashCode (Gtk.TreeIter obj)
- {
- if (!store.IterIsValid (obj))
- return 0;
- Gtk.TreePath p = store.GetPath (obj);
- if (p == null)
- return 0;
- else
- return p.ToString ().GetHashCode ();
- }
+ Gtk.TreePath px = store.GetPath (x);
+ Gtk.TreePath py = store.GetPath (y);
+ if (px == null || py == null)
+ return false;
+ return x.Equals (y);
+ }
+
+ public int GetHashCode (Gtk.TreeIter obj)
+ {
+ if (!store.IterIsValid (obj))
+ return 0;
+ Gtk.TreePath p = store.GetPath (obj);
+ if (p == null)
+ return 0;
+ else
+ return p.ToString ().GetHashCode ();
+ }
}
class ZoomableCellRendererPixbuf: Gtk.CellRendererPixbuf
@@ -2091,5 +2128,5 @@ namespace MonoDevelop.Ide.Gui.Components
resizedCache [value] = resized;
return resized;
}
- }
+ }
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeCommandHandler.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeCommandHandler.cs
index 6f51da1c39..9e7efa2362 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeCommandHandler.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeCommandHandler.cs
@@ -206,27 +206,54 @@ namespace MonoDevelop.Ide.Gui.Components
return DragOperation.None;
}
+ public virtual bool CanDropNode (object dataObject, DragOperation operation, DropPosition position)
+ {
+ if (position == DropPosition.Into)
+ return CanDropNode (dataObject, operation);
+ else
+ return false;
+ }
+
public virtual bool CanDropNode (object dataObject, DragOperation operation)
{
return false;
}
+ DropPosition cachedPosition;
+
+ public virtual bool CanDropMultipleNodes (object[] dataObjects, DragOperation operation, DropPosition position)
+ {
+ cachedPosition = position;
+ return CanDropMultipleNodes (dataObjects, operation);
+ }
+
public virtual bool CanDropMultipleNodes (object[] dataObjects, DragOperation operation)
{
foreach (object ob in dataObjects)
- if (!CanDropNode (ob, operation))
+ if (!CanDropNode (ob, operation, cachedPosition))
return false;
return true;
}
+ public virtual void OnNodeDrop (object dataObjects, DragOperation operation, DropPosition position)
+ {
+ OnNodeDrop (dataObjects, operation);
+ }
+
public virtual void OnNodeDrop (object dataObjects, DragOperation operation)
{
}
+ public virtual void OnMultipleNodeDrop (object[] dataObjects, DragOperation operation, DropPosition position)
+ {
+ cachedPosition = position;
+ OnMultipleNodeDrop (dataObjects, operation);
+ }
+
public virtual void OnMultipleNodeDrop (object[] dataObjects, DragOperation operation)
{
foreach (object ob in dataObjects)
- OnNodeDrop (ob, operation);
+ OnNodeDrop (ob, operation, cachedPosition);
}
internal class TransactedNodeHandlerAttribute: CustomCommandTargetAttribute