UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

301 lines (248 loc) 7.91 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(list) { super(); 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(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(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() { return new qx.ui.virtual.layer.WidgetCell(this); }, // interface implementation createItemRenderer() { 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() { 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(row) { var widget = this.__getWidgetFrom(row); this._styleSelectabled(widget); }, // interface implementation styleUnselectabled(row) { var widget = this.__getWidgetFrom(row); this._styleUnselectabled(widget); }, // interface implementation isSelectable(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(widget) { this.__updateStates(widget, { selected: 1 }); }, /** * Styles a not selected item. * * @param widget {qx.ui.core.Widget} widget to style. */ _styleUnselectabled(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(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(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(event) { var widget = event.getData(); this._configureGroupItem(widget); }, /** * Event handler for the change delegate event. * * @param event {qx.event.type.Data} fired event. */ _onChangeDelegate(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(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(widget, states) { if (widget == null) { return; } this._itemRenderer.updateStates(widget, states); } }, destruct() { this._itemRenderer.dispose(); this._groupRenderer.dispose(); this._itemRenderer = this._groupRenderer = null; } });