pjs/layout/forms/nsFormControlHelper.h

391 строка
15 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsFormControlHelper_h___
#define nsFormControlHelper_h___
#include "nsIFormControlFrame.h"
#include "nsISupports.h"
#include "nsIWidget.h"
#include "nsLeafFrame.h"
#include "nsCoord.h"
#include "nsHTMLAtoms.h"
#include "nsINameSpaceManager.h"
class nsIView;
class nsIPresContext;
class nsStyleCoord;
class nsIPresState;
class nsIStyleContext;
#define CSS_NOTSET -1
#define ATTR_NOTSET -1
#define NS_STRING_TRUE NS_LITERAL_STRING("1")
#define NS_STRING_FALSE NS_LITERAL_STRING("0")
// for localization
#define FORM_PROPERTIES "chrome://communicator/locale/layout/HtmlForm.properties"
/**
* Enumeration of possible mouse states used to detect mouse clicks
*/
enum nsMouseState {
eMouseNone,
eMouseEnter,
eMouseExit,
eMouseDown,
eMouseUp
};
struct nsInputDimensionSpec
{
nsIAtom* mColSizeAttr; // attribute used to determine width
PRBool mColSizeAttrInPixels; // is attribute value in pixels (otherwise num chars)
nsIAtom* mColValueAttr; // attribute used to get value to determine size
// if not determined above
nsString* mColDefaultValue; // default value if not determined above
nscoord mColDefaultSize; // default width if not determined above
PRBool mColDefaultSizeInPixels; // is default width in pixels (otherswise num chars)
nsIAtom* mRowSizeAttr; // attribute used to determine height
nscoord mRowDefaultSize; // default height if not determined above
nsInputDimensionSpec(nsIAtom* aColSizeAttr, PRBool aColSizeAttrInPixels,
nsIAtom* aColValueAttr, nsString* aColDefaultValue,
nscoord aColDefaultSize, PRBool aColDefaultSizeInPixels,
nsIAtom* aRowSizeAttr, nscoord aRowDefaultSize)
: mColSizeAttr(aColSizeAttr), mColSizeAttrInPixels(aColSizeAttrInPixels),
mColValueAttr(aColValueAttr),
mColDefaultValue(aColDefaultValue), mColDefaultSize(aColDefaultSize),
mColDefaultSizeInPixels(aColDefaultSizeInPixels),
mRowSizeAttr(aRowSizeAttr), mRowDefaultSize(aRowDefaultSize)
{
}
};
/**
* nsFormControlHelper is the base class for frames of form controls. It
* provides a uniform way of creating widgets, resizing, and painting.
* @see nsLeafFrame and its base classes for more info
*/
class nsFormControlHelper
{
public:
static nscoord CalculateSize (nsIPresContext* aPresContext,
nsIRenderingContext* aRendContext,
nsIFormControlFrame* aFrame,
const nsSize& aCSSSize,
nsInputDimensionSpec& aDimensionSpec,
nsSize& aDesiredSize,
nsSize& aMinSize,
PRBool& aWidthExplicit,
PRBool& aHeightExplicit,
nscoord& aRowSize);
static nscoord GetTextSize(nsIPresContext* aContext, nsIFormControlFrame* aFrame,
const nsString& aString, nsSize& aSize,
nsIRenderingContext *aRendContext);
static nscoord GetTextSize(nsIPresContext* aContext, nsIFormControlFrame* aFrame,
PRInt32 aNumChars, nsSize& aSize,
nsIRenderingContext *aRendContext);
// XXX This could be removed now that we no longer have form quirks.
static nsresult GetFont(nsIFormControlFrame * aFormFrame,
nsIPresContext* aPresContext,
nsIStyleContext * aStyleContext,
const nsFont*& aFont);
// returns the an addref'ed FontMetrics for the default font for the frame
static nsresult GetFrameFontFM(nsIPresContext* aPresContext,
nsIFormControlFrame * aFrame,
nsIFontMetrics** aFontMet);
static nscoord CalcNavQuirkSizing(nsIPresContext* aPresContext,
nsIRenderingContext* aRendContext,
nsIFontMetrics* aFontMet,
nsIFormControlFrame* aFrame,
nsInputDimensionSpec& aSpec,
nsSize& aSize);
static void ForceDrawFrame(nsIPresContext* aPresContext, nsIFrame * aFrame);
// Map platform line endings (CR, CRLF, LF) to DOM line endings (LF)
static void PlatformToDOMLineBreaks(nsString &aString);
/**
* Get whether a form control is disabled
* @param aContent the content of the form control in question
* @return whether the form control is disabled
*/
static PRBool GetDisabled(nsIContent* aContent) {
return aContent->HasAttr(kNameSpaceID_None, nsHTMLAtoms::disabled);
};
/**
* Get the name of the form control
* @param aContent the content to get the name of
* @param aResult the returned name of the form control [OUT]
* @return NS_CONTENT_ATTR_HAS_VALUE if things go well
* @return NS_CONTENT_ATTR_NOT_THERE if the name attribute is undefined
* @return NS_ERROR_FAILURE if aContent is null or is not HTML content
*/
static nsresult GetName(nsIContent* aContent, nsAString* aResult);
/**
* Get the type of the form control (if it's not obvious from the frame type)
* @param aContent the content to get the name of
* @param aType the returned type of the form control [OUT]
* @return NS_CONTENT_ATTR_HAS_VALUE if things go well
* @return NS_CONTENT_ATTR_NOT_THERE if the type attribute is undefined
* @return NS_ERROR_FAILURE if aContent is null or is not HTML content
*/
static nsresult GetType(nsIContent* aContent, PRInt32* aType);
/**
* Get the value of the form control (if it's just living in an attr)
* @param aContent the content to get the name of
* @param aResult the returned value of the form control [OUT]
* @return NS_CONTENT_ATTR_HAS_VALUE if things go well
* @return NS_CONTENT_ATTR_NOT_THERE if the value attribute is undefined
* @return NS_ERROR_FAILURE if aContent is null or is not HTML content
*/
static nsresult GetValueAttr(nsIContent* aContent, nsAString* aResult);
/**
* Cause the form control to reset its value
* @param aFrame the frame who owns the form control
* @param aPresContext the pres context
*/
static nsresult Reset(nsIFrame* aFrame, nsIPresContext* aPresContext);
/**
* Utility to convert a string to a PRBool
* @param aValue string to convert to a PRBool
* @returns PR_TRUE if aValue = "1", PR_FALSE otherwise
*/
static PRBool GetBool(const nsAString& aValue);
/**
* Utility to convert a PRBool to a string
* @param aValue Boolean value to convert to string.
* @param aResult string to hold the boolean value. It is set to "1"
* if aValue equals PR_TRUE, "0" if aValue equals PR_FALSE.
*/
static void GetBoolString(const PRBool aValue, nsAString& aResult);
static void GetRepChars(char& char1, char& char2) {
char1 = 'W';
char2 = 'w';
}
// wrap can be one of these three values.
typedef enum {
eHTMLTextWrap_Off = 1, // the default
eHTMLTextWrap_Hard = 2, // "hard" or "physical"
eHTMLTextWrap_Soft = 3 // "soft" or "virtual"
} nsHTMLTextWrap;
/** returns the value of the "wrap" property in aOutValue
* returns NS_CONTENT_ATTR_NOT_THERE if the property does not exist for this
*/
static nsresult GetWrapProperty(nsIContent * aContent, nsString &aOutValue);
static nsresult GetWrapPropertyEnum(nsIContent * aContent, nsHTMLTextWrap& aWrapProp);
// Localization Helper
static nsresult GetLocalizedString(const char * aPropFileName, const PRUnichar* aKey, nsString& oVal);
static const char * GetHTMLPropertiesFileName() { return FORM_PROPERTIES; }
//
//-------------------------------------------------------------------------------------
// Utility methods for managing checkboxes and radiobuttons
//-------------------------------------------------------------------------------------
//
/**
* Get the state of the checked attribute.
* @param aState set to PR_TRUE if the checked attribute is set,
* PR_FALSE if the checked attribute has been removed
* @returns NS_OK or NS_CONTENT_ATTR_HAS_VALUE
*/
//nsresult GetCurrentCheckState(PRBool* aState);
/**
* Set the state of the checked attribute.
* @param aState set to PR_TRUE to set the attribute,
* PR_FALSE to unset the attribute
* @returns NS_OK or NS_CONTENT_ATTR_HAS_VALUE
*/
nsresult SetCurrentCheckState(PRBool aState);
/**
* Get the state of the defaultchecked attribute.
* @param aState set to PR_TRUE if the defaultchecked attribute is set,
* PR_FALSE if the defaultchecked attribute has been removed
* @returns NS_OK or NS_CONTENT_ATTR_HAS_VALUE
*/
nsresult GetDefaultCheckState(PRBool* aState);
//
//-------------------------------------------------------------------------------------
// Utility methods for rendering Form Elements using GFX
//-------------------------------------------------------------------------------------
//
// XXX: The following location for the paint code is TEMPORARY.
// It is being used to get printing working
// under windows. Later it will be used to GFX-render the controls to the display.
// Expect this code to repackaged and moved to a new location in the future.
/**
* Enumeration of possible mouse states used to detect mouse clicks
*/
enum nsArrowDirection {
eArrowDirection_Left,
eArrowDirection_Right,
eArrowDirection_Up,
eArrowDirection_Down
};
/**
* Scale, translate and convert an arrow of poitns from nscoord's to nsPoints's.
*
* @param aNumberOfPoints number of (x,y) pairs
* @param aPoints arrow of points to convert
* @param aScaleFactor scale factor to apply to each points translation.
* @param aX x coordinate to add to each point after scaling
* @param aY y coordinate to add to each point after scaling
* @param aCenterX x coordinate of the center point in the original array of points.
* @param aCenterY y coordiante of the center point in the original array of points.
*/
static void SetupPoints(PRUint32 aNumberOfPoints, nscoord* aPoints,
nsPoint* aPolygon, nscoord aScaleFactor, nscoord aX, nscoord aY,
nscoord aCenterX, nscoord aCenterY);
/**
* Paint a fat line. The line is drawn as a polygon with a specified width.
*
* @param aRenderingContext the rendering context
* @param aSX starting x in pixels
* @param aSY starting y in pixels
* @param aEX ending x in pixels
* @param aEY ending y in pixels
* @param aHorz PR_TRUE if aWidth is added to x coordinates to form polygon. If
* PR_FALSE then aWidth as added to the y coordinates.
* @param aOnePixel number of twips in a single pixel.
*/
static void PaintLine(nsIRenderingContext& aRenderingContext,
nscoord aSX, nscoord aSY, nscoord aEX, nscoord aEY,
PRBool aHorz, nscoord aWidth, nscoord aOnePixel);
/**
* Paint a fixed size checkmark
*
* @param aRenderingContext the rendering context
* @param aPixelsToTwips scale factor for convering pixels to twips.
*/
static void PaintFixedSizeCheckMark(nsIRenderingContext& aRenderingContext,
float aPixelsToTwips);
/**
* Paint a checkmark
*
* @param aRenderingContext the rendering context
* @param aPixelsToTwips scale factor for convering pixels to twips.
* @param aWidth width in twips
* @param aHeight height in twips
*/
static void PaintCheckMark(nsIRenderingContext& aRenderingContext,
float aPixelsToTwips, const nsRect & aRect);
/**
* Paint a fixed size checkmark border
*
* @param aRenderingContext the rendering context
* @param aPixelsToTwips scale factor for convering pixels to twips.
* @param aBackgroundColor color for background of the checkbox
*/
static void PaintFixedSizeCheckMarkBorder(nsIRenderingContext& aRenderingContext,
float aPixelsToTwips, const nsStyleColor& aBackgroundColor);
/**
* Paint a rectangular button. Includes background, string, and focus indicator
*
* @param aPresContext the presentation context
* @param aRenderingContext the rendering context
* @param aDirtyRect rectangle requiring update
* @param aRect x,y, width, and height of the button in TWIPS
* @param aShift if PR_TRUE offset button as if it were pressed
* @param aShowFocus if PR_TRUE draw focus rectangle over button
* @param aStyleContext style context used for drawing button background
* @param aLabel label for button
* @param aForFrame the frame that the scrollbar will be rendered in to
*/
static void PaintRectangularButton(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect, const nsRect& aRect,
PRBool aShift, PRBool aShowFocus, PRBool aDisabled,
PRBool aDrawOutline,
nsIStyleContext* aOutlineStyle,
nsIStyleContext* aFocusStyle,
nsIStyleContext* aStyleContext, nsString& aLabel,
nsIFrame* aForFrame);
static void StyleChangeReflow(nsIPresContext* aPresContext,
nsIFrame* aFrame);
protected:
nsFormControlHelper();
virtual ~nsFormControlHelper();
};
#endif