Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / docs / source / Picker.html
diff --git a/docs/source/Picker.html b/docs/source/Picker.html
new file mode 100644 (file)
index 0000000..f8c8c47
--- /dev/null
@@ -0,0 +1,277 @@
+<!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-form.field.Picker-method-constructor'><span id='Ext-form.field.Picker'>/**
+</span></span> * @class Ext.form.field.Picker
+ * @extends Ext.form.field.Trigger
+ * &lt;p&gt;An abstract class for fields that have a single trigger which opens a &quot;picker&quot; popup below
+ * the field, e.g. a combobox menu list or a date picker. It provides a base implementation for
+ * toggling the picker's visibility when the trigger is clicked, as well as keyboard navigation
+ * and some basic events. Sizing and alignment of the picker can be controlled via the {@link #matchFieldWidth}
+ * and {@link #pickerAlign}/{@link #pickerOffset} config properties respectively.&lt;/p&gt;
+ * &lt;p&gt;You would not normally use this class directly, but instead use it as the parent class for
+ * a specific picker field implementation. Subclasses must implement the {@link #createPicker} method
+ * to create a picker component appropriate for the field.&lt;/p&gt;
+ *
+ * @xtype pickerfield
+ * @constructor
+ * Create a new picker field
+ * @param {Object} config
+ */
+Ext.define('Ext.form.field.Picker', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.pickerfield',
+    alternateClassName: 'Ext.form.Picker',
+    requires: ['Ext.util.KeyNav'],
+
+<span id='Ext-form.field.Picker-cfg-matchFieldWidth'>    /**
+</span>     * @cfg {Boolean} matchFieldWidth
+     * Whether the picker dropdown's width should be explicitly set to match the width of the field.
+     * Defaults to &lt;tt&gt;true&lt;/tt&gt;.
+     */
+    matchFieldWidth: true,
+
+<span id='Ext-form.field.Picker-cfg-pickerAlign'>    /**
+</span>     * @cfg {String} pickerAlign
+     * The {@link Ext.core.Element#alignTo alignment position} with which to align the picker. Defaults
+     * to &lt;tt&gt;&quot;tl-bl?&quot;&lt;/tt&gt;
+     */
+    pickerAlign: 'tl-bl?',
+
+<span id='Ext-form.field.Picker-cfg-pickerOffset'>    /**
+</span>     * @cfg {Array} pickerOffset
+     * An offset [x,y] to use in addition to the {@link #pickerAlign} when positioning the picker.
+     * Defaults to undefined.
+     */
+
+<span id='Ext-form.field.Picker-cfg-openCls'>    /**
+</span>     * @cfg {String} openCls
+     * A class to be added to the field's {@link #bodyEl} element when the picker is opened. Defaults
+     * to 'x-pickerfield-open'.
+     */
+    openCls: Ext.baseCSSPrefix + 'pickerfield-open',
+
+<span id='Ext-form.field.Picker-property-isExpanded'>    /**
+</span>     * @property isExpanded
+     * @type Boolean
+     * True if the picker is currently expanded, false if not.
+     */
+
+<span id='Ext-form.field.Picker-cfg-editable'>    /**
+</span>     * @cfg {Boolean} editable &lt;tt&gt;false&lt;/tt&gt; to prevent the user from typing text directly into the field;
+     * the field can only have its value set via selecting a value from the picker. In this state, the picker
+     * can also be opened by clicking directly on the input field itself.
+     * (defaults to &lt;tt&gt;true&lt;/tt&gt;).
+     */
+    editable: true,
+
+
+    initComponent: function() {
+        this.callParent();
+
+        // Custom events
+        this.addEvents(
+<span id='Ext-form.field.Picker-event-expand'>            /**
+</span>             * @event expand
+             * Fires when the field's picker is expanded.
+             * @param {Ext.form.field.Picker} field This field instance
+             */
+            'expand',
+<span id='Ext-form.field.Picker-event-collapse'>            /**
+</span>             * @event collapse
+             * Fires when the field's picker is collapsed.
+             * @param {Ext.form.field.Picker} field This field instance
+             */
+            'collapse',
+<span id='Ext-form.field.Picker-event-select'>            /**
+</span>             * @event select
+             * Fires when a value is selected via the picker.
+             * @param {Ext.form.field.Picker} field This field instance
+             * @param {Mixed} value The value that was selected. The exact type of this value is dependent on
+             * the individual field and picker implementations.
+             */
+            'select'
+        );
+    },
+
+
+    initEvents: function() {
+        var me = this;
+        me.callParent();
+
+        // Add handlers for keys to expand/collapse the picker
+        me.keyNav = Ext.create('Ext.util.KeyNav', me.inputEl, {
+            down: function() {
+                if (!me.isExpanded) {
+                    // Don't call expand() directly as there may be additional processing involved before
+                    // expanding, e.g. in the case of a ComboBox query.
+                    me.onTriggerClick();
+                }
+            },
+            esc: me.collapse,
+            scope: me,
+            forceKeyDown: true
+        });
+
+        // Non-editable allows opening the picker by clicking the field
+        if (!me.editable) {
+            me.mon(me.inputEl, 'click', me.onTriggerClick, me);
+        }
+
+        // Disable native browser autocomplete
+        if (Ext.isGecko) {
+            me.inputEl.dom.setAttribute('autocomplete', 'off');
+        }
+    },
+
+
+<span id='Ext-form.field.Picker-method-expand'>    /**
+</span>     * Expand this field's picker dropdown.
+     */
+    expand: function() {
+        var me = this,
+            bodyEl, picker, collapseIf;
+
+        if (me.rendered &amp;&amp; !me.isExpanded &amp;&amp; !me.isDestroyed) {
+            bodyEl = me.bodyEl;
+            picker = me.getPicker();
+            collapseIf = me.collapseIf;
+
+            // show the picker and set isExpanded flag
+            picker.show();
+            me.isExpanded = true;
+            me.alignPicker();
+            bodyEl.addCls(me.openCls);
+
+            // monitor clicking and mousewheel
+            me.mon(Ext.getDoc(), {
+                mousewheel: collapseIf,
+                mousedown: collapseIf,
+                scope: me
+            });
+
+            me.fireEvent('expand', me);
+            me.onExpand();
+        }
+    },
+
+    onExpand: Ext.emptyFn,
+
+<span id='Ext-form.field.Picker-method-alignPicker'>    /**
+</span>     * @protected
+     * Aligns the picker to the
+     */
+    alignPicker: function() {
+        var me = this,
+            picker, isAbove,
+            aboveSfx = '-above';
+
+        if (this.isExpanded) {
+            picker = me.getPicker();
+            if (me.matchFieldWidth) {
+                // Auto the height (it will be constrained by min and max width) unless there are no records to display.
+                picker.setSize(me.bodyEl.getWidth(), picker.store &amp;&amp; picker.store.getCount() ? null : 0);
+            }
+            if (picker.isFloating()) {
+                picker.alignTo(me.inputEl, me.pickerAlign, me.pickerOffset);
+
+                // add the {openCls}-above class if the picker was aligned above
+                // the field due to hitting the bottom of the viewport
+                isAbove = picker.el.getY() &lt; me.inputEl.getY();
+                me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls + aboveSfx);
+                picker.el[isAbove ? 'addCls' : 'removeCls'](picker.baseCls + aboveSfx);
+            }
+        }
+    },
+
+<span id='Ext-form.field.Picker-method-collapse'>    /**
+</span>     * Collapse this field's picker dropdown.
+     */
+    collapse: function() {
+        if (this.isExpanded &amp;&amp; !this.isDestroyed) {
+            var me = this,
+                openCls = me.openCls,
+                picker = me.picker,
+                doc = Ext.getDoc(),
+                collapseIf = me.collapseIf,
+                aboveSfx = '-above';
+
+            // hide the picker and set isExpanded flag
+            picker.hide();
+            me.isExpanded = false;
+
+            // remove the openCls
+            me.bodyEl.removeCls([openCls, openCls + aboveSfx]);
+            picker.el.removeCls(picker.baseCls + aboveSfx);
+
+            // remove event listeners
+            doc.un('mousewheel', collapseIf, me);
+            doc.un('mousedown', collapseIf, me);
+
+            me.fireEvent('collapse', me);
+            me.onCollapse();
+        }
+    },
+
+    onCollapse: Ext.emptyFn,
+
+
+<span id='Ext-form.field.Picker-method-collapseIf'>    /**
+</span>     * @private
+     * Runs on mousewheel and mousedown of doc to check to see if we should collapse the picker
+     */
+    collapseIf: function(e) {
+        var me = this;
+        if (!me.isDestroyed &amp;&amp; !e.within(me.bodyEl, false, true) &amp;&amp; !e.within(me.picker.el, false, true)) {
+            me.collapse();
+        }
+    },
+
+<span id='Ext-form.field.Picker-method-getPicker'>    /**
+</span>     * Return a reference to the picker component for this field, creating it if necessary by
+     * calling {@link #createPicker}.
+     * @return {Ext.Component} The picker component
+     */
+    getPicker: function() {
+        var me = this;
+        return me.picker || (me.picker = me.createPicker());
+    },
+
+<span id='Ext-form.field.Picker-property-createPicker'>    /**
+</span>     * Create and return the component to be used as this field's picker. Must be implemented
+     * by subclasses of Picker.
+     * @return {Ext.Component} The picker component
+     */
+    createPicker: Ext.emptyFn,
+
+<span id='Ext-form.field.Picker-method-onTriggerClick'>    /**
+</span>     * Handles the trigger click; by default toggles between expanding and collapsing the
+     * picker component.
+     */
+    onTriggerClick: function() {
+        var me = this;
+        if (!me.readOnly &amp;&amp; !me.disabled) {
+            if (me.isExpanded) {
+                me.collapse();
+            } else {
+                me.expand();
+            }
+            me.inputEl.focus();
+        }
+    },
+
+    mimicBlur: function(e) {
+        var me = this,
+            picker = me.picker;
+        // ignore mousedown events within the picker element
+        if (!picker || !e.within(picker.el, false, true)) {
+            me.callParent(arguments);
+        }
+    },
+
+    onDestroy : function(){
+        var me = this;
+        Ext.destroy(me.picker, me.keyNav);
+        me.callParent();
+    }
+
+});
+
+</pre></pre></body></html>
\ No newline at end of file