'use strict'; /*@ Ox.Resizebar Resizebar options Options object collapsed Inital collapse state collapsible If true, can be collapsed/expanded edge Edge elements Elements of the bar orientation Orientation ('horizontal' or 'vertical') panel Panel object resizeable If true, can be resetted to default or original size resizeable If true, can be resized resize Array of sizes size Default size tooltip If true, display tooltip, if string, append it self Shared private variable ([options[, self]]) -> Resizebar object @*/ Ox.Resizebar = function(options, self) { self = self || {}; var that = Ox.Element({}, self) .defaults({ collapsed: false, collapsible: false, defaultSize: null, edge: 'left', orientation: 'horizontal', resettable: false, resizable: false, resize: [], size: 0, tooltip: false }) .options(options || {}) .update({ collapsed: function() { that.css({cursor: getCursor()}); self.$tooltip && self.$tooltip.options({title: getTooltipTitle()}); } }) .addClass('OxResizebar Ox' + Ox.toTitleCase(self.options.orientation)) .bindEvent(Ox.extend({ dragstart: onDragstart, drag: onDrag, dragpause: onDragpause, dragend: onDragend }, self.options.resettable ? { doubleclick: reset, singleclick: toggle } : { anyclick: toggle })) .append(Ox.$('
').addClass('OxSpace')) .append(Ox.$('
').addClass('OxLine')) .append(Ox.$('
').addClass('OxSpace')); if (Ox.isString(self.options.tooltip)) { // FIXME: Use Ox.Element's tooltip self.$tooltip = Ox.Tooltip({title: getTooltipTitle()}); that.on({ mouseenter: self.$tooltip.show, mouseleave: self.$tooltip.hide }); } self.clientXY = self.options.orientation == 'horizontal' ? 'clientY' : 'clientX'; self.dimensions = Ox.UI.DIMENSIONS[self.options.orientation]; self.edges = Ox.UI.EDGES[self.options.orientation]; self.isLeftOrTop = self.options.edge == 'left' || self.options.edge == 'top'; that.css({cursor: getCursor()}); function getCursor() { var cursor = ''; if (self.options.collapsed) { cursor = self.options.orientation == 'horizontal' ? (self.isLeftOrTop ? 's' : 'n') : (self.isLeftOrTop ? 'e' : 'w'); } else { if (self.options.resizable) { cursor = self.options.orientation == 'horizontal' ? 'ns' : 'ew'; } else if (self.options.collapsible) { cursor = self.options.orientation == 'horizontal' ? (self.isLeftOrTop ? 'n' : 's') : (self.isLeftOrTop ? 'w' : 'e'); } } return cursor + '-resize'; } function getTooltipTitle() { var title = ''; if (self.options.collapsed) { title = Ox._('Click to show'); } else { if (self.options.resizable) { title = Ox._('Drag to resize'); } if (self.options.collapsible) { title = title ? Ox._('{0}{1} click to hide', [ title, self.options.resettable ? ',' : ' or' ]) : Ox._('Click to hide'); } if (self.options.resettable) { title += ' or doubleclick to reset' } } if (title && self.options.tooltip) { title += ' ' + self.options.tooltip; } return title; } function onDragstart(data) { if (self.options.resizable && !self.options.collapsed) { Ox.$body.addClass('OxDragging'); self.drag = { startPos: data[self.clientXY], startSize: self.options.size } } that.triggerEvent('resizestart', {size: self.options.size}); } function onDrag(data) { if (self.options.resizable && !self.options.collapsed) { var delta = data[self.clientXY] - self.drag.startPos, size = self.options.size; self.options.size = Ox.limit( self.drag.startSize + delta * (self.isLeftOrTop ? 1 : -1), self.options.resize[0], self.options.resize[self.options.resize.length - 1] ); Ox.forEach(self.options.resize, function(value) { if ( self.options.size >= value - 8 && self.options.size <= value + 8 ) { self.options.size = value; return false; // break } }); if (self.options.size != size) { that.css( self.edges[self.isLeftOrTop ? 2 : 3], self.options.size + 'px' ) .triggerEvent('resize', {size: self.options.size}); } } } function onDragpause() { if (self.options.resizable && !self.options.collapsed) { if (self.options.size != self.drag.startSize) { that.triggerEvent('resizepause', {size: self.options.size}); } } } function onDragend() { if (self.options.resizable && !self.options.collapsed) { Ox.$body.removeClass('OxDragging'); if (self.options.size != self.drag.startSize) { that.triggerEvent('resizeend', {size: self.options.size}); } } } function reset() { if (self.options.resizable && !self.options.collapsed) { that.triggerEvent('reset'); } } function toggle() { if (self.options.collapsible) { self.options.collapsed = !self.options.collapsed; that.css({cursor: getCursor()}); self.$tooltip && self.$tooltip.hide(function() { self.$tooltip.options({title: getTooltipTitle()}); }); that.triggerEvent('toggle', {collapsed: self.options.collapsed}); } } return that; };