]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/layout/FlexBox.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / layout / FlexBox.js
CommitLineData
6527f429
DM
1/**\r
2 * AbstractBox is a superclass for the two box layouts:\r
3 *\r
4 * * {@link Ext.layout.HBox hbox}\r
5 * * {@link Ext.layout.VBox vbox}\r
6 *\r
7 * FlexBox itself is never used directly, but its subclasses provide flexible arrangement of child components\r
8 * inside a {@link Ext.Container Container}.\r
9 *\r
10 * ## Horizontal Box\r
11 *\r
12 * HBox allows you to easily lay out child components horizontally. It can size items based on a fixed width or a\r
13 * fraction of the total width available, enabling you to achieve flexible layouts that expand or contract to fill the\r
14 * space available.\r
15 *\r
16 * {@img ../guides/layouts/hbox.jpg}\r
17 *\r
18 * See the {@link Ext.layout.HBox HBox layout docs} for more information on using hboxes.\r
19 *\r
20 * ## Vertical Box\r
21 *\r
22 * VBox allows you to easily lay out child components verticaly. It can size items based on a fixed height or a\r
23 * fraction of the total height available, enabling you to achieve flexible layouts that expand or contract to fill the\r
24 * space available.\r
25 *\r
26 * See the {@link Ext.layout.VBox VBox layout docs} for more information on using vboxes.\r
27 */\r
28Ext.define('Ext.layout.FlexBox', {\r
29 extend: 'Ext.layout.Box',\r
30\r
31 alias: 'layout.box',\r
32\r
33 config: {\r
34 align: 'stretch'\r
35 },\r
36\r
37 layoutBaseClass: 'x-layout-box',\r
38\r
39 itemClass: 'x-layout-box-item',\r
40\r
41 setContainer: function(container) {\r
42 this.callParent(arguments);\r
43\r
44 this.monitorSizeFlagsChange();\r
45 },\r
46\r
47 applyOrient: function(orient) {\r
48 //<debug>\r
49 if (orient !== 'horizontal' && orient !== 'vertical') {\r
50 Ext.Logger.error("Invalid box orient of: '" + orient + "', must be either 'horizontal' or 'vertical'");\r
51 }\r
52 //</debug>\r
53\r
54 return orient;\r
55 },\r
56\r
57 updateOrient: function(orient, oldOrient) {\r
58 var container = this.container,\r
59 delegation = {\r
60 delegate: '> component'\r
61 };\r
62\r
63 if (orient === 'horizontal') {\r
64 this.sizePropertyName = 'width';\r
65 }\r
66 else {\r
67 this.sizePropertyName = 'height';\r
68 }\r
69\r
70 container.innerElement.swapCls('x-' + orient, 'x-' + oldOrient);\r
71\r
72 if (oldOrient) {\r
73 container.un(oldOrient === 'horizontal' ? 'widthchange' : 'heightchange', 'onItemSizeChange', this, delegation);\r
74 this.redrawContainer();\r
75 }\r
76\r
77 container.on(orient === 'horizontal' ? 'widthchange' : 'heightchange', 'onItemSizeChange', this, delegation);\r
78 },\r
79\r
80 onItemInnerStateChange: function(item, isInner) {\r
81 this.callParent(arguments);\r
82\r
83 var flex, size;\r
84\r
85 item.toggleCls(this.itemClass, isInner);\r
86\r
87 if (isInner) {\r
88 flex = item.getFlex();\r
89 size = item.getConfig(this.sizePropertyName);\r
90\r
91 if (flex) {\r
92 this.doItemFlexChange(item, flex);\r
93 }\r
94 else if (size) {\r
95 this.doItemSizeChange(item, size);\r
96 }\r
97 }\r
98\r
99 this.refreshItemSizeState(item);\r
100 },\r
101\r
102 refreshItemSizeState: function(item) {\r
103 var isInner = item.isInnerItem(),\r
104 container = this.container,\r
105 LAYOUT_HEIGHT = container.LAYOUT_HEIGHT,\r
106 LAYOUT_WIDTH = container.LAYOUT_WIDTH,\r
107 dimension = this.sizePropertyName,\r
108 layoutSizeFlags = 0,\r
109 containerSizeFlags = container.getSizeFlags();\r
110\r
111 if (isInner) {\r
112 layoutSizeFlags |= container.LAYOUT_STRETCHED;\r
113\r
114 if (this.getAlign() === 'stretch') {\r
115 layoutSizeFlags |= containerSizeFlags & (dimension === 'width' ? LAYOUT_HEIGHT : LAYOUT_WIDTH);\r
116 }\r
117\r
118 if (item.getFlex()) {\r
119 layoutSizeFlags |= containerSizeFlags & (dimension === 'width' ? LAYOUT_WIDTH : LAYOUT_HEIGHT);\r
120 }\r
121 }\r
122\r
123 item.setLayoutSizeFlags(layoutSizeFlags);\r
124 },\r
125\r
126 refreshAllItemSizedStates: function() {\r
127 var innerItems = this.container.innerItems,\r
128 i, ln, item;\r
129\r
130 for (i = 0,ln = innerItems.length; i < ln; i++) {\r
131 item = innerItems[i];\r
132 this.refreshItemSizeState(item);\r
133 }\r
134 },\r
135\r
136 onContainerSizeFlagsChange: function() {\r
137 this.refreshAllItemSizedStates();\r
138\r
139 this.callParent(arguments);\r
140 },\r
141\r
142 onItemSizeChange: function(item, size) {\r
143 if (item.isInnerItem()) {\r
144 this.doItemSizeChange(item, size);\r
145 }\r
146 },\r
147\r
148 doItemSizeChange: function(item, size) {\r
149 if (size) {\r
150 item.setFlex(null);\r
151 this.redrawContainer();\r
152 }\r
153 },\r
154\r
155 onItemFlexChange: function(item, flex) {\r
156 if (item.isInnerItem()) {\r
157 this.doItemFlexChange(item, flex);\r
158 this.refreshItemSizeState(item);\r
159 }\r
160 },\r
161\r
162 doItemFlexChange: function(item, flex) {\r
163 this.setItemFlex(item, flex);\r
164\r
165 if (flex) {\r
166 item.setConfig(this.sizePropertyName, null);\r
167 }\r
168 else {\r
169 this.redrawContainer();\r
170 }\r
171 },\r
172\r
173 redrawContainer: function() {\r
174 var container = this.container,\r
175 renderedTo = container.element.dom.parentNode;\r
176\r
177 if (renderedTo && renderedTo.nodeType !== 11) {\r
178 container.innerElement.redraw();\r
179 }\r
180 },\r
181\r
182 /**\r
183 * Sets the flex of an item in this box layout.\r
184 * @param {Ext.Component} item The item of this layout which you want to update the flex of.\r
185 * @param {Number} flex The flex to set on this method\r
186 */\r
187 setItemFlex: function(item, flex) {\r
188 var element = item.element,\r
189 style = element.dom.style;\r
190\r
191 element.toggleCls(Ext.baseCSSPrefix + 'flexed', !!flex);\r
192\r
193 flex = flex ? String(flex) : '';\r
194\r
195 if (Ext.browser.is.WebKit) {\r
196 style.setProperty('-webkit-box-flex', flex, null);\r
197 } else if (Ext.browser.is.IE) {\r
198 style.setProperty('-ms-flex', flex + ' 0 0px', null);\r
199 } else {\r
200 style.setProperty('flex', flex + ' 0 0px', null);\r
201 }\r
202 },\r
203\r
204 convertPosition: function(position) {\r
205 var positionMap = this.positionMap;\r
206\r
207 if (positionMap.hasOwnProperty(position)) {\r
208 return positionMap[position];\r
209 }\r
210\r
211 return position;\r
212 },\r
213\r
214 applyAlign: function(align) {\r
215 return this.convertPosition(align);\r
216 },\r
217\r
218 updateAlign: function(align, oldAlign) {\r
219 var container = this.container;\r
220\r
221 container.innerElement.swapCls(align, oldAlign, true, 'x-align');\r
222\r
223 if (oldAlign !== undefined) {\r
224 this.refreshAllItemSizedStates();\r
225 }\r
226 },\r
227\r
228 applyPack: function(pack) {\r
229 return this.convertPosition(pack);\r
230 },\r
231\r
232 updatePack: function(pack, oldPack) {\r
233 this.container.innerElement.swapCls(pack, oldPack, true, 'x-pack');\r
234 }\r
235});\r