Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / docs / source / Resizer.html
diff --git a/docs/source/Resizer.html b/docs/source/Resizer.html
new file mode 100644 (file)
index 0000000..39ba094
--- /dev/null
@@ -0,0 +1,435 @@
+<!DOCTYPE html><html><head><title>Sencha Documentation Project</title><link rel="stylesheet" href="../reset.css" type="text/css"><link rel="stylesheet" href="../prettify.css" type="text/css"><link rel="stylesheet" href="../prettify_sa.css" type="text/css"><script type="text/javascript" src="../prettify.js"></script></head><body onload="prettyPrint()"><pre class="prettyprint"><pre><span id='Ext-resizer.Resizer'>/**
+</span> * @class Ext.resizer.Resizer
+ * &lt;p&gt;Applies drag handles to an element or component to make it resizable. The
+ * drag handles are inserted into the element (or component's element) and
+ * positioned absolute.&lt;/p&gt;
+ *
+ * &lt;p&gt;Textarea and img elements will be wrapped with an additional div because
+ * these elements do not support child nodes. The original element can be accessed
+ * through the originalTarget property.&lt;/p&gt;
+ *
+ * &lt;p&gt;Here is the list of valid resize handles:&lt;/p&gt;
+ * &lt;pre&gt;
+Value   Description
+------  -------------------
+ 'n'     north
+ 's'     south
+ 'e'     east
+ 'w'     west
+ 'nw'    northwest
+ 'sw'    southwest
+ 'se'    southeast
+ 'ne'    northeast
+ 'all'   all
+&lt;/pre&gt;
+ * {@img Ext.resizer.Resizer/Ext.resizer.Resizer.png Ext.resizer.Resizer component}
+ * &lt;p&gt;Here's an example showing the creation of a typical Resizer:&lt;/p&gt;
+ * &lt;pre&gt;&lt;code&gt;
+    &lt;div id=&quot;elToResize&quot; style=&quot;width:200px; height:100px; background-color:#000000;&quot;&gt;&lt;/div&gt;
+
+    Ext.create('Ext.resizer.Resizer', {
+        el: 'elToResize',
+        handles: 'all',
+        minWidth: 200,
+        minHeight: 100,
+        maxWidth: 500,
+        maxHeight: 400,
+        pinned: true
+    });
+&lt;/code&gt;&lt;/pre&gt;
+*/
+Ext.define('Ext.resizer.Resizer', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+    uses: ['Ext.resizer.ResizeTracker', 'Ext.Component'],
+
+    alternateClassName: 'Ext.Resizable',
+
+    handleCls: Ext.baseCSSPrefix + 'resizable-handle',
+    pinnedCls: Ext.baseCSSPrefix + 'resizable-pinned',
+    overCls:   Ext.baseCSSPrefix + 'resizable-over',
+    proxyCls:  Ext.baseCSSPrefix + 'resizable-proxy',
+    wrapCls:   Ext.baseCSSPrefix + 'resizable-wrap',
+
+<span id='Ext-resizer.Resizer-cfg-dynamic'>    /**
+</span>     * @cfg {Boolean} dynamic
+     * &lt;p&gt;Specify as true to update the {@link #target} (Element or {@link Ext.Component Component}) dynamically during dragging.
+     * This is &lt;code&gt;true&lt;/code&gt; by default, but the {@link Ext.Component Component} class passes &lt;code&gt;false&lt;/code&gt; when it
+     * is configured as {@link Ext.Component#resizable}.&lt;/p&gt;
+     * &lt;p&gt;If specified as &lt;code&gt;false&lt;/code&gt;, a proxy element is displayed during the resize operation, and the {@link #target}
+     * is updated on mouseup.&lt;/p&gt;
+     */
+    dynamic: true,
+
+<span id='Ext-resizer.Resizer-cfg-handles'>    /**
+</span>     * @cfg {String} handles String consisting of the resize handles to display. Defaults to 's e se' for
+     * Elements and fixed position Components. Defaults to 8 point resizing for floating Components (such as Windows).
+     * Specify either &lt;code&gt;'all'&lt;/code&gt; or any of &lt;code&gt;'n s e w ne nw se sw'&lt;/code&gt;.
+     */
+    handles: 's e se',
+
+<span id='Ext-resizer.Resizer-cfg-height'>    /**
+</span>     * @cfg {Number} height Optional. The height to set target to in pixels (defaults to null)
+     */
+    height : null,
+
+<span id='Ext-resizer.Resizer-cfg-width'>    /**
+</span>     * @cfg {Number} width Optional. The width to set the target to in pixels (defaults to null)
+     */
+    width : null,
+
+<span id='Ext-resizer.Resizer-cfg-minHeight'>    /**
+</span>     * @cfg {Number} minHeight The minimum height for the element (defaults to 20)
+     */
+    minHeight : 20,
+
+<span id='Ext-resizer.Resizer-cfg-minWidth'>    /**
+</span>     * @cfg {Number} minWidth The minimum width for the element (defaults to 20)
+     */
+    minWidth : 20,
+
+<span id='Ext-resizer.Resizer-cfg-maxHeight'>    /**
+</span>     * @cfg {Number} maxHeight The maximum height for the element (defaults to 10000)
+     */
+    maxHeight : 10000,
+
+<span id='Ext-resizer.Resizer-cfg-maxWidth'>    /**
+</span>     * @cfg {Number} maxWidth The maximum width for the element (defaults to 10000)
+     */
+    maxWidth : 10000,
+
+<span id='Ext-resizer.Resizer-cfg-pinned'>    /**
+</span>     * @cfg {Boolean} pinned True to ensure that the resize handles are always
+     * visible, false indicates resizing by cursor changes only (defaults to false)
+     */
+    pinned: false,
+
+<span id='Ext-resizer.Resizer-cfg-preserveRatio'>    /**
+</span>     * @cfg {Boolean} preserveRatio True to preserve the original ratio between height
+     * and width during resize (defaults to false)
+     */
+    preserveRatio: false,
+
+<span id='Ext-resizer.Resizer-cfg-transparent'>    /**
+</span>     * @cfg {Boolean} transparent True for transparent handles. This is only applied at config time. (defaults to false)
+     */
+    transparent: false,
+
+<span id='Ext-resizer.Resizer-cfg-constrainTo'>    /**
+</span>     * @cfg {Mixed} constrainTo Optional. An element, or a {@link Ext.util.Region} into which the resize operation
+     * must be constrained.
+     */
+
+    possiblePositions: {
+        n:  'north',
+        s:  'south',
+        e:  'east',
+        w:  'west',
+        se: 'southeast',
+        sw: 'southwest',
+        nw: 'northwest',
+        ne: 'northeast'
+    },
+
+<span id='Ext-resizer.Resizer-cfg-target'>    /**
+</span>     * @cfg {Mixed} target The Element or Component to resize.
+     */
+
+<span id='Ext-resizer.Resizer-property-el'>    /**
+</span>     * Outer element for resizing behavior.
+     * @type Ext.core.Element
+     * @property el
+     */
+
+    constructor: function(config) {
+        var me = this,
+            target,
+            tag,
+            handles = me.handles,
+            handleCls,
+            possibles,
+            len,
+            i = 0,
+            pos;
+
+        this.addEvents(
+<span id='Ext-resizer.Resizer-event-beforeresize'>            /**
+</span>             * @event beforeresize
+             * Fired before resize is allowed. Return false to cancel resize.
+             * @param {Ext.resizer.Resizer} this
+             * @param {Number} width The start width
+             * @param {Number} height The start height
+             * @param {Ext.EventObject} e The mousedown event
+             */
+            'beforeresize',
+<span id='Ext-resizer.Resizer-event-resizedrag'>            /**
+</span>             * @event resizedrag
+             * Fires during resizing. Return false to cancel resize.
+             * @param {Ext.resizer.Resizer} this
+             * @param {Number} width The new width
+             * @param {Number} height The new height
+             * @param {Ext.EventObject} e The mousedown event
+             */
+            'resizedrag',
+<span id='Ext-resizer.Resizer-event-resize'>            /**
+</span>             * @event resize
+             * Fired after a resize.
+             * @param {Ext.resizer.Resizer} this
+             * @param {Number} width The new width
+             * @param {Number} height The new height
+             * @param {Ext.EventObject} e The mouseup event
+             */
+            'resize'
+        );
+
+        if (Ext.isString(config) || Ext.isElement(config) || config.dom) {
+            target = config;
+            config = arguments[1] || {};
+            config.target = target;
+        }
+        // will apply config to this
+        me.mixins.observable.constructor.call(me, config);
+
+        // If target is a Component, ensure that we pull the element out.
+        // Resizer must examine the underlying Element.
+        target = me.target;
+        if (target) {
+            if (target.isComponent) {
+                me.el = target.getEl();
+                if (target.minWidth) {
+                    me.minWidth = target.minWidth;
+                }
+                if (target.minHeight) {
+                    me.minHeight = target.minHeight;
+                }
+                if (target.maxWidth) {
+                    me.maxWidth = target.maxWidth;
+                }
+                if (target.maxHeight) {
+                    me.maxHeight = target.maxHeight;
+                }
+                if (target.floating) {
+                    if (!this.hasOwnProperty('handles')) {
+                        this.handles = 'n ne e se s sw w nw';
+                    }
+                }
+            } else {
+                me.el = me.target = Ext.get(target);
+            }
+        }
+        // Backwards compatibility with Ext3.x's Resizable which used el as a config.
+        else {
+            me.target = me.el = Ext.get(me.el);
+        }
+
+        // Tags like textarea and img cannot
+        // have children and therefore must
+        // be wrapped
+        tag = me.el.dom.tagName;
+        if (tag == 'TEXTAREA' || tag == 'IMG') {
+<span id='Ext-resizer.Resizer-property-originalTarget'>            /**
+</span>             * Reference to the original resize target if the element of the original
+             * resize target was an IMG or a TEXTAREA which must be wrapped in a DIV.
+             * @type Mixed
+             * @property originalTarget
+             */
+            me.originalTarget = me.target;
+            me.target = me.el = me.el.wrap({
+                cls: me.wrapCls,
+                id: me.el.id + '-rzwrap'
+            });
+
+            // Transfer originalTarget's positioning/sizing
+            me.el.setPositioning(me.originalTarget.getPositioning());
+            me.originalTarget.clearPositioning();
+            var box = me.originalTarget.getBox();
+            me.el.setBox(box);
+        }
+
+        // Position the element, this enables us to absolute position
+        // the handles within this.el
+        me.el.position();
+        if (me.pinned) {
+            me.el.addCls(me.pinnedCls);
+        }
+
+<span id='Ext-resizer.Resizer-property-resizeTracker'>        /**
+</span>         * @type Ext.resizer.ResizeTracker
+         * @property resizeTracker
+         */
+        me.resizeTracker = Ext.create('Ext.resizer.ResizeTracker', {
+            disabled: me.disabled,
+            target: me.target,
+            constrainTo: me.constrainTo,
+            overCls: me.overCls,
+            throttle: me.throttle,
+            originalTarget: me.originalTarget,
+            delegate: '.' + me.handleCls,
+            dynamic: me.dynamic,
+            preserveRatio: me.preserveRatio,
+            minHeight: me.minHeight,
+            maxHeight: me.maxHeight,
+            minWidth: me.minWidth,
+            maxWidth: me.maxWidth
+        });
+
+        // Relay the ResizeTracker's superclass events as our own resize events
+        me.resizeTracker.on('mousedown', me.onBeforeResize, me);
+        me.resizeTracker.on('drag', me.onResize, me);
+        me.resizeTracker.on('dragend', me.onResizeEnd, me);
+
+        if (me.handles == 'all') {
+            me.handles = 'n s e w ne nw se sw';
+        }
+
+        handles = me.handles = me.handles.split(/ |\s*?[,;]\s*?/);
+        possibles = me.possiblePositions;
+        len = handles.length;
+        handleCls = me.handleCls + ' ' + (this.target.isComponent ? (me.target.baseCls + '-handle ') : '') + me.handleCls + '-';
+
+        for(; i &lt; len; i++){
+            // if specified and possible, create
+            if (handles[i] &amp;&amp; possibles[handles[i]]) {
+                pos = possibles[handles[i]];
+                // store a reference in this.east, this.west, etc
+
+                me[pos] = Ext.create('Ext.Component', {
+                    owner: this,
+                    region: pos,
+                    cls: handleCls + pos,
+                    renderTo: me.el
+                });
+                me[pos].el.unselectable();
+                if (me.transparent) {
+                    me[pos].el.setOpacity(0);
+                }
+            }
+        }
+
+        // Constrain within configured maxima
+        if (Ext.isNumber(me.width)) {
+            me.width = Ext.Number.constrain(me.width, me.minWidth, me.maxWidth);
+        }
+        if (Ext.isNumber(me.height)) {
+            me.height = Ext.Number.constrain(me.height, me.minHeight, me.maxHeight);
+        }
+
+        // Size the element
+        if (me.width != null || me.height != null) {
+            if (me.originalTarget) {
+                me.originalTarget.setWidth(me.width);
+                me.originalTarget.setHeight(me.height);
+            }
+            me.resizeTo(me.width, me.height);
+        }
+
+        me.forceHandlesHeight();
+    },
+
+    disable: function() {
+        this.resizeTracker.disable();
+    },
+
+    enable: function() {
+        this.resizeTracker.enable();
+    },
+
+<span id='Ext-resizer.Resizer-method-onBeforeResize'>    /**
+</span>     * @private Relay the Tracker's mousedown event as beforeresize
+     * @param tracker The Resizer
+     * @param e The Event
+     */
+    onBeforeResize: function(tracker, e) {
+        var b = this.target.getBox();
+        return this.fireEvent('beforeresize', this, b.width, b.height, e);
+    },
+
+<span id='Ext-resizer.Resizer-method-onResize'>    /**
+</span>     * @private Relay the Tracker's drag event as resizedrag
+     * @param tracker The Resizer
+     * @param e The Event
+     */
+    onResize: function(tracker, e) {
+        var me = this,
+            b = me.target.getBox();
+        me.forceHandlesHeight();
+        return me.fireEvent('resizedrag', me, b.width, b.height, e);
+    },
+
+<span id='Ext-resizer.Resizer-method-onResizeEnd'>    /**
+</span>     * @private Relay the Tracker's dragend event as resize
+     * @param tracker The Resizer
+     * @param e The Event
+     */
+    onResizeEnd: function(tracker, e) {
+        var me = this,
+            b = me.target.getBox();
+        me.forceHandlesHeight();
+        return me.fireEvent('resize', me, b.width, b.height, e);
+    },
+
+<span id='Ext-resizer.Resizer-method-resizeTo'>    /**
+</span>     * Perform a manual resize and fires the 'resize' event.
+     * @param {Number} width
+     * @param {Number} height
+     */
+    resizeTo : function(width, height){
+        this.target.setSize(width, height);
+        this.fireEvent('resize', this, width, height, null);
+    },
+
+<span id='Ext-resizer.Resizer-method-getEl'>    /**
+</span>     * &lt;p&gt;Returns the element that was configured with the el or target config property.
+     * If a component was configured with the target property then this will return the
+     * element of this component.&lt;p&gt;
+     * &lt;p&gt;Textarea and img elements will be wrapped with an additional div because
+      * these elements do not support child nodes. The original element can be accessed
+     * through the originalTarget property.&lt;/p&gt;
+     * @return {Element} element
+     */
+    getEl : function() {
+        return this.el;
+    },
+
+<span id='Ext-resizer.Resizer-method-getTarget'>    /**
+</span>     * &lt;p&gt;Returns the element or component that was configured with the target config property.&lt;p&gt;
+     * &lt;p&gt;Textarea and img elements will be wrapped with an additional div because
+      * these elements do not support child nodes. The original element can be accessed
+     * through the originalTarget property.&lt;/p&gt;
+     * @return {Element/Component}
+     */
+    getTarget: function() {
+        return this.target;
+    },
+
+    destroy: function() {
+        var h;
+        for (var i = 0, l = this.handles.length; i &lt; l; i++) {
+            h = this[this.possiblePositions[this.handles[i]]];
+            delete h.owner;
+            Ext.destroy(h);
+        }
+    },
+
+<span id='Ext-resizer.Resizer-method-forceHandlesHeight'>    /**
+</span>     * @private
+     * Fix IE6 handle height issue.
+     */
+    forceHandlesHeight : function() {
+        var me = this,
+            handle;
+        if (Ext.isIE6) {
+            handle = me.east; 
+            if (handle) {
+                handle.setHeight(me.el.getHeight());
+            }
+            handle = me.west; 
+            if (handle) {
+                handle.setHeight(me.el.getHeight());
+            }
+            me.el.repaint();
+        }
+    }
+});
+</pre></pre></body></html>
\ No newline at end of file