/** _enyo.CollapsingArranger_ is an enyo.Arranger that displays the active control, along with some number of inactive controls to fill the available space. The active control is positioned on the left side of the container and the rest of the views are laid out to the right. The last control, if visible, will expand to fill whatever space is not taken up by the previous controls. For best results with CollapsingArranger, you should set a minimum width for each control via a CSS style, e.g., _min-width: 25%_ or _min-width: 250px_. Transitions between arrangements are handled by sliding the new control in from the right and collapsing the old control to the left. */ enyo.kind({ name: "enyo.CollapsingArranger", kind: "CarouselArranger", size: function() { this.clearLastSize(); this.inherited(arguments); }, //* @protected // clear size from last if it's not actually the last // (required for adding another control) clearLastSize: function() { for (var i=0, c$=this.container.getPanels(), c; c=c$[i]; i++) { if (c._fit && i != c$.length-1) { c.applyStyle("width", null); c._fit = null; } } }, //* @public arrange: function(inC, inIndex) { var c$ = this.container.getPanels(); for (var i=0, e=this.containerPadding.left, m, c; c=c$[i]; i++) { this.arrangeControl(c, {left: e}); if (i >= inIndex) { e += c.width + c.marginWidth; } // FIXME: overdragging-ish if (i == c$.length - 1 && inIndex < 0) { this.arrangeControl(c, {left: e - inIndex}); } } }, calcArrangementDifference: function(inI0, inA0, inI1, inA1) { var i = this.container.getPanels().length-1; return Math.abs(inA1[i].left - inA0[i].left); }, flowControl: function(inControl, inA) { this.inherited(arguments); if (this.container.realtimeFit) { var c$ = this.container.getPanels(); var l = c$.length-1; var last = c$[l]; if (inControl == last) { this.fitControl(inControl, inA.left); } } }, finish: function() { this.inherited(arguments); if (!this.container.realtimeFit && this.containerBounds) { var c$ = this.container.getPanels(); var a$ = this.container.arrangement; var l = c$.length-1; var c = c$[l]; this.fitControl(c, a$[l].left); } }, //* @protected fitControl: function(inControl, inOffset) { inControl._fit = true; inControl.applyStyle("width", (this.containerBounds.width - inOffset) + "px"); inControl.resized(); } });