fancytree-rails 2.0.0.pre.6.pre.1 → 2.0.0.pre.11.pre.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Rakefile +6 -7
  4. data/lib/fancytree/rails/version.rb +2 -2
  5. data/vendor/assets/images/fancytree/skin-win8-xxl/icons.gif +0 -0
  6. data/vendor/assets/images/fancytree/skin-win8-xxl/loading.gif +0 -0
  7. data/vendor/assets/javascripts/fancytree.js +1 -1
  8. data/vendor/assets/javascripts/fancytree/MIT-LICENSE.txt +21 -0
  9. data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.js +1267 -475
  10. data/vendor/assets/javascripts/fancytree/jquery.fancytree-custom.min.js +41 -0
  11. data/vendor/assets/javascripts/fancytree/jquery.fancytree.js +582 -310
  12. data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js +14 -7
  13. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.childcounter.js +185 -0
  14. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.clones.js +417 -0
  15. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.columnview.js +149 -0
  16. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.debug.js +142 -0
  17. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.dnd.js +539 -0
  18. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.edit.js +318 -0
  19. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.filter.js +173 -0
  20. data/vendor/assets/javascripts/fancytree/{jquery.fancytree.awesome.js → src/jquery.fancytree.glyph.js} +28 -26
  21. data/vendor/assets/javascripts/fancytree/{jquery.fancytree.gridnav.js → src/jquery.fancytree.gridnav.js} +77 -41
  22. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.js +4027 -0
  23. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.menu.js +155 -0
  24. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.persist.js +345 -0
  25. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.table.js +345 -0
  26. data/vendor/assets/javascripts/fancytree/src/jquery.fancytree.themeroller.js +82 -0
  27. data/vendor/assets/stylesheets/fancytree/skin-awesome/ui.fancytree.css +29 -15
  28. data/vendor/assets/stylesheets/fancytree/skin-awesome/ui.fancytree.min.css +1 -1
  29. data/vendor/assets/stylesheets/fancytree/skin-bootstrap/ui.fancytree.css +366 -0
  30. data/vendor/assets/stylesheets/fancytree/skin-bootstrap/ui.fancytree.min.css +6 -0
  31. data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree.css +34 -7
  32. data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree.min.css +1 -1
  33. data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree.css +34 -7
  34. data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree.min.css +1 -1
  35. data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree.css +34 -7
  36. data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree.min.css +1 -1
  37. data/vendor/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.css +507 -0
  38. data/vendor/assets/stylesheets/fancytree/skin-win8-xxl/ui.fancytree.min.css +11 -0
  39. data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree.css +34 -7
  40. data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree.min.css +1 -1
  41. data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree.css +34 -7
  42. data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree.min.css +1 -1
  43. metadata +24 -13
  44. data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js +0 -7
  45. data/vendor/assets/javascripts/fancytree/jquery.fancytree-all.min.js.map +0 -1
  46. data/vendor/assets/javascripts/fancytree/jquery.fancytree.min.js.map +0 -1
  47. data/vendor/assets/stylesheets/fancytree/skin-lion/ui.fancytree-org.css +0 -460
  48. data/vendor/assets/stylesheets/fancytree/skin-themeroller/ui.fancytree-org.css +0 -505
  49. data/vendor/assets/stylesheets/fancytree/skin-vista/ui.fancytree-org.css +0 -610
  50. data/vendor/assets/stylesheets/fancytree/skin-win7/ui.fancytree-org.css +0 -592
  51. data/vendor/assets/stylesheets/fancytree/skin-win8/ui.fancytree-org.css +0 -602
  52. data/vendor/assets/stylesheets/fancytree/skin-xp/ui.fancytree-org.css +0 -578
@@ -0,0 +1,149 @@
1
+ /*!
2
+ * jquery.fancytree.columnview.js
3
+ *
4
+ * Render tree like a Mac Finder's column view.
5
+ * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
6
+ *
7
+ * Copyright (c) 2014, Martin Wendt (http://wwWendt.de)
8
+ *
9
+ * Released under the MIT license
10
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
11
+ *
12
+ * @version 2.0.0-11
13
+ * @date 2014-04-27T22:28
14
+ */
15
+
16
+ ;(function($, window, document, undefined) {
17
+
18
+ "use strict";
19
+
20
+ // prevent duplicate loading
21
+ // if ( $.ui.fancytree && $.ui.fancytree.version ) {
22
+ // $.ui.fancytree.warn("Fancytree: duplicate include");
23
+ // return;
24
+ // }
25
+
26
+
27
+ /*******************************************************************************
28
+ * Private functions and variables
29
+ */
30
+ /*
31
+ function _assert(cond, msg){
32
+ msg = msg || "";
33
+ if(!cond){
34
+ $.error("Assertion failed " + msg);
35
+ }
36
+ }
37
+ */
38
+
39
+ /*******************************************************************************
40
+ * Private functions and variables
41
+ */
42
+ $.ui.fancytree.registerExtension({
43
+ name: "columnview",
44
+ version: "0.0.1",
45
+ // Default options for this extension.
46
+ options: {
47
+ },
48
+ // Overide virtual methods for this extension.
49
+ // `this` : is this extension object
50
+ // `this._base` : the Fancytree instance
51
+ // `this._super`: the virtual function that was overriden (member of prev. extension or Fancytree)
52
+ treeInit: function(ctx){
53
+ var $tdFirst, $ul,
54
+ tree = ctx.tree,
55
+ $table = tree.widget.element;
56
+
57
+ tree.tr = $("tbody tr", $table)[0];
58
+ tree.columnCount = $(">td", tree.tr).length;
59
+ // Perform default behavior
60
+ this._super(ctx);
61
+ // Standard Fancytree created a root <ul>. Now move this into first table cell
62
+ $ul = $(tree.rootNode.ul);
63
+ $tdFirst = $(">td", tree.tr).eq(0);
64
+
65
+ $ul.removeClass("fancytree-container");
66
+ $ul.removeAttr("tabindex");
67
+ tree.$container = $table;
68
+ $table.addClass("fancytree-container fancytree-ext-columnview");
69
+ $table.attr("tabindex", "0");
70
+
71
+ $tdFirst.empty();
72
+ $ul.detach().appendTo($tdFirst);
73
+
74
+ // Force some required options
75
+ tree.widget.options.autoCollapse = true;
76
+ // tree.widget.options.autoActivate = true;
77
+ tree.widget.options.fx = false;
78
+ tree.widget.options.clickFolderMode = 1;
79
+
80
+ // Make sure that only active path is expanded when a node is activated:
81
+ $table.bind("fancytreeactivate", function(event, data){
82
+ var i, tdList,
83
+ node = data.node,
84
+ tree = data.tree,
85
+ level = node.getLevel();
86
+
87
+ tree._callHook("nodeCollapseSiblings", node);
88
+ // Clear right neighbours
89
+ if(level <= tree.columnCount){
90
+ tdList = $(">td", tree.tr);
91
+ for(i=level; i<tree.columnCount; i++){
92
+ tdList.eq(i).empty();
93
+ }
94
+ }
95
+ // Expand nodes on activate, so we populate the right neighbor cell
96
+ if(!node.expanded && (node.children || node.lazy)) {
97
+ node.setExpanded();
98
+ }
99
+ // Adjust keyboard behaviour:
100
+ }).bind("fancytreekeydown", function(event, data){
101
+ var next = null;
102
+ switch(event.which){
103
+ case $.ui.keyCode.DOWN:
104
+ next = data.node.getNextSibling();
105
+ if( next ){
106
+ next.setFocus();
107
+ }
108
+ return false;
109
+ case $.ui.keyCode.LEFT:
110
+ next = data.node.getParent();
111
+ if( next ){
112
+ next.setFocus();
113
+ }
114
+ return false;
115
+ case $.ui.keyCode.UP:
116
+ next = data.node.getPrevSibling();
117
+ if( next ){
118
+ next.setFocus();
119
+ }
120
+ return false;
121
+ }
122
+ });
123
+ },
124
+ nodeRender: function(ctx, force, deep, collapsed, _recursive) {
125
+ // Render standard nested <ul> - <li> hierarchy
126
+ this._super(ctx, force, deep, collapsed, _recursive);
127
+ // Remove expander and add a trailing triangle instead
128
+ var level, $tdChild, $ul,
129
+ tree = ctx.tree,
130
+ node = ctx.node,
131
+ $span = $(node.span);
132
+
133
+ $span.find("span.fancytree-expander").remove();
134
+ if(node.hasChildren() !== false && !$span.find("span.fancytree-cv-right").length){
135
+ $span.append($("<span class='fancytree-icon fancytree-cv-right'>"));
136
+ }
137
+ // Move <ul> with children into the appropriate <td>
138
+ if(node.ul){
139
+ node.ul.style.display = ""; // might be hidden if RIGHT was pressed
140
+ level = node.getLevel();
141
+ if(level < tree.columnCount){
142
+ $tdChild = $(">td", tree.tr).eq(level);
143
+ $ul = $(node.ul).detach();
144
+ $tdChild.empty().append($ul);
145
+ }
146
+ }
147
+ }
148
+ });
149
+ }(jQuery, window, document));
@@ -0,0 +1,142 @@
1
+ /*!
2
+ * jquery.fancytree.debug.js
3
+ *
4
+ * Miscellaneous debug extensions.
5
+ * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
6
+ *
7
+ * Copyright (c) 2014, Martin Wendt (http://wwWendt.de)
8
+ *
9
+ * Released under the MIT license
10
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
11
+ *
12
+ * @version 2.0.0-11
13
+ * @date 2014-04-27T22:28
14
+ */
15
+
16
+ ;(function($, window, document, undefined) {
17
+
18
+ "use strict";
19
+
20
+ // prevent duplicate loading
21
+ // if ( $.ui.fancytree && $.ui.fancytree.version ) {
22
+ // $.ui.fancytree.warn("Fancytree: duplicate include");
23
+ // return;
24
+ // }
25
+
26
+
27
+ /* *****************************************************************************
28
+ * Private functions and variables
29
+ */
30
+ var i,
31
+ HOOK_NAMES = "nodeClick nodeCollapseSiblings".split(" "),
32
+ EVENT_NAMES = "activate beforeActivate".split(" "),
33
+ HOOK_NAME_MAP = {},
34
+ EVENT_NAME_MAP = {};
35
+
36
+ for(i=0; i<HOOK_NAMES.length; i++){ HOOK_NAME_MAP[HOOK_NAMES[i]] = true; }
37
+ for(i=0; i<EVENT_NAMES.length; i++){ EVENT_NAME_MAP[EVENT_NAMES[i]] = true; }
38
+
39
+ /* *****************************************************************************
40
+ * Extension code
41
+ */
42
+ $.ui.fancytree.registerExtension({
43
+ name: "tracecalls",
44
+ version: "0.0.1",
45
+ // Default options for this extension.
46
+ options: {
47
+ logTarget: null, // optional redirect logging to this <div> tag
48
+ traceEvents: false, // `true`or list of hook names
49
+ traceHooks: false // `true`or list of event names
50
+ },
51
+ // Overide virtual methods for this extension.
52
+ // `this` : is this Fancytree object
53
+ // `this._super`: the virtual function that was overridden (member of prev. extension or Fancytree)
54
+ treeInit: function(ctx){
55
+ var tree = ctx.tree;
56
+
57
+ // Bind init-handler to apply cookie state
58
+ tree.$div.bind("fancytreeinit", function(event){
59
+ tree.debug("COOKIE " + document.cookie);
60
+ });
61
+ // Init the tree
62
+ this._super(ctx);
63
+ },
64
+ nodeClick: function(ctx) {
65
+ if(this.options.tracecalls.traceHooks){
66
+ this.debug();
67
+ }
68
+ },
69
+ nodeCollapseSiblings: function(ctx) {
70
+ },
71
+ nodeDblclick: function(ctx) {
72
+ },
73
+ nodeKeydown: function(ctx) {
74
+ },
75
+ nodeLoadChildren: function(ctx, source) {
76
+ },
77
+ nodeOnFocusInOut: function(ctx) {
78
+ },
79
+ nodeRemoveChildMarkup: function(ctx) {
80
+ },
81
+ nodeRemoveMarkup: function(ctx) {
82
+ },
83
+ nodeRender: function(ctx, force, deep, collapsed, _recursive) {
84
+ },
85
+ nodeRenderStatus: function(ctx) {
86
+ },
87
+ nodeRenderTitle: function(ctx, title) {
88
+ },
89
+ nodeSetActive: function(ctx, flag, opts) {
90
+ },
91
+ nodeSetExpanded: function(ctx, flag, opts) {
92
+ },
93
+ nodeSetFocus: function(ctx) {
94
+ },
95
+ nodeSetSelected: function(ctx, flag) {
96
+ },
97
+ nodeSetStatus: function(ctx, status, message, details) {
98
+ },
99
+ nodeToggleExpanded: function(ctx) {
100
+ },
101
+ nodeToggleSelected: function(ctx) {
102
+ },
103
+ treeClear: function(ctx) {
104
+ },
105
+ treeCreate: function(ctx) {
106
+ },
107
+ treeDestroy: function(ctx) {
108
+ },
109
+ // treeInit: function(ctx) {
110
+ // },
111
+ treeLoad: function(ctx, source) {
112
+ },
113
+ treeSetFocus: function(ctx, flag) {
114
+ }
115
+ });
116
+
117
+ }(jQuery, window, document));
118
+
119
+
120
+
121
+ /* *****************************************************************************
122
+ * Fancytree extension: profiler
123
+ */
124
+ ;(function($, window, document, undefined) {
125
+ $.ui.fancytree.registerExtension({
126
+ name: "profiler",
127
+ version: "0.0.1",
128
+ // Default options for this extension
129
+ options: {
130
+ prefix: ""
131
+ },
132
+ // Overide virtual methods for this extension
133
+ nodeRender: function(ctx, force, deep, collapsed){
134
+ // ctx.tree.debug("**** PROFILER nodeRender");
135
+ var s = this.options.prefix + "render '" + ctx.node + "'";
136
+ /*jshint expr:true */
137
+ window.console && window.console.time && window.console.time(s);
138
+ this._super(ctx, force, deep, collapsed);
139
+ window.console && window.console.timeEnd && window.console.timeEnd(s);
140
+ }
141
+ });
142
+ }(jQuery, window, document));
@@ -0,0 +1,539 @@
1
+ /*!
2
+ * jquery.fancytree.dnd.js
3
+ *
4
+ * Drag-and-drop support.
5
+ * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
6
+ *
7
+ * Copyright (c) 2014, Martin Wendt (http://wwWendt.de)
8
+ *
9
+ * Released under the MIT license
10
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
11
+ *
12
+ * @version 2.0.0-11
13
+ * @date 2014-04-27T22:28
14
+ */
15
+
16
+ ;(function($, window, document, undefined) {
17
+
18
+ "use strict";
19
+
20
+ /* *****************************************************************************
21
+ * Private functions and variables
22
+ */
23
+ var logMsg = $.ui.fancytree.debug,
24
+ didRegisterDnd = false;
25
+
26
+ /* Convert number to string and prepend +/-; return empty string for 0.*/
27
+ function offsetString(n){
28
+ return n === 0 ? "" : (( n > 0 ) ? ("+" + n) : ("" + n));
29
+ }
30
+
31
+ /* *****************************************************************************
32
+ * Drag and drop support
33
+ */
34
+ function _initDragAndDrop(tree) {
35
+ var dnd = tree.options.dnd || null;
36
+ // Register 'connectToFancytree' option with ui.draggable
37
+ if( dnd ) {
38
+ _registerDnd();
39
+ }
40
+ // Attach ui.draggable to this Fancytree instance
41
+ if(dnd && dnd.dragStart ) {
42
+ tree.widget.element.draggable($.extend({
43
+ addClasses: false,
44
+ appendTo: "body",
45
+ containment: false,
46
+ delay: 0,
47
+ distance: 4,
48
+ // TODO: merge Dynatree issue 419
49
+ revert: false,
50
+ scroll: true, // issue 244: enable scrolling (if ul.fancytree-container)
51
+ scrollSpeed: 7,
52
+ scrollSensitivity: 10,
53
+ // Delegate draggable.start, drag, and stop events to our handler
54
+ connectToFancytree: true,
55
+ // Let source tree create the helper element
56
+ helper: function(event) {
57
+ var sourceNode = $.ui.fancytree.getNode(event.target);
58
+ if(!sourceNode){ // Dynatree issue 211
59
+ // might happen, if dragging a table *header*
60
+ return "<div>ERROR?: helper requested but sourceNode not found</div>";
61
+ }
62
+ return sourceNode.tree.ext.dnd._onDragEvent("helper", sourceNode, null, event, null, null);
63
+ },
64
+ start: function(event, ui) {
65
+ var sourceNode = ui.helper.data("ftSourceNode");
66
+ return !!sourceNode; // Abort dragging if no node could be found
67
+ }
68
+ }, tree.options.dnd.draggable));
69
+ }
70
+ // Attach ui.droppable to this Fancytree instance
71
+ if(dnd && dnd.dragDrop) {
72
+ tree.widget.element.droppable($.extend({
73
+ addClasses: false,
74
+ tolerance: "intersect",
75
+ greedy: false
76
+ /*
77
+ ,
78
+ activate: function(event, ui) {
79
+ logMsg("droppable - activate", event, ui, this);
80
+ },
81
+ create: function(event, ui) {
82
+ logMsg("droppable - create", event, ui);
83
+ },
84
+ deactivate: function(event, ui) {
85
+ logMsg("droppable - deactivate", event, ui);
86
+ },
87
+ drop: function(event, ui) {
88
+ logMsg("droppable - drop", event, ui);
89
+ },
90
+ out: function(event, ui) {
91
+ logMsg("droppable - out", event, ui);
92
+ },
93
+ over: function(event, ui) {
94
+ logMsg("droppable - over", event, ui);
95
+ }
96
+ */
97
+ }, tree.options.dnd.droppable));
98
+ }
99
+ }
100
+
101
+ //--- Extend ui.draggable event handling --------------------------------------
102
+
103
+ function _registerDnd() {
104
+ if(didRegisterDnd){
105
+ return;
106
+ }
107
+
108
+ // Register proxy-functions for draggable.start/drag/stop
109
+
110
+ $.ui.plugin.add("draggable", "connectToFancytree", {
111
+ start: function(event, ui) {
112
+ // 'draggable' was renamed to 'ui-draggable' since jQueryUI 1.10
113
+ var draggable = $(this).data("ui-draggable") || $(this).data("draggable"),
114
+ sourceNode = ui.helper.data("ftSourceNode") || null;
115
+ // logMsg("draggable-connectToFancytree.start, %s", sourceNode);
116
+ // logMsg(" this: %o", this);
117
+ // logMsg(" event: %o", event);
118
+ // logMsg(" draggable: %o", draggable);
119
+ // logMsg(" ui: %o", ui);
120
+
121
+ if(sourceNode) {
122
+ // Adjust helper offset, so cursor is slightly outside top/left corner
123
+ draggable.offset.click.top = -2;
124
+ draggable.offset.click.left = + 16;
125
+ // logMsg(" draggable2: %o", draggable);
126
+ // logMsg(" draggable.offset.click FIXED: %s/%s", draggable.offset.click.left, draggable.offset.click.top);
127
+ // Trigger dragStart event
128
+ // TODO: when called as connectTo..., the return value is ignored(?)
129
+ return sourceNode.tree.ext.dnd._onDragEvent("start", sourceNode, null, event, ui, draggable);
130
+ }
131
+ },
132
+ drag: function(event, ui) {
133
+ // 'draggable' was renamed to 'ui-draggable' since jQueryUI 1.10
134
+ var isHelper,
135
+ draggable = $(this).data("ui-draggable") || $(this).data("draggable"),
136
+ sourceNode = ui.helper.data("ftSourceNode") || null,
137
+ prevTargetNode = ui.helper.data("ftTargetNode") || null,
138
+ targetNode = $.ui.fancytree.getNode(event.target);
139
+ // logMsg("$.ui.fancytree.getNode(%o): %s", event.target, targetNode);
140
+ // logMsg("connectToFancytree.drag: helper: %o", ui.helper[0]);
141
+ if(event.target && !targetNode){
142
+ // We got a drag event, but the targetNode could not be found
143
+ // at the event location. This may happen,
144
+ // 1. if the mouse jumped over the drag helper,
145
+ // 2. or if a non-fancytree element is dragged
146
+ // We ignore it:
147
+ isHelper = $(event.target).closest("div.fancytree-drag-helper,#fancytree-drop-marker").length > 0;
148
+ if(isHelper){
149
+ logMsg("Drag event over helper: ignored.");
150
+ return;
151
+ }
152
+ }
153
+ // logMsg("draggable-connectToFancytree.drag: targetNode(from event): %s, ftTargetNode: %s", targetNode, ui.helper.data("ftTargetNode"));
154
+ ui.helper.data("ftTargetNode", targetNode);
155
+ // Leaving a tree node
156
+ if(prevTargetNode && prevTargetNode !== targetNode ) {
157
+ prevTargetNode.tree.ext.dnd._onDragEvent("leave", prevTargetNode, sourceNode, event, ui, draggable);
158
+ }
159
+ if(targetNode){
160
+ if(!targetNode.tree.options.dnd.dragDrop) {
161
+ // not enabled as drop target
162
+ } else if(targetNode === prevTargetNode) {
163
+ // Moving over same node
164
+ targetNode.tree.ext.dnd._onDragEvent("over", targetNode, sourceNode, event, ui, draggable);
165
+ }else{
166
+ // Entering this node first time
167
+ targetNode.tree.ext.dnd._onDragEvent("enter", targetNode, sourceNode, event, ui, draggable);
168
+ }
169
+ }
170
+ // else go ahead with standard event handling
171
+ },
172
+ stop: function(event, ui) {
173
+ // 'draggable' was renamed to 'ui-draggable' since jQueryUI 1.10
174
+ var draggable = $(this).data("ui-draggable") || $(this).data("draggable"),
175
+ sourceNode = ui.helper.data("ftSourceNode") || null,
176
+ targetNode = ui.helper.data("ftTargetNode") || null,
177
+ // mouseDownEvent = draggable._mouseDownEvent,
178
+ eventType = event.type,
179
+ dropped = (eventType === "mouseup" && event.which === 1);
180
+ // logMsg("draggable-connectToFancytree.stop: targetNode(from event): %s, ftTargetNode: %s", targetNode, ui.helper.data("ftTargetNode"));
181
+ // logMsg("draggable-connectToFancytree.stop, %s", sourceNode);
182
+ // logMsg(" type: %o, downEvent: %o, upEvent: %o", eventType, mouseDownEvent, event);
183
+ // logMsg(" targetNode: %o", targetNode);
184
+ if(!dropped){
185
+ logMsg("Drag was cancelled");
186
+ }
187
+ if(targetNode) {
188
+ if(dropped){
189
+ targetNode.tree.ext.dnd._onDragEvent("drop", targetNode, sourceNode, event, ui, draggable);
190
+ }
191
+ targetNode.tree.ext.dnd._onDragEvent("leave", targetNode, sourceNode, event, ui, draggable);
192
+ }
193
+ if(sourceNode){
194
+ sourceNode.tree.ext.dnd._onDragEvent("stop", sourceNode, null, event, ui, draggable);
195
+ }
196
+ }
197
+ });
198
+
199
+ didRegisterDnd = true;
200
+ }
201
+
202
+
203
+ /* *****************************************************************************
204
+ *
205
+ */
206
+
207
+ $.ui.fancytree.registerExtension(
208
+ {
209
+ name: "dnd",
210
+ version: "0.1.0",
211
+ // Default options for this extension.
212
+ options: {
213
+ // Make tree nodes draggable:
214
+ dragStart: null, // Callback(sourceNode, data), return true, to enable dnd
215
+ dragStop: null, // Callback(sourceNode, data)
216
+ // helper: null,
217
+ // Make tree nodes accept draggables
218
+ autoExpandMS: 1000, // Expand nodes after n milliseconds of hovering.
219
+ preventVoidMoves: true, // Prevent dropping nodes 'before self', etc.
220
+ preventRecursiveMoves: true, // Prevent dropping nodes on own descendants
221
+ dragEnter: null, // Callback(targetNode, data)
222
+ dragOver: null, // Callback(targetNode, data)
223
+ dragDrop: null, // Callback(targetNode, data)
224
+ dragLeave: null, // Callback(targetNode, data)
225
+ //
226
+ draggable: null, // Additional options passed to jQuery draggable
227
+ droppable: null // Additional options passed to jQuery droppable
228
+ },
229
+ // Override virtual methods for this extension.
230
+ // `this` : Fancytree instance
231
+ // `this._super`: the virtual function that was overriden (member of prev. extension or Fancytree)
232
+ treeInit: function(ctx){
233
+ var tree = ctx.tree;
234
+ this._super(ctx);
235
+ _initDragAndDrop(tree);
236
+ },
237
+ /* Override key handler in order to cancel dnd on escape.*/
238
+ nodeKeydown: function(ctx) {
239
+ var event = ctx.originalEvent;
240
+ if( event.which === $.ui.keyCode.ESCAPE) {
241
+ this._local._cancelDrag();
242
+ }
243
+ return this._super(ctx);
244
+ },
245
+ /* Display drop marker according to hitMode ('after', 'before', 'over', 'out', 'start', 'stop'). */
246
+ _setDndStatus: function(sourceNode, targetNode, helper, hitMode, accept) {
247
+ var posOpts,
248
+ markerOffsetX = 0,
249
+ markerAt = "center",
250
+ instData = this._local,
251
+ $source = sourceNode ? $(sourceNode.span) : null,
252
+ $target = $(targetNode.span);
253
+
254
+ if( !instData.$dropMarker ) {
255
+ instData.$dropMarker = $("<div id='fancytree-drop-marker'></div>")
256
+ .hide()
257
+ .css({"z-index": 1000})
258
+ .prependTo($(this.$div).parent());
259
+ // .prependTo("body");
260
+ // logMsg("Creating marker: %o", this.$dropMarker);
261
+ }
262
+ /*
263
+ if(hitMode === "start"){
264
+ }
265
+ if(hitMode === "stop"){
266
+ // sourceNode.removeClass("fancytree-drop-target");
267
+ }
268
+ */
269
+ // this.$dropMarker.attr("class", hitMode);
270
+ if(hitMode === "after" || hitMode === "before" || hitMode === "over"){
271
+ // $source && $source.addClass("fancytree-drag-source");
272
+
273
+ // $target.addClass("fancytree-drop-target");
274
+
275
+ switch(hitMode){
276
+ case "before":
277
+ instData.$dropMarker.removeClass("fancytree-drop-after fancytree-drop-over");
278
+ instData.$dropMarker.addClass("fancytree-drop-before");
279
+ markerAt = "top";
280
+ break;
281
+ case "after":
282
+ instData.$dropMarker.removeClass("fancytree-drop-before fancytree-drop-over");
283
+ instData.$dropMarker.addClass("fancytree-drop-after");
284
+ markerAt = "bottom";
285
+ break;
286
+ default:
287
+ instData.$dropMarker.removeClass("fancytree-drop-after fancytree-drop-before");
288
+ instData.$dropMarker.addClass("fancytree-drop-over");
289
+ $target.addClass("fancytree-drop-target");
290
+ markerOffsetX = 8;
291
+ }
292
+
293
+ if( $.ui.fancytree.jquerySupports.positionMyOfs ){
294
+ posOpts = {
295
+ my: "left" + offsetString(markerOffsetX) + " center",
296
+ at: "left " + markerAt,
297
+ of: $target
298
+ };
299
+ } else {
300
+ posOpts = {
301
+ my: "left center",
302
+ at: "left " + markerAt,
303
+ of: $target,
304
+ offset: "" + markerOffsetX + " 0"
305
+ };
306
+ }
307
+ instData.$dropMarker
308
+ .show()
309
+ .position(posOpts);
310
+ // helper.addClass("fancytree-drop-hover");
311
+ } else {
312
+ // $source && $source.removeClass("fancytree-drag-source");
313
+ $target.removeClass("fancytree-drop-target");
314
+ instData.$dropMarker.hide();
315
+ // helper.removeClass("fancytree-drop-hover");
316
+ }
317
+ if(hitMode === "after"){
318
+ $target.addClass("fancytree-drop-after");
319
+ } else {
320
+ $target.removeClass("fancytree-drop-after");
321
+ }
322
+ if(hitMode === "before"){
323
+ $target.addClass("fancytree-drop-before");
324
+ } else {
325
+ $target.removeClass("fancytree-drop-before");
326
+ }
327
+ if(accept === true){
328
+ if($source){
329
+ $source.addClass("fancytree-drop-accept");
330
+ }
331
+ $target.addClass("fancytree-drop-accept");
332
+ helper.addClass("fancytree-drop-accept");
333
+ }else{
334
+ if($source){
335
+ $source.removeClass("fancytree-drop-accept");
336
+ }
337
+ $target.removeClass("fancytree-drop-accept");
338
+ helper.removeClass("fancytree-drop-accept");
339
+ }
340
+ if(accept === false){
341
+ if($source){
342
+ $source.addClass("fancytree-drop-reject");
343
+ }
344
+ $target.addClass("fancytree-drop-reject");
345
+ helper.addClass("fancytree-drop-reject");
346
+ }else{
347
+ if($source){
348
+ $source.removeClass("fancytree-drop-reject");
349
+ }
350
+ $target.removeClass("fancytree-drop-reject");
351
+ helper.removeClass("fancytree-drop-reject");
352
+ }
353
+ },
354
+
355
+ /*
356
+ * Handles drag'n'drop functionality.
357
+ *
358
+ * A standard jQuery drag-and-drop process may generate these calls:
359
+ *
360
+ * draggable helper():
361
+ * _onDragEvent("helper", sourceNode, null, event, null, null);
362
+ * start:
363
+ * _onDragEvent("start", sourceNode, null, event, ui, draggable);
364
+ * drag:
365
+ * _onDragEvent("leave", prevTargetNode, sourceNode, event, ui, draggable);
366
+ * _onDragEvent("over", targetNode, sourceNode, event, ui, draggable);
367
+ * _onDragEvent("enter", targetNode, sourceNode, event, ui, draggable);
368
+ * stop:
369
+ * _onDragEvent("drop", targetNode, sourceNode, event, ui, draggable);
370
+ * _onDragEvent("leave", targetNode, sourceNode, event, ui, draggable);
371
+ * _onDragEvent("stop", sourceNode, null, event, ui, draggable);
372
+ */
373
+ _onDragEvent: function(eventName, node, otherNode, event, ui, draggable) {
374
+ if(eventName !== "over"){
375
+ logMsg("tree.ext.dnd._onDragEvent(%s, %o, %o) - %o", eventName, node, otherNode, this);
376
+ }
377
+ var $helper, nodeOfs, relPos, relPos2,
378
+ enterResponse, hitMode, r,
379
+ opts = this.options,
380
+ dnd = opts.dnd,
381
+ ctx = this._makeHookContext(node, event, {otherNode: otherNode, ui: ui, draggable: draggable}),
382
+ res = null,
383
+ nodeTag = $(node.span);
384
+
385
+ switch (eventName) {
386
+ case "helper":
387
+ // Only event and node argument is available
388
+ $helper = $("<div class='fancytree-drag-helper'><span class='fancytree-drag-helper-img' /></div>")
389
+ // .append($(event.target).closest("span.fancytree-node").find("span.fancytree-title").clone());
390
+ .append(nodeTag.find("span.fancytree-title").clone());
391
+ // issue 244: helper should be child of scrollParent
392
+ $("ul.fancytree-container", node.tree.$div).append($helper);
393
+ // Attach node reference to helper object
394
+ $helper.data("ftSourceNode", node);
395
+ // logMsg("helper=%o", $helper);
396
+ // logMsg("helper.sourceNode=%o", $helper.data("ftSourceNode"));
397
+ res = $helper;
398
+ break;
399
+ case "start":
400
+ if( node.isStatusNode() ) {
401
+ res = false;
402
+ } else if(dnd.dragStart) {
403
+ res = dnd.dragStart(node, ctx);
404
+ }
405
+ if(res === false) {
406
+ this.debug("tree.dragStart() cancelled");
407
+ //draggable._clear();
408
+ // NOTE: the return value seems to be ignored (drag is not canceled, when false is returned)
409
+ // TODO: call this._cancelDrag()?
410
+ ui.helper.trigger("mouseup");
411
+ ui.helper.hide();
412
+ } else {
413
+ nodeTag.addClass("fancytree-drag-source");
414
+ }
415
+ break;
416
+ case "enter":
417
+ if(dnd.preventRecursiveMoves && node.isDescendantOf(otherNode)){
418
+ r = false;
419
+ }else{
420
+ r = dnd.dragEnter ? dnd.dragEnter(node, ctx) : null;
421
+ }
422
+ if(!r){
423
+ // convert null, undefined, false to false
424
+ res = false;
425
+ }else if ( $.isArray(r) ) {
426
+ // TODO: also accept passing an object of this format directly
427
+ res = {
428
+ over: ($.inArray("over", r) >= 0),
429
+ before: ($.inArray("before", r) >= 0),
430
+ after: ($.inArray("after", r) >= 0)
431
+ };
432
+ }else{
433
+ res = {
434
+ over: ((r === true) || (r === "over")),
435
+ before: ((r === true) || (r === "before")),
436
+ after: ((r === true) || (r === "after"))
437
+ };
438
+ }
439
+ ui.helper.data("enterResponse", res);
440
+ logMsg("helper.enterResponse: %o", res);
441
+ break;
442
+ case "over":
443
+ enterResponse = ui.helper.data("enterResponse");
444
+ hitMode = null;
445
+ if(enterResponse === false){
446
+ // Don't call dragOver if onEnter returned false.
447
+ // break;
448
+ } else if(typeof enterResponse === "string") {
449
+ // Use hitMode from onEnter if provided.
450
+ hitMode = enterResponse;
451
+ } else {
452
+ // Calculate hitMode from relative cursor position.
453
+ nodeOfs = nodeTag.offset();
454
+ relPos = { x: event.pageX - nodeOfs.left,
455
+ y: event.pageY - nodeOfs.top };
456
+ relPos2 = { x: relPos.x / nodeTag.width(),
457
+ y: relPos.y / nodeTag.height() };
458
+
459
+ if( enterResponse.after && relPos2.y > 0.75 ){
460
+ hitMode = "after";
461
+ } else if(!enterResponse.over && enterResponse.after && relPos2.y > 0.5 ){
462
+ hitMode = "after";
463
+ } else if(enterResponse.before && relPos2.y <= 0.25) {
464
+ hitMode = "before";
465
+ } else if(!enterResponse.over && enterResponse.before && relPos2.y <= 0.5) {
466
+ hitMode = "before";
467
+ } else if(enterResponse.over) {
468
+ hitMode = "over";
469
+ }
470
+ // Prevent no-ops like 'before source node'
471
+ // TODO: these are no-ops when moving nodes, but not in copy mode
472
+ if( dnd.preventVoidMoves ){
473
+ if(node === otherNode){
474
+ logMsg(" drop over source node prevented");
475
+ hitMode = null;
476
+ }else if(hitMode === "before" && otherNode && node === otherNode.getNextSibling()){
477
+ logMsg(" drop after source node prevented");
478
+ hitMode = null;
479
+ }else if(hitMode === "after" && otherNode && node === otherNode.getPrevSibling()){
480
+ logMsg(" drop before source node prevented");
481
+ hitMode = null;
482
+ }else if(hitMode === "over" && otherNode && otherNode.parent === node && otherNode.isLastSibling() ){
483
+ logMsg(" drop last child over own parent prevented");
484
+ hitMode = null;
485
+ }
486
+ }
487
+ // logMsg("hitMode: %s - %s - %s", hitMode, (node.parent === otherNode), node.isLastSibling());
488
+ ui.helper.data("hitMode", hitMode);
489
+ }
490
+ // Auto-expand node (only when 'over' the node, not 'before', or 'after')
491
+ if(hitMode === "over" && dnd.autoExpandMS && node.hasChildren() !== false && !node.expanded) {
492
+ node.scheduleAction("expand", dnd.autoExpandMS);
493
+ }
494
+ if(hitMode && dnd.dragOver){
495
+ // TODO: http://code.google.com/p/dynatree/source/detail?r=625
496
+ ctx.hitMode = hitMode;
497
+ res = dnd.dragOver(node, ctx);
498
+ }
499
+ // issue 332
500
+ // this._setDndStatus(otherNode, node, ui.helper, hitMode, res!==false);
501
+ this._local._setDndStatus(otherNode, node, ui.helper, hitMode, res!==false && hitMode !== null);
502
+ break;
503
+ case "drop":
504
+ hitMode = ui.helper.data("hitMode");
505
+ if(hitMode && dnd.dragDrop){
506
+ ctx.hitMode = hitMode;
507
+ dnd.dragDrop(node, ctx);
508
+ }
509
+ break;
510
+ case "leave":
511
+ // Cancel pending expand request
512
+ node.scheduleAction("cancel");
513
+ ui.helper.data("enterResponse", null);
514
+ ui.helper.data("hitMode", null);
515
+ this._local._setDndStatus(otherNode, node, ui.helper, "out", undefined);
516
+ if(dnd.dragLeave){
517
+ dnd.dragLeave(node, ctx);
518
+ }
519
+ break;
520
+ case "stop":
521
+ nodeTag.removeClass("fancytree-drag-source");
522
+ if(dnd.dragStop){
523
+ dnd.dragStop(node, ctx);
524
+ }
525
+ break;
526
+ default:
527
+ throw "Unsupported drag event: " + eventName;
528
+ }
529
+ return res;
530
+ },
531
+
532
+ _cancelDrag: function() {
533
+ var dd = $.ui.ddmanager.current;
534
+ if(dd){
535
+ dd.cancel();
536
+ }
537
+ }
538
+ });
539
+ }(jQuery, window, document));