/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2007 Derrell Lipman License: LGPL: http://www.gnu.org/licenses/lgpl.html EPL: http://www.eclipse.org/org/documents/epl-v10.php See the LICENSE file in the project's top-level directory for details. Authors: * Derrell Lipman (derrell) ************************************************************************ */ /* ************************************************************************ #module(table) #require(qx.ui.table.DefaultResizeBehavior) ************************************************************************ */ /** * A table column model that automagically resizes columns based on a * selected behavior. * * @see qx.ui.table.TableColumnModel */ qx.OO.defineClass("qx.ui.table.ResizeTableColumnModel", qx.ui.table.TableColumnModel, function() { qx.ui.table.TableColumnModel.call(this); // We don't want to recursively call ourself based on our resetting of // column sizes. Track when we're resizing. this._bInProgress = false; // Track when the table has appeared. We want to ignore resize events until // then since we won't be able to determine the available width anyway. this._bAppeared = false; }); /* * The behavior to use. * * The provided behavior must extend {link @AbstractResizeBehavior} and * implement the onAppear, onWindowResize, * onColumnWidthChanged and onVisibilityChangedmethods. */ qx.OO.addProperty( { name : "behavior", type : "object", defaultValue : new qx.ui.table.DefaultResizeBehavior() }); // Behavior modifier qx.Proto._modifyBehavior = function(propValue, propOldValue, propData) { // Tell the new behavior how many columns there are this.getBehavior()._setNumColumns(this._columnDataArr.length); return true; }; /** * Initializes the column model. * * @param colCount {Integer} * The number of columns the model should have. * * @param table {qx.ui.table.Table} * The table which this model is used for. This allows us access to other * aspects of the table, as the behavior sees fit. */ qx.Proto.init = function(numColumns, table) { // Call our superclass qx.ui.table.TableColumnModel.prototype.init.call(this, numColumns); // Save the table so we can get at its features, as necessary. this._table = table; // We'll do our column resizing when the table appears, ... table.addEventListener("appear", this._onappear, this); // ... when the window is resized, ... var d = qx.ui.core.ClientDocument.getInstance(); d.addEventListener("windowresize", this._onwindowresize, this); // ... when columns are resized, ... this.addEventListener("widthChanged", this._oncolumnwidthchanged, this); // ... and when a column visibility changes. this.addEventListener("visibilityChanged", this._onvisibilitychanged, this); // We want to manipulate the button visibility menu this._table.addEventListener("columnVisibilityMenuCreateEnd", this._addResetColumnWidthButton, this); // Tell the behavior how many columns there are this.getBehavior()._setNumColumns(numColumns); }; /** * Reset the column widths to their "onappear" defaults. * * @param event {qx.event.type.DataEvent} * The "columnVisibilityMenuCreateEnd" event indicating that the menu is * being generated. The data is a map containing propeties table and * menu. */ qx.Proto._addResetColumnWidthButton = function(event) { var data = event.getData(); var menu = data.menu; var o; var Am = qx.manager.object.AliasManager; var icon = Am.getInstance().resolvePath("icon/16/actions/view-refresh.png"); // Add a separator between the column names and our reset button o= new qx.ui.menu.Separator(); menu.add(o); // Add a button to reset the column widths o = new qx.ui.menu.Button("Reset column widths", icon); menu.add(o); o.addEventListener("execute", this._onappear, this); }; /** * Event handler for the "onappear" event. * * @param event {qx.event.type.Event} * The "onappear" event object. */ qx.Proto._onappear = function(event) { // Is this a recursive call? if (this._bInProgress) { // Yup. Ignore it. return; } this._bInProgress = true; this.debug("onappear"); this.getBehavior().onAppear(this, event); this._bInProgress = false; this._bAppeared = true; }; /** * Event handler for the "onwindowresize" event. * * @param event {qx.event.type.Event} * The "onwidowresize" event object. */ qx.Proto._onwindowresize = function(event) { // Is this a recursive call or has the table not yet been rendered? if (this._bInProgress || ! this._bAppeared) { // Yup. Ignore it. return; } this._bInProgress = true; this.debug("onwindowresize"); this.getBehavior().onWindowResize(this, event); this._bInProgress = false; }; /** * Event handler for the "oncolumnwidthchanged" event. * * @param event {qx.event.type.DataEvent} * The "oncolumnwidthchanged" event object. */ qx.Proto._oncolumnwidthchanged = function(event) { // Is this a recursive call or has the table not yet been rendered? if (this._bInProgress || ! this._bAppeared) { // Yup. Ignore it. return; } this._bInProgress = true; this.debug("oncolumnwidthchanged"); this.getBehavior().onColumnWidthChanged(this, event); this._bInProgress = false; }; /** * Event handler for the "onvisibilitychangned" event. * * @param event {qx.event.type.DataEvent} * The "onvisibilitychanged" event object. */ qx.Proto._onvisibilitychanged = function(event) { // Is this a recursive call or has the table not yet been rendered? if (this._bInProgress || ! this._bAppeared) { // Yup. Ignore it. return; } this._bInProgress = true; this.debug("onvisibilitychanged"); this.getBehavior().onVisibilityChanged(this, event); this._bInProgress = false; };