зеркало из https://github.com/mozilla/gecko-dev.git
Initial checkin
This commit is contained in:
Родитель
95fe556feb
Коммит
99b3af960d
|
@ -0,0 +1,901 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "nsComboboxControlFrame.h"
|
||||
#include "nsFormFrame.h"
|
||||
#include "nsButtonControlFrame.h"
|
||||
#include "nsTextControlFrame.h"
|
||||
#include "nsIContent.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsIAtom.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIHTMLContent.h"
|
||||
#include "nsHTMLIIDs.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsIFileWidget.h"
|
||||
#include "nsITextWidget.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsRepository.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsHTMLParts.h"
|
||||
#include "nsIDOMHTMLInputElement.h"
|
||||
#include "nsIFormControl.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsITextContent.h"
|
||||
|
||||
// Used for Paint
|
||||
#include "nsCSSRendering.h"
|
||||
#include "nsIDeviceContext.h"
|
||||
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsIViewManager.h"
|
||||
#include "nsViewsCID.h"
|
||||
|
||||
#include "nsIDOMElement.h"
|
||||
#include "nsListControlFrame.h"
|
||||
#include "nsIListControlFrame.h"
|
||||
|
||||
#include "nsIDOMHTMLCollection.h" //rods
|
||||
#include "nsIDOMHTMLSelectElement.h" //rods
|
||||
#include "nsIDOMHTMLOptionElement.h" //rods
|
||||
|
||||
// XXX make this pixels
|
||||
#define CONTROL_SPACING 40
|
||||
|
||||
static NS_DEFINE_IID(kViewCID, NS_VIEW_CID);
|
||||
static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID);
|
||||
static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID);
|
||||
static NS_DEFINE_IID(kIFileWidgetIID, NS_IFILEWIDGET_IID);
|
||||
static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID);
|
||||
static NS_DEFINE_IID(kIFormControlFrameIID, NS_IFORMCONTROLFRAME_IID);
|
||||
static NS_DEFINE_IID(kIComboboxControlFrameIID, NS_ICOMBOBOXCONTROLFRAME_IID);
|
||||
|
||||
static NS_DEFINE_IID(kIDOMHTMLSelectElementIID, NS_IDOMHTMLSELECTELEMENT_IID);
|
||||
static NS_DEFINE_IID(kIDOMHTMLOptionElementIID, NS_IDOMHTMLOPTIONELEMENT_IID);
|
||||
static NS_DEFINE_IID(kIPluggableEventListenerIID, NS_IPLUGGABLEEVENTLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIListControlFrameIID, NS_ILISTCONTROLFRAME_IID);
|
||||
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||
|
||||
extern nsresult NS_NewListControlFrame(nsIFrame*& aNewFrame);
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsresult
|
||||
NS_NewComboboxControlFrame(nsIFrame*& aResult)
|
||||
{
|
||||
aResult = new nsComboboxControlFrame;
|
||||
if (nsnull == aResult) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsComboboxControlFrame::nsComboboxControlFrame()
|
||||
: nsHTMLContainerFrame()
|
||||
{
|
||||
mFormFrame = nsnull;
|
||||
mListFrame = nsnull;
|
||||
mListControlFrame = nsnull;
|
||||
mPlaceHolderFrame = nsnull;
|
||||
|
||||
mVisibleStyleContext = nsnull;
|
||||
mHiddenStyleContext = nsnull;
|
||||
mCurrentStyleContext = nsnull;
|
||||
mBlockTextStyle = nsnull;
|
||||
mBlockTextSelectedStyle = nsnull;
|
||||
mBlockTextSelectedFocusStyle = nsnull;
|
||||
mFirstTime = PR_TRUE;
|
||||
mGotFocus = PR_FALSE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsComboboxControlFrame::~nsComboboxControlFrame()
|
||||
{
|
||||
|
||||
NS_IF_RELEASE(mVisibleStyleContext);
|
||||
NS_IF_RELEASE(mHiddenStyleContext);
|
||||
NS_IF_RELEASE(mBlockTextStyle);
|
||||
//NS_IF_RELEASE(mListControlFrame);
|
||||
//NS_IF_RELEASE(mListFrame);
|
||||
//NS_IF_RELEASE(mPlaceHolderFrame);
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsresult
|
||||
nsComboboxControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
NS_PRECONDITION(0 != aInstancePtr, "null ptr");
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kIComboboxControlFrameIID)) {
|
||||
*aInstancePtr = (void*) ((nsIComboboxControlFrame*) this);
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kIFormControlFrameIID)) {
|
||||
*aInstancePtr = (void*) ((nsIFormControlFrame*) this);
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kIPluggableEventListenerIID)) {
|
||||
NS_ADDREF_THIS(); // Increase reference count for caller
|
||||
*aInstancePtr = (void *)((nsIPluggableEventListener*)this);
|
||||
return NS_OK;
|
||||
}
|
||||
return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRBool
|
||||
nsComboboxControlFrame::IsSuccessful(nsIFormControlFrame* aSubmitter)
|
||||
{
|
||||
nsAutoString name;
|
||||
return (NS_CONTENT_ATTR_HAS_VALUE == GetName(&name));
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
void
|
||||
nsComboboxControlFrame::Reset()
|
||||
{
|
||||
SetFocus(PR_TRUE, PR_TRUE);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetType(PRInt32* aType) const
|
||||
{
|
||||
*aType = NS_FORM_SELECT;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFormContent(nsIContent*& aContent) const
|
||||
{
|
||||
return GetContent(aContent);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFont(nsIPresContext* aPresContext,
|
||||
nsFont& aFont)
|
||||
{
|
||||
nsFormControlHelper::GetFont(this, aPresContext, mStyleContext, aFont);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetVerticalBorderWidth(float aPixToTwip) const
|
||||
{
|
||||
return NSIntPixelsToTwips(3, aPixToTwip);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetHorizontalBorderWidth(float aPixToTwip) const
|
||||
{
|
||||
return GetVerticalBorderWidth(aPixToTwip);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetVerticalInsidePadding(float aPixToTwip,
|
||||
nscoord aInnerHeight) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
||||
float aPixToTwip,
|
||||
nscoord aInnerWidth,
|
||||
nscoord aCharWidth) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// XXX this should be removed when nsView exposes it
|
||||
nsIWidget*
|
||||
nsComboboxControlFrame::GetWindowTemp(nsIView *aView)
|
||||
{
|
||||
nsIWidget *window = nsnull;
|
||||
|
||||
nsIView *ancestor = aView;
|
||||
while (nsnull != ancestor) {
|
||||
ancestor->GetWidget(window);
|
||||
if (nsnull != window) {
|
||||
return window;
|
||||
}
|
||||
ancestor->GetParent(ancestor);
|
||||
}
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void ForceDrawFrame(nsIFrame * aFrame)//, PRBool)
|
||||
{
|
||||
if (aFrame == nsnull) {
|
||||
return;
|
||||
}
|
||||
nsRect rect;
|
||||
nsIView * view;
|
||||
nsPoint pnt;
|
||||
aFrame->GetOffsetFromView(pnt, view);
|
||||
aFrame->GetRect(rect);
|
||||
rect.x = pnt.x;
|
||||
rect.y = pnt.y;
|
||||
if (view != nsnull) {
|
||||
nsIViewManager * viewMgr;
|
||||
view->GetViewManager(viewMgr);
|
||||
if (viewMgr != nsnull) {
|
||||
viewMgr->UpdateView(view, rect, 0);
|
||||
NS_RELEASE(viewMgr);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
void
|
||||
nsComboboxControlFrame::SetFocus(PRBool aOn, PRBool aRepaint)
|
||||
{
|
||||
//mContent->SetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::kClass, "SELECTED", PR_TRUE);
|
||||
mGotFocus = aOn;
|
||||
if (aRepaint) {
|
||||
ForceDrawFrame(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// this is in response to the MouseClick from the containing browse button
|
||||
// XXX still need to get filters from accept attribute
|
||||
void nsComboboxControlFrame::MouseClicked(nsIPresContext* aPresContext)
|
||||
{
|
||||
|
||||
if (nsnull != mListControlFrame) {
|
||||
SetFocus(PR_FALSE, PR_TRUE);
|
||||
mCurrentStyleContext = (mCurrentStyleContext == mHiddenStyleContext ? mVisibleStyleContext : mHiddenStyleContext);
|
||||
if (mCurrentStyleContext == mVisibleStyleContext) {
|
||||
mListControlFrame->AboutToDropDown();
|
||||
nsIFormControlFrame* fcFrame = nsnull;
|
||||
nsresult result = mListFrame->QueryInterface(kIFormControlFrameIID, (void**)&fcFrame);
|
||||
if ((NS_OK == result) && (nsnull != fcFrame)) {
|
||||
fcFrame->SetFocus(PR_TRUE, PR_FALSE);
|
||||
}
|
||||
} else {
|
||||
SetFocus(PR_TRUE, PR_TRUE);
|
||||
}
|
||||
|
||||
mListFrame->ReResolveStyleContext(aPresContext, mCurrentStyleContext);
|
||||
ForceDrawFrame(mListFrame);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList)
|
||||
{
|
||||
nsFormFrame::AddFormControlFrame(aPresContext, *this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::Reflow(nsIPresContext& aPresContext,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus)
|
||||
{
|
||||
if (mFirstTime) {
|
||||
ReResolveStyleContext(&aPresContext, mStyleContext); // XXX This temporary
|
||||
mListFrame->ReResolveStyleContext(&aPresContext, mCurrentStyleContext);
|
||||
mFirstTime = PR_FALSE;
|
||||
}
|
||||
|
||||
PRInt32 numChildren = LengthOf(mFirstChild);
|
||||
|
||||
//nsIFrame* childFrame;
|
||||
if (1 == numChildren) {
|
||||
nsIAtom * textBlockContentPseudo = NS_NewAtom(":COMBOBOX-TEXT");
|
||||
mBlockTextStyle = aPresContext.ResolvePseudoStyleContextFor(mContent, textBlockContentPseudo, mStyleContext);
|
||||
NS_RELEASE(textBlockContentPseudo);
|
||||
|
||||
// XXX This code should move to Init(), someday when the frame construction
|
||||
// changes are all done and Init() is always getting called...
|
||||
PRBool disabled = nsFormFrame::GetDisabled(this);
|
||||
}
|
||||
|
||||
nsSize maxSize(aReflowState.availableWidth, aReflowState.availableHeight);
|
||||
nsHTMLReflowMetrics desiredSize = aDesiredSize;
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
{
|
||||
nsIDOMHTMLSelectElement* select = nsListControlFrame::GetSelect(mContent);
|
||||
if (!select) {
|
||||
return NS_OK;
|
||||
}
|
||||
nsIDOMHTMLCollection* options = nsListControlFrame::GetOptions(mContent, select);
|
||||
if (!options) {
|
||||
NS_RELEASE(select);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// get the css size
|
||||
nsSize styleSize;
|
||||
nsFormControlFrame::GetStyleSize(aPresContext, aReflowState, styleSize);
|
||||
|
||||
// get the size of the longest option
|
||||
PRInt32 maxWidth = 1;
|
||||
PRUint32 numOptions;
|
||||
options->GetLength(&numOptions);
|
||||
for (PRUint32 i = 0; i < numOptions; i++) {
|
||||
nsIDOMHTMLOptionElement* option = nsListControlFrame::GetOption(*options, i);
|
||||
if (option) {
|
||||
//option->CompressContent();
|
||||
nsAutoString text;
|
||||
if (NS_CONTENT_ATTR_HAS_VALUE != option->GetText(text)) {
|
||||
continue;
|
||||
}
|
||||
nsSize textSize;
|
||||
// use the style for the select rather that the option, since widgets don't support it
|
||||
nsFormControlHelper::GetTextSize(aPresContext, this, text, textSize, aReflowState.rendContext);
|
||||
//nsFormControlHelper::GetTextSize(aPresContext, this, 1, textSize, aReflowState.rendContext);
|
||||
if (textSize.width > maxWidth) {
|
||||
maxWidth = textSize.width;
|
||||
}
|
||||
NS_RELEASE(option);
|
||||
}
|
||||
}
|
||||
|
||||
PRInt32 rowHeight = 0;
|
||||
nsSize calcSize, charSize;
|
||||
PRBool widthExplicit, heightExplicit;
|
||||
nsInputDimensionSpec textSpec(nsnull, PR_FALSE, nsnull, nsnull,
|
||||
maxWidth, PR_TRUE, nsHTMLAtoms::size, 1);
|
||||
// XXX fix CalculateSize to return PRUint32
|
||||
PRUint32 numRows = (PRUint32)nsFormControlHelper::CalculateSize(&aPresContext, this, styleSize, textSpec,
|
||||
calcSize, widthExplicit, heightExplicit, rowHeight,
|
||||
aReflowState.rendContext);
|
||||
|
||||
float sp2t;
|
||||
float p2t = aPresContext.GetPixelsToTwips();
|
||||
|
||||
aPresContext.GetScaledPixelsToTwips(sp2t);
|
||||
nscoord onePixel = NSIntPixelsToTwips(1, sp2t);
|
||||
|
||||
nscoord scrollbarWidth = 0;
|
||||
nscoord scrollbarHeight = 0;
|
||||
nsListControlFrame::GetScrollBarDimensions(aPresContext, scrollbarWidth, scrollbarHeight);
|
||||
|
||||
nscoord extra = calcSize.height - (rowHeight * numRows);
|
||||
|
||||
numRows = (numOptions > 20 ? 20 : numOptions);
|
||||
calcSize.height = (numRows * rowHeight) + extra;
|
||||
if (numRows < 21) {
|
||||
//calcSize.width += scrollbarWidth;
|
||||
}
|
||||
|
||||
/*aDesiredSize.width = calcSize.width;
|
||||
// account for vertical scrollbar, if present
|
||||
if (!widthExplicit && (numRows < (PRInt32)numOptions)) {
|
||||
aDesiredSize.width += scrollbarWidth;
|
||||
}
|
||||
*/
|
||||
aDesiredSize.descent = 0;
|
||||
|
||||
|
||||
nsMargin border;
|
||||
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
|
||||
mySpacing->CalcBorderFor(this, border);
|
||||
|
||||
float scale;
|
||||
float sbWidth;
|
||||
float sbHeight;
|
||||
nsIDeviceContext * context = aPresContext.GetDeviceContext();
|
||||
context->GetCanonicalPixelScale(scale);
|
||||
context->GetScrollBarDimensions(sbWidth, sbHeight);
|
||||
PRInt32 scrollbarScaledWidth = PRInt32(sbWidth * scale);
|
||||
PRInt32 scrollbarScaledHeight = PRInt32(sbWidth * scale);
|
||||
|
||||
nscoord adjustment = NSIntPixelsToTwips(14, p2t);
|
||||
|
||||
aDesiredSize.width = calcSize.width + scrollbarScaledWidth + border.left + border.right + adjustment;
|
||||
aDesiredSize.height = rowHeight + onePixel;
|
||||
aDesiredSize.height = rowHeight + onePixel;
|
||||
|
||||
mButtonRect.SetRect(aDesiredSize.width-scrollbarScaledWidth-border.right, border.top,
|
||||
scrollbarScaledWidth, aDesiredSize.height);
|
||||
|
||||
desiredSize = aDesiredSize;
|
||||
aDesiredSize.height += border.top + border.bottom;
|
||||
|
||||
if (nsnull != aDesiredSize.maxElementSize) {
|
||||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
}
|
||||
|
||||
|
||||
nsRect frameRect;
|
||||
GetRect(frameRect);
|
||||
nsRect curRect;
|
||||
mPlaceHolderFrame->GetRect(curRect);
|
||||
curRect.x = frameRect.x;
|
||||
curRect.y = frameRect.y + aDesiredSize.height;
|
||||
mPlaceHolderFrame->SetRect(curRect);
|
||||
|
||||
mListFrame->GetRect(frameRect);
|
||||
|
||||
NS_RELEASE(context);
|
||||
|
||||
}
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
nsComboboxControlFrame::PaintComboboxControl(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer)
|
||||
{
|
||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display);
|
||||
if (!disp->mVisible) {
|
||||
return;
|
||||
}
|
||||
aRenderingContext.PushState();
|
||||
|
||||
|
||||
const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
|
||||
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
|
||||
const nsStyleFont* myFont = (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font);
|
||||
|
||||
|
||||
nsIStyleContext * blkStyle;
|
||||
if (mGotFocus) {
|
||||
blkStyle = mTextStr.Length() > 0?mBlockTextSelectedFocusStyle:mBlockTextStyle;
|
||||
} else {
|
||||
blkStyle = mTextStr.Length() > 0?mBlockTextSelectedStyle:mBlockTextStyle;
|
||||
}
|
||||
const nsStyleColor* blkColor = (const nsStyleColor*)blkStyle->GetStyleData(eStyleStruct_Color);
|
||||
const nsStyleSpacing* blkSpacing = (const nsStyleSpacing*)blkStyle->GetStyleData(eStyleStruct_Spacing);
|
||||
const nsStyleFont* blkFont = (const nsStyleFont*)blkStyle->GetStyleData(eStyleStruct_Font);
|
||||
|
||||
nsRect rect(0, 0, mRect.width, mRect.height);
|
||||
nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this,
|
||||
aDirtyRect, rect, *myColor, 0, 0);
|
||||
|
||||
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this,
|
||||
aDirtyRect, rect, *mySpacing, 0);
|
||||
|
||||
nsHTMLContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||
|
||||
const nsStyleSpacing* spacing =(const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
|
||||
nsMargin border;
|
||||
spacing->CalcBorderFor(this, border);
|
||||
|
||||
float p2t;
|
||||
aPresContext.GetScaledPixelsToTwips(p2t);
|
||||
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
||||
|
||||
nsRect outside(0, 0, mRect.width, mRect.height);
|
||||
outside.Deflate(border);
|
||||
|
||||
nsRect inside(outside);
|
||||
outside.Deflate(onePixel, onePixel);
|
||||
|
||||
aRenderingContext.SetColor(blkColor->mBackgroundColor);
|
||||
aRenderingContext.FillRect(inside.x, inside.y, inside.width, inside.height);
|
||||
|
||||
float appUnits;
|
||||
float devUnits;
|
||||
float scale;
|
||||
nsIDeviceContext * context;
|
||||
aRenderingContext.GetDeviceContext(context);
|
||||
|
||||
context->GetCanonicalPixelScale(scale);
|
||||
context->GetAppUnitsToDevUnits(devUnits);
|
||||
context->GetDevUnitsToAppUnits(appUnits);
|
||||
|
||||
float sbWidth;
|
||||
float sbHeight;
|
||||
context->GetScrollBarDimensions(sbWidth, sbHeight);
|
||||
PRInt32 scrollbarScaledWidth = PRInt32(sbWidth * scale);
|
||||
PRInt32 scrollbarScaledHeight = PRInt32(sbWidth * scale);
|
||||
|
||||
nsFont font(aPresContext.GetDefaultFixedFont());
|
||||
GetFont(&aPresContext, font);
|
||||
|
||||
aRenderingContext.SetFont(myFont->mFont);
|
||||
|
||||
inside.width -= scrollbarScaledWidth;
|
||||
PRBool clipEmpty;
|
||||
aRenderingContext.PushState();
|
||||
aRenderingContext.SetClipRect(inside, nsClipCombine_kReplace, clipEmpty);
|
||||
|
||||
nscoord x = inside.x + (onePixel * 4);
|
||||
nscoord y = inside.y;
|
||||
|
||||
aRenderingContext.SetColor(blkColor->mColor);
|
||||
|
||||
aRenderingContext.DrawString(mTextStr, x, y, 0);
|
||||
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this,
|
||||
aDirtyRect, inside, *blkSpacing, 0);
|
||||
|
||||
aRenderingContext.PopState(clipEmpty);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
inside.width -= scrollbarScaledWidth;
|
||||
inside.height -= scrollbarScaledHeight;
|
||||
|
||||
// Scrollbars
|
||||
//const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
|
||||
//nsIAtom * sbAtom = NS_NewAtom(":SCROLLBAR-ARROW-LOOK");
|
||||
//nsIStyleContext* arrowStyle = aPresContext.ResolvePseudoStyleContextFor(mContent, sbAtom, mStyleContext);
|
||||
//NS_RELEASE(sbAtom);
|
||||
|
||||
const nsStyleSpacing* arrowSpacing = (const nsStyleSpacing*)mArrowStyle->GetStyleData(eStyleStruct_Spacing);
|
||||
const nsStyleColor* arrowColor = (const nsStyleColor*)mArrowStyle->GetStyleData(eStyleStruct_Color);
|
||||
|
||||
nsRect srect(0,0,0,0);//mRect.width-scrollbarWidth-onePixel, onePixel, scrollbarWidth, mRect.height-(onePixel*2));
|
||||
srect = mButtonRect;
|
||||
nsFormControlHelper::PaintArrow(nsFormControlHelper::eArrowDirection_Down, aRenderingContext,aPresContext,
|
||||
aDirtyRect, srect, onePixel, *arrowColor, *arrowSpacing, this, mRect);
|
||||
//}
|
||||
|
||||
|
||||
NS_RELEASE(context);
|
||||
|
||||
PRBool status;
|
||||
aRenderingContext.PopState(status);
|
||||
}
|
||||
|
||||
NS_METHOD
|
||||
nsComboboxControlFrame::Paint(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer)
|
||||
{
|
||||
if (eFramePaintLayer_Content == aWhichLayer) {
|
||||
PaintComboboxControl(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRIntn
|
||||
nsComboboxControlFrame::GetSkipSides() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetName(nsString* aResult)
|
||||
{
|
||||
nsresult result = NS_FORM_NOTOK;
|
||||
if (mContent) {
|
||||
nsIHTMLContent* formControl = nsnull;
|
||||
result = mContent->QueryInterface(kIHTMLContentIID, (void**)&formControl);
|
||||
if ((NS_OK == result) && formControl) {
|
||||
nsHTMLValue value;
|
||||
result = formControl->GetHTMLAttribute(nsHTMLAtoms::name, value);
|
||||
if (NS_CONTENT_ATTR_HAS_VALUE == result) {
|
||||
if (eHTMLUnit_String == value.GetUnit()) {
|
||||
value.GetStringValue(*aResult);
|
||||
}
|
||||
}
|
||||
NS_RELEASE(formControl);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRInt32
|
||||
nsComboboxControlFrame::GetMaxNumValues()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRBool
|
||||
nsComboboxControlFrame::GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
||||
nsString* aValues, nsString* aNames)
|
||||
{
|
||||
nsAutoString name;
|
||||
nsresult result = GetName(&name);
|
||||
if ((aMaxNumValues <= 0) || (NS_CONTENT_ATTR_HAS_VALUE != result)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
// use our name and the text widgets value
|
||||
aNames[0] = name;
|
||||
nsresult status = PR_FALSE;
|
||||
/*nsIWidget* widget;
|
||||
nsITextWidget* textWidget;
|
||||
mTextFrame->GetWidget(&widget);
|
||||
if (widget && (NS_OK == widget->QueryInterface(kITextWidgetIID, (void**)&textWidget))) {
|
||||
PRUint32 actualSize;
|
||||
textWidget->GetText(aValues[0], 0, actualSize);
|
||||
aNumValues = 1;
|
||||
NS_RELEASE(textWidget);
|
||||
status = PR_TRUE;
|
||||
}
|
||||
NS_IF_RELEASE(widget);*/
|
||||
return status;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFrameName(nsString& aResult) const
|
||||
{
|
||||
return MakeFrameName("ComboboxControl", aResult);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsComboboxControlFrame::RefreshStyleContext(nsIPresContext* aPresContext,
|
||||
nsIAtom * aNewContentPseudo,
|
||||
nsIStyleContext*& aCurrentStyle,
|
||||
nsIContent * aContent,
|
||||
nsIStyleContext* aParentStyle)
|
||||
|
||||
{
|
||||
nsIStyleContext* newStyleContext = aPresContext->ProbePseudoStyleContextFor(aContent,
|
||||
aNewContentPseudo,
|
||||
aParentStyle);
|
||||
if (newStyleContext != aCurrentStyle) {
|
||||
NS_IF_RELEASE(aCurrentStyle);
|
||||
aCurrentStyle = newStyleContext;
|
||||
} else {
|
||||
NS_IF_RELEASE(newStyleContext);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::ReResolveStyleContext(nsIPresContext* aPresContext,
|
||||
nsIStyleContext* aParentContext)
|
||||
{
|
||||
nsIStyleContext* oldContext = mStyleContext;
|
||||
|
||||
// NOTE: using nsFrame's ReResolveStyleContext method to avoid
|
||||
// useless version in base classes.
|
||||
nsresult rv = nsFrame::ReResolveStyleContext(aPresContext, aParentContext);
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (oldContext != mStyleContext) {
|
||||
|
||||
PRBool currentIsVisible = (mCurrentStyleContext == mVisibleStyleContext?PR_TRUE:PR_FALSE);
|
||||
|
||||
nsIAtom * visibleContentPseudo = NS_NewAtom(":DROPDOWN-VISIBLE");
|
||||
RefreshStyleContext(aPresContext, visibleContentPseudo, mVisibleStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(visibleContentPseudo);
|
||||
|
||||
nsIAtom * hiddenContentPseudo = NS_NewAtom(":DROPDOWN-HIDDEN");
|
||||
RefreshStyleContext(aPresContext, hiddenContentPseudo, mHiddenStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(hiddenContentPseudo);
|
||||
mCurrentStyleContext = (currentIsVisible?mVisibleStyleContext:mHiddenStyleContext);
|
||||
|
||||
mListFrame->ReResolveStyleContext(aPresContext,
|
||||
(nsnull != mCurrentStyleContext? mCurrentStyleContext : mStyleContext));
|
||||
|
||||
// Button Style
|
||||
nsIAtom * btnOutContentPseudo = NS_NewAtom(":DROPDOWN-BTN-OUT");
|
||||
RefreshStyleContext(aPresContext, btnOutContentPseudo, mBtnOutStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(btnOutContentPseudo);
|
||||
|
||||
nsIAtom * btnPressContentPseudo = NS_NewAtom(":DROPDOWN-BTN-PRESSED");
|
||||
RefreshStyleContext(aPresContext, btnPressContentPseudo, mBtnPressedStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(btnPressContentPseudo);
|
||||
|
||||
nsIAtom * txtBlkContentPseudo = NS_NewAtom(":COMBOBOX-TEXT");
|
||||
RefreshStyleContext(aPresContext, txtBlkContentPseudo, mBlockTextStyle, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(txtBlkContentPseudo);
|
||||
|
||||
nsIAtom * txtBlkSelContentPseudo = NS_NewAtom(":COMBOBOX-TEXTSELECTED");
|
||||
RefreshStyleContext(aPresContext, txtBlkSelContentPseudo, mBlockTextSelectedStyle, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(txtBlkSelContentPseudo);
|
||||
|
||||
nsIAtom * txtBlkSelFocContentPseudo = NS_NewAtom(":COMBOBOX-TEXTSELECTEDFOCUS");
|
||||
RefreshStyleContext(aPresContext, txtBlkSelFocContentPseudo, mBlockTextSelectedFocusStyle, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(txtBlkSelFocContentPseudo);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus)
|
||||
{
|
||||
if (nsEventStatus_eConsumeNoDefault == aEventStatus) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if(nsEventStatus_eConsumeNoDefault != aEventStatus) {
|
||||
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||
} else if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection ||
|
||||
aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
||||
// no-op
|
||||
} else {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||
|
||||
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
||||
mArrowStyle = mBtnOutStyleContext;
|
||||
ForceDrawFrame(this);
|
||||
//MouseClicked(&aPresContext);
|
||||
|
||||
} else if (aEvent->message == NS_MOUSE_MOVE) {
|
||||
|
||||
} else if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||
mArrowStyle = mBtnPressedStyleContext;
|
||||
ForceDrawFrame(this);
|
||||
MouseClicked(&aPresContext);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
|
||||
{
|
||||
//nsresult rv = nsScrollFrame::GetFrameForPoint(aPoint, aFrame);
|
||||
nsresult rv = GetFrameForPointUsing(aPoint, nsnull, aFrame);
|
||||
if (NS_OK == rv) {
|
||||
if (*aFrame != this) {
|
||||
//mHitFrame = *aFrame;
|
||||
*aFrame = this;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
*aFrame = this;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsComboboxControlFrame::GetFrameForPointUsing(const nsPoint& aPoint,
|
||||
nsIAtom* aList,
|
||||
nsIFrame** aFrame)
|
||||
{
|
||||
*aFrame = this;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIPluggableEventListener
|
||||
//----------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::PluggableEventHandler(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus)
|
||||
{
|
||||
HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||
//aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::PluggableGetFrameForPoint(const nsPoint& aPoint,
|
||||
nsIFrame** aFrame)
|
||||
{
|
||||
return GetFrameForPoint(aPoint, aFrame);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIComboboxControlFrame
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetDropDown(nsIFrame* aPlaceHolderFrame, nsIFrame* aDropDownFrame)
|
||||
{
|
||||
mPlaceHolderFrame = aPlaceHolderFrame;
|
||||
mListFrame = aDropDownFrame;
|
||||
|
||||
if (NS_OK != mListFrame->QueryInterface(kIListControlFrameIID, (void**)&mListControlFrame)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Ok, since we now know we have the ListFrame, and we are assuming at this point it has been initialized
|
||||
// Let's get the currently selected item, but we make the call using the Interface
|
||||
mListControlFrame->GetSelectedItem(mTextStr);
|
||||
|
||||
AppendChildren(mPlaceHolderFrame, PR_FALSE);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetDropDownStyleContexts(nsIStyleContext * aVisible, nsIStyleContext * aHidden)
|
||||
{
|
||||
mVisibleStyleContext = aVisible;
|
||||
mHiddenStyleContext = aHidden;
|
||||
mCurrentStyleContext = mHiddenStyleContext;
|
||||
|
||||
NS_ADDREF(mVisibleStyleContext);
|
||||
NS_ADDREF(mHiddenStyleContext);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetButtonStyleContexts(nsIStyleContext * aOut, nsIStyleContext * aPressed)
|
||||
{
|
||||
mBtnOutStyleContext = aOut;
|
||||
mBtnPressedStyleContext = aPressed;
|
||||
mArrowStyle = aOut;
|
||||
|
||||
NS_ADDREF(mBtnOutStyleContext);
|
||||
NS_ADDREF(mBtnPressedStyleContext);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::ListWasSelected(nsIPresContext* aPresContext)
|
||||
{
|
||||
mArrowStyle = mBtnOutStyleContext;
|
||||
MouseClicked(aPresContext);
|
||||
|
||||
nsString str;
|
||||
if (nsnull != mListControlFrame) {
|
||||
mListControlFrame->GetSelectedItem(mTextStr);
|
||||
nsIFormControlFrame* fcFrame = nsnull;
|
||||
nsresult result = mListFrame->QueryInterface(kIFormControlFrameIID, (void**)&fcFrame);
|
||||
if ((NS_OK == result) && (nsnull != fcFrame)) {
|
||||
fcFrame->SetFocus(PR_FALSE, PR_FALSE);
|
||||
}
|
||||
SetFocus(PR_TRUE, PR_TRUE);
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,181 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsComboboxControlFrame_h___
|
||||
#define nsComboboxControlFrame_h___
|
||||
|
||||
#include "nsHTMLContainerFrame.h"
|
||||
#include "nsIFormControlFrame.h"
|
||||
#include "nsIComboboxControlFrame.h"
|
||||
#include "nsIPluggableEventListener.h"
|
||||
|
||||
class nsButtonControlFrame;
|
||||
class nsTextControlFrame;
|
||||
class nsFormFrame;
|
||||
class nsIView;
|
||||
class nsStyleContext;
|
||||
class nsIHTMLContent;
|
||||
class nsIListControlFrame;
|
||||
|
||||
class nsComboboxControlFrame : public nsHTMLContainerFrame,
|
||||
public nsIFormControlFrame,
|
||||
public nsIPluggableEventListener,
|
||||
public nsIComboboxControlFrame
|
||||
{
|
||||
public:
|
||||
nsComboboxControlFrame();
|
||||
~nsComboboxControlFrame();
|
||||
|
||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
||||
// nsIFrame
|
||||
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
|
||||
NS_IMETHOD Reflow(nsIPresContext& aCX,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus);
|
||||
|
||||
NS_IMETHOD ReResolveStyleContext(nsIPresContext* aPresContext,
|
||||
nsIStyleContext* aParentContext);
|
||||
|
||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
|
||||
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||
|
||||
|
||||
virtual PRInt32 GetMaxNumValues();
|
||||
|
||||
virtual PRBool GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
||||
nsString* aValues, nsString* aNames);
|
||||
|
||||
//nsTextControlFrame* GetTextFrame() { return mTextFrame; }
|
||||
|
||||
//void SetTextFrame(nsTextControlFrame* aFrame) { mTextFrame = aFrame; }
|
||||
|
||||
//nsButtonControlFrame* GetBrowseFrame() { return mBrowseFrame; }
|
||||
//void SetBrowseFrame(nsButtonControlFrame* aFrame) { mBrowseFrame = aFrame; }
|
||||
void SetFocus(PRBool aOn, PRBool aRepaint);
|
||||
virtual PRBool IsSuccessful(nsIFormControlFrame* aSubmitter);
|
||||
virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
|
||||
virtual void Reset();
|
||||
NS_IMETHOD GetName(nsString* aName);
|
||||
NS_IMETHOD GetType(PRInt32* aType) const;
|
||||
|
||||
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
|
||||
nsFont& aFont);
|
||||
NS_IMETHOD GetFormContent(nsIContent*& aContent) const;
|
||||
virtual nscoord GetVerticalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetHorizontalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetVerticalInsidePadding(float aPixToTwip,
|
||||
nscoord aInnerHeight) const;
|
||||
virtual nscoord GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
||||
float aPixToTwip,
|
||||
nscoord aInnerWidth,
|
||||
nscoord aCharWidth) const;
|
||||
|
||||
|
||||
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
||||
|
||||
nsresult GetFrameForPointUsing(const nsPoint& aPoint,
|
||||
nsIAtom* aList,
|
||||
nsIFrame** aFrame);
|
||||
// A Static Helper Functions
|
||||
|
||||
// This refreshes a particular pseudo style content when a "ReResolveStyleContent" happens
|
||||
static void RefreshStyleContext(nsIPresContext* aPresContext,
|
||||
nsIAtom * aNewContentPseudo,
|
||||
nsIStyleContext*& aCurrentStyle,
|
||||
nsIContent * aContent,
|
||||
nsIStyleContext* aParentStyle);
|
||||
|
||||
// nsIFormMouseListener
|
||||
virtual void MouseClicked(nsIPresContext* aPresContext);
|
||||
|
||||
// nsIPluggableEventListener
|
||||
NS_IMETHOD PluggableEventHandler(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
NS_IMETHOD PluggableGetFrameForPoint(const nsPoint& aPoint,
|
||||
nsIFrame** aFrame);
|
||||
|
||||
//static PRInt32 gSpacing;
|
||||
|
||||
//nsIComboboxControlFrame
|
||||
NS_IMETHOD SetDropDown(nsIFrame* aPlaceHolderFrame, nsIFrame* aDropDownFrame);
|
||||
NS_IMETHOD SetDropDownStyleContexts(nsIStyleContext * aVisible, nsIStyleContext * aHidden);
|
||||
NS_IMETHOD SetButtonStyleContexts(nsIStyleContext * aOut, nsIStyleContext * aPressed);
|
||||
NS_IMETHOD ListWasSelected(nsIPresContext* aPresContext);
|
||||
|
||||
|
||||
protected:
|
||||
virtual void PaintComboboxControl(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
nsIWidget* GetWindowTemp(nsIView *aView); // XXX temporary
|
||||
virtual PRIntn GetSkipSides() const;
|
||||
|
||||
|
||||
nsFormFrame* mFormFrame; // Parent Form Frame
|
||||
|
||||
nsIFrame * mPlaceHolderFrame;
|
||||
nsIFrame * mListFrame; // Generic nsIFrame
|
||||
nsIListControlFrame * mListControlFrame; // Specific ListControl Interface
|
||||
nsRect mButtonRect; // The Arrow Button's Rect cached for Painting
|
||||
|
||||
// DropDown List Visibility Styles
|
||||
nsIStyleContext * mVisibleStyleContext; // Style for the DropDown List to make it visible
|
||||
nsIStyleContext * mHiddenStyleContext; // Style for the DropDown List to make it hidden
|
||||
nsIStyleContext * mCurrentStyleContext; // The current Style state of the DropDown List
|
||||
|
||||
// Arrow Button Styles
|
||||
nsIStyleContext * mBtnOutStyleContext; // Style when not pressed
|
||||
nsIStyleContext * mBtnPressedStyleContext; // Style When Pressed
|
||||
nsIStyleContext * mArrowStyle; // Arrows currrent style (for painting)
|
||||
|
||||
// Combobox Text Styles
|
||||
nsIStyleContext * mBlockTextStyle; // Style when there is no selection and it doesn't have focus
|
||||
nsIStyleContext * mBlockTextSelectedStyle; // Style when selected and it doesn't have focus
|
||||
nsIStyleContext * mBlockTextSelectedFocusStyle; // Style when selected and it has focus
|
||||
|
||||
|
||||
PRBool mFirstTime;
|
||||
|
||||
// State data members
|
||||
nsString mTextStr;
|
||||
PRBool mGotFocus;
|
||||
|
||||
private:
|
||||
NS_IMETHOD_(nsrefcnt) AddRef() { return NS_OK; }
|
||||
NS_IMETHOD_(nsrefcnt) Release() { return NS_OK; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,297 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (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 Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*/
|
||||
#ifndef nsListControlFrame_h___
|
||||
#define nsListControlFrame_h___
|
||||
|
||||
//#include "nsHTMLContainerFrame.h"
|
||||
#include "nsScrollFrame.h"
|
||||
#include "nsIDOMFocusListener.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIFormControlFrame.h"
|
||||
#include "nsIPluggableEventListener.h"
|
||||
#include "nsIListControlFrame.h"
|
||||
|
||||
class nsIDOMHTMLSelectElement;
|
||||
class nsIDOMHTMLCollection;
|
||||
class nsIDOMHTMLOptionElement;
|
||||
class nsFormFrame;
|
||||
class nsScrollFrame;
|
||||
class nsIComboboxControlFrame;
|
||||
|
||||
#if 0
|
||||
struct nsInputDimSpec
|
||||
{
|
||||
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
|
||||
|
||||
nsInputDimSpec(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)
|
||||
{
|
||||
}
|
||||
|
||||
};
|
||||
#endif
|
||||
/**
|
||||
* The block frame has two additional named child lists:
|
||||
* - "Floater-list" which contains the floated frames
|
||||
* - "Bullet-list" which contains the bullet frame
|
||||
*
|
||||
* @see nsLayoutAtoms::bulletList
|
||||
* @see nsLayoutAtoms::floaterList
|
||||
*/
|
||||
class nsListControlFrame : public nsScrollFrame,
|
||||
public nsIFormControlFrame,
|
||||
public nsIPluggableEventListener,
|
||||
public nsIListControlFrame
|
||||
{
|
||||
public:
|
||||
friend nsresult NS_NewListControlFrame(nsIFrame*& aNewFrame);
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsISupports overrides
|
||||
// NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
||||
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
||||
|
||||
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
// nsIFrame
|
||||
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
NS_IMETHOD Reflow(nsIPresContext& aCX,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus);
|
||||
|
||||
//
|
||||
/* virtual nsresult AppendNewFrames(nsIPresContext& aPresContext, nsIFrame*);
|
||||
|
||||
virtual nsresult InsertNewFrame(nsIPresContext& aPresContext,
|
||||
nsBaseIBFrame* aParentFrame,
|
||||
nsIFrame* aNewFrame,
|
||||
nsIFrame* aPrevSibling);
|
||||
|
||||
virtual nsresult DoRemoveFrame(nsBlockReflowState& aState,
|
||||
nsBaseIBFrame* aParentFrame,
|
||||
nsIFrame* aDeletedFrame,
|
||||
nsIFrame* aPrevSibling);
|
||||
*/
|
||||
|
||||
NS_IMETHOD Init(nsIPresContext& aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aGeometricParent,
|
||||
nsIFrame* aContentParent,
|
||||
nsIStyleContext* aContext);
|
||||
|
||||
NS_IMETHOD Deselect();
|
||||
|
||||
#if 0
|
||||
virtual void GetStyleSize(nsIPresContext& aContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsSize& aSize);
|
||||
#endif
|
||||
|
||||
virtual void GetDesiredSize(nsIPresContext* aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsHTMLReflowMetrics& aDesiredLayoutSize,
|
||||
nsSize& aDesiredWidgetSize);
|
||||
#if 0
|
||||
nscoord CalculateSize (nsIPresContext* aPresContext, nsListControlFrame* aFrame,
|
||||
const nsSize& aCSSSize, nsInputDimSpec& aDimensionSpec,
|
||||
nsSize& aBounds, PRBool& aWidthExplicit,
|
||||
PRBool& aHeightExplicit, nscoord& aRowSize,
|
||||
nsIRenderingContext *aRendContext);
|
||||
#endif
|
||||
|
||||
/*virtual nsresult Focus(nsIDOMEvent* aEvent);
|
||||
virtual nsresult Blur(nsIDOMEvent* aEvent);
|
||||
virtual nsresult ProcessEvent(nsIDOMEvent* aEvent);
|
||||
NS_IMETHOD AddEventListener(nsIDOMNode * aNode);
|
||||
NS_IMETHOD RemoveEventListener(nsIDOMNode * aNode);
|
||||
|
||||
NS_IMETHOD DeleteFrame(nsIPresContext& aPresContext);*/
|
||||
|
||||
NS_METHOD GetMultiple(PRBool* aResult, nsIDOMHTMLSelectElement* aSelect = nsnull);
|
||||
|
||||
///XXX: End o the temporary methods
|
||||
#if 0
|
||||
nscoord GetTextSize(nsIPresContext& aContext, nsListControlFrame* aFrame,
|
||||
const nsString& aString, nsSize& aSize,
|
||||
nsIRenderingContext *aRendContext);
|
||||
|
||||
nscoord GetTextSize(nsIPresContext& aContext, nsListControlFrame* aFrame,
|
||||
PRInt32 aNumChars, nsSize& aSize,
|
||||
nsIRenderingContext *aRendContext);
|
||||
#endif
|
||||
NS_IMETHOD GetSize(PRInt32* aSize) const;
|
||||
NS_IMETHOD GetMaxLength(PRInt32* aSize);
|
||||
|
||||
static void GetScrollBarDimensions(nsIPresContext& aPresContext,
|
||||
nscoord &aWidth, nscoord &aHeight);
|
||||
virtual nscoord GetVerticalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetHorizontalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetVerticalInsidePadding(float aPixToTwip,
|
||||
nscoord aInnerHeight) const;
|
||||
virtual nscoord GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
||||
float aPixToTwip,
|
||||
nscoord aInnerWidth,
|
||||
nscoord aCharWidth) const;
|
||||
|
||||
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
|
||||
nsFont& aFont);
|
||||
|
||||
NS_IMETHOD GetFormContent(nsIContent*& aContent) const;
|
||||
|
||||
// nsIFrame
|
||||
NS_IMETHOD SetRect(const nsRect& aRect);
|
||||
NS_IMETHOD SizeTo(nscoord aWidth, nscoord aHeight);
|
||||
|
||||
/////////////////////////
|
||||
// nsHTMLContainerFrame
|
||||
/////////////////////////
|
||||
virtual PRIntn GetSkipSides() const;
|
||||
|
||||
/////////////////////////
|
||||
// nsIFormControlFrame
|
||||
/////////////////////////
|
||||
NS_IMETHOD GetType(PRInt32* aType) const;
|
||||
|
||||
NS_IMETHOD GetName(nsString* aName);
|
||||
|
||||
virtual void SetFocus(PRBool aOn = PR_TRUE, PRBool aRepaint = PR_FALSE);
|
||||
|
||||
virtual void MouseClicked(nsIPresContext* aPresContext);
|
||||
|
||||
virtual void Reset();
|
||||
|
||||
virtual PRBool IsSuccessful(nsIFormControlFrame* aSubmitter);
|
||||
|
||||
virtual PRInt32 GetMaxNumValues();
|
||||
|
||||
virtual PRBool GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
||||
nsString* aValues, nsString* aNames);
|
||||
|
||||
virtual void SetFormFrame(nsFormFrame* aFrame);
|
||||
|
||||
// nsIPluggableEventListener
|
||||
NS_IMETHOD PluggableEventHandler(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
NS_IMETHOD PluggableGetFrameForPoint(const nsPoint& aPoint,
|
||||
nsIFrame** aFrame);
|
||||
|
||||
// nsIListControlFrame
|
||||
NS_IMETHOD SetComboboxFrame(nsIFrame* aComboboxFrame);
|
||||
NS_IMETHOD GetSelectedItem(nsString & aStr);
|
||||
NS_IMETHOD AboutToDropDown();
|
||||
|
||||
|
||||
// Static Methods
|
||||
static nsIDOMHTMLSelectElement* GetSelect(nsIContent * aContent);
|
||||
static nsIDOMHTMLCollection* GetOptions(nsIContent * aContent, nsIDOMHTMLSelectElement* aSelect = nsnull);
|
||||
static nsIDOMHTMLOptionElement* GetOption(nsIDOMHTMLCollection& aOptions, PRUint32 aIndex);
|
||||
static PRBool GetOptionValue(nsIDOMHTMLCollection& aCollecton, PRUint32 aIndex, nsString& aValue);
|
||||
|
||||
protected:
|
||||
nsListControlFrame();
|
||||
virtual ~nsListControlFrame();
|
||||
|
||||
nsIFrame * GetOptionFromChild(nsIFrame* aParentFrame);
|
||||
|
||||
nsresult GetFrameForPointUsing(const nsPoint& aPoint,
|
||||
nsIAtom* aList,
|
||||
nsIFrame** aFrame);
|
||||
|
||||
// nsHTMLContainerFrame overrides
|
||||
virtual void PaintChildren(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
|
||||
void ClearSelection();
|
||||
void InitializeFromContent(PRBool aDoDisplay = PR_FALSE);
|
||||
|
||||
void ExtendedSelection(PRInt32 aStartIndex, PRInt32 aEndIndex, PRBool aDoInvert, PRBool aSetValue);
|
||||
|
||||
NS_IMETHOD HandleLikeDropDownListEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
NS_IMETHOD HandleLikeListEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
PRInt32 SetContentSelected(nsIFrame * aHitFrame,
|
||||
nsIContent *& aHitContent,
|
||||
PRBool aIsSelected);
|
||||
|
||||
// Data Members
|
||||
nsFormFrame* mFormFrame;
|
||||
|
||||
PRInt32 mNumRows;
|
||||
|
||||
PRBool mIsFrameSelected[64];
|
||||
PRInt32 mNumSelections;
|
||||
PRInt32 mMaxNumSelections;
|
||||
PRBool mMultipleSelections;
|
||||
|
||||
|
||||
//nsIContent * mSelectedContent;
|
||||
PRInt32 mSelectedIndex;
|
||||
PRInt32 mStartExtendedIndex;
|
||||
PRInt32 mEndExtendedIndex;
|
||||
|
||||
nsIFrame * mHitFrame;
|
||||
nsIContent * mHitContent;
|
||||
|
||||
nsIFrame * mCurrentHitFrame;
|
||||
nsIContent * mCurrentHitContent;
|
||||
|
||||
nsIFrame * mSelectedFrame;
|
||||
nsIContent * mSelectedContent;
|
||||
|
||||
PRBool mIsInitializedFromContent;
|
||||
|
||||
nsIFrame * mContentFrame;
|
||||
PRBool mInDropDownMode;
|
||||
nsIComboboxControlFrame * mComboboxFrame;
|
||||
nsString mSelectionStr;
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsListControlFrame_h___ */
|
||||
|
|
@ -0,0 +1,901 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "nsComboboxControlFrame.h"
|
||||
#include "nsFormFrame.h"
|
||||
#include "nsButtonControlFrame.h"
|
||||
#include "nsTextControlFrame.h"
|
||||
#include "nsIContent.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsIAtom.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIHTMLContent.h"
|
||||
#include "nsHTMLIIDs.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsIFileWidget.h"
|
||||
#include "nsITextWidget.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsRepository.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsHTMLParts.h"
|
||||
#include "nsIDOMHTMLInputElement.h"
|
||||
#include "nsIFormControl.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsITextContent.h"
|
||||
|
||||
// Used for Paint
|
||||
#include "nsCSSRendering.h"
|
||||
#include "nsIDeviceContext.h"
|
||||
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsIViewManager.h"
|
||||
#include "nsViewsCID.h"
|
||||
|
||||
#include "nsIDOMElement.h"
|
||||
#include "nsListControlFrame.h"
|
||||
#include "nsIListControlFrame.h"
|
||||
|
||||
#include "nsIDOMHTMLCollection.h" //rods
|
||||
#include "nsIDOMHTMLSelectElement.h" //rods
|
||||
#include "nsIDOMHTMLOptionElement.h" //rods
|
||||
|
||||
// XXX make this pixels
|
||||
#define CONTROL_SPACING 40
|
||||
|
||||
static NS_DEFINE_IID(kViewCID, NS_VIEW_CID);
|
||||
static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID);
|
||||
static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID);
|
||||
static NS_DEFINE_IID(kIFileWidgetIID, NS_IFILEWIDGET_IID);
|
||||
static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID);
|
||||
static NS_DEFINE_IID(kIFormControlFrameIID, NS_IFORMCONTROLFRAME_IID);
|
||||
static NS_DEFINE_IID(kIComboboxControlFrameIID, NS_ICOMBOBOXCONTROLFRAME_IID);
|
||||
|
||||
static NS_DEFINE_IID(kIDOMHTMLSelectElementIID, NS_IDOMHTMLSELECTELEMENT_IID);
|
||||
static NS_DEFINE_IID(kIDOMHTMLOptionElementIID, NS_IDOMHTMLOPTIONELEMENT_IID);
|
||||
static NS_DEFINE_IID(kIPluggableEventListenerIID, NS_IPLUGGABLEEVENTLISTENER_IID);
|
||||
static NS_DEFINE_IID(kIListControlFrameIID, NS_ILISTCONTROLFRAME_IID);
|
||||
static NS_DEFINE_IID(kITextContentIID, NS_ITEXT_CONTENT_IID);
|
||||
|
||||
extern nsresult NS_NewListControlFrame(nsIFrame*& aNewFrame);
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsresult
|
||||
NS_NewComboboxControlFrame(nsIFrame*& aResult)
|
||||
{
|
||||
aResult = new nsComboboxControlFrame;
|
||||
if (nsnull == aResult) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsComboboxControlFrame::nsComboboxControlFrame()
|
||||
: nsHTMLContainerFrame()
|
||||
{
|
||||
mFormFrame = nsnull;
|
||||
mListFrame = nsnull;
|
||||
mListControlFrame = nsnull;
|
||||
mPlaceHolderFrame = nsnull;
|
||||
|
||||
mVisibleStyleContext = nsnull;
|
||||
mHiddenStyleContext = nsnull;
|
||||
mCurrentStyleContext = nsnull;
|
||||
mBlockTextStyle = nsnull;
|
||||
mBlockTextSelectedStyle = nsnull;
|
||||
mBlockTextSelectedFocusStyle = nsnull;
|
||||
mFirstTime = PR_TRUE;
|
||||
mGotFocus = PR_FALSE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsComboboxControlFrame::~nsComboboxControlFrame()
|
||||
{
|
||||
|
||||
NS_IF_RELEASE(mVisibleStyleContext);
|
||||
NS_IF_RELEASE(mHiddenStyleContext);
|
||||
NS_IF_RELEASE(mBlockTextStyle);
|
||||
//NS_IF_RELEASE(mListControlFrame);
|
||||
//NS_IF_RELEASE(mListFrame);
|
||||
//NS_IF_RELEASE(mPlaceHolderFrame);
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nsresult
|
||||
nsComboboxControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
NS_PRECONDITION(0 != aInstancePtr, "null ptr");
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kIComboboxControlFrameIID)) {
|
||||
*aInstancePtr = (void*) ((nsIComboboxControlFrame*) this);
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kIFormControlFrameIID)) {
|
||||
*aInstancePtr = (void*) ((nsIFormControlFrame*) this);
|
||||
return NS_OK;
|
||||
}
|
||||
if (aIID.Equals(kIPluggableEventListenerIID)) {
|
||||
NS_ADDREF_THIS(); // Increase reference count for caller
|
||||
*aInstancePtr = (void *)((nsIPluggableEventListener*)this);
|
||||
return NS_OK;
|
||||
}
|
||||
return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRBool
|
||||
nsComboboxControlFrame::IsSuccessful(nsIFormControlFrame* aSubmitter)
|
||||
{
|
||||
nsAutoString name;
|
||||
return (NS_CONTENT_ATTR_HAS_VALUE == GetName(&name));
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
void
|
||||
nsComboboxControlFrame::Reset()
|
||||
{
|
||||
SetFocus(PR_TRUE, PR_TRUE);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetType(PRInt32* aType) const
|
||||
{
|
||||
*aType = NS_FORM_SELECT;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFormContent(nsIContent*& aContent) const
|
||||
{
|
||||
return GetContent(aContent);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFont(nsIPresContext* aPresContext,
|
||||
nsFont& aFont)
|
||||
{
|
||||
nsFormControlHelper::GetFont(this, aPresContext, mStyleContext, aFont);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetVerticalBorderWidth(float aPixToTwip) const
|
||||
{
|
||||
return NSIntPixelsToTwips(3, aPixToTwip);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetHorizontalBorderWidth(float aPixToTwip) const
|
||||
{
|
||||
return GetVerticalBorderWidth(aPixToTwip);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetVerticalInsidePadding(float aPixToTwip,
|
||||
nscoord aInnerHeight) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
nscoord
|
||||
nsComboboxControlFrame::GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
||||
float aPixToTwip,
|
||||
nscoord aInnerWidth,
|
||||
nscoord aCharWidth) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// XXX this should be removed when nsView exposes it
|
||||
nsIWidget*
|
||||
nsComboboxControlFrame::GetWindowTemp(nsIView *aView)
|
||||
{
|
||||
nsIWidget *window = nsnull;
|
||||
|
||||
nsIView *ancestor = aView;
|
||||
while (nsnull != ancestor) {
|
||||
ancestor->GetWidget(window);
|
||||
if (nsnull != window) {
|
||||
return window;
|
||||
}
|
||||
ancestor->GetParent(ancestor);
|
||||
}
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void ForceDrawFrame(nsIFrame * aFrame)//, PRBool)
|
||||
{
|
||||
if (aFrame == nsnull) {
|
||||
return;
|
||||
}
|
||||
nsRect rect;
|
||||
nsIView * view;
|
||||
nsPoint pnt;
|
||||
aFrame->GetOffsetFromView(pnt, view);
|
||||
aFrame->GetRect(rect);
|
||||
rect.x = pnt.x;
|
||||
rect.y = pnt.y;
|
||||
if (view != nsnull) {
|
||||
nsIViewManager * viewMgr;
|
||||
view->GetViewManager(viewMgr);
|
||||
if (viewMgr != nsnull) {
|
||||
viewMgr->UpdateView(view, rect, 0);
|
||||
NS_RELEASE(viewMgr);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
void
|
||||
nsComboboxControlFrame::SetFocus(PRBool aOn, PRBool aRepaint)
|
||||
{
|
||||
//mContent->SetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::kClass, "SELECTED", PR_TRUE);
|
||||
mGotFocus = aOn;
|
||||
if (aRepaint) {
|
||||
ForceDrawFrame(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// this is in response to the MouseClick from the containing browse button
|
||||
// XXX still need to get filters from accept attribute
|
||||
void nsComboboxControlFrame::MouseClicked(nsIPresContext* aPresContext)
|
||||
{
|
||||
|
||||
if (nsnull != mListControlFrame) {
|
||||
SetFocus(PR_FALSE, PR_TRUE);
|
||||
mCurrentStyleContext = (mCurrentStyleContext == mHiddenStyleContext ? mVisibleStyleContext : mHiddenStyleContext);
|
||||
if (mCurrentStyleContext == mVisibleStyleContext) {
|
||||
mListControlFrame->AboutToDropDown();
|
||||
nsIFormControlFrame* fcFrame = nsnull;
|
||||
nsresult result = mListFrame->QueryInterface(kIFormControlFrameIID, (void**)&fcFrame);
|
||||
if ((NS_OK == result) && (nsnull != fcFrame)) {
|
||||
fcFrame->SetFocus(PR_TRUE, PR_FALSE);
|
||||
}
|
||||
} else {
|
||||
SetFocus(PR_TRUE, PR_TRUE);
|
||||
}
|
||||
|
||||
mListFrame->ReResolveStyleContext(aPresContext, mCurrentStyleContext);
|
||||
ForceDrawFrame(mListFrame);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList)
|
||||
{
|
||||
nsFormFrame::AddFormControlFrame(aPresContext, *this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::Reflow(nsIPresContext& aPresContext,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus)
|
||||
{
|
||||
if (mFirstTime) {
|
||||
ReResolveStyleContext(&aPresContext, mStyleContext); // XXX This temporary
|
||||
mListFrame->ReResolveStyleContext(&aPresContext, mCurrentStyleContext);
|
||||
mFirstTime = PR_FALSE;
|
||||
}
|
||||
|
||||
PRInt32 numChildren = LengthOf(mFirstChild);
|
||||
|
||||
//nsIFrame* childFrame;
|
||||
if (1 == numChildren) {
|
||||
nsIAtom * textBlockContentPseudo = NS_NewAtom(":COMBOBOX-TEXT");
|
||||
mBlockTextStyle = aPresContext.ResolvePseudoStyleContextFor(mContent, textBlockContentPseudo, mStyleContext);
|
||||
NS_RELEASE(textBlockContentPseudo);
|
||||
|
||||
// XXX This code should move to Init(), someday when the frame construction
|
||||
// changes are all done and Init() is always getting called...
|
||||
PRBool disabled = nsFormFrame::GetDisabled(this);
|
||||
}
|
||||
|
||||
nsSize maxSize(aReflowState.availableWidth, aReflowState.availableHeight);
|
||||
nsHTMLReflowMetrics desiredSize = aDesiredSize;
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
{
|
||||
nsIDOMHTMLSelectElement* select = nsListControlFrame::GetSelect(mContent);
|
||||
if (!select) {
|
||||
return NS_OK;
|
||||
}
|
||||
nsIDOMHTMLCollection* options = nsListControlFrame::GetOptions(mContent, select);
|
||||
if (!options) {
|
||||
NS_RELEASE(select);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// get the css size
|
||||
nsSize styleSize;
|
||||
nsFormControlFrame::GetStyleSize(aPresContext, aReflowState, styleSize);
|
||||
|
||||
// get the size of the longest option
|
||||
PRInt32 maxWidth = 1;
|
||||
PRUint32 numOptions;
|
||||
options->GetLength(&numOptions);
|
||||
for (PRUint32 i = 0; i < numOptions; i++) {
|
||||
nsIDOMHTMLOptionElement* option = nsListControlFrame::GetOption(*options, i);
|
||||
if (option) {
|
||||
//option->CompressContent();
|
||||
nsAutoString text;
|
||||
if (NS_CONTENT_ATTR_HAS_VALUE != option->GetText(text)) {
|
||||
continue;
|
||||
}
|
||||
nsSize textSize;
|
||||
// use the style for the select rather that the option, since widgets don't support it
|
||||
nsFormControlHelper::GetTextSize(aPresContext, this, text, textSize, aReflowState.rendContext);
|
||||
//nsFormControlHelper::GetTextSize(aPresContext, this, 1, textSize, aReflowState.rendContext);
|
||||
if (textSize.width > maxWidth) {
|
||||
maxWidth = textSize.width;
|
||||
}
|
||||
NS_RELEASE(option);
|
||||
}
|
||||
}
|
||||
|
||||
PRInt32 rowHeight = 0;
|
||||
nsSize calcSize, charSize;
|
||||
PRBool widthExplicit, heightExplicit;
|
||||
nsInputDimensionSpec textSpec(nsnull, PR_FALSE, nsnull, nsnull,
|
||||
maxWidth, PR_TRUE, nsHTMLAtoms::size, 1);
|
||||
// XXX fix CalculateSize to return PRUint32
|
||||
PRUint32 numRows = (PRUint32)nsFormControlHelper::CalculateSize(&aPresContext, this, styleSize, textSpec,
|
||||
calcSize, widthExplicit, heightExplicit, rowHeight,
|
||||
aReflowState.rendContext);
|
||||
|
||||
float sp2t;
|
||||
float p2t = aPresContext.GetPixelsToTwips();
|
||||
|
||||
aPresContext.GetScaledPixelsToTwips(sp2t);
|
||||
nscoord onePixel = NSIntPixelsToTwips(1, sp2t);
|
||||
|
||||
nscoord scrollbarWidth = 0;
|
||||
nscoord scrollbarHeight = 0;
|
||||
nsListControlFrame::GetScrollBarDimensions(aPresContext, scrollbarWidth, scrollbarHeight);
|
||||
|
||||
nscoord extra = calcSize.height - (rowHeight * numRows);
|
||||
|
||||
numRows = (numOptions > 20 ? 20 : numOptions);
|
||||
calcSize.height = (numRows * rowHeight) + extra;
|
||||
if (numRows < 21) {
|
||||
//calcSize.width += scrollbarWidth;
|
||||
}
|
||||
|
||||
/*aDesiredSize.width = calcSize.width;
|
||||
// account for vertical scrollbar, if present
|
||||
if (!widthExplicit && (numRows < (PRInt32)numOptions)) {
|
||||
aDesiredSize.width += scrollbarWidth;
|
||||
}
|
||||
*/
|
||||
aDesiredSize.descent = 0;
|
||||
|
||||
|
||||
nsMargin border;
|
||||
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
|
||||
mySpacing->CalcBorderFor(this, border);
|
||||
|
||||
float scale;
|
||||
float sbWidth;
|
||||
float sbHeight;
|
||||
nsIDeviceContext * context = aPresContext.GetDeviceContext();
|
||||
context->GetCanonicalPixelScale(scale);
|
||||
context->GetScrollBarDimensions(sbWidth, sbHeight);
|
||||
PRInt32 scrollbarScaledWidth = PRInt32(sbWidth * scale);
|
||||
PRInt32 scrollbarScaledHeight = PRInt32(sbWidth * scale);
|
||||
|
||||
nscoord adjustment = NSIntPixelsToTwips(14, p2t);
|
||||
|
||||
aDesiredSize.width = calcSize.width + scrollbarScaledWidth + border.left + border.right + adjustment;
|
||||
aDesiredSize.height = rowHeight + onePixel;
|
||||
aDesiredSize.height = rowHeight + onePixel;
|
||||
|
||||
mButtonRect.SetRect(aDesiredSize.width-scrollbarScaledWidth-border.right, border.top,
|
||||
scrollbarScaledWidth, aDesiredSize.height);
|
||||
|
||||
desiredSize = aDesiredSize;
|
||||
aDesiredSize.height += border.top + border.bottom;
|
||||
|
||||
if (nsnull != aDesiredSize.maxElementSize) {
|
||||
aDesiredSize.maxElementSize->width = aDesiredSize.width;
|
||||
aDesiredSize.maxElementSize->height = aDesiredSize.height;
|
||||
}
|
||||
|
||||
|
||||
nsRect frameRect;
|
||||
GetRect(frameRect);
|
||||
nsRect curRect;
|
||||
mPlaceHolderFrame->GetRect(curRect);
|
||||
curRect.x = frameRect.x;
|
||||
curRect.y = frameRect.y + aDesiredSize.height;
|
||||
mPlaceHolderFrame->SetRect(curRect);
|
||||
|
||||
mListFrame->GetRect(frameRect);
|
||||
|
||||
NS_RELEASE(context);
|
||||
|
||||
}
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
aStatus = NS_FRAME_COMPLETE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
nsComboboxControlFrame::PaintComboboxControl(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer)
|
||||
{
|
||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display);
|
||||
if (!disp->mVisible) {
|
||||
return;
|
||||
}
|
||||
aRenderingContext.PushState();
|
||||
|
||||
|
||||
const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
|
||||
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
|
||||
const nsStyleFont* myFont = (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font);
|
||||
|
||||
|
||||
nsIStyleContext * blkStyle;
|
||||
if (mGotFocus) {
|
||||
blkStyle = mTextStr.Length() > 0?mBlockTextSelectedFocusStyle:mBlockTextStyle;
|
||||
} else {
|
||||
blkStyle = mTextStr.Length() > 0?mBlockTextSelectedStyle:mBlockTextStyle;
|
||||
}
|
||||
const nsStyleColor* blkColor = (const nsStyleColor*)blkStyle->GetStyleData(eStyleStruct_Color);
|
||||
const nsStyleSpacing* blkSpacing = (const nsStyleSpacing*)blkStyle->GetStyleData(eStyleStruct_Spacing);
|
||||
const nsStyleFont* blkFont = (const nsStyleFont*)blkStyle->GetStyleData(eStyleStruct_Font);
|
||||
|
||||
nsRect rect(0, 0, mRect.width, mRect.height);
|
||||
nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this,
|
||||
aDirtyRect, rect, *myColor, 0, 0);
|
||||
|
||||
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this,
|
||||
aDirtyRect, rect, *mySpacing, 0);
|
||||
|
||||
nsHTMLContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||
|
||||
const nsStyleSpacing* spacing =(const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
|
||||
nsMargin border;
|
||||
spacing->CalcBorderFor(this, border);
|
||||
|
||||
float p2t;
|
||||
aPresContext.GetScaledPixelsToTwips(p2t);
|
||||
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
||||
|
||||
nsRect outside(0, 0, mRect.width, mRect.height);
|
||||
outside.Deflate(border);
|
||||
|
||||
nsRect inside(outside);
|
||||
outside.Deflate(onePixel, onePixel);
|
||||
|
||||
aRenderingContext.SetColor(blkColor->mBackgroundColor);
|
||||
aRenderingContext.FillRect(inside.x, inside.y, inside.width, inside.height);
|
||||
|
||||
float appUnits;
|
||||
float devUnits;
|
||||
float scale;
|
||||
nsIDeviceContext * context;
|
||||
aRenderingContext.GetDeviceContext(context);
|
||||
|
||||
context->GetCanonicalPixelScale(scale);
|
||||
context->GetAppUnitsToDevUnits(devUnits);
|
||||
context->GetDevUnitsToAppUnits(appUnits);
|
||||
|
||||
float sbWidth;
|
||||
float sbHeight;
|
||||
context->GetScrollBarDimensions(sbWidth, sbHeight);
|
||||
PRInt32 scrollbarScaledWidth = PRInt32(sbWidth * scale);
|
||||
PRInt32 scrollbarScaledHeight = PRInt32(sbWidth * scale);
|
||||
|
||||
nsFont font(aPresContext.GetDefaultFixedFont());
|
||||
GetFont(&aPresContext, font);
|
||||
|
||||
aRenderingContext.SetFont(myFont->mFont);
|
||||
|
||||
inside.width -= scrollbarScaledWidth;
|
||||
PRBool clipEmpty;
|
||||
aRenderingContext.PushState();
|
||||
aRenderingContext.SetClipRect(inside, nsClipCombine_kReplace, clipEmpty);
|
||||
|
||||
nscoord x = inside.x + (onePixel * 4);
|
||||
nscoord y = inside.y;
|
||||
|
||||
aRenderingContext.SetColor(blkColor->mColor);
|
||||
|
||||
aRenderingContext.DrawString(mTextStr, x, y, 0);
|
||||
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this,
|
||||
aDirtyRect, inside, *blkSpacing, 0);
|
||||
|
||||
aRenderingContext.PopState(clipEmpty);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
inside.width -= scrollbarScaledWidth;
|
||||
inside.height -= scrollbarScaledHeight;
|
||||
|
||||
// Scrollbars
|
||||
//const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
|
||||
//nsIAtom * sbAtom = NS_NewAtom(":SCROLLBAR-ARROW-LOOK");
|
||||
//nsIStyleContext* arrowStyle = aPresContext.ResolvePseudoStyleContextFor(mContent, sbAtom, mStyleContext);
|
||||
//NS_RELEASE(sbAtom);
|
||||
|
||||
const nsStyleSpacing* arrowSpacing = (const nsStyleSpacing*)mArrowStyle->GetStyleData(eStyleStruct_Spacing);
|
||||
const nsStyleColor* arrowColor = (const nsStyleColor*)mArrowStyle->GetStyleData(eStyleStruct_Color);
|
||||
|
||||
nsRect srect(0,0,0,0);//mRect.width-scrollbarWidth-onePixel, onePixel, scrollbarWidth, mRect.height-(onePixel*2));
|
||||
srect = mButtonRect;
|
||||
nsFormControlHelper::PaintArrow(nsFormControlHelper::eArrowDirection_Down, aRenderingContext,aPresContext,
|
||||
aDirtyRect, srect, onePixel, *arrowColor, *arrowSpacing, this, mRect);
|
||||
//}
|
||||
|
||||
|
||||
NS_RELEASE(context);
|
||||
|
||||
PRBool status;
|
||||
aRenderingContext.PopState(status);
|
||||
}
|
||||
|
||||
NS_METHOD
|
||||
nsComboboxControlFrame::Paint(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer)
|
||||
{
|
||||
if (eFramePaintLayer_Content == aWhichLayer) {
|
||||
PaintComboboxControl(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRIntn
|
||||
nsComboboxControlFrame::GetSkipSides() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetName(nsString* aResult)
|
||||
{
|
||||
nsresult result = NS_FORM_NOTOK;
|
||||
if (mContent) {
|
||||
nsIHTMLContent* formControl = nsnull;
|
||||
result = mContent->QueryInterface(kIHTMLContentIID, (void**)&formControl);
|
||||
if ((NS_OK == result) && formControl) {
|
||||
nsHTMLValue value;
|
||||
result = formControl->GetHTMLAttribute(nsHTMLAtoms::name, value);
|
||||
if (NS_CONTENT_ATTR_HAS_VALUE == result) {
|
||||
if (eHTMLUnit_String == value.GetUnit()) {
|
||||
value.GetStringValue(*aResult);
|
||||
}
|
||||
}
|
||||
NS_RELEASE(formControl);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRInt32
|
||||
nsComboboxControlFrame::GetMaxNumValues()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
PRBool
|
||||
nsComboboxControlFrame::GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
||||
nsString* aValues, nsString* aNames)
|
||||
{
|
||||
nsAutoString name;
|
||||
nsresult result = GetName(&name);
|
||||
if ((aMaxNumValues <= 0) || (NS_CONTENT_ATTR_HAS_VALUE != result)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
// use our name and the text widgets value
|
||||
aNames[0] = name;
|
||||
nsresult status = PR_FALSE;
|
||||
/*nsIWidget* widget;
|
||||
nsITextWidget* textWidget;
|
||||
mTextFrame->GetWidget(&widget);
|
||||
if (widget && (NS_OK == widget->QueryInterface(kITextWidgetIID, (void**)&textWidget))) {
|
||||
PRUint32 actualSize;
|
||||
textWidget->GetText(aValues[0], 0, actualSize);
|
||||
aNumValues = 1;
|
||||
NS_RELEASE(textWidget);
|
||||
status = PR_TRUE;
|
||||
}
|
||||
NS_IF_RELEASE(widget);*/
|
||||
return status;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFrameName(nsString& aResult) const
|
||||
{
|
||||
return MakeFrameName("ComboboxControl", aResult);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsComboboxControlFrame::RefreshStyleContext(nsIPresContext* aPresContext,
|
||||
nsIAtom * aNewContentPseudo,
|
||||
nsIStyleContext*& aCurrentStyle,
|
||||
nsIContent * aContent,
|
||||
nsIStyleContext* aParentStyle)
|
||||
|
||||
{
|
||||
nsIStyleContext* newStyleContext = aPresContext->ProbePseudoStyleContextFor(aContent,
|
||||
aNewContentPseudo,
|
||||
aParentStyle);
|
||||
if (newStyleContext != aCurrentStyle) {
|
||||
NS_IF_RELEASE(aCurrentStyle);
|
||||
aCurrentStyle = newStyleContext;
|
||||
} else {
|
||||
NS_IF_RELEASE(newStyleContext);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::ReResolveStyleContext(nsIPresContext* aPresContext,
|
||||
nsIStyleContext* aParentContext)
|
||||
{
|
||||
nsIStyleContext* oldContext = mStyleContext;
|
||||
|
||||
// NOTE: using nsFrame's ReResolveStyleContext method to avoid
|
||||
// useless version in base classes.
|
||||
nsresult rv = nsFrame::ReResolveStyleContext(aPresContext, aParentContext);
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (oldContext != mStyleContext) {
|
||||
|
||||
PRBool currentIsVisible = (mCurrentStyleContext == mVisibleStyleContext?PR_TRUE:PR_FALSE);
|
||||
|
||||
nsIAtom * visibleContentPseudo = NS_NewAtom(":DROPDOWN-VISIBLE");
|
||||
RefreshStyleContext(aPresContext, visibleContentPseudo, mVisibleStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(visibleContentPseudo);
|
||||
|
||||
nsIAtom * hiddenContentPseudo = NS_NewAtom(":DROPDOWN-HIDDEN");
|
||||
RefreshStyleContext(aPresContext, hiddenContentPseudo, mHiddenStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(hiddenContentPseudo);
|
||||
mCurrentStyleContext = (currentIsVisible?mVisibleStyleContext:mHiddenStyleContext);
|
||||
|
||||
mListFrame->ReResolveStyleContext(aPresContext,
|
||||
(nsnull != mCurrentStyleContext? mCurrentStyleContext : mStyleContext));
|
||||
|
||||
// Button Style
|
||||
nsIAtom * btnOutContentPseudo = NS_NewAtom(":DROPDOWN-BTN-OUT");
|
||||
RefreshStyleContext(aPresContext, btnOutContentPseudo, mBtnOutStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(btnOutContentPseudo);
|
||||
|
||||
nsIAtom * btnPressContentPseudo = NS_NewAtom(":DROPDOWN-BTN-PRESSED");
|
||||
RefreshStyleContext(aPresContext, btnPressContentPseudo, mBtnPressedStyleContext, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(btnPressContentPseudo);
|
||||
|
||||
nsIAtom * txtBlkContentPseudo = NS_NewAtom(":COMBOBOX-TEXT");
|
||||
RefreshStyleContext(aPresContext, txtBlkContentPseudo, mBlockTextStyle, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(txtBlkContentPseudo);
|
||||
|
||||
nsIAtom * txtBlkSelContentPseudo = NS_NewAtom(":COMBOBOX-TEXTSELECTED");
|
||||
RefreshStyleContext(aPresContext, txtBlkSelContentPseudo, mBlockTextSelectedStyle, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(txtBlkSelContentPseudo);
|
||||
|
||||
nsIAtom * txtBlkSelFocContentPseudo = NS_NewAtom(":COMBOBOX-TEXTSELECTEDFOCUS");
|
||||
RefreshStyleContext(aPresContext, txtBlkSelFocContentPseudo, mBlockTextSelectedFocusStyle, mContent, mStyleContext);
|
||||
NS_IF_RELEASE(txtBlkSelFocContentPseudo);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus)
|
||||
{
|
||||
if (nsEventStatus_eConsumeNoDefault == aEventStatus) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if(nsEventStatus_eConsumeNoDefault != aEventStatus) {
|
||||
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||
} else if (aEvent->message == NS_MOUSE_MOVE && mDoingSelection ||
|
||||
aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
||||
// no-op
|
||||
} else {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||
|
||||
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
||||
mArrowStyle = mBtnOutStyleContext;
|
||||
ForceDrawFrame(this);
|
||||
//MouseClicked(&aPresContext);
|
||||
|
||||
} else if (aEvent->message == NS_MOUSE_MOVE) {
|
||||
|
||||
} else if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||
mArrowStyle = mBtnPressedStyleContext;
|
||||
ForceDrawFrame(this);
|
||||
MouseClicked(&aPresContext);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
|
||||
{
|
||||
//nsresult rv = nsScrollFrame::GetFrameForPoint(aPoint, aFrame);
|
||||
nsresult rv = GetFrameForPointUsing(aPoint, nsnull, aFrame);
|
||||
if (NS_OK == rv) {
|
||||
if (*aFrame != this) {
|
||||
//mHitFrame = *aFrame;
|
||||
*aFrame = this;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
*aFrame = this;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsComboboxControlFrame::GetFrameForPointUsing(const nsPoint& aPoint,
|
||||
nsIAtom* aList,
|
||||
nsIFrame** aFrame)
|
||||
{
|
||||
*aFrame = this;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIPluggableEventListener
|
||||
//----------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::PluggableEventHandler(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus)
|
||||
{
|
||||
HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||
//aEventStatus = nsEventStatus_eConsumeNoDefault;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsComboboxControlFrame::PluggableGetFrameForPoint(const nsPoint& aPoint,
|
||||
nsIFrame** aFrame)
|
||||
{
|
||||
return GetFrameForPoint(aPoint, aFrame);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIComboboxControlFrame
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetDropDown(nsIFrame* aPlaceHolderFrame, nsIFrame* aDropDownFrame)
|
||||
{
|
||||
mPlaceHolderFrame = aPlaceHolderFrame;
|
||||
mListFrame = aDropDownFrame;
|
||||
|
||||
if (NS_OK != mListFrame->QueryInterface(kIListControlFrameIID, (void**)&mListControlFrame)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Ok, since we now know we have the ListFrame, and we are assuming at this point it has been initialized
|
||||
// Let's get the currently selected item, but we make the call using the Interface
|
||||
mListControlFrame->GetSelectedItem(mTextStr);
|
||||
|
||||
AppendChildren(mPlaceHolderFrame, PR_FALSE);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetDropDownStyleContexts(nsIStyleContext * aVisible, nsIStyleContext * aHidden)
|
||||
{
|
||||
mVisibleStyleContext = aVisible;
|
||||
mHiddenStyleContext = aHidden;
|
||||
mCurrentStyleContext = mHiddenStyleContext;
|
||||
|
||||
NS_ADDREF(mVisibleStyleContext);
|
||||
NS_ADDREF(mHiddenStyleContext);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::SetButtonStyleContexts(nsIStyleContext * aOut, nsIStyleContext * aPressed)
|
||||
{
|
||||
mBtnOutStyleContext = aOut;
|
||||
mBtnPressedStyleContext = aPressed;
|
||||
mArrowStyle = aOut;
|
||||
|
||||
NS_ADDREF(mBtnOutStyleContext);
|
||||
NS_ADDREF(mBtnPressedStyleContext);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
NS_IMETHODIMP
|
||||
nsComboboxControlFrame::ListWasSelected(nsIPresContext* aPresContext)
|
||||
{
|
||||
mArrowStyle = mBtnOutStyleContext;
|
||||
MouseClicked(aPresContext);
|
||||
|
||||
nsString str;
|
||||
if (nsnull != mListControlFrame) {
|
||||
mListControlFrame->GetSelectedItem(mTextStr);
|
||||
nsIFormControlFrame* fcFrame = nsnull;
|
||||
nsresult result = mListFrame->QueryInterface(kIFormControlFrameIID, (void**)&fcFrame);
|
||||
if ((NS_OK == result) && (nsnull != fcFrame)) {
|
||||
fcFrame->SetFocus(PR_FALSE, PR_FALSE);
|
||||
}
|
||||
SetFocus(PR_TRUE, PR_TRUE);
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,181 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef nsComboboxControlFrame_h___
|
||||
#define nsComboboxControlFrame_h___
|
||||
|
||||
#include "nsHTMLContainerFrame.h"
|
||||
#include "nsIFormControlFrame.h"
|
||||
#include "nsIComboboxControlFrame.h"
|
||||
#include "nsIPluggableEventListener.h"
|
||||
|
||||
class nsButtonControlFrame;
|
||||
class nsTextControlFrame;
|
||||
class nsFormFrame;
|
||||
class nsIView;
|
||||
class nsStyleContext;
|
||||
class nsIHTMLContent;
|
||||
class nsIListControlFrame;
|
||||
|
||||
class nsComboboxControlFrame : public nsHTMLContainerFrame,
|
||||
public nsIFormControlFrame,
|
||||
public nsIPluggableEventListener,
|
||||
public nsIComboboxControlFrame
|
||||
{
|
||||
public:
|
||||
nsComboboxControlFrame();
|
||||
~nsComboboxControlFrame();
|
||||
|
||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
||||
// nsIFrame
|
||||
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
|
||||
NS_IMETHOD Reflow(nsIPresContext& aCX,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus);
|
||||
|
||||
NS_IMETHOD ReResolveStyleContext(nsIPresContext* aPresContext,
|
||||
nsIStyleContext* aParentContext);
|
||||
|
||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
|
||||
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||
|
||||
|
||||
virtual PRInt32 GetMaxNumValues();
|
||||
|
||||
virtual PRBool GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
||||
nsString* aValues, nsString* aNames);
|
||||
|
||||
//nsTextControlFrame* GetTextFrame() { return mTextFrame; }
|
||||
|
||||
//void SetTextFrame(nsTextControlFrame* aFrame) { mTextFrame = aFrame; }
|
||||
|
||||
//nsButtonControlFrame* GetBrowseFrame() { return mBrowseFrame; }
|
||||
//void SetBrowseFrame(nsButtonControlFrame* aFrame) { mBrowseFrame = aFrame; }
|
||||
void SetFocus(PRBool aOn, PRBool aRepaint);
|
||||
virtual PRBool IsSuccessful(nsIFormControlFrame* aSubmitter);
|
||||
virtual void SetFormFrame(nsFormFrame* aFormFrame) { mFormFrame = aFormFrame; }
|
||||
virtual void Reset();
|
||||
NS_IMETHOD GetName(nsString* aName);
|
||||
NS_IMETHOD GetType(PRInt32* aType) const;
|
||||
|
||||
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
|
||||
nsFont& aFont);
|
||||
NS_IMETHOD GetFormContent(nsIContent*& aContent) const;
|
||||
virtual nscoord GetVerticalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetHorizontalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetVerticalInsidePadding(float aPixToTwip,
|
||||
nscoord aInnerHeight) const;
|
||||
virtual nscoord GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
||||
float aPixToTwip,
|
||||
nscoord aInnerWidth,
|
||||
nscoord aCharWidth) const;
|
||||
|
||||
|
||||
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
||||
|
||||
nsresult GetFrameForPointUsing(const nsPoint& aPoint,
|
||||
nsIAtom* aList,
|
||||
nsIFrame** aFrame);
|
||||
// A Static Helper Functions
|
||||
|
||||
// This refreshes a particular pseudo style content when a "ReResolveStyleContent" happens
|
||||
static void RefreshStyleContext(nsIPresContext* aPresContext,
|
||||
nsIAtom * aNewContentPseudo,
|
||||
nsIStyleContext*& aCurrentStyle,
|
||||
nsIContent * aContent,
|
||||
nsIStyleContext* aParentStyle);
|
||||
|
||||
// nsIFormMouseListener
|
||||
virtual void MouseClicked(nsIPresContext* aPresContext);
|
||||
|
||||
// nsIPluggableEventListener
|
||||
NS_IMETHOD PluggableEventHandler(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
NS_IMETHOD PluggableGetFrameForPoint(const nsPoint& aPoint,
|
||||
nsIFrame** aFrame);
|
||||
|
||||
//static PRInt32 gSpacing;
|
||||
|
||||
//nsIComboboxControlFrame
|
||||
NS_IMETHOD SetDropDown(nsIFrame* aPlaceHolderFrame, nsIFrame* aDropDownFrame);
|
||||
NS_IMETHOD SetDropDownStyleContexts(nsIStyleContext * aVisible, nsIStyleContext * aHidden);
|
||||
NS_IMETHOD SetButtonStyleContexts(nsIStyleContext * aOut, nsIStyleContext * aPressed);
|
||||
NS_IMETHOD ListWasSelected(nsIPresContext* aPresContext);
|
||||
|
||||
|
||||
protected:
|
||||
virtual void PaintComboboxControl(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
nsIWidget* GetWindowTemp(nsIView *aView); // XXX temporary
|
||||
virtual PRIntn GetSkipSides() const;
|
||||
|
||||
|
||||
nsFormFrame* mFormFrame; // Parent Form Frame
|
||||
|
||||
nsIFrame * mPlaceHolderFrame;
|
||||
nsIFrame * mListFrame; // Generic nsIFrame
|
||||
nsIListControlFrame * mListControlFrame; // Specific ListControl Interface
|
||||
nsRect mButtonRect; // The Arrow Button's Rect cached for Painting
|
||||
|
||||
// DropDown List Visibility Styles
|
||||
nsIStyleContext * mVisibleStyleContext; // Style for the DropDown List to make it visible
|
||||
nsIStyleContext * mHiddenStyleContext; // Style for the DropDown List to make it hidden
|
||||
nsIStyleContext * mCurrentStyleContext; // The current Style state of the DropDown List
|
||||
|
||||
// Arrow Button Styles
|
||||
nsIStyleContext * mBtnOutStyleContext; // Style when not pressed
|
||||
nsIStyleContext * mBtnPressedStyleContext; // Style When Pressed
|
||||
nsIStyleContext * mArrowStyle; // Arrows currrent style (for painting)
|
||||
|
||||
// Combobox Text Styles
|
||||
nsIStyleContext * mBlockTextStyle; // Style when there is no selection and it doesn't have focus
|
||||
nsIStyleContext * mBlockTextSelectedStyle; // Style when selected and it doesn't have focus
|
||||
nsIStyleContext * mBlockTextSelectedFocusStyle; // Style when selected and it has focus
|
||||
|
||||
|
||||
PRBool mFirstTime;
|
||||
|
||||
// State data members
|
||||
nsString mTextStr;
|
||||
PRBool mGotFocus;
|
||||
|
||||
private:
|
||||
NS_IMETHOD_(nsrefcnt) AddRef() { return NS_OK; }
|
||||
NS_IMETHOD_(nsrefcnt) Release() { return NS_OK; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,297 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (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 Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*/
|
||||
#ifndef nsListControlFrame_h___
|
||||
#define nsListControlFrame_h___
|
||||
|
||||
//#include "nsHTMLContainerFrame.h"
|
||||
#include "nsScrollFrame.h"
|
||||
#include "nsIDOMFocusListener.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIFormControlFrame.h"
|
||||
#include "nsIPluggableEventListener.h"
|
||||
#include "nsIListControlFrame.h"
|
||||
|
||||
class nsIDOMHTMLSelectElement;
|
||||
class nsIDOMHTMLCollection;
|
||||
class nsIDOMHTMLOptionElement;
|
||||
class nsFormFrame;
|
||||
class nsScrollFrame;
|
||||
class nsIComboboxControlFrame;
|
||||
|
||||
#if 0
|
||||
struct nsInputDimSpec
|
||||
{
|
||||
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
|
||||
|
||||
nsInputDimSpec(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)
|
||||
{
|
||||
}
|
||||
|
||||
};
|
||||
#endif
|
||||
/**
|
||||
* The block frame has two additional named child lists:
|
||||
* - "Floater-list" which contains the floated frames
|
||||
* - "Bullet-list" which contains the bullet frame
|
||||
*
|
||||
* @see nsLayoutAtoms::bulletList
|
||||
* @see nsLayoutAtoms::floaterList
|
||||
*/
|
||||
class nsListControlFrame : public nsScrollFrame,
|
||||
public nsIFormControlFrame,
|
||||
public nsIPluggableEventListener,
|
||||
public nsIListControlFrame
|
||||
{
|
||||
public:
|
||||
friend nsresult NS_NewListControlFrame(nsIFrame*& aNewFrame);
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsISupports overrides
|
||||
// NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
||||
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
||||
|
||||
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
// nsIFrame
|
||||
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
NS_IMETHOD Reflow(nsIPresContext& aCX,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsReflowStatus& aStatus);
|
||||
|
||||
//
|
||||
/* virtual nsresult AppendNewFrames(nsIPresContext& aPresContext, nsIFrame*);
|
||||
|
||||
virtual nsresult InsertNewFrame(nsIPresContext& aPresContext,
|
||||
nsBaseIBFrame* aParentFrame,
|
||||
nsIFrame* aNewFrame,
|
||||
nsIFrame* aPrevSibling);
|
||||
|
||||
virtual nsresult DoRemoveFrame(nsBlockReflowState& aState,
|
||||
nsBaseIBFrame* aParentFrame,
|
||||
nsIFrame* aDeletedFrame,
|
||||
nsIFrame* aPrevSibling);
|
||||
*/
|
||||
|
||||
NS_IMETHOD Init(nsIPresContext& aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aGeometricParent,
|
||||
nsIFrame* aContentParent,
|
||||
nsIStyleContext* aContext);
|
||||
|
||||
NS_IMETHOD Deselect();
|
||||
|
||||
#if 0
|
||||
virtual void GetStyleSize(nsIPresContext& aContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsSize& aSize);
|
||||
#endif
|
||||
|
||||
virtual void GetDesiredSize(nsIPresContext* aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsHTMLReflowMetrics& aDesiredLayoutSize,
|
||||
nsSize& aDesiredWidgetSize);
|
||||
#if 0
|
||||
nscoord CalculateSize (nsIPresContext* aPresContext, nsListControlFrame* aFrame,
|
||||
const nsSize& aCSSSize, nsInputDimSpec& aDimensionSpec,
|
||||
nsSize& aBounds, PRBool& aWidthExplicit,
|
||||
PRBool& aHeightExplicit, nscoord& aRowSize,
|
||||
nsIRenderingContext *aRendContext);
|
||||
#endif
|
||||
|
||||
/*virtual nsresult Focus(nsIDOMEvent* aEvent);
|
||||
virtual nsresult Blur(nsIDOMEvent* aEvent);
|
||||
virtual nsresult ProcessEvent(nsIDOMEvent* aEvent);
|
||||
NS_IMETHOD AddEventListener(nsIDOMNode * aNode);
|
||||
NS_IMETHOD RemoveEventListener(nsIDOMNode * aNode);
|
||||
|
||||
NS_IMETHOD DeleteFrame(nsIPresContext& aPresContext);*/
|
||||
|
||||
NS_METHOD GetMultiple(PRBool* aResult, nsIDOMHTMLSelectElement* aSelect = nsnull);
|
||||
|
||||
///XXX: End o the temporary methods
|
||||
#if 0
|
||||
nscoord GetTextSize(nsIPresContext& aContext, nsListControlFrame* aFrame,
|
||||
const nsString& aString, nsSize& aSize,
|
||||
nsIRenderingContext *aRendContext);
|
||||
|
||||
nscoord GetTextSize(nsIPresContext& aContext, nsListControlFrame* aFrame,
|
||||
PRInt32 aNumChars, nsSize& aSize,
|
||||
nsIRenderingContext *aRendContext);
|
||||
#endif
|
||||
NS_IMETHOD GetSize(PRInt32* aSize) const;
|
||||
NS_IMETHOD GetMaxLength(PRInt32* aSize);
|
||||
|
||||
static void GetScrollBarDimensions(nsIPresContext& aPresContext,
|
||||
nscoord &aWidth, nscoord &aHeight);
|
||||
virtual nscoord GetVerticalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetHorizontalBorderWidth(float aPixToTwip) const;
|
||||
virtual nscoord GetVerticalInsidePadding(float aPixToTwip,
|
||||
nscoord aInnerHeight) const;
|
||||
virtual nscoord GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
||||
float aPixToTwip,
|
||||
nscoord aInnerWidth,
|
||||
nscoord aCharWidth) const;
|
||||
|
||||
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
|
||||
nsFont& aFont);
|
||||
|
||||
NS_IMETHOD GetFormContent(nsIContent*& aContent) const;
|
||||
|
||||
// nsIFrame
|
||||
NS_IMETHOD SetRect(const nsRect& aRect);
|
||||
NS_IMETHOD SizeTo(nscoord aWidth, nscoord aHeight);
|
||||
|
||||
/////////////////////////
|
||||
// nsHTMLContainerFrame
|
||||
/////////////////////////
|
||||
virtual PRIntn GetSkipSides() const;
|
||||
|
||||
/////////////////////////
|
||||
// nsIFormControlFrame
|
||||
/////////////////////////
|
||||
NS_IMETHOD GetType(PRInt32* aType) const;
|
||||
|
||||
NS_IMETHOD GetName(nsString* aName);
|
||||
|
||||
virtual void SetFocus(PRBool aOn = PR_TRUE, PRBool aRepaint = PR_FALSE);
|
||||
|
||||
virtual void MouseClicked(nsIPresContext* aPresContext);
|
||||
|
||||
virtual void Reset();
|
||||
|
||||
virtual PRBool IsSuccessful(nsIFormControlFrame* aSubmitter);
|
||||
|
||||
virtual PRInt32 GetMaxNumValues();
|
||||
|
||||
virtual PRBool GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
||||
nsString* aValues, nsString* aNames);
|
||||
|
||||
virtual void SetFormFrame(nsFormFrame* aFrame);
|
||||
|
||||
// nsIPluggableEventListener
|
||||
NS_IMETHOD PluggableEventHandler(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
NS_IMETHOD PluggableGetFrameForPoint(const nsPoint& aPoint,
|
||||
nsIFrame** aFrame);
|
||||
|
||||
// nsIListControlFrame
|
||||
NS_IMETHOD SetComboboxFrame(nsIFrame* aComboboxFrame);
|
||||
NS_IMETHOD GetSelectedItem(nsString & aStr);
|
||||
NS_IMETHOD AboutToDropDown();
|
||||
|
||||
|
||||
// Static Methods
|
||||
static nsIDOMHTMLSelectElement* GetSelect(nsIContent * aContent);
|
||||
static nsIDOMHTMLCollection* GetOptions(nsIContent * aContent, nsIDOMHTMLSelectElement* aSelect = nsnull);
|
||||
static nsIDOMHTMLOptionElement* GetOption(nsIDOMHTMLCollection& aOptions, PRUint32 aIndex);
|
||||
static PRBool GetOptionValue(nsIDOMHTMLCollection& aCollecton, PRUint32 aIndex, nsString& aValue);
|
||||
|
||||
protected:
|
||||
nsListControlFrame();
|
||||
virtual ~nsListControlFrame();
|
||||
|
||||
nsIFrame * GetOptionFromChild(nsIFrame* aParentFrame);
|
||||
|
||||
nsresult GetFrameForPointUsing(const nsPoint& aPoint,
|
||||
nsIAtom* aList,
|
||||
nsIFrame** aFrame);
|
||||
|
||||
// nsHTMLContainerFrame overrides
|
||||
virtual void PaintChildren(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
|
||||
void ClearSelection();
|
||||
void InitializeFromContent(PRBool aDoDisplay = PR_FALSE);
|
||||
|
||||
void ExtendedSelection(PRInt32 aStartIndex, PRInt32 aEndIndex, PRBool aDoInvert, PRBool aSetValue);
|
||||
|
||||
NS_IMETHOD HandleLikeDropDownListEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
NS_IMETHOD HandleLikeListEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
PRInt32 SetContentSelected(nsIFrame * aHitFrame,
|
||||
nsIContent *& aHitContent,
|
||||
PRBool aIsSelected);
|
||||
|
||||
// Data Members
|
||||
nsFormFrame* mFormFrame;
|
||||
|
||||
PRInt32 mNumRows;
|
||||
|
||||
PRBool mIsFrameSelected[64];
|
||||
PRInt32 mNumSelections;
|
||||
PRInt32 mMaxNumSelections;
|
||||
PRBool mMultipleSelections;
|
||||
|
||||
|
||||
//nsIContent * mSelectedContent;
|
||||
PRInt32 mSelectedIndex;
|
||||
PRInt32 mStartExtendedIndex;
|
||||
PRInt32 mEndExtendedIndex;
|
||||
|
||||
nsIFrame * mHitFrame;
|
||||
nsIContent * mHitContent;
|
||||
|
||||
nsIFrame * mCurrentHitFrame;
|
||||
nsIContent * mCurrentHitContent;
|
||||
|
||||
nsIFrame * mSelectedFrame;
|
||||
nsIContent * mSelectedContent;
|
||||
|
||||
PRBool mIsInitializedFromContent;
|
||||
|
||||
nsIFrame * mContentFrame;
|
||||
PRBool mInDropDownMode;
|
||||
nsIComboboxControlFrame * mComboboxFrame;
|
||||
nsString mSelectionStr;
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsListControlFrame_h___ */
|
||||
|
Загрузка…
Ссылка в новой задаче