@Override protected void onLayout(boolean changed, final int l, int t, final int r, int b) { if (isVisible(mTitleBar)) { int height = mTitleBar.getMeasuredHeight(); mTitleBar.layout(l, t, r, t + height); t += height; } else if (!mNoTitleNoPadding && mUseFullPadding) { t += mNoTitlePaddingFull; } if (isVisible(mContent)) mContent.layout(l, t, r, t + mContent.getMeasuredHeight()); if (mIsStacked) { b -= mButtonPaddingFull; for (MDButton mButton : mButtons) { if (isVisible(mButton)) { mButton.layout(l, b - mButton.getMeasuredHeight(), r, b); b -= mButton.getMeasuredHeight(); } } } else { int barTop; int barBottom = b; if (mUseFullPadding) barBottom -= mButtonPaddingFull; barTop = barBottom - mButtonBarHeight; /* START: Neutral Negative Positive CENTER: Negative Neutral Positive END: Positive Negative Neutral (With no Positive, Negative takes it's place except for CENTER) */ int offset = mButtonHorizontalEdgeMargin; /* Used with CENTER gravity */ int neutralLeft = -1; int neutralRight = -1; if (isVisible(mButtons[INDEX_POSITIVE])) { int bl, br; if (mButtonGravity == GravityEnum.END) { bl = l + offset; br = bl + mButtons[INDEX_POSITIVE].getMeasuredWidth(); } else { /* START || CENTER */ br = r - offset; bl = br - mButtons[INDEX_POSITIVE].getMeasuredWidth(); neutralRight = bl; } mButtons[INDEX_POSITIVE].layout(bl, barTop, br, barBottom); offset += mButtons[INDEX_POSITIVE].getMeasuredWidth(); } if (isVisible(mButtons[INDEX_NEGATIVE])) { int bl, br; if (mButtonGravity == GravityEnum.END) { bl = l + offset; br = bl + mButtons[INDEX_NEGATIVE].getMeasuredWidth(); } else if (mButtonGravity == GravityEnum.START) { br = r - offset; bl = br - mButtons[INDEX_NEGATIVE].getMeasuredWidth(); } else { /* CENTER */ bl = l + mButtonHorizontalEdgeMargin; br = bl + mButtons[INDEX_NEGATIVE].getMeasuredWidth(); neutralLeft = br; } mButtons[INDEX_NEGATIVE].layout(bl, barTop, br, barBottom); } if (isVisible(mButtons[INDEX_NEUTRAL])) { int bl, br; if (mButtonGravity == GravityEnum.END) { br = r - mButtonHorizontalEdgeMargin; bl = br - mButtons[INDEX_NEUTRAL].getMeasuredWidth(); } else if (mButtonGravity == GravityEnum.START) { bl = l + mButtonHorizontalEdgeMargin; br = bl + mButtons[INDEX_NEUTRAL].getMeasuredWidth(); } else { /* CENTER */ if (neutralLeft == -1 && neutralRight != -1) { neutralLeft = neutralRight - mButtons[INDEX_NEUTRAL].getMeasuredWidth(); } else if (neutralRight == -1 && neutralLeft != -1) { neutralRight = neutralLeft + mButtons[INDEX_NEUTRAL].getMeasuredWidth(); } else if (neutralRight == -1) { neutralLeft = (r - l) / 2 - mButtons[INDEX_NEUTRAL].getMeasuredWidth() / 2; neutralRight = neutralLeft + mButtons[INDEX_NEUTRAL].getMeasuredWidth(); } bl = neutralLeft; br = neutralRight; } mButtons[INDEX_NEUTRAL].layout(bl, barTop, br, barBottom); } } setUpDividersVisibility(mContent, true, true); }
@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); mUseFullPadding = true; boolean hasButtons = false; final boolean stacked; if (!mForceStack) { int buttonsWidth = 0; for (MDButton button : mButtons) { if (button != null && isVisible(button)) { button.setStacked(false, false); measureChild(button, widthMeasureSpec, heightMeasureSpec); buttonsWidth += button.getMeasuredWidth(); hasButtons = true; } } int buttonBarPadding = getContext().getResources().getDimensionPixelSize(R.dimen.md_neutral_button_margin); final int buttonFrameWidth = width - 2 * buttonBarPadding; stacked = buttonsWidth > buttonFrameWidth; } else { stacked = true; } int stackedHeight = 0; mIsStacked = stacked; if (stacked) { for (MDButton button : mButtons) { if (button != null && isVisible(button)) { button.setStacked(true, false); measureChild(button, widthMeasureSpec, heightMeasureSpec); stackedHeight += button.getMeasuredHeight(); hasButtons = true; } } } int availableHeight = height; int fullPadding = 0; int minPadding = 0; if (hasButtons) { if (mIsStacked) { availableHeight -= stackedHeight; fullPadding += 2 * mButtonPaddingFull; minPadding += 2 * mButtonPaddingFull; } else { availableHeight -= mButtonBarHeight; fullPadding += 2 * mButtonPaddingFull; /* No minPadding */ } } else { /* Content has 8dp, we add 16dp and get 24dp, the frame margin */ fullPadding += 2 * mButtonPaddingFull; } if (isVisible(mTitleBar)) { mTitleBar.measure( MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.UNSPECIFIED); availableHeight -= mTitleBar.getMeasuredHeight(); } else if (!mNoTitleNoPadding) { fullPadding += mNoTitlePaddingFull; } if (isVisible(mContent)) { mContent.measure( MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(availableHeight - minPadding, MeasureSpec.AT_MOST)); if (mContent.getMeasuredHeight() <= availableHeight - fullPadding) { if (!mReducePaddingNoTitleNoButtons || isVisible(mTitleBar) || hasButtons) { mUseFullPadding = true; availableHeight -= mContent.getMeasuredHeight() + fullPadding; } else { mUseFullPadding = false; availableHeight -= mContent.getMeasuredHeight() + minPadding; } } else { mUseFullPadding = false; availableHeight = 0; } } setMeasuredDimension(width, height - availableHeight); }