📄 layout.js
字号:
// sets the member's breadth if the member does not have an explicitly specified breadth and// this layout alters member breadths. Returns true if the member's breadth was changed, false// otherwiseautoSetBreadth : function (member) { if (!this.shouldAlterBreadth(member)) return false; // set layoutInProgress, otherwise, we'll think the resize we're about to do was done by the // user and treat it as an explicit size var wasInProgress = this._layoutInProgress; this._layoutInProgress = true; this.setMemberBreadth(member, this._getMemberDefaultBreadth(member)); this._layoutInProgress = wasInProgress; return true;},// return whether this member should be resized on the perpendicular axis. shouldAlterBreadth : function (member) { // any member with an explicit breadth setting is left alone (hence will stick out or be // smaller than the breadth of the layout) var explicitBreadth = this._explicitBreadth(member); if (explicitBreadth != null) { // managePercentBreadths if so configured. For any other explicit breath, let the // member size itself. return (this.managePercentBreadth && this.getBreadthPolicy() == isc.Layout.FILL && isc.isA.String(explicitBreadth) && isc.endsWith(explicitBreadth,this._$percent)); } // NOTE: overflow:visible members: if the policy indicates that we change their breadth, // what we're basically setting is a minimum, and also advising the browser as to the optimal // point to wrap their content if it's wrappable. Once such a member is drawn, it may exceed // the layout's breadth, similar to a member with an explicit size. if (this.vertical && member.inherentWidth) return false; // members will be set to the breadth of the layout if they have no explicit size of their own if (this.getBreadthPolicy() == isc.Layout.FILL) return true; // with no breadth policy, don't change member breadth return false;},// move these canvases offscreen so that we can find out their size_moveOffscreen : function (member) { if (member.isDrawn()) return; var moveOffscreen = (!(!isc.Browser.isWin && isc.Browser.isMoz && this.showCustomScrollbars == false && (this.overflow == isc.Canvas.AUTO))); if (moveOffscreen) member.moveTo(null, -9999);},// return the total space dedicated to margins or resizeBarsgetMarginSpace : function () { var marginSpace = this._getLengthMargin(); for (var i = 0; i < this.members.length; i++) { var member = this.members[i]; if (member.showResizeBar) { // leave room for resizeBar marginSpace += this.resizeBarSize; } else if (i < this.members.length - 1 && !this._shouldIgnoreMember(this.members[i+1])) { // leave room for margins if not the last visible member marginSpace += this.membersMargin; } // leave extra space on a member-by-member basis marginSpace += this.getMemberGap(member); } // re add 1 * this.memberOverlap so we don't clip the member closest to our ege if (this.memberOverlap != null) marginSpace += this.memberOverlap return marginSpace;},// return the total space to be allocated among members by the layout policy: the specified// size minus space taken up by margins and resizeBarsgetTotalMemberSpace : function () { return this.getLength() - this.getMarginSpace(); },// get the total length of all members including margins and resizeBars, which may exceed the// specified size of the layout if the layout as a whole overflowed_getTotalMemberLength : function () { var totalMemberLength = 0; for (var i = 0; i < this.members.length; i++) { var member = this.members[i]; if (this._shouldIgnoreMember(member)) continue; totalMemberLength += this.getMemberLength(member); } return totalMemberLength + this.getMarginSpace();},// This method prevents the member from being repositioned / resized when we reflow, even// if it's visibleignoreMember : function (member) { if (!member || !this.members || this.members.indexOf(member) == -1) return; member._isIgnoringLayout = true;},// Allow a member that was previously being ignored to respond to reflow.stopIgnoringMember : function (member) { member._isIgnoringLayout = false; this.reflow();},isIgnoringMember : function (member) { if (member._isIgnoringLayout) return member._isIgnoringLayout; return false;},// Helper method to determine whether the specified member should be resized / relayed out when// layoutChildren / reflow// Returns true if we're ignoring the member, or its hidden._shouldIgnoreMember : function (member) { if (member.visibility == isc.Canvas.HIDDEN && !(member._edgedCanvas && member._edgedCanvas.isVisible())) return true; if (this.isIgnoringMember(member)) return true; return false;},// Allow a member with a managed Z order (via stackZIndex) to be unmanaged.// DO NOT MANIPULATE _isIgnoringZIndex DIRECTLY! Side effects may be necessary (notably// when one stops ignoring the member).ignoreMemberZIndex : function (member) { if (!member || !this.members || this.members.indexOf(member) == -1) return; member._isIgnoringZIndex = true; this.reflow();},stopIgnoringMemberZIndex : function (member) { member._isIgnoringZIndex = false; this.reflow();},_isIgnoringMemberZIndex : function (member) { if (this.isIgnoringMember(member)) return true; else if (member._isIgnoringZIndex) return member._isIgnoringZIndex; return false;},_$layout : "layout",// gather the sizes settings that should be passed to the layout policy// two modes: normal mode, or mode where members that can overflow are treated as being fixed// size at their drawn sizegatherSizes : function (overflowAsFixed, layoutInfo, sizes) { if (!layoutInfo) { // re-use a per-instance array for storing layoutInfo layoutInfo = this._layoutInfo; if (layoutInfo == null) { layoutInfo = this._layoutInfo = []; } else { layoutInfo.length = 0; } } var policy = this.getLengthPolicy(); // whether to put together info for a big layout report at the end of the resizing/policy run var report = this.logIsInfoEnabled(this._$layout); // detect sizes that should be regarded as fixed for (var i = 0; i < this.members.length; i++) { var member = this.members[i]; var memberInfo = layoutInfo[i]; if (memberInfo == null) { memberInfo = layoutInfo[i] = {}; } // skip hidden members if (this._shouldIgnoreMember(member) //>Animation // If we're about to animateShow() a new member, it's visibility will be hidden, // but we need to determine its initial size anyway && !member._prefetchingSize //<Animation ) { memberInfo._policyLength = 0; if (report) memberInfo._lengthReason = "hidden"; continue; } // if a member has an inherent length, we always respect it as a fixed size. If we // have no sizing policy, in effect everything is "inherent length": we just ask it for // it's size; if it has a percent size or other non-numeric size, it interprets it // itself if (this.memberHasInherentLength(member) || policy == isc.Layout.NONE) { memberInfo._policyLength = this.getMemberLength(member); // we never want to set a length for inherent size members if (report) { memberInfo._lengthReason = (policy == isc.Layout.NONE ? "no length policy" : "inherent size"); } continue; } // if we are treating overflowing members as fixed (second pass), members that can // overflow should now be treated as fixed size by the policy if (overflowAsFixed && this._overflowsLength(member)) { var drawnLength = this.getMemberLength(member); // if the member's drawn size doesn't match the size we assigned it in the first // pass, it has overflowed. if (drawnLength != sizes[i]) { if (report) { this.logInfo("member: " + member + " overflowed. set length: " + sizes[i] + " got length: " + drawnLength, "layout"); } memberInfo._overflowed = true; memberInfo._policyLength = drawnLength; } continue; } // respect any explicitly specified size (this includes percent) if (this._explicitLength(member) != null) { memberInfo._policyLength = this.vertical ? member._userHeight : member._userWidth; if (report) memberInfo._lengthReason = "explicit size"; continue; } // no size specified; ask for as much space as is available if (memberInfo._policyLength == null) { memberInfo._policyLength = this._$star; if (report) memberInfo._lengthReason = "no length specified"; } } return layoutInfo;},// resize the members to the sizes given in the sizes[] array. If overflowersOnly is true, only// resize members that can overflow. //>Animation_resizeAnimations:["show", "hide", "rect"],//<AnimationresizeMembers : function (sizes, layoutInfo, overflowersOnly) { var report = this.logIsInfoEnabled(this._$layout); for (var i = 0; i < this.members.length; i++) { var member = this.members[i], memberInfo = layoutInfo[i]; // ignore hidden members and explicitly ignored members if (this._shouldIgnoreMember(member)) continue; // if we're only resizing overflowers, skip other members if (overflowersOnly && !this._overflowsLength(member)) continue; // get the breadth this member should be set to, or null if it shouldn't be changed var breadth = null; if (this.shouldAlterBreadth(member)) { if (report) memberInfo._breadthReason = "breadth policy: " + this.getBreadthPolicy(); breadth = memberInfo._breadth = this._getMemberDefaultBreadth(member); } else { // don't set breadth memberInfo._breadth = this.getMemberBreadth(member); if (report) { memberInfo._breadthReason = (this.getBreadthPolicy() == isc.Layout.NONE ? "no breadth policy" : "explicit size"); } } // get the length we should set the member to var length = null; if (this.getLengthPolicy() != isc.Layout.NONE && (!this.memberHasInherentLength(member) && !memberInfo._overflowed)) { length = memberInfo._resizeLength = sizes[i]; } // avoid trying to resize an overflowed member to less than it's overflowed size // (if the width is not also changing, and the member isn't dirty for another reason) if (length != null && this._overflowsLength(member) && !member.isDirty()) { var specifiedLength = (this.vertical ? member.getHeight() : member.getWidth()), visibleLength = this.getMemberLength(member); // member has overflowed length if (visibleLength > specifiedLength && // the new length is less than or equal to the member's overflowed size length <= visibleLength && // breadth won't change or isn't increasing (breadth == null || breadth <= this.getMemberBreadth(member))) { if (report) this.logInfo("not applying " + this.getLengthAxis() + ": " + length + " to overflowed member: " + member + " w/" + this.getLengthAxis() + ": " + visibleLength, "layout"); length = null; } } if (this.logIsDebugEnabled(this._$layout)) this._reportResize(member, breadth, length); //>Animation // Don't resize a member that's in the process of animate-resizing if (!member.isAnimating(this._resizeAnimations)) {//<Animation if (this.vertical) { member.resizeTo(breadth, length); } else { member.resizeTo(length, breadth); } //>Animation }//<Animation // redraw the member if it changed size, so we can get the right size for stacking // purposes (or draw the member if it's never been drawn) if (member.isDrawn()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -