/*
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.grid._Selector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.grid._Selector"] = true;
dojo.provide("dojox.grid._Selector");
dojo.require("dojox.grid.Selection");
dojo.require("dojox.grid._View");
dojo.require("dojox.grid._Builder");
(function(){
dojox.grid._InputSelectorHeaderBuilder = dojo.extend(function(view){
dojox.grid._HeaderBuilder.call(this, view);
},dojox.grid._HeaderBuilder.prototype,{
generateHtml: function(){
var w = this.view.contentWidth || 0;
var selectedCount = this.view.grid.selection.getSelectedCount();
var checked = (selectedCount && selectedCount == this.view.grid.rowCount) ? ' dijitCheckBoxChecked dijitChecked' : '';
return '<table style="width:' + w + 'px;" ' +
'border="0" cellspacing="0" cellpadding="0" ' +
'role="presentation"><tr><th style="text-align: center;">' +
'<div class="dojoxGridCheckSelector dijitReset dijitInline dijitCheckBox' + checked + '"></div></th></tr></table>';
},
doclick: function(e){
var selectedCount = this.view.grid.selection.getSelectedCount();
this.view._selectionChanging = true;
if(selectedCount==this.view.grid.rowCount){
this.view.grid.selection.deselectAll();
}else{
this.view.grid.selection.selectRange(0, this.view.grid.rowCount-1);
}
this.view._selectionChanging = false;
this.view.onSelectionChanged();
return true;
}
});
dojox.grid._SelectorContentBuilder = dojo.extend(function(view){
dojox.grid._ContentBuilder.call(this, view);
},dojox.grid._ContentBuilder.prototype,{
generateHtml: function(inDataIndex, inRowIndex){
var w = this.view.contentWidth || 0;
return '<table class="dojoxGridRowbarTable" style="width:' + w + 'px;" border="0" ' +
'cellspacing="0" cellpadding="0" role="presentation"><tr>' +
'<td style="text-align: center;" class="dojoxGridRowbarInner">' + this.getCellContent(inRowIndex) + '</td></tr></table>';
},
getCellContent: function(inRowIndex){
return ' ';
},
findTarget: function(){
var t = dojox.grid._ContentBuilder.prototype.findTarget.apply(this, arguments);
return t;
},
domouseover: function(e){
this.view.grid.onMouseOverRow(e);
},
domouseout: function(e){
if(!this.isIntraRowEvent(e)){
this.view.grid.onMouseOutRow(e);
}
},
doclick: function(e){
var idx = e.rowIndex;
var selected = this.view.grid.selection.isSelected(idx);
var mode = this.view.grid.selection.mode;
if(!selected){
if(mode == 'single'){
this.view.grid.selection.select(idx);
}else if(mode != 'none'){
this.view.grid.selection.addToSelection(idx);
}
}else{
this.view.grid.selection.deselect(idx);
}
return true;
}
});
dojox.grid._InputSelectorContentBuilder = dojo.extend(function(view){
dojox.grid._SelectorContentBuilder.call(this, view);
},dojox.grid._SelectorContentBuilder.prototype,{
getCellContent: function(rowIndex){
var v = this.view;
var type = v.inputType == "checkbox" ? "CheckBox" : "Radio";
var checked = !!v.grid.selection.isSelected(rowIndex) ? ' dijit' + type + 'Checked dijitChecked' : '';
return '<div class="dojoxGridCheckSelector dijitReset dijitInline dijit' + type + checked + '"></div>';
}
});
dojo.declare("dojox.grid._Selector", dojox.grid._View, {
inputType: '',
selectionMode: '',
// summary:
// Custom grid view. If used in a grid structure, provides a small selectable region for grid rows.
defaultWidth: "2em",
noscroll: true,
padBorderWidth: 2,
_contentBuilderClass: dojox.grid._SelectorContentBuilder,
postCreate: function(){
this.inherited(arguments);
if(this.selectionMode){
this.grid.selection.mode = this.selectionMode;
}
this.connect(this.grid.selection, 'onSelected', 'onSelected');
this.connect(this.grid.selection, 'onDeselected', 'onDeselected');
},
buildRendering: function(){
this.inherited(arguments);
this.scrollboxNode.style.overflow = "hidden";
},
getWidth: function(){
return this.viewWidth || this.defaultWidth;
},
resize: function(){
this.adaptHeight();
},
setStructure: function(s){
this.inherited(arguments);
if(s.defaultWidth){
this.defaultWidth = s.defaultWidth;
}
},
adaptWidth: function(){
// Only calculate this here - rather than every call to buildRowContent
if(!("contentWidth" in this) && this.contentNode){
this.contentWidth = this.contentNode.offsetWidth - this.padBorderWidth;
}
},
// styling
doStyleRowNode: function(inRowIndex, inRowNode){
var n = [ "dojoxGridRowbar dojoxGridNonNormalizedCell" ];
if(this.grid.rows.isOver(inRowIndex)){
n.push("dojoxGridRowbarOver");
}
if(this.grid.selection.isSelected(inRowIndex)){
n.push("dojoxGridRowbarSelected");
}
inRowNode.className = n.join(" ");
},
// event handlers
onSelected: function(inIndex){
this.grid.updateRow(inIndex);
},
onDeselected: function(inIndex){
this.grid.updateRow(inIndex);
}
});
if(!dojox.grid._View.prototype._headerBuilderClass &&
!dojox.grid._View.prototype._contentBuilderClass){
dojox.grid._Selector.prototype.postCreate = function(){
this.connect(this.scrollboxNode,"onscroll","doscroll");
dojox.grid.util.funnelEvents(this.contentNode, this, "doContentEvent", [ 'mouseover', 'mouseout', 'click', 'dblclick', 'contextmenu', 'mousedown' ]);
dojox.grid.util.funnelEvents(this.headerNode, this, "doHeaderEvent", [ 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'click', 'contextmenu' ]);
if(this._contentBuilderClass){
this.content = new this._contentBuilderClass(this);
}else{
this.content = new dojox.grid._ContentBuilder(this);
}
if(this._headerBuilderClass){
this.header = new this._headerBuilderClass(this);
}else{
this.header = new dojox.grid._HeaderBuilder(this);
}
//BiDi: in RTL case, style width='9000em' causes scrolling problem in head node
if(!dojo._isBodyLtr()){
this.headerNodeContainer.style.width = "";
}
this.connect(this.grid.selection, 'onSelected', 'onSelected');
this.connect(this.grid.selection, 'onDeselected', 'onDeselected');
};
}
dojo.declare("dojox.grid._RadioSelector", dojox.grid._Selector, {
inputType: 'radio',
selectionMode: 'single',
_contentBuilderClass: dojox.grid._InputSelectorContentBuilder,
buildRendering: function(){
this.inherited(arguments);
this.headerNode.style.visibility = "hidden";
},
renderHeader: function(){}
});
dojo.declare("dojox.grid._CheckBoxSelector", dojox.grid._Selector, {
inputType: 'checkbox',
_headerBuilderClass: dojox.grid._InputSelectorHeaderBuilder,
_contentBuilderClass: dojox.grid._InputSelectorContentBuilder,
postCreate: function(){
this.inherited(arguments);
this.connect(this.grid, 'onSelectionChanged', 'onSelectionChanged');
this.connect(this.grid, 'updateRowCount', '_updateVisibility');
},
renderHeader: function(){
this.inherited(arguments);
this._updateVisibility(this.grid.rowCount);
},
_updateVisibility: function(rowCount){
this.headerNode.style.visibility = rowCount ? "" : "hidden";
},
onSelectionChanged: function(){
if(this._selectionChanging){ return; }
var inputDiv = dojo.query('.dojoxGridCheckSelector', this.headerNode)[0];
var g = this.grid;
var s = (g.rowCount && g.rowCount == g.selection.getSelectedCount());
g.allItemsSelected = s||false;
dojo.toggleClass(inputDiv, "dijitChecked", g.allItemsSelected);
dojo.toggleClass(inputDiv, "dijitCheckBoxChecked", g.allItemsSelected);
}
});
})();
}