/* * Copyright (C) 2017 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ WI.TableColumn = class TableColumn extends WI.Object { constructor(identifier, name, {initialWidth, minWidth, maxWidth, hidden, sortable, hideable, align, resizeType, headerView, needsReloadOnResize} = {}) { super(); console.assert(identifier); console.assert(name); console.assert(!initialWidth || initialWidth > 0); console.assert(!minWidth || minWidth >= 0); console.assert(!maxWidth || maxWidth >= 0); this._identifier = identifier; this._name = name; this._width = initialWidth || NaN; this._minWidth = minWidth || 50; this._maxWidth = maxWidth || 0; this._initialWidth = initialWidth || NaN; this._hidden = hidden || false; this._defaultHidden = hidden || false; this._sortable = typeof sortable === "boolean" ? sortable : true; this._hideable = typeof hideable === "boolean" ? hideable : true; this._align = align || null; this._resizeType = resizeType || TableColumn.ResizeType.Auto; this._headerView = headerView || null; this._needsReloadOnResize = needsReloadOnResize || false; console.assert(!this._minWidth || !this._maxWidth || this._minWidth <= this._maxWidth, "Invalid min/max", this._minWidth, this._maxWidth); console.assert(isNaN(this._width) || !this._minWidth || (this._width >= this._minWidth), "Initial width is less than min", this._width, this._minWidth); console.assert(isNaN(this._width) || !this._maxWidth || (this._width <= this._maxWidth), "Initial width is greater than max", this._width, this._maxWidth); console.assert(!this.locked || this.width, "A locked column should aways have an initial width"); console.assert(!this.locked || !this.hidden, "A locked column should never be hidden"); } get identifier() { return this._identifier; } get name() { return this._name; } get minWidth() { return this._minWidth; } get maxWidth() { return this._maxWidth; } get preferredInitialWidth() { return this._initialWidth; } get defaultHidden() { return this._defaultHidden; } get sortable() { return this._sortable; } get hideable() { return this._hideable; } get align() { return this._align; } get headerView() { return this._headerView; } get needsReloadOnResize() { return this._needsReloadOnResize; } get locked() { return this._resizeType === TableColumn.ResizeType.Locked; } get flexible() { return this._resizeType === TableColumn.ResizeType.Auto; } get width() { return this._width; } set width(width) { // NOTE: We can't assert this because we resize past the minimum and maximum sizes. // If we support horizontal scrolling in the Table then we could assert these. // console.assert(isNaN(width) || !this._minWidth || width >= this._minWidth, "New width was less than midWidth.", width, this._minWidth); // console.assert(isNaN(width) || !this._maxWidth || width <= this._maxWidth, "New width was greater than maxWidth.", width, this._maxWidth); if (this._width === width) return; this._width = width; this.dispatchEventToListeners(WI.TableColumn.Event.WidthDidChange); } get hidden() { return this._hidden; } set hidden(x) { console.assert(!this.locked && this._hideable, "Should not be able to hide a non-hideable column."); this._hidden = x; } }; WI.TableColumn.ResizeType = { Auto: "auto", Locked: "locked", }; WI.TableColumn.Event = { WidthDidChange: "table-column-width-did-change", };