Bienvenue sur PostGIS.fr

Bienvenue sur PostGIS.fr , le site de la communauté des utilisateurs francophones de PostGIS.

PostGIS ajoute le support d'objets géographique à la base de données PostgreSQL. En effet, PostGIS "spatialise" le serverur PostgreSQL, ce qui permet de l'utiliser comme une base de données SIG.

Maintenu à jour, en fonction de nos disponibilités et des diverses sorties des outils que nous testons, nous vous proposons l'ensemble de nos travaux publiés en langue française.

source: trunk/workshop-routing-foss4g/web/ext/src/widgets/grid/ColumnModel.js @ 77

Revision 76, 22.8 KB checked in by djay, 13 years ago (diff)

Ajout du répertoire web

  • Property svn:executable set to *
Line 
1/*!
2 * Ext JS Library 3.4.0
3 * Copyright(c) 2006-2011 Sencha Inc.
4 * licensing@sencha.com
5 * http://www.sencha.com/license
6 */
7/**
8 * @class Ext.grid.ColumnModel
9 * @extends Ext.util.Observable
10 * <p>After the data has been read into the client side cache (<b>{@link Ext.data.Store Store}</b>),
11 * the ColumnModel is used to configure how and what parts of that data will be displayed in the
12 * vertical slices (columns) of the grid. The Ext.grid.ColumnModel Class is the default implementation
13 * of a ColumnModel used by implentations of {@link Ext.grid.GridPanel GridPanel}.</p>
14 * <p>Data is mapped into the store's records and then indexed into the ColumnModel using the
15 * <tt>{@link Ext.grid.Column#dataIndex dataIndex}</tt>:</p>
16 * <pre><code>
17{data source} == mapping ==> {data store} == <b><tt>{@link Ext.grid.Column#dataIndex dataIndex}</tt></b> ==> {ColumnModel}
18 * </code></pre>
19 * <p>Each {@link Ext.grid.Column Column} in the grid's ColumnModel is configured with a
20 * <tt>{@link Ext.grid.Column#dataIndex dataIndex}</tt> to specify how the data within
21 * each record in the store is indexed into the ColumnModel.</p>
22 * <p>There are two ways to initialize the ColumnModel class:</p>
23 * <p><u>Initialization Method 1: an Array</u></p>
24<pre><code>
25 var colModel = new Ext.grid.ColumnModel([
26    { header: "Ticker", width: 60, sortable: true},
27    { header: "Company Name", width: 150, sortable: true, id: 'company'},
28    { header: "Market Cap.", width: 100, sortable: true},
29    { header: "$ Sales", width: 100, sortable: true, renderer: money},
30    { header: "Employees", width: 100, sortable: true, resizable: false}
31 ]);
32 </code></pre>
33 * <p>The ColumnModel may be initialized with an Array of {@link Ext.grid.Column} column configuration
34 * objects to define the initial layout / display of the columns in the Grid. The order of each
35 * {@link Ext.grid.Column} column configuration object within the specified Array defines the initial
36 * order of the column display.  A Column's display may be initially hidden using the
37 * <tt>{@link Ext.grid.Column#hidden hidden}</tt></b> config property (and then shown using the column
38 * header menu).  Fields that are not included in the ColumnModel will not be displayable at all.</p>
39 * <p>How each column in the grid correlates (maps) to the {@link Ext.data.Record} field in the
40 * {@link Ext.data.Store Store} the column draws its data from is configured through the
41 * <b><tt>{@link Ext.grid.Column#dataIndex dataIndex}</tt></b>.  If the
42 * <b><tt>{@link Ext.grid.Column#dataIndex dataIndex}</tt></b> is not explicitly defined (as shown in the
43 * example above) it will use the column configuration's index in the Array as the index.</p>
44 * <p>See <b><tt>{@link Ext.grid.Column}</tt></b> for additional configuration options for each column.</p>
45 * <p><u>Initialization Method 2: an Object</u></p>
46 * <p>In order to use configuration options from <tt>Ext.grid.ColumnModel</tt>, an Object may be used to
47 * initialize the ColumnModel.  The column configuration Array will be specified in the <tt><b>{@link #columns}</b></tt>
48 * config property. The <tt><b>{@link #defaults}</b></tt> config property can be used to apply defaults
49 * for all columns, e.g.:</p><pre><code>
50 var colModel = new Ext.grid.ColumnModel({
51    columns: [
52        { header: "Ticker", width: 60, menuDisabled: false},
53        { header: "Company Name", width: 150, id: 'company'},
54        { header: "Market Cap."},
55        { header: "$ Sales", renderer: money},
56        { header: "Employees", resizable: false}
57    ],
58    defaults: {
59        sortable: true,
60        menuDisabled: true,
61        width: 100
62    },
63    listeners: {
64        {@link #hiddenchange}: function(cm, colIndex, hidden) {
65            saveConfig(colIndex, hidden);
66        }
67    }
68});
69 </code></pre>
70 * <p>In both examples above, the ability to apply a CSS class to all cells in a column (including the
71 * header) is demonstrated through the use of the <b><tt>{@link Ext.grid.Column#id id}</tt></b> config
72 * option. This column could be styled by including the following css:</p><pre><code>
73 //add this css *after* the core css is loaded
74.x-grid3-td-company {
75    color: red; // entire column will have red font
76}
77// modify the header row only, adding an icon to the column header
78.x-grid3-hd-company {
79    background: transparent
80        url(../../resources/images/icons/silk/building.png)
81        no-repeat 3px 3px ! important;
82        padding-left:20px;
83}
84 </code></pre>
85 * Note that the "Company Name" column could be specified as the
86 * <b><tt>{@link Ext.grid.GridPanel}.{@link Ext.grid.GridPanel#autoExpandColumn autoExpandColumn}</tt></b>.
87 * @constructor
88 * @param {Mixed} config Specify either an Array of {@link Ext.grid.Column} configuration objects or specify
89 * a configuration Object (see introductory section discussion utilizing Initialization Method 2 above).
90 */
91Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, {
92    /**
93     * @cfg {Number} defaultWidth (optional) The width of columns which have no <tt>{@link #width}</tt>
94     * specified (defaults to <tt>100</tt>).  This property shall preferably be configured through the
95     * <tt><b>{@link #defaults}</b></tt> config property.
96     */
97    defaultWidth: 100,
98
99    /**
100     * @cfg {Boolean} defaultSortable (optional) Default sortable of columns which have no
101     * sortable specified (defaults to <tt>false</tt>).  This property shall preferably be configured
102     * through the <tt><b>{@link #defaults}</b></tt> config property.
103     */
104    defaultSortable: false,
105
106    /**
107     * @cfg {Array} columns An Array of object literals.  The config options defined by
108     * <b>{@link Ext.grid.Column}</b> are the options which may appear in the object literal for each
109     * individual column definition.
110     */
111
112    /**
113     * @cfg {Object} defaults Object literal which will be used to apply {@link Ext.grid.Column}
114     * configuration options to all <tt><b>{@link #columns}</b></tt>.  Configuration options specified with
115     * individual {@link Ext.grid.Column column} configs will supersede these <tt><b>{@link #defaults}</b></tt>.
116     */
117
118    constructor : function(config) {
119        /**
120             * An Array of {@link Ext.grid.Column Column definition} objects representing the configuration
121             * of this ColumnModel.  See {@link Ext.grid.Column} for the configuration properties that may
122             * be specified.
123             * @property config
124             * @type Array
125             */
126            if (config.columns) {
127                Ext.apply(this, config);
128                this.setConfig(config.columns, true);
129            } else {
130                this.setConfig(config, true);
131            }
132           
133            this.addEvents(
134                /**
135                 * @event widthchange
136                 * Fires when the width of a column is programmaticially changed using
137                 * <code>{@link #setColumnWidth}</code>.
138                 * Note internal resizing suppresses the event from firing. See also
139                 * {@link Ext.grid.GridPanel}.<code>{@link #columnresize}</code>.
140                 * @param {ColumnModel} this
141                 * @param {Number} columnIndex The column index
142                 * @param {Number} newWidth The new width
143                 */
144                "widthchange",
145               
146                /**
147                 * @event headerchange
148                 * Fires when the text of a header changes.
149                 * @param {ColumnModel} this
150                 * @param {Number} columnIndex The column index
151                 * @param {String} newText The new header text
152                 */
153                "headerchange",
154               
155                /**
156                 * @event hiddenchange
157                 * Fires when a column is hidden or "unhidden".
158                 * @param {ColumnModel} this
159                 * @param {Number} columnIndex The column index
160                 * @param {Boolean} hidden true if hidden, false otherwise
161                 */
162                "hiddenchange",
163               
164                /**
165                 * @event columnmoved
166                 * Fires when a column is moved.
167                 * @param {ColumnModel} this
168                 * @param {Number} oldIndex
169                 * @param {Number} newIndex
170                 */
171                "columnmoved",
172               
173                /**
174                 * @event configchange
175                 * Fires when the configuration is changed
176                 * @param {ColumnModel} this
177                 */
178                "configchange"
179            );
180           
181            Ext.grid.ColumnModel.superclass.constructor.call(this);
182    },
183
184    /**
185     * Returns the id of the column at the specified index.
186     * @param {Number} index The column index
187     * @return {String} the id
188     */
189    getColumnId : function(index) {
190        return this.config[index].id;
191    },
192
193    getColumnAt : function(index) {
194        return this.config[index];
195    },
196
197    /**
198     * <p>Reconfigures this column model according to the passed Array of column definition objects.
199     * For a description of the individual properties of a column definition object, see the
200     * <a href="#Ext.grid.ColumnModel-configs">Config Options</a>.</p>
201     * <p>Causes the {@link #configchange} event to be fired. A {@link Ext.grid.GridPanel GridPanel}
202     * using this ColumnModel will listen for this event and refresh its UI automatically.</p>
203     * @param {Array} config Array of Column definition objects.
204     * @param {Boolean} initial Specify <tt>true</tt> to bypass cleanup which deletes the <tt>totalWidth</tt>
205     * and destroys existing editors.
206     */
207    setConfig : function(config, initial) {
208        var i, c, len;
209       
210        if (!initial) { // cleanup
211            delete this.totalWidth;
212           
213            for (i = 0, len = this.config.length; i < len; i++) {
214                c = this.config[i];
215               
216                if (c.setEditor) {
217                    //check here, in case we have a special column like a CheckboxSelectionModel
218                    c.setEditor(null);
219                }
220            }
221        }
222
223        // backward compatibility
224        this.defaults = Ext.apply({
225            width: this.defaultWidth,
226            sortable: this.defaultSortable
227        }, this.defaults);
228
229        this.config = config;
230        this.lookup = {};
231
232        for (i = 0, len = config.length; i < len; i++) {
233            c = Ext.applyIf(config[i], this.defaults);
234           
235            // if no id, create one using column's ordinal position
236            if (Ext.isEmpty(c.id)) {
237                c.id = i;
238            }
239           
240            if (!c.isColumn) {
241                var Cls = Ext.grid.Column.types[c.xtype || 'gridcolumn'];
242                c = new Cls(c);
243                config[i] = c;
244            }
245           
246            this.lookup[c.id] = c;
247        }
248       
249        if (!initial) {
250            this.fireEvent('configchange', this);
251        }
252    },
253
254    /**
255     * Returns the column for a specified id.
256     * @param {String} id The column id
257     * @return {Object} the column
258     */
259    getColumnById : function(id) {
260        return this.lookup[id];
261    },
262
263    /**
264     * Returns the index for a specified column id.
265     * @param {String} id The column id
266     * @return {Number} the index, or -1 if not found
267     */
268    getIndexById : function(id) {
269        for (var i = 0, len = this.config.length; i < len; i++) {
270            if (this.config[i].id == id) {
271                return i;
272            }
273        }
274        return -1;
275    },
276
277    /**
278     * Moves a column from one position to another.
279     * @param {Number} oldIndex The index of the column to move.
280     * @param {Number} newIndex The position at which to reinsert the coolumn.
281     */
282    moveColumn : function(oldIndex, newIndex) {
283        var config = this.config,
284            c      = config[oldIndex];
285           
286        config.splice(oldIndex, 1);
287        config.splice(newIndex, 0, c);
288        this.dataMap = null;
289        this.fireEvent("columnmoved", this, oldIndex, newIndex);
290    },
291
292    /**
293     * Returns the number of columns.
294     * @param {Boolean} visibleOnly Optional. Pass as true to only include visible columns.
295     * @return {Number}
296     */
297    getColumnCount : function(visibleOnly) {
298        var length = this.config.length,
299            c = 0,
300            i;
301       
302        if (visibleOnly === true) {
303            for (i = 0; i < length; i++) {
304                if (!this.isHidden(i)) {
305                    c++;
306                }
307            }
308           
309            return c;
310        }
311       
312        return length;
313    },
314
315    /**
316     * Returns the column configs that return true by the passed function that is called
317     * with (columnConfig, index)
318<pre><code>
319// returns an array of column config objects for all hidden columns
320var columns = grid.getColumnModel().getColumnsBy(function(c){
321  return c.hidden;
322});
323</code></pre>
324     * @param {Function} fn A function which, when passed a {@link Ext.grid.Column Column} object, must
325     * return <code>true</code> if the column is to be included in the returned Array.
326     * @param {Object} scope (optional) The scope (<code>this</code> reference) in which the function
327     * is executed. Defaults to this ColumnModel.
328     * @return {Array} result
329     */
330    getColumnsBy : function(fn, scope) {
331        var config = this.config,
332            length = config.length,
333            result = [],
334            i, c;
335           
336        for (i = 0; i < length; i++){
337            c = config[i];
338           
339            if (fn.call(scope || this, c, i) === true) {
340                result[result.length] = c;
341            }
342        }
343       
344        return result;
345    },
346
347    /**
348     * Returns true if the specified column is sortable.
349     * @param {Number} col The column index
350     * @return {Boolean}
351     */
352    isSortable : function(col) {
353        return !!this.config[col].sortable;
354    },
355
356    /**
357     * Returns true if the specified column menu is disabled.
358     * @param {Number} col The column index
359     * @return {Boolean}
360     */
361    isMenuDisabled : function(col) {
362        return !!this.config[col].menuDisabled;
363    },
364
365    /**
366     * Returns the rendering (formatting) function defined for the column.
367     * @param {Number} col The column index.
368     * @return {Function} The function used to render the cell. See {@link #setRenderer}.
369     */
370    getRenderer : function(col) {
371        return this.config[col].renderer || Ext.grid.ColumnModel.defaultRenderer;
372    },
373
374    getRendererScope : function(col) {
375        return this.config[col].scope;
376    },
377
378    /**
379     * Sets the rendering (formatting) function for a column.  See {@link Ext.util.Format} for some
380     * default formatting functions.
381     * @param {Number} col The column index
382     * @param {Function} fn The function to use to process the cell's raw data
383     * to return HTML markup for the grid view. The render function is called with
384     * the following parameters:<ul>
385     * <li><b>value</b> : Object<p class="sub-desc">The data value for the cell.</p></li>
386     * <li><b>metadata</b> : Object<p class="sub-desc">An object in which you may set the following attributes:<ul>
387     * <li><b>css</b> : String<p class="sub-desc">A CSS class name to add to the cell's TD element.</p></li>
388     * <li><b>attr</b> : String<p class="sub-desc">An HTML attribute definition string to apply to the data container element <i>within</i> the table cell
389     * (e.g. 'style="color:red;"').</p></li></ul></p></li>
390     * <li><b>record</b> : Ext.data.record<p class="sub-desc">The {@link Ext.data.Record} from which the data was extracted.</p></li>
391     * <li><b>rowIndex</b> : Number<p class="sub-desc">Row index</p></li>
392     * <li><b>colIndex</b> : Number<p class="sub-desc">Column index</p></li>
393     * <li><b>store</b> : Ext.data.Store<p class="sub-desc">The {@link Ext.data.Store} object from which the Record was extracted.</p></li></ul>
394     */
395    setRenderer : function(col, fn) {
396        this.config[col].renderer = fn;
397    },
398
399    /**
400     * Returns the width for the specified column.
401     * @param {Number} col The column index
402     * @return {Number}
403     */
404    getColumnWidth : function(col) {
405        var width = this.config[col].width;
406        if(typeof width != 'number'){
407            width = this.defaultWidth;
408        }
409        return width;
410    },
411
412    /**
413     * Sets the width for a column.
414     * @param {Number} col The column index
415     * @param {Number} width The new width
416     * @param {Boolean} suppressEvent True to suppress firing the <code>{@link #widthchange}</code>
417     * event. Defaults to false.
418     */
419    setColumnWidth : function(col, width, suppressEvent) {
420        this.config[col].width = width;
421        this.totalWidth = null;
422       
423        if (!suppressEvent) {
424             this.fireEvent("widthchange", this, col, width);
425        }
426    },
427
428    /**
429     * Returns the total width of all columns.
430     * @param {Boolean} includeHidden True to include hidden column widths
431     * @return {Number}
432     */
433    getTotalWidth : function(includeHidden) {
434        if (!this.totalWidth) {
435            this.totalWidth = 0;
436            for (var i = 0, len = this.config.length; i < len; i++) {
437                if (includeHidden || !this.isHidden(i)) {
438                    this.totalWidth += this.getColumnWidth(i);
439                }
440            }
441        }
442        return this.totalWidth;
443    },
444
445    /**
446     * Returns the header for the specified column.
447     * @param {Number} col The column index
448     * @return {String}
449     */
450    getColumnHeader : function(col) {
451        return this.config[col].header;
452    },
453
454    /**
455     * Sets the header for a column.
456     * @param {Number} col The column index
457     * @param {String} header The new header
458     */
459    setColumnHeader : function(col, header) {
460        this.config[col].header = header;
461        this.fireEvent("headerchange", this, col, header);
462    },
463
464    /**
465     * Returns the tooltip for the specified column.
466     * @param {Number} col The column index
467     * @return {String}
468     */
469    getColumnTooltip : function(col) {
470            return this.config[col].tooltip;
471    },
472    /**
473     * Sets the tooltip for a column.
474     * @param {Number} col The column index
475     * @param {String} tooltip The new tooltip
476     */
477    setColumnTooltip : function(col, tooltip) {
478            this.config[col].tooltip = tooltip;
479    },
480
481    /**
482     * Returns the dataIndex for the specified column.
483<pre><code>
484// Get field name for the column
485var fieldName = grid.getColumnModel().getDataIndex(columnIndex);
486</code></pre>
487     * @param {Number} col The column index
488     * @return {String} The column's dataIndex
489     */
490    getDataIndex : function(col) {
491        return this.config[col].dataIndex;
492    },
493
494    /**
495     * Sets the dataIndex for a column.
496     * @param {Number} col The column index
497     * @param {String} dataIndex The new dataIndex
498     */
499    setDataIndex : function(col, dataIndex) {
500        this.config[col].dataIndex = dataIndex;
501    },
502
503    /**
504     * Finds the index of the first matching column for the given dataIndex.
505     * @param {String} col The dataIndex to find
506     * @return {Number} The column index, or -1 if no match was found
507     */
508    findColumnIndex : function(dataIndex) {
509        var c = this.config;
510        for(var i = 0, len = c.length; i < len; i++){
511            if(c[i].dataIndex == dataIndex){
512                return i;
513            }
514        }
515        return -1;
516    },
517
518    /**
519     * Returns true if the cell is editable.
520<pre><code>
521var store = new Ext.data.Store({...});
522var colModel = new Ext.grid.ColumnModel({
523  columns: [...],
524  isCellEditable: function(col, row) {
525    var record = store.getAt(row);
526    if (record.get('readonly')) { // replace with your condition
527      return false;
528    }
529    return Ext.grid.ColumnModel.prototype.isCellEditable.call(this, col, row);
530  }
531});
532var grid = new Ext.grid.GridPanel({
533  store: store,
534  colModel: colModel,
535  ...
536});
537</code></pre>
538     * @param {Number} colIndex The column index
539     * @param {Number} rowIndex The row index
540     * @return {Boolean}
541     */
542    isCellEditable : function(colIndex, rowIndex) {
543        var c = this.config[colIndex],
544            ed = c.editable;
545
546        //force boolean
547        return !!(ed || (!Ext.isDefined(ed) && c.editor));
548    },
549
550    /**
551     * Returns the editor defined for the cell/column.
552     * @param {Number} colIndex The column index
553     * @param {Number} rowIndex The row index
554     * @return {Ext.Editor} The {@link Ext.Editor Editor} that was created to wrap
555     * the {@link Ext.form.Field Field} used to edit the cell.
556     */
557    getCellEditor : function(colIndex, rowIndex) {
558        return this.config[colIndex].getCellEditor(rowIndex);
559    },
560
561    /**
562     * Sets if a column is editable.
563     * @param {Number} col The column index
564     * @param {Boolean} editable True if the column is editable
565     */
566    setEditable : function(col, editable) {
567        this.config[col].editable = editable;
568    },
569
570    /**
571     * Returns <tt>true</tt> if the column is <code>{@link Ext.grid.Column#hidden hidden}</code>,
572     * <tt>false</tt> otherwise.
573     * @param {Number} colIndex The column index
574     * @return {Boolean}
575     */
576    isHidden : function(colIndex) {
577        return !!this.config[colIndex].hidden; // ensure returns boolean
578    },
579
580    /**
581     * Returns <tt>true</tt> if the column is <code>{@link Ext.grid.Column#fixed fixed}</code>,
582     * <tt>false</tt> otherwise.
583     * @param {Number} colIndex The column index
584     * @return {Boolean}
585     */
586    isFixed : function(colIndex) {
587        return !!this.config[colIndex].fixed;
588    },
589
590    /**
591     * Returns true if the column can be resized
592     * @return {Boolean}
593     */
594    isResizable : function(colIndex) {
595        return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true;
596    },
597   
598    /**
599     * Sets if a column is hidden.
600<pre><code>
601myGrid.getColumnModel().setHidden(0, true); // hide column 0 (0 = the first column).
602</code></pre>
603     * @param {Number} colIndex The column index
604     * @param {Boolean} hidden True if the column is hidden
605     */
606    setHidden : function(colIndex, hidden) {
607        var c = this.config[colIndex];
608        if(c.hidden !== hidden){
609            c.hidden = hidden;
610            this.totalWidth = null;
611            this.fireEvent("hiddenchange", this, colIndex, hidden);
612        }
613    },
614
615    /**
616     * Sets the editor for a column and destroys the prior editor.
617     * @param {Number} col The column index
618     * @param {Object} editor The editor object
619     */
620    setEditor : function(col, editor) {
621        this.config[col].setEditor(editor);
622    },
623
624    /**
625     * Destroys this column model by purging any event listeners. Destroys and dereferences all Columns.
626     */
627    destroy : function() {
628        var length = this.config.length,
629            i = 0;
630
631        for (; i < length; i++){
632            this.config[i].destroy(); // Column's destroy encapsulates all cleanup.
633        }
634        delete this.config;
635        delete this.lookup;
636        this.purgeListeners();
637    },
638
639    /**
640     * @private
641     * Setup any saved state for the column, ensures that defaults are applied.
642     */
643    setState : function(col, state) {
644        state = Ext.applyIf(state, this.defaults);
645        Ext.apply(this.config[col], state);
646    }
647});
648
649// private
650Ext.grid.ColumnModel.defaultRenderer = function(value) {
651    if (typeof value == "string" && value.length < 1) {
652        return "&#160;";
653    }
654    return value;
655};
Note: See TracBrowser for help on using the repository browser.