]>
Commit | Line | Data |
---|---|---|
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 | |
28 | Ext.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 |