/** * @provides phuix-formation-column-view * @requires javelin-install * javelin-dom */ JX.install('PHUIXFormationColumnView', { construct: function(node) { this._node = node; }, properties: { isRightAligned: false, isVisible: true, expanderNode: null, resizerItem: null, resizerControl: null, width: null, widthSettingKey: null, visibleSettingKey: null, minimumWidth: null, maximumWidth: null, flank: null }, members: { _node: null, _resizingWidth: null, _resizingBarPosition: null, _dragging: null, start: function() { var onshow = JX.bind(this, this._setVisibility, true); var onhide = JX.bind(this, this._setVisibility, false); JX.DOM.listen(this._node, 'click', 'phui-flank-header-hide', onhide); var expander = this.getExpanderNode(); if (expander) { JX.DOM.listen(expander, 'click', null, onshow); } var resizer = this.getResizerItem(); if (resizer) { var ondown = JX.bind(this, this._onresizestart); JX.DOM.listen(resizer, 'mousedown', null, ondown); var onmove = JX.bind(this, this._onresizemove); JX.Stratcom.listen('mousemove', null, onmove); var onup = JX.bind(this, this._onresizeend); JX.Stratcom.listen('mouseup', null, onup); } this.repaint(); }, _onresizestart: function(e) { if (!e.isNormalMouseEvent()) { return; } this._dragging = JX.$V(e); this._resizingWidth = this.getWidth(); this._resizingBarPosition = JX.$V(this.getResizerControl()); // Show the "col-resize" cursor on the whole document while we're // dragging, since the mouse will slip off the actual bar fairly often // and we don't want it to flicker. JX.DOM.alterClass(document.body, 'jx-drag-col', true); e.kill(); }, _onresizemove: function(e) { if (!this._dragging) { return; } var dx = (JX.$V(e).x - this._dragging.x); var width; if (this.getIsRightAligned()) { width = this.getWidth() - dx; } else { width = this.getWidth() + dx; } var min_width = this.getMinimumWidth(); if (min_width) { width = Math.max(width, min_width); } var max_width = this.getMaximumWidth(); if (max_width) { width = Math.min(width, max_width); } this._resizingWidth = width; this._node.style.width = this._resizingWidth + 'px'; var adjust_x = (this._resizingWidth - this.getWidth()); if (this.getIsRightAligned()) { adjust_x = -adjust_x; } this.getResizerControl().style.left = (this._resizingBarPosition.x + adjust_x) + 'px'; var flank = this.getFlank(); if (flank) { flank .setWidth(this._resizingWidth) .repaint(); } }, _onresizeend: function(e) { if (!this._dragging) { return; } this.setWidth(this._resizingWidth); JX.DOM.alterClass(document.body, 'jx-drag-col', false); this._dragging = null; var width_key = this.getWidthSettingKey(); if (width_key) { this._adjustSetting(width_key, this.getWidth()); } }, _setVisibility: function(visible, e) { e.kill(); this.setVisibility(visible); }, toggleVisibility: function() { return this.setVisibility(!this.getIsVisible()); }, setVisibility: function(visible) { this.setIsVisible(visible); this.repaint(); var visible_key = this.getVisibleSettingKey(); if (visible_key) { this._adjustSetting(visible_key, visible ? 1 : 0); } return this; }, _adjustSetting: function(key, value) { new JX.Request('/settings/adjust/', JX.bag) .setData( { key: key, value: value }) .send(); }, repaint: function() { var resizer = this.getResizerItem(); var expander = this.getExpanderNode(); if (this.getIsVisible()) { JX.DOM.show(this._node); if (resizer) { JX.DOM.show(resizer); } if (expander) { JX.DOM.hide(expander); } } else { JX.DOM.hide(this._node); if (resizer) { JX.DOM.hide(resizer); } if (expander) { JX.DOM.show(expander); } } if (this.getFlank()) { this.getFlank().repaint(); } }, } });