]>
git.proxmox.com Git - sencha-touch.git/blob - src/src/layout/Default.js
4 Ext
.define('Ext.layout.Default', {
5 extend
: 'Ext.layout.Abstract',
9 alias
: ['layout.default', 'layout.auto'],
13 'Ext.layout.wrapper.BoxDock',
14 'Ext.layout.wrapper.Inner'
19 * @cfg {Ext.fx.layout.Card} animation Layout animation configuration
20 * Controls how layout transitions are animated. Currently only available for
23 * Possible values are:
38 centerWrapperClass
: 'x-center',
40 dockWrapperClass
: 'x-dock',
50 positionDirectionMap
: {
57 setContainer: function(container
) {
59 delegate
: '> component'
62 this.dockedItems
= [];
64 this.callSuper(arguments
);
66 container
.on('centeredchange', 'onItemCenteredChange', this, options
, 'before')
67 .on('floatingchange', 'onItemFloatingChange', this, options
, 'before')
68 .on('dockedchange', 'onBeforeItemDockedChange', this, options
, 'before')
69 .on('afterdockedchange', 'onAfterItemDockedChange', this, options
);
72 monitorSizeStateChange: function() {
73 this.monitorSizeStateChange
= Ext
.emptyFn
;
74 this.container
.on('sizestatechange', 'onContainerSizeStateChange', this);
77 monitorSizeFlagsChange: function() {
78 this.monitorSizeFlagsChange
= Ext
.emptyFn
;
79 this.container
.on('sizeflagschange', 'onContainerSizeFlagsChange', this);
82 onItemAdd: function(item
) {
83 var docked
= item
.getDocked();
85 if (docked
!== null) {
88 else if (item
.isCentered()) {
89 this.onItemCenteredChange(item
, true);
91 else if (item
.isFloating()) {
92 this.onItemFloatingChange(item
, true);
95 this.onItemInnerStateChange(item
, true);
100 * @param {Ext.Component} item
101 * @param {Boolean} isInner
102 * @param {Boolean} [destroying]
104 onItemInnerStateChange: function(item
, isInner
, destroying
) {
106 this.insertInnerItem(item
, this.container
.innerIndexOf(item
));
109 this.removeInnerItem(item
);
113 insertInnerItem: function(item
, index
) {
114 var container
= this.container
,
115 containerDom
= container
.innerElement
.dom
,
116 itemDom
= item
.element
.dom
,
117 nextSibling
= index
!== -1 ? container
.getInnerAt(index
+ 1) : null,
118 nextSiblingDom
= null,
122 translatable
= nextSibling
.getTranslatable();
123 if (translatable
&& translatable
.getUseWrapper()) {
124 nextSiblingDom
= translatable
.getWrapper().dom
;
127 nextSiblingDom
= nextSibling
? nextSibling
.element
.dom
: null;
131 containerDom
.insertBefore(itemDom
, nextSiblingDom
);
136 insertBodyItem: function(item
) {
137 var container
= this.container
.setUseBodyElement(true),
138 bodyDom
= container
.bodyElement
.dom
;
140 if (item
.getZIndex() === null) {
141 item
.setZIndex((container
.indexOf(item
) + 1) * 2);
144 bodyDom
.insertBefore(item
.element
.dom
, bodyDom
.firstChild
);
149 removeInnerItem: function(item
) {
150 item
.element
.detach();
153 removeBodyItem: function(item
) {
154 item
.setZIndex(null);
155 item
.element
.detach();
158 onItemRemove: function(item
, index
, destroying
) {
159 var docked
= item
.getDocked();
162 this.undockItem(item
);
164 else if (item
.isCentered()) {
165 this.onItemCenteredChange(item
, false);
167 else if (item
.isFloating()) {
168 this.onItemFloatingChange(item
, false);
171 this.onItemInnerStateChange(item
, false, destroying
);
175 onItemMove: function(item
, toIndex
, fromIndex
) {
176 if (item
.isCentered() || item
.isFloating()) {
177 item
.setZIndex((toIndex
+ 1) * 2);
179 else if (item
.isInnerItem()) {
180 this.insertInnerItem(item
, this.container
.innerIndexOf(item
));
183 this.undockItem(item
);
188 onItemCenteredChange: function(item
, centered
) {
189 var wrapperName
= '$centerWrapper';
192 this.insertBodyItem(item
);
193 item
.link(wrapperName
, new Ext
.util
.Wrapper({
194 className
: this.centerWrapperClass
198 item
.unlink(wrapperName
);
199 this.removeBodyItem(item
);
203 onItemFloatingChange: function(item
, floating
) {
205 this.insertBodyItem(item
);
208 this.removeBodyItem(item
);
212 onBeforeItemDockedChange: function(item
, docked
, oldDocked
) {
214 this.undockItem(item
);
218 onAfterItemDockedChange: function(item
, docked
, oldDocked
) {
224 onContainerSizeStateChange: function() {
225 var dockWrapper
= this.getDockWrapper();
228 dockWrapper
.setSizeState(this.container
.getSizeState());
232 onContainerSizeFlagsChange: function() {
233 var items
= this.dockedItems
,
236 for (i
= 0, ln
= items
.length
; i
< ln
; i
++) {
238 this.refreshDockedItemLayoutSizeFlags(item
);
242 refreshDockedItemLayoutSizeFlags: function(item
) {
243 var container
= this.container
,
244 dockedDirection
= this.positionDirectionMap
[item
.getDocked()],
245 binaryMask
= (dockedDirection
=== 'horizontal') ? container
.LAYOUT_HEIGHT
: container
.LAYOUT_WIDTH
,
246 flags
= (container
.getSizeFlags() & binaryMask
);
248 item
.setLayoutSizeFlags(flags
);
251 dockItem: function(item
) {
252 var DockClass
= Ext
.layout
.wrapper
.BoxDock
,
253 dockedItems
= this.dockedItems
,
254 ln
= dockedItems
.length
,
255 container
= this.container
,
256 itemIndex
= container
.indexOf(item
),
257 positionDirectionMap
= this.positionDirectionMap
,
258 direction
= positionDirectionMap
[item
.getDocked()],
259 dockInnerWrapper
= this.dockInnerWrapper
,
260 referenceDirection
, i
, dockedItem
, index
, previousItem
, slice
,
261 referenceItem
, referenceDocked
, referenceWrapper
, newWrapper
, nestedWrapper
, oldInnerWrapper
;
263 this.monitorSizeStateChange();
264 this.monitorSizeFlagsChange();
266 if (!dockInnerWrapper
) {
267 dockInnerWrapper
= this.link('dockInnerWrapper', new Ext
.layout
.wrapper
.Inner({
268 container
: this.container
273 dockedItems
.push(item
);
275 newWrapper
= new DockClass({
276 container
: this.container
,
280 newWrapper
.addItem(item
);
281 newWrapper
.getElement().replace(dockInnerWrapper
.getElement());
282 newWrapper
.setInnerWrapper(dockInnerWrapper
);
283 container
.onInitialized('onContainerSizeStateChange', this);
286 for (i
= 0; i
< ln
; i
++) {
287 dockedItem
= dockedItems
[i
];
288 index
= container
.indexOf(dockedItem
);
290 if (index
> itemIndex
) {
291 referenceItem
= previousItem
|| dockedItems
[0];
292 dockedItems
.splice(i
, 0, item
);
296 previousItem
= dockedItem
;
299 if (!referenceItem
) {
300 referenceItem
= dockedItems
[ln
- 1];
301 dockedItems
.push(item
);
304 referenceDocked
= referenceItem
.getDocked();
305 referenceWrapper
= referenceItem
.$dockWrapper
;
306 referenceDirection
= positionDirectionMap
[referenceDocked
];
308 if (direction
=== referenceDirection
) {
309 referenceWrapper
.addItem(item
);
312 slice
= referenceWrapper
.getItemsSlice(itemIndex
);
314 newWrapper
= new DockClass({
315 container
: this.container
,
319 if (slice
.length
> 0) {
320 if (slice
.length
=== referenceWrapper
.itemsCount
) {
321 nestedWrapper
= referenceWrapper
;
322 newWrapper
.setSizeState(nestedWrapper
.getSizeState());
323 newWrapper
.getElement().replace(nestedWrapper
.getElement());
326 nestedWrapper
= new DockClass({
327 container
: this.container
,
328 direction
: referenceDirection
330 nestedWrapper
.setInnerWrapper(referenceWrapper
.getInnerWrapper());
331 nestedWrapper
.addItems(slice
);
332 referenceWrapper
.setInnerWrapper(newWrapper
);
335 newWrapper
.setInnerWrapper(nestedWrapper
);
338 oldInnerWrapper
= referenceWrapper
.getInnerWrapper();
339 referenceWrapper
.setInnerWrapper(null);
340 newWrapper
.setInnerWrapper(oldInnerWrapper
);
341 referenceWrapper
.setInnerWrapper(newWrapper
);
344 newWrapper
.addItem(item
);
348 container
.onInitialized('refreshDockedItemLayoutSizeFlags', this, [item
]);
351 getDockWrapper: function() {
352 var dockedItems
= this.dockedItems
;
354 if (dockedItems
.length
> 0) {
355 return dockedItems
[0].$dockWrapper
;
361 undockItem: function(item
) {
362 var dockedItems
= this.dockedItems
;
364 if (item
.$dockWrapper
) {
365 item
.$dockWrapper
.removeItem(item
);
368 Ext
.Array
.remove(dockedItems
, item
);
370 item
.setLayoutSizeFlags(0);
373 destroy: function() {
374 this.dockedItems
.length
= 0;
376 delete this.dockedItems
;