Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dojox.grid.Grid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.grid.Grid"] = true;
dojo.provide("dojox.grid.Grid");
dojo.require("dojox.grid.VirtualGrid");
dojo.require("dojox.grid._data.model");
dojo.require("dojox.grid._data.editors");

dojo.declare('dojox.Grid', dojox.VirtualGrid, {
        //      summary:
        //              A grid widget with virtual scrolling, cell editing, complex rows,
        //              sorting, fixed columns, sizeable columns, etc.
        //      description:
        //              Grid is a subclass of VirtualGrid, providing binding to a data
        //              store.
        //      example:
        //              define the grid structure:
        //      |       var structure = [ // array of view objects
        //      |               { cells: [// array of rows, a row is an array of cells
        //      |                       [       { name: "Alpha", width: 6 }, 
        //      |                               { name: "Beta" }, 
        //      |                               { name: "Gamma", get: formatFunction }
        //      |                       ]
        //      |               ]}
        //      |       ];
        //              
        //              define a grid data model
        //      |       var model = new dojox.grid.data.table(null, data);
        //      |
        //      |       <div id="grid" model="model" structure="structure" 
        //      |               dojoType="dojox.VirtualGrid"></div>
        //      

        //      model:
        //              string or object grid data model
        model: 'dojox.grid.data.Table',
        // life cycle
        postCreate: function(){
                if(this.model){
                        var m = this.model;
                        if(dojo.isString(m)){
                                m = dojo.getObject(m);
                        }
                        this.model = (dojo.isFunction(m)) ? new m() : m;
                        this._setModel(this.model);
                }
                this.inherited(arguments);
        },
        destroy: function(){
                this.setModel(null);
                this.inherited(arguments);
        },
        // structure
        _structureChanged: function() {
                this.indexCellFields();
                this.inherited(arguments);
        },
        // model
        _setModel: function(inModel){
                // if(!inModel){ return; }
                this.model = inModel;
                if(this.model){
                        this.model.observer(this);
                        this.model.measure();
                        this.indexCellFields();
                }
        },
        setModel: function(inModel){
                // summary:
                //              set the grid's data model
                // inModel:
                //              model object, usually an instance of a dojox.grid.data.Model
                //              subclass
                if(this.model){
                        this.model.notObserver(this);
                }
                this._setModel(inModel);
        },
        // data socket (called in cell's context)
        get: function(inRowIndex){
                return this.grid.model.getDatum(inRowIndex, this.fieldIndex);
        },
        // model modifications
        modelAllChange: function(){
                this.rowCount = (this.model ? this.model.getRowCount() : 0);
                this.updateRowCount(this.rowCount);
        },
        modelRowChange: function(inData, inRowIndex){
                this.updateRow(inRowIndex);
        },
        modelDatumChange: function(inDatum, inRowIndex, inFieldIndex){
                this.updateRow(inRowIndex);
        },
        modelFieldsChange: function() {
                this.indexCellFields();
                this.render();
        },
        // model insertion
        modelInsertion: function(inRowIndex){
                this.updateRowCount(this.model.getRowCount());
        },
        // model removal
        modelRemoval: function(inKeys){
                this.updateRowCount(this.model.getRowCount());
        },
        // cells
        getCellName: function(inCell){
                var v = this.model.fields.values, i = inCell.fieldIndex;
                return i>=0 && i<v.length && v[i].name || this.inherited(arguments);
        },
        indexCellFields: function(){
                var cells = this.layout.cells;
                for(var i=0, c; cells && (c=cells[i]); i++){
                        if(dojo.isString(c.field)){
                                c.fieldIndex = this.model.fields.indexOf(c.field);
                        }
                }
        },
        // utility
        refresh: function(){
                // summary:
                //      re-render the grid, getting new data from the model
                this.edit.cancel();
                this.model.measure();
        },
        // sorting
        canSort: function(inSortInfo){
                var f = this.getSortField(inSortInfo);
                // 0 is not a valid sort field
                return f && this.model.canSort(f);
        },
        getSortField: function(inSortInfo){
                // summary:
                //      retrieves the model field on which to sort data.
                // inSortInfo: int
                //      1-based grid column index; positive if sort is ascending, otherwise negative
                var c = this.getCell(this.getSortIndex(inSortInfo));
                // we expect c.fieldIndex == -1 for non model fields
                // that yields a getSortField value of 0, which can be detected as invalid
                return (c.fieldIndex+1) * (this.sortInfo > 0 ? 1 : -1);
        },
        sort: function(){
                this.edit.apply();
                this.model.sort(this.getSortField());
        },
        // row editing
        addRow: function(inRowData, inIndex){
                this.edit.apply();
                var i = inIndex || -1;
                if(i<0){
                        i = this.selection.getFirstSelected() || 0;
                }
                if(i<0){
                        i = 0;
                }
                this.model.insert(inRowData, i);
                this.model.beginModifyRow(i);
                // begin editing row
                // FIXME: add to edit
                for(var j=0, c; ((c=this.getCell(j)) && !c.editor); j++){}
                if(c&&c.editor){
                        this.edit.setEditCell(c, i);
                }
        },
        removeSelectedRows: function(){
                this.edit.apply();
                var s = this.selection.getSelected();
                if(s.length){
                        this.model.remove(s);
                        this.selection.clear();
                }
        },
        //: protected
        // editing
        canEdit: function(inCell, inRowIndex){
                // summary: 
                //      determines if a given cell may be edited
                //      inCell: grid cell
                // inRowIndex: grid row index
                // returns: true if given cell may be edited
                return (this.model.canModify ? this.model.canModify(inRowIndex) : true);
        },
        doStartEdit: function(inCell, inRowIndex){
                var edit = this.canEdit(inCell, inRowIndex);
                if(edit){
                        this.model.beginModifyRow(inRowIndex);
                        this.onStartEdit(inCell, inRowIndex);
                }
                return edit;
        },
        doApplyCellEdit: function(inValue, inRowIndex, inFieldIndex){
                this.model.setDatum(inValue, inRowIndex, inFieldIndex);
                this.onApplyCellEdit(inValue, inRowIndex, inFieldIndex);
        },
        doCancelEdit: function(inRowIndex){
                this.model.cancelModifyRow(inRowIndex);
                this.onCancelEdit.apply(this, arguments);
        },
        doApplyEdit: function(inRowIndex){
                this.model.endModifyRow(inRowIndex);
                this.onApplyEdit(inRowIndex);
        },
        // Perform row styling 
        styleRowState: function(inRow){
                if(this.model.getState){
                        var states=this.model.getState(inRow.index), c='';
                        for(var i=0, ss=["inflight", "error", "inserting"], s; s=ss[i]; i++){
                                if(states[s]){
                                        c = ' dojoxGrid-row-' + s;
                                        break;
                                }
                        }
                        inRow.customClasses += c;
                }
        },
        onStyleRow: function(inRow){
                this.styleRowState(inRow);
                this.inherited(arguments);
        },
        junk: 0
});

}