UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

333 lines (257 loc) 8.15 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2010 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) ************************************************************************ */ /** * The provider implements the {@link qx.ui.virtual.core.IWidgetCellProvider} API, * which can be used as delegate for the widget cell rendering and it * provides a API to bind the model with the rendered item. * * @internal */ qx.Class.define("qx.ui.list.provider.WidgetProvider", { extend : qx.core.Object, implement : [ qx.ui.virtual.core.IWidgetCellProvider, qx.ui.list.provider.IListProvider ], include : [qx.ui.list.core.MWidgetController], /** * Creates the <code>WidgetProvider</code> * * @param list {qx.ui.list.List} list to provide. */ construct : function(list) { this.base(arguments); this._list = list; this._itemRenderer = this.createItemRenderer(); this._groupRenderer = this.createGroupRenderer(); this._itemRenderer.addListener("created", this._onItemCreated, this); this._groupRenderer.addListener("created", this._onGroupItemCreated, this); this._list.addListener("changeDelegate", this._onChangeDelegate, this); }, members : { /** @type {qx.ui.virtual.cell.WidgetCell} the used item renderer */ _itemRenderer : null, /** @type {qx.ui.virtual.cell.WidgetCell} the used group renderer */ _groupRenderer : null, /* --------------------------------------------------------------------------- PUBLIC API --------------------------------------------------------------------------- */ // interface implementation getCellWidget : function(row, column) { var widget = null; if (!this._list._isGroup(row)) { widget = this._itemRenderer.getCellWidget(); widget.setUserData("cell.type", "item"); this._bindItem(widget, this._list._lookup(row)); if(this._list._manager.isItemSelected(row)) { this._styleSelectabled(widget); } else { this._styleUnselectabled(widget); } } else { widget = this._groupRenderer.getCellWidget(); widget.setUserData("cell.type", "group"); this._bindGroupItem(widget, this._list._lookupGroup(row)); } return widget; }, // interface implementation poolCellWidget : function(widget) { this._removeBindingsFrom(widget); if (widget.getUserData("cell.type") == "item") { this._itemRenderer.pool(widget); } else if (widget.getUserData("cell.type") == "group") { this._groupRenderer.pool(widget); } this._onPool(widget); }, // interface implementation createLayer : function() { return new qx.ui.virtual.layer.WidgetCell(this); }, // interface implementation createItemRenderer : function() { var createWidget = qx.util.Delegate.getMethod(this.getDelegate(), "createItem"); if (createWidget == null) { createWidget = function() { return new qx.ui.form.ListItem(); }; } var renderer = new qx.ui.virtual.cell.WidgetCell(); renderer.setDelegate({ createWidget : createWidget }); return renderer; }, // interface implementation createGroupRenderer : function() { var createWidget = qx.util.Delegate.getMethod(this.getDelegate(), "createGroupItem"); if (createWidget == null) { createWidget = function() { var group = new qx.ui.basic.Label(); group.setAppearance("group-item"); return group; }; } var renderer = new qx.ui.virtual.cell.WidgetCell(); renderer.setDelegate({ createWidget : createWidget }); return renderer; }, // interface implementation styleSelectabled : function(row) { var widget = this.__getWidgetFrom(row); this._styleSelectabled(widget); }, // interface implementation styleUnselectabled : function(row) { var widget = this.__getWidgetFrom(row); this._styleUnselectabled(widget); }, // interface implementation isSelectable : function(row) { if (this._list._isGroup(row)) { return false; } var widget = this._list._layer.getRenderedCellWidget(row, 0); if (widget != null) { return widget.isEnabled(); } else { return true; } }, /* --------------------------------------------------------------------------- INTERNAL API --------------------------------------------------------------------------- */ /** * Styles a selected item. * * @param widget {qx.ui.core.Widget} widget to style. */ _styleSelectabled : function(widget) { this.__updateStates(widget, {selected: 1}); }, /** * Styles a not selected item. * * @param widget {qx.ui.core.Widget} widget to style. */ _styleUnselectabled : function(widget) { this.__updateStates(widget, {}); }, /** * Calls the delegate <code>onPool</code> method when it is used in the * {@link #delegate} property. * * @param item {qx.ui.core.Widget} Item to modify. */ _onPool : function(item) { var onPool = qx.util.Delegate.getMethod(this.getDelegate(), "onPool"); if (onPool != null) { onPool(item); } }, /* --------------------------------------------------------------------------- EVENT HANDLERS --------------------------------------------------------------------------- */ /** * Event handler for the created item widget event. * * @param event {qx.event.type.Data} fired event. */ _onItemCreated : function(event) { var widget = event.getData(); this._configureItem(widget); }, /** * Event handler for the created item widget event. * * @param event {qx.event.type.Data} fired event. */ _onGroupItemCreated : function(event) { var widget = event.getData(); this._configureGroupItem(widget); }, /** * Event handler for the change delegate event. * * @param event {qx.event.type.Data} fired event. */ _onChangeDelegate : function(event) { this._itemRenderer.dispose(); this._itemRenderer = this.createItemRenderer(); this._itemRenderer.addListener("created", this._onItemCreated, this); this._groupRenderer.dispose(); this._groupRenderer = this.createGroupRenderer(); this._groupRenderer.addListener("created", this._onGroupItemCreated, this); this.removeBindings(); this._list.getPane().fullUpdate(); }, /* --------------------------------------------------------------------------- HELPER METHODS --------------------------------------------------------------------------- */ /** * Helper method to get the widget from the passed row. * * @param row {Integer} row to search. * @return {qx.ui.core.Widget|null} The found widget or <code>null</code> when no widget found. */ __getWidgetFrom : function(row) { return this._list._layer.getRenderedCellWidget(row, 0); }, /** * Helper method to update the states from a widget. * * @param widget {qx.ui.core.Widget} widget to set states. * @param states {Map} the state to set. */ __updateStates : function(widget, states) { if(widget == null) { return; } this._itemRenderer.updateStates(widget, states); } }, destruct : function() { this._itemRenderer.dispose(); this._groupRenderer.dispose(); this._itemRenderer = this._groupRenderer = null; } });