Make input type=text width bigger (Rick.Ju@sun.com's patch, bug 92980), r=jkeiser@netscape.com, sr=kin@netscape.com

git-svn-id: svn://10.0.0.236/trunk@130274 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
jkeiser%netscape.com
2002-09-23 19:43:48 +00:00
parent 579d9ec4d2
commit b6c4cce5ef
4 changed files with 80 additions and 130 deletions

View File

@@ -125,8 +125,6 @@
#endif // IBMBIDI
#define DEFAULT_COLUMN_WIDTH 20
// (10 pixels)
#define GUESS_INPUT_SIZE 150
#include "nsContentCID.h"
static NS_DEFINE_IID(kRangeCID, NS_RANGE_CID);
@@ -1552,7 +1550,7 @@ nsTextControlFrame::GetRows()
}
void
nsresult
nsTextControlFrame::ReflowStandard(nsIPresContext* aPresContext,
nsSize& aDesiredSize,
const nsHTMLReflowState& aReflowState,
@@ -1560,8 +1558,9 @@ nsTextControlFrame::ReflowStandard(nsIPresContext* aPresContext,
{
// get the css size and let the frame use or override it
nsSize minSize;
CalculateSizeStandard(aPresContext, aReflowState.rendContext, aDesiredSize,
minSize);
nsresult rv = CalculateSizeStandard(aPresContext, aReflowState.rendContext,
aDesiredSize, minSize);
NS_ENSURE_SUCCESS(rv, rv);
// Add in the size of the scrollbars for textarea
if (IsTextArea()) {
@@ -1597,11 +1596,13 @@ nsTextControlFrame::ReflowStandard(nsIPresContext* aPresContext,
aDesiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
return NS_OK;
}
void
nsresult
nsTextControlFrame::CalculateSizeStandard(nsIPresContext* aPresContext,
nsIRenderingContext* aRendContext,
nsSize& aDesiredSize,
@@ -1610,63 +1611,36 @@ nsTextControlFrame::CalculateSizeStandard(nsIPresContext* aPresContext,
aDesiredSize.width = CSS_NOTSET;
aDesiredSize.height = CSS_NOTSET;
// Get leading and the Average/MaxAdvance char width
nscoord fontHeight = 0;
// get leading
nscoord charWidth = 0;
nscoord charMaxAdvance = 0;
nsCOMPtr<nsIFontMetrics> fontMet;
nsresult rv = nsFormControlHelper::GetFrameFontFM(aPresContext, this, getter_AddRefs(fontMet));
if (NS_SUCCEEDED(rv) && fontMet) {
aRendContext->SetFont(fontMet);
fontMet->GetHeight(fontHeight);
} else {
NS_WARNING("No font metrics found for textarea / input! Something is fishy.");
fontHeight = GUESS_INPUT_SIZE;
}
// Internal padding is necessary for better matching IE's width
nscoord internalPadding = 0;
// Get the Average char width to calc the min width and
// pref width. Pref Width is calced by multiplying the size times avecharwidth
//
// XXX Currently, WIN32 is the only platform to implement the GetAveCharWidth in
// nsIFontMetrics. The other need to have it implemeneted (Bug 50998)
// and then this if def removed. We are too close to RTM to implement it in all
// the platforms and ports.
NS_ENSURE_SUCCESS(rv, rv);
aRendContext->SetFont(fontMet);
fontMet->GetHeight(fontHeight);
fontMet->GetAveCharWidth(charWidth);
fontMet->GetMaxAdvance(charMaxAdvance);
// calc the min width and pref width. Pref Width is calced by multiplying the size times avecharwidth
float p2t;
aPresContext->GetPixelsToTwips(&p2t);
nscoord charWidth = 0;
#if defined(_WIN32) || defined(XP_OS2)
fontMet->GetAveCharWidth(charWidth);
// Get frame font
const nsFont * font = nsnull;
if (NS_SUCCEEDED(this->GetFont(aPresContext, font))) {
// To better match IE, take the size (in twips) and remove 4 pixels
// add this on as additional padding
internalPadding = PR_MAX(font->size - NSToCoordRound(4 * p2t), 0);
// round to a multiple of p2t
nscoord rest = internalPadding%NSToCoordRound(p2t);
if( rest < NSToCoordRound(p2t) - rest) {
internalPadding = internalPadding - rest;
} else {
internalPadding = internalPadding + NSToCoordRound(p2t) - rest;
}
// To better match IE, take the maximum character width(in twips) and remove 4 pixels
// add this on as additional padding(internalPadding)
nscoord internalPadding = 0;
internalPadding = PR_MAX(charMaxAdvance - NSToCoordRound(4 * p2t), 0);
// round to a multiple of p2t
nscoord t = NSToCoordRound(p2t);
nscoord rest = internalPadding % t;
if (rest < t - rest) {
internalPadding -= rest;
} else {
internalPadding += t - rest;
}
#else
// XP implementation of AveCharWidth
nsAutoString aveStr;
aveStr.Assign(NS_LITERAL_STRING(" ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+=-0987654321~`';\":[]}{?><,./\\|"));
aRendContext->GetWidth(aveStr, charWidth);
charWidth /= aveStr.Length();
// Round to the nearest twip
nscoord onePixel = NSIntPixelsToTwips(1, p2t); // get the rounding right
charWidth = nscoord((float(charWidth) / float(onePixel)) + 0.5)*onePixel;
#endif
// Set the width equal to the width in characters
aDesiredSize.width = GetCols() * charWidth;
// Now add the extra padding on (so that small input sizes work well)
@@ -1681,10 +1655,10 @@ nsTextControlFrame::CalculateSizeStandard(nsIPresContext* aPresContext,
// shall pass.
aMinSize.width = aDesiredSize.width;
aMinSize.height = aDesiredSize.height;
return NS_OK;
}
//------------------------------------------------------------------
NS_IMETHODIMP
nsTextControlFrame::CreateFrameFor(nsIPresContext* aPresContext,
@@ -2217,7 +2191,8 @@ nsTextControlFrame::GetPrefSize(nsBoxLayoutState& aState, nsSize& aSize)
mNotifyOnInput = PR_TRUE; //its ok to notify now. all has been prepared.
nsReflowStatus status;
ReflowStandard(presContext, aSize, *reflowState, status);
nsresult rv = ReflowStandard(presContext, aSize, *reflowState, status);
NS_ENSURE_SUCCESS(rv, rv);
AddInset(aSize);
mPrefSize = aSize;