compass-jquery-plugin 0.3.0.beta.10 → 0.3.0.beta.13
Sign up to get free protection for your applications and to get access to all the features.
- data/.loadpath +5 -5
- data/.project +18 -17
- data/VERSION.yml +1 -1
- data/compass-jquery-plugin.gemspec +26 -2
- data/gem_tasks/dynatree.rake +1 -1
- data/gem_tasks/jqgrid.rake +15 -14
- data/gem_tasks/jrails.rake +3 -13
- data/lib/compiler.jar +0 -0
- data/lib/jquery/gridify/grid_column.rb +16 -9
- data/lib/jquery/gridify/grid_finder.rb +36 -17
- data/lib/jquery/gridify/grid_options.rb +10 -8
- data/lib/jquery/gridify/grid_view.rb +2 -1
- data/lib/jquery.ui.rb +5 -27
- data/templates/dynatree/jquery.dynatree.js +822 -243
- data/templates/dynatree/jquery.dynatree.min.js +71 -58
- data/templates/dynatree/jquery.ui/dynatree.aero/copy_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aero/drop_accept.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aero/drop_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aero/drop_reject.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aero/move_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aero.scss +136 -52
- data/templates/dynatree/jquery.ui/dynatree.aqua/copy_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aqua/drop_accept.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aqua/drop_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aqua/drop_reject.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aqua/move_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.aqua.scss +136 -52
- data/templates/dynatree/jquery.ui/dynatree.crystal/copy_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.crystal/drop_accept.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.crystal/drop_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.crystal/drop_reject.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.crystal/move_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.crystal.scss +136 -52
- data/templates/dynatree/jquery.ui/dynatree.xp/copy_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.xp/drop_accept.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.xp/drop_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.xp/drop_reject.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.xp/move_here.png +0 -0
- data/templates/dynatree/jquery.ui/dynatree.xp.scss +229 -127
- data/templates/dynatree/manifest.rb +20 -0
- data/templates/jqgrid/i18n/jqgrid/locale-da.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-da.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-es.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-es.min.js +7 -0
- data/templates/jqgrid/jquery.jqGrid.js +6772 -6464
- data/templates/jqgrid/jquery.jqGrid.min.js +455 -441
- data/templates/jqgrid/jquery.ui/jqGrid.scss +24 -1
- data/templates/jqgrid/manifest.rb +4 -0
- data/templates/jqical/jquery.jqical.min.js +170 -171
- data/templates/jqical/jquery.ui/jqical.scss +2 -2
- data/templates/jqtouch/jqtouch/jqtouch.scss +1 -1
- data/templates/jrails/jquery-1.4.2.min.js +210 -210
- data/templates/jrails/jquery-ui-1.8.2.min.js +761 -759
- data/templates/jrails/jquery.compat-1.3.min.js +2 -2
- data/templates/jrails/jquery.contextMenu.min.js +1 -1
- data/templates/jrails/jquery.farbtastic.min.js +2 -2
- data/templates/jrails/jquery.haml.min.js +5 -5
- data/templates/jrails/jquery.metadata.min.js +2 -2
- data/templates/jrails/jquery.pngFix.min.js +1 -1
- data/templates/jrails/jquery.themeswitchertool.min.js +7 -8
- data/templates/jrails/jquery.ui/_theme.scss +6 -1
- data/templates/jrails/jquery.ui/base.scss +38 -43
- data/templates/jrails/jquery.ui/black-tie/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
- data/templates/jrails/jquery.ui/black-tie/ui-bg_inset-hard_55_ffeb80_1x100.png +0 -0
- data/templates/jrails/jquery.ui/black-tie/ui-icons_4ca300_256x240.png +0 -0
- data/templates/jrails/jquery.ui/black-tie/ui-icons_bbbbbb_256x240.png +0 -0
- data/templates/jrails/jquery.ui/black-tie/ui-icons_ffcf29_256x240.png +0 -0
- data/templates/jrails/jquery.ui/black-tie.scss +38 -43
- data/templates/jrails/jquery.ui/blitzer/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
- data/templates/jrails/jquery.ui/blitzer/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
- data/templates/jrails/jquery.ui/blitzer.scss +38 -43
- data/templates/jrails/jquery.ui/cupertino/ui-bg_highlight-soft_25_ffef8f_1x100.png +0 -0
- data/templates/jrails/jquery.ui/cupertino.scss +38 -43
- data/templates/jrails/jquery.ui/dark-hive/ui-bg_highlight-soft_33_003147_1x100.png +0 -0
- data/templates/jrails/jquery.ui/dark-hive/ui-icons_a83300_256x240.png +0 -0
- data/templates/jrails/jquery.ui/dark-hive.scss +38 -43
- data/templates/jrails/jquery.ui/dot-luv/ui-bg_diagonals-thick_15_0b3e6f_40x40.png +0 -0
- data/templates/jrails/jquery.ui/dot-luv/ui-bg_dots-small_30_a32d00_2x2.png +0 -0
- data/templates/jrails/jquery.ui/dot-luv/ui-bg_dots-small_40_00498f_2x2.png +0 -0
- data/templates/jrails/jquery.ui/dot-luv/ui-icons_00498f_256x240.png +0 -0
- data/templates/jrails/jquery.ui/dot-luv.scss +38 -43
- data/templates/jrails/jquery.ui/eggplant/ui-bg_highlight-soft_45_5f5964_1x100.png +0 -0
- data/templates/jrails/jquery.ui/eggplant/ui-icons_ebccce_256x240.png +0 -0
- data/templates/jrails/jquery.ui/eggplant.scss +38 -43
- data/templates/jrails/jquery.ui/excite-bike/ui-bg_diagonals-thick_20_e69700_40x40.png +0 -0
- data/templates/jrails/jquery.ui/excite-bike/ui-bg_flat_0_e69700_40x100.png +0 -0
- data/templates/jrails/jquery.ui/excite-bike/ui-bg_highlight-soft_100_f9f9f9_1x100.png +0 -0
- data/templates/jrails/jquery.ui/excite-bike/ui-icons_0a82eb_256x240.png +0 -0
- data/templates/jrails/jquery.ui/excite-bike/ui-icons_0b54d5_256x240.png +0 -0
- data/templates/jrails/jquery.ui/excite-bike.scss +38 -43
- data/templates/jrails/jquery.ui/flick/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
- data/templates/jrails/jquery.ui/flick.scss +38 -43
- data/templates/jrails/jquery.ui/hot-sneaks/ui-bg_diagonals-small_50_ff3853_40x40.png +0 -0
- data/templates/jrails/jquery.ui/hot-sneaks/ui-bg_diagonals-small_75_ccd232_40x40.png +0 -0
- data/templates/jrails/jquery.ui/hot-sneaks/ui-bg_flat_75_ba9217_40x100.png +0 -0
- data/templates/jrails/jquery.ui/hot-sneaks/ui-icons_e1e463_256x240.png +0 -0
- data/templates/jrails/jquery.ui/hot-sneaks.scss +38 -43
- data/templates/jrails/jquery.ui/humanity/ui-bg_glass_100_f5f0e5_1x400.png +0 -0
- data/templates/jrails/jquery.ui/humanity/ui-bg_highlight-hard_65_fee4bd_1x100.png +0 -0
- data/templates/jrails/jquery.ui/humanity/ui-bg_inset-soft_100_f4f0ec_1x100.png +0 -0
- data/templates/jrails/jquery.ui/humanity/ui-icons_f35f07_256x240.png +0 -0
- data/templates/jrails/jquery.ui/humanity/ui-icons_ff7519_256x240.png +0 -0
- data/templates/jrails/jquery.ui/humanity.scss +38 -43
- data/templates/jrails/jquery.ui/le-frog/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
- data/templates/jrails/jquery.ui/le-frog/ui-bg_highlight-soft_33_3a8104_1x100.png +0 -0
- data/templates/jrails/jquery.ui/le-frog/ui-bg_highlight-soft_50_4eb305_1x100.png +0 -0
- data/templates/jrails/jquery.ui/le-frog/ui-bg_highlight-soft_60_4ca20b_1x100.png +0 -0
- data/templates/jrails/jquery.ui/le-frog/ui-icons_72b42d_256x240.png +0 -0
- data/templates/jrails/jquery.ui/le-frog.scss +38 -43
- data/templates/jrails/jquery.ui/mint-choc/ui-bg_glass_15_5f391b_1x400.png +0 -0
- data/templates/jrails/jquery.ui/mint-choc/ui-bg_gloss-wave_20_1c160d_500x100.png +0 -0
- data/templates/jrails/jquery.ui/mint-choc/ui-icons_9bcc60_256x240.png +0 -0
- data/templates/jrails/jquery.ui/mint-choc.scss +38 -43
- data/templates/jrails/jquery.ui/overcast/ui-bg_flat_55_c0402a_40x100.png +0 -0
- data/templates/jrails/jquery.ui/overcast/ui-bg_glass_100_f8f8f8_1x400.png +0 -0
- data/templates/jrails/jquery.ui/overcast/ui-icons_70b2e1_256x240.png +0 -0
- data/templates/jrails/jquery.ui/overcast/ui-icons_fbc856_256x240.png +0 -0
- data/templates/jrails/jquery.ui/overcast.scss +38 -43
- data/templates/jrails/jquery.ui/pepper-grinder/ui-bg_fine-grain_65_654b24_60x60.png +0 -0
- data/templates/jrails/jquery.ui/pepper-grinder/ui-icons_fbdb93_256x240.png +0 -0
- data/templates/jrails/jquery.ui/pepper-grinder.scss +38 -43
- data/templates/jrails/jquery.ui/redmond/ui-bg_flat_55_fbec88_40x100.png +0 -0
- data/templates/jrails/jquery.ui/redmond/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
- data/templates/jrails/jquery.ui/redmond/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
- data/templates/jrails/jquery.ui/redmond/ui-icons_d8e7f3_256x240.png +0 -0
- data/templates/jrails/jquery.ui/redmond.scss +38 -43
- data/templates/jrails/jquery.ui/smoothness/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/templates/jrails/jquery.ui/smoothness/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/templates/jrails/jquery.ui/smoothness.scss +38 -43
- data/templates/jrails/jquery.ui/south-street/ui-bg_highlight-hard_100_f5f3e5_1x100.png +0 -0
- data/templates/jrails/jquery.ui/south-street/ui-bg_highlight-soft_25_67b021_1x100.png +0 -0
- data/templates/jrails/jquery.ui/south-street/ui-bg_highlight-soft_95_ffedad_1x100.png +0 -0
- data/templates/jrails/jquery.ui/south-street/ui-icons_847e71_256x240.png +0 -0
- data/templates/jrails/jquery.ui/south-street.scss +38 -43
- data/templates/jrails/jquery.ui/start/ui-bg_glass_55_f8da4e_1x400.png +0 -0
- data/templates/jrails/jquery.ui/start/ui-bg_gloss-wave_75_2191c0_500x100.png +0 -0
- data/templates/jrails/jquery.ui/start/ui-icons_056b93_256x240.png +0 -0
- data/templates/jrails/jquery.ui/start/ui-icons_d8e7f3_256x240.png +0 -0
- data/templates/jrails/jquery.ui/start/ui-icons_f7a50d_256x240.png +0 -0
- data/templates/jrails/jquery.ui/start/ui-icons_fcd113_256x240.png +0 -0
- data/templates/jrails/jquery.ui/start.scss +38 -43
- data/templates/jrails/jquery.ui/sunny/ui-bg_diagonals-medium_20_d34d17_40x40.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-bg_gloss-wave_60_fece2f_500x100.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-bg_gloss-wave_90_fff9e5_500x100.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-bg_highlight-soft_100_feeebd_1x100.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-icons_3d3d3d_256x240.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-icons_d19405_256x240.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-icons_eb990f_256x240.png +0 -0
- data/templates/jrails/jquery.ui/sunny/ui-icons_ffe180_256x240.png +0 -0
- data/templates/jrails/jquery.ui/sunny.scss +38 -43
- data/templates/jrails/jquery.ui/swanky-purse/ui-bg_diamond_10_4f4221_10x8.png +0 -0
- data/templates/jrails/jquery.ui/swanky-purse/ui-bg_diamond_8_443113_10x8.png +0 -0
- data/templates/jrails/jquery.ui/swanky-purse/ui-bg_highlight-hard_65_fee4bd_1x100.png +0 -0
- data/templates/jrails/jquery.ui/swanky-purse/ui-icons_e8e2b5_256x240.png +0 -0
- data/templates/jrails/jquery.ui/swanky-purse/ui-icons_f9f2bd_256x240.png +0 -0
- data/templates/jrails/jquery.ui/swanky-purse/ui-icons_ff7519_256x240.png +0 -0
- data/templates/jrails/jquery.ui/swanky-purse.scss +38 -43
- data/templates/jrails/jquery.ui/trontastic/ui-bg_diagonals-small_50_262626_40x40.png +0 -0
- data/templates/jrails/jquery.ui/trontastic/ui-bg_flat_0_4c4c4c_40x100.png +0 -0
- data/templates/jrails/jquery.ui/trontastic/ui-bg_gloss-wave_85_9fda58_500x100.png +0 -0
- data/templates/jrails/jquery.ui/trontastic/ui-bg_gloss-wave_95_f6ecd5_500x100.png +0 -0
- data/templates/jrails/jquery.ui/trontastic/ui-icons_9fda58_256x240.png +0 -0
- data/templates/jrails/jquery.ui/trontastic.scss +38 -43
- data/templates/jrails/jquery.ui/ui-darkness/ui-bg_glass_40_0078a3_1x400.png +0 -0
- data/templates/jrails/jquery.ui/ui-darkness/ui-icons_a83300_256x240.png +0 -0
- data/templates/jrails/jquery.ui/ui-darkness.scss +38 -43
- data/templates/jrails/jquery.ui/ui-lightness/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/templates/jrails/jquery.ui/ui-lightness/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/templates/jrails/jquery.ui/ui-lightness/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/templates/jrails/jquery.ui/ui-lightness/ui-icons_228ef1_256x240.png +0 -0
- data/templates/jrails/jquery.ui/ui-lightness.scss +38 -43
- data/templates/jrails/jquery.ui/vader/ui-bg_highlight-soft_35_adadad_1x100.png +0 -0
- data/templates/jrails/jquery.ui/vader/ui-icons_bbbbbb_256x240.png +0 -0
- data/templates/jrails/jquery.ui/vader.scss +38 -43
- data/templates/jrails/jrails.min.js +4 -4
- data/templates/jrails/manifest.rb +0 -1
- data/templates/ribbon/jquery.ribbon.min.js +12 -12
- metadata +28 -4
@@ -1,32 +1,31 @@
|
|
1
|
-
|
1
|
+
/*
|
2
2
|
jquery.dynatree.js
|
3
3
|
Dynamic tree view control, with support for lazy loading of branches.
|
4
4
|
|
5
|
-
Copyright (c) 2008-2010 Martin Wendt (http://wwWendt.de)
|
6
|
-
|
7
|
-
|
5
|
+
Copyright (c) 2008-2010, Martin Wendt (http://wwWendt.de)
|
6
|
+
Dual licensed under the MIT or GPL Version 2 licenses.
|
7
|
+
http://code.google.com/p/dynatree/wiki/LicenseInfo
|
8
|
+
|
8
9
|
A current version and some documentation is available at
|
9
10
|
http://dynatree.googlecode.com/
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
$Version: 0.5.3$
|
14
|
-
$Revision: 313, 2010-03-15 15:55:09$
|
12
|
+
$Version:$
|
13
|
+
$Revision:$
|
15
14
|
|
16
15
|
@depends: jquery.js
|
17
|
-
@depends: ui.core.js
|
16
|
+
@depends: jquery.ui.core.js
|
18
17
|
@depends: jquery.cookie.js
|
19
|
-
|
18
|
+
*/
|
20
19
|
|
21
20
|
|
22
|
-
|
21
|
+
/*
|
23
22
|
* Debug functions
|
24
23
|
*/
|
25
24
|
|
26
|
-
var _canLog =
|
25
|
+
var _canLog = false;
|
27
26
|
|
28
27
|
function _log(mode, msg) {
|
29
|
-
|
28
|
+
/*
|
30
29
|
* Usage: logMsg("%o was toggled", this);
|
31
30
|
*/
|
32
31
|
if( !_canLog )
|
@@ -64,10 +63,8 @@ function logMsg(msg) {
|
|
64
63
|
// Forward declaration
|
65
64
|
var getDynaTreePersistData = undefined;
|
66
65
|
|
67
|
-
|
68
|
-
|
69
|
-
/*************************************************************************
|
70
|
-
* Constants
|
66
|
+
/*
|
67
|
+
* Constants
|
71
68
|
*/
|
72
69
|
var DTNodeStatus_Error = -1;
|
73
70
|
var DTNodeStatus_Loading = 1;
|
@@ -77,7 +74,7 @@ var DTNodeStatus_Ok = 0;
|
|
77
74
|
// Start of local namespace
|
78
75
|
;(function($) {
|
79
76
|
|
80
|
-
|
77
|
+
/*
|
81
78
|
* Common tool functions.
|
82
79
|
*/
|
83
80
|
|
@@ -89,14 +86,24 @@ var Class = {
|
|
89
86
|
}
|
90
87
|
}
|
91
88
|
|
92
|
-
|
89
|
+
// Tool function to get dtnode from the event target:
|
90
|
+
function getDtNodeFromElement(el) {
|
91
|
+
var iMax = 5;
|
92
|
+
while( el && iMax-- ) {
|
93
|
+
if( el.dtnode ) return el.dtnode;
|
94
|
+
el = el.parentNode;
|
95
|
+
};
|
96
|
+
return null;
|
97
|
+
}
|
98
|
+
|
99
|
+
/*
|
93
100
|
* Class DynaTreeNode
|
94
101
|
*/
|
95
102
|
var DynaTreeNode = Class.create();
|
96
103
|
|
97
104
|
DynaTreeNode.prototype = {
|
98
105
|
initialize: function(parent, tree, data) {
|
99
|
-
|
106
|
+
/*
|
100
107
|
* @constructor
|
101
108
|
*/
|
102
109
|
this.parent = parent;
|
@@ -106,8 +113,10 @@ DynaTreeNode.prototype = {
|
|
106
113
|
if( data.key == undefined )
|
107
114
|
data.key = "_" + tree._nodeCount++;
|
108
115
|
this.data = $.extend({}, $.ui.dynatree.nodedatadefaults, data);
|
109
|
-
this.div = null; // not yet created
|
116
|
+
// this.div = null; // not yet created
|
117
|
+
this.li = null; // not yet created
|
110
118
|
this.span = null; // not yet created
|
119
|
+
this.ul = null; // not yet created
|
111
120
|
this.childList = null; // no subnodes yet
|
112
121
|
// this.isRead = false; // Lazy content not yet read
|
113
122
|
this.isLoading = false; // Lazy content is being loaded
|
@@ -140,11 +149,12 @@ DynaTreeNode.prototype = {
|
|
140
149
|
var opts = this.tree.options;
|
141
150
|
var cache = this.tree.cache;
|
142
151
|
// parent connectors
|
143
|
-
var rootParent = opts.rootVisible ? null : this.tree.tnRoot;
|
144
|
-
var bHideFirstExpander = (opts.rootVisible && opts.minExpandLevel>0) || opts.minExpandLevel>1;
|
145
|
-
var bHideFirstConnector = opts.rootVisible || opts.minExpandLevel>0;
|
146
|
-
|
152
|
+
// var rootParent = opts.rootVisible ? null : this.tree.tnRoot;
|
153
|
+
// var bHideFirstExpander = (opts.rootVisible && opts.minExpandLevel>0) || opts.minExpandLevel>1;
|
154
|
+
// var bHideFirstConnector = opts.rootVisible || opts.minExpandLevel>0;
|
155
|
+
var level = this.getLevel();
|
147
156
|
var res = "";
|
157
|
+
/*
|
148
158
|
var p = this.parent;
|
149
159
|
while( p ) {
|
150
160
|
// Suppress first connector column, if visible top level is always expanded
|
@@ -153,10 +163,11 @@ DynaTreeNode.prototype = {
|
|
153
163
|
res = ( p.isLastSibling() ? cache.tagEmpty : cache.tagVline) + res;
|
154
164
|
p = p.parent;
|
155
165
|
}
|
156
|
-
|
166
|
+
*/
|
157
167
|
// connector (expanded, expandable or simple)
|
158
|
-
|
159
|
-
|
168
|
+
|
169
|
+
if( level < opts.minExpandLevel ) {
|
170
|
+
// skip expander/connector
|
160
171
|
} else if ( this.childList || this.data.isLazy ) {
|
161
172
|
res += cache.tagExpander;
|
162
173
|
} else {
|
@@ -184,101 +195,145 @@ DynaTreeNode.prototype = {
|
|
184
195
|
return res;
|
185
196
|
},
|
186
197
|
|
198
|
+
|
187
199
|
_fixOrder: function() {
|
188
|
-
|
189
|
-
* Make sure, that <
|
200
|
+
/*
|
201
|
+
* Make sure, that <li> order matches childList order.
|
190
202
|
*/
|
191
203
|
var cl = this.childList;
|
192
204
|
if( !cl )
|
193
205
|
return;
|
194
|
-
var
|
206
|
+
var childLI = this.ul.firstChild;
|
195
207
|
for(var i=0; i<cl.length-1; i++) {
|
196
208
|
var childNode1 = cl[i];
|
197
|
-
var childNode2 =
|
209
|
+
var childNode2 = childLI.dtnode;
|
198
210
|
if( childNode1 !== childNode2 ) {
|
199
|
-
//
|
200
211
|
this.tree.logDebug("_fixOrder: mismatch at index " + i + ": " + childNode1 + " != " + childNode2);
|
201
|
-
this.
|
212
|
+
this.ul.insertBefore(childNode1.li, childNode2.li);
|
202
213
|
} else {
|
203
|
-
|
214
|
+
childLI = childLI.nextSibling;
|
204
215
|
}
|
205
216
|
}
|
206
|
-
},
|
207
|
-
|
208
|
-
render: function(
|
209
|
-
|
210
|
-
*
|
217
|
+
},
|
218
|
+
|
219
|
+
render: function(useEffects) {
|
220
|
+
/*
|
221
|
+
* create <li><span>..</span> .. </li> tags for this node.
|
211
222
|
*
|
212
|
-
* <
|
213
|
-
* <span
|
214
|
-
* <
|
215
|
-
*
|
216
|
-
*
|
223
|
+
* <li id='key'> // This div contains the node's span and list of child div's.
|
224
|
+
* <span class='title'>S S S A</span> // Span contains graphic spans and title <a> tag
|
225
|
+
* <ul> // only present, when node has children
|
226
|
+
* <li>child1</li>
|
227
|
+
* <li>child2</li>
|
228
|
+
* </ul>
|
229
|
+
* </li>
|
217
230
|
*/
|
218
|
-
|
231
|
+
this.tree.logDebug("%o.render(%s)", this, useEffects);
|
232
|
+
// ---
|
219
233
|
var opts = this.tree.options;
|
220
234
|
var cn = opts.classNames;
|
221
235
|
var isLastSib = this.isLastSibling();
|
222
|
-
|
223
|
-
if( ! this.
|
224
|
-
|
225
|
-
this.span
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
236
|
+
|
237
|
+
if( !this.parent && !this.ul ) {
|
238
|
+
// Root node has only a <ul>
|
239
|
+
this.li = this.span = null;
|
240
|
+
this.ul = document.createElement("ul");
|
241
|
+
if( opts.minExpandLevel > 1 )
|
242
|
+
this.ul.className = cn.container + " " + cn.noConnector;
|
243
|
+
else
|
244
|
+
this.ul.className = cn.container;
|
245
|
+
|
246
|
+
} else if( this.parent ) {
|
247
|
+
// Create <li><span /> </li>
|
248
|
+
if( ! this.li ) {
|
249
|
+
this.li = document.createElement("li");
|
250
|
+
this.li.dtnode = this;
|
251
|
+
if( this.data.key && opts.generateIds )
|
252
|
+
this.li.id = opts.idPrefix + this.data.key;
|
253
|
+
|
254
|
+
this.span = document.createElement("span");
|
255
|
+
this.span.className = cn.title;
|
256
|
+
this.li.appendChild(this.span);
|
257
|
+
|
258
|
+
if( !this.parent.ul ) {
|
259
|
+
// This is the parent's first child: create UL tag
|
260
|
+
// (Hidden, because it will be
|
261
|
+
this.parent.ul = document.createElement("ul");
|
262
|
+
this.parent.ul.style.display = "none";
|
263
|
+
this.parent.li.appendChild(this.parent.ul);
|
264
|
+
}
|
265
|
+
this.parent.ul.appendChild(this.li);
|
233
266
|
}
|
267
|
+
// set node connector images, links and text
|
268
|
+
this.span.innerHTML = this._getInnerHtml();
|
269
|
+
|
270
|
+
// Set classes for current status
|
271
|
+
var cnList = [];
|
272
|
+
cnList.push(cn.node);
|
273
|
+
if( this.data.isFolder )
|
274
|
+
cnList.push(cn.folder);
|
275
|
+
if( this.bExpanded )
|
276
|
+
cnList.push(cn.expanded);
|
277
|
+
if( this.childList != null )
|
278
|
+
cnList.push(cn.hasChildren);
|
279
|
+
// if( this.data.isLazy && !this.isRead )
|
280
|
+
if( this.data.isLazy && this.childList==null )
|
281
|
+
cnList.push(cn.lazy);
|
282
|
+
if( isLastSib )
|
283
|
+
cnList.push(cn.lastsib);
|
284
|
+
if( this.bSelected )
|
285
|
+
cnList.push(cn.selected);
|
286
|
+
if( this.hasSubSel )
|
287
|
+
cnList.push(cn.partsel);
|
288
|
+
if( this.tree.activeNode === this )
|
289
|
+
cnList.push(cn.active);
|
290
|
+
if( this.data.addClass )
|
291
|
+
cnList.push(this.data.addClass);
|
292
|
+
// IE6 doesn't correctly evaluate multiple class names,
|
293
|
+
// so we create combined class names that can be used in the CSS
|
294
|
+
cnList.push(cn.combinedExpanderPrefix
|
295
|
+
+ (this.bExpanded ? "e" : "c")
|
296
|
+
+ (this.data.isLazy && this.childList==null ? "d" : "")
|
297
|
+
+ (isLastSib ? "l" : "")
|
298
|
+
);
|
299
|
+
cnList.push(cn.combinedIconPrefix
|
300
|
+
+ (this.bExpanded ? "e" : "c")
|
301
|
+
+ (this.data.isFolder ? "f" : "")
|
302
|
+
);
|
303
|
+
this.span.className = cnList.join(" ");
|
304
|
+
|
305
|
+
// TODO: we should not set this in the <span> tag also, if we set it here:
|
306
|
+
this.li.className = isLastSib ? cn.lastsib : "";
|
307
|
+
|
308
|
+
// Hide children, if node is collapsed
|
309
|
+
// this.ul.style.display = ( this.bExpanded || !this.parent ) ? "" : "none";
|
310
|
+
}
|
234
311
|
|
235
|
-
|
236
|
-
this.span.style.display = "none";
|
237
|
-
}
|
238
|
-
// set node connector images, links and text
|
239
|
-
this.span.innerHTML = this._getInnerHtml();
|
240
|
-
|
241
|
-
// hide this node, if parent is collapsed
|
242
|
-
this.div.style.display = ( this.parent==null || this.parent.bExpanded ? "" : "none");
|
243
|
-
|
244
|
-
// Set classes for current status
|
245
|
-
var cnList = [];
|
246
|
-
cnList.push( ( this.data.isFolder ) ? cn.folder : cn.document );
|
247
|
-
if( this.bExpanded )
|
248
|
-
cnList.push(cn.expanded);
|
249
|
-
if( this.childList != null )
|
250
|
-
cnList.push(cn.hasChildren);
|
251
|
-
if( this.data.isLazy && this.childList==null )
|
252
|
-
cnList.push(cn.lazy);
|
253
|
-
if( isLastSib )
|
254
|
-
cnList.push(cn.lastsib);
|
255
|
-
if( this.bSelected )
|
256
|
-
cnList.push(cn.selected);
|
257
|
-
if( this.hasSubSel )
|
258
|
-
cnList.push(cn.partsel);
|
259
|
-
if( this.tree.activeNode === this )
|
260
|
-
cnList.push(cn.active);
|
261
|
-
if( this.data.addClass )
|
262
|
-
cnList.push(this.data.addClass);
|
263
|
-
// IE6 doesn't correctly evaluate multiple class names,
|
264
|
-
// so we create combined class names that can be used in the CSS
|
265
|
-
cnList.push(cn.combinedExpanderPrefix
|
266
|
-
+ (this.bExpanded ? "e" : "c")
|
267
|
-
+ (this.data.isLazy && this.childList==null ? "d" : "")
|
268
|
-
+ (isLastSib ? "l" : "")
|
269
|
-
);
|
270
|
-
cnList.push(cn.combinedIconPrefix
|
271
|
-
+ (this.bExpanded ? "e" : "c")
|
272
|
-
+ (this.data.isFolder ? "f" : "")
|
273
|
-
);
|
274
|
-
this.span.className = cnList.join(" ");
|
275
|
-
|
276
|
-
if( bDeep && this.childList && (bHidden || this.bExpanded) ) {
|
312
|
+
if( this.bExpanded && this.childList ) {
|
277
313
|
for(var i=0; i<this.childList.length; i++) {
|
278
|
-
this.childList[i].render(
|
314
|
+
this.childList[i].render();
|
279
315
|
}
|
280
316
|
this._fixOrder();
|
281
317
|
}
|
318
|
+
// Hide children, if node is collapsed
|
319
|
+
if( this.ul ) {
|
320
|
+
var isHidden = (this.ul.style.display == "none");
|
321
|
+
// logMsg("isHidden:%s", isHidden);
|
322
|
+
if( useEffects && opts.fx && !!isHidden == !!this.bExpanded ) {
|
323
|
+
var duration = opts.fx.duration || 200;
|
324
|
+
$(this.ul).animate(opts.fx, duration);
|
325
|
+
} else {
|
326
|
+
this.ul.style.display = ( this.bExpanded || !this.parent ) ? "" : "none";
|
327
|
+
}
|
328
|
+
}
|
329
|
+
},
|
330
|
+
|
331
|
+
getParent: function() {
|
332
|
+
return this.parent;
|
333
|
+
},
|
334
|
+
|
335
|
+
getChildren: function() {
|
336
|
+
return this.childList;
|
282
337
|
},
|
283
338
|
|
284
339
|
hasChildren: function() {
|
@@ -291,7 +346,7 @@ DynaTreeNode.prototype = {
|
|
291
346
|
return p.childList[p.childList.length-1] === this;
|
292
347
|
},
|
293
348
|
|
294
|
-
|
349
|
+
getPrevSibling: function() {
|
295
350
|
if( !this.parent ) return null;
|
296
351
|
var ac = this.parent.childList;
|
297
352
|
for(var i=1; i<ac.length; i++) // start with 1, so prev(first) = null
|
@@ -300,7 +355,7 @@ DynaTreeNode.prototype = {
|
|
300
355
|
return null;
|
301
356
|
},
|
302
357
|
|
303
|
-
|
358
|
+
getNextSibling: function() {
|
304
359
|
if( !this.parent ) return null;
|
305
360
|
var ac = this.parent.childList;
|
306
361
|
for(var i=0; i<ac.length-1; i++) // up to length-2, so next(last) = null
|
@@ -308,13 +363,56 @@ DynaTreeNode.prototype = {
|
|
308
363
|
return ac[i+1];
|
309
364
|
return null;
|
310
365
|
},
|
311
|
-
|
366
|
+
|
367
|
+
isStatusNode: function() {
|
368
|
+
return (this.data.isStatusNode === true);
|
369
|
+
},
|
370
|
+
|
371
|
+
isChildOf: function(otherNode) {
|
372
|
+
return (this.parent && this.parent === otherNode);
|
373
|
+
},
|
374
|
+
|
375
|
+
isDescendantOf: function(otherNode) {
|
376
|
+
if(!otherNode)
|
377
|
+
return false;
|
378
|
+
var p = this.parent;
|
379
|
+
while( p ) {
|
380
|
+
if( p===otherNode )
|
381
|
+
return true;
|
382
|
+
p = p.parent;
|
383
|
+
}
|
384
|
+
return false;
|
385
|
+
},
|
386
|
+
|
387
|
+
sortChildren: function(cmp, deep) {
|
388
|
+
/*
|
389
|
+
* Sort child list by title.
|
390
|
+
* cmd: optional comapre function.
|
391
|
+
* deep: optional: pass true to sort all descendant nodes.
|
392
|
+
*/
|
393
|
+
var cl = this.childList;
|
394
|
+
if( !cl )
|
395
|
+
return;
|
396
|
+
cmp = cmp || function(a, b) {
|
397
|
+
return a.data.title === b.data.title ? 0 : a.data.title > b.data.title;
|
398
|
+
};
|
399
|
+
cl.sort(cmp);
|
400
|
+
if( deep ){
|
401
|
+
for(var i=0; i<cl.length; i++){
|
402
|
+
if( cl[i].childList )
|
403
|
+
cl[i].sortChildren(cmp, "$norender$");
|
404
|
+
}
|
405
|
+
}
|
406
|
+
if( deep !== "$norender$" )
|
407
|
+
this.render();
|
408
|
+
},
|
409
|
+
|
312
410
|
_setStatusNode: function(data) {
|
313
411
|
// Create, modify or remove the status child node (pass 'null', to remove it).
|
314
412
|
var firstChild = ( this.childList ? this.childList[0] : null );
|
315
413
|
if( !data ) {
|
316
414
|
if ( firstChild ) {
|
317
|
-
this.
|
415
|
+
this.ul.removeChild(firstChild.li);
|
318
416
|
if( this.childList.length == 1 )
|
319
417
|
this.childList = null;
|
320
418
|
else
|
@@ -323,7 +421,7 @@ DynaTreeNode.prototype = {
|
|
323
421
|
} else if ( firstChild ) {
|
324
422
|
data.isStatusNode = true;
|
325
423
|
firstChild.data = data;
|
326
|
-
firstChild.render(
|
424
|
+
firstChild.render();
|
327
425
|
} else {
|
328
426
|
data.isStatusNode = true;
|
329
427
|
firstChild = this.addChild(data);
|
@@ -338,9 +436,10 @@ DynaTreeNode.prototype = {
|
|
338
436
|
this._setStatusNode(null);
|
339
437
|
// this.isRead = true;
|
340
438
|
this.isLoading = false;
|
341
|
-
this.render(
|
439
|
+
this.render();
|
342
440
|
if( this.tree.options.autoFocus ) {
|
343
|
-
if( this === this.tree.tnRoot && !this.tree.options.rootVisible && this.childList ) {
|
441
|
+
// if( this === this.tree.tnRoot && !this.tree.options.rootVisible && this.childList ) {
|
442
|
+
if( this === this.tree.tnRoot && this.childList ) {
|
344
443
|
// special case: using ajaxInit
|
345
444
|
this.childList[0].focus();
|
346
445
|
} else {
|
@@ -381,6 +480,9 @@ DynaTreeNode.prototype = {
|
|
381
480
|
},
|
382
481
|
|
383
482
|
getLevel: function() {
|
483
|
+
/*
|
484
|
+
* Return node depth. 0: System root node, 1: visible top-level node.
|
485
|
+
*/
|
384
486
|
var level = 0;
|
385
487
|
var dtn = this.parent;
|
386
488
|
while( dtn ) {
|
@@ -391,7 +493,7 @@ DynaTreeNode.prototype = {
|
|
391
493
|
},
|
392
494
|
|
393
495
|
_getTypeForOuterNodeEvent: function(event) {
|
394
|
-
|
496
|
+
/* Return the inner node span (title, checkbox or expander) if
|
395
497
|
* event.target points to the outer span.
|
396
498
|
* This function should fix issue #93:
|
397
499
|
* FF2 ignores empty spans, when generating events (returning the parent instead).
|
@@ -399,8 +501,7 @@ DynaTreeNode.prototype = {
|
|
399
501
|
var cns = this.tree.options.classNames;
|
400
502
|
var target = event.target;
|
401
503
|
// Only process clicks on an outer node span (probably due to a FF2 event handling bug)
|
402
|
-
if( target.className.indexOf(cns.
|
403
|
-
&& target.className.indexOf(cns.document)<0 ) {
|
504
|
+
if( target.className.indexOf(cns.node)<0 ) {
|
404
505
|
return null
|
405
506
|
}
|
406
507
|
// Event coordinates, relative to outer node span:
|
@@ -430,7 +531,7 @@ DynaTreeNode.prototype = {
|
|
430
531
|
|
431
532
|
getEventTargetType: function(event) {
|
432
533
|
// Return the part of a node, that a click event occured on.
|
433
|
-
// Note: there is no check, if the was fired on TIHS node.
|
534
|
+
// Note: there is no check, if the event was fired on TIHS node.
|
434
535
|
var tcn = event && event.target ? event.target.className : "";
|
435
536
|
var cns = this.tree.options.classNames;
|
436
537
|
|
@@ -444,7 +545,7 @@ DynaTreeNode.prototype = {
|
|
444
545
|
return "icon";
|
445
546
|
else if( tcn==cns.empty || tcn==cns.vline || tcn==cns.connector )
|
446
547
|
return "prefix";
|
447
|
-
else if( tcn.indexOf(cns.
|
548
|
+
else if( tcn.indexOf(cns.node)>=0 )
|
448
549
|
// FIX issue #93
|
449
550
|
return this._getTypeForOuterNodeEvent(event);
|
450
551
|
return null;
|
@@ -549,7 +650,8 @@ DynaTreeNode.prototype = {
|
|
549
650
|
break;
|
550
651
|
}
|
551
652
|
}
|
552
|
-
if( this.parent == null && this.tree.options.minExpandLevel>0 ) {
|
653
|
+
// if( this.parent == null && this.tree.options.minExpandLevel>0 ) {
|
654
|
+
if( this.parent == null ) {
|
553
655
|
expand = false;
|
554
656
|
}
|
555
657
|
if( expand ) {
|
@@ -705,9 +807,8 @@ DynaTreeNode.prototype = {
|
|
705
807
|
this.tree.logDebug("_loadContent: succeeded - %o", this);
|
706
808
|
}
|
707
809
|
} catch(e) {
|
708
|
-
// alert(e);
|
709
|
-
this.setLazyNodeStatus(DTNodeStatus_Error);
|
710
810
|
this.tree.logWarning("_loadContent: failed - %o", e);
|
811
|
+
this.setLazyNodeStatus(DTNodeStatus_Error, {tooltip: ""+e});
|
711
812
|
}
|
712
813
|
},
|
713
814
|
|
@@ -718,8 +819,8 @@ DynaTreeNode.prototype = {
|
|
718
819
|
return;
|
719
820
|
}
|
720
821
|
var opts = this.tree.options;
|
721
|
-
if( !bExpand && this.getLevel()<opts.minExpandLevel ) {
|
722
|
-
this.tree.logDebug("dtnode._expand(%o)
|
822
|
+
if( !bExpand && this.getLevel() < opts.minExpandLevel ) {
|
823
|
+
this.tree.logDebug("dtnode._expand(%o) prevented collapse - %o", bExpand, this);
|
723
824
|
return;
|
724
825
|
}
|
725
826
|
if ( opts.onQueryExpand && opts.onQueryExpand.call(this.span, bExpand, this) == false )
|
@@ -733,8 +834,9 @@ DynaTreeNode.prototype = {
|
|
733
834
|
else
|
734
835
|
this.tree.persistence.clearExpand(this.data.key);
|
735
836
|
}
|
736
|
-
|
737
|
-
this.
|
837
|
+
// Do not apply animations in init phase, or before lazy-loading
|
838
|
+
var allowEffects = !(this.data.isLazy && this.childList==null) && !this.isLoading;
|
839
|
+
this.render(allowEffects);
|
738
840
|
|
739
841
|
// Auto-collapse mode: collapse all siblings
|
740
842
|
if( this.bExpanded && this.parent && opts.autoCollapse ) {
|
@@ -753,39 +855,17 @@ DynaTreeNode.prototype = {
|
|
753
855
|
return;
|
754
856
|
}
|
755
857
|
// this.tree.logDebug("_expand: start div toggle - %o", this);
|
756
|
-
|
757
|
-
var fxDuration = opts.fx ? (opts.fx.duration || 200) : 0;
|
758
|
-
if( this.childList ) {
|
759
|
-
for(var i=0; i<this.childList.length; i++ ) {
|
760
|
-
var $child = $(this.childList[i].div);
|
761
|
-
if( fxDuration ) {
|
762
|
-
// This is a toggle, so only do it, if not already rendered (in)visible (issue 98)
|
763
|
-
if( bExpand != $child.is(':visible') )
|
764
|
-
$child.animate(opts.fx, fxDuration);
|
765
|
-
} else {
|
766
|
-
if( bExpand )
|
767
|
-
$child.show();
|
768
|
-
else
|
769
|
-
$child.hide(); // TODO: this seems to be slow, when called the first time for an element
|
770
|
-
}
|
771
|
-
}
|
772
|
-
}
|
773
|
-
|
774
|
-
/* issue 109: using selector filter is really SLOW.
|
775
|
-
// issue 98: only toggle, if render hasn't set visibility already:
|
776
|
-
var filter = ">DIV" + (bExpand ? ":hidden" : ":visible");
|
777
|
-
|
858
|
+
/*
|
778
859
|
if( opts.fx ) {
|
860
|
+
this.render(true);
|
779
861
|
var duration = opts.fx.duration || 200;
|
780
|
-
|
781
|
-
$(filter, this.div).animate(opts.fx, duration);
|
862
|
+
$(this.ul).animate(opts.fx, duration);
|
782
863
|
} else {
|
783
|
-
|
784
|
-
|
785
|
-
// this.tree.logDebug("_expand: got div, start toggle - %o", this);
|
786
|
-
// $d.toggle();
|
864
|
+
this.render();
|
865
|
+
logMsg("_expand: got div, start toggle - %o", this);
|
787
866
|
}
|
788
|
-
|
867
|
+
*/
|
868
|
+
|
789
869
|
// this.tree.logDebug("_expand: end div toggle - %o", this);
|
790
870
|
|
791
871
|
if ( opts.onExpand )
|
@@ -795,11 +875,42 @@ DynaTreeNode.prototype = {
|
|
795
875
|
expand: function(flag) {
|
796
876
|
if( !this.childList && !this.data.isLazy && flag )
|
797
877
|
return; // Prevent expanding empty nodes
|
798
|
-
if( this.parent == null && this.tree.options.minExpandLevel>0 && !flag )
|
878
|
+
// if( this.parent == null && this.tree.options.minExpandLevel>0 && !flag )
|
879
|
+
if( this.parent == null && !flag )
|
799
880
|
return; // Prevent collapsing the root
|
800
881
|
this._expand(flag);
|
801
882
|
},
|
802
883
|
|
884
|
+
scheduleAction: function(mode, ms) {
|
885
|
+
/* Schedule activity for delayed execution (cancel any pending request).
|
886
|
+
* scheduleAction('cancel') will cancel the request.
|
887
|
+
*/
|
888
|
+
if( this.tree.timer ) {
|
889
|
+
clearTimeout(this.tree.timer);
|
890
|
+
logMsg("clearTimeout(%o)", this.tree.timer);
|
891
|
+
}
|
892
|
+
var self = this; // required for closures
|
893
|
+
switch (mode) {
|
894
|
+
case "cancel":
|
895
|
+
// Simply made sure that timer was cleared
|
896
|
+
break;
|
897
|
+
case "expand":
|
898
|
+
this.tree.timer = setTimeout(function(){
|
899
|
+
logMsg("setTimeout: trigger");
|
900
|
+
self.expand(true);
|
901
|
+
}, ms);
|
902
|
+
break;
|
903
|
+
case "activate":
|
904
|
+
this.tree.timer = setTimeout(function(){
|
905
|
+
self.activate();
|
906
|
+
}, ms);
|
907
|
+
break;
|
908
|
+
default:
|
909
|
+
throw "Invalid mode " + mode;
|
910
|
+
}
|
911
|
+
logMsg("setTimeout(%s, %s): %s", mode, ms, this.tree.timer);
|
912
|
+
},
|
913
|
+
|
803
914
|
toggleExpand: function() {
|
804
915
|
this.expand(!this.bExpanded);
|
805
916
|
},
|
@@ -874,7 +985,8 @@ DynaTreeNode.prototype = {
|
|
874
985
|
if( this.bExpanded ) {
|
875
986
|
this.toggleExpand();
|
876
987
|
this.focus();
|
877
|
-
} else if( this.parent && (this.tree.options.rootVisible || this.parent.parent) ) {
|
988
|
+
// } else if( this.parent && (this.tree.options.rootVisible || this.parent.parent) ) {
|
989
|
+
} else if( this.parent && this.parent.parent ) {
|
878
990
|
this.parent.focus();
|
879
991
|
}
|
880
992
|
break;
|
@@ -887,10 +999,11 @@ DynaTreeNode.prototype = {
|
|
887
999
|
}
|
888
1000
|
break;
|
889
1001
|
case 38: // <up>
|
890
|
-
var sib = this.
|
1002
|
+
var sib = this.getPrevSibling();
|
891
1003
|
while( sib && sib.bExpanded && sib.childList )
|
892
1004
|
sib = sib.childList[sib.childList.length-1];
|
893
|
-
if( !sib && this.parent && (this.tree.options.rootVisible || this.parent.parent) )
|
1005
|
+
// if( !sib && this.parent && (this.tree.options.rootVisible || this.parent.parent) )
|
1006
|
+
if( !sib && this.parent && this.parent.parent )
|
894
1007
|
sib = this.parent;
|
895
1008
|
if( sib ) sib.focus();
|
896
1009
|
break;
|
@@ -901,7 +1014,7 @@ DynaTreeNode.prototype = {
|
|
901
1014
|
} else {
|
902
1015
|
var parents = this._parentList(false, true);
|
903
1016
|
for(var i=parents.length-1; i>=0; i--) {
|
904
|
-
sib = parents[i].
|
1017
|
+
sib = parents[i].getNextSibling();
|
905
1018
|
if( sib ) break;
|
906
1019
|
}
|
907
1020
|
}
|
@@ -952,8 +1065,8 @@ DynaTreeNode.prototype = {
|
|
952
1065
|
visit: function(fn, data, includeSelf) {
|
953
1066
|
// Call fn(dtnode, data) for all child nodes. Stop iteration, if fn() returns false.
|
954
1067
|
var n = 0;
|
955
|
-
if( includeSelf
|
956
|
-
if( fn(this, data)
|
1068
|
+
if( includeSelf === true ) {
|
1069
|
+
if( fn(this, data) === false )
|
957
1070
|
return 1;
|
958
1071
|
n++;
|
959
1072
|
}
|
@@ -963,11 +1076,24 @@ DynaTreeNode.prototype = {
|
|
963
1076
|
return n;
|
964
1077
|
},
|
965
1078
|
|
1079
|
+
visitParents: function(fn, includeSelf) {
|
1080
|
+
// Visit parent nodes (bottom up)
|
1081
|
+
if(includeSelf && fn(this) === false) {
|
1082
|
+
return false;
|
1083
|
+
}
|
1084
|
+
var p = this.parent;
|
1085
|
+
while( p ) {
|
1086
|
+
if(fn(p) === false)
|
1087
|
+
return false;
|
1088
|
+
p = p.parent;
|
1089
|
+
}
|
1090
|
+
},
|
1091
|
+
|
966
1092
|
remove: function() {
|
967
1093
|
// Remove this node
|
968
1094
|
// this.tree.logDebug ("%o.remove()", this);
|
969
1095
|
if ( this === this.tree.root )
|
970
|
-
|
1096
|
+
throw "Cannot remove system root";
|
971
1097
|
return this.parent.removeChild(this);
|
972
1098
|
},
|
973
1099
|
|
@@ -988,7 +1114,8 @@ DynaTreeNode.prototype = {
|
|
988
1114
|
this.tree.persistence.clearExpand(tn.data.key);
|
989
1115
|
}
|
990
1116
|
tn.removeChildren(true);
|
991
|
-
this.div.removeChild(tn.div);
|
1117
|
+
// this.div.removeChild(tn.div);
|
1118
|
+
this.ul.removeChild(tn.li);
|
992
1119
|
for(var i=0; i<ac.length; i++) {
|
993
1120
|
if( ac[i] === tn ) {
|
994
1121
|
this.childList.splice(i, 1);
|
@@ -1016,7 +1143,9 @@ DynaTreeNode.prototype = {
|
|
1016
1143
|
this.tree.persistence.clearExpand(tn.data.key);
|
1017
1144
|
}
|
1018
1145
|
tn.removeChildren(true, retainPersistence);
|
1019
|
-
this.div.removeChild(tn.div);
|
1146
|
+
// this.div.removeChild(tn.div);
|
1147
|
+
if( this.ul )
|
1148
|
+
this.ul.removeChild(tn.li);
|
1020
1149
|
delete tn;
|
1021
1150
|
}
|
1022
1151
|
this.childList = null;
|
@@ -1025,7 +1154,7 @@ DynaTreeNode.prototype = {
|
|
1025
1154
|
// this._expand(false);
|
1026
1155
|
// this.isRead = false;
|
1027
1156
|
this.isLoading = false;
|
1028
|
-
this.render(
|
1157
|
+
this.render();
|
1029
1158
|
}
|
1030
1159
|
},
|
1031
1160
|
|
@@ -1048,9 +1177,8 @@ DynaTreeNode.prototype = {
|
|
1048
1177
|
},
|
1049
1178
|
|
1050
1179
|
_addChildNode: function(dtnode, beforeNode) {
|
1051
|
-
|
1180
|
+
/*
|
1052
1181
|
* Internal function to add one single DynatreeNode as a child.
|
1053
|
-
*
|
1054
1182
|
*/
|
1055
1183
|
var tree = this.tree;
|
1056
1184
|
var opts = tree.options;
|
@@ -1064,7 +1192,7 @@ DynaTreeNode.prototype = {
|
|
1064
1192
|
// throw "<beforeNode> must be another child of <this>";
|
1065
1193
|
|
1066
1194
|
// --- Add dtnode as a child
|
1067
|
-
if ( this.childList
|
1195
|
+
if ( this.childList === null ) {
|
1068
1196
|
this.childList = [];
|
1069
1197
|
} else if( ! beforeNode ) {
|
1070
1198
|
// Fix 'lastsib'
|
@@ -1148,13 +1276,13 @@ DynaTreeNode.prototype = {
|
|
1148
1276
|
}
|
1149
1277
|
// render this node and the new child
|
1150
1278
|
if ( tree.bEnableUpdate )
|
1151
|
-
this.render(
|
1279
|
+
this.render();
|
1152
1280
|
|
1153
1281
|
return dtnode;
|
1154
1282
|
},
|
1155
1283
|
|
1156
1284
|
addChild: function(obj, beforeNode) {
|
1157
|
-
|
1285
|
+
/*
|
1158
1286
|
* Add a node object as child.
|
1159
1287
|
*
|
1160
1288
|
* This should be the only place, where a DynaTreeNode is constructed!
|
@@ -1207,7 +1335,7 @@ DynaTreeNode.prototype = {
|
|
1207
1335
|
appendAjax: function(ajaxOptions) {
|
1208
1336
|
this.removeChildren(false, true);
|
1209
1337
|
this.setLazyNodeStatus(DTNodeStatus_Loading);
|
1210
|
-
// Ajax option inheritance: $.ajaxSetup < $.ui.dynatree.
|
1338
|
+
// Ajax option inheritance: $.ajaxSetup < $.ui.dynatree.prototype.options.ajaxDefaults < tree.options.ajaxDefaults < ajaxOptions
|
1211
1339
|
var self = this;
|
1212
1340
|
var orgSuccess = ajaxOptions.success;
|
1213
1341
|
var orgError = ajaxOptions.error;
|
@@ -1233,7 +1361,6 @@ DynaTreeNode.prototype = {
|
|
1233
1361
|
},
|
1234
1362
|
error: function(XMLHttpRequest, textStatus, errorThrown){
|
1235
1363
|
// <this> is the request options
|
1236
|
-
// self.tree.logWarning("appendAjax failed: %o:\n%o\n%o", textStatus, XMLHttpRequest, errorThrown);
|
1237
1364
|
self.tree.logWarning("appendAjax failed:", textStatus, ":\n", XMLHttpRequest, "\n", errorThrown);
|
1238
1365
|
self.setLazyNodeStatus(DTNodeStatus_Error, {info: textStatus, tooltip: ""+errorThrown});
|
1239
1366
|
if( orgError )
|
@@ -1242,11 +1369,124 @@ DynaTreeNode.prototype = {
|
|
1242
1369
|
});
|
1243
1370
|
$.ajax(options);
|
1244
1371
|
},
|
1372
|
+
|
1373
|
+
move: function(targetNode, mode) {
|
1374
|
+
/* Move this node to targetNode.
|
1375
|
+
* mode 'child': append this node as last child of targetNode.
|
1376
|
+
* This is the default. To be compatble with the D'n'd
|
1377
|
+
* hitMode, we also accept 'over'.
|
1378
|
+
* mode 'before': add this node as sibling before targetNode.
|
1379
|
+
* mode 'after': add this node as sibling after targetNode.
|
1380
|
+
*/
|
1381
|
+
if(this === targetNode)
|
1382
|
+
return;
|
1383
|
+
if( !this.parent )
|
1384
|
+
throw "Cannot move system root";
|
1385
|
+
if(mode === undefined || mode == "over")
|
1386
|
+
mode = "child";
|
1387
|
+
var prevParent = this.parent;
|
1388
|
+
var targetParent = (mode === "child") ? targetNode : targetNode.parent;
|
1389
|
+
if( targetParent.isDescendantOf(this) )
|
1390
|
+
throw "Cannot move a node to it's own descendant";
|
1391
|
+
|
1392
|
+
// Unlink this node from current parent
|
1393
|
+
if( this.parent.childList.length == 1 ) {
|
1394
|
+
this.parent.childList = null;
|
1395
|
+
this.parent.bExpanded = false;
|
1396
|
+
} else {
|
1397
|
+
var pos = $.inArray(this, this.parent.childList);
|
1398
|
+
if( pos < 0 )
|
1399
|
+
throw "Internal error";
|
1400
|
+
this.parent.childList.splice(pos, 1);
|
1401
|
+
}
|
1402
|
+
this.parent.ul.removeChild(this.li);
|
1403
|
+
this.li = null;
|
1404
|
+
|
1405
|
+
// Insert this node to target parent's child list
|
1406
|
+
this.parent = targetParent;
|
1407
|
+
if( targetParent.hasChildren() ) {
|
1408
|
+
switch(mode) {
|
1409
|
+
case "child":
|
1410
|
+
// Append to existing target children
|
1411
|
+
targetParent.childList.push(this);
|
1412
|
+
break;
|
1413
|
+
case "before":
|
1414
|
+
// Insert this node before target node
|
1415
|
+
var pos = $.inArray(targetNode, targetParent.childList);
|
1416
|
+
if( pos < 0 )
|
1417
|
+
throw "Internal error";
|
1418
|
+
targetParent.childList.splice(pos, 0, this);
|
1419
|
+
break;
|
1420
|
+
case "after":
|
1421
|
+
// Insert this node after target node
|
1422
|
+
var pos = $.inArray(targetNode, targetParent.childList);
|
1423
|
+
if( pos < 0 )
|
1424
|
+
throw "Internal error";
|
1425
|
+
targetParent.childList.splice(pos+1, 0, this);
|
1426
|
+
break;
|
1427
|
+
default:
|
1428
|
+
throw "Invalid mode " + mode;
|
1429
|
+
}
|
1430
|
+
} else {
|
1431
|
+
targetParent.childList = [ this ];
|
1432
|
+
}
|
1433
|
+
if( this.tree !== targetNode.tree ) {
|
1434
|
+
// Fix node.tree for all source nodes
|
1435
|
+
this.visit(function(dtnode){
|
1436
|
+
dtnode.tree = targetNode.tree;
|
1437
|
+
}, null, true);
|
1438
|
+
throw "Not yet implemented.";
|
1439
|
+
}
|
1440
|
+
// TODO: fix selection state
|
1441
|
+
// TODO: fix active state
|
1442
|
+
if( !prevParent.isDescendantOf(targetParent)) {
|
1443
|
+
prevParent.render();
|
1444
|
+
}
|
1445
|
+
if( !targetParent.isDescendantOf(prevParent) ) {
|
1446
|
+
targetParent.render();
|
1447
|
+
}
|
1448
|
+
// this.tree.redraw();
|
1449
|
+
/*
|
1450
|
+
var tree = this.tree;
|
1451
|
+
var opts = tree.options;
|
1452
|
+
var pers = tree.persistence;
|
1453
|
+
|
1454
|
+
|
1455
|
+
// Always expand, if it's below minExpandLevel
|
1456
|
+
// tree.logDebug ("%o._addChildNode(%o), l=%o", this, dtnode, dtnode.getLevel());
|
1457
|
+
if ( opts.minExpandLevel >= dtnode.getLevel() ) {
|
1458
|
+
// tree.logDebug ("Force expand for %o", dtnode);
|
1459
|
+
this.bExpanded = true;
|
1460
|
+
}
|
1461
|
+
|
1462
|
+
// In multi-hier mode, update the parents selection state
|
1463
|
+
// issue #82: only if not initializing, because the children may not exist yet
|
1464
|
+
// if( !dtnode.data.isStatusNode && opts.selectMode==3 && !isInitializing )
|
1465
|
+
// dtnode._fixSelectionState();
|
1466
|
+
|
1467
|
+
// In multi-hier mode, update the parents selection state
|
1468
|
+
if( dtnode.bSelected && opts.selectMode==3 ) {
|
1469
|
+
var p = this;
|
1470
|
+
while( p ) {
|
1471
|
+
if( !p.hasSubSel )
|
1472
|
+
p._setSubSel(true);
|
1473
|
+
p = p.parent;
|
1474
|
+
}
|
1475
|
+
}
|
1476
|
+
// render this node and the new child
|
1477
|
+
if ( tree.bEnableUpdate )
|
1478
|
+
this.render();
|
1479
|
+
|
1480
|
+
return dtnode;
|
1481
|
+
|
1482
|
+
*/
|
1483
|
+
},
|
1484
|
+
|
1245
1485
|
// --- end of class
|
1246
1486
|
lastentry: undefined
|
1247
1487
|
}
|
1248
1488
|
|
1249
|
-
|
1489
|
+
/*
|
1250
1490
|
* class DynaTreeStatus
|
1251
1491
|
*/
|
1252
1492
|
|
@@ -1268,8 +1508,8 @@ DynaTreeStatus.prototype = {
|
|
1268
1508
|
initialize: function(cookieId, cookieOpts) {
|
1269
1509
|
this._log("DynaTreeStatus: initialize");
|
1270
1510
|
if( cookieId === undefined )
|
1271
|
-
cookieId = $.ui.dynatree.
|
1272
|
-
cookieOpts = $.extend({}, $.ui.dynatree.
|
1511
|
+
cookieId = $.ui.dynatree.prototype.options.cookieId;
|
1512
|
+
cookieOpts = $.extend({}, $.ui.dynatree.prototype.options.cookie, cookieOpts);
|
1273
1513
|
|
1274
1514
|
this.cookieId = cookieId;
|
1275
1515
|
this.cookieOpts = cookieOpts;
|
@@ -1359,8 +1599,7 @@ DynaTreeStatus.prototype = {
|
|
1359
1599
|
lastentry: undefined
|
1360
1600
|
};
|
1361
1601
|
|
1362
|
-
|
1363
|
-
/*************************************************************************
|
1602
|
+
/*
|
1364
1603
|
* class DynaTree
|
1365
1604
|
*/
|
1366
1605
|
|
@@ -1368,7 +1607,7 @@ var DynaTree = Class.create();
|
|
1368
1607
|
|
1369
1608
|
// --- Static members ----------------------------------------------------------
|
1370
1609
|
|
1371
|
-
DynaTree.version = "$Version
|
1610
|
+
DynaTree.version = "$Version:$";
|
1372
1611
|
/*
|
1373
1612
|
DynaTree._initTree = function() {
|
1374
1613
|
};
|
@@ -1387,8 +1626,11 @@ DynaTree.prototype = {
|
|
1387
1626
|
this.$widget = $widget;
|
1388
1627
|
this.options = $widget.options;
|
1389
1628
|
this.$tree = $widget.element;
|
1629
|
+
this.timer = null;
|
1390
1630
|
// find container element
|
1391
1631
|
this.divTree = this.$tree.get(0);
|
1632
|
+
//
|
1633
|
+
_initDragAndDrop(this);
|
1392
1634
|
},
|
1393
1635
|
|
1394
1636
|
// member functions
|
@@ -1401,10 +1643,20 @@ DynaTree.prototype = {
|
|
1401
1643
|
this.activeNode = null;
|
1402
1644
|
this.focusNode = null;
|
1403
1645
|
|
1646
|
+
// Some deprecation warnings to help with migration
|
1647
|
+
if( opts.rootVisible !== undefined )
|
1648
|
+
_log("warn", "Option 'rootVisible' is no longer supported.");
|
1649
|
+
if( opts.title !== undefined )
|
1650
|
+
_log("warn", "Option 'title' is no longer supported.");
|
1651
|
+
if( opts.minExpandLevel < 1 ) {
|
1652
|
+
_log("warn", "Option 'minExpandLevel' must be >= 1.");
|
1653
|
+
opts.minExpandLevel = 1;
|
1654
|
+
}
|
1655
|
+
|
1404
1656
|
// If a 'options.classNames' dictionary was passed, still use defaults
|
1405
1657
|
// for undefined classes:
|
1406
|
-
if( opts.classNames !== $.ui.dynatree.
|
1407
|
-
opts.classNames = $.extend({}, $.ui.dynatree.
|
1658
|
+
if( opts.classNames !== $.ui.dynatree.prototype.options.classNames ) {
|
1659
|
+
opts.classNames = $.extend({}, $.ui.dynatree.prototype.options.classNames, opts.classNames);
|
1408
1660
|
}
|
1409
1661
|
// Guess skin path, if not specified
|
1410
1662
|
if(!opts.imagePath) {
|
@@ -1447,18 +1699,24 @@ DynaTree.prototype = {
|
|
1447
1699
|
$(this.divTree).empty();
|
1448
1700
|
else if( this.divRoot )
|
1449
1701
|
$(this.divRoot).remove();
|
1450
|
-
|
1702
|
+
/*
|
1451
1703
|
// create the root element
|
1452
1704
|
this.tnRoot = new DynaTreeNode(null, this, {title: opts.title, key: "root"});
|
1453
1705
|
this.tnRoot.data.isFolder = true;
|
1454
1706
|
this.tnRoot.render(false, false);
|
1455
1707
|
this.divRoot = this.tnRoot.div;
|
1456
1708
|
this.divRoot.className = opts.classNames.container;
|
1709
|
+
|
1457
1710
|
// add root to container
|
1458
1711
|
// TODO: this should be delayed until all children have been created for performance reasons
|
1459
1712
|
this.divTree.appendChild(this.divRoot);
|
1713
|
+
*/
|
1714
|
+
// Create the root element
|
1715
|
+
this.tnRoot = new DynaTreeNode(null, this, {});
|
1716
|
+
this.tnRoot.render();
|
1717
|
+
this.divTree.appendChild(this.tnRoot.ul);
|
1460
1718
|
|
1461
|
-
|
1719
|
+
var root = this.tnRoot;
|
1462
1720
|
var isReloading = ( opts.persist && this.persistence.isReloading() );
|
1463
1721
|
var isLazy = false;
|
1464
1722
|
var prevFlag = this.enableUpdate(false);
|
@@ -1482,7 +1740,7 @@ DynaTree.prototype = {
|
|
1482
1740
|
|
1483
1741
|
} else {
|
1484
1742
|
// Init tree from the first UL element inside the container <div>
|
1485
|
-
var $ul = this.$tree.find(">ul").hide();
|
1743
|
+
var $ul = this.$tree.find(">ul:first").hide();
|
1486
1744
|
this._createFromTag(root, $ul);
|
1487
1745
|
$ul.remove();
|
1488
1746
|
}
|
@@ -1539,9 +1797,9 @@ DynaTree.prototype = {
|
|
1539
1797
|
// Set up onPostInit callback to be called when Ajax returns
|
1540
1798
|
if( opts.onPostInit ) {
|
1541
1799
|
if( ajaxOpts.success )
|
1542
|
-
this.
|
1800
|
+
this.logWarning("initAjax: success callback is ignored when onPostInit was specified.");
|
1543
1801
|
if( ajaxOpts.error )
|
1544
|
-
this.
|
1802
|
+
this.logWarning("initAjax: error callback is ignored when onPostInit was specified.");
|
1545
1803
|
var isReloading = pers.isReloading();
|
1546
1804
|
ajaxOpts["success"] = function(dtnode) { opts.onPostInit.call(dtnode.tree, isReloading, false); };
|
1547
1805
|
ajaxOpts["error"] = function(dtnode) { opts.onPostInit.call(dtnode.tree, isReloading, true); };
|
@@ -1551,7 +1809,8 @@ DynaTree.prototype = {
|
|
1551
1809
|
},
|
1552
1810
|
|
1553
1811
|
toString: function() {
|
1554
|
-
return "DynaTree '" + this.options.title + "'";
|
1812
|
+
// return "DynaTree '" + this.options.title + "'";
|
1813
|
+
return "Dynatree '" + this.$tree.attr("id") + "'";
|
1555
1814
|
},
|
1556
1815
|
|
1557
1816
|
toDict: function() {
|
@@ -1593,7 +1852,7 @@ DynaTree.prototype = {
|
|
1593
1852
|
|
1594
1853
|
redraw: function() {
|
1595
1854
|
this.logDebug("dynatree.redraw()...");
|
1596
|
-
this.tnRoot.render(
|
1855
|
+
this.tnRoot.render();
|
1597
1856
|
this.logDebug("dynatree.redraw() done.");
|
1598
1857
|
},
|
1599
1858
|
|
@@ -1730,7 +1989,7 @@ TODO: better?
|
|
1730
1989
|
}
|
1731
1990
|
}
|
1732
1991
|
}
|
1733
|
-
childNode = parentTreeNode.addChild(data);
|
1992
|
+
var childNode = parentTreeNode.addChild(data);
|
1734
1993
|
// Recursive reading of child nodes, if LI tag contains an UL tag
|
1735
1994
|
var $ul = $li.find(">ul:first");
|
1736
1995
|
if( $ul.length ) {
|
@@ -1742,23 +2001,211 @@ TODO: better?
|
|
1742
2001
|
_checkConsistency: function() {
|
1743
2002
|
// this.logDebug("tree._checkConsistency() NOT IMPLEMENTED - %o", this);
|
1744
2003
|
},
|
2004
|
+
|
2005
|
+
_setDndStatus: function(sourceNode, targetNode, helper, hitMode, accept) {
|
2006
|
+
// hitMode: 'after', 'before', 'over', 'out', 'start', 'stop'
|
2007
|
+
var $source = sourceNode ? $(sourceNode.span) : null;
|
2008
|
+
var $target = $(targetNode.span);
|
2009
|
+
if( !this.$dndMarker ) {
|
2010
|
+
this.$dndMarker = $("<div id='dynatree_drop_marker'></div>")
|
2011
|
+
.hide()
|
2012
|
+
.prependTo("body");
|
2013
|
+
logMsg("Creating marker: %o", this.$dndMarker);
|
2014
|
+
}
|
2015
|
+
if(hitMode === "start"){
|
2016
|
+
}
|
2017
|
+
if(hitMode === "stop"){
|
2018
|
+
// sourceNode.removeClass("dynatree-drop-target");
|
2019
|
+
}
|
2020
|
+
if(hitMode === "after" || hitMode === "before" || hitMode === "over"){
|
2021
|
+
// $source && $source.addClass("dynatree-drag-source");
|
2022
|
+
$target.addClass("dynatree-drop-target");
|
2023
|
+
var pos = $target.position();
|
2024
|
+
switch(hitMode){
|
2025
|
+
case "before":
|
2026
|
+
pos.top -= 8;
|
2027
|
+
break;
|
2028
|
+
case "after":
|
2029
|
+
pos.top += 8;
|
2030
|
+
break;
|
2031
|
+
default:
|
2032
|
+
pos.left += 8;
|
2033
|
+
}
|
2034
|
+
this.$dndMarker.css({"left": (pos.left) + "px", "top": (pos.top) + "px" })
|
2035
|
+
.show();
|
2036
|
+
// helper.addClass("dynatree-drop-hover");
|
2037
|
+
} else {
|
2038
|
+
// $source && $source.removeClass("dynatree-drag-source");
|
2039
|
+
$target.removeClass("dynatree-drop-target");
|
2040
|
+
this.$dndMarker.hide();
|
2041
|
+
// helper.removeClass("dynatree-drop-hover");
|
2042
|
+
}
|
2043
|
+
if(hitMode === "after"){
|
2044
|
+
$target.addClass("dynatree-drop-after");
|
2045
|
+
} else {
|
2046
|
+
$target.removeClass("dynatree-drop-after");
|
2047
|
+
}
|
2048
|
+
if(hitMode === "before"){
|
2049
|
+
$target.addClass("dynatree-drop-before");
|
2050
|
+
} else {
|
2051
|
+
$target.removeClass("dynatree-drop-before");
|
2052
|
+
}
|
2053
|
+
if(accept === true){
|
2054
|
+
$source && $source.addClass("dynatree-drop-accept");
|
2055
|
+
$target.addClass("dynatree-drop-accept");
|
2056
|
+
helper.addClass("dynatree-drop-accept");
|
2057
|
+
}else{
|
2058
|
+
$source && $source.removeClass("dynatree-drop-accept");
|
2059
|
+
$target.removeClass("dynatree-drop-accept");
|
2060
|
+
helper.removeClass("dynatree-drop-accept");
|
2061
|
+
}
|
2062
|
+
if(accept === false){
|
2063
|
+
$source && $source.addClass("dynatree-drop-reject");
|
2064
|
+
$target.addClass("dynatree-drop-reject");
|
2065
|
+
helper.addClass("dynatree-drop-reject");
|
2066
|
+
}else{
|
2067
|
+
$source && $source.removeClass("dynatree-drop-reject");
|
2068
|
+
$target.removeClass("dynatree-drop-reject");
|
2069
|
+
helper.removeClass("dynatree-drop-reject");
|
2070
|
+
}
|
2071
|
+
},
|
2072
|
+
|
2073
|
+
_onDragEvent: function(eventName, node, otherNode, event, ui, draggable) {
|
2074
|
+
/*
|
2075
|
+
* Handles drag'n'drop functionality.
|
2076
|
+
*/
|
2077
|
+
var _calcHitMode = function() {
|
2078
|
+
|
2079
|
+
}
|
2080
|
+
if(eventName !== "over")
|
2081
|
+
this.logDebug("tree._onDragEvent(%s, %o, %o) - %o", eventName, node, otherNode, this);
|
2082
|
+
var opts = this.options;
|
2083
|
+
var dnd = this.options.dnd;
|
2084
|
+
var res = null;
|
2085
|
+
var nodeTag = $(node.span);
|
2086
|
+
switch (eventName) {
|
2087
|
+
case "helper":
|
2088
|
+
// Only event and node argument is available
|
2089
|
+
var helper = $("<div class='dynatree-drag-helper'><span class='dynatree-drag-helper-img' /></div>")
|
2090
|
+
.append($(event.target).closest('a').clone());
|
2091
|
+
// Attach node reference to helper object
|
2092
|
+
helper.data("dtSourceNode", node);
|
2093
|
+
logMsg("helper.sourceNode=%o", helper.data("dtSourceNode"));
|
2094
|
+
res = helper;
|
2095
|
+
break;
|
2096
|
+
case "start":
|
2097
|
+
if(node.isStatusNode()) {
|
2098
|
+
res = false;
|
2099
|
+
} else if(dnd.onDragStart) {
|
2100
|
+
res = dnd.onDragStart(node)
|
2101
|
+
}
|
2102
|
+
if(res === false) {
|
2103
|
+
this.logDebug("tree.onDragStart() cancelled");
|
2104
|
+
draggable._clear();
|
2105
|
+
} else {
|
2106
|
+
nodeTag.addClass("dynatree-drag-source");
|
2107
|
+
}
|
2108
|
+
break;
|
2109
|
+
case "enter":
|
2110
|
+
res = dnd.onDragEnter ? dnd.onDragEnter(node, otherNode) : null;
|
2111
|
+
// logMsg("helper %o", ui.helper);
|
2112
|
+
ui.helper.data("enterResponse", res);
|
2113
|
+
this.logDebug("helper.enterResponse: %o", res);
|
2114
|
+
// this._setDndStatus(otherNode, node, ui.helper, "over", res!==false);
|
2115
|
+
break;
|
2116
|
+
case "over":
|
2117
|
+
// Auto-expand node
|
2118
|
+
if(dnd.autoExpandMS && node.hasChildren() && !node.bExpanded) {
|
2119
|
+
node.scheduleAction("expand", dnd.autoExpandMS);
|
2120
|
+
}
|
2121
|
+
var enterResponse = ui.helper.data("enterResponse");
|
2122
|
+
var hitMode = null;
|
2123
|
+
if(enterResponse === false){
|
2124
|
+
// Don't call onDragOver if onEnter returned false.
|
2125
|
+
break;
|
2126
|
+
} else if(typeof enterResponse === "string") {
|
2127
|
+
// Use hitMode from onEnter if provided.
|
2128
|
+
hitMode = enterResponse;
|
2129
|
+
} else {
|
2130
|
+
// Calculate hitMode from relative cursor position.
|
2131
|
+
var nodeOfs = nodeTag.position();
|
2132
|
+
var relPos = { x: event.clientX - nodeOfs.left,
|
2133
|
+
y: event.clientY - nodeOfs.top };
|
2134
|
+
var relPos2 = { x: relPos.x / nodeTag.width(),
|
2135
|
+
y: relPos.y / nodeTag.height() };
|
2136
|
+
if( (relPos2.y > 0.25 && relPos2.y < 0.75)
|
2137
|
+
// || (relPos2.x > 0.8 )
|
2138
|
+
) {
|
2139
|
+
hitMode = "over";
|
2140
|
+
} else if(relPos2.y <= 0.25) {
|
2141
|
+
hitMode = "before";
|
2142
|
+
} else {
|
2143
|
+
hitMode = "after";
|
2144
|
+
}
|
2145
|
+
ui.helper.data("hitMode", hitMode);
|
2146
|
+
// logMsg(" clientPos: %s/%s", event.clientX, event.clientY);
|
2147
|
+
// logMsg(" nodeOfs: %s/%s", nodeOfs.left, nodeOfs.top);
|
2148
|
+
// logMsg(" relPos: %s/%s", relPos.x, relPos.y);
|
2149
|
+
// logMsg(" relPos2: %s/%s: %s", relPos2.x, relPos2.y, hitMode);
|
2150
|
+
// logMsg(" e:%o", event);
|
2151
|
+
}
|
2152
|
+
/* var checkPos = function(node, pos) {
|
2153
|
+
var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
|
2154
|
+
var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
|
2155
|
+
var itemHeight = o.height, itemWidth = o.width;
|
2156
|
+
var itemTop = o.top, itemLeft = o.left;
|
2157
|
+
|
2158
|
+
return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
|
2159
|
+
};
|
2160
|
+
var relPos = event.()*/
|
2161
|
+
if(dnd.onDragOver)
|
2162
|
+
res = dnd.onDragOver(node, otherNode, hitMode)
|
2163
|
+
this._setDndStatus(otherNode, node, ui.helper, hitMode, res!==false)
|
2164
|
+
break;
|
2165
|
+
case "drop":
|
2166
|
+
var enterResponse = ui.helper.data("enterResponse");
|
2167
|
+
var hitMode = ui.helper.data("hitMode");
|
2168
|
+
if(dnd.onDrop && enterResponse !== false)
|
2169
|
+
dnd.onDrop(node, otherNode, hitMode)
|
2170
|
+
break;
|
2171
|
+
case "leave":
|
2172
|
+
// Cancel pending expand request
|
2173
|
+
node.scheduleAction("cancel");
|
2174
|
+
ui.helper.data("enterResponse", null);
|
2175
|
+
ui.helper.data("hitMode", null);
|
2176
|
+
// nodeTag.removeClass("dynatree-drop-hover dynatree-drop-accept dynatree-drop-reject");
|
2177
|
+
this._setDndStatus(otherNode, node, ui.helper, "out", undefined)
|
2178
|
+
if(dnd.onDragLeave)
|
2179
|
+
dnd.onDragLeave(node, otherNode)
|
2180
|
+
break;
|
2181
|
+
case "stop":
|
2182
|
+
nodeTag.removeClass("dynatree-drag-source");
|
2183
|
+
if(dnd.onDragStop)
|
2184
|
+
dnd.onDragStop(node)
|
2185
|
+
break;
|
2186
|
+
default:
|
2187
|
+
throw "Unsupported drag event: " + eventName;
|
2188
|
+
}
|
2189
|
+
return res;
|
2190
|
+
},
|
1745
2191
|
|
1746
2192
|
// --- end of class
|
1747
2193
|
lastentry: undefined
|
1748
2194
|
};
|
1749
2195
|
|
1750
|
-
|
1751
|
-
*
|
2196
|
+
/*
|
2197
|
+
* Widget $(..).dynatree
|
1752
2198
|
*/
|
1753
2199
|
|
1754
2200
|
$.widget("ui.dynatree", {
|
2201
|
+
/*
|
1755
2202
|
init: function() {
|
1756
2203
|
// ui.core 1.6 renamed init() to _init(): this stub assures backward compatibility
|
1757
|
-
_log("warn", "ui.dynatree.init() was called; you should upgrade to ui.core.js v1.
|
2204
|
+
_log("warn", "ui.dynatree.init() was called; you should upgrade to jquery.ui.core.js v1.8 or higher.");
|
1758
2205
|
return this._init();
|
1759
2206
|
},
|
1760
|
-
|
1761
|
-
|
2207
|
+
*/
|
2208
|
+
_init: function() {
|
1762
2209
|
if( parseFloat($.ui.version) < 1.8 ) {
|
1763
2210
|
// jquery.ui.core 1.8 renamed _init() to _create(): this stub assures backward compatibility
|
1764
2211
|
_log("warn", "ui.dynatree._init() was called; you should upgrade to jquery.ui.core.js v1.8 or higher.");
|
@@ -1768,11 +2215,9 @@ $.widget("ui.dynatree", {
|
|
1768
2215
|
_log("debug", "ui.dynatree._init() was called; no current default functionality.");
|
1769
2216
|
},
|
1770
2217
|
|
1771
|
-
|
1772
|
-
if( parseFloat($.ui.version) >= 1.8 ) {
|
1773
|
-
this.options = $.extend(true, $[this.namespace][this.widgetName].defaults, this.options);
|
1774
|
-
}
|
2218
|
+
_create: function() {
|
1775
2219
|
logMsg("Dynatree._create(): version='%s', debugLevel=%o.", DynaTree.version, this.options.debugLevel);
|
2220
|
+
|
1776
2221
|
var opts = this.options;
|
1777
2222
|
// The widget framework supplies this.element and this.options.
|
1778
2223
|
this.options.event += ".dynatree"; // namespace event
|
@@ -1786,7 +2231,7 @@ $.widget("ui.dynatree", {
|
|
1786
2231
|
// Create the DynaTree object
|
1787
2232
|
this.tree = new DynaTree(this);
|
1788
2233
|
this.tree._load();
|
1789
|
-
this.tree.logDebug("Dynatree.
|
2234
|
+
this.tree.logDebug("Dynatree._init(): done.");
|
1790
2235
|
},
|
1791
2236
|
|
1792
2237
|
bind: function() {
|
@@ -1796,21 +2241,11 @@ $.widget("ui.dynatree", {
|
|
1796
2241
|
// Prevent duplicate binding
|
1797
2242
|
this.unbind();
|
1798
2243
|
|
1799
|
-
// Tool function to get dtnode from the event target:
|
1800
|
-
function __getNodeFromElement(el) {
|
1801
|
-
var iMax = 5;
|
1802
|
-
while( el && iMax-- ) {
|
1803
|
-
if( el.dtnode ) return el.dtnode;
|
1804
|
-
el = el.parentNode;
|
1805
|
-
};
|
1806
|
-
return null;
|
1807
|
-
}
|
1808
|
-
|
1809
2244
|
var eventNames = "click.dynatree dblclick.dynatree";
|
1810
2245
|
if( o.keyboard ) // Note: leading ' '!
|
1811
2246
|
eventNames += " keypress.dynatree keydown.dynatree";
|
1812
2247
|
$this.bind(eventNames, function(event){
|
1813
|
-
var dtnode =
|
2248
|
+
var dtnode = getDtNodeFromElement(event.target);
|
1814
2249
|
if( !dtnode )
|
1815
2250
|
return true; // Allow bubbling of other events
|
1816
2251
|
var prevPhase = dtnode.tree.phase;
|
@@ -1830,7 +2265,7 @@ $.widget("ui.dynatree", {
|
|
1830
2265
|
};
|
1831
2266
|
} catch(e) {
|
1832
2267
|
var _ = null; // issue 117
|
1833
|
-
|
2268
|
+
dtnode.tree.logWarning("bind(%o): dtnode: %o, error: %o", event, dtnode, e);
|
1834
2269
|
} finally {
|
1835
2270
|
dtnode.tree.phase = prevPhase;
|
1836
2271
|
}
|
@@ -1843,7 +2278,7 @@ $.widget("ui.dynatree", {
|
|
1843
2278
|
// Handles blur and focus.
|
1844
2279
|
// Fix event for IE:
|
1845
2280
|
event = arguments[0] = $.event.fix( event || window.event );
|
1846
|
-
var dtnode =
|
2281
|
+
var dtnode = getDtNodeFromElement(event.target);
|
1847
2282
|
return dtnode ? dtnode.onFocus(event) : false;
|
1848
2283
|
}
|
1849
2284
|
var div = this.tree.divTree;
|
@@ -1872,13 +2307,13 @@ $.widget("ui.dynatree", {
|
|
1872
2307
|
enable: function() {
|
1873
2308
|
this.bind();
|
1874
2309
|
// Call default disable(): remove -disabled from css:
|
1875
|
-
$.
|
2310
|
+
$.Widget.prototype.enable.apply(this, arguments);
|
1876
2311
|
},
|
1877
2312
|
|
1878
2313
|
disable: function() {
|
1879
2314
|
this.unbind();
|
1880
2315
|
// Call default disable(): add -disabled to css:
|
1881
|
-
$.
|
2316
|
+
$.Widget.prototype.disable.apply(this, arguments);
|
1882
2317
|
},
|
1883
2318
|
|
1884
2319
|
// --- getter methods (i.e. NOT returning a reference to $)
|
@@ -1905,14 +2340,16 @@ $.widget("ui.dynatree", {
|
|
1905
2340
|
|
1906
2341
|
// The following methods return a value (thus breaking the jQuery call chain):
|
1907
2342
|
|
1908
|
-
|
1909
|
-
|
2343
|
+
// @@ 1.8
|
2344
|
+
//$.ui.dynatree.getter = "getTree getRoot getActiveNode getSelectedNodes";
|
1910
2345
|
|
1911
|
-
// Plugin default options:
|
1912
2346
|
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
2347
|
+
/*
|
2348
|
+
* Plugin default options:
|
2349
|
+
*/
|
2350
|
+
//$.ui.dynatree.defaults = { @@ 1.8
|
2351
|
+
$.ui.dynatree.prototype.options = {
|
2352
|
+
title: "Dynatree", // Tree's name (only used for debug outpu)
|
1916
2353
|
minExpandLevel: 1, // 1: root node is not collapsible
|
1917
2354
|
imagePath: null, // Path to a folder containing icons. Defaults to 'skin/' subdirectory.
|
1918
2355
|
children: null, // Init tree structure from this object array.
|
@@ -1927,7 +2364,8 @@ $.ui.dynatree.defaults = {
|
|
1927
2364
|
checkbox: false, // Show checkboxes.
|
1928
2365
|
selectMode: 2, // 1:single, 2:multi, 3:multi-hier
|
1929
2366
|
fx: null, // Animations, e.g. null or { height: "toggle", duration: 200 }
|
1930
|
-
|
2367
|
+
enableDrag: false,
|
2368
|
+
enableDrop: false,
|
1931
2369
|
// Low level event handlers: onEvent(dtnode, event): return false, to stop default processing
|
1932
2370
|
onClick: null, // null: generate focus, expand, activate, select events.
|
1933
2371
|
onDblClick: null, // (No default actions.)
|
@@ -1949,6 +2387,19 @@ $.ui.dynatree.defaults = {
|
|
1949
2387
|
onExpand: null, // Callback(dtnode) when a node is expanded/collapsed.
|
1950
2388
|
onLazyRead: null, // Callback(dtnode) when a lazy node is expanded for the first time.
|
1951
2389
|
|
2390
|
+
// Drag'n'drop support
|
2391
|
+
dnd: {
|
2392
|
+
// Make tree nodes draggable:
|
2393
|
+
onDragStart: null, // Callback(sourceNode), return true, to enable dnd
|
2394
|
+
onDragStop: null, // Callback(sourceNode)
|
2395
|
+
helper: null,
|
2396
|
+
// Make tree nodes accept draggables
|
2397
|
+
autoExpandMS: 1000, // Expand nodes after n milliseconds of hovering.
|
2398
|
+
onDragEnter: null, // Callback(targetNode, sourceNode)
|
2399
|
+
onDragOver: null, // Callback(targetNode, sourceNode, hitMode)
|
2400
|
+
onDrop: null, // Callback(targetNode, sourceNode, hitMode)
|
2401
|
+
onDragLeave: null // Callback(targetNode, sourceNode)
|
2402
|
+
},
|
1952
2403
|
ajaxDefaults: { // Used by initAjax option
|
1953
2404
|
cache: false, // false: Append random '_' argument to the request url to prevent caching.
|
1954
2405
|
dataType: "json" // Expect json format and pass json object to callbacks.
|
@@ -1957,8 +2408,9 @@ $.ui.dynatree.defaults = {
|
|
1957
2408
|
loading: "Loading…",
|
1958
2409
|
loadError: "Load error!"
|
1959
2410
|
},
|
1960
|
-
|
1961
|
-
|
2411
|
+
generateIds: false,
|
2412
|
+
idPrefix: "dynatree-id-", // Used to generate node id's like <span id="dynatree-id-<key>">.
|
2413
|
+
// cookieId: "dynatree-cookie", // Choose a more unique name, to allow multiple trees.
|
1962
2414
|
cookieId: "dynatree", // Choose a more unique name, to allow multiple trees.
|
1963
2415
|
cookie: {
|
1964
2416
|
expires: null //7, // Days or Date; null: session cookie
|
@@ -1970,40 +2422,42 @@ $.ui.dynatree.defaults = {
|
|
1970
2422
|
// Note: if only single entries are passed for options.classNames, all other
|
1971
2423
|
// values are still set to default.
|
1972
2424
|
classNames: {
|
1973
|
-
container: "
|
1974
|
-
|
1975
|
-
|
2425
|
+
container: "dynatree-container",
|
2426
|
+
node: "dynatree-node",
|
2427
|
+
folder: "dynatree-folder",
|
2428
|
+
// document: "dynatree-document",
|
1976
2429
|
|
1977
|
-
empty: "
|
1978
|
-
vline: "
|
1979
|
-
expander: "
|
1980
|
-
connector: "
|
1981
|
-
checkbox: "
|
1982
|
-
nodeIcon: "
|
1983
|
-
title: "
|
2430
|
+
empty: "dynatree-empty",
|
2431
|
+
vline: "dynatree-vline",
|
2432
|
+
expander: "dynatree-expander",
|
2433
|
+
connector: "dynatree-connector",
|
2434
|
+
checkbox: "dynatree-checkbox",
|
2435
|
+
nodeIcon: "dynatree-icon",
|
2436
|
+
title: "dynatree-title",
|
2437
|
+
noConnector: "dynatree-no-connector",
|
1984
2438
|
|
1985
|
-
nodeError: "
|
1986
|
-
nodeWait: "
|
1987
|
-
hidden: "
|
1988
|
-
combinedExpanderPrefix: "
|
1989
|
-
combinedIconPrefix: "
|
1990
|
-
// disabled: "
|
1991
|
-
hasChildren: "
|
1992
|
-
active: "
|
1993
|
-
selected: "
|
1994
|
-
expanded: "
|
1995
|
-
lazy: "
|
1996
|
-
focused: "
|
1997
|
-
partsel: "
|
1998
|
-
lastsib: "
|
1999
|
-
},
|
2000
|
-
debugLevel: 1,
|
2439
|
+
nodeError: "dynatree-statusnode-error",
|
2440
|
+
nodeWait: "dynatree-statusnode-wait",
|
2441
|
+
hidden: "dynatree-hidden",
|
2442
|
+
combinedExpanderPrefix: "dynatree-exp-",
|
2443
|
+
combinedIconPrefix: "dynatree-ico-",
|
2444
|
+
// disabled: "dynatree-disabled",
|
2445
|
+
hasChildren: "dynatree-has-children",
|
2446
|
+
active: "dynatree-active",
|
2447
|
+
selected: "dynatree-selected",
|
2448
|
+
expanded: "dynatree-expanded",
|
2449
|
+
lazy: "dynatree-lazy",
|
2450
|
+
focused: "dynatree-focused",
|
2451
|
+
partsel: "dynatree-partsel",
|
2452
|
+
lastsib: "dynatree-lastsib"
|
2453
|
+
},
|
2454
|
+
debugLevel: 0, // 0:quiet, 1:normal, 2:debug $REPLACE: debugLevel: 1,
|
2001
2455
|
|
2002
2456
|
// ------------------------------------------------------------------------
|
2003
2457
|
lastentry: undefined
|
2004
2458
|
};
|
2005
2459
|
|
2006
|
-
|
2460
|
+
/*
|
2007
2461
|
* Reserved data attributes for a tree node.
|
2008
2462
|
*/
|
2009
2463
|
$.ui.dynatree.nodedatadefaults = {
|
@@ -2029,6 +2483,131 @@ $.ui.dynatree.nodedatadefaults = {
|
|
2029
2483
|
lastentry: undefined
|
2030
2484
|
};
|
2031
2485
|
|
2486
|
+
/*
|
2487
|
+
* Drag and drop support
|
2488
|
+
*/
|
2489
|
+
function _initDragAndDrop(tree) {
|
2490
|
+
var dnd = tree.options.dnd || null;
|
2491
|
+
// Register 'connectToDynatree' option with ui.draggable
|
2492
|
+
if(dnd && (dnd.onDragStart || dnd.onDrop)) {
|
2493
|
+
_registerDnd();
|
2494
|
+
}
|
2495
|
+
// Attach ui.draggable to this Dynatree instance
|
2496
|
+
if(dnd && dnd.onDragStart ) {
|
2497
|
+
tree.$tree.draggable({
|
2498
|
+
addClasses: false,
|
2499
|
+
appendTo: "body",
|
2500
|
+
containment: false,
|
2501
|
+
delay: 0,
|
2502
|
+
distance: 4,
|
2503
|
+
revert: false,
|
2504
|
+
// Delegate draggable.start, drag, and stop events to our handler
|
2505
|
+
connectToDynatree: true,
|
2506
|
+
// Let source tree create the helper element
|
2507
|
+
helper: function(event) {
|
2508
|
+
var sourceNode = getDtNodeFromElement(event.target);
|
2509
|
+
return sourceNode.tree._onDragEvent("helper", sourceNode, null, event, null, null);
|
2510
|
+
},
|
2511
|
+
_last: null
|
2512
|
+
});
|
2513
|
+
}
|
2514
|
+
// Attach ui.droppable to this Dynatree instance
|
2515
|
+
if(dnd && dnd.onDrop) {
|
2516
|
+
tree.$tree.droppable({
|
2517
|
+
addClasses: false,
|
2518
|
+
//tolerance: "intersect",
|
2519
|
+
tolerance: "touch",
|
2520
|
+
greedy: false,
|
2521
|
+
_last: null
|
2522
|
+
});
|
2523
|
+
}
|
2524
|
+
}
|
2525
|
+
|
2526
|
+
//--- Extend ui.draggable event handling --------------------------------------
|
2527
|
+
var didRegisterDnd = false;
|
2528
|
+
var _registerDnd = function() {
|
2529
|
+
if(didRegisterDnd)
|
2530
|
+
return;
|
2531
|
+
$.ui.plugin.add("draggable", "connectToDynatree", {
|
2532
|
+
start: function(event, ui) {
|
2533
|
+
var draggable = $(this).data("draggable");
|
2534
|
+
var sourceNode = ui.helper.data("dtSourceNode") || null;
|
2535
|
+
logMsg("draggable-connectToDynatree.start, %o", sourceNode);
|
2536
|
+
logMsg(" this: %o", this);
|
2537
|
+
logMsg(" event: %o", event);
|
2538
|
+
logMsg(" draggable: %o", draggable);
|
2539
|
+
logMsg(" ui: %o", ui);
|
2540
|
+
if(sourceNode) {
|
2541
|
+
// Adjust helper offset for tree nodes
|
2542
|
+
/*
|
2543
|
+
var sourcePosition = $(sourceNode.span).position();
|
2544
|
+
var cssPosition = $(ui.helper).position();
|
2545
|
+
logMsg(" draggable.offset.click: %s/%s", draggable.offset.click.left, draggable.offset.click.top);
|
2546
|
+
logMsg(" sourceNode.position: %s/%s", sourcePosition.left, sourcePosition.top);
|
2547
|
+
logMsg(" helper.position: %s/%s", cssPosition.left, cssPosition.top);
|
2548
|
+
logMsg(" event.target.offset: %s/%s, %sx%s", event.target.offsetLeft, event.target.offsetTop, event.target.offsetWidth, event.target.offsetHeight);
|
2549
|
+
logMsg(" draggable.positionAbs: %s/%s", draggable.positionAbs.left, draggable.positionAbs.top);
|
2550
|
+
*/
|
2551
|
+
// Adjust helper offset, so cursor is slightly outside top/left corner
|
2552
|
+
// draggable.offset.click.top -= event.target.offsetTop;
|
2553
|
+
// draggable.offset.click.left -= event.target.offsetLeft;
|
2554
|
+
draggable.offset.click.top = -2;
|
2555
|
+
draggable.offset.click.left = + 16;
|
2556
|
+
logMsg(" draggable.offset.click FIXED: %s/%s", draggable.offset.click.left, draggable.offset.click.top);
|
2557
|
+
// Trigger onDragStart event
|
2558
|
+
// TODO: when called as connectTo..., the return value is ignored(?)
|
2559
|
+
return sourceNode.tree._onDragEvent("start", sourceNode, null, event, ui, draggable);
|
2560
|
+
}
|
2561
|
+
},
|
2562
|
+
drag: function(event, ui) {
|
2563
|
+
var draggable = $(this).data("draggable");
|
2564
|
+
var sourceNode = ui.helper.data("dtSourceNode") || null;
|
2565
|
+
var prevTargetNode = ui.helper.data("dtTargetNode") || null;
|
2566
|
+
var targetNode = getDtNodeFromElement(event.target);
|
2567
|
+
ui.helper.data("dtTargetNode", targetNode);
|
2568
|
+
// Leaving a tree node
|
2569
|
+
if(prevTargetNode && prevTargetNode !== targetNode ) {
|
2570
|
+
prevTargetNode.tree._onDragEvent("leave", prevTargetNode, sourceNode, event, ui, draggable);
|
2571
|
+
}
|
2572
|
+
if(targetNode){
|
2573
|
+
if(!targetNode.tree.options.dnd.onDrop) {
|
2574
|
+
// not enabled as drop target
|
2575
|
+
} else if(targetNode === prevTargetNode) {
|
2576
|
+
// Moving over same node
|
2577
|
+
targetNode.tree._onDragEvent("over", targetNode, sourceNode, event, ui, draggable);
|
2578
|
+
}else{
|
2579
|
+
// Entering this node first time
|
2580
|
+
targetNode.tree._onDragEvent("enter", targetNode, sourceNode, event, ui, draggable);
|
2581
|
+
}
|
2582
|
+
}
|
2583
|
+
// else go ahead with standard event handling
|
2584
|
+
},
|
2585
|
+
stop: function(event, ui) {
|
2586
|
+
var draggable = $(this).data("draggable");
|
2587
|
+
var sourceNode = ui.helper.data("dtSourceNode") || null;
|
2588
|
+
var targetNode = getDtNodeFromElement(event.target);
|
2589
|
+
// var targetTree = targetNode ? targetNode.tree : null;
|
2590
|
+
// if(dtnode && dtnode.tree.
|
2591
|
+
logMsg("draggable-connectToDynatree.stop, %o", sourceNode);
|
2592
|
+
var mouseDownEvent = draggable._mouseDownEvent;
|
2593
|
+
var eventType = event.type;
|
2594
|
+
logMsg(" type: %o, downEvent: %o, upEvent: %o", eventType, mouseDownEvent, event);
|
2595
|
+
var dropped = (eventType == "mouseup" && event.which == 1);
|
2596
|
+
if(!dropped)
|
2597
|
+
logMsg("Drag was cancelled");
|
2598
|
+
if(targetNode) {
|
2599
|
+
if(dropped)
|
2600
|
+
targetNode.tree._onDragEvent("drop", targetNode, sourceNode, event, ui, draggable);
|
2601
|
+
targetNode.tree._onDragEvent("leave", targetNode, sourceNode, event, ui, draggable);
|
2602
|
+
}
|
2603
|
+
if(sourceNode)
|
2604
|
+
sourceNode.tree._onDragEvent("stop", sourceNode, null, event, ui, draggable);
|
2605
|
+
}
|
2606
|
+
});
|
2607
|
+
didRegisterDnd = true;
|
2608
|
+
};
|
2609
|
+
|
2610
|
+
|
2032
2611
|
// ---------------------------------------------------------------------------
|
2033
2612
|
})(jQuery);
|
2034
2613
|
|