3 <title>The source code</title>
\r
4 <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
\r
5 <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
\r
7 <body onload="prettyPrint();">
\r
8 <pre class="prettyprint lang-js"><div id="cls-Ext.SplitBar"></div>/**
\r
9 * @class Ext.SplitBar
\r
10 * @extends Ext.util.Observable
\r
11 * Creates draggable splitter bar functionality from two elements (element to be dragged and element to be resized).
\r
15 var split = new Ext.SplitBar("elementToDrag", "elementToSize",
\r
16 Ext.SplitBar.HORIZONTAL, Ext.SplitBar.LEFT);
\r
17 split.setAdapter(new Ext.SplitBar.AbsoluteLayoutAdapter("container"));
\r
18 split.minSize = 100;
\r
19 split.maxSize = 600;
\r
20 split.animate = true;
\r
21 split.on('moved', splitterMoved);
\r
24 * Create a new SplitBar
\r
25 * @param {Mixed} dragElement The element to be dragged and act as the SplitBar.
\r
26 * @param {Mixed} resizingElement The element to be resized based on where the SplitBar element is dragged
\r
27 * @param {Number} orientation (optional) Either Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
\r
28 * @param {Number} placement (optional) Either Ext.SplitBar.LEFT or Ext.SplitBar.RIGHT for horizontal or
\r
29 Ext.SplitBar.TOP or Ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the initial
\r
30 position of the SplitBar).
\r
32 Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
\r
35 this.el = Ext.get(dragElement, true);
\r
36 this.el.dom.unselectable = "on";
\r
38 this.resizingEl = Ext.get(resizingElement, true);
\r
42 * The orientation of the split. Either Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
\r
43 * Note: If this is changed after creating the SplitBar, the placement property must be manually updated
\r
46 this.orientation = orientation || Ext.SplitBar.HORIZONTAL;
\r
48 <div id="prop-Ext.SplitBar-tickSize"></div>/**
\r
49 * The increment, in pixels by which to move this SplitBar. When <i>undefined</i>, the SplitBar moves smoothly.
\r
51 * @property tickSize
\r
53 <div id="prop-Ext.SplitBar-minSize"></div>/**
\r
54 * The minimum size of the resizing element. (Defaults to 0)
\r
59 <div id="prop-Ext.SplitBar-maxSize"></div>/**
\r
60 * The maximum size of the resizing element. (Defaults to 2000)
\r
63 this.maxSize = 2000;
\r
65 <div id="prop-Ext.SplitBar-animate"></div>/**
\r
66 * Whether to animate the transition to the new size
\r
69 this.animate = false;
\r
71 <div id="prop-Ext.SplitBar-useShim"></div>/**
\r
72 * Whether to create a transparent shim that overlays the page when dragging, enables dragging across iframes.
\r
75 this.useShim = false;
\r
82 this.proxy = Ext.SplitBar.createProxy(this.orientation);
\r
84 this.proxy = Ext.get(existingProxy).dom;
\r
87 this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});
\r
90 this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
\r
93 this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
\r
96 this.dragSpecs = {};
\r
99 * @private The adapter to use to positon and resize elements
\r
101 this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
\r
102 this.adapter.init(this);
\r
104 if(this.orientation == Ext.SplitBar.HORIZONTAL){
\r
106 this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
\r
107 this.el.addClass("x-splitbar-h");
\r
110 this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
\r
111 this.el.addClass("x-splitbar-v");
\r
115 <div id="event-Ext.SplitBar-resize"></div>/**
\r
117 * Fires when the splitter is moved (alias for {@link #moved})
\r
118 * @param {Ext.SplitBar} this
\r
119 * @param {Number} newSize the new width or height
\r
122 <div id="event-Ext.SplitBar-moved"></div>/**
\r
124 * Fires when the splitter is moved
\r
125 * @param {Ext.SplitBar} this
\r
126 * @param {Number} newSize the new width or height
\r
129 <div id="event-Ext.SplitBar-beforeresize"></div>/**
\r
130 * @event beforeresize
\r
131 * Fires before the splitter is dragged
\r
132 * @param {Ext.SplitBar} this
\r
139 Ext.SplitBar.superclass.constructor.call(this);
\r
142 Ext.extend(Ext.SplitBar, Ext.util.Observable, {
\r
143 onStartProxyDrag : function(x, y){
\r
144 this.fireEvent("beforeresize", this);
\r
145 this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: " "}, true);
\r
146 this.overlay.unselectable();
\r
147 this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
\r
148 this.overlay.show();
\r
149 Ext.get(this.proxy).setDisplayed("block");
\r
150 var size = this.adapter.getElementSize(this);
\r
151 this.activeMinSize = this.getMinimumSize();
\r
152 this.activeMaxSize = this.getMaximumSize();
\r
153 var c1 = size - this.activeMinSize;
\r
154 var c2 = Math.max(this.activeMaxSize - size, 0);
\r
155 if(this.orientation == Ext.SplitBar.HORIZONTAL){
\r
156 this.dd.resetConstraints();
\r
157 this.dd.setXConstraint(
\r
158 this.placement == Ext.SplitBar.LEFT ? c1 : c2,
\r
159 this.placement == Ext.SplitBar.LEFT ? c2 : c1,
\r
162 this.dd.setYConstraint(0, 0);
\r
164 this.dd.resetConstraints();
\r
165 this.dd.setXConstraint(0, 0);
\r
166 this.dd.setYConstraint(
\r
167 this.placement == Ext.SplitBar.TOP ? c1 : c2,
\r
168 this.placement == Ext.SplitBar.TOP ? c2 : c1,
\r
172 this.dragSpecs.startSize = size;
\r
173 this.dragSpecs.startPoint = [x, y];
\r
174 Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
\r
178 * @private Called after the drag operation by the DDProxy
\r
180 onEndProxyDrag : function(e){
\r
181 Ext.get(this.proxy).setDisplayed(false);
\r
182 var endPoint = Ext.lib.Event.getXY(e);
\r
184 Ext.destroy(this.overlay);
\r
185 delete this.overlay;
\r
188 if(this.orientation == Ext.SplitBar.HORIZONTAL){
\r
189 newSize = this.dragSpecs.startSize +
\r
190 (this.placement == Ext.SplitBar.LEFT ?
\r
191 endPoint[0] - this.dragSpecs.startPoint[0] :
\r
192 this.dragSpecs.startPoint[0] - endPoint[0]
\r
195 newSize = this.dragSpecs.startSize +
\r
196 (this.placement == Ext.SplitBar.TOP ?
\r
197 endPoint[1] - this.dragSpecs.startPoint[1] :
\r
198 this.dragSpecs.startPoint[1] - endPoint[1]
\r
201 newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
\r
202 if(newSize != this.dragSpecs.startSize){
\r
203 if(this.fireEvent('beforeapply', this, newSize) !== false){
\r
204 this.adapter.setElementSize(this, newSize);
\r
205 this.fireEvent("moved", this, newSize);
\r
206 this.fireEvent("resize", this, newSize);
\r
211 <div id="method-Ext.SplitBar-getAdapter"></div>/**
\r
212 * Get the adapter this SplitBar uses
\r
213 * @return The adapter object
\r
215 getAdapter : function(){
\r
216 return this.adapter;
\r
219 <div id="method-Ext.SplitBar-setAdapter"></div>/**
\r
220 * Set the adapter this SplitBar uses
\r
221 * @param {Object} adapter A SplitBar adapter object
\r
223 setAdapter : function(adapter){
\r
224 this.adapter = adapter;
\r
225 this.adapter.init(this);
\r
228 <div id="method-Ext.SplitBar-getMinimumSize"></div>/**
\r
229 * Gets the minimum size for the resizing element
\r
230 * @return {Number} The minimum size
\r
232 getMinimumSize : function(){
\r
233 return this.minSize;
\r
236 <div id="method-Ext.SplitBar-setMinimumSize"></div>/**
\r
237 * Sets the minimum size for the resizing element
\r
238 * @param {Number} minSize The minimum size
\r
240 setMinimumSize : function(minSize){
\r
241 this.minSize = minSize;
\r
244 <div id="method-Ext.SplitBar-getMaximumSize"></div>/**
\r
245 * Gets the maximum size for the resizing element
\r
246 * @return {Number} The maximum size
\r
248 getMaximumSize : function(){
\r
249 return this.maxSize;
\r
252 <div id="method-Ext.SplitBar-setMaximumSize"></div>/**
\r
253 * Sets the maximum size for the resizing element
\r
254 * @param {Number} maxSize The maximum size
\r
256 setMaximumSize : function(maxSize){
\r
257 this.maxSize = maxSize;
\r
260 <div id="method-Ext.SplitBar-setCurrentSize"></div>/**
\r
261 * Sets the initialize size for the resizing element
\r
262 * @param {Number} size The initial size
\r
264 setCurrentSize : function(size){
\r
265 var oldAnimate = this.animate;
\r
266 this.animate = false;
\r
267 this.adapter.setElementSize(this, size);
\r
268 this.animate = oldAnimate;
\r
271 <div id="method-Ext.SplitBar-destroy"></div>/**
\r
272 * Destroy this splitbar.
\r
273 * @param {Boolean} removeEl True to remove the element
\r
275 destroy : function(removeEl){
\r
276 Ext.destroy(this.shim, Ext.get(this.proxy));
\r
281 this.purgeListeners();
\r
286 * @private static Create our own proxy element element. So it will be the same same size on all browsers, we won't use borders. Instead we use a background color.
\r
288 Ext.SplitBar.createProxy = function(dir){
\r
289 var proxy = new Ext.Element(document.createElement("div"));
\r
290 proxy.unselectable();
\r
291 var cls = 'x-splitbar-proxy';
\r
292 proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
\r
293 document.body.appendChild(proxy.dom);
\r
297 <div id="cls-Ext.SplitBar.BasicLayoutAdapter"></div>/**
\r
298 * @class Ext.SplitBar.BasicLayoutAdapter
\r
299 * Default Adapter. It assumes the splitter and resizing element are not positioned
\r
300 * elements and only gets/sets the width of the element. Generally used for table based layouts.
\r
302 Ext.SplitBar.BasicLayoutAdapter = function(){
\r
305 Ext.SplitBar.BasicLayoutAdapter.prototype = {
\r
306 // do nothing for now
\r
307 init : function(s){
\r
310 <div id="method-Ext.SplitBar.BasicLayoutAdapter-getElementSize"></div>/**
\r
311 * Called before drag operations to get the current size of the resizing element.
\r
312 * @param {Ext.SplitBar} s The SplitBar using this adapter
\r
314 getElementSize : function(s){
\r
315 if(s.orientation == Ext.SplitBar.HORIZONTAL){
\r
316 return s.resizingEl.getWidth();
\r
318 return s.resizingEl.getHeight();
\r
322 <div id="method-Ext.SplitBar.BasicLayoutAdapter-setElementSize"></div>/**
\r
323 * Called after drag operations to set the size of the resizing element.
\r
324 * @param {Ext.SplitBar} s The SplitBar using this adapter
\r
325 * @param {Number} newSize The new size to set
\r
326 * @param {Function} onComplete A function to be invoked when resizing is complete
\r
328 setElementSize : function(s, newSize, onComplete){
\r
329 if(s.orientation == Ext.SplitBar.HORIZONTAL){
\r
331 s.resizingEl.setWidth(newSize);
\r
333 onComplete(s, newSize);
\r
336 s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
\r
341 s.resizingEl.setHeight(newSize);
\r
343 onComplete(s, newSize);
\r
346 s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
\r
352 <div id="cls-Ext.SplitBar.AbsoluteLayoutAdapter"></div>/**
\r
353 *@class Ext.SplitBar.AbsoluteLayoutAdapter
\r
354 * @extends Ext.SplitBar.BasicLayoutAdapter
\r
355 * Adapter that moves the splitter element to align with the resized sizing element.
\r
356 * Used with an absolute positioned SplitBar.
\r
357 * @param {Mixed} container The container that wraps around the absolute positioned content. If it's
\r
358 * document.body, make sure you assign an id to the body element.
\r
360 Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
\r
361 this.basic = new Ext.SplitBar.BasicLayoutAdapter();
\r
362 this.container = Ext.get(container);
\r
365 Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
\r
366 init : function(s){
\r
367 this.basic.init(s);
\r
370 getElementSize : function(s){
\r
371 return this.basic.getElementSize(s);
\r
374 setElementSize : function(s, newSize, onComplete){
\r
375 this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
\r
378 moveSplitter : function(s){
\r
379 var yes = Ext.SplitBar;
\r
380 switch(s.placement){
\r
382 s.el.setX(s.resizingEl.getRight());
\r
385 s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");
\r
388 s.el.setY(s.resizingEl.getBottom());
\r
391 s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
\r
397 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-VERTICAL"></div>/**
\r
398 * Orientation constant - Create a vertical SplitBar
\r
402 Ext.SplitBar.VERTICAL = 1;
\r
404 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-HORIZONTAL"></div>/**
\r
405 * Orientation constant - Create a horizontal SplitBar
\r
409 Ext.SplitBar.HORIZONTAL = 2;
\r
411 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-LEFT"></div>/**
\r
412 * Placement constant - The resizing element is to the left of the splitter element
\r
416 Ext.SplitBar.LEFT = 1;
\r
418 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-RIGHT"></div>/**
\r
419 * Placement constant - The resizing element is to the right of the splitter element
\r
423 Ext.SplitBar.RIGHT = 2;
\r
425 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-TOP"></div>/**
\r
426 * Placement constant - The resizing element is positioned above the splitter element
\r
430 Ext.SplitBar.TOP = 3;
\r
432 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-BOTTOM"></div>/**
\r
433 * Placement constant - The resizing element is positioned under splitter element
\r
437 Ext.SplitBar.BOTTOM = 4;
\r