📄 borderlayout.js
字号:
/*
* Ext JS Library 2.2.1
* Copyright(c) 2006-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
/**
* @class Ext.layout.BorderLayout
* @extends Ext.layout.ContainerLayout
* <p>This is a multi-pane, application-oriented UI layout style that supports multiple nested panels, automatic
* split bars between regions and built-in expanding and collapsing of regions.
* This class is intended to be extended or created via the layout:'border' {@link Ext.Container#layout} config,
* and should generally not need to be created directly via the new keyword.</p>
* <p>BorderLayout does not have any direct config options (other than inherited ones). All configs available
* for customizing the BorderLayout are at the {@link Ext.layout.BorderLayout.Region} and
* {@link Ext.layout.BorderLayout.SplitRegion} levels.</p>
* <p><b>The regions of a BorderLayout are fixed at render time and thereafter, no regions may be removed or
* added. The BorderLayout must have a center region, which will always fill the remaining space not used by
* the other regions in the layout.</b></p>
* <p>Example usage:</p>
* <pre><code>
var border = new Ext.Panel({
title: 'Border Layout',
layout:'border',
items: [{
title: 'South Panel',
region: 'south',
height: 100,
minSize: 75,
maxSize: 250,
margins: '0 5 5 5'
},{
title: 'West Panel',
region:'west',
margins: '5 0 0 5',
cmargins: '5 5 0 5',
width: 200,
minSize: 100,
maxSize: 300
},{
title: 'Main Content',
region:'center',
margins: '5 5 0 0'
}]
});
</code></pre>
*/
Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
// private
monitorResize:true,
// private
rendered : false,
// private
onLayout : function(ct, target){
var collapsed;
if(!this.rendered){
target.position();
target.addClass('x-border-layout-ct');
var items = ct.items.items;
collapsed = [];
for(var i = 0, len = items.length; i < len; i++) {
var c = items[i];
var pos = c.region;
if(c.collapsed){
collapsed.push(c);
}
c.collapsed = false;
if(!c.rendered){
c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';
c.render(target, i);
}
this[pos] = pos != 'center' && c.split ?
new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
this[pos].render(target, c);
}
this.rendered = true;
}
var size = target.getViewSize();
if(size.width < 20 || size.height < 20){ // display none?
if(collapsed){
this.restoreCollapsed = collapsed;
}
return;
}else if(this.restoreCollapsed){
collapsed = this.restoreCollapsed;
delete this.restoreCollapsed;
}
var w = size.width, h = size.height;
var centerW = w, centerH = h, centerY = 0, centerX = 0;
var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;
if(!c && Ext.layout.BorderLayout.WARN !== false){
throw 'No center region defined in BorderLayout ' + ct.id;
}
if(n && n.isVisible()){
var b = n.getSize();
var m = n.getMargins();
b.width = w - (m.left+m.right);
b.x = m.left;
b.y = m.top;
centerY = b.height + b.y + m.bottom;
centerH -= centerY;
n.applyLayout(b);
}
if(s && s.isVisible()){
var b = s.getSize();
var m = s.getMargins();
b.width = w - (m.left+m.right);
b.x = m.left;
var totalHeight = (b.height + m.top + m.bottom);
b.y = h - totalHeight + m.top;
centerH -= totalHeight;
s.applyLayout(b);
}
if(west && west.isVisible()){
var b = west.getSize();
var m = west.getMargins();
b.height = centerH - (m.top+m.bottom);
b.x = m.left;
b.y = centerY + m.top;
var totalWidth = (b.width + m.left + m.right);
centerX += totalWidth;
centerW -= totalWidth;
west.applyLayout(b);
}
if(e && e.isVisible()){
var b = e.getSize();
var m = e.getMargins();
b.height = centerH - (m.top+m.bottom);
var totalWidth = (b.width + m.left + m.right);
b.x = w - totalWidth + m.left;
b.y = centerY + m.top;
centerW -= totalWidth;
e.applyLayout(b);
}
if(c){
var m = c.getMargins();
var centerBox = {
x: centerX + m.left,
y: centerY + m.top,
width: centerW - (m.left+m.right),
height: centerH - (m.top+m.bottom)
};
c.applyLayout(centerBox);
}
if(collapsed){
for(var i = 0, len = collapsed.length; i < len; i++){
collapsed[i].collapse(false);
}
}
if(Ext.isIE && Ext.isStrict){ // workaround IE strict repainting issue
target.repaint();
}
},
// inherit docs
destroy: function() {
var r = ['north', 'south', 'east', 'west'];
for (var i = 0; i < r.length; i++) {
var region = this[r[i]];
if(region){
if(region.destroy){
region.destroy();
}else if (region.split){
region.split.destroy(true);
}
}
}
Ext.layout.BorderLayout.superclass.destroy.call(this);
}
/**
* @property activeItem
* @hide
*/
});
/**
* @class Ext.layout.BorderLayout.Region
* This is a region of a BorderLayout that acts as a subcontainer within the layout. Each region has its own
* layout that is independent of other regions and the containing BorderLayout, and can be any of the valid
* Ext layout types. Region size is managed automatically and cannot be changed by the user -- for resizable
* regions, see {@link Ext.layout.BorderLayout.SplitRegion}.
* @constructor
* Create a new Region.
* @param {Layout} layout Any valid Ext layout class
* @param {Object} config The configuration options
* @param {String} position The region position. Valid values are: north, south, east, west and center. Every
* BorderLayout must have a center region for the primary content -- all other regions are optional.
*/
Ext.layout.BorderLayout.Region = function(layout, config, pos){
Ext.apply(this, config);
this.layout = layout;
this.position = pos;
this.state = {};
if(typeof this.margins == 'string'){
this.margins = this.layout.parseMargins(this.margins);
}
this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
if(this.collapsible){
if(typeof this.cmargins == 'string'){
this.cmargins = this.layout.parseMargins(this.cmargins);
}
if(this.collapseMode == 'mini' && !this.cmargins){
this.cmargins = {left:0,top:0,right:0,bottom:0};
}else{
this.cmargins = Ext.applyIf(this.cmargins || {},
pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);
}
}
};
Ext.layout.BorderLayout.Region.prototype = {
/**
* @cfg {Boolean} animFloat
* When a collapsed region's bar is clicked, the region's panel will be displayed as a floated panel that will
* close again once the user mouses out of that panel (or clicks out if autoHide = false). Setting animFloat
* to false will prevent the open and close of these floated panels from being animated (defaults to true).
*/
/**
* @cfg {Boolean} autoHide
* When a collapsed region's bar is clicked, the region's panel will be displayed as a floated panel. If
* autoHide is true, the panel will automatically hide after the user mouses out of the panel. If autoHide
* is false, the panel will continue to display until the user clicks outside of the panel (defaults to true).
*/
/**
* @cfg {Boolean} collapsed
* By default, collapsible regions will be visible when rendered. Set the collapsed config to true to render
* the region as collapsed.
*/
/**
* @cfg {String} collapseMode
* By default, collapsible regions are collapsed by clicking the expand/collapse tool button that renders into
* the region's title bar. Optionally, when collapseMode is set to 'mini' the region's split bar will also
* display a small collapse button in the center of the bar. In 'mini' mode the region will collapse to a
* thinner bar than in normal mode. By default collapseMode is undefined, and the only two supported values
* are undefined and 'mini'. Note that if a collapsible region does not have a title bar, then collapseMode
* must be set to 'mini' in order for the region to be collapsible by the user as the tool button will not
* be rendered.
*/
/**
* @cfg {Object} margins
* An object containing margins to apply to the region when in the expanded state in the format:<pre><code>
{
top: (top margin),
right: (right margin),
bottom: (bottom margin)
left: (left margin),
}</code></pre>
* <p>May also be a string containing space-separated, numeric margin values. The order of the sides associated
* with each value matches the way CSS processes margin values:</p>
* <p><ul>
* <li>If there is only one value, it applies to all sides.</li>
* <li>If there are two values, the top and bottom borders are set to the first value and the right
* and left are set to the second.</li>
* <li>If there are three values, the top is set to the first value, the left and right are set to the second, and the bottom
* is set to the third.</li>
* <li>If there are four values, they apply to the top, right, bottom, and left, respectively.</li>
* </ul></p>
*/
/**
* @cfg {Object} cmargins
* An object containing margins to apply to the region when in the collapsed state in the format:<pre><code>
{
top: (top margin),
right: (right margin),
bottom: (bottom margin)
left: (left margin),
}</code></pre>
* <p>May also be a string containing space-separated, numeric margin values. The order of the sides associated
* with each value matches the way CSS processes margin values.</p>
* <p><ul>
* <li>If there is only one value, it applies to all sides.</li>
* <li>If there are two values, the top and bottom borders are set to the first value and the right
* and left are set to the second.</li>
* <li>If there are three values, the top is set to the first value, the left and right are set to the second, and the bottom
* is set to the third.</li>
* <li>If there are four values, they apply to the top, right, bottom, and left, respectively.</li>
* </ul></p>
*/
/**
* @cfg {Boolean} collapsible
* True to allow the user to collapse this region (defaults to false). If true, an expand/collapse tool button
* will automatically be rendered into the title bar of the region, otherwise the button will not be shown.
* Note that a title bar is required to display the toggle button -- if no region title is specified, the
* region will only be collapsible if {@link #collapseMode} is set to 'mini'.
*/
collapsible : false,
/**
* @cfg {Boolean} split
* True to display a {@link Ext.SplitBar} between this region and its neighbor, allowing the user to resize
* the regions dynamically (defaults to false). When split == true, it is common to specify a minSize
* and maxSize for the BoxComponent representing the region. These are not native configs of BoxComponent, and
* are used only by this class.
*/
split:false,
/**
* @cfg {Boolean} floatable
* True to allow clicking a collapsed region's bar to display the region's panel floated above the layout,
* false to force the user to fully expand a collapsed region by clicking the expand button to see it again
* (defaults to true).
*/
floatable: true,
/**
* @cfg {Number} minWidth
* The minimum allowable width in pixels for this region (defaults to 50)
*/
minWidth:50,
/**
* @cfg {Number} minHeight
* The minimum allowable height in pixels for this region (defaults to 50)
*/
minHeight:50,
// private
defaultMargins : {left:0,top:0,right:0,bottom:0},
// private
defaultNSCMargins : {left:5,top:5,right:5,bottom:5},
// private
defaultEWCMargins : {left:5,top:0,right:5,bottom:0},
/**
* True if this region is collapsed. Read-only.
* @type Boolean
* @property
*/
isCollapsed : false,
/**
* This region's panel. Read-only.
* @type Ext.Panel
* @property panel
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -