@qooxdoo/framework
Version:
The JS Framework for Coders
298 lines (241 loc) • 7.79 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Christian Hagendorn (chris_schmidt)
************************************************************************ */
/**
* Responsible for the single selection management.
*
* The class manage a list of {@link qx.ui.core.Widget} which are returned from
* {@link qx.ui.core.ISingleSelectionProvider#getItems}.
*
* @internal
*/
qx.Class.define("qx.ui.core.SingleSelectionManager",
{
extend : qx.core.Object,
/*
*****************************************************************************
CONSTRUCTOR
*****************************************************************************
*/
/**
* Construct the single selection manager.
*
* @param selectionProvider {qx.ui.core.ISingleSelectionProvider} The provider
* for selection.
*/
construct : function(selectionProvider) {
this.base(arguments);
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInterface(selectionProvider,
qx.ui.core.ISingleSelectionProvider,
"Invalid selectionProvider!");
}
this.__selectionProvider = selectionProvider;
},
/*
*****************************************************************************
EVENTS
*****************************************************************************
*/
events :
{
/** Fires after the selection was modified */
"changeSelected" : "qx.event.type.Data"
},
/*
*****************************************************************************
PROPERTIES
*****************************************************************************
*/
properties :
{
/**
* If the value is <code>true</code> the manager allows an empty selection,
* otherwise the first selectable element returned from the
* <code>qx.ui.core.ISingleSelectionProvider</code> will be selected.
*/
allowEmptySelection :
{
check : "Boolean",
init : true,
apply : "__applyAllowEmptySelection"
}
},
/*
*****************************************************************************
MEMBERS
*****************************************************************************
*/
members :
{
/** @type {qx.ui.core.Widget} The selected widget. */
__selected : null,
/** @type {qx.ui.core.ISingleSelectionProvider} The provider for selection management */
__selectionProvider : null,
/*
---------------------------------------------------------------------------
PUBLIC API
---------------------------------------------------------------------------
*/
/**
* Returns the current selected element.
*
* @return {qx.ui.core.Widget | null} The current selected widget or
* <code>null</code> if the selection is empty.
*/
getSelected : function() {
return this.__selected;
},
/**
* Selects the passed element.
*
* @param item {qx.ui.core.Widget} Element to select.
* @throws {Error} if the element is not a child element.
*/
setSelected : function(item) {
if (!this.__isChildElement(item)) {
throw new Error("Could not select " + item +
", because it is not a child element!");
}
this.__setSelected(item);
},
/**
* Reset the current selection. If {@link #allowEmptySelection} is set to
* <code>true</code> the first element will be selected.
*/
resetSelected : function(){
this.__setSelected(null);
},
/**
* Return <code>true</code> if the passed element is selected.
*
* @param item {qx.ui.core.Widget} Element to check if selected.
* @return {Boolean} <code>true</code> if passed element is selected,
* <code>false</code> otherwise.
* @throws {Error} if the element is not a child element.
*/
isSelected : function(item) {
if (!this.__isChildElement(item)) {
throw new Error("Could not check if " + item + " is selected," +
" because it is not a child element!");
}
return this.__selected === item;
},
/**
* Returns <code>true</code> if selection is empty.
*
* @return {Boolean} <code>true</code> if selection is empty,
* <code>false</code> otherwise.
*/
isSelectionEmpty : function() {
return this.__selected == null;
},
/**
* Returns all elements which are selectable.
*
* @param all {Boolean} true for all selectables, false for the
* selectables the user can interactively select
* @return {qx.ui.core.Widget[]} The contained items.
*/
getSelectables : function(all)
{
var items = this.__selectionProvider.getItems();
var result = [];
for (var i = 0; i < items.length; i++)
{
if (this.__selectionProvider.isItemSelectable(items[i])) {
result.push(items[i]);
}
}
// in case of an user selectable list, remove the enabled items
if (!all) {
for (var i = result.length -1; i >= 0; i--) {
if (!result[i].getEnabled()) {
result.splice(i, 1);
}
};
}
return result;
},
/*
---------------------------------------------------------------------------
APPLY METHODS
---------------------------------------------------------------------------
*/
// apply method
__applyAllowEmptySelection : function(value, old)
{
if (!value) {
this.__setSelected(this.__selected);
}
},
/*
---------------------------------------------------------------------------
HELPERS
---------------------------------------------------------------------------
*/
/**
* Set selected element.
*
* If passes value is <code>null</code>, the selection will be reseted.
*
* @param item {qx.ui.core.Widget | null} element to select, or
* <code>null</code> to reset selection.
*/
__setSelected : function(item) {
var oldSelected = this.__selected;
var newSelected = item;
if (newSelected != null && oldSelected === newSelected) {
return;
}
if (!this.isAllowEmptySelection() && newSelected == null) {
var firstElement = this.getSelectables(true)[0];
if (firstElement) {
newSelected = firstElement;
}
}
this.__selected = newSelected;
this.fireDataEvent("changeSelected", newSelected, oldSelected);
},
/**
* Checks if passed element is a child element.
*
* @param item {qx.ui.core.Widget} Element to check if child element.
* @return {Boolean} <code>true</code> if element is child element,
* <code>false</code> otherwise.
*/
__isChildElement : function(item)
{
var items = this.__selectionProvider.getItems();
for (var i = 0; i < items.length; i++)
{
if (items[i] === item)
{
return true;
}
}
return false;
}
},
/*
*****************************************************************************
DESTRUCTOR
*****************************************************************************
*/
destruct : function() {
if (this.__selectionProvider.toHashCode) {
this._disposeObjects("__selectionProvider");
} else {
this.__selectionProvider = null;
}
this._disposeObjects("__selected");
}
});