diff options
author | Lluis Sanchez <lluis@novell.com> | 2010-03-15 18:18:47 +0300 |
---|---|---|
committer | Lluis Sanchez <lluis@novell.com> | 2010-03-15 18:18:47 +0300 |
commit | 5da93a505741c9b330af5c6d82f03ee061a331eb (patch) | |
tree | 67ed8bc36c6aad8c444e1e74333bf95021df59b0 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components | |
parent | 9bbe850bf8b6f7edb180198dba468403c60d1d63 (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')
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 |