jui.defineUI("ui.layout", [ "jquery", "util.base" ], function($, _) { /** * @Deprecated use ui.splitter instead. * @class ui.layout * Layout can split the screen into areas and each area will be resizable * * @extends core * @alias Layout * @requires jquery * @requires util.base * */ var UI = function() { var ui_layout = null, ui_options = {}, directions = [ 'top','left','right','bottom','center' ]; var resizerIcons = { top: 'n-resize', bottom: 'n-resize', right: 'e-resize', left: 'e-resize' }; function setEvent($resizer, move, down, up) { $resizer.mousedown(function(e) { $resizer.data('mousedown', true); var $shadow = $resizer.clone(); $resizer.data('shadow', $shadow); $resizer.after($shadow); down.call(this, e); $shadow.css('opacity', 0.3); $(document).on('mousemove', move); $(document).on('mouseup', function mouseUp(e) { $(document).off('mousemove', move); $(document).off('mouseup', mouseUp); up.call(this, e); $resizer.data('mousedown', false); $shadow.remove(); $("body :not(.resize)").css({ 'user-select' : '' }) }); $("body :not(.resize)").css({ 'user-select' : 'none' }) }); } function setPosition(height, first, arr, second) { arr = arr || []; if(ui_layout[height]) { ui_layout[height].height(first); } if(typeof arr == 'string') arr = [arr]; if(arr.length == 0) return; for(var i = 0, len = arr.length; i < len; i++) { var $obj = ui_layout[arr[i]]; if($obj) { $obj.css({ top : second }) if($obj.resizer) $obj.resizer.css({ top : second }) } } } function setResizer(direction) { var $first, $second, $layout, $resizer, options; $layout = ui_layout[direction]; $resizer = $layout.resizer; $resizer.css({ cursor : resizerIcons[direction] }) if($resizer.data('event')) return; if(direction == 'top') { setEvent($resizer, function(e) { if(!$resizer.data('mousedown')) return; var top = e.clientY - $resizer.data('current'); var min = ui_options.top.min; var max = ui_options.top.max; if(min <= top && top < max) { $resizer.css({top : top + 'px'}); } }, function(e) { var top = $resizer.position().top; $resizer.data('current', e.clientY - top); }, function(e) { var top = $resizer.position().top; var height = $resizer.height(); var first = top; var second = (top + $resizer.height()) + 'px'; var pre_height = ui_layout.top.height(); ui_layout.top.height(first); var dh = pre_height - first; var new_height = ui_layout.center.height() + dh; ui_layout.center.css({top : second}).height(new_height); ui_layout.left.css({top : second}).height(new_height); ui_layout.left.resizer.css({top : second}).height(new_height); ui_layout.right.css({top : second}).height(new_height); ui_layout.right.resizer.css({top : second}).height(new_height); }); } else if(direction == 'bottom') { setEvent($resizer, function(e) { if(!$resizer.data('mousedown')) return; var top = e.clientY - $resizer.data('current'); var min = ui_options.bottom.min; var max = ui_options.bottom.max; var dh = $layout.position().top - (top + ui_options.barSize); var real_height = dh + $layout.height(); if(min <= real_height && real_height <= max ) { $resizer.css({top : top + 'px'}); } }, function(e) { var top = $resizer.position().top; $resizer.data('current', e.clientY - top); }, function(e) { var top = $resizer.position().top + $resizer.height(); var max = ui_layout.root.height(); var dh = parseFloat(ui_layout.bottom.position().top) - top; ui_layout.bottom.css({ top : top + "px"}); ui_layout.bottom.height(ui_layout.bottom.height() + dh); var new_height = ui_layout.center.height() - dh; ui_layout.center.height(new_height); ui_layout.left.height(new_height); ui_layout.left.resizer.height(new_height); ui_layout.right.height(new_height); ui_layout.right.resizer.height(new_height); }); } else if(direction == 'left') { setEvent($resizer, function(e) { if(!$resizer.data('mousedown')) return; var left = e.clientX - $resizer.data('current'); var min = ui_options.left.min; var max = ui_options.left.max; if(min <= left && left < max) { $resizer.css({left : left + 'px'}); } }, function(e) { var left = $resizer.position().left; $resizer.data('left', left).data('current', e.clientX - left); }, function(e) { if(!$resizer.data('mousedown')) return; var left = $resizer.position().left; var pre_left = $resizer.data('left'); var dw = pre_left - left; ui_layout.left.css({ width : left + "px"}); ui_layout.center.css({ left : (left + ui_options.barSize ) + "px" }); ui_layout.center.width(ui_layout.center.width() + dw); }); } else if(direction == 'right') { setEvent($resizer, function(e) { if(!$resizer.data('mousedown')) return; var left = e.clientX - $resizer.data('current'); var min = ui_options.right.min; var max = ui_options.right.max; var sizeLeft = ui_layout.left.width() + ui_layout.left.resizer.width(); var sizeCenter = ui_layout.center.width(); var current = $layout.width() - (left - (sizeLeft + sizeCenter)); if(min <= current && current < max) { $resizer.css({left : left + 'px'}); } }, function(e) { var left = $resizer.position().left; $resizer.data('left', left).data('current', e.clientX - left); }, function(e) { if(!$resizer.data('mousedown')) return; var left = $resizer.position().left; var pre_left = $resizer.data('left'); var dw = pre_left - left; ui_layout.right.css({ left : (left + $resizer.width()) + 'px', width : (ui_layout.right.width() + dw) + "px" }); ui_layout.center.width(ui_layout.center.width() - dw); }); } $resizer.data('event', true); } function initLayout(self) { for(var i = 0, len = directions.length; i < len; i++) { var direct = ui_layout[directions[i]]; if(direct) { ui_layout.root.append(direct); if(directions[i] != 'center') { if(ui_options[directions[i]].resize) { if(!direct.resizer) { direct.resizer = $("<div class='resize " + directions[i] + "' />"); } ui_layout.root.append(direct.resizer); setResizer(directions[i]); } } } } self.resize(); } this.init = function() { var self = this, opts = this.options; var $root, $top, $left, $right, $bottom, $center; $root = $(this.root).css("position", "relative"); if(opts.width != null) { $root.outerWidth(opts.width); } if(opts.height != null) { $root.outerHeight(opts.height); } $top = (opts.top.el) ? $(opts.top.el) : $root.find("> .top"); if($top.length == 0) $top = null; $left = (opts.left.el) ? $(opts.left.el) : $root.find("> .left"); if($left.length == 0) $left = null; $right = (opts.right.el) ? $(opts.right.el) : $root.find("> .right"); if($right.length == 0) $right = null; $bottom = (opts.bottom.el) ? $(opts.bottom.el) : $root.find("> .bottom"); if($bottom.length == 0) $bottom = null; $center = (opts.center.el) ? $(opts.center.el) : $root.find("> .center"); if($center.length == 0) $center = null; ui_layout = { root : $root, top : $top, left : $left, right : $right, bottom : $bottom, center : $center }; ui_options = opts; initLayout(this); $(window).on('resize', function(e) { self.resize(); }) return this; } /** * @method resize * Resets the layout */ this.resize = function() { var $obj = null, $option = null; var sizeTop = 0, sizeLeft = 0, sizeRight = 0, sizeBottom = 0, sizeCenter = 0 ; $obj = ui_layout.top; $option = this.options.top; if($obj) { $obj.css({ 'position' : 'absolute', 'top' : '0px', 'left' : '0px', 'width' : '100%', 'height' : $option.size || $option.min }); sizeTop = $obj.height(); if($option.resize) { $obj.resizer.css({ 'position' : 'absolute', 'top': sizeTop, 'left' : '0px', 'width' : '100%', "background": this.options.barColor, "height" : this.options.barSize }) sizeTop += this.options.barSize; } else { if($obj.resizer) { $obj.resizer.remove(); } } } $obj = ui_layout.bottom; $option = this.options.bottom; var max = ui_layout.root.height(); if($obj) { $obj.css({ 'position' : 'absolute', 'left' : '0px', 'width' : '100%', 'height' : $option.size || $option.min }); var bottom_top = (sizeTop - $obj.height()) + sizeTop; if($option.resize) { $obj.resizer.css({ 'position' : 'absolute', 'top' : bottom_top, 'left' : '0px', 'width' : '100%', "background": this.options.barColor, "height" : this.options.barSize }); bottom_top += this.options.barSize; } else { if($obj.resizer) { $obj.resizer.remove(); } } $obj.css('top', bottom_top + "px"); } $obj = ui_layout.left; $option = this.options.left; var content_height = max ; if(ui_layout.top) { content_height -= ui_layout.top.height(); if(ui_layout.top.resizer) { content_height -= ui_layout.top.resizer.height(); } } if(ui_layout.bottom) { content_height -= ui_layout.bottom.height(); if(ui_layout.bottom.resizer) { content_height -= ui_layout.bottom.resizer.height(); } } if($obj) { $obj.css({ 'position' : 'absolute', 'top' : sizeTop, 'left' : '0px', 'height' : content_height, 'width' : $option.size || $option.min, 'max-width' : '100%', 'overflow' : 'auto' }); sizeLeft = $obj.width(); if($option.resize) { $obj.resizer.css({ 'position' : 'absolute', 'top' : sizeTop, 'height' : $obj.height(), 'left' : sizeLeft, "background": this.options.barColor, "width" : this.options.barSize }); sizeLeft += this.options.barSize; } else { if($obj.resizer) { $obj.resizer.remove(); } } } $obj = ui_layout.right; $option = this.options.right; var max_width = ui_layout.root.width(); var content_width = max_width; if(ui_layout.left) { content_width -= ui_layout.left.width(); if(ui_layout.left.resizer) { content_width -= ui_layout.left.resizer.width(); } } if($obj) { $obj.css({ 'position' : 'absolute', 'top' : sizeTop, //'right' : '0px', 'height' : content_height, 'width' : $option.size || $option.min , 'max-width' : '100%' }); if($option.resize) { $obj.resizer.css({ 'position' : 'absolute', 'top' : sizeTop, 'height' : $obj.height(), "background": this.options.barColor, "width" : this.options.barSize }) sizeRight += this.options.barSize; } else { if($obj.resizer) { $obj.resizer.remove(); } } content_width -= ui_layout.right.width(); if(ui_layout.right.resizer) { content_width -= ui_layout.right.resizer.width(); } $obj.resizer.css({ left : (sizeLeft + content_width) + "px" }); $obj.css({left : (sizeLeft + content_width + $obj.resizer.width()) + "px"}) } $obj = ui_layout.center; $option = this.options.center; if($obj) { $obj.css({ 'position' : 'absolute', 'top' : sizeTop, 'height' : content_height, 'left' : sizeLeft, 'width' : content_width, 'overflow' : 'auto' }); } } } UI.setup = function() { return { /** * @cfg {String} [barColor="#d6d6d6"] * Determines the color of the resizing bar */ barColor : '#d6d6d6', /** * @cfg {Integer} [barSize=3] * Determines the size of the resizing bar */ barSize : 3, /** * @cfg {Integer} [width=null] * Determines the container area value */ width : null, /** * @cfg {Integer} [height=null] * Determines the container height value */ height : null, /** * @cfg {Object} top * Configures options for the top area */ top : { el : null, size : null, min : 50, max : 200, resize : true }, /** * @cfg {Object} left * Configures options for the left area */ left : { el : null, size : null, min : 50, max : 200, resize : true }, /** * @cfg {Object} right * Configures options for the right area */ right : { el : null, size : null, min : 50, max : 200, resize : true }, /** * @cfg {Object} bottom * Configures options for the bottom area */ bottom : { el : null, size : null, min : 50, max : 200, resize : true }, /** * @cfg {Object} center * Configures options for the center area */ center : { el : null } } } return UI; });