UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

298 lines (241 loc) 7.79 kB
/* ************************************************************************ 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"); } });