@qooxdoo/framework
Version:
The JS Framework for Coders
224 lines (183 loc) • 6.69 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2007 Derrell Lipman
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Derrell Lipman (derrell)
************************************************************************ */
/**
* A selection manager. This is a helper class that handles all selection
* related events and updates a SelectionModel.
* <p>
* This Selection Manager differs from its superclass in that we do not want
* rows to be selected when moving around with the keyboard.
*/
qx.Class.define("qx.ui.treevirtual.SelectionManager",
{
extend : qx.ui.table.selection.Manager,
/**
* @param table {qx.ui.table.Table}
* The table whose selections are being managed
*/
construct : function(table)
{
this.base(arguments);
this.__table = table;
},
members :
{
__table : null,
/**
* Getter for the table being managed
*
* @return {qx.ui.table.Table}
* Table being managed
*/
getTable : function()
{
return this.__table;
},
/**
* Handles a select event. First we determine if the click was on the
* open/close button and toggle the opened/closed state as necessary.
* Then, if the click was not on the open/close button or if the table's
* "openCloseClickSelectsRow" property so indicates, call our superclass to
* handle the actual row selection.
*
* @param index {Integer} the index the event is pointing at.
* @param evt {Map} the mouse event.
*/
_handleSelectEvent : function(index, evt)
{
var _this = this;
function handleButtonClick(tree, index, evt)
{
// Get the data model
var dataModel = tree.getDataModel();
// Determine the column containing the tree
var treeCol = dataModel.getTreeColumn();
// Get the focused column
var focusedCol = tree.getFocusedColumn();
// If the click is not in the tree column, ...
if (focusedCol != treeCol)
{
// ... then let the Table selection manager deal with it
return false;
}
// If the cell hasn't been focused automatically...
if (evt instanceof qx.event.type.Mouse)
{
if (! tree.getFocusCellOnPointerMove())
{
// ... then focus it now so we can determine the node to open/close
var scrollers = tree._getPaneScrollerArr();
for (var i=0; i<scrollers.length; i++)
{
scrollers[i]._focusCellAtPagePos(evt.getViewportLeft(),
evt.getViewportTop());
}
}
}
// Get the node to which this event applies
var node = dataModel.getNode(tree.getFocusedRow());
if (!node) {
return false;
}
// Was this a mouse event?
if (evt instanceof qx.event.type.Mouse)
{
// Yup. Get the order of the columns
var tcm = tree.getTableColumnModel();
var columnPositions = tcm._getColToXPosMap();
// Calculate the position of the beginning of the tree column
var left = qx.bom.element.Location.getLeft(
tree.getContentElement().getDomElement());
for (var i=0; i<columnPositions[treeCol].visX; i++) {
left += tcm.getColumnWidth(columnPositions[i].visX);
}
// Was the click on the open/close button? That button begins at
// (node.level - 1) * (rowHeight + 3) + 2 (the latter for padding),
// and has width (rowHeight + 3). We add a bit of latitude to that.
var x = evt.getViewportLeft();
var latitude = 2;
var rowHeight = _this.__table.getRowHeight();
var buttonPos = left + (node.level - 1) * (rowHeight + 3) + 2;
if (x >= buttonPos - latitude && x <= buttonPos + rowHeight + 3 + latitude)
{
// Yup. Toggle the opened state for this node.
dataModel.setState(node, { bOpened : ! node.bOpened });
return tree.getOpenCloseClickSelectsRow() ? false : true;
}
else
{
return _this._handleExtendedClick(tree, evt, node, left);
}
}
else
{
// See which key generated the event
var identifier = evt.getKeyIdentifier();
switch(identifier)
{
case "Space":
// This should only select the row, not toggle the opened state
return false;
case "Enter":
// Toggle the open state if open/close is allowed
if (!node.bHideOpenClose &&
node.type != qx.ui.treevirtual.SimpleTreeDataModel.Type.LEAF)
{
dataModel.setState(node, { bOpened : ! node.bOpened });
}
return tree.getOpenCloseClickSelectsRow() ? false : true;
default:
// Unrecognized key. Ignore it.
return true;
}
}
}
// Call our local method to toggle the open/close state, if necessary
var bNoSelect = handleButtonClick(this.__table, index, evt);
// If we haven't been told not to do the selection...
if (!bNoSelect)
{
// then call the superclass to handle it.
this.base(arguments, index, evt);
}
},
/**
* Handle a mouse click event that is not normally handled by the simple
* tree. This is intended for more sophisticated trees where clicks in
* different places, e.g. on various icons or on the label itself, should
* be handled specially.
*
* @param tree {qx.ui.treevirtual.TreeVirtual}
* The tree on which the event has occurred.
*
* @param evt {Map}
* The mouse event. Of particular interest is evt.getViewportLeft()
* which is the horizontal offset from the left border of the click.
*
* @param node {Map}
* The node which the tree row is displaying
*
* @param left {Integer}
* The offset from the left, of the beginning of the tree column.
*
* @return {Boolean}
* <i>true</i> if the row should be prevented from being selected;
* <i>false</i> otherwise.
*/
_handleExtendedClick : function(tree, evt, node, left)
{
return false;
}
},
destruct : function() {
this.__table = null;
}
});