зеркало из https://github.com/mozilla/gecko-dev.git
Align text inputs, buttons, comboboxes to baseline with respect to the
text around them (bug 167236). Fix width sizing issues for <input type="button/reset/submit"> (bugs 79927, 36364). Fix nonuniform heights of form controls (bug 70251). Patch is on bug 167236, r=jkeiser, sr=roc+moz, moa=rods
This commit is contained in:
Родитель
2035538e9c
Коммит
d33d3708fe
|
@ -291,6 +291,7 @@ nsComboboxControlFrame::nsComboboxControlFrame()
|
|||
|
||||
mCacheSize.width = kSizeNotSet;
|
||||
mCacheSize.height = kSizeNotSet;
|
||||
mCachedAscent = kSizeNotSet;
|
||||
mCachedMaxElementSize.width = kSizeNotSet;
|
||||
mCachedMaxElementSize.height = kSizeNotSet;
|
||||
mCachedAvailableSize.width = kSizeNotSet;
|
||||
|
@ -968,6 +969,7 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext,
|
|||
SetChildFrameSize(aDropDownBtn, aBtnWidth, aDesiredSize.height);
|
||||
aDesiredSize.width = 0;
|
||||
aDesiredSize.height = dispHeight;
|
||||
// XXX What about ascent and descent?
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1129,6 +1131,11 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext,
|
|||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
}
|
||||
|
||||
aDesiredSize.ascent =
|
||||
txtKidSize.ascent + aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
// Now cache the available height as our height without border and padding
|
||||
// This sets up the optimization for if a new available width comes in and we are equal or
|
||||
// less than it we can bail
|
||||
|
@ -1139,7 +1146,8 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext,
|
|||
if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) {
|
||||
mCachedAvailableSize.height = aDesiredSize.height - (aBorderPadding.top + aBorderPadding.bottom);
|
||||
}
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent,
|
||||
mCachedMaxElementSize, aDesiredSize);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
@ -1239,7 +1247,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// cached AvailableSize.width == aCacheSize.width
|
||||
//
|
||||
// NOTE: this returns whether we are doing an Incremental reflow
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
mCachedAscent,
|
||||
mCachedMaxElementSize,
|
||||
mCachedAvailableSize,
|
||||
aDesiredSize, aReflowState,
|
||||
|
@ -1284,12 +1293,6 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
nsRect buttonRect;
|
||||
nsRect dropdownRect;
|
||||
|
||||
// get our border and padding,
|
||||
// XXX - should be the same mComputedBorderPadding?
|
||||
// maybe we should use that?
|
||||
nsMargin borderPadding(0, 0, 0, 0);
|
||||
CalcBorderPadding(borderPadding);
|
||||
|
||||
// Get the current sizes of the combo box child frames
|
||||
mDisplayFrame->GetRect(displayRect);
|
||||
mButtonFrame->GetRect(buttonRect);
|
||||
|
@ -1340,7 +1343,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
REFLOW_DEBUG_MSG("------------Reflowing AreaFrame and bailing----\n\n");
|
||||
ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus,
|
||||
mDisplayFrame, mButtonFrame, mItemDisplayWidth,
|
||||
scrollbarWidth, borderPadding);
|
||||
scrollbarWidth, aReflowState.mComputedBorderPadding);
|
||||
REFLOW_COUNTER();
|
||||
UNCONSTRAINED_CHECK();
|
||||
REFLOW_DEBUG_MSG3("&** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
|
@ -1397,8 +1400,10 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
REFLOW_DEBUG_MSG("---- Doing AreaFrame Reflow and then bailing out\n");
|
||||
// Do simple reflow and bail out
|
||||
ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus,
|
||||
mDisplayFrame, mButtonFrame,
|
||||
mItemDisplayWidth, scrollbarWidth, borderPadding, kSizeNotSet, PR_TRUE);
|
||||
mDisplayFrame, mButtonFrame,
|
||||
mItemDisplayWidth, scrollbarWidth,
|
||||
aReflowState.mComputedBorderPadding,
|
||||
kSizeNotSet, PR_TRUE);
|
||||
REFLOW_DEBUG_MSG3("+** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
REFLOW_COUNTER();
|
||||
UNCONSTRAINED_CHECK();
|
||||
|
@ -1422,6 +1427,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
|
||||
aDesiredSize.width = mCacheSize.width;
|
||||
aDesiredSize.height = mCacheSize.height;
|
||||
aDesiredSize.ascent = mCachedAscent;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aDesiredSize.maxElementSize->width = mCachedMaxElementSize.width;
|
||||
|
@ -1556,7 +1563,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// for the display area
|
||||
mDropdownFrame->GetRect(dropdownRect);
|
||||
if (eReflowReason_Resize == aReflowState.reason) {
|
||||
dropdownRect.Deflate(borderPadding);
|
||||
dropdownRect.Deflate(aReflowState.mComputedBorderPadding);
|
||||
}
|
||||
|
||||
// Get maximum size of the largest item in the dropdown
|
||||
|
@ -1627,7 +1634,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// this reflows and makes and last minute adjustments
|
||||
ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus,
|
||||
mDisplayFrame, mButtonFrame, mItemDisplayWidth, scrollbarWidth,
|
||||
borderPadding, size.height);
|
||||
aReflowState.mComputedBorderPadding, size.height);
|
||||
|
||||
// The dropdown was reflowed UNCONSTRAINED before, now we need to check to see
|
||||
// if it needs to be resized.
|
||||
|
@ -1703,13 +1710,17 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// this is so if our cached avilable size is ever equal to or less
|
||||
// than the real avilable size we can bail out
|
||||
if (aReflowState.availableWidth != NS_UNCONSTRAINEDSIZE) {
|
||||
mCachedAvailableSize.width = aDesiredSize.width - (borderPadding.left + borderPadding.right);
|
||||
mCachedAvailableSize.width = aDesiredSize.width -
|
||||
(aReflowState.mComputedBorderPadding.left +
|
||||
aReflowState.mComputedBorderPadding.right);
|
||||
}
|
||||
if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) {
|
||||
mCachedAvailableSize.height = aDesiredSize.height - (borderPadding.top + borderPadding.bottom);
|
||||
mCachedAvailableSize.height = aDesiredSize.height -
|
||||
(aReflowState.mComputedBorderPadding.top +
|
||||
aReflowState.mComputedBorderPadding.bottom);
|
||||
}
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize);
|
||||
|
||||
REFLOW_DEBUG_MSG3("** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
REFLOW_COUNTER();
|
||||
|
@ -1951,7 +1962,10 @@ nsComboboxControlFrame::ActuallyDisplayText(nsAString& aText, PRBool aNotify)
|
|||
{
|
||||
nsresult rv = NS_OK;
|
||||
if (aText.IsEmpty()) {
|
||||
nsAutoString space(PRUnichar(' '));
|
||||
// Have to use a non-breaking space for line-height calculations
|
||||
// to be right
|
||||
static const PRUnichar spaceArr[] = { 0xA0, 0x00 };
|
||||
nsDependentString space(spaceArr);
|
||||
rv = mDisplayContent->SetText(space.get(), space.Length(), aNotify);
|
||||
} else {
|
||||
const nsAFlatString& flat = PromiseFlatString(aText);
|
||||
|
|
|
@ -281,6 +281,7 @@ protected:
|
|||
nsSize mCacheSize;
|
||||
nsSize mCachedMaxElementSize;
|
||||
nsSize mCachedAvailableSize;
|
||||
nscoord mCachedAscent;
|
||||
|
||||
nsSize mCachedUncDropdownSize;
|
||||
nsSize mCachedUncComboSize;
|
||||
|
|
|
@ -149,11 +149,13 @@ nsFormControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||
}
|
||||
|
||||
void nsFormControlFrame::SetupCachedSizes(nsSize& aCacheSize,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize)
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize)
|
||||
{
|
||||
aCacheSize.width = aDesiredSize.width;
|
||||
aCacheSize.height = aDesiredSize.height;
|
||||
aCachedAscent = aDesiredSize.ascent;
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aCachedMaxElementSize.width = aDesiredSize.maxElementSize->width;
|
||||
aCachedMaxElementSize.height = aDesiredSize.maxElementSize->height;
|
||||
|
@ -254,6 +256,7 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize,
|
|||
#else
|
||||
//------------------------------------------------------------
|
||||
void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize,
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsSize& aCachedAvailableSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
|
@ -362,13 +365,13 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize,
|
|||
if (aBailOnWidth || aBailOnHeight) {
|
||||
aDesiredSize.width = aCacheSize.width;
|
||||
aDesiredSize.height = aCacheSize.height;
|
||||
aDesiredSize.ascent = aCachedAscent;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aDesiredSize.maxElementSize->width = aCachedMaxElementSize.width;
|
||||
aDesiredSize.maxElementSize->height = aCachedMaxElementSize.height;
|
||||
}
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -555,7 +558,7 @@ nsFormControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
nsresult rv = nsLeafFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize);
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -219,10 +219,12 @@ public:
|
|||
NS_IMETHOD GetProperty(nsIAtom* aName, nsAString& aValue);
|
||||
// Resize Reflow Optimiaztion Methods
|
||||
static void SetupCachedSizes(nsSize& aCacheSize,
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize);
|
||||
|
||||
static void SkipResizeReflow(nsSize& aCacheSize,
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsSize& aCachedAvailableSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
|
@ -329,6 +331,7 @@ protected:
|
|||
|
||||
// Reflow Optimization
|
||||
nsSize mCacheSize;
|
||||
nscoord mCachedAscent;
|
||||
nsSize mCachedMaxElementSize;
|
||||
|
||||
private:
|
||||
|
|
|
@ -171,163 +171,6 @@ nsGfxButtonControlFrame::AddComputedBorderPaddingToDesiredSize(nsHTMLReflowMetri
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsGfxButtonControlFrame::DoNavQuirksReflow(nsIPresContext* aPresContext,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus)
|
||||
{
|
||||
nsIFrame* firstKid = mFrames.FirstChild();
|
||||
|
||||
nsCOMPtr<nsIFontMetrics> fontMet;
|
||||
nsresult res = nsFormControlHelper::GetFrameFontFM(aPresContext, (nsIFormControlFrame *)this, getter_AddRefs(fontMet));
|
||||
nsSize desiredSize;
|
||||
if (NS_SUCCEEDED(res) && fontMet) {
|
||||
aReflowState.rendContext->SetFont(fontMet);
|
||||
|
||||
// Get the text from the "value" attribute
|
||||
// for measuring the height, width of the text
|
||||
nsAutoString value;
|
||||
res = GetValue(&value);
|
||||
|
||||
if (res != NS_CONTENT_ATTR_HAS_VALUE && value.IsEmpty()) {
|
||||
// Generate localized label.
|
||||
// We can't make any assumption as to what the default would be
|
||||
// because the value is localized for non-english platforms, thus
|
||||
// it might not be the string "Reset", "Submit Query", or "Browse..."
|
||||
res = GetDefaultLabel(value);
|
||||
if (NS_FAILED(res)) {
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const nsStyleText* textStyle;
|
||||
GetStyleData(eStyleStruct_Text, (const nsStyleStruct *&)textStyle);
|
||||
if (!textStyle->WhiteSpaceIsSignificant()) {
|
||||
value.CompressWhitespace();
|
||||
}
|
||||
|
||||
if (value.IsEmpty()) {
|
||||
// Have to have _something_ or we won't be drawn
|
||||
value.Assign(NS_LITERAL_STRING(" "));
|
||||
}
|
||||
|
||||
CalcNavQuirkSizing(aPresContext, aReflowState.rendContext, value,
|
||||
desiredSize);
|
||||
|
||||
// Note: The Quirks sizing includes a 2px border in its calculation of "desiredSize"
|
||||
// So we must subtract off the 2 pixel border.
|
||||
// Quirk sizing also assumes a 0px padding
|
||||
float p2t;
|
||||
aPresContext->GetPixelsToTwips(&p2t);
|
||||
nscoord borderTwips = NSIntPixelsToTwips(4, p2t);
|
||||
desiredSize.width -= borderTwips;
|
||||
desiredSize.height -= borderTwips;
|
||||
|
||||
// Now figure out how much vertical padding was added and
|
||||
// then subtract it, so we can add in the padding later
|
||||
// horizontal pading is 0px;
|
||||
nscoord hgt;
|
||||
fontMet->GetHeight(hgt);
|
||||
desiredSize.height -= PR_MAX(0, desiredSize.height - hgt);
|
||||
|
||||
// This calculates the reflow size
|
||||
// get the css size and let the frame use or override it
|
||||
nsSize styleSize;
|
||||
nsFormControlFrame::GetStyleSize(aPresContext, aReflowState, styleSize);
|
||||
|
||||
if (CSS_NOTSET != styleSize.width) { // css provides width
|
||||
NS_ASSERTION(styleSize.width+aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right >= 0, "form control's computed width is < 0");
|
||||
if (NS_INTRINSICSIZE != styleSize.width) {
|
||||
desiredSize.width = styleSize.width;
|
||||
desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
||||
}
|
||||
} else {
|
||||
desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
||||
}
|
||||
|
||||
if (CSS_NOTSET != styleSize.height) { // css provides height
|
||||
NS_ASSERTION(styleSize.height > 0, "form control's computed height is <= 0");
|
||||
if (NS_INTRINSICSIZE != styleSize.height) {
|
||||
desiredSize.height = styleSize.height;
|
||||
desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
||||
}
|
||||
} else {
|
||||
desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
||||
}
|
||||
|
||||
aDesiredSize.width = desiredSize.width;
|
||||
aDesiredSize.height = desiredSize.height;
|
||||
} else {
|
||||
// XXX ASSERT HERE
|
||||
desiredSize.width = 0;
|
||||
desiredSize.height = 0;
|
||||
}
|
||||
|
||||
// remove it from the the desired size
|
||||
// because the content need to fit inside of it
|
||||
desiredSize.width -= (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
|
||||
desiredSize.height -= (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
|
||||
|
||||
// Ok, now we think we know what size we are so we can reflow our contents
|
||||
// But we need to make sure we aren't smaller or larger then the min/max
|
||||
if (desiredSize.width < aReflowState.mComputedMinWidth) {
|
||||
desiredSize.width = aReflowState.mComputedMinWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
|
||||
} else if (desiredSize.width > aReflowState.mComputedMaxWidth) {
|
||||
desiredSize.width = aReflowState.mComputedMaxWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
|
||||
}
|
||||
|
||||
if (desiredSize.height < aReflowState.mComputedMinHeight) {
|
||||
desiredSize.height = aReflowState.mComputedMinHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
|
||||
} else if (desiredSize.height > aReflowState.mComputedMaxHeight) {
|
||||
desiredSize.height = aReflowState.mComputedMaxHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
|
||||
}
|
||||
|
||||
// XXX Proper handling of incremental reflow...
|
||||
nsReflowReason reason = aReflowState.reason;
|
||||
if (eReflowReason_Incremental == reason) {
|
||||
// See if it's targeted at us
|
||||
nsHTMLReflowCommand *command = aReflowState.path->mReflowCommand;
|
||||
|
||||
if (command) {
|
||||
Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE);
|
||||
|
||||
nsReflowType reflowType;
|
||||
command->GetType(reflowType);
|
||||
if (eReflowType_StyleChanged == reflowType) {
|
||||
reason = eReflowReason_StyleChange;
|
||||
}
|
||||
else {
|
||||
reason = eReflowReason_Resize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// now reflow the first child (generated content)
|
||||
nsHTMLReflowState reflowState(aPresContext, aReflowState, firstKid, desiredSize, reason);
|
||||
reflowState.mComputedWidth = desiredSize.width;
|
||||
reflowState.mComputedHeight = desiredSize.height;
|
||||
|
||||
nsHTMLReflowMetrics childReflowMetrics(aDesiredSize);
|
||||
nsRect kidRect;
|
||||
firstKid->GetRect(kidRect);
|
||||
ReflowChild(firstKid, aPresContext, childReflowMetrics, reflowState, kidRect.x, kidRect.y, 0, aStatus);
|
||||
|
||||
aDesiredSize.ascent = childReflowMetrics.ascent +
|
||||
aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
// Center the child and add back in the border and badding
|
||||
// our inner area frame is already doing centering so we only need to center vertically.
|
||||
nsRect rect = nsRect(aReflowState.mComputedBorderPadding.left,
|
||||
aReflowState.mComputedBorderPadding.top,
|
||||
desiredSize.width,
|
||||
desiredSize.height);
|
||||
firstKid->SetRect(aPresContext, rect);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Create the text content used as label for the button.
|
||||
// The frame will be generated by the frame constructor.
|
||||
NS_IMETHODIMP
|
||||
|
@ -359,11 +202,6 @@ nsGfxButtonControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext,
|
|||
value.CompressWhitespace();
|
||||
}
|
||||
|
||||
if (value.IsEmpty()) {
|
||||
// Have to have _something_ or we won't be drawn
|
||||
value.Assign(NS_LITERAL_STRING(" "));
|
||||
}
|
||||
|
||||
// Add a child text content node for the label
|
||||
nsCOMPtr<nsIContent> labelContent(do_CreateInstance(kTextNodeCID,&result));
|
||||
if (NS_SUCCEEDED(result) && labelContent) {
|
||||
|
@ -475,7 +313,7 @@ nsGfxButtonControlFrame::GetDefaultLabel(nsString& aString)
|
|||
rv = nsFormControlHelper::GetLocalizedString(propname, NS_LITERAL_STRING("Browse").get(), aString);
|
||||
}
|
||||
else {
|
||||
aString.Assign(NS_LITERAL_STRING(" "));
|
||||
aString.Assign(NS_LITERAL_STRING(""));
|
||||
rv = NS_OK;
|
||||
}
|
||||
return rv;
|
||||
|
@ -519,17 +357,6 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
DO_GLOBAL_REFLOW_COUNT("nsGfxButtonControlFrame", aReflowState.reason);
|
||||
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
#if 0
|
||||
nsresult skiprv = nsFormControlFrame::SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext,
|
||||
aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
if (NS_SUCCEEDED(skiprv)) {
|
||||
return skiprv;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((kSuggestedNotSet != mSuggestedWidth) ||
|
||||
(kSuggestedNotSet != mSuggestedHeight)) {
|
||||
nsHTMLReflowState suggestedReflowState(aReflowState);
|
||||
|
@ -543,76 +370,13 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
suggestedReflowState.mComputedHeight = mSuggestedHeight;
|
||||
}
|
||||
|
||||
rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus);
|
||||
return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus);
|
||||
|
||||
} else { // Normal reflow.
|
||||
|
||||
#if 1
|
||||
// nsHTMLButtonControlFrame::Reflow registers it for Standard Mode
|
||||
// and sets up mPresContext
|
||||
if (eReflowReason_Initial == aReflowState.reason) {
|
||||
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
|
||||
}
|
||||
// Do NavQuirks Sizing and layout
|
||||
rv = DoNavQuirksReflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
// Make sure we obey min/max-width and min/max-height
|
||||
if (aDesiredSize.width > aReflowState.mComputedMaxWidth) {
|
||||
aDesiredSize.width = aReflowState.mComputedMaxWidth;
|
||||
}
|
||||
if (aDesiredSize.width < aReflowState.mComputedMinWidth) {
|
||||
aDesiredSize.width = aReflowState.mComputedMinWidth;
|
||||
}
|
||||
|
||||
if (aDesiredSize.height > aReflowState.mComputedMaxHeight) {
|
||||
aDesiredSize.height = aReflowState.mComputedMaxHeight;
|
||||
}
|
||||
if (aDesiredSize.height < aReflowState.mComputedMinHeight) {
|
||||
aDesiredSize.height = aReflowState.mComputedMinHeight;
|
||||
}
|
||||
#else
|
||||
// Do Standard mode sizing and layout
|
||||
rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Normal reflow.
|
||||
|
||||
#ifdef DEBUG_rodsXXXX
|
||||
COMPARE_QUIRK_SIZE("nsGfxButtonControlFrame", 84, 24) // with the text "Press Me" in it
|
||||
#endif
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
}
|
||||
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
nsGfxButtonControlFrame::CalcNavQuirkSizing(nsIPresContext* aPresContext,
|
||||
nsIRenderingContext* aRendContext,
|
||||
nsString& aLabel,
|
||||
nsSize& aSize)
|
||||
{
|
||||
float p2t;
|
||||
float t2p;
|
||||
aPresContext->GetPixelsToTwips(&p2t);
|
||||
aPresContext->GetTwipsToPixels(&t2p);
|
||||
|
||||
// Get text size, round to nearest pixel, multiply by 3/2
|
||||
// XXX this algorithm seems suspect: rounding before multiply can't be good,
|
||||
// and 3/2 seems ... arbitrary
|
||||
nsFormControlHelper::GetTextSize(aPresContext, this,
|
||||
aLabel, aSize,
|
||||
aRendContext);
|
||||
aSize.width = NSToCoordRound(aSize.width * t2p);
|
||||
aSize.height = NSToCoordRound(aSize.height * t2p);
|
||||
aSize.width = NSIntPixelsToTwips(3 * aSize.width / 2, p2t);
|
||||
aSize.height = NSIntPixelsToTwips(3 * aSize.height / 2, p2t);
|
||||
return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -410,6 +410,7 @@ nsHTMLButtonControlFrame::Paint(nsIPresContext* aPresContext,
|
|||
static
|
||||
void ButtonHack(nsHTMLReflowState& aReflowState, const char* aMessage)
|
||||
{
|
||||
// XXXbz is this still relevant?
|
||||
if (aReflowState.mComputedWidth == 0) {
|
||||
aReflowState.mComputedWidth = aReflowState.availableWidth;
|
||||
}
|
||||
|
@ -551,7 +552,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
focusPadding.left + aReflowState.mComputedBorderPadding.left,
|
||||
focusPadding.top + aReflowState.mComputedBorderPadding.top,
|
||||
0, aStatus);
|
||||
|
||||
|
||||
// calculate the min internal size so the contents gets centered correctly
|
||||
// minInternalWidth is not being used at all and causes a warning--commenting
|
||||
// out until someone wants it.
|
||||
|
@ -573,7 +574,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
|
||||
// Place the child
|
||||
FinishReflowChild(firstKid, aPresContext, &reflowState, aDesiredSize,
|
||||
focusPadding.left + aReflowState.mComputedBorderPadding.right,
|
||||
focusPadding.left + aReflowState.mComputedBorderPadding.left,
|
||||
yoff + focusPadding.top + aReflowState.mComputedBorderPadding.top, 0);
|
||||
|
||||
#if 0 // old way
|
||||
|
@ -602,6 +603,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
#endif
|
||||
|
||||
AddComputedBorderPaddingToDesiredSize(aDesiredSize, aReflowState);
|
||||
|
||||
//aDesiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
||||
//aDesiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
||||
|
||||
|
@ -612,9 +614,6 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
}
|
||||
#endif
|
||||
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
|
||||
if (nsnull != aDesiredSize.maxElementSize) {
|
||||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
|
@ -633,10 +632,15 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
}
|
||||
if (aDesiredSize.height < aReflowState.mComputedMinHeight) {
|
||||
aDesiredSize.height = aReflowState.mComputedMinHeight;
|
||||
}
|
||||
}
|
||||
|
||||
aDesiredSize.ascent += aReflowState.mComputedBorderPadding.top + focusPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent,
|
||||
mCachedMaxElementSize, aDesiredSize);
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -170,6 +170,7 @@ protected:
|
|||
|
||||
//Resize Reflow OpitmizationSize;
|
||||
nsSize mCacheSize;
|
||||
nscoord mCachedAscent;
|
||||
nsSize mCachedMaxElementSize;
|
||||
};
|
||||
|
||||
|
|
|
@ -837,7 +837,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// so we can check timings against the old version
|
||||
#if 1
|
||||
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
mCachedAscent,
|
||||
mCachedMaxElementSize,
|
||||
mCachedAvailableSize,
|
||||
aDesiredSize, aReflowState,
|
||||
|
@ -999,6 +1000,7 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
}
|
||||
mCachedUnconstrainedSize.width = scrolledAreaDesiredSize.width;
|
||||
mCachedUnconstrainedSize.height = scrolledAreaDesiredSize.height;
|
||||
mCachedAscent = scrolledAreaDesiredSize.ascent;
|
||||
mCachedDesiredMaxSize.width = scrolledAreaDesiredSize.maxElementSize->width;
|
||||
mCachedDesiredMaxSize.height = scrolledAreaDesiredSize.maxElementSize->height;
|
||||
} else {
|
||||
|
@ -1280,8 +1282,9 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
} else {
|
||||
aDesiredSize.width = visibleWidth;
|
||||
aDesiredSize.height = visibleHeight;
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
aDesiredSize.ascent =
|
||||
scrolledAreaDesiredSize.ascent + aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
}
|
||||
|
||||
if (nsnull != aDesiredSize.maxElementSize) {
|
||||
|
@ -1319,7 +1322,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
|
||||
//REFLOW_DEBUG_MSG3("** nsLCF Caching AW: %d AH: %d\n", PX(mCachedAvailableSize.width), PX(mCachedAvailableSize.height));
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent,
|
||||
mCachedMaxElementSize, aDesiredSize);
|
||||
|
||||
REFLOW_DEBUG_MSG3("** Done nsLCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
|
||||
|
|
|
@ -423,6 +423,7 @@ protected:
|
|||
|
||||
//Resize Reflow OpitmizationSize;
|
||||
nsSize mCacheSize;
|
||||
nscoord mCachedAscent;
|
||||
nsSize mCachedMaxElementSize;
|
||||
nsSize mCachedUnconstrainedSize;
|
||||
nsSize mCachedAvailableSize;
|
||||
|
|
|
@ -955,8 +955,9 @@ nsScrollFrame::Reflow(nsIPresContext* aPresContext,
|
|||
aDesiredSize.maxElementSize->height = maxHeight;
|
||||
}
|
||||
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
aDesiredSize.ascent =
|
||||
kidDesiredSize.ascent + aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS,
|
||||
("exit nsScrollFrame::Reflow: status=%d width=%d height=%d",
|
||||
|
|
|
@ -74,6 +74,9 @@ label {
|
|||
/* default inputs, text inputs, and selects */
|
||||
input {
|
||||
-moz-appearance: textfield;
|
||||
/* The sum of border-top, border-bottom, padding-top, padding-bottom
|
||||
must be the same here, for buttons, and for <select> (including its
|
||||
internal padding magic) */
|
||||
padding: 1px 0 1px 0;
|
||||
border: 2px inset ThreeDFace;
|
||||
background-color: -moz-Field;
|
||||
|
@ -82,7 +85,6 @@ input {
|
|||
line-height: normal !important;
|
||||
text-align: start;
|
||||
text-transform: none;
|
||||
vertical-align: text-bottom;
|
||||
cursor: text;
|
||||
-moz-box-sizing: border-box;
|
||||
-moz-user-focus: normal;
|
||||
|
@ -126,7 +128,6 @@ select {
|
|||
line-height: normal !important;
|
||||
white-space: nowrap;
|
||||
text-align: start;
|
||||
vertical-align: text-bottom;
|
||||
cursor: default;
|
||||
-moz-box-sizing: border-box;
|
||||
-moz-user-select: none;
|
||||
|
@ -138,10 +139,14 @@ select {
|
|||
}
|
||||
|
||||
select[size] {
|
||||
/* Different alignment and padding for listbox vs combobox */
|
||||
vertical-align: text-bottom;
|
||||
padding: 1px 0 1px 0;
|
||||
}
|
||||
|
||||
select[size="1"] {
|
||||
/* Except this is not a listbox */
|
||||
vertical-align: baseline;
|
||||
padding: 0;
|
||||
-moz-appearance: menulist;
|
||||
}
|
||||
|
@ -178,6 +183,8 @@ select:-moz-dummy-option {
|
|||
|
||||
*|*:-moz-display-comboboxcontrol-frame {
|
||||
overflow: hidden;
|
||||
/* This top/bottom padding plus the combobox top/bottom border need to
|
||||
add up to the top/bottom borderpadding of text inputs and buttons */
|
||||
padding: 1px 0 1px 4px;
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
|
@ -263,7 +270,6 @@ input[type="image"] {
|
|||
padding: 0;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
vertical-align: baseline;
|
||||
font-family: sans-serif;
|
||||
font-size: small;
|
||||
cursor: pointer;
|
||||
|
@ -293,17 +299,14 @@ input[type="file"] > input[type="text"] {
|
|||
border-color: inherit;
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
font-size: inherit;
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
/* button part of file selector */
|
||||
input[type="file"] > input[type="button"] {
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
input[type="file"] > input[type="button"]:-moz-focus-inner
|
||||
{
|
||||
padding: 0px 2px 0px 2px;
|
||||
border: 1px dotted transparent;
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
/* radio buttons */
|
||||
|
@ -313,7 +316,6 @@ input[type="radio"] {
|
|||
height: 13px;
|
||||
margin: 3px 3px 0px 5px;
|
||||
padding: 0;
|
||||
vertical-align: baseline;
|
||||
cursor: default;
|
||||
-moz-binding: none;
|
||||
|
||||
|
@ -383,14 +385,16 @@ input[type="reset"],
|
|||
input[type="button"],
|
||||
input[type="submit"] {
|
||||
-moz-appearance: button;
|
||||
padding: 2px 0 2px 0;
|
||||
/* The sum of border-top, border-bottom, padding-top, padding-bottom
|
||||
must be the same here, for text inputs, and for <select>. For
|
||||
buttons, make sure to include the -moz-focus-inner border/padding. */
|
||||
padding: 0px 8px 0px 8px;
|
||||
border: 2px outset ButtonFace;
|
||||
background-color: ButtonFace;
|
||||
color: ButtonText;
|
||||
font: -moz-button;
|
||||
line-height: normal !important;
|
||||
white-space: pre;
|
||||
vertical-align: text-bottom;
|
||||
cursor: default;
|
||||
-moz-box-sizing: border-box;
|
||||
-moz-user-select: none;
|
||||
|
@ -407,15 +411,16 @@ button:active:hover,
|
|||
input[type="reset"]:active:hover,
|
||||
input[type="button"]:active:hover,
|
||||
input[type="submit"]:active:hover {
|
||||
padding: 3px 0 1px 0;
|
||||
padding: 0px 7px 0px 9px;
|
||||
border-style: inset;
|
||||
}
|
||||
|
||||
button:-moz-focus-inner,
|
||||
input[type="reset"]:-moz-focus-inner,
|
||||
input[type="button"]:-moz-focus-inner,
|
||||
input[type="submit"]:-moz-focus-inner {
|
||||
padding: 1px 2px 1px 2px;
|
||||
input[type="submit"]:-moz-focus-inner,
|
||||
input[type="file"] > input[type="button"]:-moz-focus-inner {
|
||||
padding: 0px 2px 0px 2px;
|
||||
border: 1px dotted transparent;
|
||||
}
|
||||
|
||||
|
@ -436,7 +441,9 @@ select[disabled] > input[type="button"],
|
|||
select[disabled] > input[type="button"]:active,
|
||||
input[type="submit"][disabled]:active,
|
||||
input[type="submit"][disabled] {
|
||||
padding: 3px 1px 3px 1px;
|
||||
/* The sum of border-top, border-bottom, padding-top, padding-bottom
|
||||
must be the same here and for text inputs */
|
||||
padding: 1px 8px 1px 8px;
|
||||
border: 1px outset ButtonShadow;
|
||||
color: GrayText;
|
||||
}
|
||||
|
|
|
@ -291,6 +291,7 @@ nsComboboxControlFrame::nsComboboxControlFrame()
|
|||
|
||||
mCacheSize.width = kSizeNotSet;
|
||||
mCacheSize.height = kSizeNotSet;
|
||||
mCachedAscent = kSizeNotSet;
|
||||
mCachedMaxElementSize.width = kSizeNotSet;
|
||||
mCachedMaxElementSize.height = kSizeNotSet;
|
||||
mCachedAvailableSize.width = kSizeNotSet;
|
||||
|
@ -968,6 +969,7 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext,
|
|||
SetChildFrameSize(aDropDownBtn, aBtnWidth, aDesiredSize.height);
|
||||
aDesiredSize.width = 0;
|
||||
aDesiredSize.height = dispHeight;
|
||||
// XXX What about ascent and descent?
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1129,6 +1131,11 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext,
|
|||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
}
|
||||
|
||||
aDesiredSize.ascent =
|
||||
txtKidSize.ascent + aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
// Now cache the available height as our height without border and padding
|
||||
// This sets up the optimization for if a new available width comes in and we are equal or
|
||||
// less than it we can bail
|
||||
|
@ -1139,7 +1146,8 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext,
|
|||
if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) {
|
||||
mCachedAvailableSize.height = aDesiredSize.height - (aBorderPadding.top + aBorderPadding.bottom);
|
||||
}
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent,
|
||||
mCachedMaxElementSize, aDesiredSize);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
@ -1239,7 +1247,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// cached AvailableSize.width == aCacheSize.width
|
||||
//
|
||||
// NOTE: this returns whether we are doing an Incremental reflow
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
mCachedAscent,
|
||||
mCachedMaxElementSize,
|
||||
mCachedAvailableSize,
|
||||
aDesiredSize, aReflowState,
|
||||
|
@ -1284,12 +1293,6 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
nsRect buttonRect;
|
||||
nsRect dropdownRect;
|
||||
|
||||
// get our border and padding,
|
||||
// XXX - should be the same mComputedBorderPadding?
|
||||
// maybe we should use that?
|
||||
nsMargin borderPadding(0, 0, 0, 0);
|
||||
CalcBorderPadding(borderPadding);
|
||||
|
||||
// Get the current sizes of the combo box child frames
|
||||
mDisplayFrame->GetRect(displayRect);
|
||||
mButtonFrame->GetRect(buttonRect);
|
||||
|
@ -1340,7 +1343,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
REFLOW_DEBUG_MSG("------------Reflowing AreaFrame and bailing----\n\n");
|
||||
ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus,
|
||||
mDisplayFrame, mButtonFrame, mItemDisplayWidth,
|
||||
scrollbarWidth, borderPadding);
|
||||
scrollbarWidth, aReflowState.mComputedBorderPadding);
|
||||
REFLOW_COUNTER();
|
||||
UNCONSTRAINED_CHECK();
|
||||
REFLOW_DEBUG_MSG3("&** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
|
@ -1397,8 +1400,10 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
REFLOW_DEBUG_MSG("---- Doing AreaFrame Reflow and then bailing out\n");
|
||||
// Do simple reflow and bail out
|
||||
ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus,
|
||||
mDisplayFrame, mButtonFrame,
|
||||
mItemDisplayWidth, scrollbarWidth, borderPadding, kSizeNotSet, PR_TRUE);
|
||||
mDisplayFrame, mButtonFrame,
|
||||
mItemDisplayWidth, scrollbarWidth,
|
||||
aReflowState.mComputedBorderPadding,
|
||||
kSizeNotSet, PR_TRUE);
|
||||
REFLOW_DEBUG_MSG3("+** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
REFLOW_COUNTER();
|
||||
UNCONSTRAINED_CHECK();
|
||||
|
@ -1422,6 +1427,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
|
||||
aDesiredSize.width = mCacheSize.width;
|
||||
aDesiredSize.height = mCacheSize.height;
|
||||
aDesiredSize.ascent = mCachedAscent;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aDesiredSize.maxElementSize->width = mCachedMaxElementSize.width;
|
||||
|
@ -1556,7 +1563,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// for the display area
|
||||
mDropdownFrame->GetRect(dropdownRect);
|
||||
if (eReflowReason_Resize == aReflowState.reason) {
|
||||
dropdownRect.Deflate(borderPadding);
|
||||
dropdownRect.Deflate(aReflowState.mComputedBorderPadding);
|
||||
}
|
||||
|
||||
// Get maximum size of the largest item in the dropdown
|
||||
|
@ -1627,7 +1634,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// this reflows and makes and last minute adjustments
|
||||
ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus,
|
||||
mDisplayFrame, mButtonFrame, mItemDisplayWidth, scrollbarWidth,
|
||||
borderPadding, size.height);
|
||||
aReflowState.mComputedBorderPadding, size.height);
|
||||
|
||||
// The dropdown was reflowed UNCONSTRAINED before, now we need to check to see
|
||||
// if it needs to be resized.
|
||||
|
@ -1703,13 +1710,17 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// this is so if our cached avilable size is ever equal to or less
|
||||
// than the real avilable size we can bail out
|
||||
if (aReflowState.availableWidth != NS_UNCONSTRAINEDSIZE) {
|
||||
mCachedAvailableSize.width = aDesiredSize.width - (borderPadding.left + borderPadding.right);
|
||||
mCachedAvailableSize.width = aDesiredSize.width -
|
||||
(aReflowState.mComputedBorderPadding.left +
|
||||
aReflowState.mComputedBorderPadding.right);
|
||||
}
|
||||
if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) {
|
||||
mCachedAvailableSize.height = aDesiredSize.height - (borderPadding.top + borderPadding.bottom);
|
||||
mCachedAvailableSize.height = aDesiredSize.height -
|
||||
(aReflowState.mComputedBorderPadding.top +
|
||||
aReflowState.mComputedBorderPadding.bottom);
|
||||
}
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize);
|
||||
|
||||
REFLOW_DEBUG_MSG3("** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
REFLOW_COUNTER();
|
||||
|
@ -1951,7 +1962,10 @@ nsComboboxControlFrame::ActuallyDisplayText(nsAString& aText, PRBool aNotify)
|
|||
{
|
||||
nsresult rv = NS_OK;
|
||||
if (aText.IsEmpty()) {
|
||||
nsAutoString space(PRUnichar(' '));
|
||||
// Have to use a non-breaking space for line-height calculations
|
||||
// to be right
|
||||
static const PRUnichar spaceArr[] = { 0xA0, 0x00 };
|
||||
nsDependentString space(spaceArr);
|
||||
rv = mDisplayContent->SetText(space.get(), space.Length(), aNotify);
|
||||
} else {
|
||||
const nsAFlatString& flat = PromiseFlatString(aText);
|
||||
|
|
|
@ -281,6 +281,7 @@ protected:
|
|||
nsSize mCacheSize;
|
||||
nsSize mCachedMaxElementSize;
|
||||
nsSize mCachedAvailableSize;
|
||||
nscoord mCachedAscent;
|
||||
|
||||
nsSize mCachedUncDropdownSize;
|
||||
nsSize mCachedUncComboSize;
|
||||
|
|
|
@ -149,11 +149,13 @@ nsFormControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||
}
|
||||
|
||||
void nsFormControlFrame::SetupCachedSizes(nsSize& aCacheSize,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize)
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize)
|
||||
{
|
||||
aCacheSize.width = aDesiredSize.width;
|
||||
aCacheSize.height = aDesiredSize.height;
|
||||
aCachedAscent = aDesiredSize.ascent;
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aCachedMaxElementSize.width = aDesiredSize.maxElementSize->width;
|
||||
aCachedMaxElementSize.height = aDesiredSize.maxElementSize->height;
|
||||
|
@ -254,6 +256,7 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize,
|
|||
#else
|
||||
//------------------------------------------------------------
|
||||
void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize,
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsSize& aCachedAvailableSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
|
@ -362,13 +365,13 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize,
|
|||
if (aBailOnWidth || aBailOnHeight) {
|
||||
aDesiredSize.width = aCacheSize.width;
|
||||
aDesiredSize.height = aCacheSize.height;
|
||||
aDesiredSize.ascent = aCachedAscent;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aDesiredSize.maxElementSize->width = aCachedMaxElementSize.width;
|
||||
aDesiredSize.maxElementSize->height = aCachedMaxElementSize.height;
|
||||
}
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -555,7 +558,7 @@ nsFormControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
nsresult rv = nsLeafFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize);
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -219,10 +219,12 @@ public:
|
|||
NS_IMETHOD GetProperty(nsIAtom* aName, nsAString& aValue);
|
||||
// Resize Reflow Optimiaztion Methods
|
||||
static void SetupCachedSizes(nsSize& aCacheSize,
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize);
|
||||
|
||||
static void SkipResizeReflow(nsSize& aCacheSize,
|
||||
nscoord& aCachedAscent,
|
||||
nsSize& aCachedMaxElementSize,
|
||||
nsSize& aCachedAvailableSize,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
|
@ -329,6 +331,7 @@ protected:
|
|||
|
||||
// Reflow Optimization
|
||||
nsSize mCacheSize;
|
||||
nscoord mCachedAscent;
|
||||
nsSize mCachedMaxElementSize;
|
||||
|
||||
private:
|
||||
|
|
|
@ -171,163 +171,6 @@ nsGfxButtonControlFrame::AddComputedBorderPaddingToDesiredSize(nsHTMLReflowMetri
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsGfxButtonControlFrame::DoNavQuirksReflow(nsIPresContext* aPresContext,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus)
|
||||
{
|
||||
nsIFrame* firstKid = mFrames.FirstChild();
|
||||
|
||||
nsCOMPtr<nsIFontMetrics> fontMet;
|
||||
nsresult res = nsFormControlHelper::GetFrameFontFM(aPresContext, (nsIFormControlFrame *)this, getter_AddRefs(fontMet));
|
||||
nsSize desiredSize;
|
||||
if (NS_SUCCEEDED(res) && fontMet) {
|
||||
aReflowState.rendContext->SetFont(fontMet);
|
||||
|
||||
// Get the text from the "value" attribute
|
||||
// for measuring the height, width of the text
|
||||
nsAutoString value;
|
||||
res = GetValue(&value);
|
||||
|
||||
if (res != NS_CONTENT_ATTR_HAS_VALUE && value.IsEmpty()) {
|
||||
// Generate localized label.
|
||||
// We can't make any assumption as to what the default would be
|
||||
// because the value is localized for non-english platforms, thus
|
||||
// it might not be the string "Reset", "Submit Query", or "Browse..."
|
||||
res = GetDefaultLabel(value);
|
||||
if (NS_FAILED(res)) {
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
const nsStyleText* textStyle;
|
||||
GetStyleData(eStyleStruct_Text, (const nsStyleStruct *&)textStyle);
|
||||
if (!textStyle->WhiteSpaceIsSignificant()) {
|
||||
value.CompressWhitespace();
|
||||
}
|
||||
|
||||
if (value.IsEmpty()) {
|
||||
// Have to have _something_ or we won't be drawn
|
||||
value.Assign(NS_LITERAL_STRING(" "));
|
||||
}
|
||||
|
||||
CalcNavQuirkSizing(aPresContext, aReflowState.rendContext, value,
|
||||
desiredSize);
|
||||
|
||||
// Note: The Quirks sizing includes a 2px border in its calculation of "desiredSize"
|
||||
// So we must subtract off the 2 pixel border.
|
||||
// Quirk sizing also assumes a 0px padding
|
||||
float p2t;
|
||||
aPresContext->GetPixelsToTwips(&p2t);
|
||||
nscoord borderTwips = NSIntPixelsToTwips(4, p2t);
|
||||
desiredSize.width -= borderTwips;
|
||||
desiredSize.height -= borderTwips;
|
||||
|
||||
// Now figure out how much vertical padding was added and
|
||||
// then subtract it, so we can add in the padding later
|
||||
// horizontal pading is 0px;
|
||||
nscoord hgt;
|
||||
fontMet->GetHeight(hgt);
|
||||
desiredSize.height -= PR_MAX(0, desiredSize.height - hgt);
|
||||
|
||||
// This calculates the reflow size
|
||||
// get the css size and let the frame use or override it
|
||||
nsSize styleSize;
|
||||
nsFormControlFrame::GetStyleSize(aPresContext, aReflowState, styleSize);
|
||||
|
||||
if (CSS_NOTSET != styleSize.width) { // css provides width
|
||||
NS_ASSERTION(styleSize.width+aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right >= 0, "form control's computed width is < 0");
|
||||
if (NS_INTRINSICSIZE != styleSize.width) {
|
||||
desiredSize.width = styleSize.width;
|
||||
desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
||||
}
|
||||
} else {
|
||||
desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
||||
}
|
||||
|
||||
if (CSS_NOTSET != styleSize.height) { // css provides height
|
||||
NS_ASSERTION(styleSize.height > 0, "form control's computed height is <= 0");
|
||||
if (NS_INTRINSICSIZE != styleSize.height) {
|
||||
desiredSize.height = styleSize.height;
|
||||
desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
||||
}
|
||||
} else {
|
||||
desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
||||
}
|
||||
|
||||
aDesiredSize.width = desiredSize.width;
|
||||
aDesiredSize.height = desiredSize.height;
|
||||
} else {
|
||||
// XXX ASSERT HERE
|
||||
desiredSize.width = 0;
|
||||
desiredSize.height = 0;
|
||||
}
|
||||
|
||||
// remove it from the the desired size
|
||||
// because the content need to fit inside of it
|
||||
desiredSize.width -= (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
|
||||
desiredSize.height -= (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
|
||||
|
||||
// Ok, now we think we know what size we are so we can reflow our contents
|
||||
// But we need to make sure we aren't smaller or larger then the min/max
|
||||
if (desiredSize.width < aReflowState.mComputedMinWidth) {
|
||||
desiredSize.width = aReflowState.mComputedMinWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
|
||||
} else if (desiredSize.width > aReflowState.mComputedMaxWidth) {
|
||||
desiredSize.width = aReflowState.mComputedMaxWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right);
|
||||
}
|
||||
|
||||
if (desiredSize.height < aReflowState.mComputedMinHeight) {
|
||||
desiredSize.height = aReflowState.mComputedMinHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
|
||||
} else if (desiredSize.height > aReflowState.mComputedMaxHeight) {
|
||||
desiredSize.height = aReflowState.mComputedMaxHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom);
|
||||
}
|
||||
|
||||
// XXX Proper handling of incremental reflow...
|
||||
nsReflowReason reason = aReflowState.reason;
|
||||
if (eReflowReason_Incremental == reason) {
|
||||
// See if it's targeted at us
|
||||
nsHTMLReflowCommand *command = aReflowState.path->mReflowCommand;
|
||||
|
||||
if (command) {
|
||||
Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE);
|
||||
|
||||
nsReflowType reflowType;
|
||||
command->GetType(reflowType);
|
||||
if (eReflowType_StyleChanged == reflowType) {
|
||||
reason = eReflowReason_StyleChange;
|
||||
}
|
||||
else {
|
||||
reason = eReflowReason_Resize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// now reflow the first child (generated content)
|
||||
nsHTMLReflowState reflowState(aPresContext, aReflowState, firstKid, desiredSize, reason);
|
||||
reflowState.mComputedWidth = desiredSize.width;
|
||||
reflowState.mComputedHeight = desiredSize.height;
|
||||
|
||||
nsHTMLReflowMetrics childReflowMetrics(aDesiredSize);
|
||||
nsRect kidRect;
|
||||
firstKid->GetRect(kidRect);
|
||||
ReflowChild(firstKid, aPresContext, childReflowMetrics, reflowState, kidRect.x, kidRect.y, 0, aStatus);
|
||||
|
||||
aDesiredSize.ascent = childReflowMetrics.ascent +
|
||||
aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
// Center the child and add back in the border and badding
|
||||
// our inner area frame is already doing centering so we only need to center vertically.
|
||||
nsRect rect = nsRect(aReflowState.mComputedBorderPadding.left,
|
||||
aReflowState.mComputedBorderPadding.top,
|
||||
desiredSize.width,
|
||||
desiredSize.height);
|
||||
firstKid->SetRect(aPresContext, rect);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Create the text content used as label for the button.
|
||||
// The frame will be generated by the frame constructor.
|
||||
NS_IMETHODIMP
|
||||
|
@ -359,11 +202,6 @@ nsGfxButtonControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext,
|
|||
value.CompressWhitespace();
|
||||
}
|
||||
|
||||
if (value.IsEmpty()) {
|
||||
// Have to have _something_ or we won't be drawn
|
||||
value.Assign(NS_LITERAL_STRING(" "));
|
||||
}
|
||||
|
||||
// Add a child text content node for the label
|
||||
nsCOMPtr<nsIContent> labelContent(do_CreateInstance(kTextNodeCID,&result));
|
||||
if (NS_SUCCEEDED(result) && labelContent) {
|
||||
|
@ -475,7 +313,7 @@ nsGfxButtonControlFrame::GetDefaultLabel(nsString& aString)
|
|||
rv = nsFormControlHelper::GetLocalizedString(propname, NS_LITERAL_STRING("Browse").get(), aString);
|
||||
}
|
||||
else {
|
||||
aString.Assign(NS_LITERAL_STRING(" "));
|
||||
aString.Assign(NS_LITERAL_STRING(""));
|
||||
rv = NS_OK;
|
||||
}
|
||||
return rv;
|
||||
|
@ -519,17 +357,6 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
DO_GLOBAL_REFLOW_COUNT("nsGfxButtonControlFrame", aReflowState.reason);
|
||||
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
#if 0
|
||||
nsresult skiprv = nsFormControlFrame::SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext,
|
||||
aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
if (NS_SUCCEEDED(skiprv)) {
|
||||
return skiprv;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((kSuggestedNotSet != mSuggestedWidth) ||
|
||||
(kSuggestedNotSet != mSuggestedHeight)) {
|
||||
nsHTMLReflowState suggestedReflowState(aReflowState);
|
||||
|
@ -543,76 +370,13 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
suggestedReflowState.mComputedHeight = mSuggestedHeight;
|
||||
}
|
||||
|
||||
rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus);
|
||||
return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus);
|
||||
|
||||
} else { // Normal reflow.
|
||||
|
||||
#if 1
|
||||
// nsHTMLButtonControlFrame::Reflow registers it for Standard Mode
|
||||
// and sets up mPresContext
|
||||
if (eReflowReason_Initial == aReflowState.reason) {
|
||||
nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE);
|
||||
}
|
||||
// Do NavQuirks Sizing and layout
|
||||
rv = DoNavQuirksReflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
// Make sure we obey min/max-width and min/max-height
|
||||
if (aDesiredSize.width > aReflowState.mComputedMaxWidth) {
|
||||
aDesiredSize.width = aReflowState.mComputedMaxWidth;
|
||||
}
|
||||
if (aDesiredSize.width < aReflowState.mComputedMinWidth) {
|
||||
aDesiredSize.width = aReflowState.mComputedMinWidth;
|
||||
}
|
||||
|
||||
if (aDesiredSize.height > aReflowState.mComputedMaxHeight) {
|
||||
aDesiredSize.height = aReflowState.mComputedMaxHeight;
|
||||
}
|
||||
if (aDesiredSize.height < aReflowState.mComputedMinHeight) {
|
||||
aDesiredSize.height = aReflowState.mComputedMinHeight;
|
||||
}
|
||||
#else
|
||||
// Do Standard mode sizing and layout
|
||||
rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Normal reflow.
|
||||
|
||||
#ifdef DEBUG_rodsXXXX
|
||||
COMPARE_QUIRK_SIZE("nsGfxButtonControlFrame", 84, 24) // with the text "Press Me" in it
|
||||
#endif
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
|
||||
if (aDesiredSize.maxElementSize != nsnull) {
|
||||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
}
|
||||
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
nsGfxButtonControlFrame::CalcNavQuirkSizing(nsIPresContext* aPresContext,
|
||||
nsIRenderingContext* aRendContext,
|
||||
nsString& aLabel,
|
||||
nsSize& aSize)
|
||||
{
|
||||
float p2t;
|
||||
float t2p;
|
||||
aPresContext->GetPixelsToTwips(&p2t);
|
||||
aPresContext->GetTwipsToPixels(&t2p);
|
||||
|
||||
// Get text size, round to nearest pixel, multiply by 3/2
|
||||
// XXX this algorithm seems suspect: rounding before multiply can't be good,
|
||||
// and 3/2 seems ... arbitrary
|
||||
nsFormControlHelper::GetTextSize(aPresContext, this,
|
||||
aLabel, aSize,
|
||||
aRendContext);
|
||||
aSize.width = NSToCoordRound(aSize.width * t2p);
|
||||
aSize.height = NSToCoordRound(aSize.height * t2p);
|
||||
aSize.width = NSIntPixelsToTwips(3 * aSize.width / 2, p2t);
|
||||
aSize.height = NSIntPixelsToTwips(3 * aSize.height / 2, p2t);
|
||||
return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -410,6 +410,7 @@ nsHTMLButtonControlFrame::Paint(nsIPresContext* aPresContext,
|
|||
static
|
||||
void ButtonHack(nsHTMLReflowState& aReflowState, const char* aMessage)
|
||||
{
|
||||
// XXXbz is this still relevant?
|
||||
if (aReflowState.mComputedWidth == 0) {
|
||||
aReflowState.mComputedWidth = aReflowState.availableWidth;
|
||||
}
|
||||
|
@ -551,7 +552,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
focusPadding.left + aReflowState.mComputedBorderPadding.left,
|
||||
focusPadding.top + aReflowState.mComputedBorderPadding.top,
|
||||
0, aStatus);
|
||||
|
||||
|
||||
// calculate the min internal size so the contents gets centered correctly
|
||||
// minInternalWidth is not being used at all and causes a warning--commenting
|
||||
// out until someone wants it.
|
||||
|
@ -573,7 +574,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
|
||||
// Place the child
|
||||
FinishReflowChild(firstKid, aPresContext, &reflowState, aDesiredSize,
|
||||
focusPadding.left + aReflowState.mComputedBorderPadding.right,
|
||||
focusPadding.left + aReflowState.mComputedBorderPadding.left,
|
||||
yoff + focusPadding.top + aReflowState.mComputedBorderPadding.top, 0);
|
||||
|
||||
#if 0 // old way
|
||||
|
@ -602,6 +603,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
#endif
|
||||
|
||||
AddComputedBorderPaddingToDesiredSize(aDesiredSize, aReflowState);
|
||||
|
||||
//aDesiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
||||
//aDesiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
||||
|
||||
|
@ -612,9 +614,6 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
}
|
||||
#endif
|
||||
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
|
||||
if (nsnull != aDesiredSize.maxElementSize) {
|
||||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
|
@ -633,10 +632,15 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
}
|
||||
if (aDesiredSize.height < aReflowState.mComputedMinHeight) {
|
||||
aDesiredSize.height = aReflowState.mComputedMinHeight;
|
||||
}
|
||||
}
|
||||
|
||||
aDesiredSize.ascent += aReflowState.mComputedBorderPadding.top + focusPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent,
|
||||
mCachedMaxElementSize, aDesiredSize);
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -170,6 +170,7 @@ protected:
|
|||
|
||||
//Resize Reflow OpitmizationSize;
|
||||
nsSize mCacheSize;
|
||||
nscoord mCachedAscent;
|
||||
nsSize mCachedMaxElementSize;
|
||||
};
|
||||
|
||||
|
|
|
@ -837,7 +837,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
// so we can check timings against the old version
|
||||
#if 1
|
||||
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
nsFormControlFrame::SkipResizeReflow(mCacheSize,
|
||||
mCachedAscent,
|
||||
mCachedMaxElementSize,
|
||||
mCachedAvailableSize,
|
||||
aDesiredSize, aReflowState,
|
||||
|
@ -999,6 +1000,7 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
}
|
||||
mCachedUnconstrainedSize.width = scrolledAreaDesiredSize.width;
|
||||
mCachedUnconstrainedSize.height = scrolledAreaDesiredSize.height;
|
||||
mCachedAscent = scrolledAreaDesiredSize.ascent;
|
||||
mCachedDesiredMaxSize.width = scrolledAreaDesiredSize.maxElementSize->width;
|
||||
mCachedDesiredMaxSize.height = scrolledAreaDesiredSize.maxElementSize->height;
|
||||
} else {
|
||||
|
@ -1280,8 +1282,9 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
} else {
|
||||
aDesiredSize.width = visibleWidth;
|
||||
aDesiredSize.height = visibleHeight;
|
||||
aDesiredSize.ascent = aDesiredSize.height;
|
||||
aDesiredSize.descent = 0;
|
||||
aDesiredSize.ascent =
|
||||
scrolledAreaDesiredSize.ascent + aReflowState.mComputedBorderPadding.top;
|
||||
aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent;
|
||||
}
|
||||
|
||||
if (nsnull != aDesiredSize.maxElementSize) {
|
||||
|
@ -1319,7 +1322,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext,
|
|||
|
||||
//REFLOW_DEBUG_MSG3("** nsLCF Caching AW: %d AH: %d\n", PX(mCachedAvailableSize.width), PX(mCachedAvailableSize.height));
|
||||
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize);
|
||||
nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent,
|
||||
mCachedMaxElementSize, aDesiredSize);
|
||||
|
||||
REFLOW_DEBUG_MSG3("** Done nsLCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height));
|
||||
|
||||
|
|
|
@ -423,6 +423,7 @@ protected:
|
|||
|
||||
//Resize Reflow OpitmizationSize;
|
||||
nsSize mCacheSize;
|
||||
nscoord mCachedAscent;
|
||||
nsSize mCachedMaxElementSize;
|
||||
nsSize mCachedUnconstrainedSize;
|
||||
nsSize mCachedAvailableSize;
|
||||
|
|
|
@ -74,6 +74,9 @@ label {
|
|||
/* default inputs, text inputs, and selects */
|
||||
input {
|
||||
-moz-appearance: textfield;
|
||||
/* The sum of border-top, border-bottom, padding-top, padding-bottom
|
||||
must be the same here, for buttons, and for <select> (including its
|
||||
internal padding magic) */
|
||||
padding: 1px 0 1px 0;
|
||||
border: 2px inset ThreeDFace;
|
||||
background-color: -moz-Field;
|
||||
|
@ -82,7 +85,6 @@ input {
|
|||
line-height: normal !important;
|
||||
text-align: start;
|
||||
text-transform: none;
|
||||
vertical-align: text-bottom;
|
||||
cursor: text;
|
||||
-moz-box-sizing: border-box;
|
||||
-moz-user-focus: normal;
|
||||
|
@ -126,7 +128,6 @@ select {
|
|||
line-height: normal !important;
|
||||
white-space: nowrap;
|
||||
text-align: start;
|
||||
vertical-align: text-bottom;
|
||||
cursor: default;
|
||||
-moz-box-sizing: border-box;
|
||||
-moz-user-select: none;
|
||||
|
@ -138,10 +139,14 @@ select {
|
|||
}
|
||||
|
||||
select[size] {
|
||||
/* Different alignment and padding for listbox vs combobox */
|
||||
vertical-align: text-bottom;
|
||||
padding: 1px 0 1px 0;
|
||||
}
|
||||
|
||||
select[size="1"] {
|
||||
/* Except this is not a listbox */
|
||||
vertical-align: baseline;
|
||||
padding: 0;
|
||||
-moz-appearance: menulist;
|
||||
}
|
||||
|
@ -178,6 +183,8 @@ select:-moz-dummy-option {
|
|||
|
||||
*|*:-moz-display-comboboxcontrol-frame {
|
||||
overflow: hidden;
|
||||
/* This top/bottom padding plus the combobox top/bottom border need to
|
||||
add up to the top/bottom borderpadding of text inputs and buttons */
|
||||
padding: 1px 0 1px 4px;
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
|
@ -263,7 +270,6 @@ input[type="image"] {
|
|||
padding: 0;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
vertical-align: baseline;
|
||||
font-family: sans-serif;
|
||||
font-size: small;
|
||||
cursor: pointer;
|
||||
|
@ -293,17 +299,14 @@ input[type="file"] > input[type="text"] {
|
|||
border-color: inherit;
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
font-size: inherit;
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
/* button part of file selector */
|
||||
input[type="file"] > input[type="button"] {
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
input[type="file"] > input[type="button"]:-moz-focus-inner
|
||||
{
|
||||
padding: 0px 2px 0px 2px;
|
||||
border: 1px dotted transparent;
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
/* radio buttons */
|
||||
|
@ -313,7 +316,6 @@ input[type="radio"] {
|
|||
height: 13px;
|
||||
margin: 3px 3px 0px 5px;
|
||||
padding: 0;
|
||||
vertical-align: baseline;
|
||||
cursor: default;
|
||||
-moz-binding: none;
|
||||
|
||||
|
@ -383,14 +385,16 @@ input[type="reset"],
|
|||
input[type="button"],
|
||||
input[type="submit"] {
|
||||
-moz-appearance: button;
|
||||
padding: 2px 0 2px 0;
|
||||
/* The sum of border-top, border-bottom, padding-top, padding-bottom
|
||||
must be the same here, for text inputs, and for <select>. For
|
||||
buttons, make sure to include the -moz-focus-inner border/padding. */
|
||||
padding: 0px 8px 0px 8px;
|
||||
border: 2px outset ButtonFace;
|
||||
background-color: ButtonFace;
|
||||
color: ButtonText;
|
||||
font: -moz-button;
|
||||
line-height: normal !important;
|
||||
white-space: pre;
|
||||
vertical-align: text-bottom;
|
||||
cursor: default;
|
||||
-moz-box-sizing: border-box;
|
||||
-moz-user-select: none;
|
||||
|
@ -407,15 +411,16 @@ button:active:hover,
|
|||
input[type="reset"]:active:hover,
|
||||
input[type="button"]:active:hover,
|
||||
input[type="submit"]:active:hover {
|
||||
padding: 3px 0 1px 0;
|
||||
padding: 0px 7px 0px 9px;
|
||||
border-style: inset;
|
||||
}
|
||||
|
||||
button:-moz-focus-inner,
|
||||
input[type="reset"]:-moz-focus-inner,
|
||||
input[type="button"]:-moz-focus-inner,
|
||||
input[type="submit"]:-moz-focus-inner {
|
||||
padding: 1px 2px 1px 2px;
|
||||
input[type="submit"]:-moz-focus-inner,
|
||||
input[type="file"] > input[type="button"]:-moz-focus-inner {
|
||||
padding: 0px 2px 0px 2px;
|
||||
border: 1px dotted transparent;
|
||||
}
|
||||
|
||||
|
@ -436,7 +441,9 @@ select[disabled] > input[type="button"],
|
|||
select[disabled] > input[type="button"]:active,
|
||||
input[type="submit"][disabled]:active,
|
||||
input[type="submit"][disabled] {
|
||||
padding: 3px 1px 3px 1px;
|
||||
/* The sum of border-top, border-bottom, padding-top, padding-bottom
|
||||
must be the same here and for text inputs */
|
||||
padding: 1px 8px 1px 8px;
|
||||
border: 1px outset ButtonShadow;
|
||||
color: GrayText;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче