3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
\r
4 <title>The source code</title>
\r
5 <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
\r
6 <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
\r
8 <body onload="prettyPrint();">
\r
9 <pre class="prettyprint lang-js"><div id="cls-Ext.SplitBar"></div>/**
\r
10 * @class Ext.SplitBar
\r
11 * @extends Ext.util.Observable
\r
12 * Creates draggable splitter bar functionality from two elements (element to be dragged and element to be resized).
\r
16 var split = new Ext.SplitBar("elementToDrag", "elementToSize",
\r
17 Ext.SplitBar.HORIZONTAL, Ext.SplitBar.LEFT);
\r
18 split.setAdapter(new Ext.SplitBar.AbsoluteLayoutAdapter("container"));
\r
19 split.minSize = 100;
\r
20 split.maxSize = 600;
\r
21 split.animate = true;
\r
22 split.on('moved', splitterMoved);
\r
25 * Create a new SplitBar
\r
26 * @param {Mixed} dragElement The element to be dragged and act as the SplitBar.
\r
27 * @param {Mixed} resizingElement The element to be resized based on where the SplitBar element is dragged
\r
28 * @param {Number} orientation (optional) Either Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
\r
29 * @param {Number} placement (optional) Either Ext.SplitBar.LEFT or Ext.SplitBar.RIGHT for horizontal or
\r
30 Ext.SplitBar.TOP or Ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the initial
\r
31 position of the SplitBar).
\r
33 Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
\r
36 this.el = Ext.get(dragElement, true);
\r
37 this.el.dom.unselectable = "on";
\r
39 this.resizingEl = Ext.get(resizingElement, true);
\r
43 * The orientation of the split. Either Ext.SplitBar.HORIZONTAL or Ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
\r
44 * Note: If this is changed after creating the SplitBar, the placement property must be manually updated
\r
47 this.orientation = orientation || Ext.SplitBar.HORIZONTAL;
\r
49 <div id="prop-Ext.SplitBar-tickSize"></div>/**
\r
50 * The increment, in pixels by which to move this SplitBar. When <i>undefined</i>, the SplitBar moves smoothly.
\r
52 * @property tickSize
\r
54 <div id="prop-Ext.SplitBar-minSize"></div>/**
\r
55 * The minimum size of the resizing element. (Defaults to 0)
\r
60 <div id="prop-Ext.SplitBar-maxSize"></div>/**
\r
61 * The maximum size of the resizing element. (Defaults to 2000)
\r
64 this.maxSize = 2000;
\r
66 <div id="prop-Ext.SplitBar-animate"></div>/**
\r
67 * Whether to animate the transition to the new size
\r
70 this.animate = false;
\r
72 <div id="prop-Ext.SplitBar-useShim"></div>/**
\r
73 * Whether to create a transparent shim that overlays the page when dragging, enables dragging across iframes.
\r
76 this.useShim = false;
\r
83 this.proxy = Ext.SplitBar.createProxy(this.orientation);
\r
85 this.proxy = Ext.get(existingProxy).dom;
\r
88 this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});
\r
91 this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
\r
94 this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
\r
97 this.dragSpecs = {};
\r
100 * @private The adapter to use to positon and resize elements
\r
102 this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
\r
103 this.adapter.init(this);
\r
105 if(this.orientation == Ext.SplitBar.HORIZONTAL){
\r
107 this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
\r
108 this.el.addClass("x-splitbar-h");
\r
111 this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
\r
112 this.el.addClass("x-splitbar-v");
\r
116 <div id="event-Ext.SplitBar-resize"></div>/**
\r
118 * Fires when the splitter is moved (alias for {@link #moved})
\r
119 * @param {Ext.SplitBar} this
\r
120 * @param {Number} newSize the new width or height
\r
123 <div id="event-Ext.SplitBar-moved"></div>/**
\r
125 * Fires when the splitter is moved
\r
126 * @param {Ext.SplitBar} this
\r
127 * @param {Number} newSize the new width or height
\r
130 <div id="event-Ext.SplitBar-beforeresize"></div>/**
\r
131 * @event beforeresize
\r
132 * Fires before the splitter is dragged
\r
133 * @param {Ext.SplitBar} this
\r
140 Ext.SplitBar.superclass.constructor.call(this);
\r
143 Ext.extend(Ext.SplitBar, Ext.util.Observable, {
\r
144 onStartProxyDrag : function(x, y){
\r
145 this.fireEvent("beforeresize", this);
\r
146 this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: " "}, true);
\r
147 this.overlay.unselectable();
\r
148 this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
\r
149 this.overlay.show();
\r
150 Ext.get(this.proxy).setDisplayed("block");
\r
151 var size = this.adapter.getElementSize(this);
\r
152 this.activeMinSize = this.getMinimumSize();
\r
153 this.activeMaxSize = this.getMaximumSize();
\r
154 var c1 = size - this.activeMinSize;
\r
155 var c2 = Math.max(this.activeMaxSize - size, 0);
\r
156 if(this.orientation == Ext.SplitBar.HORIZONTAL){
\r
157 this.dd.resetConstraints();
\r
158 this.dd.setXConstraint(
\r
159 this.placement == Ext.SplitBar.LEFT ? c1 : c2,
\r
160 this.placement == Ext.SplitBar.LEFT ? c2 : c1,
\r
163 this.dd.setYConstraint(0, 0);
\r
165 this.dd.resetConstraints();
\r
166 this.dd.setXConstraint(0, 0);
\r
167 this.dd.setYConstraint(
\r
168 this.placement == Ext.SplitBar.TOP ? c1 : c2,
\r
169 this.placement == Ext.SplitBar.TOP ? c2 : c1,
\r
173 this.dragSpecs.startSize = size;
\r
174 this.dragSpecs.startPoint = [x, y];
\r
175 Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
\r
179 * @private Called after the drag operation by the DDProxy
\r
181 onEndProxyDrag : function(e){
\r
182 Ext.get(this.proxy).setDisplayed(false);
\r
183 var endPoint = Ext.lib.Event.getXY(e);
\r
185 Ext.destroy(this.overlay);
\r
186 delete this.overlay;
\r
189 if(this.orientation == Ext.SplitBar.HORIZONTAL){
\r
190 newSize = this.dragSpecs.startSize +
\r
191 (this.placement == Ext.SplitBar.LEFT ?
\r
192 endPoint[0] - this.dragSpecs.startPoint[0] :
\r
193 this.dragSpecs.startPoint[0] - endPoint[0]
\r
196 newSize = this.dragSpecs.startSize +
\r
197 (this.placement == Ext.SplitBar.TOP ?
\r
198 endPoint[1] - this.dragSpecs.startPoint[1] :
\r
199 this.dragSpecs.startPoint[1] - endPoint[1]
\r
202 newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
\r
203 if(newSize != this.dragSpecs.startSize){
\r
204 if(this.fireEvent('beforeapply', this, newSize) !== false){
\r
205 this.adapter.setElementSize(this, newSize);
\r
206 this.fireEvent("moved", this, newSize);
\r
207 this.fireEvent("resize", this, newSize);
\r
212 <div id="method-Ext.SplitBar-getAdapter"></div>/**
\r
213 * Get the adapter this SplitBar uses
\r
214 * @return The adapter object
\r
216 getAdapter : function(){
\r
217 return this.adapter;
\r
220 <div id="method-Ext.SplitBar-setAdapter"></div>/**
\r
221 * Set the adapter this SplitBar uses
\r
222 * @param {Object} adapter A SplitBar adapter object
\r
224 setAdapter : function(adapter){
\r
225 this.adapter = adapter;
\r
226 this.adapter.init(this);
\r
229 <div id="method-Ext.SplitBar-getMinimumSize"></div>/**
\r
230 * Gets the minimum size for the resizing element
\r
231 * @return {Number} The minimum size
\r
233 getMinimumSize : function(){
\r
234 return this.minSize;
\r
237 <div id="method-Ext.SplitBar-setMinimumSize"></div>/**
\r
238 * Sets the minimum size for the resizing element
\r
239 * @param {Number} minSize The minimum size
\r
241 setMinimumSize : function(minSize){
\r
242 this.minSize = minSize;
\r
245 <div id="method-Ext.SplitBar-getMaximumSize"></div>/**
\r
246 * Gets the maximum size for the resizing element
\r
247 * @return {Number} The maximum size
\r
249 getMaximumSize : function(){
\r
250 return this.maxSize;
\r
253 <div id="method-Ext.SplitBar-setMaximumSize"></div>/**
\r
254 * Sets the maximum size for the resizing element
\r
255 * @param {Number} maxSize The maximum size
\r
257 setMaximumSize : function(maxSize){
\r
258 this.maxSize = maxSize;
\r
261 <div id="method-Ext.SplitBar-setCurrentSize"></div>/**
\r
262 * Sets the initialize size for the resizing element
\r
263 * @param {Number} size The initial size
\r
265 setCurrentSize : function(size){
\r
266 var oldAnimate = this.animate;
\r
267 this.animate = false;
\r
268 this.adapter.setElementSize(this, size);
\r
269 this.animate = oldAnimate;
\r
272 <div id="method-Ext.SplitBar-destroy"></div>/**
\r
273 * Destroy this splitbar.
\r
274 * @param {Boolean} removeEl True to remove the element
\r
276 destroy : function(removeEl){
\r
277 Ext.destroy(this.shim, Ext.get(this.proxy));
\r
282 this.purgeListeners();
\r
287 * @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
289 Ext.SplitBar.createProxy = function(dir){
\r
290 var proxy = new Ext.Element(document.createElement("div"));
\r
291 document.body.appendChild(proxy.dom);
\r
292 proxy.unselectable();
\r
293 var cls = 'x-splitbar-proxy';
\r
294 proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
\r
298 <div id="cls-Ext.SplitBar.BasicLayoutAdapter"></div>/**
\r
299 * @class Ext.SplitBar.BasicLayoutAdapter
\r
300 * Default Adapter. It assumes the splitter and resizing element are not positioned
\r
301 * elements and only gets/sets the width of the element. Generally used for table based layouts.
\r
303 Ext.SplitBar.BasicLayoutAdapter = function(){
\r
306 Ext.SplitBar.BasicLayoutAdapter.prototype = {
\r
307 // do nothing for now
\r
308 init : function(s){
\r
311 <div id="method-Ext.SplitBar.BasicLayoutAdapter-getElementSize"></div>/**
\r
312 * Called before drag operations to get the current size of the resizing element.
\r
313 * @param {Ext.SplitBar} s The SplitBar using this adapter
\r
315 getElementSize : function(s){
\r
316 if(s.orientation == Ext.SplitBar.HORIZONTAL){
\r
317 return s.resizingEl.getWidth();
\r
319 return s.resizingEl.getHeight();
\r
323 <div id="method-Ext.SplitBar.BasicLayoutAdapter-setElementSize"></div>/**
\r
324 * Called after drag operations to set the size of the resizing element.
\r
325 * @param {Ext.SplitBar} s The SplitBar using this adapter
\r
326 * @param {Number} newSize The new size to set
\r
327 * @param {Function} onComplete A function to be invoked when resizing is complete
\r
329 setElementSize : function(s, newSize, onComplete){
\r
330 if(s.orientation == Ext.SplitBar.HORIZONTAL){
\r
332 s.resizingEl.setWidth(newSize);
\r
334 onComplete(s, newSize);
\r
337 s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
\r
342 s.resizingEl.setHeight(newSize);
\r
344 onComplete(s, newSize);
\r
347 s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
\r
353 <div id="cls-Ext.SplitBar.AbsoluteLayoutAdapter"></div>/**
\r
354 *@class Ext.SplitBar.AbsoluteLayoutAdapter
\r
355 * @extends Ext.SplitBar.BasicLayoutAdapter
\r
356 * Adapter that moves the splitter element to align with the resized sizing element.
\r
357 * Used with an absolute positioned SplitBar.
\r
358 * @param {Mixed} container The container that wraps around the absolute positioned content. If it's
\r
359 * document.body, make sure you assign an id to the body element.
\r
361 Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
\r
362 this.basic = new Ext.SplitBar.BasicLayoutAdapter();
\r
363 this.container = Ext.get(container);
\r
366 Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
\r
367 init : function(s){
\r
368 this.basic.init(s);
\r
371 getElementSize : function(s){
\r
372 return this.basic.getElementSize(s);
\r
375 setElementSize : function(s, newSize, onComplete){
\r
376 this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
\r
379 moveSplitter : function(s){
\r
380 var yes = Ext.SplitBar;
\r
381 switch(s.placement){
\r
383 s.el.setX(s.resizingEl.getRight());
\r
386 s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");
\r
389 s.el.setY(s.resizingEl.getBottom());
\r
392 s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
\r
398 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-VERTICAL"></div>/**
\r
399 * Orientation constant - Create a vertical SplitBar
\r
403 Ext.SplitBar.VERTICAL = 1;
\r
405 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-HORIZONTAL"></div>/**
\r
406 * Orientation constant - Create a horizontal SplitBar
\r
410 Ext.SplitBar.HORIZONTAL = 2;
\r
412 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-LEFT"></div>/**
\r
413 * Placement constant - The resizing element is to the left of the splitter element
\r
417 Ext.SplitBar.LEFT = 1;
\r
419 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-RIGHT"></div>/**
\r
420 * Placement constant - The resizing element is to the right of the splitter element
\r
424 Ext.SplitBar.RIGHT = 2;
\r
426 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-TOP"></div>/**
\r
427 * Placement constant - The resizing element is positioned above the splitter element
\r
431 Ext.SplitBar.TOP = 3;
\r
433 <div id="prop-Ext.SplitBar.AbsoluteLayoutAdapter-BOTTOM"></div>/**
\r
434 * Placement constant - The resizing element is positioned under splitter element
\r
438 Ext.SplitBar.BOTTOM = 4;
\r