jquery-layout-rails 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
data/README.md
CHANGED
@@ -22,4 +22,4 @@ Alternatively you can add both dependencies at once:
|
|
22
22
|
If you have multiple requires in your application, you shouldn't include jquery in more
|
23
23
|
than one of them or it will be included more than once. This means it will remove all prior
|
24
24
|
registered plugins on each inclusion. So, if that is your case you should include
|
25
|
-
`jquery/layout` instead of `jquery-
|
25
|
+
`jquery/layout` instead of `jquery-layout` for better control over jQuery inclusion.
|
@@ -1,7 +1,8 @@
|
|
1
1
|
/**
|
2
|
-
* @preserve
|
3
|
-
*
|
4
|
-
* $
|
2
|
+
* @preserve
|
3
|
+
* jquery.layout 1.3.0 - Release Candidate 30.79
|
4
|
+
* $Date: 2013-01-12 08:00:00 (Sat, 12 Jan 2013) $
|
5
|
+
* $Rev: 303007 $
|
5
6
|
*
|
6
7
|
* Copyright (c) 2012
|
7
8
|
* Fabrizio Balliano (http://www.fabrizioballiano.net)
|
@@ -10,7 +11,7 @@
|
|
10
11
|
* Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
|
11
12
|
* and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
|
12
13
|
*
|
13
|
-
* Changelog: http://layout.jquery-dev.net/changelog.cfm#1.3.0.rc30.
|
14
|
+
* Changelog: http://layout.jquery-dev.net/changelog.cfm#1.3.0.rc30.79
|
14
15
|
*
|
15
16
|
* Docs: http://layout.jquery-dev.net/documentation.html
|
16
17
|
* Tips: http://layout.jquery-dev.net/tips.html
|
@@ -23,6 +24,10 @@
|
|
23
24
|
* {number=} optional parameter
|
24
25
|
* {*} ALL types
|
25
26
|
*/
|
27
|
+
/* TODO for jQ 2.0
|
28
|
+
* change .andSelf() to .addBack()
|
29
|
+
* $.fn.disableSelection won't work
|
30
|
+
*/
|
26
31
|
|
27
32
|
// NOTE: For best readability, view with a fixed-width font and tabs equal to 4-chars
|
28
33
|
|
@@ -32,61 +37,38 @@
|
|
32
37
|
var min = Math.min
|
33
38
|
, max = Math.max
|
34
39
|
, round = Math.floor
|
35
|
-
;
|
36
|
-
function isStr (v) { return $.type(v) === "string"; }
|
37
|
-
|
38
|
-
function runPluginCallbacks (Instance, a_fn) {
|
39
|
-
if ($.isArray(a_fn))
|
40
|
-
for (var i=0, c=a_fn.length; i<c; i++) {
|
41
|
-
var fn = a_fn[i];
|
42
|
-
try {
|
43
|
-
if (isStr(fn)) // 'name' of a function
|
44
|
-
fn = eval(fn);
|
45
|
-
if ($.isFunction(fn))
|
46
|
-
fn( Instance );
|
47
|
-
} catch (ex) {}
|
48
|
-
}
|
49
|
-
};
|
50
40
|
|
41
|
+
, isStr = function (v) { return $.type(v) === "string"; }
|
51
42
|
|
43
|
+
/**
|
44
|
+
* @param {!Object} Instance
|
45
|
+
* @param {Array.<string>} a_fn
|
46
|
+
*/
|
47
|
+
, runPluginCallbacks = function (Instance, a_fn) {
|
48
|
+
if ($.isArray(a_fn))
|
49
|
+
for (var i=0, c=a_fn.length; i<c; i++) {
|
50
|
+
var fn = a_fn[i];
|
51
|
+
try {
|
52
|
+
if (isStr(fn)) // 'name' of a function
|
53
|
+
fn = eval(fn);
|
54
|
+
if ($.isFunction(fn))
|
55
|
+
g(fn)( Instance );
|
56
|
+
} catch (ex) {}
|
57
|
+
}
|
58
|
+
function g (f) { return f; }; // compiler hack
|
59
|
+
}
|
60
|
+
;
|
52
61
|
|
53
62
|
/*
|
54
63
|
* GENERIC $.layout METHODS - used by all layouts
|
55
64
|
*/
|
56
65
|
$.layout = {
|
57
66
|
|
58
|
-
version: "1.3.rc30.
|
59
|
-
, revision: 0.
|
60
|
-
|
61
|
-
//
|
62
|
-
,
|
63
|
-
// Tips and messages for resizers, togglers, custom buttons, etc.
|
64
|
-
Open: "Open" // eg: "Open Pane"
|
65
|
-
, Close: "Close"
|
66
|
-
, Resize: "Resize"
|
67
|
-
, Slide: "Slide Open"
|
68
|
-
, Pin: "Pin"
|
69
|
-
, Unpin: "Un-Pin"
|
70
|
-
, noRoomToOpenTip: "Not enough room to show this pane."
|
71
|
-
, minSizeWarning: "Panel has reached its minimum size"
|
72
|
-
, maxSizeWarning: "Panel has reached its maximum size"
|
73
|
-
// Developer error messages
|
74
|
-
, pane: "pane" // description of "layout pane element"
|
75
|
-
, selector: "selector" // description of "jQuery-selector"
|
76
|
-
, errButton: "Error Adding Button \n\nInvalid "
|
77
|
-
, errContainerMissing: "UI Layout Initialization Error\n\nThe specified layout-container does not exist."
|
78
|
-
, errCenterPaneMissing: "UI Layout Initialization Error\n\nThe center-pane element does not exist.\n\nThe center-pane is a required element."
|
79
|
-
, errContainerHeight: "UI Layout Initialization Warning\n\nThe layout-container \"CONTAINER\" has no height.\n\nTherefore the layout is 0-height and hence 'invisible'!"
|
80
|
-
}
|
81
|
-
|
82
|
-
// can update code here if $.browser is phased out
|
83
|
-
, browser: {
|
84
|
-
mozilla: !!$.browser.mozilla
|
85
|
-
, webkit: !!$.browser.webkit || !!$.browser.safari // webkit = jQ 1.4
|
86
|
-
, msie: !!$.browser.msie
|
87
|
-
, isIE6: !!$.browser.msie && $.browser.version == 6
|
88
|
-
, version: $.browser.version // not used in Layout core, but may be used by plugins
|
89
|
-
}
|
67
|
+
version: "1.3.rc30.79"
|
68
|
+
, revision: 0.033007 // 1.3.0 final = 1.0300 - major(n+).minor(nn)+patch(nn+)
|
69
|
+
|
70
|
+
// $.layout.browser REPLACES $.browser
|
71
|
+
, browser: {} // set below
|
90
72
|
|
91
73
|
// *PREDEFINED* EFFECTS & DEFAULTS
|
92
74
|
// MUST list effect here - OR MUST set an fxSettings option (can be an empty hash: {})
|
@@ -200,7 +182,7 @@ $.layout = {
|
|
200
182
|
}
|
201
183
|
}
|
202
184
|
, north: {
|
203
|
-
side: "
|
185
|
+
side: "top"
|
204
186
|
, sizeType: "Height"
|
205
187
|
, dir: "horz"
|
206
188
|
, cssReq: {
|
@@ -213,7 +195,7 @@ $.layout = {
|
|
213
195
|
}
|
214
196
|
}
|
215
197
|
, south: {
|
216
|
-
side: "
|
198
|
+
side: "bottom"
|
217
199
|
, sizeType: "Height"
|
218
200
|
, dir: "horz"
|
219
201
|
, cssReq: {
|
@@ -226,7 +208,7 @@ $.layout = {
|
|
226
208
|
}
|
227
209
|
}
|
228
210
|
, east: {
|
229
|
-
side: "
|
211
|
+
side: "right"
|
230
212
|
, sizeType: "Width"
|
231
213
|
, dir: "vert"
|
232
214
|
, cssReq: {
|
@@ -239,7 +221,7 @@ $.layout = {
|
|
239
221
|
}
|
240
222
|
}
|
241
223
|
, west: {
|
242
|
-
side: "
|
224
|
+
side: "left"
|
243
225
|
, sizeType: "Width"
|
244
226
|
, dir: "vert"
|
245
227
|
, cssReq: {
|
@@ -298,15 +280,18 @@ $.layout = {
|
|
298
280
|
return typeof evt === "object" && evt.stopPropagation ? evt : null;
|
299
281
|
}
|
300
282
|
, parsePaneName: function (evt_or_pane) {
|
301
|
-
|
302
|
-
|
283
|
+
var evt = $.layout.getEventObject( evt_or_pane )
|
284
|
+
, pane = evt_or_pane;
|
303
285
|
if (evt) {
|
304
286
|
// ALWAYS stop propagation of events triggered in Layout!
|
305
287
|
evt.stopPropagation();
|
306
|
-
|
288
|
+
pane = $(this).data("layoutEdge");
|
307
289
|
}
|
308
|
-
|
309
|
-
|
290
|
+
if (pane && !/^(west|east|north|south|center)$/.test(pane)) {
|
291
|
+
$.layout.msg('LAYOUT ERROR - Invalid pane-name: "'+ pane +'"');
|
292
|
+
pane = "error";
|
293
|
+
}
|
294
|
+
return pane;
|
310
295
|
}
|
311
296
|
|
312
297
|
|
@@ -316,7 +301,7 @@ $.layout = {
|
|
316
301
|
draggable: !!$.fn.draggable // resizing
|
317
302
|
, effects: {
|
318
303
|
core: !!$.effects // animimations (specific effects tested by initOptions)
|
319
|
-
, slide: $.effects && $.effects.slide // default effect
|
304
|
+
, slide: $.effects && ($.effects.slide || ($.effects.effect && $.effects.effect.slide)) // default effect
|
320
305
|
}
|
321
306
|
}
|
322
307
|
|
@@ -338,7 +323,7 @@ $.layout = {
|
|
338
323
|
, scrollbarHeight: function () { return window.scrollbarHeight || $.layout.getScrollbarSize('height'); }
|
339
324
|
, getScrollbarSize: function (dim) {
|
340
325
|
var $c = $('<div style="position: absolute; top: -10000px; left: -10000px; width: 100px; height: 100px; overflow: scroll;"></div>').appendTo("body");
|
341
|
-
var d = { width: $c.width
|
326
|
+
var d = { width: $c.css("width") - $c[0].clientWidth, height: $c.height() - $c[0].clientHeight };
|
342
327
|
$c.remove();
|
343
328
|
window.scrollbarWidth = d.width;
|
344
329
|
window.scrollbarHeight = d.height;
|
@@ -350,19 +335,20 @@ $.layout = {
|
|
350
335
|
* Returns hash container 'display' and 'visibility'
|
351
336
|
*
|
352
337
|
* @see $.swap() - swaps CSS, runs callback, resets CSS
|
338
|
+
* @param {!Object} $E jQuery element
|
339
|
+
* @param {boolean=} [force=false] Run even if display != none
|
340
|
+
* @return {!Object} Returns current style props, if applicable
|
353
341
|
*/
|
354
342
|
, showInvisibly: function ($E, force) {
|
355
|
-
if (
|
356
|
-
|
357
|
-
|
358
|
-
display:
|
359
|
-
|
360
|
-
|
361
|
-
if (force || CSS.display === "none") { // only if not *already hidden*
|
362
|
-
$E.css({ display: "block", visibility: "hidden" }); // show element 'invisibly' so can be measured
|
343
|
+
if ($E && $E.length && (force || $E.css("display") === "none")) { // only if not *already hidden*
|
344
|
+
var s = $E[0].style
|
345
|
+
// save ONLY the 'style' props because that is what we must restore
|
346
|
+
, CSS = { display: s.display || '', visibility: s.visibility || '' };
|
347
|
+
// show element 'invisibly' so can be measured
|
348
|
+
$E.css({ display: "block", visibility: "hidden" });
|
363
349
|
return CSS;
|
364
350
|
}
|
365
|
-
|
351
|
+
return {};
|
366
352
|
}
|
367
353
|
|
368
354
|
/**
|
@@ -371,32 +357,29 @@ $.layout = {
|
|
371
357
|
* @see _create(), onWindowResize() for container, plus others for pane
|
372
358
|
* @return JSON Returns a hash of all dimensions: top, bottom, left, right, outerWidth, innerHeight, etc
|
373
359
|
*/
|
374
|
-
, getElementDimensions: function ($E) {
|
360
|
+
, getElementDimensions: function ($E, inset) {
|
375
361
|
var
|
376
|
-
|
377
|
-
|
378
|
-
,
|
379
|
-
,
|
362
|
+
// dimensions hash - start with current data IF passed
|
363
|
+
d = { css: {}, inset: {} }
|
364
|
+
, x = d.css // CSS hash
|
365
|
+
, i = { bottom: 0 } // TEMP insets (bottom = complier hack)
|
380
366
|
, N = $.layout.cssNum
|
381
367
|
, off = $E.offset()
|
368
|
+
, b, p, ei // TEMP border, padding
|
382
369
|
;
|
383
370
|
d.offsetLeft = off.left;
|
384
371
|
d.offsetTop = off.top;
|
385
372
|
|
373
|
+
if (!inset) inset = {}; // simplify logic below
|
374
|
+
|
386
375
|
$.each("Left,Right,Top,Bottom".split(","), function (idx, e) { // e = edge
|
387
376
|
b = x["border" + e] = $.layout.borderWidth($E, e);
|
388
377
|
p = x["padding"+ e] = $.layout.cssNum($E, "padding"+e);
|
389
|
-
|
390
|
-
d[
|
378
|
+
ei = e.toLowerCase();
|
379
|
+
d.inset[ei] = inset[ei] >= 0 ? inset[ei] : p; // any missing insetX value = paddingX
|
380
|
+
i[ei] = d.inset[ei] + b; // total offset of content from outer side
|
391
381
|
});
|
392
382
|
|
393
|
-
d.offsetWidth = $E.innerWidth(); // offsetWidth is used in calc when doing manual resize
|
394
|
-
d.offsetHeight = $E.innerHeight(); // ditto
|
395
|
-
d.outerWidth = $E.outerWidth();
|
396
|
-
d.outerHeight = $E.outerHeight();
|
397
|
-
d.innerWidth = max(0, d.outerWidth - i.Left - i.Right);
|
398
|
-
d.innerHeight = max(0, d.outerHeight - i.Top - i.Bottom);
|
399
|
-
|
400
383
|
x.width = $E.width();
|
401
384
|
x.height = $E.height();
|
402
385
|
x.top = N($E,"top",true);
|
@@ -404,12 +387,24 @@ $.layout = {
|
|
404
387
|
x.left = N($E,"left",true);
|
405
388
|
x.right = N($E,"right",true);
|
406
389
|
|
390
|
+
d.outerWidth = $E.outerWidth();
|
391
|
+
d.outerHeight = $E.outerHeight();
|
392
|
+
// calc the TRUE inner-dimensions, even in quirks-mode!
|
393
|
+
d.innerWidth = max(0, d.outerWidth - i.left - i.right);
|
394
|
+
d.innerHeight = max(0, d.outerHeight - i.top - i.bottom);
|
395
|
+
// layoutWidth/Height is used in calcs for manual resizing
|
396
|
+
// layoutW/H only differs from innerW/H when in quirks-mode - then is like outerW/H
|
397
|
+
d.layoutWidth = $E.innerWidth();
|
398
|
+
d.layoutHeight = $E.innerHeight();
|
399
|
+
|
400
|
+
//if ($E.prop('tagName') === 'BODY') { debugData( d, $E.prop('tagName') ); } // DEBUG
|
401
|
+
|
407
402
|
//d.visible = $E.is(":visible");// && x.width > 0 && x.height > 0;
|
408
403
|
|
409
404
|
return d;
|
410
405
|
}
|
411
406
|
|
412
|
-
,
|
407
|
+
, getElementStyles: function ($E, list) {
|
413
408
|
var
|
414
409
|
CSS = {}
|
415
410
|
, style = $E[0].style
|
@@ -446,23 +441,19 @@ $.layout = {
|
|
446
441
|
* @return {number} Returns the innerWidth of the elem by subtracting padding and borders
|
447
442
|
*/
|
448
443
|
, cssWidth: function ($E, outerWidth) {
|
449
|
-
var
|
450
|
-
b = $.layout.borderWidth
|
451
|
-
, n = $.layout.cssNum
|
452
|
-
;
|
453
444
|
// a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed
|
454
445
|
if (outerWidth <= 0) return 0;
|
455
446
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
- b($E, "Left")
|
461
|
-
- b($E, "Right")
|
462
|
-
- n($E, "paddingLeft")
|
463
|
-
- n($E, "paddingRight")
|
447
|
+
var bs = !$.layout.browser.boxModel ? "border-box" : $.support.boxSizing ? $E.css("boxSizing") : "content-box"
|
448
|
+
, b = $.layout.borderWidth
|
449
|
+
, n = $.layout.cssNum
|
450
|
+
, W = outerWidth
|
464
451
|
;
|
465
|
-
|
452
|
+
// strip border and/or padding from outerWidth to get CSS Width
|
453
|
+
if (bs !== "border-box")
|
454
|
+
W -= (b($E, "Left") + b($E, "Right"));
|
455
|
+
if (bs === "content-box")
|
456
|
+
W -= (n($E, "paddingLeft") + n($E, "paddingRight"));
|
466
457
|
return max(0,W);
|
467
458
|
}
|
468
459
|
|
@@ -475,23 +466,19 @@ $.layout = {
|
|
475
466
|
* @return {number} Returns the innerHeight of the elem by subtracting padding and borders
|
476
467
|
*/
|
477
468
|
, cssHeight: function ($E, outerHeight) {
|
478
|
-
var
|
479
|
-
b = $.layout.borderWidth
|
480
|
-
, n = $.layout.cssNum
|
481
|
-
;
|
482
469
|
// a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed
|
483
470
|
if (outerHeight <= 0) return 0;
|
484
471
|
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
- b($E, "Top")
|
490
|
-
- b($E, "Bottom")
|
491
|
-
- n($E, "paddingTop")
|
492
|
-
- n($E, "paddingBottom")
|
472
|
+
var bs = !$.layout.browser.boxModel ? "border-box" : $.support.boxSizing ? $E.css("boxSizing") : "content-box"
|
473
|
+
, b = $.layout.borderWidth
|
474
|
+
, n = $.layout.cssNum
|
475
|
+
, H = outerHeight
|
493
476
|
;
|
494
|
-
|
477
|
+
// strip border and/or padding from outerHeight to get CSS Height
|
478
|
+
if (bs !== "border-box")
|
479
|
+
H -= (b($E, "Top") + b($E, "Bottom"));
|
480
|
+
if (bs === "content-box")
|
481
|
+
H -= (n($E, "paddingTop") + n($E, "paddingBottom"));
|
495
482
|
return max(0,H);
|
496
483
|
}
|
497
484
|
|
@@ -507,8 +494,8 @@ $.layout = {
|
|
507
494
|
, cssNum: function ($E, prop, allowAuto) {
|
508
495
|
if (!$E.jquery) $E = $($E);
|
509
496
|
var CSS = $.layout.showInvisibly($E)
|
510
|
-
, p = $.
|
511
|
-
, v = allowAuto && p=="auto" ? p : (
|
497
|
+
, p = $.css($E[0], prop, true)
|
498
|
+
, v = allowAuto && p=="auto" ? p : Math.round(parseFloat(p) || 0);
|
512
499
|
$E.css( CSS ); // RESET
|
513
500
|
return v;
|
514
501
|
}
|
@@ -516,7 +503,7 @@ $.layout = {
|
|
516
503
|
, borderWidth: function (el, side) {
|
517
504
|
if (el.jquery) el = el[0];
|
518
505
|
var b = "border"+ side.substr(0,1).toUpperCase() + side.substr(1); // left => Left
|
519
|
-
return $.
|
506
|
+
return $.css(el, b+"Style", true) === "none" ? 0 : Math.round(parseFloat($.css(el, b+"Width", true)) || 0);
|
520
507
|
}
|
521
508
|
|
522
509
|
/**
|
@@ -567,7 +554,7 @@ $.layout = {
|
|
567
554
|
* @param {(Object|string)} info String message OR Hash/Array
|
568
555
|
* @param {(Boolean|string|Object)=} [popup=false] True means alert-box - can be skipped
|
569
556
|
* @param {(Object|string)=} [debugTitle=""] Title for Hash data - can be skipped
|
570
|
-
* @param {Object=} [
|
557
|
+
* @param {Object=} [debugOpts] Extra options for debug output
|
571
558
|
*/
|
572
559
|
, msg: function (info, popup, debugTitle, debugOpts) {
|
573
560
|
if ($.isPlainObject(info) && window.debugData) {
|
@@ -614,28 +601,57 @@ $.layout = {
|
|
614
601
|
|
615
602
|
};
|
616
603
|
|
617
|
-
var lang = $.layout.language; // alias used in defaults...
|
618
604
|
|
619
|
-
|
605
|
+
/*
|
606
|
+
* $.layout.browser REPLACES removed $.browser, with extra data
|
607
|
+
* Parsing code here adapted from jQuery 1.8 $.browse
|
608
|
+
*/
|
609
|
+
var u = navigator.userAgent.toLowerCase()
|
610
|
+
, m = /(chrome)[ \/]([\w.]+)/.exec( u )
|
611
|
+
|| /(webkit)[ \/]([\w.]+)/.exec( u )
|
612
|
+
|| /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( u )
|
613
|
+
|| /(msie) ([\w.]+)/.exec( u )
|
614
|
+
|| u.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( u )
|
615
|
+
|| []
|
616
|
+
, b = m[1] || ""
|
617
|
+
, v = m[2] || 0
|
618
|
+
, ie = b === "msie"
|
619
|
+
;
|
620
|
+
$.layout.browser = {
|
621
|
+
version: v
|
622
|
+
, safari: b === "webkit" // webkit (NOT chrome) = safari
|
623
|
+
, webkit: b === "chrome" // chrome = webkit
|
624
|
+
, msie: ie
|
625
|
+
, isIE6: ie && v == 6
|
626
|
+
// ONLY IE reverts to old box-model - update for older jQ onReady
|
627
|
+
, boxModel: !ie || $.support.boxModel !== false
|
628
|
+
};
|
629
|
+
if (b) $.layout.browser[b] = true; // set CURRENT browser
|
630
|
+
/* OLD versions of jQuery only set $.support.boxModel after page is loaded
|
631
|
+
* so if this is IE, use support.boxModel to test for quirks-mode (ONLY IE changes boxModel) */
|
632
|
+
if (ie) $(function(){ $.layout.browser.boxModel = $.support.boxModel; });
|
633
|
+
|
634
|
+
|
635
|
+
// DEFAULT OPTIONS
|
620
636
|
$.layout.defaults = {
|
621
637
|
/*
|
622
638
|
* LAYOUT & LAYOUT-CONTAINER OPTIONS
|
623
639
|
* - none of these options are applicable to individual panes
|
624
640
|
*/
|
625
641
|
name: "" // Not required, but useful for buttons and used for the state-cookie
|
626
|
-
, containerSelector: "" // ONLY used when specifying a childOptions - to find container-element that is NOT directly-nested
|
627
642
|
, containerClass: "ui-layout-container" // layout-container element
|
643
|
+
, inset: null // custom container-inset values (override padding)
|
628
644
|
, scrollToBookmarkOnLoad: true // after creating a layout, scroll to bookmark in URL (.../page.htm#myBookmark)
|
629
645
|
, resizeWithWindow: true // bind thisLayout.resizeAll() to the window.resize event
|
630
646
|
, resizeWithWindowDelay: 200 // delay calling resizeAll because makes window resizing very jerky
|
631
647
|
, resizeWithWindowMaxDelay: 0 // 0 = none - force resize every XX ms while window is being resized
|
648
|
+
, maskPanesEarly: false // true = create pane-masks on resizer.mouseDown instead of waiting for resizer.dragstart
|
632
649
|
, onresizeall_start: null // CALLBACK when resizeAll() STARTS - NOT pane-specific
|
633
650
|
, onresizeall_end: null // CALLBACK when resizeAll() ENDS - NOT pane-specific
|
634
651
|
, onload_start: null // CALLBACK when Layout inits - after options initialized, but before elements
|
635
652
|
, onload_end: null // CALLBACK when Layout inits - after EVERYTHING has been initialized
|
636
653
|
, onunload_start: null // CALLBACK when Layout is destroyed OR onWindowUnload
|
637
654
|
, onunload_end: null // CALLBACK when Layout is destroyed OR onWindowUnload
|
638
|
-
, autoBindCustomButtons: false // search for buttons with ui-layout-button class and auto-bind them
|
639
655
|
, initPanes: true // false = DO NOT initialize the panes onLoad - will init later
|
640
656
|
, showErrorMessages: true // enables fatal error messages to warn developers of common errors
|
641
657
|
, showDebugMessages: false // display console-and-alert debug msgs - IF this Layout version _has_ debugging code!
|
@@ -650,6 +666,15 @@ $.layout.defaults = {
|
|
650
666
|
, pane_animate: 1000 // applied to the pane when being animated - not applied to the resizer
|
651
667
|
, resizer_drag: 10000 // applied to the CLONED resizer-bar when being 'dragged'
|
652
668
|
}
|
669
|
+
, errors: {
|
670
|
+
pane: "pane" // description of "layout pane element" - used only in error messages
|
671
|
+
, selector: "selector" // description of "jQuery-selector" - used only in error messages
|
672
|
+
, addButtonError: "Error Adding Button\nInvalid "
|
673
|
+
, containerMissing: "UI Layout Initialization Error\nThe specified layout-container does not exist."
|
674
|
+
, centerPaneMissing: "UI Layout Initialization Error\nThe center-pane element does not exist.\nThe center-pane is a required element."
|
675
|
+
, noContainerHeight: "UI Layout Initialization Warning\nThe layout-container \"CONTAINER\" has no height.\nTherefore the layout is 0-height and hence 'invisible'!"
|
676
|
+
, callbackError: "UI Layout Callback Error\nThe EVENT callback is not a valid function."
|
677
|
+
}
|
653
678
|
/*
|
654
679
|
* PANE DEFAULT SETTINGS
|
655
680
|
* - settings under the 'panes' key become the default settings for *all panes*
|
@@ -682,8 +707,6 @@ $.layout.defaults = {
|
|
682
707
|
, togglerLength_closed: 50 // 100% OR -1 means 'full height/width of resizer bar' - 0 means 'hidden'
|
683
708
|
, togglerAlign_open: "center" // top/left, bottom/right, center, OR...
|
684
709
|
, togglerAlign_closed: "center" // 1 => nn = offset from top/left, -1 => -nn == offset from bottom/right
|
685
|
-
, togglerTip_open: lang.Close // Toggler tool-tip (title)
|
686
|
-
, togglerTip_closed: lang.Open // ditto
|
687
710
|
, togglerContent_open: "" // text or HTML to put INSIDE the toggler
|
688
711
|
, togglerContent_closed: "" // ditto
|
689
712
|
// RESIZING OPTIONS
|
@@ -699,10 +722,7 @@ $.layout.defaults = {
|
|
699
722
|
, livePaneResizing: false // true = LIVE Resizing as resizer is dragged
|
700
723
|
, liveContentResizing: false // true = re-measure header/footer heights as resizer is dragged
|
701
724
|
, liveResizingTolerance: 1 // how many px change before pane resizes, to control performance
|
702
|
-
//
|
703
|
-
, noRoomToOpenTip: lang.noRoomToOpenTip
|
704
|
-
, resizerTip: lang.Resize // Resizer tool-tip (title)
|
705
|
-
, sliderTip: lang.Slide // resizer-bar triggers 'sliding' when pane is closed
|
725
|
+
// SLIDING OPTIONS
|
706
726
|
, sliderCursor: "pointer" // cursor when resizer-bar will trigger 'sliding'
|
707
727
|
, slideTrigger_open: "click" // click, dblclick, mouseenter
|
708
728
|
, slideTrigger_close: "mouseleave"// click, mouseleave
|
@@ -711,6 +731,18 @@ $.layout.defaults = {
|
|
711
731
|
, hideTogglerOnSlide: false // when pane is slid-open, should the toggler show?
|
712
732
|
, preventQuickSlideClose: $.layout.browser.webkit // Chrome triggers slideClosed as it is opening
|
713
733
|
, preventPrematureSlideClose: false // handle incorrect mouseleave trigger, like when over a SELECT-list in IE
|
734
|
+
// PANE-SPECIFIC TIPS & MESSAGES
|
735
|
+
, tips: {
|
736
|
+
Open: "Open" // eg: "Open Pane"
|
737
|
+
, Close: "Close"
|
738
|
+
, Resize: "Resize"
|
739
|
+
, Slide: "Slide Open"
|
740
|
+
, Pin: "Pin"
|
741
|
+
, Unpin: "Un-Pin"
|
742
|
+
, noRoomToOpen: "Not enough room to show this panel." // alert if user tries to open a pane that cannot
|
743
|
+
, minSizeWarning: "Panel has reached its minimum size" // displays in browser statusbar
|
744
|
+
, maxSizeWarning: "Panel has reached its maximum size" // ditto
|
745
|
+
}
|
714
746
|
// HOT-KEYS & MISC
|
715
747
|
, showOverflowOnHover: false // will bind allowOverflow() utility to pane.onMouseOver
|
716
748
|
, enableCursorHotkey: true // enabled 'cursor' hotkeys
|
@@ -723,7 +755,7 @@ $.layout.defaults = {
|
|
723
755
|
, fxSettings: {} // can be passed, eg: { easing: "easeOutBounce", duration: 1500 }
|
724
756
|
, fxOpacityFix: true // tries to fix opacity in IE to restore anti-aliasing after animation
|
725
757
|
, animatePaneSizing: false // true = animate resizing after dragging resizer-bar OR sizePane() is called
|
726
|
-
|
758
|
+
/* NOTE: Action-specific FX options are auto-generated from the options above if not specifically set:
|
727
759
|
fxName_open: "slide" // 'Open' pane animation
|
728
760
|
fnName_close: "slide" // 'Close' pane animation
|
729
761
|
fxName_size: "slide" // 'Size' pane animation - when animatePaneSizing = true
|
@@ -735,13 +767,15 @@ $.layout.defaults = {
|
|
735
767
|
fxSettings_size: {}
|
736
768
|
*/
|
737
769
|
// CHILD/NESTED LAYOUTS
|
738
|
-
,
|
739
|
-
,
|
740
|
-
,
|
741
|
-
,
|
742
|
-
//
|
770
|
+
, children: null // Layout-options for nested/child layout - even {} is valid as options
|
771
|
+
, containerSelector: '' // if child is NOT 'directly nested', a selector to find it/them (can have more than one child layout!)
|
772
|
+
, initChildren: true // true = child layout will be created as soon as _this_ layout completes initialization
|
773
|
+
, destroyChildren: true // true = destroy child-layout if this pane is destroyed
|
774
|
+
, resizeChildren: true // true = trigger child-layout.resizeAll() when this pane is resized
|
775
|
+
// EVENT TRIGGERING
|
743
776
|
, triggerEventsOnLoad: false // true = trigger onopen OR onclose callbacks when layout initializes
|
744
777
|
, triggerEventsDuringLiveResize: true // true = trigger onresize callback REPEATEDLY if livePaneResizing==true
|
778
|
+
// PANE CALLBACKS
|
745
779
|
, onshow_start: null // CALLBACK when pane STARTS to Show - BEFORE onopen/onhide_start
|
746
780
|
, onshow_end: null // CALLBACK when pane ENDS being Shown - AFTER onopen/onhide_end
|
747
781
|
, onhide_start: null // CALLBACK when pane STARTS to Close - BEFORE onclose_start
|
@@ -798,15 +832,15 @@ $.layout.defaults = {
|
|
798
832
|
|
799
833
|
$.layout.optionsMap = {
|
800
834
|
// layout/global options - NOT pane-options
|
801
|
-
layout: ("stateManagement,effects,zIndexes,"
|
802
|
-
+ "
|
803
|
-
+ "resizeWithWindow,resizeWithWindowDelay,resizeWithWindowMaxDelay,"
|
804
|
-
+ "onresizeall,onresizeall_start,onresizeall_end,onload,onunload,
|
835
|
+
layout: ("name,instanceKey,stateManagement,effects,inset,zIndexes,errors,"
|
836
|
+
+ "zIndex,scrollToBookmarkOnLoad,showErrorMessages,maskPanesEarly,"
|
837
|
+
+ "outset,resizeWithWindow,resizeWithWindowDelay,resizeWithWindowMaxDelay,"
|
838
|
+
+ "onresizeall,onresizeall_start,onresizeall_end,onload,onload_start,onload_end,onunload,onunload_start,onunload_end").split(",")
|
805
839
|
// borderPanes: [ ALL options that are NOT specified as 'layout' ]
|
806
840
|
// default.panes options that apply to the center-pane (most options apply _only_ to border-panes)
|
807
841
|
, center: ("paneClass,contentSelector,contentIgnoreSelector,findNestedContent,applyDemoStyles,triggerEventsOnLoad,"
|
808
842
|
+ "showOverflowOnHover,maskContents,maskObjects,liveContentResizing,"
|
809
|
-
+ "
|
843
|
+
+ "containerSelector,children,initChildren,resizeChildren,destroyChildren,"
|
810
844
|
+ "onresize,onresize_start,onresize_end,onsizecontent,onsizecontent_start,onsizecontent_end").split(",")
|
811
845
|
// options that MUST be specifically set 'per-pane' - CANNOT set in the panes (defaults) key
|
812
846
|
, noDefault: ("paneSelector,resizerCursor,customHotkey").split(",")
|
@@ -817,36 +851,41 @@ $.layout.optionsMap = {
|
|
817
851
|
* In flat-format, subkeys are _currently_ separated with 2 underscores, like north__optName
|
818
852
|
* Plugins may also call this method so they can transform their own data
|
819
853
|
*
|
820
|
-
* @param {!Object} hash
|
821
|
-
* @
|
854
|
+
* @param {!Object} hash Data/options passed by user - may be a single level or nested levels
|
855
|
+
* @param {boolean=} [addKeys=false] Should the primary layout.options keys be added if they do not exist?
|
856
|
+
* @return {Object} Returns hash of minWidth & minHeight
|
822
857
|
*/
|
823
|
-
$.layout.transformData = function (hash) {
|
824
|
-
var json = { panes: {}, center: {} } // init return object
|
825
|
-
,
|
858
|
+
$.layout.transformData = function (hash, addKeys) {
|
859
|
+
var json = addKeys ? { panes: {}, center: {} } : {} // init return object
|
860
|
+
, branch, optKey, keys, key, val, i, c;
|
826
861
|
|
827
862
|
if (typeof hash !== "object") return json; // no options passed
|
828
863
|
|
829
864
|
// convert all 'flat-keys' to 'sub-key' format
|
830
865
|
for (optKey in hash) {
|
831
866
|
branch = json;
|
832
|
-
data = $.layout.optionsMap.layout;
|
833
867
|
val = hash[ optKey ];
|
834
868
|
keys = optKey.split("__"); // eg: west__size or north__fxSettings__duration
|
835
869
|
c = keys.length - 1;
|
836
870
|
// convert underscore-delimited to subkeys
|
837
871
|
for (i=0; i <= c; i++) {
|
838
872
|
key = keys[i];
|
839
|
-
if (i === c)
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
873
|
+
if (i === c) { // last key = value
|
874
|
+
if ($.isPlainObject( val ))
|
875
|
+
branch[key] = $.layout.transformData( val ); // RECURSE
|
876
|
+
else
|
877
|
+
branch[key] = val;
|
878
|
+
}
|
879
|
+
else {
|
880
|
+
if (!branch[key])
|
881
|
+
branch[key] = {}; // create the subkey
|
882
|
+
// recurse to sub-key for next loop - if not done
|
883
|
+
branch = branch[key];
|
884
|
+
}
|
845
885
|
}
|
846
886
|
}
|
847
|
-
|
848
887
|
return json;
|
849
|
-
}
|
888
|
+
};
|
850
889
|
|
851
890
|
// INTERNAL CONFIG DATA - DO NOT CHANGE THIS!
|
852
891
|
$.layout.backwardCompatibility = {
|
@@ -854,11 +893,18 @@ $.layout.backwardCompatibility = {
|
|
854
893
|
map: {
|
855
894
|
// OLD Option Name: NEW Option Name
|
856
895
|
applyDefaultStyles: "applyDemoStyles"
|
857
|
-
|
896
|
+
// CHILD/NESTED LAYOUTS
|
897
|
+
, childOptions: "children"
|
898
|
+
, initChildLayout: "initChildren"
|
899
|
+
, destroyChildLayout: "destroyChildren"
|
900
|
+
, resizeChildLayout: "resizeChildren"
|
901
|
+
, resizeNestedLayout: "resizeChildren"
|
902
|
+
// MISC Options
|
858
903
|
, resizeWhileDragging: "livePaneResizing"
|
859
904
|
, resizeContentWhileDragging: "liveContentResizing"
|
860
905
|
, triggerEventsWhileDragging: "triggerEventsDuringLiveResize"
|
861
906
|
, maskIframesOnResize: "maskContents"
|
907
|
+
// STATE MANAGEMENT
|
862
908
|
, useStateCookie: "stateManagement.enabled"
|
863
909
|
, "cookie.autoLoad": "stateManagement.autoLoad"
|
864
910
|
, "cookie.autoSave": "stateManagement.autoSave"
|
@@ -868,19 +914,26 @@ $.layout.backwardCompatibility = {
|
|
868
914
|
, "cookie.path": "stateManagement.cookie.path"
|
869
915
|
, "cookie.expires": "stateManagement.cookie.expires"
|
870
916
|
, "cookie.secure": "stateManagement.cookie.secure"
|
917
|
+
// OLD Language options
|
918
|
+
, noRoomToOpenTip: "tips.noRoomToOpen"
|
919
|
+
, togglerTip_open: "tips.Close" // open = Close
|
920
|
+
, togglerTip_closed: "tips.Open" // closed = Open
|
921
|
+
, resizerTip: "tips.Resize"
|
922
|
+
, sliderTip: "tips.Slide"
|
871
923
|
}
|
872
|
-
|
873
|
-
|
874
|
-
|
924
|
+
|
925
|
+
/**
|
926
|
+
* @param {Object} opts
|
927
|
+
*/
|
875
928
|
, renameOptions: function (opts) {
|
876
929
|
var map = $.layout.backwardCompatibility.map
|
877
930
|
, oldData, newData, value
|
878
931
|
;
|
879
932
|
for (var itemPath in map) {
|
880
933
|
oldData = getBranch( itemPath );
|
881
|
-
value = oldData.branch[ oldData.key ]
|
934
|
+
value = oldData.branch[ oldData.key ];
|
882
935
|
if (value !== undefined) {
|
883
|
-
newData = getBranch( map[itemPath], true )
|
936
|
+
newData = getBranch( map[itemPath], true );
|
884
937
|
newData.branch[ newData.key ] = value;
|
885
938
|
delete oldData.branch[ oldData.key ];
|
886
939
|
}
|
@@ -910,9 +963,10 @@ $.layout.backwardCompatibility = {
|
|
910
963
|
return D;
|
911
964
|
};
|
912
965
|
}
|
913
|
-
|
914
|
-
|
915
|
-
|
966
|
+
|
967
|
+
/**
|
968
|
+
* @param {Object} opts
|
969
|
+
*/
|
916
970
|
, renameAllOptions: function (opts) {
|
917
971
|
var ren = $.layout.backwardCompatibility.renameOptions;
|
918
972
|
// rename root (layout) options
|
@@ -936,6 +990,7 @@ $.layout.backwardCompatibility = {
|
|
936
990
|
|
937
991
|
|
938
992
|
|
993
|
+
|
939
994
|
/* ============================================================
|
940
995
|
* BEGIN WIDGET: $( selector ).layout( {options} );
|
941
996
|
* ============================================================
|
@@ -945,14 +1000,13 @@ $.fn.layout = function (opts) {
|
|
945
1000
|
|
946
1001
|
// local aliases to global data
|
947
1002
|
browser = $.layout.browser
|
948
|
-
, lang = $.layout.language // internal alias
|
949
1003
|
, _c = $.layout.config
|
950
1004
|
|
951
1005
|
// local aliases to utlity methods
|
952
1006
|
, cssW = $.layout.cssWidth
|
953
1007
|
, cssH = $.layout.cssHeight
|
954
1008
|
, elDims = $.layout.getElementDimensions
|
955
|
-
,
|
1009
|
+
, styles = $.layout.getElementStyles
|
956
1010
|
, evtObj = $.layout.getEventObject
|
957
1011
|
, evtPane = $.layout.parsePaneName
|
958
1012
|
|
@@ -967,14 +1021,23 @@ $.fn.layout = function (opts) {
|
|
967
1021
|
*/
|
968
1022
|
, state = {
|
969
1023
|
// generate unique ID to use for event.namespace so can unbind only events added by 'this layout'
|
970
|
-
id:
|
971
|
-
, initialized:
|
972
|
-
,
|
973
|
-
,
|
974
|
-
,
|
975
|
-
|
976
|
-
|
977
|
-
|
1024
|
+
id: "layout"+ $.now() // code uses alias: sID
|
1025
|
+
, initialized: false
|
1026
|
+
, paneResizing: false
|
1027
|
+
, panesSliding: {}
|
1028
|
+
, container: { // list all keys referenced in code to avoid compiler error msgs
|
1029
|
+
innerWidth: 0
|
1030
|
+
, innerHeight: 0
|
1031
|
+
, outerWidth: 0
|
1032
|
+
, outerHeight: 0
|
1033
|
+
, layoutWidth: 0
|
1034
|
+
, layoutHeight: 0
|
1035
|
+
}
|
1036
|
+
, north: { childIdx: 0 }
|
1037
|
+
, south: { childIdx: 0 }
|
1038
|
+
, east: { childIdx: 0 }
|
1039
|
+
, west: { childIdx: 0 }
|
1040
|
+
, center: { childIdx: 0 }
|
978
1041
|
}
|
979
1042
|
|
980
1043
|
/**
|
@@ -1004,32 +1067,48 @@ $.fn.layout = function (opts) {
|
|
1004
1067
|
, clear: function (s) { var t=timer.data; if (t[s]) {clearTimeout(t[s]); delete t[s];} }
|
1005
1068
|
}
|
1006
1069
|
|
1007
|
-
|
1008
|
-
|
1070
|
+
/**
|
1071
|
+
* Alert or console.log a message - IF option is enabled.
|
1072
|
+
*
|
1073
|
+
* @param {(string|!Object)} msg Message (or debug-data) to display
|
1074
|
+
* @param {boolean=} [popup=false] True by default, means 'alert', false means use console.log
|
1075
|
+
* @param {boolean=} [debug=false] True means is a widget debugging message
|
1076
|
+
*/
|
1077
|
+
, _log = function (msg, popup, debug) {
|
1078
|
+
var o = options;
|
1079
|
+
if ((o.showErrorMessages && !debug) || (debug && o.showDebugMessages))
|
1080
|
+
$.layout.msg( o.name +' / '+ msg, (popup !== false) );
|
1081
|
+
return false;
|
1009
1082
|
}
|
1010
1083
|
|
1011
1084
|
/**
|
1012
1085
|
* Executes a Callback function after a trigger event, like resize, open or close
|
1013
1086
|
*
|
1014
|
-
* @param {string}
|
1015
|
-
* @param {
|
1016
|
-
* @param {
|
1087
|
+
* @param {string} evtName Name of the layout callback, eg "onresize_start"
|
1088
|
+
* @param {(string|boolean)=} [pane=""] This is passed only so we can pass the 'pane object' to the callback
|
1089
|
+
* @param {(string|boolean)=} [skipBoundEvents=false] True = do not run events bound to the elements - only the callbacks set in options
|
1017
1090
|
*/
|
1018
1091
|
, _runCallbacks = function (evtName, pane, skipBoundEvents) {
|
1019
|
-
var
|
1092
|
+
var hasPane = pane && isStr(pane)
|
1093
|
+
, s = hasPane ? state[pane] : state
|
1094
|
+
, o = hasPane ? options[pane] : options
|
1095
|
+
, lName = options.name
|
1020
1096
|
// names like onopen and onopen_end separate are interchangeable in options...
|
1021
|
-
, lng
|
1097
|
+
, lng = evtName + (evtName.match(/_/) ? "" : "_end")
|
1022
1098
|
, shrt = lng.match(/_end$/) ? lng.substr(0, lng.length - 4) : ""
|
1023
|
-
, fn = o[lng]
|
1099
|
+
, fn = o[lng] || o[shrt]
|
1024
1100
|
, retVal = "NC" // NC = No Callback
|
1025
1101
|
, args = []
|
1102
|
+
, $P
|
1026
1103
|
;
|
1027
|
-
if (!
|
1028
|
-
|
1104
|
+
if ( !hasPane && $.type(pane) === 'boolean' ) {
|
1105
|
+
skipBoundEvents = pane; // allow pane param to be skipped for Layout callback
|
1106
|
+
pane = "";
|
1107
|
+
}
|
1029
1108
|
|
1030
1109
|
// first trigger the callback set in the options
|
1031
1110
|
if (fn) {
|
1032
|
-
|
1111
|
+
try {
|
1033
1112
|
// convert function name (string) to function object
|
1034
1113
|
if (isStr( fn )) {
|
1035
1114
|
if (fn.match(/,/)) {
|
@@ -1044,33 +1123,46 @@ $.fn.layout = function (opts) {
|
|
1044
1123
|
// execute the callback, if exists
|
1045
1124
|
if ($.isFunction( fn )) {
|
1046
1125
|
if (args.length)
|
1047
|
-
retVal = fn(args[1]); // pass the argument parsed from 'list'
|
1048
|
-
else if (
|
1126
|
+
retVal = g(fn)(args[1]); // pass the argument parsed from 'list'
|
1127
|
+
else if ( hasPane )
|
1049
1128
|
// pass data: pane-name, pane-element, pane-state, pane-options, and layout-name
|
1050
|
-
retVal = fn( pane, $Ps[pane],
|
1129
|
+
retVal = g(fn)( pane, $Ps[pane], s, o, lName );
|
1051
1130
|
else // must be a layout/container callback - pass suitable info
|
1052
|
-
retVal = fn( Instance,
|
1131
|
+
retVal = g(fn)( Instance, s, o, lName );
|
1053
1132
|
}
|
1054
|
-
|
1055
|
-
|
1133
|
+
}
|
1134
|
+
catch (ex) {
|
1135
|
+
_log( options.errors.callbackError.replace(/EVENT/, $.trim((pane || "") +" "+ lng)), false );
|
1136
|
+
if ($.type(ex) === 'string' && string.length)
|
1137
|
+
_log('Exception: '+ ex, false );
|
1138
|
+
}
|
1056
1139
|
}
|
1057
1140
|
|
1058
1141
|
// trigger additional events bound directly to the pane
|
1059
1142
|
if (!skipBoundEvents && retVal !== false) {
|
1060
|
-
if (
|
1061
|
-
$
|
1143
|
+
if ( hasPane ) { // PANE events can be bound to each pane-elements
|
1144
|
+
$P = $Ps[pane];
|
1145
|
+
o = options[pane];
|
1146
|
+
s = state[pane];
|
1147
|
+
$P.triggerHandler('layoutpane'+ lng, [ pane, $P, s, o, lName ]);
|
1148
|
+
if (shrt)
|
1149
|
+
$P.triggerHandler('layoutpane'+ shrt, [ pane, $P, s, o, lName ]);
|
1150
|
+
}
|
1151
|
+
else { // LAYOUT events can be bound to the container-element
|
1152
|
+
$N.triggerHandler('layout'+ lng, [ Instance, s, o, lName ]);
|
1062
1153
|
if (shrt)
|
1063
|
-
$
|
1154
|
+
$N.triggerHandler('layout'+ shrt, [ Instance, s, o, lName ]);
|
1064
1155
|
}
|
1065
|
-
else // LAYOUT events can be bound to the container-element
|
1066
|
-
$N.triggerHandler('layout'+ lng, [ pane, $Ps[pane], state[pane], options[pane], options.name ]);
|
1067
1156
|
}
|
1068
1157
|
|
1069
|
-
// ALWAYS
|
1070
|
-
|
1071
|
-
|
1158
|
+
// ALWAYS resizeChildren after an onresize_end event - even during initialization
|
1159
|
+
// IGNORE onsizecontent_end event because causes child-layouts to resize TWICE
|
1160
|
+
if (hasPane && evtName === "onresize_end") // BAD: || evtName === "onsizecontent_end"
|
1161
|
+
resizeChildren(pane+"", true); // compiler hack -force string
|
1072
1162
|
|
1073
1163
|
return retVal;
|
1164
|
+
|
1165
|
+
function g (f) { return f; }; // compiler hack
|
1074
1166
|
}
|
1075
1167
|
|
1076
1168
|
|
@@ -1163,18 +1255,6 @@ $.fn.layout = function (opts) {
|
|
1163
1255
|
$E.hide().data('autoHidden', true);
|
1164
1256
|
}
|
1165
1257
|
|
1166
|
-
/**
|
1167
|
-
* @param {(string|!Object)} el
|
1168
|
-
* @param {number=} outerSize
|
1169
|
-
* @param {boolean=} [autoHide=false]
|
1170
|
-
*/
|
1171
|
-
, setOuterSize = function (el, outerSize, autoHide) {
|
1172
|
-
if (_c[pane].dir=="horz") // pane = north or south
|
1173
|
-
setOuterHeight(el, outerSize, autoHide);
|
1174
|
-
else // pane = east or west
|
1175
|
-
setOuterWidth(el, outerSize, autoHide);
|
1176
|
-
}
|
1177
|
-
|
1178
1258
|
|
1179
1259
|
/**
|
1180
1260
|
* Converts any 'size' params to a pixel/integer size, if not already
|
@@ -1232,7 +1312,7 @@ $.fn.layout = function (opts) {
|
|
1232
1312
|
*
|
1233
1313
|
* @param {(string|!Object)} pane
|
1234
1314
|
* @param {boolean=} [inclSpace=false]
|
1235
|
-
* @return {number} Returns EITHER Width for east/west panes OR Height for north/south panes
|
1315
|
+
* @return {number} Returns EITHER Width for east/west panes OR Height for north/south panes
|
1236
1316
|
*/
|
1237
1317
|
, getPaneSize = function (pane, inclSpace) {
|
1238
1318
|
var
|
@@ -1265,7 +1345,6 @@ $.fn.layout = function (opts) {
|
|
1265
1345
|
, s = state[pane]
|
1266
1346
|
, c = _c[pane]
|
1267
1347
|
, dir = c.dir
|
1268
|
-
, side = c.side.toLowerCase()
|
1269
1348
|
, type = c.sizeType.toLowerCase()
|
1270
1349
|
, isSliding = (slide != undefined ? slide : s.isSliding) // only open() passes 'slide' param
|
1271
1350
|
, $P = $Ps[pane]
|
@@ -1285,8 +1364,8 @@ $.fn.layout = function (opts) {
|
|
1285
1364
|
, minSize = s.minSize = max( _parseSize(pane, o.minSize), cssMinDims(pane).minSize )
|
1286
1365
|
, maxSize = s.maxSize = min( (o.maxSize ? _parseSize(pane, o.maxSize) : 100000), limitSize )
|
1287
1366
|
, r = s.resizerPosition = {} // used to set resizing limits
|
1288
|
-
, top = sC.
|
1289
|
-
, left = sC.
|
1367
|
+
, top = sC.inset.top
|
1368
|
+
, left = sC.inset.left
|
1290
1369
|
, W = sC.innerWidth
|
1291
1370
|
, H = sC.innerHeight
|
1292
1371
|
, rW = o.spacing_open // subtract resizer-width to get top/left position for south/east
|
@@ -1327,10 +1406,10 @@ $.fn.layout = function (opts) {
|
|
1327
1406
|
d.width = sC.innerWidth - d.left - d.right; // outerWidth
|
1328
1407
|
d.height = sC.innerHeight - d.bottom - d.top; // outerHeight
|
1329
1408
|
// add the 'container border/padding' to get final positions relative to the container
|
1330
|
-
d.top += sC.
|
1331
|
-
d.bottom += sC.
|
1332
|
-
d.left += sC.
|
1333
|
-
d.right += sC.
|
1409
|
+
d.top += sC.inset.top;
|
1410
|
+
d.bottom += sC.inset.bottom;
|
1411
|
+
d.left += sC.inset.left;
|
1412
|
+
d.right += sC.inset.right;
|
1334
1413
|
|
1335
1414
|
return d;
|
1336
1415
|
}
|
@@ -1376,14 +1455,22 @@ $.fn.layout = function (opts) {
|
|
1376
1455
|
}
|
1377
1456
|
|
1378
1457
|
, onResizerEnter = function (evt) { // ALSO called by toggler.mouseenter
|
1458
|
+
var pane = $(this).data("layoutEdge")
|
1459
|
+
, s = state[pane]
|
1460
|
+
;
|
1461
|
+
// ignore closed-panes and mouse moving back & forth over resizer!
|
1462
|
+
// also ignore if ANY pane is currently resizing
|
1463
|
+
if ( s.isClosed || s.isResizing || state.paneResizing ) return;
|
1464
|
+
|
1379
1465
|
if ($.fn.disableSelection)
|
1380
1466
|
$("body").disableSelection();
|
1467
|
+
if (options.maskPanesEarly)
|
1468
|
+
showMasks( pane, { resizing: true });
|
1381
1469
|
}
|
1382
1470
|
, onResizerLeave = function (evt, el) {
|
1383
|
-
var
|
1384
|
-
|
1385
|
-
, pane
|
1386
|
-
, name = pane +"ResizerLeave"
|
1471
|
+
var e = el || this // el is only passed when called by the timer
|
1472
|
+
, pane = $(e).data("layoutEdge")
|
1473
|
+
, name = pane +"ResizerLeave"
|
1387
1474
|
;
|
1388
1475
|
timer.clear(pane+"_openSlider"); // cancel slideOpen timer, if set
|
1389
1476
|
timer.clear(name); // cancel enableSelection timer - may re/set below
|
@@ -1393,8 +1480,12 @@ $.fn.layout = function (opts) {
|
|
1393
1480
|
if (!el) // 1st call - mouseleave event
|
1394
1481
|
timer.set(name, function(){ onResizerLeave(evt, e); }, 200);
|
1395
1482
|
// if user is resizing, then dragStop will enableSelection(), so can skip it here
|
1396
|
-
else if (!state
|
1397
|
-
|
1483
|
+
else if ( !state.paneResizing ) { // 2nd call - by timer
|
1484
|
+
if ($.fn.enableSelection)
|
1485
|
+
$("body").enableSelection();
|
1486
|
+
if (options.maskPanesEarly)
|
1487
|
+
hideMasks();
|
1488
|
+
}
|
1398
1489
|
}
|
1399
1490
|
|
1400
1491
|
/*
|
@@ -1412,10 +1503,11 @@ $.fn.layout = function (opts) {
|
|
1412
1503
|
, _create = function () {
|
1413
1504
|
// initialize config/options
|
1414
1505
|
initOptions();
|
1415
|
-
var o = options
|
1506
|
+
var o = options
|
1507
|
+
, s = state;
|
1416
1508
|
|
1417
1509
|
// TEMP state so isInitialized returns true during init process
|
1418
|
-
|
1510
|
+
s.creatingLayout = true;
|
1419
1511
|
|
1420
1512
|
// init plugins for this layout, if there are any (eg: stateManagement)
|
1421
1513
|
runPluginCallbacks( Instance, $.layout.onCreate );
|
@@ -1441,7 +1533,7 @@ $.fn.layout = function (opts) {
|
|
1441
1533
|
// initLayoutElements will set initialized=true and run the onload callback IF successful
|
1442
1534
|
if (o.initPanes) _initLayoutElements();
|
1443
1535
|
|
1444
|
-
delete
|
1536
|
+
delete s.creatingLayout;
|
1445
1537
|
|
1446
1538
|
return state.initialized;
|
1447
1539
|
}
|
@@ -1461,12 +1553,12 @@ $.fn.layout = function (opts) {
|
|
1461
1553
|
* Initialize the layout - called automatically whenever an instance of layout is created
|
1462
1554
|
*
|
1463
1555
|
* @see _create() & isInitialized
|
1556
|
+
* @param {boolean=} [retry=false] // indicates this is a 2nd try
|
1464
1557
|
* @return An object pointer to the instance created
|
1465
1558
|
*/
|
1466
1559
|
, _initLayoutElements = function (retry) {
|
1467
1560
|
// initialize config/options
|
1468
1561
|
var o = options;
|
1469
|
-
|
1470
1562
|
// CANNOT init panes inside a hidden container!
|
1471
1563
|
if (!$N.is(":visible")) {
|
1472
1564
|
// handle Chrome bug where popup window 'has no height'
|
@@ -1479,16 +1571,14 @@ $.fn.layout = function (opts) {
|
|
1479
1571
|
|
1480
1572
|
// a center pane is required, so make sure it exists
|
1481
1573
|
if (!getPane("center").length) {
|
1482
|
-
|
1483
|
-
_log( lang.errCenterPaneMissing, true );
|
1484
|
-
return false;
|
1574
|
+
return _log( o.errors.centerPaneMissing );
|
1485
1575
|
}
|
1486
1576
|
|
1487
1577
|
// TEMP state so isInitialized returns true during init process
|
1488
1578
|
state.creatingLayout = true;
|
1489
1579
|
|
1490
1580
|
// update Container dims
|
1491
|
-
$.extend(sC, elDims( $N ));
|
1581
|
+
$.extend(sC, elDims( $N, o.inset )); // passing inset means DO NOT include insetX values
|
1492
1582
|
|
1493
1583
|
// initialize all layout elements
|
1494
1584
|
initPanes(); // size & position panes - calls initHandles() - which calls initResizable()
|
@@ -1518,62 +1608,148 @@ $.fn.layout = function (opts) {
|
|
1518
1608
|
}
|
1519
1609
|
|
1520
1610
|
/**
|
1521
|
-
* Initialize nested layouts -
|
1522
|
-
*
|
1523
|
-
* NOT CURRENTLY USED
|
1611
|
+
* Initialize nested layouts for a specific pane - can optionally pass layout-options
|
1524
1612
|
*
|
1525
|
-
* @
|
1526
|
-
* @
|
1613
|
+
* @param {(string|Object)} evt_or_pane The pane being opened, ie: north, south, east, or west
|
1614
|
+
* @param {Object=} [opts] Layout-options - if passed, will OVERRRIDE options[pane].children
|
1615
|
+
* @return An object pointer to the layout instance created - or null
|
1527
1616
|
*/
|
1528
|
-
,
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1617
|
+
, createChildren = function (evt_or_pane, opts) {
|
1618
|
+
var pane = evtPane.call(this, evt_or_pane)
|
1619
|
+
, $P = $Ps[pane]
|
1620
|
+
;
|
1621
|
+
if (!$P) return;
|
1622
|
+
var $C = $Cs[pane]
|
1623
|
+
, s = state[pane]
|
1624
|
+
, o = options[pane]
|
1625
|
+
, sm = options.stateManagement || {}
|
1626
|
+
, cos = opts ? (o.children = opts) : o.children
|
1627
|
+
;
|
1628
|
+
if ( $.isPlainObject( cos ) )
|
1629
|
+
cos = [ cos ]; // convert a hash to a 1-elem array
|
1630
|
+
else if (!cos || !$.isArray( cos ))
|
1631
|
+
return;
|
1632
|
+
|
1633
|
+
$.each( cos, function (idx, co) {
|
1634
|
+
if ( !$.isPlainObject( co ) ) return;
|
1635
|
+
|
1636
|
+
// determine which element is supposed to be the 'child container'
|
1637
|
+
// if pane has a 'containerSelector' OR a 'content-div', use those instead of the pane
|
1638
|
+
var $containers = co.containerSelector ? $P.find( co.containerSelector ) : ($C || $P);
|
1639
|
+
|
1640
|
+
$containers.each(function(){
|
1641
|
+
var $cont = $(this)
|
1642
|
+
, child = $cont.data("layout") // see if a child-layout ALREADY exists on this element
|
1643
|
+
;
|
1644
|
+
// if no layout exists, but children are set, try to create the layout now
|
1645
|
+
if (!child) {
|
1646
|
+
// TODO: see about moving this to the stateManagement plugin, as a method
|
1647
|
+
// set a unique child-instance key for this layout, if not already set
|
1648
|
+
setInstanceKey({ container: $cont, options: co }, s );
|
1649
|
+
// If THIS layout has a hash in stateManagement.autoLoad,
|
1650
|
+
// then see if it also contains state-data for this child-layout
|
1651
|
+
// If so, copy the stateData to child.options.stateManagement.autoLoad
|
1652
|
+
if ( sm.includeChildren && state.stateData[pane] ) {
|
1653
|
+
// THIS layout's state was cached when its state was loaded
|
1654
|
+
var paneChildren = state.stateData[pane].children || {}
|
1655
|
+
, childState = paneChildren[ co.instanceKey ]
|
1656
|
+
, co_sm = co.stateManagement || (co.stateManagement = { autoLoad: true })
|
1657
|
+
;
|
1658
|
+
// COPY the stateData into the autoLoad key
|
1659
|
+
if ( co_sm.autoLoad === true && childState ) {
|
1660
|
+
co_sm.autoSave = false; // disable autoSave because saving handled by parent-layout
|
1661
|
+
co_sm.includeChildren = true; // cascade option - FOR NOW
|
1662
|
+
co_sm.autoLoad = $.extend(true, {}, childState); // COPY the state-hash
|
1663
|
+
}
|
1664
|
+
}
|
1665
|
+
|
1666
|
+
// create the layout
|
1667
|
+
child = $cont.layout( co );
|
1668
|
+
|
1669
|
+
// if successful, update data
|
1670
|
+
if (child) {
|
1671
|
+
// add the child and update all layout-pointers
|
1672
|
+
// MAY have already been done by child-layout calling parent.refreshChildren()
|
1673
|
+
refreshChildren( pane, child );
|
1674
|
+
}
|
1675
|
+
}
|
1676
|
+
});
|
1532
1677
|
});
|
1533
1678
|
}
|
1534
1679
|
|
1680
|
+
, setInstanceKey = function (child, parentPaneState) {
|
1681
|
+
// create a named key for use in state and instance branches
|
1682
|
+
var $c = child.container
|
1683
|
+
, o = child.options
|
1684
|
+
, sm = o.stateManagement
|
1685
|
+
, key = o.instanceKey || $c.data("layoutInstanceKey")
|
1686
|
+
;
|
1687
|
+
if (!key) key = (sm && sm.cookie ? sm.cookie.name : '') || o.name; // look for a name/key
|
1688
|
+
if (!key) key = "layout"+ (++parentPaneState.childIdx); // if no name/key found, generate one
|
1689
|
+
else key = key.replace(/[^\w-]/gi, '_').replace(/_{2,}/g, '_'); // ensure is valid as a hash key
|
1690
|
+
o.instanceKey = key;
|
1691
|
+
$c.data("layoutInstanceKey", key); // useful if layout is destroyed and then recreated
|
1692
|
+
return key;
|
1693
|
+
}
|
1694
|
+
|
1535
1695
|
/**
|
1536
|
-
*
|
1537
|
-
*
|
1538
|
-
* @see _initChildLayouts
|
1539
|
-
* @param {string} pane The pane being opened, ie: north, south, east, or west
|
1540
|
-
* @param {Object=} [opts] Layout-options - if passed, will OVERRRIDE options[pane].childOptions
|
1541
|
-
* @return An object pointer to the layout instance created - or null
|
1696
|
+
* @param {string} pane The pane being opened, ie: north, south, east, or west
|
1697
|
+
* @param {Object=} newChild New child-layout Instance to add to this pane
|
1542
1698
|
*/
|
1543
|
-
,
|
1544
|
-
var
|
1545
|
-
,
|
1546
|
-
,
|
1699
|
+
, refreshChildren = function (pane, newChild) {
|
1700
|
+
var $P = $Ps[pane]
|
1701
|
+
, pC = children[pane]
|
1702
|
+
, s = state[pane]
|
1703
|
+
, o
|
1547
1704
|
;
|
1548
|
-
|
1549
|
-
|
1550
|
-
,
|
1551
|
-
|
1552
|
-
|
1553
|
-
//
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
1705
|
+
// check for destroy()ed layouts and update the child pointers & arrays
|
1706
|
+
if ($.isPlainObject( pC )) {
|
1707
|
+
$.each( pC, function (key, child) {
|
1708
|
+
if (child.destroyed) delete pC[key]
|
1709
|
+
});
|
1710
|
+
// if no more children, remove the children hash
|
1711
|
+
if ($.isEmptyObject( pC ))
|
1712
|
+
pC = children[pane] = null; // clear children hash
|
1713
|
+
}
|
1714
|
+
|
1715
|
+
// see if there is a directly-nested layout inside this pane
|
1716
|
+
// if there is, then there can be only ONE child-layout, so check that...
|
1717
|
+
if (!newChild && !pC) {
|
1718
|
+
newChild = $P.data("layout");
|
1719
|
+
}
|
1720
|
+
|
1721
|
+
// if a newChild instance was passed, add it to children[pane]
|
1722
|
+
if (newChild) {
|
1723
|
+
// update child.state
|
1724
|
+
newChild.hasParentLayout = true; // set parent-flag in child
|
1725
|
+
// instanceKey is a key-name used in both state and children
|
1726
|
+
o = newChild.options;
|
1727
|
+
// set a unique child-instance key for this layout, if not already set
|
1728
|
+
setInstanceKey( newChild, s );
|
1729
|
+
// add pointer to pane.children hash
|
1730
|
+
if (!pC) pC = children[pane] = {}; // create an empty children hash
|
1731
|
+
pC[ o.instanceKey ] = newChild.container.data("layout"); // add childLayout instance
|
1732
|
+
}
|
1733
|
+
|
1734
|
+
// ALWAYS refresh the pane.children alias, even if null
|
1735
|
+
Instance[pane].children = children[pane];
|
1736
|
+
|
1737
|
+
// if newChild was NOT passed - see if there is a child layout NOW
|
1738
|
+
if (!newChild) {
|
1739
|
+
createChildren(pane); // MAY create a child and re-call this method
|
1564
1740
|
}
|
1565
|
-
Instance[pane].child = C[pane]; // ALWAYS set pane-object pointer, even if null
|
1566
1741
|
}
|
1567
1742
|
|
1568
1743
|
, windowResize = function () {
|
1569
|
-
var
|
1744
|
+
var o = options
|
1745
|
+
, delay = Number(o.resizeWithWindowDelay);
|
1570
1746
|
if (delay < 10) delay = 100; // MUST have a delay!
|
1571
1747
|
// resizing uses a delay-loop because the resize event fires repeatly - except in FF, but delay anyway
|
1572
1748
|
timer.clear("winResize"); // if already running
|
1573
1749
|
timer.set("winResize", function(){
|
1574
1750
|
timer.clear("winResize");
|
1575
1751
|
timer.clear("winResizeRepeater");
|
1576
|
-
var dims = elDims( $N );
|
1752
|
+
var dims = elDims( $N, o.inset );
|
1577
1753
|
// only trigger resizeAll() if container has changed size
|
1578
1754
|
if (dims.innerWidth !== sC.innerWidth || dims.innerHeight !== sC.innerHeight)
|
1579
1755
|
resizeAll();
|
@@ -1606,14 +1782,14 @@ $.fn.layout = function (opts) {
|
|
1606
1782
|
*/
|
1607
1783
|
, _initContainer = function () {
|
1608
1784
|
var
|
1609
|
-
N = $N[0]
|
1785
|
+
N = $N[0]
|
1786
|
+
, $H = $("html")
|
1610
1787
|
, tag = sC.tagName = N.tagName
|
1611
1788
|
, id = sC.id = N.id
|
1612
1789
|
, cls = sC.className = N.className
|
1613
1790
|
, o = options
|
1614
1791
|
, name = o.name
|
1615
|
-
,
|
1616
|
-
, props = "overflow,position,margin,padding,border"
|
1792
|
+
, props = "position,margin,padding,border"
|
1617
1793
|
, css = "layoutCSS"
|
1618
1794
|
, CSS = {}
|
1619
1795
|
, hid = "hidden" // used A LOT!
|
@@ -1621,10 +1797,21 @@ $.fn.layout = function (opts) {
|
|
1621
1797
|
, parent = $N.data("parentLayout") // parent-layout Instance
|
1622
1798
|
, pane = $N.data("layoutEdge") // pane-name in parent-layout
|
1623
1799
|
, isChild = parent && pane
|
1800
|
+
, num = $.layout.cssNum
|
1801
|
+
, $parent, n
|
1624
1802
|
;
|
1625
|
-
// sC
|
1803
|
+
// sC = state.container
|
1626
1804
|
sC.selector = $N.selector.split(".slice")[0];
|
1627
1805
|
sC.ref = (o.name ? o.name +' layout / ' : '') + tag + (id ? "#"+id : cls ? '.['+cls+']' : ''); // used in messages
|
1806
|
+
sC.isBody = (tag === "BODY");
|
1807
|
+
|
1808
|
+
// try to find a parent-layout
|
1809
|
+
if (!isChild && !sC.isBody) {
|
1810
|
+
$parent = $N.closest("."+ $.layout.defaults.panes.paneClass);
|
1811
|
+
parent = $parent.data("parentLayout");
|
1812
|
+
pane = $parent.data("layoutEdge");
|
1813
|
+
isChild = parent && pane;
|
1814
|
+
}
|
1628
1815
|
|
1629
1816
|
$N .data({
|
1630
1817
|
layout: Instance
|
@@ -1633,12 +1820,11 @@ $.fn.layout = function (opts) {
|
|
1633
1820
|
.addClass(o.containerClass)
|
1634
1821
|
;
|
1635
1822
|
var layoutMethods = {
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
, name;
|
1823
|
+
destroy: ''
|
1824
|
+
, initPanes: ''
|
1825
|
+
, resizeAll: 'resizeAll'
|
1826
|
+
, resize: 'resizeAll'
|
1827
|
+
};
|
1642
1828
|
// loop hash and bind all methods - include layoutID namespacing
|
1643
1829
|
for (name in layoutMethods) {
|
1644
1830
|
$N.bind("layout"+ name.toLowerCase() +"."+ sID, Instance[ layoutMethods[name] || name ]);
|
@@ -1649,82 +1835,126 @@ $.fn.layout = function (opts) {
|
|
1649
1835
|
// update parent flag
|
1650
1836
|
Instance.hasParentLayout = true;
|
1651
1837
|
// set pointers to THIS child-layout (Instance) in parent-layout
|
1652
|
-
|
1653
|
-
parent[pane].child = parent.children[pane] = $N.data("layout");
|
1838
|
+
parent.refreshChildren( pane, Instance );
|
1654
1839
|
}
|
1655
1840
|
|
1656
1841
|
// SAVE original container CSS for use in destroy()
|
1657
1842
|
if (!$N.data(css)) {
|
1658
1843
|
// handle props like overflow different for BODY & HTML - has 'system default' values
|
1659
|
-
if (
|
1660
|
-
|
1844
|
+
if (sC.isBody) {
|
1845
|
+
// SAVE <BODY> CSS
|
1846
|
+
$N.data(css, $.extend( styles($N, props), {
|
1661
1847
|
height: $N.css("height")
|
1662
1848
|
, overflow: $N.css("overflow")
|
1663
1849
|
, overflowX: $N.css("overflowX")
|
1664
1850
|
, overflowY: $N.css("overflowY")
|
1665
|
-
});
|
1851
|
+
}));
|
1666
1852
|
// ALSO SAVE <HTML> CSS
|
1667
|
-
|
1668
|
-
$H.data(css, {
|
1853
|
+
$H.data(css, $.extend( styles($H, 'padding'), {
|
1669
1854
|
height: "auto" // FF would return a fixed px-size!
|
1670
1855
|
, overflow: $H.css("overflow")
|
1671
1856
|
, overflowX: $H.css("overflowX")
|
1672
1857
|
, overflowY: $H.css("overflowY")
|
1673
|
-
});
|
1858
|
+
}));
|
1674
1859
|
}
|
1675
1860
|
else // handle props normally for non-body elements
|
1676
|
-
|
1677
|
-
|
1678
|
-
$N.data(css, CSS);
|
1861
|
+
$N.data(css, styles($N, props+",top,bottom,left,right,width,height,overflow,overflowX,overflowY") );
|
1679
1862
|
}
|
1680
1863
|
|
1681
|
-
try {
|
1682
|
-
|
1683
|
-
|
1864
|
+
try {
|
1865
|
+
// common container CSS
|
1866
|
+
CSS = {
|
1867
|
+
overflow: hid
|
1868
|
+
, overflowX: hid
|
1869
|
+
, overflowY: hid
|
1870
|
+
};
|
1871
|
+
$N.css( CSS );
|
1872
|
+
|
1873
|
+
if (o.inset && !$.isPlainObject(o.inset)) {
|
1874
|
+
// can specify a single number for equal outset all-around
|
1875
|
+
n = parseInt(o.inset, 10) || 0
|
1876
|
+
o.inset = {
|
1877
|
+
top: n
|
1878
|
+
, bottom: n
|
1879
|
+
, left: n
|
1880
|
+
, right: n
|
1881
|
+
};
|
1882
|
+
}
|
1883
|
+
|
1884
|
+
// format html & body if this is a full page layout
|
1885
|
+
if (sC.isBody) {
|
1886
|
+
// if HTML has padding, use this as an outer-spacing around BODY
|
1887
|
+
if (!o.outset) {
|
1888
|
+
// use padding from parent-elem (HTML) as outset
|
1889
|
+
o.outset = {
|
1890
|
+
top: num($H, "paddingTop")
|
1891
|
+
, bottom: num($H, "paddingBottom")
|
1892
|
+
, left: num($H, "paddingLeft")
|
1893
|
+
, right: num($H, "paddingRight")
|
1894
|
+
};
|
1895
|
+
}
|
1896
|
+
else if (!$.isPlainObject(o.outset)) {
|
1897
|
+
// can specify a single number for equal outset all-around
|
1898
|
+
n = parseInt(o.outset, 10) || 0
|
1899
|
+
o.outset = {
|
1900
|
+
top: n
|
1901
|
+
, bottom: n
|
1902
|
+
, left: n
|
1903
|
+
, right: n
|
1904
|
+
};
|
1905
|
+
}
|
1906
|
+
// HTML
|
1907
|
+
$H.css( CSS ).css({
|
1684
1908
|
height: "100%"
|
1685
|
-
,
|
1686
|
-
,
|
1687
|
-
, overflowY: hid
|
1688
|
-
});
|
1689
|
-
$("body").css({
|
1690
|
-
position: "relative"
|
1691
|
-
, height: "100%"
|
1692
|
-
, overflow: hid
|
1693
|
-
, overflowX: hid
|
1694
|
-
, overflowY: hid
|
1909
|
+
, border: "none" // no border or padding allowed when using height = 100%
|
1910
|
+
, padding: 0 // ditto
|
1695
1911
|
, margin: 0
|
1696
|
-
, padding: 0 // TODO: test whether body-padding could be handled?
|
1697
|
-
, border: "none" // a body-border creates problems because it cannot be measured!
|
1698
1912
|
});
|
1699
|
-
|
1913
|
+
// BODY
|
1914
|
+
if (browser.isIE6) {
|
1915
|
+
// IE6 CANNOT use the trick of setting absolute positioning on all 4 sides - must have 'height'
|
1916
|
+
$N.css({
|
1917
|
+
width: "100%"
|
1918
|
+
, height: "100%"
|
1919
|
+
, border: "none" // no border or padding allowed when using height = 100%
|
1920
|
+
, padding: 0 // ditto
|
1921
|
+
, margin: 0
|
1922
|
+
, position: "relative"
|
1923
|
+
});
|
1924
|
+
// convert body padding to an inset option - the border cannot be measured in IE6!
|
1925
|
+
if (!o.inset) o.inset = elDims( $N ).inset;
|
1926
|
+
}
|
1927
|
+
else { // use absolute positioning for BODY to allow borders & padding without overflow
|
1928
|
+
$N.css({
|
1929
|
+
width: "auto"
|
1930
|
+
, height: "auto"
|
1931
|
+
, margin: 0
|
1932
|
+
, position: "absolute" // allows for border and padding on BODY
|
1933
|
+
});
|
1934
|
+
// apply edge-positioning created above
|
1935
|
+
$N.css( o.outset );
|
1936
|
+
}
|
1700
1937
|
// set current layout-container dimensions
|
1701
|
-
$.extend(sC, elDims( $N ));
|
1938
|
+
$.extend(sC, elDims( $N, o.inset )); // passing inset means DO NOT include insetX values
|
1702
1939
|
}
|
1703
|
-
else {
|
1704
|
-
//
|
1705
|
-
|
1706
|
-
|
1707
|
-
|
1708
|
-
, h = $N.css("height")
|
1709
|
-
;
|
1710
|
-
// if this is a NESTED layout, then container/outer-pane ALREADY has position and height
|
1711
|
-
if (!isChild) {
|
1712
|
-
if (!p || !p.match(/fixed|absolute|relative/))
|
1713
|
-
CSS.position = "relative"; // container MUST have a 'position'
|
1714
|
-
/*
|
1715
|
-
if (!h || h=="auto")
|
1716
|
-
CSS.height = "100%"; // container MUST have a 'height'
|
1717
|
-
*/
|
1718
|
-
}
|
1719
|
-
$N.css( CSS );
|
1940
|
+
else {
|
1941
|
+
// container MUST have 'position'
|
1942
|
+
var p = $N.css("position");
|
1943
|
+
if (!p || !p.match(/(fixed|absolute|relative)/))
|
1944
|
+
$N.css("position","relative");
|
1720
1945
|
|
1721
1946
|
// set current layout-container dimensions
|
1722
1947
|
if ( $N.is(":visible") ) {
|
1723
|
-
$.extend(sC, elDims( $N ));
|
1724
|
-
if (
|
1725
|
-
_log(
|
1948
|
+
$.extend(sC, elDims( $N, o.inset )); // passing inset means DO NOT change insetX (padding) values
|
1949
|
+
if (sC.innerHeight < 1) // container has no 'height' - warn developer
|
1950
|
+
_log( o.errors.noContainerHeight.replace(/CONTAINER/, sC.ref) );
|
1726
1951
|
}
|
1727
1952
|
}
|
1953
|
+
|
1954
|
+
// if container has min-width/height, then enable scrollbar(s)
|
1955
|
+
if ( num($N, "minWidth") ) $N.parent().css("overflowX","auto");
|
1956
|
+
if ( num($N, "minHeight") ) $N.parent().css("overflowY","auto");
|
1957
|
+
|
1728
1958
|
} catch (ex) {}
|
1729
1959
|
}
|
1730
1960
|
|
@@ -1755,12 +1985,12 @@ $.fn.layout = function (opts) {
|
|
1755
1985
|
var data, d, pane, key, val, i, c, o;
|
1756
1986
|
|
1757
1987
|
// reprocess user's layout-options to have correct options sub-key structure
|
1758
|
-
opts = $.layout.transformData( opts ); // panes = default subkey
|
1988
|
+
opts = $.layout.transformData( opts, true ); // panes = default subkey
|
1759
1989
|
|
1760
1990
|
// auto-rename old options for backward compatibility
|
1761
1991
|
opts = $.layout.backwardCompatibility.renameAllOptions( opts );
|
1762
1992
|
|
1763
|
-
// if user-options has 'panes' key (pane-defaults),
|
1993
|
+
// if user-options has 'panes' key (pane-defaults), clean it...
|
1764
1994
|
if (!$.isEmptyObject(opts.panes)) {
|
1765
1995
|
// REMOVE any pane-defaults that MUST be set per-pane
|
1766
1996
|
data = $.layout.optionsMap.noDefault;
|
@@ -1776,7 +2006,7 @@ $.fn.layout = function (opts) {
|
|
1776
2006
|
}
|
1777
2007
|
}
|
1778
2008
|
|
1779
|
-
// MOVE any NON-layout-options to opts.panes
|
2009
|
+
// MOVE any NON-layout-options from opts-root to opts.panes
|
1780
2010
|
data = $.layout.optionsMap.layout;
|
1781
2011
|
var rootKeys = $.layout.config.optionRootKeys;
|
1782
2012
|
for (key in opts) {
|
@@ -1795,7 +2025,7 @@ $.fn.layout = function (opts) {
|
|
1795
2025
|
$.each(_c.allPanes, function (i, pane) {
|
1796
2026
|
|
1797
2027
|
// apply 'pane-defaults' to CONFIG.[PANE]
|
1798
|
-
_c[pane] = $.extend(
|
2028
|
+
_c[pane] = $.extend(true, {}, _c.panes, _c[pane]);
|
1799
2029
|
|
1800
2030
|
d = options.panes;
|
1801
2031
|
o = options[pane];
|
@@ -1813,7 +2043,7 @@ $.fn.layout = function (opts) {
|
|
1813
2043
|
}
|
1814
2044
|
else {
|
1815
2045
|
// border-panes use ALL keys in defaults.panes branch
|
1816
|
-
o = options[pane] = $.extend({}, d, o); // re-apply pane-specific opts AFTER pane-defaults
|
2046
|
+
o = options[pane] = $.extend(true, {}, d, o); // re-apply pane-specific opts AFTER pane-defaults
|
1817
2047
|
createFxOptions( pane );
|
1818
2048
|
// ensure all border-pane-specific base-classes exist
|
1819
2049
|
if (!o.resizerClass) o.resizerClass = "ui-layout-resizer";
|
@@ -1832,6 +2062,10 @@ $.fn.layout = function (opts) {
|
|
1832
2062
|
z.resizer_normal = max(zo+2, z.resizer_normal); // MIN = +2
|
1833
2063
|
}
|
1834
2064
|
|
2065
|
+
// DELETE 'panes' key now that we are done - values were copied to EACH pane
|
2066
|
+
delete options.panes;
|
2067
|
+
|
2068
|
+
|
1835
2069
|
function createFxOptions ( pane ) {
|
1836
2070
|
var o = options[pane]
|
1837
2071
|
, d = options.panes;
|
@@ -1851,9 +2085,10 @@ $.fn.layout = function (opts) {
|
|
1851
2085
|
|| o.fxName // options.west.fxName
|
1852
2086
|
|| d.fxName // options.panes.fxName
|
1853
2087
|
|| "none" // MEANS $.layout.defaults.panes.fxName == "" || false || null || 0
|
2088
|
+
, fxExists = $.effects && ($.effects[fxName] || ($.effects.effect && $.effects.effect[fxName]))
|
1854
2089
|
;
|
1855
2090
|
// validate fxName to ensure is valid effect - MUST have effect-config data in options.effects
|
1856
|
-
if (fxName === "none" ||
|
2091
|
+
if (fxName === "none" || !options.effects[fxName] || !fxExists)
|
1857
2092
|
fxName = o[sName] = "none"; // effect not loaded OR unrecognized fxName
|
1858
2093
|
|
1859
2094
|
// set vars for effects subkeys to simplify logic
|
@@ -1871,7 +2106,8 @@ $.fn.layout = function (opts) {
|
|
1871
2106
|
;
|
1872
2107
|
// create fxSettings[_open|_close|_size]
|
1873
2108
|
o[sSettings] = $.extend(
|
1874
|
-
|
2109
|
+
true
|
2110
|
+
, {}
|
1875
2111
|
, fx_all // effects.slide.all
|
1876
2112
|
, fx_pane // effects.slide.west
|
1877
2113
|
, d.fxSettings // options.panes.fxSettings
|
@@ -1887,9 +2123,6 @@ $.fn.layout = function (opts) {
|
|
1887
2123
|
delete o.fxSpeed;
|
1888
2124
|
delete o.fxSettings;
|
1889
2125
|
}
|
1890
|
-
|
1891
|
-
// DELETE 'panes' key now that we are done - values were copied to EACH pane
|
1892
|
-
delete options.panes;
|
1893
2126
|
}
|
1894
2127
|
|
1895
2128
|
/**
|
@@ -1910,7 +2143,13 @@ $.fn.layout = function (opts) {
|
|
1910
2143
|
}
|
1911
2144
|
}
|
1912
2145
|
|
1913
|
-
|
2146
|
+
/**
|
2147
|
+
* @param {Object=} evt
|
2148
|
+
*/
|
2149
|
+
, initPanes = function (evt) {
|
2150
|
+
// stopPropagation if called by trigger("layoutinitpanes") - use evtPane utility
|
2151
|
+
evtPane(evt);
|
2152
|
+
|
1914
2153
|
// NOTE: do north & south FIRST so we can measure their height - do center LAST
|
1915
2154
|
$.each(_c.allPanes, function (idx, pane) {
|
1916
2155
|
addPane( pane, true );
|
@@ -1935,22 +2174,8 @@ $.fn.layout = function (opts) {
|
|
1935
2174
|
// to load asynchrously, which is BAD, so try skipping delay for now
|
1936
2175
|
|
1937
2176
|
// process pane contents and callbacks, and init/resize child-layout if exists
|
1938
|
-
$.each(_c.allPanes, function (
|
1939
|
-
|
1940
|
-
if ($Ps[pane]) {
|
1941
|
-
if (state[pane].isVisible) { // pane is OPEN
|
1942
|
-
sizeContent(pane);
|
1943
|
-
// trigger pane.onResize if triggerEventsOnLoad = true
|
1944
|
-
if (o.triggerEventsOnLoad)
|
1945
|
-
_runCallbacks("onresize_end", pane);
|
1946
|
-
else // automatic if onresize called, otherwise call it specifically
|
1947
|
-
// resize child - IF inner-layout already exists (created before this layout)
|
1948
|
-
resizeChildLayout(pane);
|
1949
|
-
}
|
1950
|
-
// init childLayout - even if pane is not visible
|
1951
|
-
if (o.initChildLayout && o.childOptions)
|
1952
|
-
createChildLayout(pane);
|
1953
|
-
}
|
2177
|
+
$.each(_c.allPanes, function (idx, pane) {
|
2178
|
+
afterInitPane(pane);
|
1954
2179
|
});
|
1955
2180
|
}
|
1956
2181
|
|
@@ -1967,13 +2192,13 @@ $.fn.layout = function (opts) {
|
|
1967
2192
|
o = options[pane]
|
1968
2193
|
, s = state[pane]
|
1969
2194
|
, c = _c[pane]
|
1970
|
-
, fx = s.fx
|
1971
2195
|
, dir = c.dir
|
2196
|
+
, fx = s.fx
|
1972
2197
|
, spacing = o.spacing_open || 0
|
1973
2198
|
, isCenter = (pane === "center")
|
1974
2199
|
, CSS = {}
|
1975
2200
|
, $P = $Ps[pane]
|
1976
|
-
, size, minSize, maxSize
|
2201
|
+
, size, minSize, maxSize, child
|
1977
2202
|
;
|
1978
2203
|
// if pane-pointer already exists, remove the old one first
|
1979
2204
|
if ($P)
|
@@ -1990,11 +2215,18 @@ $.fn.layout = function (opts) {
|
|
1990
2215
|
// SAVE original Pane CSS
|
1991
2216
|
if (!$P.data("layoutCSS")) {
|
1992
2217
|
var props = "position,top,left,bottom,right,width,height,overflow,zIndex,display,backgroundColor,padding,margin,border";
|
1993
|
-
$P.data("layoutCSS",
|
2218
|
+
$P.data("layoutCSS", styles($P, props));
|
1994
2219
|
}
|
1995
2220
|
|
1996
2221
|
// create alias for pane data in Instance - initHandles will add more
|
1997
|
-
Instance[pane] = {
|
2222
|
+
Instance[pane] = {
|
2223
|
+
name: pane
|
2224
|
+
, pane: $Ps[pane]
|
2225
|
+
, content: $Cs[pane]
|
2226
|
+
, options: options[pane]
|
2227
|
+
, state: state[pane]
|
2228
|
+
, children: children[pane]
|
2229
|
+
};
|
1998
2230
|
|
1999
2231
|
// add classes, attributes & events
|
2000
2232
|
$P .data({
|
@@ -2018,8 +2250,8 @@ $.fn.layout = function (opts) {
|
|
2018
2250
|
, slideOpen: ''
|
2019
2251
|
, slideClose: ''
|
2020
2252
|
, slideToggle: ''
|
2021
|
-
, size: '
|
2022
|
-
, sizePane: '
|
2253
|
+
, size: 'sizePane'
|
2254
|
+
, sizePane: 'sizePane'
|
2023
2255
|
, sizeContent: ''
|
2024
2256
|
, sizeHandles: ''
|
2025
2257
|
, enableClosable: ''
|
@@ -2033,8 +2265,8 @@ $.fn.layout = function (opts) {
|
|
2033
2265
|
, move: 'swapPanes'
|
2034
2266
|
, removePane: 'removePane'
|
2035
2267
|
, remove: 'removePane'
|
2036
|
-
,
|
2037
|
-
,
|
2268
|
+
, createChildren: ''
|
2269
|
+
, resizeChildren: ''
|
2038
2270
|
, resizeAll: 'resizeAll'
|
2039
2271
|
, resizeLayout: 'resizeAll'
|
2040
2272
|
}
|
@@ -2054,6 +2286,7 @@ $.fn.layout = function (opts) {
|
|
2054
2286
|
minSize = _parseSize(pane,o.minSize) || 1;
|
2055
2287
|
maxSize = _parseSize(pane,o.maxSize) || 100000;
|
2056
2288
|
if (size > 0) size = max(min(size, maxSize), minSize);
|
2289
|
+
s.autoResize = o.autoResize; // used with percentage sizes
|
2057
2290
|
|
2058
2291
|
// state for border-panes
|
2059
2292
|
s.isClosed = false; // true = pane is closed
|
@@ -2070,23 +2303,10 @@ $.fn.layout = function (opts) {
|
|
2070
2303
|
s.noRoom = false; // true = pane 'automatically' hidden due to insufficient room - will unhide automatically
|
2071
2304
|
s.isVisible = true; // false = pane is invisible - closed OR hidden - simplify logic
|
2072
2305
|
|
2073
|
-
//
|
2074
|
-
|
2075
|
-
case "north": CSS.top = sC.insetTop;
|
2076
|
-
CSS.left = sC.insetLeft;
|
2077
|
-
CSS.right = sC.insetRight;
|
2078
|
-
break;
|
2079
|
-
case "south": CSS.bottom = sC.insetBottom;
|
2080
|
-
CSS.left = sC.insetLeft;
|
2081
|
-
CSS.right = sC.insetRight;
|
2082
|
-
break;
|
2083
|
-
case "west": CSS.left = sC.insetLeft; // top, bottom & height set by sizeMidPanes()
|
2084
|
-
break;
|
2085
|
-
case "east": CSS.right = sC.insetRight; // ditto
|
2086
|
-
break;
|
2087
|
-
case "center": // top, left, width & height set by sizeMidPanes()
|
2088
|
-
}
|
2306
|
+
// init pane positioning
|
2307
|
+
setPanePosition( pane );
|
2089
2308
|
|
2309
|
+
// if pane is not visible,
|
2090
2310
|
if (dir === "horz") // north or south pane
|
2091
2311
|
CSS.height = cssH($P, size);
|
2092
2312
|
else if (dir === "vert") // east or west pane
|
@@ -2096,6 +2316,12 @@ $.fn.layout = function (opts) {
|
|
2096
2316
|
$P.css(CSS); // apply size -- top, bottom & height will be set by sizeMidPanes
|
2097
2317
|
if (dir != "horz") sizeMidPanes(pane, true); // true = skipCallback
|
2098
2318
|
|
2319
|
+
// if manually adding a pane AFTER layout initialization, then...
|
2320
|
+
if (state.initialized) {
|
2321
|
+
initHandles( pane );
|
2322
|
+
initHotkeys( pane );
|
2323
|
+
}
|
2324
|
+
|
2099
2325
|
// close or hide the pane if specified in settings
|
2100
2326
|
if (o.initClosed && o.closable && !o.initHidden)
|
2101
2327
|
close(pane, true, true); // true, true = force, noAnimation
|
@@ -2115,21 +2341,84 @@ $.fn.layout = function (opts) {
|
|
2115
2341
|
|
2116
2342
|
// if manually adding a pane AFTER layout initialization, then...
|
2117
2343
|
if (state.initialized) {
|
2118
|
-
|
2119
|
-
initHotkeys( pane );
|
2120
|
-
resizeAll(); // will sizeContent if pane is visible
|
2121
|
-
if (s.isVisible) { // pane is OPEN
|
2122
|
-
if (o.triggerEventsOnLoad)
|
2123
|
-
_runCallbacks("onresize_end", pane);
|
2124
|
-
else // automatic if onresize called, otherwise call it specifically
|
2125
|
-
// resize child - IF inner-layout already exists (created before this layout)
|
2126
|
-
resizeChildLayout(pane); // a previously existing childLayout
|
2127
|
-
}
|
2128
|
-
if (o.initChildLayout && o.childOptions)
|
2129
|
-
createChildLayout(pane);
|
2344
|
+
afterInitPane( pane );
|
2130
2345
|
}
|
2131
2346
|
}
|
2132
2347
|
|
2348
|
+
, afterInitPane = function (pane) {
|
2349
|
+
var $P = $Ps[pane]
|
2350
|
+
, s = state[pane]
|
2351
|
+
, o = options[pane]
|
2352
|
+
;
|
2353
|
+
if (!$P) return;
|
2354
|
+
|
2355
|
+
// see if there is a directly-nested layout inside this pane
|
2356
|
+
if ($P.data("layout"))
|
2357
|
+
refreshChildren( pane, $P.data("layout") );
|
2358
|
+
|
2359
|
+
// process pane contents and callbacks, and init/resize child-layout if exists
|
2360
|
+
if (s.isVisible) { // pane is OPEN
|
2361
|
+
if (state.initialized) // this pane was added AFTER layout was created
|
2362
|
+
resizeAll(); // will also sizeContent
|
2363
|
+
else
|
2364
|
+
sizeContent(pane);
|
2365
|
+
|
2366
|
+
if (o.triggerEventsOnLoad)
|
2367
|
+
_runCallbacks("onresize_end", pane);
|
2368
|
+
else // automatic if onresize called, otherwise call it specifically
|
2369
|
+
// resize child - IF inner-layout already exists (created before this layout)
|
2370
|
+
resizeChildren(pane, true); // a previously existing childLayout
|
2371
|
+
}
|
2372
|
+
|
2373
|
+
// init childLayouts - even if pane is not visible
|
2374
|
+
if (o.initChildren && o.children)
|
2375
|
+
createChildren(pane);
|
2376
|
+
}
|
2377
|
+
|
2378
|
+
/**
|
2379
|
+
* @param {string=} panes The pane(s) to process
|
2380
|
+
*/
|
2381
|
+
, setPanePosition = function (panes) {
|
2382
|
+
panes = panes ? panes.split(",") : _c.borderPanes;
|
2383
|
+
|
2384
|
+
// create toggler DIVs for each pane, and set object pointers for them, eg: $R.north = north toggler DIV
|
2385
|
+
$.each(panes, function (i, pane) {
|
2386
|
+
var $P = $Ps[pane]
|
2387
|
+
, $R = $Rs[pane]
|
2388
|
+
, o = options[pane]
|
2389
|
+
, s = state[pane]
|
2390
|
+
, side = _c[pane].side
|
2391
|
+
, CSS = {}
|
2392
|
+
;
|
2393
|
+
if (!$P) return; // pane does not exist - skip
|
2394
|
+
|
2395
|
+
// set css-position to account for container borders & padding
|
2396
|
+
switch (pane) {
|
2397
|
+
case "north": CSS.top = sC.inset.top;
|
2398
|
+
CSS.left = sC.inset.left;
|
2399
|
+
CSS.right = sC.inset.right;
|
2400
|
+
break;
|
2401
|
+
case "south": CSS.bottom = sC.inset.bottom;
|
2402
|
+
CSS.left = sC.inset.left;
|
2403
|
+
CSS.right = sC.inset.right;
|
2404
|
+
break;
|
2405
|
+
case "west": CSS.left = sC.inset.left; // top, bottom & height set by sizeMidPanes()
|
2406
|
+
break;
|
2407
|
+
case "east": CSS.right = sC.inset.right; // ditto
|
2408
|
+
break;
|
2409
|
+
case "center": // top, left, width & height set by sizeMidPanes()
|
2410
|
+
}
|
2411
|
+
// apply position
|
2412
|
+
$P.css(CSS);
|
2413
|
+
|
2414
|
+
// update resizer position
|
2415
|
+
if ($R && s.isClosed)
|
2416
|
+
$R.css(side, sC.inset[side]);
|
2417
|
+
else if ($R && !s.isHidden)
|
2418
|
+
$R.css(side, sC.inset[side] + getPaneSize(pane));
|
2419
|
+
});
|
2420
|
+
}
|
2421
|
+
|
2133
2422
|
/**
|
2134
2423
|
* Initialize module objects, styling, size and position for all resize bars and toggler buttons
|
2135
2424
|
*
|
@@ -2146,13 +2435,12 @@ $.fn.layout = function (opts) {
|
|
2146
2435
|
$Ts[pane] = false;
|
2147
2436
|
if (!$P) return; // pane does not exist - skip
|
2148
2437
|
|
2149
|
-
var
|
2150
|
-
o = options[pane]
|
2438
|
+
var o = options[pane]
|
2151
2439
|
, s = state[pane]
|
2152
2440
|
, c = _c[pane]
|
2441
|
+
, paneId = o.paneSelector.substr(0,1) === "#" ? o.paneSelector.substr(1) : ""
|
2153
2442
|
, rClass = o.resizerClass
|
2154
2443
|
, tClass = o.togglerClass
|
2155
|
-
, side = c.side.toLowerCase()
|
2156
2444
|
, spacing = (s.isVisible ? o.spacing_open : o.spacing_closed)
|
2157
2445
|
, _pane = "-"+ pane // used for classNames
|
2158
2446
|
, _state = (s.isVisible ? "-open" : "-closed") // used for classNames
|
@@ -2165,10 +2453,10 @@ $.fn.layout = function (opts) {
|
|
2165
2453
|
|
2166
2454
|
//if (s.isVisible && o.resizable) ... handled by initResizable
|
2167
2455
|
if (!s.isVisible && o.slidable)
|
2168
|
-
$R.attr("title", o.
|
2456
|
+
$R.attr("title", o.tips.Slide).css("cursor", o.sliderCursor);
|
2169
2457
|
|
2170
2458
|
$R // if paneSelector is an ID, then create a matching ID for the resizer, eg: "#paneLeft" => "paneLeft-resizer"
|
2171
|
-
.attr("id",
|
2459
|
+
.attr("id", paneId ? paneId +"-resizer" : "" )
|
2172
2460
|
.data({
|
2173
2461
|
parentLayout: Instance
|
2174
2462
|
, layoutPane: Instance[pane] // NEW pointer to pane-alias-object
|
@@ -2182,10 +2470,12 @@ $.fn.layout = function (opts) {
|
|
2182
2470
|
.hover(onResizerEnter, onResizerLeave) // ALWAYS NEED resizer.mouseleave to balance toggler.mouseenter
|
2183
2471
|
.appendTo($N) // append DIV to container
|
2184
2472
|
;
|
2473
|
+
if (o.resizerDblClickToggle)
|
2474
|
+
$R.bind("dblclick."+ sID, toggle );
|
2185
2475
|
|
2186
2476
|
if ($T) {
|
2187
2477
|
$T // if paneSelector is an ID, then create a matching ID for the resizer, eg: "#paneLeft" => "#paneLeft-toggler"
|
2188
|
-
.attr("id",
|
2478
|
+
.attr("id", paneId ? paneId +"-toggler" : "" )
|
2189
2479
|
.data({
|
2190
2480
|
parentLayout: Instance
|
2191
2481
|
, layoutPane: Instance[pane] // NEW pointer to pane-alias-object
|
@@ -2236,7 +2526,7 @@ $.fn.layout = function (opts) {
|
|
2236
2526
|
setAsOpen(pane); // onOpen will be called, but NOT onResize
|
2237
2527
|
else {
|
2238
2528
|
setAsClosed(pane); // onClose will be called
|
2239
|
-
|
2529
|
+
bindStartSlidingEvents(pane, true); // will enable events IF option is set
|
2240
2530
|
}
|
2241
2531
|
|
2242
2532
|
});
|
@@ -2250,7 +2540,7 @@ $.fn.layout = function (opts) {
|
|
2250
2540
|
* Initialize scrolling ui-layout-content div - if exists
|
2251
2541
|
*
|
2252
2542
|
* @see initPane() - or externally after an Ajax injection
|
2253
|
-
* @param {string}
|
2543
|
+
* @param {string} pane The pane to process
|
2254
2544
|
* @param {boolean=} [resize=true] Size content after init
|
2255
2545
|
*/
|
2256
2546
|
, initContent = function (pane, resize) {
|
@@ -2268,14 +2558,18 @@ $.fn.layout = function (opts) {
|
|
2268
2558
|
;
|
2269
2559
|
if ($C && $C.length) {
|
2270
2560
|
$C.data("layoutRole", "content");
|
2271
|
-
// SAVE original
|
2561
|
+
// SAVE original Content CSS
|
2272
2562
|
if (!$C.data("layoutCSS"))
|
2273
|
-
$C.data("layoutCSS",
|
2563
|
+
$C.data("layoutCSS", styles($C, "height"));
|
2274
2564
|
$C.css( _c.content.cssReq );
|
2275
2565
|
if (o.applyDemoStyles) {
|
2276
2566
|
$C.css( _c.content.cssDemo ); // add padding & overflow: auto to content-div
|
2277
2567
|
$P.css( _c.content.cssDemoPane ); // REMOVE padding/scrolling from pane
|
2278
2568
|
}
|
2569
|
+
// ensure no vertical scrollbar on pane - will mess up measurements
|
2570
|
+
if ($P.css("overflowX").match(/(scroll|auto)/)) {
|
2571
|
+
$P.css("overflow", "hidden");
|
2572
|
+
}
|
2279
2573
|
state[pane].content = {}; // init content state
|
2280
2574
|
if (resize !== false) sizeContent(pane);
|
2281
2575
|
// sizeContent() is called AFTER init of all elements
|
@@ -2309,8 +2603,6 @@ $.fn.layout = function (opts) {
|
|
2309
2603
|
, z = options.zIndexes
|
2310
2604
|
, c = _c[pane]
|
2311
2605
|
, side = c.dir=="horz" ? "top" : "left"
|
2312
|
-
, opEdge = _c.oppositeEdge[pane]
|
2313
|
-
, masks = pane +",center,"+ opEdge + (c.dir=="horz" ? ",west,east" : "")
|
2314
2606
|
, $P = $Ps[pane]
|
2315
2607
|
, $R = $Rs[pane]
|
2316
2608
|
, base = o.resizerClass
|
@@ -2328,7 +2620,7 @@ $.fn.layout = function (opts) {
|
|
2328
2620
|
;
|
2329
2621
|
|
2330
2622
|
if (!s.isClosed)
|
2331
|
-
$R.attr("title", o.
|
2623
|
+
$R.attr("title", o.tips.Resize)
|
2332
2624
|
.css("cursor", o.resizerCursor); // n-resize, s-resize, etc
|
2333
2625
|
|
2334
2626
|
$R.draggable({
|
@@ -2355,7 +2647,8 @@ $.fn.layout = function (opts) {
|
|
2355
2647
|
// TODO: dragging CANNOT be cancelled like this, so see if there is a way?
|
2356
2648
|
if (false === _runCallbacks("ondrag_start", pane)) return false;
|
2357
2649
|
|
2358
|
-
s.isResizing
|
2650
|
+
s.isResizing = true; // prevent pane from closing while resizing
|
2651
|
+
state.paneResizing = pane; // easy to see if ANY pane is resizing
|
2359
2652
|
timer.clear(pane+"_closeSlider"); // just in case already triggered
|
2360
2653
|
|
2361
2654
|
// SET RESIZER LIMITS - used in drag()
|
@@ -2370,7 +2663,7 @@ $.fn.layout = function (opts) {
|
|
2370
2663
|
$('body').disableSelection();
|
2371
2664
|
|
2372
2665
|
// MASK PANES CONTAINING IFRAMES, APPLETS OR OTHER TROUBLESOME ELEMENTS
|
2373
|
-
showMasks(
|
2666
|
+
showMasks( pane, { resizing: true });
|
2374
2667
|
}
|
2375
2668
|
|
2376
2669
|
, drag: function (e, ui) {
|
@@ -2398,7 +2691,7 @@ $.fn.layout = function (opts) {
|
|
2398
2691
|
// ADD/REMOVE dragging-limit CLASS
|
2399
2692
|
if (limit) {
|
2400
2693
|
ui.helper.addClass( helperLimitClass +" "+ helperPaneLimitClass ); // at dragging-limit
|
2401
|
-
window.defaultStatus = (limit>0 && pane.match(/north|west/)) || (limit<0 && pane.match(/south|east/)) ?
|
2694
|
+
window.defaultStatus = (limit>0 && pane.match(/(north|west)/)) || (limit<0 && pane.match(/(south|east)/)) ? o.tips.maxSizeWarning : o.tips.minSizeWarning;
|
2402
2695
|
}
|
2403
2696
|
else {
|
2404
2697
|
ui.helper.removeClass( helperLimitClass +" "+ helperPaneLimitClass ); // not at dragging-limit
|
@@ -2416,8 +2709,9 @@ $.fn.layout = function (opts) {
|
|
2416
2709
|
$('body').enableSelection(); // RE-ENABLE TEXT SELECTION
|
2417
2710
|
window.defaultStatus = ""; // clear 'resizing limit' message from statusbar
|
2418
2711
|
$R.removeClass( resizerClass +" "+ resizerPaneClass ); // remove drag classes from Resizer
|
2419
|
-
s.isResizing
|
2420
|
-
|
2712
|
+
s.isResizing = false;
|
2713
|
+
state.paneResizing = false; // easy to see if ANY pane is resizing
|
2714
|
+
resizePanes(e, ui, pane, true); // true = resizingDone
|
2421
2715
|
}
|
2422
2716
|
|
2423
2717
|
});
|
@@ -2433,7 +2727,7 @@ $.fn.layout = function (opts) {
|
|
2433
2727
|
* @param {string} pane
|
2434
2728
|
* @param {boolean=} [resizingDone=false]
|
2435
2729
|
*/
|
2436
|
-
var resizePanes = function (evt, ui, pane, resizingDone
|
2730
|
+
var resizePanes = function (evt, ui, pane, resizingDone) {
|
2437
2731
|
var dragPos = ui.position
|
2438
2732
|
, c = _c[pane]
|
2439
2733
|
, o = options[pane]
|
@@ -2443,11 +2737,11 @@ $.fn.layout = function (opts) {
|
|
2443
2737
|
switch (pane) {
|
2444
2738
|
case "north": resizerPos = dragPos.top; break;
|
2445
2739
|
case "west": resizerPos = dragPos.left; break;
|
2446
|
-
case "south": resizerPos = sC.
|
2447
|
-
case "east": resizerPos = sC.
|
2740
|
+
case "south": resizerPos = sC.layoutHeight - dragPos.top - o.spacing_open; break;
|
2741
|
+
case "east": resizerPos = sC.layoutWidth - dragPos.left - o.spacing_open; break;
|
2448
2742
|
};
|
2449
2743
|
// remove container margin from resizer position to get the pane size
|
2450
|
-
var newSize = resizerPos - sC[
|
2744
|
+
var newSize = resizerPos - sC.inset[c.side];
|
2451
2745
|
|
2452
2746
|
// Disable OR Resize Mask(s) created in drag.start
|
2453
2747
|
if (!resizingDone) {
|
@@ -2462,19 +2756,19 @@ $.fn.layout = function (opts) {
|
|
2462
2756
|
// ondrag_end callback
|
2463
2757
|
if (false !== _runCallbacks("ondrag_end", pane))
|
2464
2758
|
manualSizePane(pane, newSize, false, true); // true = noAnimation
|
2465
|
-
hideMasks(); //
|
2466
|
-
if (s.isSliding
|
2467
|
-
showMasks(
|
2759
|
+
hideMasks(true); // true = force hiding all masks even if one is 'sliding'
|
2760
|
+
if (s.isSliding) // RE-SHOW 'object-masks' so objects won't show through sliding pane
|
2761
|
+
showMasks( pane, { resizing: true });
|
2468
2762
|
}
|
2469
2763
|
};
|
2470
2764
|
}
|
2471
2765
|
|
2472
2766
|
/**
|
2473
|
-
|
2474
|
-
|
2475
|
-
|
2476
|
-
|
2477
|
-
|
2767
|
+
* sizeMask
|
2768
|
+
*
|
2769
|
+
* Needed to overlay a DIV over an IFRAME-pane because mask CANNOT be *inside* the pane
|
2770
|
+
* Called when mask created, and during livePaneResizing
|
2771
|
+
*/
|
2478
2772
|
, sizeMask = function () {
|
2479
2773
|
var $M = $(this)
|
2480
2774
|
, pane = $M.data("layoutMask") // eg: "west"
|
@@ -2497,14 +2791,36 @@ $.fn.layout = function (opts) {
|
|
2497
2791
|
$Ms.each( sizeMask ); // resize all 'visible' masks
|
2498
2792
|
}
|
2499
2793
|
|
2500
|
-
|
2501
|
-
|
2502
|
-
|
2503
|
-
|
2504
|
-
|
2794
|
+
/**
|
2795
|
+
* @param {string} pane The pane being resized, animated or isSliding
|
2796
|
+
* @param {Object=} [args] (optional) Options: which masks to apply, and to which panes
|
2797
|
+
*/
|
2798
|
+
, showMasks = function (pane, args) {
|
2799
|
+
var c = _c[pane]
|
2800
|
+
, panes = ["center"]
|
2801
|
+
, z = options.zIndexes
|
2802
|
+
, a = $.extend({
|
2803
|
+
objectsOnly: false
|
2804
|
+
, animation: false
|
2805
|
+
, resizing: true
|
2806
|
+
, sliding: state[pane].isSliding
|
2807
|
+
}, args )
|
2808
|
+
, o, s
|
2809
|
+
;
|
2810
|
+
if (a.resizing)
|
2811
|
+
panes.push( pane );
|
2812
|
+
if (a.sliding)
|
2813
|
+
panes.push( _c.oppositeEdge[pane] ); // ADD the oppositeEdge-pane
|
2814
|
+
|
2815
|
+
if (c.dir === "horz") {
|
2816
|
+
panes.push("west");
|
2817
|
+
panes.push("east");
|
2818
|
+
}
|
2819
|
+
|
2820
|
+
$.each(panes, function(i,p){
|
2505
2821
|
s = state[p];
|
2506
2822
|
o = options[p];
|
2507
|
-
if (s.isVisible && ( (!
|
2823
|
+
if (s.isVisible && ( o.maskObjects || (!a.objectsOnly && o.maskContents) )) {
|
2508
2824
|
getMasks(p).each(function(){
|
2509
2825
|
sizeMask.call(this);
|
2510
2826
|
this.style.zIndex = s.isSliding ? z.pane_sliding+1 : z.pane_normal+1
|
@@ -2514,19 +2830,31 @@ $.fn.layout = function (opts) {
|
|
2514
2830
|
});
|
2515
2831
|
}
|
2516
2832
|
|
2517
|
-
|
2833
|
+
/**
|
2834
|
+
* @param {boolean=} force Hide masks even if a pane is sliding
|
2835
|
+
*/
|
2836
|
+
, hideMasks = function (force) {
|
2518
2837
|
// ensure no pane is resizing - could be a timing issue
|
2519
|
-
|
2520
|
-
$.each( $.layout.config.borderPanes, function(i,p){
|
2521
|
-
if (state[p].isResizing) {
|
2522
|
-
skip = true;
|
2523
|
-
return false; // BREAK
|
2524
|
-
}
|
2525
|
-
});
|
2526
|
-
if (!skip)
|
2838
|
+
if (force || !state.paneResizing) {
|
2527
2839
|
$Ms.hide(); // hide ALL masks
|
2840
|
+
}
|
2841
|
+
// if ANY pane is sliding, then DO NOT remove masks from panes with maskObjects enabled
|
2842
|
+
else if (!force && !$.isEmptyObject( state.panesSliding )) {
|
2843
|
+
var i = $Ms.length - 1
|
2844
|
+
, p, $M;
|
2845
|
+
for (; i >= 0; i--) {
|
2846
|
+
$M = $Ms.eq(i);
|
2847
|
+
p = $M.data("layoutMask");
|
2848
|
+
if (!options[p].maskObjects) {
|
2849
|
+
$M.hide();
|
2850
|
+
}
|
2851
|
+
}
|
2852
|
+
}
|
2528
2853
|
}
|
2529
2854
|
|
2855
|
+
/**
|
2856
|
+
* @param {string} pane
|
2857
|
+
*/
|
2530
2858
|
, getMasks = function (pane) {
|
2531
2859
|
var $Masks = $([])
|
2532
2860
|
, $M, i = 0, c = $Ms.length
|
@@ -2543,11 +2871,13 @@ $.fn.layout = function (opts) {
|
|
2543
2871
|
}
|
2544
2872
|
|
2545
2873
|
/**
|
2546
|
-
|
2547
|
-
|
2548
|
-
|
2549
|
-
|
2550
|
-
|
2874
|
+
* createMasks
|
2875
|
+
*
|
2876
|
+
* Generates both DIV (ALWAYS used) and IFRAME (optional) elements as masks
|
2877
|
+
* An IFRAME mask is created *under* the DIV when maskObjects=true, because a DIV cannot mask an applet
|
2878
|
+
*
|
2879
|
+
* @param {string} pane
|
2880
|
+
*/
|
2551
2881
|
, createMasks = function (pane) {
|
2552
2882
|
var
|
2553
2883
|
$P = $Ps[pane]
|
@@ -2569,9 +2899,11 @@ $.fn.layout = function (opts) {
|
|
2569
2899
|
// styles common to both DIVs and IFRAMES
|
2570
2900
|
css.display = "block";
|
2571
2901
|
css.position = "absolute";
|
2902
|
+
css.background = "#FFF";
|
2572
2903
|
if (isIframe) { // IFRAME-only props
|
2573
2904
|
el.frameborder = 0;
|
2574
2905
|
el.src = "about:blank";
|
2906
|
+
//el.allowTransparency = true; - for IE, but breaks masking ability!
|
2575
2907
|
css.opacity = 0;
|
2576
2908
|
css.filter = "Alpha(Opacity='0')";
|
2577
2909
|
css.border = 0;
|
@@ -2606,11 +2938,17 @@ $.fn.layout = function (opts) {
|
|
2606
2938
|
*
|
2607
2939
|
* @param {boolean=} [destroyChildren=false] Destory Child-Layouts first?
|
2608
2940
|
*/
|
2609
|
-
, destroy = function (destroyChildren) {
|
2941
|
+
, destroy = function (evt_or_destroyChildren, destroyChildren) {
|
2610
2942
|
// UNBIND layout events and remove global object
|
2611
2943
|
$(window).unbind("."+ sID); // resize & unload
|
2612
2944
|
$(document).unbind("."+ sID); // keyDown (hotkeys)
|
2613
2945
|
|
2946
|
+
if (typeof evt_or_destroyChildren === "object")
|
2947
|
+
// stopPropagation if called by trigger("layoutdestroy") - use evtPane utility
|
2948
|
+
evtPane(evt_or_destroyChildren);
|
2949
|
+
else // no event, so transfer 1st param to destroyChildren param
|
2950
|
+
destroyChildren = evt_or_destroyChildren;
|
2951
|
+
|
2614
2952
|
// need to look for parent layout BEFORE we remove the container data, else skips a level
|
2615
2953
|
//var parentPane = Instance.hasParentLayout ? $.layout.getParentPaneInstance( $N ) : null;
|
2616
2954
|
|
@@ -2647,7 +2985,7 @@ $.fn.layout = function (opts) {
|
|
2647
2985
|
|
2648
2986
|
// clear the Instance of everything except for container & options (so could recreate)
|
2649
2987
|
// RE-CREATE: myLayout = myLayout.container.layout( myLayout.options );
|
2650
|
-
for (n in Instance)
|
2988
|
+
for (var n in Instance)
|
2651
2989
|
if (!n.match(/^(container|options)$/)) delete Instance[ n ];
|
2652
2990
|
// add a 'destroyed' flag to make it easy to check
|
2653
2991
|
Instance.destroyed = true;
|
@@ -2655,8 +2993,10 @@ $.fn.layout = function (opts) {
|
|
2655
2993
|
// if this is a child layout, CLEAR the child-pointer in the parent
|
2656
2994
|
/* for now the pointer REMAINS, but with only container, options and destroyed keys
|
2657
2995
|
if (parentPane) {
|
2658
|
-
var layout
|
2659
|
-
|
2996
|
+
var layout = parentPane.pane.data("parentLayout")
|
2997
|
+
, key = layout.options.instanceKey || 'error';
|
2998
|
+
// THIS SYNTAX MAY BE WRONG!
|
2999
|
+
parentPane.children[key] = layout.children[ parentPane.name ].children[key] = null;
|
2660
3000
|
}
|
2661
3001
|
*/
|
2662
3002
|
|
@@ -2667,9 +3007,10 @@ $.fn.layout = function (opts) {
|
|
2667
3007
|
* Remove a pane from the layout - subroutine of destroy()
|
2668
3008
|
*
|
2669
3009
|
* @see destroy()
|
2670
|
-
* @param {string}
|
2671
|
-
* @param {boolean=}
|
2672
|
-
* @param {boolean=}
|
3010
|
+
* @param {(string|Object)} evt_or_pane The pane to process
|
3011
|
+
* @param {boolean=} [remove=false] Remove the DOM element?
|
3012
|
+
* @param {boolean=} [skipResize=false] Skip calling resizeAll()?
|
3013
|
+
* @param {boolean=} [destroyChild=true] Destroy Child-layouts? If not passed, obeys options setting
|
2673
3014
|
*/
|
2674
3015
|
, removePane = function (evt_or_pane, remove, skipResize, destroyChild) {
|
2675
3016
|
if (!isInitialized()) return;
|
@@ -2679,7 +3020,6 @@ $.fn.layout = function (opts) {
|
|
2679
3020
|
, $R = $Rs[pane]
|
2680
3021
|
, $T = $Ts[pane]
|
2681
3022
|
;
|
2682
|
-
//alert( '$P.length = '+ $P.length );
|
2683
3023
|
// NOTE: elements can still exist even after remove()
|
2684
3024
|
// so check for missing data(), which is cleared by removed()
|
2685
3025
|
if ($P && $.isEmptyObject( $P.data() )) $P = false;
|
@@ -2689,24 +3029,32 @@ $.fn.layout = function (opts) {
|
|
2689
3029
|
|
2690
3030
|
if ($P) $P.stop(true, true);
|
2691
3031
|
|
2692
|
-
// check for a child layout
|
2693
3032
|
var o = options[pane]
|
2694
3033
|
, s = state[pane]
|
2695
3034
|
, d = "layout"
|
2696
3035
|
, css = "layoutCSS"
|
2697
|
-
,
|
2698
|
-
,
|
3036
|
+
, pC = children[pane]
|
3037
|
+
, hasChildren = $.isPlainObject( pC ) && !$.isEmptyObject( pC )
|
3038
|
+
, destroy = destroyChild !== undefined ? destroyChild : o.destroyChildren
|
2699
3039
|
;
|
2700
|
-
|
2701
3040
|
// FIRST destroy the child-layout(s)
|
2702
|
-
if (
|
2703
|
-
|
2704
|
-
|
2705
|
-
|
3041
|
+
if (hasChildren && destroy) {
|
3042
|
+
$.each( pC, function (key, child) {
|
3043
|
+
if (!child.destroyed)
|
3044
|
+
child.destroy(true);// tell child-layout to destroy ALL its child-layouts too
|
3045
|
+
if (child.destroyed) // destroy was successful
|
3046
|
+
delete pC[key];
|
3047
|
+
});
|
3048
|
+
// if no more children, remove the children hash
|
3049
|
+
if ($.isEmptyObject( pC )) {
|
3050
|
+
pC = children[pane] = null; // clear children hash
|
3051
|
+
hasChildren = false;
|
3052
|
+
}
|
2706
3053
|
}
|
2707
3054
|
|
2708
|
-
|
2709
|
-
|
3055
|
+
// Note: can't 'remove' a pane element with non-destroyed children
|
3056
|
+
if ($P && remove && !hasChildren)
|
3057
|
+
$P.remove(); // remove the pane-element and everything inside it
|
2710
3058
|
else if ($P && $P[0]) {
|
2711
3059
|
// create list of ALL pane-classes that need to be removed
|
2712
3060
|
var root = o.paneClass // default="ui-layout-pane"
|
@@ -2732,10 +3080,12 @@ $.fn.layout = function (opts) {
|
|
2732
3080
|
;
|
2733
3081
|
// do NOT reset CSS if this pane/content is STILL the container of a nested layout!
|
2734
3082
|
// the nested layout will reset its 'container' CSS when/if it is destroyed
|
2735
|
-
if (
|
3083
|
+
if (hasChildren && $C) {
|
2736
3084
|
// a content-div may not have a specific width, so give it one to contain the Layout
|
2737
3085
|
$C.width( $C.width() );
|
2738
|
-
|
3086
|
+
$.each( pC, function (key, child) {
|
3087
|
+
child.resizeAll(); // resize the Layout
|
3088
|
+
});
|
2739
3089
|
}
|
2740
3090
|
else if ($C)
|
2741
3091
|
$C.css( $C.data(css) ).removeData(css).removeData("layoutRole");
|
@@ -2749,7 +3099,7 @@ $.fn.layout = function (opts) {
|
|
2749
3099
|
if ($R) $R.remove();
|
2750
3100
|
|
2751
3101
|
// CLEAR all pointers and state data
|
2752
|
-
Instance[pane] = $Ps[pane] = $Cs[pane] = $Rs[pane] = $Ts[pane] =
|
3102
|
+
Instance[pane] = $Ps[pane] = $Cs[pane] = $Rs[pane] = $Ts[pane] = false;
|
2753
3103
|
s = { removed: true };
|
2754
3104
|
|
2755
3105
|
if (!skipResize)
|
@@ -2763,6 +3113,9 @@ $.fn.layout = function (opts) {
|
|
2763
3113
|
* ###########################
|
2764
3114
|
*/
|
2765
3115
|
|
3116
|
+
/**
|
3117
|
+
* @param {string} pane
|
3118
|
+
*/
|
2766
3119
|
, _hidePane = function (pane) {
|
2767
3120
|
var $P = $Ps[pane]
|
2768
3121
|
, o = options[pane]
|
@@ -2777,6 +3130,9 @@ $.fn.layout = function (opts) {
|
|
2777
3130
|
$P.hide().removeData(_c.offscreenReset);
|
2778
3131
|
}
|
2779
3132
|
|
3133
|
+
/**
|
3134
|
+
* @param {string} pane
|
3135
|
+
*/
|
2780
3136
|
, _showPane = function (pane) {
|
2781
3137
|
var $P = $Ps[pane]
|
2782
3138
|
, o = options[pane]
|
@@ -2799,8 +3155,8 @@ $.fn.layout = function (opts) {
|
|
2799
3155
|
* Completely 'hides' a pane, including its spacing - as if it does not exist
|
2800
3156
|
* The pane is not actually 'removed' from the source, so can use 'show' to un-hide it
|
2801
3157
|
*
|
2802
|
-
* @param {string}
|
2803
|
-
* @param {boolean=}
|
3158
|
+
* @param {(string|Object)} evt_or_pane The pane being hidden, ie: north, south, east, or west
|
3159
|
+
* @param {boolean=} [noAnimation=false]
|
2804
3160
|
*/
|
2805
3161
|
, hide = function (evt_or_pane, noAnimation) {
|
2806
3162
|
if (!isInitialized()) return;
|
@@ -2816,6 +3172,7 @@ $.fn.layout = function (opts) {
|
|
2816
3172
|
if (state.initialized && false === _runCallbacks("onhide_start", pane)) return;
|
2817
3173
|
|
2818
3174
|
s.isSliding = false; // just in case
|
3175
|
+
delete state.panesSliding[pane];
|
2819
3176
|
|
2820
3177
|
// now hide the elements
|
2821
3178
|
if ($R) $R.hide(); // hide resizer-bar
|
@@ -2838,10 +3195,10 @@ $.fn.layout = function (opts) {
|
|
2838
3195
|
/**
|
2839
3196
|
* Show a hidden pane - show as 'closed' by default unless openPane = true
|
2840
3197
|
*
|
2841
|
-
* @param {string}
|
2842
|
-
* @param {boolean=}
|
2843
|
-
* @param {boolean=}
|
2844
|
-
* @param {boolean=}
|
3198
|
+
* @param {(string|Object)} evt_or_pane The pane being opened, ie: north, south, east, or west
|
3199
|
+
* @param {boolean=} [openPane=false]
|
3200
|
+
* @param {boolean=} [noAnimation=false]
|
3201
|
+
* @param {boolean=} [noAlert=false]
|
2845
3202
|
*/
|
2846
3203
|
, show = function (evt_or_pane, openPane, noAnimation, noAlert) {
|
2847
3204
|
if (!isInitialized()) return;
|
@@ -2856,9 +3213,10 @@ $.fn.layout = function (opts) {
|
|
2856
3213
|
// onshow_start callback - will CANCEL show if returns false
|
2857
3214
|
if (false === _runCallbacks("onshow_start", pane)) return;
|
2858
3215
|
|
2859
|
-
s.isSliding = false; // just in case
|
2860
3216
|
s.isShowing = true; // used by onopen/onclose
|
2861
3217
|
//s.isHidden = false; - will be set by open/close - if not cancelled
|
3218
|
+
s.isSliding = false; // just in case
|
3219
|
+
delete state.panesSliding[pane];
|
2862
3220
|
|
2863
3221
|
// now show the elements
|
2864
3222
|
//if ($R) $R.show(); - will be shown by open/close
|
@@ -2872,8 +3230,8 @@ $.fn.layout = function (opts) {
|
|
2872
3230
|
/**
|
2873
3231
|
* Toggles a pane open/closed by calling either open or close
|
2874
3232
|
*
|
2875
|
-
* @param {string}
|
2876
|
-
* @param {boolean=}
|
3233
|
+
* @param {(string|Object)} evt_or_pane The pane being toggled, ie: north, south, east, or west
|
3234
|
+
* @param {boolean=} [slide=false]
|
2877
3235
|
*/
|
2878
3236
|
, toggle = function (evt_or_pane, slide) {
|
2879
3237
|
if (!isInitialized()) return;
|
@@ -2906,22 +3264,22 @@ $.fn.layout = function (opts) {
|
|
2906
3264
|
_hidePane(pane);
|
2907
3265
|
s.isClosed = true;
|
2908
3266
|
s.isVisible = false;
|
2909
|
-
|
3267
|
+
if (setHandles) setAsClosed(pane);
|
2910
3268
|
}
|
2911
3269
|
|
2912
3270
|
/**
|
2913
3271
|
* Close the specified pane (animation optional), and resize all other panes as needed
|
2914
3272
|
*
|
2915
|
-
* @param {string}
|
2916
|
-
* @param {boolean=}
|
2917
|
-
* @param {boolean=}
|
2918
|
-
* @param {boolean=}
|
3273
|
+
* @param {(string|Object)} evt_or_pane The pane being closed, ie: north, south, east, or west
|
3274
|
+
* @param {boolean=} [force=false]
|
3275
|
+
* @param {boolean=} [noAnimation=false]
|
3276
|
+
* @param {boolean=} [skipCallback=false]
|
2919
3277
|
*/
|
2920
3278
|
, close = function (evt_or_pane, force, noAnimation, skipCallback) {
|
2921
3279
|
var pane = evtPane.call(this, evt_or_pane);
|
2922
3280
|
// if pane has been initialized, but NOT the complete layout, close pane instantly
|
2923
3281
|
if (!state.initialized && $Ps[pane]) {
|
2924
|
-
_closePane(pane); // INIT pane as closed
|
3282
|
+
_closePane(pane, true); // INIT pane as closed
|
2925
3283
|
return;
|
2926
3284
|
}
|
2927
3285
|
if (!isInitialized()) return;
|
@@ -2937,7 +3295,7 @@ $.fn.layout = function (opts) {
|
|
2937
3295
|
|
2938
3296
|
// QUEUE in case another action/animation is in progress
|
2939
3297
|
$N.queue(function( queueNext ){
|
2940
|
-
|
3298
|
+
|
2941
3299
|
if ( !$P
|
2942
3300
|
|| (!o.closable && !s.isShowing && !s.isHiding) // invalid request // (!o.resizable && !o.closable) ???
|
2943
3301
|
|| (!force && s.isClosed && !s.isShowing) // already closed
|
@@ -2975,9 +3333,6 @@ $.fn.layout = function (opts) {
|
|
2975
3333
|
|
2976
3334
|
// CLOSE THE PANE
|
2977
3335
|
if (doFX) { // animate the close
|
2978
|
-
// mask panes with objects
|
2979
|
-
var masks = "center"+ (c.dir=="horz" ? ",west,east" : "");
|
2980
|
-
showMasks( masks, true ); // true = ONLY mask panes with maskObjects=true
|
2981
3336
|
lockPaneForFX(pane, true); // need to set left/top so animation will work
|
2982
3337
|
$P.hide( o.fxName_close, o.fxSettings_close, o.fxSpeed_close, function () {
|
2983
3338
|
lockPaneForFX(pane, false); // undo
|
@@ -2995,7 +3350,7 @@ $.fn.layout = function (opts) {
|
|
2995
3350
|
// SUBROUTINE
|
2996
3351
|
function close_2 () {
|
2997
3352
|
s.isMoving = false;
|
2998
|
-
|
3353
|
+
bindStartSlidingEvents(pane, true); // will enable if o.slidable = true
|
2999
3354
|
|
3000
3355
|
// if opposite-pane was autoClosed, see if it can be autoOpened now
|
3001
3356
|
var altPane = _c.oppositeEdge[pane];
|
@@ -3004,9 +3359,6 @@ $.fn.layout = function (opts) {
|
|
3004
3359
|
makePaneFit( altPane );
|
3005
3360
|
}
|
3006
3361
|
|
3007
|
-
// hide any masks shown while closing
|
3008
|
-
hideMasks();
|
3009
|
-
|
3010
3362
|
if (!skipCallback && (state.initialized || o.triggerEventsOnLoad)) {
|
3011
3363
|
// onclose callback - UNLESS just 'showing' a hidden pane as 'closed'
|
3012
3364
|
if (!isShowing) _runCallbacks("onclose_end", pane);
|
@@ -3021,14 +3373,14 @@ $.fn.layout = function (opts) {
|
|
3021
3373
|
* @param {string} pane The pane just closed, ie: north, south, east, or west
|
3022
3374
|
*/
|
3023
3375
|
, setAsClosed = function (pane) {
|
3376
|
+
if (!$Rs[pane]) return; // handles not initialized yet!
|
3024
3377
|
var
|
3025
3378
|
$P = $Ps[pane]
|
3026
3379
|
, $R = $Rs[pane]
|
3027
3380
|
, $T = $Ts[pane]
|
3028
3381
|
, o = options[pane]
|
3029
3382
|
, s = state[pane]
|
3030
|
-
, side = _c[pane].side
|
3031
|
-
, inset = "inset"+ _c[pane].side
|
3383
|
+
, side = _c[pane].side
|
3032
3384
|
, rClass = o.resizerClass
|
3033
3385
|
, tClass = o.togglerClass
|
3034
3386
|
, _pane = "-"+ pane // used for classNames
|
@@ -3037,13 +3389,12 @@ $.fn.layout = function (opts) {
|
|
3037
3389
|
, _closed = "-closed"
|
3038
3390
|
;
|
3039
3391
|
$R
|
3040
|
-
.css(side, sC[
|
3392
|
+
.css(side, sC.inset[side]) // move the resizer
|
3041
3393
|
.removeClass( rClass+_open +" "+ rClass+_pane+_open )
|
3042
3394
|
.removeClass( rClass+_sliding +" "+ rClass+_pane+_sliding )
|
3043
3395
|
.addClass( rClass+_closed +" "+ rClass+_pane+_closed )
|
3044
|
-
.unbind("dblclick."+ sID)
|
3045
3396
|
;
|
3046
|
-
// DISABLE 'resizing' when closed - do this BEFORE
|
3397
|
+
// DISABLE 'resizing' when closed - do this BEFORE bindStartSlidingEvents?
|
3047
3398
|
if (o.resizable && $.layout.plugins.draggable)
|
3048
3399
|
$R
|
3049
3400
|
.draggable("disable")
|
@@ -3057,7 +3408,7 @@ $.fn.layout = function (opts) {
|
|
3057
3408
|
$T
|
3058
3409
|
.removeClass( tClass+_open +" "+ tClass+_pane+_open )
|
3059
3410
|
.addClass( tClass+_closed +" "+ tClass+_pane+_closed )
|
3060
|
-
.attr("title", o.
|
3411
|
+
.attr("title", o.tips.Open) // may be blank
|
3061
3412
|
;
|
3062
3413
|
// toggler-content - if exists
|
3063
3414
|
$T.children(".content-open").hide();
|
@@ -3076,10 +3427,10 @@ $.fn.layout = function (opts) {
|
|
3076
3427
|
/**
|
3077
3428
|
* Open the specified pane (animation optional), and resize all other panes as needed
|
3078
3429
|
*
|
3079
|
-
* @param {string}
|
3080
|
-
* @param {boolean=}
|
3081
|
-
* @param {boolean=}
|
3082
|
-
* @param {boolean=}
|
3430
|
+
* @param {(string|Object)} evt_or_pane The pane being opened, ie: north, south, east, or west
|
3431
|
+
* @param {boolean=} [slide=false]
|
3432
|
+
* @param {boolean=} [noAnimation=false]
|
3433
|
+
* @param {boolean=} [noAlert=false]
|
3083
3434
|
*/
|
3084
3435
|
, open = function (evt_or_pane, slide, noAnimation, noAlert) {
|
3085
3436
|
if (!isInitialized()) return;
|
@@ -3107,8 +3458,8 @@ $.fn.layout = function (opts) {
|
|
3107
3458
|
return;
|
3108
3459
|
}
|
3109
3460
|
|
3110
|
-
if (
|
3111
|
-
sizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize
|
3461
|
+
if (s.autoResize && s.size != o.size) // resize pane to original size set in options
|
3462
|
+
sizePane(pane, o.size, true, true, true); // true=skipCallback/noAnimation/forceResize
|
3112
3463
|
else
|
3113
3464
|
// make sure there is enough space available to open the pane
|
3114
3465
|
setSizeLimits(pane, slide);
|
@@ -3125,8 +3476,8 @@ $.fn.layout = function (opts) {
|
|
3125
3476
|
|
3126
3477
|
if (s.minSize > s.maxSize) { // INSUFFICIENT ROOM FOR PANE TO OPEN!
|
3127
3478
|
syncPinBtns(pane, false); // make sure pin-buttons are reset
|
3128
|
-
if (!noAlert && o.
|
3129
|
-
alert(o.
|
3479
|
+
if (!noAlert && o.tips.noRoomToOpen)
|
3480
|
+
alert(o.tips.noRoomToOpen);
|
3130
3481
|
return queueNext(); // ABORT
|
3131
3482
|
}
|
3132
3483
|
|
@@ -3135,7 +3486,7 @@ $.fn.layout = function (opts) {
|
|
3135
3486
|
else if (s.isSliding) // PIN PANE (stop sliding) - open pane 'normally' instead
|
3136
3487
|
bindStopSlidingEvents(pane, false); // UNBIND trigger events - will set isSliding=false
|
3137
3488
|
else if (o.slidable)
|
3138
|
-
|
3489
|
+
bindStartSlidingEvents(pane, false); // UNBIND trigger events
|
3139
3490
|
|
3140
3491
|
s.noRoom = false; // will be reset by makePaneFit if 'noRoom'
|
3141
3492
|
makePaneFit(pane);
|
@@ -3153,12 +3504,9 @@ $.fn.layout = function (opts) {
|
|
3153
3504
|
if (isShowing) s.isHidden = false;
|
3154
3505
|
|
3155
3506
|
if (doFX) { // ANIMATE
|
3156
|
-
// mask panes with objects
|
3157
|
-
var masks = "center"+ (c.dir=="horz" ? ",west,east" : "");
|
3158
|
-
if (s.isSliding) masks += ","+ _c.oppositeEdge[pane];
|
3159
|
-
showMasks( masks, true ); // true = ONLY mask panes with maskObjects=true
|
3507
|
+
// mask adjacent panes with objects
|
3160
3508
|
lockPaneForFX(pane, true); // need to set left/top so animation will work
|
3161
|
-
|
3509
|
+
$P.show( o.fxName_open, o.fxSettings_open, o.fxSpeed_open, function() {
|
3162
3510
|
lockPaneForFX(pane, false); // undo
|
3163
3511
|
if (s.isVisible) open_2(); // continue
|
3164
3512
|
queueNext();
|
@@ -3180,7 +3528,6 @@ $.fn.layout = function (opts) {
|
|
3180
3528
|
|
3181
3529
|
// NOTE: if isSliding, then other panes are NOT 'resized'
|
3182
3530
|
if (!s.isSliding) { // resize all panes adjacent to this one
|
3183
|
-
hideMasks(); // remove any masks shown while opening
|
3184
3531
|
sizeMidPanes(_c[pane].dir=="vert" ? "center" : "", false); // false = NOT skipCallback
|
3185
3532
|
}
|
3186
3533
|
|
@@ -3201,8 +3548,7 @@ $.fn.layout = function (opts) {
|
|
3201
3548
|
, $T = $Ts[pane]
|
3202
3549
|
, o = options[pane]
|
3203
3550
|
, s = state[pane]
|
3204
|
-
, side = _c[pane].side
|
3205
|
-
, inset = "inset"+ _c[pane].side
|
3551
|
+
, side = _c[pane].side
|
3206
3552
|
, rClass = o.resizerClass
|
3207
3553
|
, tClass = o.togglerClass
|
3208
3554
|
, _pane = "-"+ pane // used for classNames
|
@@ -3211,7 +3557,7 @@ $.fn.layout = function (opts) {
|
|
3211
3557
|
, _sliding= "-sliding"
|
3212
3558
|
;
|
3213
3559
|
$R
|
3214
|
-
.css(side, sC[
|
3560
|
+
.css(side, sC.inset[side] + getPaneSize(pane)) // move the resizer
|
3215
3561
|
.removeClass( rClass+_closed +" "+ rClass+_pane+_closed )
|
3216
3562
|
.addClass( rClass+_open +" "+ rClass+_pane+_open )
|
3217
3563
|
;
|
@@ -3220,13 +3566,11 @@ $.fn.layout = function (opts) {
|
|
3220
3566
|
else // in case 'was sliding'
|
3221
3567
|
$R.removeClass( rClass+_sliding +" "+ rClass+_pane+_sliding )
|
3222
3568
|
|
3223
|
-
if (o.resizerDblClickToggle)
|
3224
|
-
$R.bind("dblclick", toggle );
|
3225
3569
|
removeHover( 0, $R ); // remove hover classes
|
3226
3570
|
if (o.resizable && $.layout.plugins.draggable)
|
3227
3571
|
$R .draggable("enable")
|
3228
3572
|
.css("cursor", o.resizerCursor)
|
3229
|
-
.attr("title", o.
|
3573
|
+
.attr("title", o.tips.Resize);
|
3230
3574
|
else if (!s.isSliding)
|
3231
3575
|
$R.css("cursor", "default"); // n-resize, s-resize, etc
|
3232
3576
|
|
@@ -3234,7 +3578,7 @@ $.fn.layout = function (opts) {
|
|
3234
3578
|
if ($T) {
|
3235
3579
|
$T .removeClass( tClass+_closed +" "+ tClass+_pane+_closed )
|
3236
3580
|
.addClass( tClass+_open +" "+ tClass+_pane+_open )
|
3237
|
-
.attr("title", o.
|
3581
|
+
.attr("title", o.tips.Close); // may be blank
|
3238
3582
|
removeHover( 0, $T ); // remove hover classes
|
3239
3583
|
// toggler-content - if exists
|
3240
3584
|
$T.children(".content-closed").hide();
|
@@ -3335,7 +3679,7 @@ $.fn.layout = function (opts) {
|
|
3335
3679
|
}
|
3336
3680
|
|
3337
3681
|
/**
|
3338
|
-
* @param {string}
|
3682
|
+
* @param {(string|Object)} evt_or_pane The pane being opened, ie: north, south, east, or west
|
3339
3683
|
*/
|
3340
3684
|
, slideToggle = function (evt_or_pane) {
|
3341
3685
|
var pane = evtPane.call(this, evt_or_pane);
|
@@ -3356,14 +3700,15 @@ $.fn.layout = function (opts) {
|
|
3356
3700
|
, z = options.zIndexes
|
3357
3701
|
;
|
3358
3702
|
if (doLock) {
|
3703
|
+
showMasks( pane, { animation: true, objectsOnly: true });
|
3359
3704
|
$P.css({ zIndex: z.pane_animate }); // overlay all elements during animation
|
3360
3705
|
if (pane=="south")
|
3361
|
-
$P.css({ top: sC.
|
3706
|
+
$P.css({ top: sC.inset.top + sC.innerHeight - $P.outerHeight() });
|
3362
3707
|
else if (pane=="east")
|
3363
|
-
$P.css({ left: sC.
|
3708
|
+
$P.css({ left: sC.inset.left + sC.innerWidth - $P.outerWidth() });
|
3364
3709
|
}
|
3365
3710
|
else { // animation DONE - RESET CSS
|
3366
|
-
|
3711
|
+
hideMasks();
|
3367
3712
|
$P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) });
|
3368
3713
|
if (pane=="south")
|
3369
3714
|
$P.css({ top: "auto" });
|
@@ -3384,7 +3729,7 @@ $.fn.layout = function (opts) {
|
|
3384
3729
|
* @param {string} pane The pane to enable/disable, 'north', 'south', etc.
|
3385
3730
|
* @param {boolean} enable Enable or Disable sliding?
|
3386
3731
|
*/
|
3387
|
-
,
|
3732
|
+
, bindStartSlidingEvents = function (pane, enable) {
|
3388
3733
|
var o = options[pane]
|
3389
3734
|
, $P = $Ps[pane]
|
3390
3735
|
, $R = $Rs[pane]
|
@@ -3395,22 +3740,27 @@ $.fn.layout = function (opts) {
|
|
3395
3740
|
// make sure we have a valid event
|
3396
3741
|
if (evtName.match(/mouseover/))
|
3397
3742
|
evtName = o.slideTrigger_open = "mouseenter";
|
3398
|
-
else if (!evtName.match(/click|dblclick|mouseenter/))
|
3743
|
+
else if (!evtName.match(/(click|dblclick|mouseenter)/))
|
3399
3744
|
evtName = o.slideTrigger_open = "click";
|
3400
3745
|
|
3746
|
+
// must remove double-click-toggle when using dblclick-slide
|
3747
|
+
if (o.resizerDblClickToggle && evtName.match(/click/)) {
|
3748
|
+
$R[enable ? "unbind" : "bind"]('dblclick.'+ sID, toggle)
|
3749
|
+
}
|
3750
|
+
|
3401
3751
|
$R
|
3402
3752
|
// add or remove event
|
3403
3753
|
[enable ? "bind" : "unbind"](evtName +'.'+ sID, slideOpen)
|
3404
3754
|
// set the appropriate cursor & title/tip
|
3405
3755
|
.css("cursor", enable ? o.sliderCursor : "default")
|
3406
|
-
.attr("title", enable ? o.
|
3756
|
+
.attr("title", enable ? o.tips.Slide : "")
|
3407
3757
|
;
|
3408
3758
|
}
|
3409
3759
|
|
3410
3760
|
/**
|
3411
3761
|
* Add or remove 'mouseleave' events to 'slide close' when pane is 'sliding' open or closed
|
3412
3762
|
* Also increases zIndex when pane is sliding open
|
3413
|
-
* See
|
3763
|
+
* See bindStartSlidingEvents for code to control 'slide open'
|
3414
3764
|
*
|
3415
3765
|
* @see slideOpen(), slideClose()
|
3416
3766
|
* @param {string} pane The pane to process, 'north', 'south', etc.
|
@@ -3426,19 +3776,26 @@ $.fn.layout = function (opts) {
|
|
3426
3776
|
, $P = $Ps[pane]
|
3427
3777
|
, $R = $Rs[pane]
|
3428
3778
|
;
|
3429
|
-
s.isSliding = enable; // logic
|
3430
3779
|
timer.clear(pane+"_closeSlider"); // just in case
|
3431
3780
|
|
3432
|
-
|
3433
|
-
|
3434
|
-
|
3781
|
+
if (enable) {
|
3782
|
+
s.isSliding = true;
|
3783
|
+
state.panesSliding[pane] = true;
|
3784
|
+
// remove 'slideOpen' event from resizer
|
3785
|
+
// ALSO will raise the zIndex of the pane & resizer
|
3786
|
+
bindStartSlidingEvents(pane, false);
|
3787
|
+
}
|
3788
|
+
else {
|
3789
|
+
s.isSliding = false;
|
3790
|
+
delete state.panesSliding[pane];
|
3791
|
+
}
|
3435
3792
|
|
3436
3793
|
// RE/SET zIndex - increases when pane is sliding-open, resets to normal when not
|
3437
3794
|
$P.css("zIndex", enable ? z.pane_sliding : z.pane_normal);
|
3438
3795
|
$R.css("zIndex", enable ? z.pane_sliding+2 : z.resizer_normal); // NOTE: mask = pane_sliding+1
|
3439
3796
|
|
3440
3797
|
// make sure we have a valid event
|
3441
|
-
if (!evtName.match(/click|mouseleave/))
|
3798
|
+
if (!evtName.match(/(click|mouseleave)/))
|
3442
3799
|
evtName = o.slideTrigger_close = "mouseleave"; // also catches 'mouseout'
|
3443
3800
|
|
3444
3801
|
// add/remove slide triggers
|
@@ -3458,7 +3815,7 @@ $.fn.layout = function (opts) {
|
|
3458
3815
|
// IF pane is not resizable (which already has a cursor and tip)
|
3459
3816
|
// then set the a cursor & title/tip on resizer when sliding
|
3460
3817
|
$R.css("cursor", enable ? o.sliderCursor : "default");
|
3461
|
-
$R.attr("title", enable ? o.
|
3818
|
+
$R.attr("title", enable ? o.tips.Close : ""); // use Toggler-tip, eg: "Close Pane"
|
3462
3819
|
}
|
3463
3820
|
|
3464
3821
|
// SUBROUTINE for mouseleave timer clearing
|
@@ -3479,8 +3836,7 @@ $.fn.layout = function (opts) {
|
|
3479
3836
|
* @param {boolean=} [force=false]
|
3480
3837
|
*/
|
3481
3838
|
, makePaneFit = function (pane, isOpening, skipCallback, force) {
|
3482
|
-
var
|
3483
|
-
o = options[pane]
|
3839
|
+
var o = options[pane]
|
3484
3840
|
, s = state[pane]
|
3485
3841
|
, c = _c[pane]
|
3486
3842
|
, $P = $Ps[pane]
|
@@ -3516,17 +3872,15 @@ $.fn.layout = function (opts) {
|
|
3516
3872
|
else if (s.minSize <= s.maxSize) { // pane CAN fit
|
3517
3873
|
hasRoom = true;
|
3518
3874
|
if (s.size > s.maxSize) // pane is too big - shrink it
|
3519
|
-
sizePane(pane, s.maxSize, skipCallback,
|
3875
|
+
sizePane(pane, s.maxSize, skipCallback, true, force); // true = noAnimation
|
3520
3876
|
else if (s.size < s.minSize) // pane is too small - enlarge it
|
3521
|
-
sizePane(pane, s.minSize, skipCallback,
|
3877
|
+
sizePane(pane, s.minSize, skipCallback, true, force); // true = noAnimation
|
3522
3878
|
// need s.isVisible because new pseudoClose method keeps pane visible, but off-screen
|
3523
3879
|
else if ($R && s.isVisible && $P.is(":visible")) {
|
3524
3880
|
// make sure resizer-bar is positioned correctly
|
3525
3881
|
// handles situation where nested layout was 'hidden' when initialized
|
3526
|
-
var
|
3527
|
-
,
|
3528
|
-
;
|
3529
|
-
if ($.layout.cssNum($R, side) != pos) $R.css( side, pos );
|
3882
|
+
var pos = s.size + sC.inset[c.side];
|
3883
|
+
if ($.layout.cssNum( $R, c.side ) != pos) $R.css( c.side, pos );
|
3530
3884
|
}
|
3531
3885
|
|
3532
3886
|
// if was previously hidden due to noRoom, then RESET because NOW there is room
|
@@ -3557,46 +3911,46 @@ $.fn.layout = function (opts) {
|
|
3557
3911
|
|
3558
3912
|
|
3559
3913
|
/**
|
3560
|
-
* sizePane / manualSizePane
|
3561
|
-
* sizePane is called only by internal methods whenever a pane needs to be resized
|
3562
3914
|
* manualSizePane is an exposed flow-through method allowing extra code when pane is 'manually resized'
|
3563
3915
|
*
|
3564
|
-
* @param {string}
|
3565
|
-
* @param {number}
|
3566
|
-
* @param {boolean=}
|
3567
|
-
* @param {boolean=}
|
3916
|
+
* @param {(string|Object)} evt_or_pane The pane being resized
|
3917
|
+
* @param {number} size The *desired* new size for this pane - will be validated
|
3918
|
+
* @param {boolean=} [skipCallback=false] Should the onresize callback be run?
|
3919
|
+
* @param {boolean=} [noAnimation=false]
|
3920
|
+
* @param {boolean=} [force=false] Force resizing even if does not seem necessary
|
3568
3921
|
*/
|
3569
|
-
, manualSizePane = function (evt_or_pane, size, skipCallback, noAnimation) {
|
3922
|
+
, manualSizePane = function (evt_or_pane, size, skipCallback, noAnimation, force) {
|
3570
3923
|
if (!isInitialized()) return;
|
3571
3924
|
var pane = evtPane.call(this, evt_or_pane)
|
3572
3925
|
, o = options[pane]
|
3573
3926
|
, s = state[pane]
|
3574
3927
|
// if resizing callbacks have been delayed and resizing is now DONE, force resizing to complete...
|
3575
|
-
, forceResize = o.livePaneResizing && !s.isResizing
|
3928
|
+
, forceResize = force || (o.livePaneResizing && !s.isResizing)
|
3576
3929
|
;
|
3577
3930
|
// ANY call to manualSizePane disables autoResize - ie, percentage sizing
|
3578
|
-
|
3931
|
+
s.autoResize = false;
|
3579
3932
|
// flow-through...
|
3580
|
-
sizePane(pane, size, skipCallback,
|
3933
|
+
sizePane(pane, size, skipCallback, noAnimation, forceResize); // will animate resize if option enabled
|
3581
3934
|
}
|
3582
3935
|
|
3583
3936
|
/**
|
3584
|
-
*
|
3585
|
-
*
|
3586
|
-
* @param {
|
3587
|
-
* @param {
|
3588
|
-
* @param {boolean=}
|
3937
|
+
* sizePane is called only by internal methods whenever a pane needs to be resized
|
3938
|
+
*
|
3939
|
+
* @param {(string|Object)} evt_or_pane The pane being resized
|
3940
|
+
* @param {number} size The *desired* new size for this pane - will be validated
|
3941
|
+
* @param {boolean=} [skipCallback=false] Should the onresize callback be run?
|
3942
|
+
* @param {boolean=} [noAnimation=false]
|
3943
|
+
* @param {boolean=} [force=false] Force resizing even if does not seem necessary
|
3589
3944
|
*/
|
3590
|
-
, sizePane = function (evt_or_pane, size, skipCallback,
|
3945
|
+
, sizePane = function (evt_or_pane, size, skipCallback, noAnimation, force) {
|
3591
3946
|
if (!isInitialized()) return;
|
3592
3947
|
var pane = evtPane.call(this, evt_or_pane) // probably NEVER called from event?
|
3593
3948
|
, o = options[pane]
|
3594
3949
|
, s = state[pane]
|
3595
3950
|
, $P = $Ps[pane]
|
3596
3951
|
, $R = $Rs[pane]
|
3597
|
-
, side = _c[pane].side
|
3952
|
+
, side = _c[pane].side
|
3598
3953
|
, dimName = _c[pane].sizeType.toLowerCase()
|
3599
|
-
, inset = "inset"+ _c[pane].side
|
3600
3954
|
, skipResizeWhileDragging = s.isResizing && !o.triggerEventsDuringLiveResize
|
3601
3955
|
, doFX = noAnimation !== true && o.animatePaneSizing
|
3602
3956
|
, oldSize, newSize
|
@@ -3619,6 +3973,8 @@ $.fn.layout = function (opts) {
|
|
3619
3973
|
if (!force && size === oldSize)
|
3620
3974
|
return queueNext();
|
3621
3975
|
|
3976
|
+
s.newSize = size;
|
3977
|
+
|
3622
3978
|
// onresize_start callback CANNOT cancel resizing because this would break the layout!
|
3623
3979
|
if (!skipCallback && state.initialized && s.isVisible)
|
3624
3980
|
_runCallbacks("onresize_start", pane);
|
@@ -3639,12 +3995,14 @@ $.fn.layout = function (opts) {
|
|
3639
3995
|
// reset zIndex after animation
|
3640
3996
|
$P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) });
|
3641
3997
|
s.isMoving = false;
|
3998
|
+
delete s.newSize;
|
3642
3999
|
sizePane_2(); // continue
|
3643
4000
|
queueNext();
|
3644
4001
|
});
|
3645
4002
|
}
|
3646
4003
|
else { // no animation
|
3647
4004
|
$P.css( dimName, newSize ); // resize pane
|
4005
|
+
delete s.newSize;
|
3648
4006
|
// if pane is visible, then
|
3649
4007
|
if ($P.is(":visible"))
|
3650
4008
|
sizePane_2(); // continue
|
@@ -3675,6 +4033,7 @@ $.fn.layout = function (opts) {
|
|
3675
4033
|
, cssSize: newSize
|
3676
4034
|
}]
|
3677
4035
|
, lastTry = tries[0]
|
4036
|
+
, thisTry = {}
|
3678
4037
|
, msg = 'Inaccurate size after resizing the '+ pane +'-pane.'
|
3679
4038
|
;
|
3680
4039
|
while ( !lastTry.correct ) {
|
@@ -3691,15 +4050,12 @@ $.fn.layout = function (opts) {
|
|
3691
4050
|
thisTry.actual = dimName=='width' ? $P.outerWidth() : $P.outerHeight();
|
3692
4051
|
thisTry.correct = (size === thisTry.actual);
|
3693
4052
|
|
3694
|
-
//
|
3695
|
-
if (
|
3696
|
-
|
3697
|
-
|
3698
|
-
_log(lastTry, false);
|
3699
|
-
}
|
3700
|
-
_log(thisTry, false);
|
4053
|
+
// log attempts and alert the user of this *non-fatal error* (if showDebugMessages)
|
4054
|
+
if ( tries.length === 1) {
|
4055
|
+
_log(msg, false, true);
|
4056
|
+
_log(lastTry, false, true);
|
3701
4057
|
}
|
3702
|
-
|
4058
|
+
_log(thisTry, false, true);
|
3703
4059
|
// after 4 tries, is as close as its gonna get!
|
3704
4060
|
if (tries.length > 3) break;
|
3705
4061
|
|
@@ -3714,7 +4070,7 @@ $.fn.layout = function (opts) {
|
|
3714
4070
|
|
3715
4071
|
if (s.isVisible && $P.is(":visible")) {
|
3716
4072
|
// reposition the resizer-bar
|
3717
|
-
if ($R) $R.css( side, size + sC[
|
4073
|
+
if ($R) $R.css( side, size + sC.inset[side] );
|
3718
4074
|
// resize the content-div
|
3719
4075
|
sizeContent(pane);
|
3720
4076
|
}
|
@@ -3738,16 +4094,16 @@ $.fn.layout = function (opts) {
|
|
3738
4094
|
}
|
3739
4095
|
|
3740
4096
|
// DEBUG - ALERT user/developer so they know there was a sizing problem
|
3741
|
-
if (
|
3742
|
-
_log(msg +'\nSee the Error Console for details.', true);
|
4097
|
+
if (tries.length > 1)
|
4098
|
+
_log(msg +'\nSee the Error Console for details.', true, true);
|
3743
4099
|
}
|
3744
4100
|
}
|
3745
4101
|
|
3746
4102
|
/**
|
3747
|
-
* @see initPanes(), sizePane(),
|
3748
|
-
* @param {string} panes The pane(s) being resized, comma-delmited string
|
3749
|
-
* @param {boolean=}
|
3750
|
-
* @param {boolean=}
|
4103
|
+
* @see initPanes(), sizePane(), resizeAll(), open(), close(), hide()
|
4104
|
+
* @param {(Array.<string>|string)} panes The pane(s) being resized, comma-delmited string
|
4105
|
+
* @param {boolean=} [skipCallback=false] Should the onresize callback be run?
|
4106
|
+
* @param {boolean=} [force=false]
|
3751
4107
|
*/
|
3752
4108
|
, sizeMidPanes = function (panes, skipCallback, force) {
|
3753
4109
|
panes = (panes ? panes : "east,west,center").split(",");
|
@@ -3762,27 +4118,36 @@ $.fn.layout = function (opts) {
|
|
3762
4118
|
, isCenter= (pane=="center")
|
3763
4119
|
, hasRoom = true
|
3764
4120
|
, CSS = {}
|
4121
|
+
// if pane is not visible, show it invisibly NOW rather than for *each call* in this script
|
4122
|
+
, visCSS = $.layout.showInvisibly($P)
|
4123
|
+
|
3765
4124
|
, newCenter = calcNewCenterPaneDims()
|
3766
4125
|
;
|
4126
|
+
|
3767
4127
|
// update pane-state dimensions
|
3768
4128
|
$.extend(s, elDims($P));
|
3769
4129
|
|
3770
4130
|
if (pane === "center") {
|
3771
|
-
if (!force && s.isVisible && newCenter.width === s.outerWidth && newCenter.height === s.outerHeight)
|
4131
|
+
if (!force && s.isVisible && newCenter.width === s.outerWidth && newCenter.height === s.outerHeight) {
|
4132
|
+
$P.css(visCSS);
|
3772
4133
|
return true; // SKIP - pane already the correct size
|
4134
|
+
}
|
3773
4135
|
// set state for makePaneFit() logic
|
3774
4136
|
$.extend(s, cssMinDims(pane), {
|
3775
4137
|
maxWidth: newCenter.width
|
3776
4138
|
, maxHeight: newCenter.height
|
3777
4139
|
});
|
3778
4140
|
CSS = newCenter;
|
4141
|
+
s.newWidth = CSS.width;
|
4142
|
+
s.newHeight = CSS.height;
|
3779
4143
|
// convert OUTER width/height to CSS width/height
|
3780
4144
|
CSS.width = cssW($P, CSS.width);
|
3781
4145
|
// NEW - allow pane to extend 'below' visible area rather than hide it
|
3782
4146
|
CSS.height = cssH($P, CSS.height);
|
3783
4147
|
hasRoom = CSS.width >= 0 && CSS.height >= 0; // height >= 0 = ALWAYS TRUE NOW
|
4148
|
+
|
3784
4149
|
// during layout init, try to shrink east/west panes to make room for center
|
3785
|
-
if (!state.initialized && o.minWidth >
|
4150
|
+
if (!state.initialized && o.minWidth > newCenter.width) {
|
3786
4151
|
var
|
3787
4152
|
reqPx = o.minWidth - s.outerWidth
|
3788
4153
|
, minE = options.east.minSize || 0
|
@@ -3802,12 +4167,13 @@ $.fn.layout = function (opts) {
|
|
3802
4167
|
}
|
3803
4168
|
// IF we found enough extra space, then resize the border panes as calculated
|
3804
4169
|
if (reqPx === 0) {
|
3805
|
-
if (sizeE != minE)
|
3806
|
-
sizePane('east', newE, true,
|
3807
|
-
if (sizeW != minW)
|
3808
|
-
sizePane('west', newW, true,
|
4170
|
+
if (sizeE && sizeE != minE)
|
4171
|
+
sizePane('east', newE, true, true, force); // true = skipCallback/noAnimation - initPanes will handle when done
|
4172
|
+
if (sizeW && sizeW != minW)
|
4173
|
+
sizePane('west', newW, true, true, force); // true = skipCallback/noAnimation
|
3809
4174
|
// now start over!
|
3810
4175
|
sizeMidPanes('center', skipCallback, force);
|
4176
|
+
$P.css(visCSS);
|
3811
4177
|
return; // abort this loop
|
3812
4178
|
}
|
3813
4179
|
}
|
@@ -3816,11 +4182,14 @@ $.fn.layout = function (opts) {
|
|
3816
4182
|
// set state.min/maxWidth/Height for makePaneFit() logic
|
3817
4183
|
if (s.isVisible && !s.noVerticalRoom)
|
3818
4184
|
$.extend(s, elDims($P), cssMinDims(pane))
|
3819
|
-
if (!force && !s.noVerticalRoom && newCenter.height === s.outerHeight)
|
4185
|
+
if (!force && !s.noVerticalRoom && newCenter.height === s.outerHeight) {
|
4186
|
+
$P.css(visCSS);
|
3820
4187
|
return true; // SKIP - pane already the correct size
|
4188
|
+
}
|
3821
4189
|
// east/west have same top, bottom & height as center
|
3822
4190
|
CSS.top = newCenter.top;
|
3823
4191
|
CSS.bottom = newCenter.bottom;
|
4192
|
+
s.newSize = newCenter.height
|
3824
4193
|
// NEW - allow pane to extend 'below' visible area rather than hide it
|
3825
4194
|
CSS.height = cssH($P, newCenter.height);
|
3826
4195
|
s.maxHeight = CSS.height;
|
@@ -3834,7 +4203,8 @@ $.fn.layout = function (opts) {
|
|
3834
4203
|
_runCallbacks("onresize_start", pane);
|
3835
4204
|
|
3836
4205
|
$P.css(CSS); // apply the CSS to pane
|
3837
|
-
|
4206
|
+
if (pane !== "center")
|
4207
|
+
sizeHandles(pane); // also update resizer length
|
3838
4208
|
if (s.noRoom && !s.isClosed && !s.isHidden)
|
3839
4209
|
makePaneFit(pane); // will re-open/show auto-closed/hidden pane
|
3840
4210
|
if (s.isVisible) {
|
@@ -3845,6 +4215,13 @@ $.fn.layout = function (opts) {
|
|
3845
4215
|
else if (!s.noRoom && s.isVisible) // no room for pane
|
3846
4216
|
makePaneFit(pane); // will hide or close pane
|
3847
4217
|
|
4218
|
+
// reset visibility, if necessary
|
4219
|
+
$P.css(visCSS);
|
4220
|
+
|
4221
|
+
delete s.newSize;
|
4222
|
+
delete s.newWidth;
|
4223
|
+
delete s.newHeight;
|
4224
|
+
|
3848
4225
|
if (!s.isVisible)
|
3849
4226
|
return true; // DONE - next pane
|
3850
4227
|
|
@@ -3852,10 +4229,11 @@ $.fn.layout = function (opts) {
|
|
3852
4229
|
* Extra CSS for IE6 or IE7 in Quirks-mode - add 'width' to NORTH/SOUTH panes
|
3853
4230
|
* Normally these panes have only 'left' & 'right' positions so pane auto-sizes
|
3854
4231
|
* ALSO required when pane is an IFRAME because will NOT default to 'full width'
|
4232
|
+
* TODO: Can I use width:100% for a north/south iframe?
|
4233
|
+
* TODO: Sounds like a job for $P.outerWidth( sC.innerWidth ) SETTER METHOD
|
3855
4234
|
*/
|
3856
4235
|
if (pane === "center") { // finished processing midPanes
|
3857
|
-
var
|
3858
|
-
var fix = b.isIE6 || (b.msie && !$.support.boxModel);
|
4236
|
+
var fix = browser.isIE6 || !browser.boxModel;
|
3859
4237
|
if ($Ps.north && (fix || state.north.tagName=="IFRAME"))
|
3860
4238
|
$Ps.north.css("width", cssW($Ps.north, sC.innerWidth));
|
3861
4239
|
if ($Ps.south && (fix || state.south.tagName=="IFRAME"))
|
@@ -3871,20 +4249,36 @@ $.fn.layout = function (opts) {
|
|
3871
4249
|
|
3872
4250
|
/**
|
3873
4251
|
* @see window.onresize(), callbacks or custom code
|
4252
|
+
* @param {(Object|boolean)=} evt_or_refresh If 'true', then also reset pane-positioning
|
3874
4253
|
*/
|
3875
|
-
, resizeAll = function () {
|
3876
|
-
if (!state.initialized) {
|
3877
|
-
_initLayoutElements();
|
3878
|
-
return; // no need to resize since we just initialized!
|
3879
|
-
}
|
4254
|
+
, resizeAll = function (evt_or_refresh) {
|
3880
4255
|
var oldW = sC.innerWidth
|
3881
4256
|
, oldH = sC.innerHeight
|
3882
4257
|
;
|
4258
|
+
// stopPropagation if called by trigger("layoutdestroy") - use evtPane utility
|
4259
|
+
evtPane(evt_or_refresh);
|
4260
|
+
|
3883
4261
|
// cannot size layout when 'container' is hidden or collapsed
|
3884
|
-
if (!$N.is(":visible
|
3885
|
-
|
4262
|
+
if (!$N.is(":visible")) return;
|
4263
|
+
|
4264
|
+
if (!state.initialized) {
|
4265
|
+
_initLayoutElements();
|
4266
|
+
return; // no need to resize since we just initialized!
|
4267
|
+
}
|
4268
|
+
|
4269
|
+
if (evt_or_refresh === true && $.isPlainObject(options.outset)) {
|
4270
|
+
// update container CSS in case outset option has changed
|
4271
|
+
$N.css( options.outset );
|
4272
|
+
}
|
4273
|
+
// UPDATE container dimensions
|
4274
|
+
$.extend(sC, elDims( $N, options.inset ));
|
3886
4275
|
if (!sC.outerHeight) return;
|
3887
4276
|
|
4277
|
+
// if 'true' passed, refresh pane & handle positioning too
|
4278
|
+
if (evt_or_refresh === true) {
|
4279
|
+
setPanePosition();
|
4280
|
+
}
|
4281
|
+
|
3888
4282
|
// onresizeall_start will CANCEL resizing if returns false
|
3889
4283
|
// state.container has already been set, so user can access this info for calcuations
|
3890
4284
|
if (false === _runCallbacks("onresizeall_start")) return false;
|
@@ -3892,28 +4286,25 @@ $.fn.layout = function (opts) {
|
|
3892
4286
|
var // see if container is now 'smaller' than before
|
3893
4287
|
shrunkH = (sC.innerHeight < oldH)
|
3894
4288
|
, shrunkW = (sC.innerWidth < oldW)
|
3895
|
-
, $P, o, s
|
4289
|
+
, $P, o, s
|
3896
4290
|
;
|
3897
4291
|
// NOTE special order for sizing: S-N-E-W
|
3898
4292
|
$.each(["south","north","east","west"], function (i, pane) {
|
3899
4293
|
if (!$Ps[pane]) return; // no pane - SKIP
|
3900
|
-
|
3901
|
-
|
3902
|
-
|
3903
|
-
|
3904
|
-
if (o.autoResize && s.size != o.size) // resize pane to original size set in options
|
3905
|
-
sizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation
|
4294
|
+
o = options[pane];
|
4295
|
+
s = state[pane];
|
4296
|
+
if (s.autoResize && s.size != o.size) // resize pane to original size set in options
|
4297
|
+
sizePane(pane, o.size, true, true, true); // true=skipCallback/noAnimation/forceResize
|
3906
4298
|
else {
|
3907
4299
|
setSizeLimits(pane);
|
3908
4300
|
makePaneFit(pane, false, true, true); // true=skipCallback/forceResize
|
3909
4301
|
}
|
3910
4302
|
});
|
3911
4303
|
|
3912
|
-
sizeMidPanes("", true, true); // true=skipCallback
|
4304
|
+
sizeMidPanes("", true, true); // true=skipCallback/forceResize
|
3913
4305
|
sizeHandles(); // reposition the toggler elements
|
3914
4306
|
|
3915
4307
|
// trigger all individual pane callbacks AFTER layout has finished resizing
|
3916
|
-
o = options; // reuse alias
|
3917
4308
|
$.each(_c.allPanes, function (i, pane) {
|
3918
4309
|
$P = $Ps[pane];
|
3919
4310
|
if (!$P) return; // SKIP
|
@@ -3928,42 +4319,29 @@ $.fn.layout = function (opts) {
|
|
3928
4319
|
/**
|
3929
4320
|
* Whenever a pane resizes or opens that has a nested layout, trigger resizeAll
|
3930
4321
|
*
|
3931
|
-
* @param {string}
|
4322
|
+
* @param {(string|Object)} evt_or_pane The pane just resized or opened
|
3932
4323
|
*/
|
3933
|
-
,
|
4324
|
+
, resizeChildren = function (evt_or_pane, skipRefresh) {
|
3934
4325
|
var pane = evtPane.call(this, evt_or_pane);
|
3935
|
-
if (!options[pane].resizeChildLayout) return;
|
3936
|
-
var $P = $Ps[pane]
|
3937
|
-
, $C = $Cs[pane]
|
3938
|
-
, d = "layout"
|
3939
|
-
, P = Instance[pane]
|
3940
|
-
, L = children[pane]
|
3941
|
-
;
|
3942
|
-
// user may have manually set EITHER instance pointer, so handle that
|
3943
|
-
if (P.child && !L) {
|
3944
|
-
// have to reverse the pointers!
|
3945
|
-
var el = P.child.container;
|
3946
|
-
L = children[pane] = (el ? el.data(d) : 0) || null; // set pointer _directly_ to layout instance
|
3947
|
-
}
|
3948
|
-
|
3949
|
-
// if a layout-pointer exists, see if child has been destroyed
|
3950
|
-
if (L && L.destroyed)
|
3951
|
-
L = children[pane] = null; // clear child pointers
|
3952
|
-
// no child layout pointer is set - see if there is a child layout NOW
|
3953
|
-
if (!L) L = children[pane] = $P.data(d) || ($C ? $C.data(d) : 0) || null; // set/update child pointers
|
3954
4326
|
|
3955
|
-
|
3956
|
-
P.child = children[pane];
|
4327
|
+
if (!options[pane].resizeChildren) return;
|
3957
4328
|
|
3958
|
-
|
4329
|
+
// ensure the pane-children are up-to-date
|
4330
|
+
if (!skipRefresh) refreshChildren( pane );
|
4331
|
+
var pC = children[pane];
|
4332
|
+
if ($.isPlainObject( pC )) {
|
4333
|
+
// resize one or more children
|
4334
|
+
$.each( pC, function (key, child) {
|
4335
|
+
if (!child.destroyed) child.resizeAll();
|
4336
|
+
});
|
4337
|
+
}
|
3959
4338
|
}
|
3960
4339
|
|
3961
|
-
|
3962
4340
|
/**
|
3963
4341
|
* IF pane has a content-div, then resize all elements inside pane to fit pane-height
|
3964
4342
|
*
|
3965
|
-
* @param {string
|
3966
|
-
* @param {boolean=}
|
4343
|
+
* @param {(string|Object)} evt_or_panes The pane(s) being resized
|
4344
|
+
* @param {boolean=} [remeasure=false] Should the content (header/footer) be remeasured?
|
3967
4345
|
*/
|
3968
4346
|
, sizeContent = function (evt_or_panes, remeasure) {
|
3969
4347
|
if (!isInitialized()) return;
|
@@ -4020,7 +4398,7 @@ $.fn.layout = function (opts) {
|
|
4020
4398
|
function _measure () {
|
4021
4399
|
var
|
4022
4400
|
ignore = options[pane].contentIgnoreSelector
|
4023
|
-
, $Fs = $C.nextAll().not(ignore ||
|
4401
|
+
, $Fs = $C.nextAll().not(".ui-layout-mask").not(ignore || ":lt(0)") // not :lt(0) = ALL
|
4024
4402
|
, $Fs_vis = $Fs.filter(':visible')
|
4025
4403
|
, $F = $Fs_vis.filter(':last')
|
4026
4404
|
;
|
@@ -4047,7 +4425,7 @@ $.fn.layout = function (opts) {
|
|
4047
4425
|
* Called every time a pane is opened, closed, or resized to slide the togglers to 'center' and adjust their length if necessary
|
4048
4426
|
*
|
4049
4427
|
* @see initHandles(), open(), close(), resizeAll()
|
4050
|
-
* @param {string=}
|
4428
|
+
* @param {(string|Object)=} evt_or_panes The pane(s) being resized
|
4051
4429
|
*/
|
4052
4430
|
, sizeHandles = function (evt_or_panes) {
|
4053
4431
|
var panes = evtPane.call(this, evt_or_panes)
|
@@ -4092,7 +4470,7 @@ $.fn.layout = function (opts) {
|
|
4092
4470
|
$R.css({
|
4093
4471
|
width: cssW($R, paneLen) // account for borders & padding
|
4094
4472
|
, height: cssH($R, spacing) // ditto
|
4095
|
-
, left: left > -9999 ? left : sC.
|
4473
|
+
, left: left > -9999 ? left : sC.inset.left // handle offscreen-panes
|
4096
4474
|
});
|
4097
4475
|
}
|
4098
4476
|
else { // east/west
|
@@ -4101,7 +4479,7 @@ $.fn.layout = function (opts) {
|
|
4101
4479
|
$R.css({
|
4102
4480
|
height: cssH($R, paneLen) // account for borders & padding
|
4103
4481
|
, width: cssW($R, spacing) // ditto
|
4104
|
-
, top: sC.
|
4482
|
+
, top: sC.inset.top + getPaneSize("north", true) // TODO: what if no North pane?
|
4105
4483
|
//, top: $.layout.cssNum($Ps["center"], "top")
|
4106
4484
|
});
|
4107
4485
|
}
|
@@ -4176,7 +4554,7 @@ $.fn.layout = function (opts) {
|
|
4176
4554
|
}
|
4177
4555
|
|
4178
4556
|
// DONE measuring and sizing this resizer/toggler, so can be 'hidden' now
|
4179
|
-
if (!state.initialized && (o.initHidden || s.
|
4557
|
+
if (!state.initialized && (o.initHidden || s.isHidden)) {
|
4180
4558
|
$R.hide();
|
4181
4559
|
if ($T) $T.hide();
|
4182
4560
|
}
|
@@ -4185,7 +4563,7 @@ $.fn.layout = function (opts) {
|
|
4185
4563
|
|
4186
4564
|
|
4187
4565
|
/**
|
4188
|
-
* @param {string}
|
4566
|
+
* @param {(string|Object)} evt_or_pane
|
4189
4567
|
*/
|
4190
4568
|
, enableClosable = function (evt_or_pane) {
|
4191
4569
|
if (!isInitialized()) return;
|
@@ -4198,12 +4576,12 @@ $.fn.layout = function (opts) {
|
|
4198
4576
|
$T .bind("click."+ sID, function(evt){ evt.stopPropagation(); toggle(pane); })
|
4199
4577
|
.css("visibility", "visible")
|
4200
4578
|
.css("cursor", "pointer")
|
4201
|
-
.attr("title", state[pane].isClosed ? o.
|
4579
|
+
.attr("title", state[pane].isClosed ? o.tips.Open : o.tips.Close) // may be blank
|
4202
4580
|
.show();
|
4203
4581
|
}
|
4204
4582
|
/**
|
4205
|
-
* @param {string}
|
4206
|
-
* @param {boolean=}
|
4583
|
+
* @param {(string|Object)} evt_or_pane
|
4584
|
+
* @param {boolean=} [hide=false]
|
4207
4585
|
*/
|
4208
4586
|
, disableClosable = function (evt_or_pane, hide) {
|
4209
4587
|
if (!isInitialized()) return;
|
@@ -4222,7 +4600,7 @@ $.fn.layout = function (opts) {
|
|
4222
4600
|
|
4223
4601
|
|
4224
4602
|
/**
|
4225
|
-
* @param {string}
|
4603
|
+
* @param {(string|Object)} evt_or_pane
|
4226
4604
|
*/
|
4227
4605
|
, enableSlidable = function (evt_or_pane) {
|
4228
4606
|
if (!isInitialized()) return;
|
@@ -4231,11 +4609,11 @@ $.fn.layout = function (opts) {
|
|
4231
4609
|
;
|
4232
4610
|
if (!$R || !$R.data('draggable')) return;
|
4233
4611
|
options[pane].slidable = true;
|
4234
|
-
if (
|
4235
|
-
|
4612
|
+
if (state[pane].isClosed)
|
4613
|
+
bindStartSlidingEvents(pane, true);
|
4236
4614
|
}
|
4237
4615
|
/**
|
4238
|
-
* @param {string}
|
4616
|
+
* @param {(string|Object)} evt_or_pane
|
4239
4617
|
*/
|
4240
4618
|
, disableSlidable = function (evt_or_pane) {
|
4241
4619
|
if (!isInitialized()) return;
|
@@ -4247,7 +4625,7 @@ $.fn.layout = function (opts) {
|
|
4247
4625
|
if (state[pane].isSliding)
|
4248
4626
|
close(pane, false, true);
|
4249
4627
|
else {
|
4250
|
-
|
4628
|
+
bindStartSlidingEvents(pane, false);
|
4251
4629
|
$R .css("cursor", "default")
|
4252
4630
|
.attr("title", "");
|
4253
4631
|
removeHover(null, $R[0]); // in case currently hovered
|
@@ -4256,7 +4634,7 @@ $.fn.layout = function (opts) {
|
|
4256
4634
|
|
4257
4635
|
|
4258
4636
|
/**
|
4259
|
-
* @param {string}
|
4637
|
+
* @param {(string|Object)} evt_or_pane
|
4260
4638
|
*/
|
4261
4639
|
, enableResizable = function (evt_or_pane) {
|
4262
4640
|
if (!isInitialized()) return;
|
@@ -4269,10 +4647,10 @@ $.fn.layout = function (opts) {
|
|
4269
4647
|
$R.draggable("enable");
|
4270
4648
|
if (!state[pane].isClosed)
|
4271
4649
|
$R .css("cursor", o.resizerCursor)
|
4272
|
-
.attr("title", o.
|
4650
|
+
.attr("title", o.tips.Resize);
|
4273
4651
|
}
|
4274
4652
|
/**
|
4275
|
-
* @param {string}
|
4653
|
+
* @param {(string|Object)} evt_or_pane
|
4276
4654
|
*/
|
4277
4655
|
, disableResizable = function (evt_or_pane) {
|
4278
4656
|
if (!isInitialized()) return;
|
@@ -4292,8 +4670,8 @@ $.fn.layout = function (opts) {
|
|
4292
4670
|
* Move a pane from source-side (eg, west) to target-side (eg, east)
|
4293
4671
|
* If pane exists on target-side, move that to source-side, ie, 'swap' the panes
|
4294
4672
|
*
|
4295
|
-
* @param {string}
|
4296
|
-
* @param {string}
|
4673
|
+
* @param {(string|Object)} evt_or_pane1 The pane/edge being swapped
|
4674
|
+
* @param {string} pane2 ditto
|
4297
4675
|
*/
|
4298
4676
|
, swapPanes = function (evt_or_pane1, pane2) {
|
4299
4677
|
if (!isInitialized()) return;
|
@@ -4372,10 +4750,8 @@ $.fn.layout = function (opts) {
|
|
4372
4750
|
, C = oPane.C
|
4373
4751
|
, oldPane = oPane.pane
|
4374
4752
|
, c = _c[pane]
|
4375
|
-
, side = c.side.toLowerCase()
|
4376
|
-
, inset = "inset"+ c.side
|
4377
4753
|
// save pane-options that should be retained
|
4378
|
-
, s = $.extend({}, state[pane])
|
4754
|
+
, s = $.extend(true, {}, state[pane])
|
4379
4755
|
, o = options[pane]
|
4380
4756
|
// RETAIN side-specific FX Settings - more below
|
4381
4757
|
, fx = { resizerCursor: o.resizerCursor }
|
@@ -4399,8 +4775,8 @@ $.fn.layout = function (opts) {
|
|
4399
4775
|
$Cs[pane] = C ? $(C) : false;
|
4400
4776
|
|
4401
4777
|
// set options and state
|
4402
|
-
options[pane] = $.extend({}, oPane.options, fx);
|
4403
|
-
state[pane] = $.extend({}, oPane.state);
|
4778
|
+
options[pane] = $.extend(true, {}, oPane.options, fx);
|
4779
|
+
state[pane] = $.extend(true, {}, oPane.state);
|
4404
4780
|
|
4405
4781
|
// change classNames on the pane, eg: ui-layout-pane-east ==> ui-layout-pane-west
|
4406
4782
|
re = new RegExp(o.paneClass +"-"+ oldPane, "g");
|
@@ -4418,7 +4794,7 @@ $.fn.layout = function (opts) {
|
|
4418
4794
|
manualSizePane(pane, size, true, true); // true/true = skipCallback/noAnimation
|
4419
4795
|
}
|
4420
4796
|
else // move the resizer here
|
4421
|
-
$Rs[pane].css(side, sC[
|
4797
|
+
$Rs[pane].css(c.side, sC.inset[c.side] + (state[pane].isVisible ? getPaneSize(pane) : 0));
|
4422
4798
|
|
4423
4799
|
|
4424
4800
|
// ADD CLASSNAMES & SLIDE-BINDINGS
|
@@ -4426,7 +4802,7 @@ $.fn.layout = function (opts) {
|
|
4426
4802
|
setAsOpen(pane, true); // true = skipCallback
|
4427
4803
|
else {
|
4428
4804
|
setAsClosed(pane);
|
4429
|
-
|
4805
|
+
bindStartSlidingEvents(pane, true); // will enable events IF option is set
|
4430
4806
|
}
|
4431
4807
|
|
4432
4808
|
// DESTROY the object
|
@@ -4560,11 +4936,11 @@ $.fn.layout = function (opts) {
|
|
4560
4936
|
curCSS.overflow = of;
|
4561
4937
|
newCSS.overflow = "visible";
|
4562
4938
|
}
|
4563
|
-
if (ofX && !ofX.match(/visible|auto/)) {
|
4939
|
+
if (ofX && !ofX.match(/(visible|auto)/)) {
|
4564
4940
|
curCSS.overflowX = ofX;
|
4565
4941
|
newCSS.overflowX = "visible";
|
4566
4942
|
}
|
4567
|
-
if (ofY && !ofY.match(/visible|auto/)) {
|
4943
|
+
if (ofY && !ofY.match(/(visible|auto)/)) {
|
4568
4944
|
curCSS.overflowY = ofX;
|
4569
4945
|
newCSS.overflowY = "visible";
|
4570
4946
|
}
|
@@ -4626,9 +5002,7 @@ $.fn.layout = function (opts) {
|
|
4626
5002
|
// validate that container exists
|
4627
5003
|
var $N = $(this).eq(0); // FIRST matching Container element
|
4628
5004
|
if (!$N.length) {
|
4629
|
-
|
4630
|
-
_log( lang.errContainerMissing, true );
|
4631
|
-
return null;
|
5005
|
+
return _log( options.errors.containerMissing );
|
4632
5006
|
};
|
4633
5007
|
|
4634
5008
|
// Users retrieve Instance of a layout with: $N.layout() OR $N.data("layout")
|
@@ -4674,11 +5048,14 @@ $.fn.layout = function (opts) {
|
|
4674
5048
|
, sizePane: manualSizePane // method - pass a 'pane' AND an 'outer-size' in pixels or percent, or 'auto'
|
4675
5049
|
, sizeContent: sizeContent // method - pass a 'pane'
|
4676
5050
|
, swapPanes: swapPanes // method - pass TWO 'panes' - will swap them
|
5051
|
+
, showMasks: showMasks // method - pass a 'pane' OR list of panes - default = all panes with mask option set
|
5052
|
+
, hideMasks: hideMasks // method - ditto'
|
4677
5053
|
// pane element methods
|
4678
5054
|
, initContent: initContent // method - ditto
|
4679
5055
|
, addPane: addPane // method - pass a 'pane'
|
4680
5056
|
, removePane: removePane // method - pass a 'pane' to remove from layout, add 'true' to delete the pane-elem
|
4681
|
-
,
|
5057
|
+
, createChildren: createChildren // method - pass a 'pane' and (optional) layout-options (OVERRIDES options[pane].children
|
5058
|
+
, refreshChildren: refreshChildren // method - pass a 'pane' and a layout-instance
|
4682
5059
|
// special pane option setting
|
4683
5060
|
, enableClosable: enableClosable // method - pass a 'pane'
|
4684
5061
|
, disableClosable: disableClosable // method - ditto
|
@@ -4697,8 +5074,8 @@ $.fn.layout = function (opts) {
|
|
4697
5074
|
, runCallbacks: _runCallbacks // method - pass evtName & pane (if a pane-event), eg: trigger("onopen", "west")
|
4698
5075
|
// alias collections of options, state and children - created in addPane and extended elsewhere
|
4699
5076
|
, hasParentLayout: false // set by initContainer()
|
4700
|
-
, children: children // pointers to child-layouts, eg: Instance.children
|
4701
|
-
, north: false // alias group: { name: pane, pane: $Ps[pane], options: options[pane], state: state[pane],
|
5077
|
+
, children: children // pointers to child-layouts, eg: Instance.children.west.layoutName
|
5078
|
+
, north: false // alias group: { name: pane, pane: $Ps[pane], options: options[pane], state: state[pane], children: children[pane] }
|
4702
5079
|
, south: false // ditto
|
4703
5080
|
, west: false // ditto
|
4704
5081
|
, east: false // ditto
|
@@ -4714,22 +5091,29 @@ $.fn.layout = function (opts) {
|
|
4714
5091
|
}
|
4715
5092
|
|
4716
5093
|
|
5094
|
+
})( jQuery );
|
5095
|
+
// END Layout - keep internal vars internal!
|
5096
|
+
|
5097
|
+
|
5098
|
+
|
5099
|
+
// START Plugins - shared wrapper, no global vars
|
5100
|
+
(function ($) {
|
4717
5101
|
|
4718
5102
|
|
4719
5103
|
/**
|
4720
5104
|
* jquery.layout.state 1.0
|
4721
5105
|
* $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $
|
4722
5106
|
*
|
4723
|
-
* Copyright (c)
|
5107
|
+
* Copyright (c) 2012
|
4724
5108
|
* Kevin Dalman (http://allpro.net)
|
4725
5109
|
*
|
4726
5110
|
* Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
|
4727
5111
|
* and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
|
4728
5112
|
*
|
4729
|
-
* @
|
4730
|
-
* @
|
5113
|
+
* @requires: UI Layout 1.3.0.rc30.1 or higher
|
5114
|
+
* @requires: $.ui.cookie (above)
|
4731
5115
|
*
|
4732
|
-
* @
|
5116
|
+
* @see: http://groups.google.com/group/jquery-ui-layout
|
4733
5117
|
*/
|
4734
5118
|
/*
|
4735
5119
|
* State-management options stored in options.stateManagement, which includes a .cookie hash
|
@@ -4776,8 +5160,7 @@ $.ui.cookie = {
|
|
4776
5160
|
acceptsCookies: !!navigator.cookieEnabled
|
4777
5161
|
|
4778
5162
|
, read: function (name) {
|
4779
|
-
var
|
4780
|
-
c = document.cookie
|
5163
|
+
var c = document.cookie
|
4781
5164
|
, cs = c ? c.split(';') : []
|
4782
5165
|
, pair // loop var
|
4783
5166
|
;
|
@@ -4785,22 +5168,25 @@ $.ui.cookie = {
|
|
4785
5168
|
pair = $.trim(cs[i]).split('='); // name=value pair
|
4786
5169
|
if (pair[0] == name) // found the layout cookie
|
4787
5170
|
return decodeURIComponent(pair[1]);
|
4788
|
-
|
4789
5171
|
}
|
4790
5172
|
return null;
|
4791
5173
|
}
|
4792
5174
|
|
4793
5175
|
, write: function (name, val, cookieOpts) {
|
4794
|
-
var
|
4795
|
-
|
4796
|
-
, date = ''
|
5176
|
+
var params = ""
|
5177
|
+
, date = ""
|
4797
5178
|
, clear = false
|
4798
5179
|
, o = cookieOpts || {}
|
4799
|
-
, x = o.expires
|
5180
|
+
, x = o.expires || null
|
5181
|
+
, t = $.type(x)
|
4800
5182
|
;
|
4801
|
-
if (
|
5183
|
+
if (t === "date")
|
4802
5184
|
date = x;
|
4803
|
-
else if (
|
5185
|
+
else if (t === "string" && x > 0) {
|
5186
|
+
x = parseInt(x,10);
|
5187
|
+
t = "number";
|
5188
|
+
}
|
5189
|
+
if (t === "number") {
|
4804
5190
|
date = new Date();
|
4805
5191
|
if (x > 0)
|
4806
5192
|
date.setDate(date.getDate() + x);
|
@@ -4809,15 +5195,15 @@ $.ui.cookie = {
|
|
4809
5195
|
clear = true;
|
4810
5196
|
}
|
4811
5197
|
}
|
4812
|
-
if (date) params +=
|
4813
|
-
if (o.path) params +=
|
4814
|
-
if (o.domain) params +=
|
4815
|
-
if (o.secure) params +=
|
4816
|
-
document.cookie = name +
|
5198
|
+
if (date) params += ";expires="+ date.toUTCString();
|
5199
|
+
if (o.path) params += ";path="+ o.path;
|
5200
|
+
if (o.domain) params += ";domain="+ o.domain;
|
5201
|
+
if (o.secure) params += ";secure";
|
5202
|
+
document.cookie = name +"="+ (clear ? "" : encodeURIComponent( val )) + params; // write or clear cookie
|
4817
5203
|
}
|
4818
5204
|
|
4819
5205
|
, clear: function (name) {
|
4820
|
-
$.ui.cookie.write(name,
|
5206
|
+
$.ui.cookie.write(name, "", {expires: -1});
|
4821
5207
|
}
|
4822
5208
|
|
4823
5209
|
};
|
@@ -4840,9 +5226,11 @@ $.layout.plugins.stateManagement = true;
|
|
4840
5226
|
// Add State-Management options to layout.defaults
|
4841
5227
|
$.layout.config.optionRootKeys.push("stateManagement");
|
4842
5228
|
$.layout.defaults.stateManagement = {
|
4843
|
-
enabled:
|
4844
|
-
, autoSave:
|
4845
|
-
, autoLoad:
|
5229
|
+
enabled: false // true = enable state-management, even if not using cookies
|
5230
|
+
, autoSave: true // Save a state-cookie when page exits?
|
5231
|
+
, autoLoad: true // Load the state-cookie when Layout inits?
|
5232
|
+
, animateLoad: true // animate panes when loading state into an active layout
|
5233
|
+
, includeChildren: true // recurse into child layouts to include their state as well
|
4846
5234
|
// List state-data to save - must be pane-specific
|
4847
5235
|
, stateKeys: "north.size,south.size,east.size,west.size,"+
|
4848
5236
|
"north.isClosed,south.isClosed,east.isClosed,west.isClosed,"+
|
@@ -4850,7 +5238,7 @@ $.layout.defaults.stateManagement = {
|
|
4850
5238
|
, cookie: {
|
4851
5239
|
name: "" // If not specified, will use Layout.name, else just "Layout"
|
4852
5240
|
, domain: "" // blank = current domain
|
4853
|
-
, path: "" // blank = current page,
|
5241
|
+
, path: "" // blank = current page, "/" = entire website
|
4854
5242
|
, expires: "" // 'days' to keep cookie - leave blank for 'session cookie'
|
4855
5243
|
, secure: false
|
4856
5244
|
}
|
@@ -4870,13 +5258,13 @@ $.layout.state = {
|
|
4870
5258
|
*
|
4871
5259
|
* @param {Object} inst
|
4872
5260
|
* @param {(string|Array)=} keys
|
4873
|
-
* @param {Object=}
|
5261
|
+
* @param {Object=} cookieOpts
|
4874
5262
|
*/
|
4875
5263
|
saveCookie: function (inst, keys, cookieOpts) {
|
4876
5264
|
var o = inst.options
|
4877
|
-
,
|
4878
|
-
, oC = $.extend(true, {},
|
4879
|
-
, data = inst.state.stateData = inst.readState( keys ||
|
5265
|
+
, sm = o.stateManagement
|
5266
|
+
, oC = $.extend(true, {}, sm.cookie, cookieOpts || null)
|
5267
|
+
, data = inst.state.stateData = inst.readState( keys || sm.stateKeys ) // read current panes-state
|
4880
5268
|
;
|
4881
5269
|
$.ui.cookie.write( oC.name || o.name || "Layout", $.layout.state.encodeJSON(data), oC );
|
4882
5270
|
return $.extend(true, {}, data); // return COPY of state.stateData data
|
@@ -4917,7 +5305,7 @@ $.layout.state = {
|
|
4917
5305
|
}
|
4918
5306
|
return c;
|
4919
5307
|
}
|
4920
|
-
|
5308
|
+
|
4921
5309
|
/**
|
4922
5310
|
* Update layout options from the cookie, if one exists
|
4923
5311
|
*
|
@@ -4925,52 +5313,107 @@ $.layout.state = {
|
|
4925
5313
|
* @param {Object=} stateData
|
4926
5314
|
* @param {boolean=} animate
|
4927
5315
|
*/
|
4928
|
-
, loadState: function (inst,
|
4929
|
-
|
4930
|
-
|
4931
|
-
|
4932
|
-
|
4933
|
-
|
4934
|
-
|
4935
|
-
|
5316
|
+
, loadState: function (inst, data, opts) {
|
5317
|
+
if (!$.isPlainObject( data ) || $.isEmptyObject( data )) return;
|
5318
|
+
|
5319
|
+
// normalize data & cache in the state object
|
5320
|
+
data = inst.state.stateData = $.layout.transformData( data ); // panes = default subkey
|
5321
|
+
|
5322
|
+
// add missing/default state-restore options
|
5323
|
+
var smo = inst.options.stateManagement;
|
5324
|
+
opts = $.extend({
|
5325
|
+
animateLoad: false //smo.animateLoad
|
5326
|
+
, includeChildren: smo.includeChildren
|
5327
|
+
}, opts );
|
5328
|
+
|
5329
|
+
if (!inst.state.initialized) {
|
5330
|
+
/*
|
5331
|
+
* layout NOT initialized, so just update its options
|
5332
|
+
*/
|
5333
|
+
// MUST remove pane.children keys before applying to options
|
5334
|
+
// use a copy so we don't remove keys from original data
|
5335
|
+
var o = $.extend(true, {}, data);
|
5336
|
+
//delete o.center; // center has no state-data - only children
|
5337
|
+
$.each($.layout.config.allPanes, function (idx, pane) {
|
5338
|
+
if (o[pane]) delete o[pane].children;
|
5339
|
+
});
|
5340
|
+
// update CURRENT layout-options with saved state data
|
5341
|
+
$.extend(true, inst.options, o);
|
5342
|
+
}
|
5343
|
+
else {
|
5344
|
+
/*
|
5345
|
+
* layout already initialized, so modify layout's configuration
|
5346
|
+
*/
|
5347
|
+
var noAnimate = !opts.animateLoad
|
5348
|
+
, o, c, h, state, open
|
4936
5349
|
;
|
4937
5350
|
$.each($.layout.config.borderPanes, function (idx, pane) {
|
4938
|
-
|
4939
|
-
o
|
4940
|
-
|
5351
|
+
o = data[ pane ];
|
5352
|
+
if (!$.isPlainObject( o )) return; // no key, skip pane
|
5353
|
+
|
4941
5354
|
s = o.size;
|
4942
5355
|
c = o.initClosed;
|
4943
5356
|
h = o.initHidden;
|
4944
|
-
|
5357
|
+
ar = o.autoResize
|
5358
|
+
state = inst.state[pane];
|
5359
|
+
open = state.isVisible;
|
5360
|
+
|
5361
|
+
// reset autoResize
|
5362
|
+
if (ar)
|
5363
|
+
state.autoResize = ar;
|
4945
5364
|
// resize BEFORE opening
|
4946
|
-
if (!
|
4947
|
-
inst.
|
5365
|
+
if (!open)
|
5366
|
+
inst._sizePane(pane, s, false, false, false); // false=skipCallback/noAnimation/forceResize
|
5367
|
+
// open/close as necessary - DO NOT CHANGE THIS ORDER!
|
4948
5368
|
if (h === true) inst.hide(pane, noAnimate);
|
4949
|
-
else if (c === false) inst.open (pane, false, noAnimate);
|
4950
5369
|
else if (c === true) inst.close(pane, false, noAnimate);
|
5370
|
+
else if (c === false) inst.open (pane, false, noAnimate);
|
4951
5371
|
else if (h === false) inst.show (pane, false, noAnimate);
|
4952
5372
|
// resize AFTER any other actions
|
4953
|
-
if (
|
4954
|
-
inst.
|
5373
|
+
if (open)
|
5374
|
+
inst._sizePane(pane, s, false, false, noAnimate); // animate resize if option passed
|
4955
5375
|
});
|
4956
|
-
|
5376
|
+
|
5377
|
+
/*
|
5378
|
+
* RECURSE INTO CHILD-LAYOUTS
|
5379
|
+
*/
|
5380
|
+
if (opts.includeChildren) {
|
5381
|
+
var paneStateChildren, childState;
|
5382
|
+
$.each(inst.children, function (pane, paneChildren) {
|
5383
|
+
paneStateChildren = data[pane] ? data[pane].children : 0;
|
5384
|
+
if (paneStateChildren && paneChildren) {
|
5385
|
+
$.each(paneChildren, function (stateKey, child) {
|
5386
|
+
childState = paneStateChildren[stateKey];
|
5387
|
+
if (child && childState)
|
5388
|
+
child.loadState( childState );
|
5389
|
+
});
|
5390
|
+
}
|
5391
|
+
});
|
5392
|
+
}
|
5393
|
+
}
|
4957
5394
|
}
|
4958
5395
|
|
4959
5396
|
/**
|
4960
5397
|
* Get the *current layout state* and return it as a hash
|
4961
5398
|
*
|
4962
|
-
* @param {Object=}
|
4963
|
-
* @param {
|
5399
|
+
* @param {Object=} inst // Layout instance to get state for
|
5400
|
+
* @param {object=} [opts] // State-Managements override options
|
4964
5401
|
*/
|
4965
|
-
, readState: function (inst,
|
4966
|
-
|
4967
|
-
|
5402
|
+
, readState: function (inst, opts) {
|
5403
|
+
// backward compatility
|
5404
|
+
if ($.type(opts) === 'string') opts = { keys: opts };
|
5405
|
+
if (!opts) opts = {};
|
5406
|
+
var sm = inst.options.stateManagement
|
5407
|
+
, ic = opts.includeChildren
|
5408
|
+
, recurse = ic !== undefined ? ic : sm.includeChildren
|
5409
|
+
, keys = opts.stateKeys || sm.stateKeys
|
4968
5410
|
, alt = { isClosed: 'initClosed', isHidden: 'initHidden' }
|
4969
5411
|
, state = inst.state
|
4970
5412
|
, panes = $.layout.config.allPanes
|
5413
|
+
, data = {}
|
4971
5414
|
, pair, pane, key, val
|
5415
|
+
, ps, pC, child, array, count, branch
|
4972
5416
|
;
|
4973
|
-
if (!keys) keys = inst.options.stateManagement.stateKeys; // if called by user
|
4974
5417
|
if ($.isArray(keys)) keys = keys.join(",");
|
4975
5418
|
// convert keys to an array and change delimiters from '__' to '.'
|
4976
5419
|
keys = keys.replace(/__/g, ".").split(',');
|
@@ -4986,6 +5429,29 @@ $.layout.state = {
|
|
4986
5429
|
val = true; // if sliding, then *really* isClosed
|
4987
5430
|
( data[pane] || (data[pane]={}) )[ alt[key] ? alt[key] : key ] = val;
|
4988
5431
|
}
|
5432
|
+
|
5433
|
+
// recurse into the child-layouts for each pane
|
5434
|
+
if (recurse) {
|
5435
|
+
$.each(panes, function (idx, pane) {
|
5436
|
+
pC = inst.children[pane];
|
5437
|
+
ps = state.stateData[pane];
|
5438
|
+
if ($.isPlainObject( pC ) && !$.isEmptyObject( pC )) {
|
5439
|
+
// ensure a key exists for this 'pane', eg: branch = data.center
|
5440
|
+
branch = data[pane] || (data[pane] = {});
|
5441
|
+
if (!branch.children) branch.children = {};
|
5442
|
+
$.each( pC, function (key, child) {
|
5443
|
+
// ONLY read state from an initialize layout
|
5444
|
+
if ( child.state.initialized )
|
5445
|
+
branch.children[ key ] = $.layout.state.readState( child );
|
5446
|
+
// if we have PREVIOUS (onLoad) state for this child-layout, KEEP IT!
|
5447
|
+
else if ( ps && ps.children && ps.children[ key ] ) {
|
5448
|
+
branch.children[ key ] = $.extend(true, {}, ps.children[ key ] );
|
5449
|
+
}
|
5450
|
+
});
|
5451
|
+
}
|
5452
|
+
});
|
5453
|
+
}
|
5454
|
+
|
4989
5455
|
return data;
|
4990
5456
|
}
|
4991
5457
|
|
@@ -4995,7 +5461,9 @@ $.layout.state = {
|
|
4995
5461
|
, encodeJSON: function (JSON) {
|
4996
5462
|
return parse(JSON);
|
4997
5463
|
function parse (h) {
|
4998
|
-
var D=[], i=0, k, v, t
|
5464
|
+
var D=[], i=0, k, v, t // k = key, v = value
|
5465
|
+
, a = $.isArray(h)
|
5466
|
+
;
|
4999
5467
|
for (k in h) {
|
5000
5468
|
v = h[k];
|
5001
5469
|
t = typeof v;
|
@@ -5003,9 +5471,9 @@ $.layout.state = {
|
|
5003
5471
|
v = '"'+ v +'"';
|
5004
5472
|
else if (t == 'object') // SUB-KEY - recurse into it
|
5005
5473
|
v = parse(v);
|
5006
|
-
D[i++] = '"'+ k +'":'+ v;
|
5474
|
+
D[i++] = (!a ? '"'+ k +'":' : '') + v;
|
5007
5475
|
}
|
5008
|
-
return '{'+ D.join(',') +'}';
|
5476
|
+
return (a ? '[' : '{') + D.join(',') + (a ? ']' : '}');
|
5009
5477
|
};
|
5010
5478
|
}
|
5011
5479
|
|
@@ -5020,7 +5488,10 @@ $.layout.state = {
|
|
5020
5488
|
|
5021
5489
|
|
5022
5490
|
, _create: function (inst) {
|
5023
|
-
var _ = $.layout.state
|
5491
|
+
var _ = $.layout.state
|
5492
|
+
, o = inst.options
|
5493
|
+
, sm = o.stateManagement
|
5494
|
+
;
|
5024
5495
|
// ADD State-Management plugin methods to inst
|
5025
5496
|
$.extend( inst, {
|
5026
5497
|
// readCookie - update options from cookie - returns hash of cookie data
|
@@ -5032,7 +5503,7 @@ $.layout.state = {
|
|
5032
5503
|
// loadCookie - readCookie and use to loadState() - returns hash of cookie data
|
5033
5504
|
, loadCookie: function () { return _.loadCookie(inst); }
|
5034
5505
|
// loadState - pass a hash of state to use to update options
|
5035
|
-
, loadState: function (stateData,
|
5506
|
+
, loadState: function (stateData, opts) { _.loadState(inst, stateData, opts); }
|
5036
5507
|
// readState - returns hash of current layout-state
|
5037
5508
|
, readState: function (keys) { return _.readState(inst, keys); }
|
5038
5509
|
// add JSON utility methods too...
|
@@ -5043,23 +5514,43 @@ $.layout.state = {
|
|
5043
5514
|
// init state.stateData key, even if plugin is initially disabled
|
5044
5515
|
inst.state.stateData = {};
|
5045
5516
|
|
5046
|
-
//
|
5047
|
-
|
5048
|
-
|
5049
|
-
|
5517
|
+
// autoLoad MUST BE one of: data-array, data-hash, callback-function, or TRUE
|
5518
|
+
if ( !sm.autoLoad ) return;
|
5519
|
+
|
5520
|
+
// When state-data exists in the autoLoad key USE IT,
|
5521
|
+
// even if stateManagement.enabled == false
|
5522
|
+
if ($.isPlainObject( sm.autoLoad )) {
|
5523
|
+
if (!$.isEmptyObject( sm.autoLoad )) {
|
5524
|
+
inst.loadState( sm.autoLoad );
|
5525
|
+
}
|
5526
|
+
}
|
5527
|
+
else if ( sm.enabled ) {
|
5528
|
+
// update the options from cookie or callback
|
5529
|
+
// if options is a function, call it to get stateData
|
5530
|
+
if ($.isFunction( sm.autoLoad )) {
|
5531
|
+
var d = {};
|
5532
|
+
try {
|
5533
|
+
d = sm.autoLoad( inst, inst.state, inst.options, inst.options.name || '' ); // try to get data from fn
|
5534
|
+
} catch (e) {}
|
5535
|
+
if (d && $.isPlainObject( d ) && !$.isEmptyObject( d ))
|
5536
|
+
inst.loadState(d);
|
5537
|
+
}
|
5538
|
+
else // any other truthy value will trigger loadCookie
|
5050
5539
|
inst.loadCookie();
|
5051
|
-
else // don't modify options - just store cookie data in state.stateData
|
5052
|
-
inst.state.stateData = inst.readCookie();
|
5053
5540
|
}
|
5054
5541
|
}
|
5055
5542
|
|
5056
5543
|
, _unload: function (inst) {
|
5057
|
-
var
|
5058
|
-
if (
|
5059
|
-
if
|
5544
|
+
var sm = inst.options.stateManagement;
|
5545
|
+
if (sm.enabled && sm.autoSave) {
|
5546
|
+
// if options is a function, call it to save the stateData
|
5547
|
+
if ($.isFunction( sm.autoSave )) {
|
5548
|
+
try {
|
5549
|
+
sm.autoSave( inst, inst.state, inst.options, inst.options.name || '' ); // try to get data from fn
|
5550
|
+
} catch (e) {}
|
5551
|
+
}
|
5552
|
+
else // any truthy value will trigger saveCookie
|
5060
5553
|
inst.saveCookie();
|
5061
|
-
else // don't save a cookie, but do store state-data in state.stateData key
|
5062
|
-
inst.state.stateData = inst.readState();
|
5063
5554
|
}
|
5064
5555
|
}
|
5065
5556
|
|
@@ -5076,15 +5567,15 @@ $.layout.onUnload.push( $.layout.state._unload );
|
|
5076
5567
|
* jquery.layout.buttons 1.0
|
5077
5568
|
* $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $
|
5078
5569
|
*
|
5079
|
-
* Copyright (c)
|
5570
|
+
* Copyright (c) 2012
|
5080
5571
|
* Kevin Dalman (http://allpro.net)
|
5081
5572
|
*
|
5082
5573
|
* Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
|
5083
5574
|
* and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
|
5084
5575
|
*
|
5085
|
-
* @
|
5576
|
+
* @requires: UI Layout 1.3.0.rc30.1 or higher
|
5086
5577
|
*
|
5087
|
-
* @
|
5578
|
+
* @see: http://groups.google.com/group/jquery-ui-layout
|
5088
5579
|
*
|
5089
5580
|
* Docs: [ to come ]
|
5090
5581
|
* Tips: [ to come ]
|
@@ -5098,8 +5589,6 @@ $.layout.defaults.autoBindCustomButtons = false;
|
|
5098
5589
|
// Specify autoBindCustomButtons as a layout-option, NOT a pane-option
|
5099
5590
|
$.layout.optionsMap.layout.push("autoBindCustomButtons");
|
5100
5591
|
|
5101
|
-
var lang = $.layout.language;
|
5102
|
-
|
5103
5592
|
/*
|
5104
5593
|
* Button methods
|
5105
5594
|
*/
|
@@ -5148,13 +5637,13 @@ $.layout.buttons = {
|
|
5148
5637
|
, get: function (inst, selector, pane, action) {
|
5149
5638
|
var $E = $(selector)
|
5150
5639
|
, o = inst.options
|
5151
|
-
, err = o.
|
5640
|
+
, err = o.errors.addButtonError
|
5152
5641
|
;
|
5153
5642
|
if (!$E.length) { // element not found
|
5154
|
-
|
5643
|
+
$.layout.msg(err +" "+ o.errors.selector +": "+ selector, true);
|
5155
5644
|
}
|
5156
5645
|
else if ($.inArray(pane, $.layout.config.borderPanes) < 0) { // invalid 'pane' sepecified
|
5157
|
-
|
5646
|
+
$.layout.msg(err +" "+ o.errors.pane +": "+ pane, true);
|
5158
5647
|
$E = $(""); // NO BUTTON
|
5159
5648
|
}
|
5160
5649
|
else { // VALID
|
@@ -5214,7 +5703,7 @@ $.layout.buttons = {
|
|
5214
5703
|
*/
|
5215
5704
|
, addOpen: function (inst, selector, pane, slide) {
|
5216
5705
|
$.layout.buttons.get(inst, selector, pane, "open")
|
5217
|
-
.attr("title",
|
5706
|
+
.attr("title", inst.options[pane].tips.Open)
|
5218
5707
|
.click(function (evt) {
|
5219
5708
|
inst.open(pane, !!slide);
|
5220
5709
|
evt.stopPropagation();
|
@@ -5231,7 +5720,7 @@ $.layout.buttons = {
|
|
5231
5720
|
*/
|
5232
5721
|
, addClose: function (inst, selector, pane) {
|
5233
5722
|
$.layout.buttons.get(inst, selector, pane, "close")
|
5234
|
-
.attr("title",
|
5723
|
+
.attr("title", inst.options[pane].tips.Close)
|
5235
5724
|
.click(function (evt) {
|
5236
5725
|
inst.close(pane);
|
5237
5726
|
evt.stopPropagation();
|
@@ -5287,14 +5776,15 @@ $.layout.buttons = {
|
|
5287
5776
|
var updown = $Pin.attr("pin");
|
5288
5777
|
if (updown && doPin === (updown=="down")) return; // already in correct state
|
5289
5778
|
var
|
5290
|
-
|
5779
|
+
o = inst.options[pane]
|
5780
|
+
, pin = o.buttonClass +"-pin"
|
5291
5781
|
, side = pin +"-"+ pane
|
5292
5782
|
, UP = pin +"-up "+ side +"-up"
|
5293
5783
|
, DN = pin +"-down "+side +"-down"
|
5294
5784
|
;
|
5295
5785
|
$Pin
|
5296
5786
|
.attr("pin", doPin ? "down" : "up") // logic
|
5297
|
-
.attr("title", doPin ?
|
5787
|
+
.attr("title", doPin ? o.tips.Unpin : o.tips.Pin)
|
5298
5788
|
.removeClass( doPin ? UP : DN )
|
5299
5789
|
.addClass( doPin ? DN : UP )
|
5300
5790
|
;
|
@@ -5312,7 +5802,7 @@ $.layout.buttons = {
|
|
5312
5802
|
*/
|
5313
5803
|
, syncPinBtns: function (inst, pane, doPin) {
|
5314
5804
|
// REAL METHOD IS _INSIDE_ LAYOUT - THIS IS HERE JUST FOR REFERENCE
|
5315
|
-
$.each(state[pane].pins, function (i, selector) {
|
5805
|
+
$.each(inst.state[pane].pins, function (i, selector) {
|
5316
5806
|
$.layout.buttons.setPinState(inst, $(selector), pane, doPin);
|
5317
5807
|
});
|
5318
5808
|
}
|
@@ -5364,12 +5854,12 @@ $.layout.onLoad.push( $.layout.buttons._load );
|
|
5364
5854
|
* Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
|
5365
5855
|
* and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
|
5366
5856
|
*
|
5367
|
-
* @
|
5857
|
+
* @requires: UI Layout 1.3.0.rc30.1 or higher
|
5368
5858
|
*
|
5369
|
-
* @
|
5859
|
+
* @see: http://groups.google.com/group/jquery-ui-layout
|
5370
5860
|
*
|
5371
|
-
*
|
5372
|
-
*
|
5861
|
+
* TODO: Extend logic to handle other problematic zooming in browsers
|
5862
|
+
* TODO: Add hotkey/mousewheel bindings to _instantly_ respond to these zoom event
|
5373
5863
|
*/
|
5374
5864
|
|
5375
5865
|
// tell Layout that the plugin is available
|
@@ -5426,7 +5916,7 @@ $.layout.browserZoom = {
|
|
5426
5916
|
|| !b.msie
|
5427
5917
|
) return false; // don't need to track zoom
|
5428
5918
|
|
5429
|
-
if (s.deviceXDPI)
|
5919
|
+
if (s.deviceXDPI && s.systemXDPI) // syntax compiler hack
|
5430
5920
|
return calc(s.deviceXDPI, s.systemXDPI);
|
5431
5921
|
// everything below is just for future reference!
|
5432
5922
|
if (b.webkit && (r = d.body.getBoundingClientRect))
|
@@ -5445,5 +5935,4 @@ $.layout.browserZoom = {
|
|
5445
5935
|
$.layout.onReady.push( $.layout.browserZoom._init );
|
5446
5936
|
|
5447
5937
|
|
5448
|
-
|
5449
5938
|
})( jQuery );
|