bug #5993. Removed references to nsIWidget in form HTML content elements. the form elements

now go through the nsFormControlFrame interface instead. This removes the dependency between
form element content and nsIWidget.
This commit is contained in:
kmcclusk%netscape.com 1999-05-13 23:45:40 +00:00
Родитель 6635957e0c
Коммит 664a8f2a93
28 изменённых файлов: 368 добавлений и 330 удалений

Просмотреть файл

@ -20,7 +20,6 @@
#include "nsISupports.h"
class nsIDOMHTMLFormElement;
class nsIWidget;
#define NS_FORM_BROWSE 0
#define NS_FORM_BUTTON_BUTTON 1
@ -79,8 +78,6 @@ public:
*/
NS_IMETHOD GetType(PRInt32* aType) = 0;
NS_IMETHOD SetWidget(nsIWidget* aWidget) = 0;
NS_IMETHOD Init() = 0;
};

Просмотреть файл

@ -95,7 +95,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget) { return NS_OK; };
NS_IMETHOD Init() { return NS_OK; }
// nsIFocusableContent

Просмотреть файл

@ -75,7 +75,6 @@ public:
// nsIFormControl
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init() { return NS_OK; }
protected:
@ -262,12 +261,6 @@ nsHTMLFieldSetElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLFieldSetElement::SetWidget(nsIWidget* aWidget)
{
NS_ASSERTION(0, "Fieldset has no widget");
return NS_FORM_NOTOK;
}
NS_IMETHODIMP
nsHTMLFieldSetElement::GetStyleHintForAttributeChange(

Просмотреть файл

@ -30,13 +30,6 @@
#include "nsIHTMLAttributes.h"
#include "nsIFormControl.h"
#include "nsIForm.h"
#include "nsIWidget.h"
#include "nsITextWidget.h"
// XXX: All of the header files related to accessing widgets directly
// should be removed when all widget references are replaced with
// frame references.
#include "nsICheckButton.h"
#include "nsIRadioButton.h"
#include "nsIDocument.h"
#include "nsIPresShell.h"
#include "nsIFormControlFrame.h"
@ -50,9 +43,6 @@ static NS_DEFINE_IID(kIDOMHTMLInputElementIID, NS_IDOMHTMLINPUTELEMENT_IID);
static NS_DEFINE_IID(kIDOMHTMLFormElementIID, NS_IDOMHTMLFORMELEMENT_IID);
static NS_DEFINE_IID(kIFormIID, NS_IFORM_IID);
static NS_DEFINE_IID(kIFormControlIID, NS_IFORMCONTROL_IID);
static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID);
static NS_DEFINE_IID(kIRadioIID, NS_IRADIOBUTTON_IID);
static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID);
static NS_DEFINE_IID(kIFormControlFrameIID, NS_IFORMCONTROLFRAME_IID);
static NS_DEFINE_IID(kIFocusableContentIID, NS_IFOCUSABLECONTENT_IID);
@ -134,7 +124,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init() { return NS_OK; }
// nsIFocusableContent
@ -143,7 +132,6 @@ public:
protected:
nsGenericHTMLLeafElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
PRInt32 mType;
@ -176,14 +164,12 @@ nsHTMLInputElement::nsHTMLInputElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mType = NS_FORM_INPUT_TEXT; // default value
mForm = nsnull;
mWidget = nsnull;
//nsTraceRefcnt::Create((nsIFormControl*)this, "nsHTMLFormControlElement", __FILE__, __LINE__);
}
nsHTMLInputElement::~nsHTMLInputElement()
{
NS_IF_RELEASE(mWidget);
if (nsnull != mForm) {
// prevent mForm from decrementing its ref count on us
mForm->RemoveElement(this, PR_FALSE);
@ -333,7 +319,6 @@ nsHTMLInputElement::GetValue(nsString& aValue)
if (NS_SUCCEEDED(nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame))) {
if (nsnull != formControlFrame) {
formControlFrame->GetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -353,7 +338,6 @@ nsHTMLInputElement::SetValue(const nsString& aValue)
if (NS_SUCCEEDED(nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame))) {
if (nsnull != formControlFrame ) {
formControlFrame->SetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -374,8 +358,6 @@ nsHTMLInputElement::GetChecked(PRBool* aValue)
*aValue = PR_TRUE;
else
*aValue = PR_FALSE;
NS_RELEASE(formControlFrame);
}
}
return NS_OK;
@ -393,7 +375,6 @@ nsHTMLInputElement::SetChecked(PRBool aValue)
else {
formControlFrame->SetProperty(nsHTMLAtoms::checked, "0");
}
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -401,23 +382,27 @@ nsHTMLInputElement::SetChecked(PRBool aValue)
NS_IMETHODIMP
nsHTMLInputElement::Blur()
{
if (nsnull != mWidget) {
nsIWidget *mParentWidget = mWidget->GetParent();
if (nsnull != mParentWidget) {
mParentWidget->SetFocus();
NS_RELEASE(mParentWidget);
}
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
// Ask the frame to Deselect focus (i.e Blur).
formControlFrame->SetFocus(PR_FALSE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
nsHTMLInputElement::Focus()
{
if (nsnull != mWidget) {
mWidget->SetFocus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@ -447,18 +432,18 @@ nsHTMLInputElement::RemoveFocus(nsIPresContext* aPresContext)
return NS_OK;
}
NS_IMETHODIMP
nsHTMLInputElement::Select()
{
if ((NS_FORM_INPUT_TEXT == mType) && (nsnull != mWidget)) {
nsITextWidget *textWidget;
if (NS_OK == mWidget->QueryInterface(kITextWidgetIID, (void**)&textWidget)) {
textWidget->SelectAll();
NS_RELEASE(textWidget);
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
if (nsnull != formControlFrame ) {
formControlFrame->SetProperty(nsHTMLAtoms::select, "");
return NS_OK;
}
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@ -706,24 +691,13 @@ nsHTMLInputElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLInputElement::SetWidget(nsIWidget* aWidget)
{
if (aWidget != mWidget) {
NS_IF_RELEASE(mWidget);
NS_IF_ADDREF(aWidget);
mWidget = aWidget;
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLInputElement::GetStyleHintForAttributeChange(
const nsIAtom* aAttribute,
PRInt32 *aHint) const
{
*aHint = (nsnull != mWidget ? NS_STYLE_HINT_CONTENT : NS_STYLE_HINT_REFLOW);
*aHint = NS_STYLE_HINT_CONTENT;
return NS_OK;
}

Просмотреть файл

@ -80,7 +80,6 @@ public:
// nsIFormControl
NS_IMETHOD GetType(PRInt32* aType) { return NS_FORM_LABEL; }
NS_IMETHOD SetWidget(nsIWidget* aWidget) { return NS_OK; }
NS_IMETHOD Init() { return NS_OK; }
protected:

Просмотреть файл

@ -30,7 +30,6 @@
#include "nsIHTMLAttributes.h"
#include "nsIFormControl.h"
#include "nsIForm.h"
#include "nsIWidget.h"
#include "nsIDOMHTMLCollection.h"
#include "nsIDOMHTMLOptionElement.h"
#include "nsIFocusableContent.h"
@ -160,7 +159,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init();
NS_IMETHOD SetFocus(nsIPresContext* aPresContext);
@ -172,7 +170,6 @@ public:
protected:
nsGenericHTMLContainerElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
nsOptionList* mOptions;
};
@ -202,12 +199,10 @@ nsHTMLSelectElement::nsHTMLSelectElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mOptions = nsnull;
mForm = nsnull;
mWidget = nsnull;
}
nsHTMLSelectElement::~nsHTMLSelectElement()
{
NS_IF_RELEASE(mWidget);
if (nsnull != mForm) {
// prevent mForm from decrementing its ref count on us
mForm->RemoveElement(this, PR_FALSE);
@ -480,7 +475,6 @@ nsHTMLSelectElement::SetSelectedIndex(PRInt32 aValue)
nsString value;
value.Append(aValue, 10);
formControlFrame->SetProperty(nsHTMLAtoms::selectedindex, value);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -495,23 +489,27 @@ NS_IMPL_INT_ATTR(nsHTMLSelectElement, TabIndex, tabindex)
NS_IMETHODIMP
nsHTMLSelectElement::Blur() // XXX not tested
{
if (nsnull != mWidget) {
nsIWidget *mParentWidget = mWidget->GetParent();
if (nsnull != mParentWidget) {
mParentWidget->SetFocus();
NS_RELEASE(mParentWidget);
}
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
// Ask the frame to Deselect focus (i.e Blur).
formControlFrame->SetFocus(PR_FALSE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
nsHTMLSelectElement::Focus()
{
if (nsnull != mWidget) { // XXX not tested
mWidget->SetFocus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@ -651,16 +649,6 @@ nsHTMLSelectElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLSelectElement::SetWidget(nsIWidget* aWidget)
{
if (aWidget != mWidget) {
NS_IF_RELEASE(mWidget);
NS_IF_ADDREF(aWidget);
mWidget = aWidget;
}
return NS_OK;
}
// An important assumption is that if aForm is null, the previous mForm will not be released
// This allows nsHTMLFormElement to deal with circular references.

Просмотреть файл

@ -29,8 +29,6 @@
#include "nsIStyleContext.h"
#include "nsStyleConsts.h"
#include "nsIPresContext.h"
#include "nsIWidget.h"
#include "nsITextAreaWidget.h"
#include "nsIHTMLAttributes.h"
#include "nsIFormControlFrame.h"
#include "nsIFocusableContent.h"
@ -40,7 +38,6 @@ static NS_DEFINE_IID(kIDOMHTMLTextAreaElementIID, NS_IDOMHTMLTEXTAREAELEMENT_IID
static NS_DEFINE_IID(kIDOMHTMLFormElementIID, NS_IDOMHTMLFORMELEMENT_IID);
static NS_DEFINE_IID(kIFormControlIID, NS_IFORMCONTROL_IID);
static NS_DEFINE_IID(kIFormIID, NS_IFORM_IID);
static NS_DEFINE_IID(kITextAreaWidgetIID, NS_ITEXTAREAWIDGET_IID);
static NS_DEFINE_IID(kIFocusableContentIID, NS_IFOCUSABLECONTENT_IID);
class nsHTMLTextAreaElement : public nsIDOMHTMLTextAreaElement,
@ -106,7 +103,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init() { return NS_OK; }
// nsIFocusableContent
@ -115,7 +111,6 @@ public:
protected:
nsGenericHTMLContainerElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
};
@ -138,12 +133,10 @@ nsHTMLTextAreaElement::nsHTMLTextAreaElement(nsIAtom* aTag)
NS_INIT_REFCNT();
mInner.Init(this, aTag);
mForm = nsnull;
mWidget = nsnull;
}
nsHTMLTextAreaElement::~nsHTMLTextAreaElement()
{
NS_IF_RELEASE(mWidget);
if (nsnull != mForm) {
// prevent mForm from decrementing its ref count on us
mForm->RemoveElement(this, PR_FALSE);
@ -223,23 +216,27 @@ nsHTMLTextAreaElement::GetForm(nsIDOMHTMLFormElement** aForm)
NS_IMETHODIMP
nsHTMLTextAreaElement::Blur() // XXX not tested
{
if (nsnull != mWidget) {
nsIWidget *mParentWidget = mWidget->GetParent();
if (nsnull != mParentWidget) {
mParentWidget->SetFocus();
NS_RELEASE(mParentWidget);
}
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
// Ask the frame to Deselect focus (i.e Blur).
formControlFrame->SetFocus(PR_FALSE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
nsHTMLTextAreaElement::Focus() // XXX not tested
nsHTMLTextAreaElement::Focus()
{
if (nsnull != mWidget) {
mWidget->SetFocus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
@ -266,16 +263,17 @@ nsHTMLTextAreaElement::RemoveFocus(nsIPresContext* aPresContext)
}
NS_IMETHODIMP
nsHTMLTextAreaElement::Select() // XXX not tested
nsHTMLTextAreaElement::Select()
{
if (nsnull != mWidget) {
nsITextAreaWidget *textWidget;
if (NS_OK == mWidget->QueryInterface(kITextAreaWidgetIID, (void**)&textWidget)) {
textWidget->SelectAll();
NS_RELEASE(textWidget);
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
if (nsnull != formControlFrame ) {
formControlFrame->SetProperty(nsHTMLAtoms::select, "");
return NS_OK;
}
}
return NS_OK;
return rv;
}
NS_IMPL_STRING_ATTR(nsHTMLTextAreaElement, AccessKey, accesskey)
@ -300,7 +298,6 @@ nsHTMLTextAreaElement::GetValue(nsString& aValue)
nsIFormControlFrame* formControlFrame = nsnull;
if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
formControlFrame->GetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
return NS_OK;
}
//XXX: Should this ASSERT instead of getting the default value here?
@ -314,7 +311,6 @@ nsHTMLTextAreaElement::SetValue(const nsString& aValue)
nsIFormControlFrame* formControlFrame = nsnull;
if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
formControlFrame->SetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -436,16 +432,6 @@ nsHTMLTextAreaElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLTextAreaElement::SetWidget(nsIWidget* aWidget)
{
if (aWidget != mWidget) {
NS_IF_RELEASE(mWidget);
NS_IF_ADDREF(aWidget);
mWidget = aWidget;
}
return NS_OK;
}
// An important assumption is that if aForm is null, the previous mForm will not be released
// This allows nsHTMLFormElement to deal with circular references.

Просмотреть файл

@ -77,9 +77,12 @@ public:
// nsIFormControLFrame
NS_IMETHOD SetProperty(nsIAtom* aName, const nsString& aValue);
NS_IMETHOD GetProperty(nsIAtom* aName, nsString& aValue);
void SetFocus(PRBool aOn, PRBool aRepaint);
virtual void PostCreateWidget(nsIPresContext* aPresContext,
nscoord& aWidth,
nscoord& aHeight);
//nsTextControlFrame* GetTextFrame() { return mTextFrame; }
@ -87,7 +90,6 @@ public:
//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();

Просмотреть файл

@ -28,7 +28,6 @@
#include "nsHTMLIIDs.h"
#include "nsHTMLAtoms.h"
#include "nsIFileWidget.h"
#include "nsITextWidget.h"
#include "nsWidgetsCID.h"
#include "nsIComponentManager.h"
#include "nsIView.h"
@ -43,7 +42,6 @@
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(kIDOMHTMLInputElementIID, NS_IDOMHTMLINPUTELEMENT_IID);
@ -142,19 +140,8 @@ void nsFileControlFrame::MouseClicked(nsIPresContext* aPresContext)
if (nsnull == textView) {
return;
}
nsIWidget* widget;
mTextFrame->GetWidget(&widget);
if (!widget) {
return;
}
nsITextWidget* textWidget;
nsresult result = widget->QueryInterface(kITextWidgetIID, (void**)&textWidget);
if (NS_OK != result) {
NS_RELEASE(widget);
return;
}
nsresult result = NS_OK;
nsIView* parentView;
textView->GetParent(parentView);
nsIWidget* parentWidget = GetWindowTemp(parentView);
@ -174,16 +161,13 @@ void nsFileControlFrame::MouseClicked(nsIPresContext* aPresContext)
result = fileWidget->Show();
if (result) {
PRUint32 size;
nsString fileName;
fileWidget->GetFile(fileName);
textWidget->SetText(fileName,size);
mTextFrame->SetProperty(nsHTMLAtoms::value,fileName);
}
NS_RELEASE(fileWidget);
}
NS_RELEASE(parentWidget);
NS_RELEASE(textWidget);
NS_RELEASE(widget);
}
@ -348,17 +332,12 @@ nsFileControlFrame::GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
// 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);
if (NS_SUCCEEDED(mTextFrame->GetProperty(nsHTMLAtoms::value, aValues[0]))) {
aNumValues = 1;
NS_RELEASE(textWidget);
status = PR_TRUE;
}
NS_IF_RELEASE(widget);
return status;
}
@ -468,12 +447,14 @@ nsFileControlFrame::Paint(nsIPresContext& aPresContext,
if (HasWidget())
return NS_OK;
nsAutoString browse("Browse...");
nsRect rect;
mBrowseFrame->GetRect(rect);
mBrowseFrame->PaintButton(aPresContext, aRenderingContext, aDirtyRect,
browse, rect);
mTextFrame->PaintTextControlBackground(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {

Просмотреть файл

@ -299,15 +299,7 @@ nsFormControlFrame::Reflow(nsIPresContext& aPresContext,
// set our widget
result = GetWidget(view, &mWidget);
if ((NS_OK == result) && mWidget) { // keep the ref on mWidget
nsIFormControl* formControl = nsnull;
result = mContent->QueryInterface(kIFormControlIID, (void**)&formControl);
if ((NS_OK == result) && formControl) {
// set the content's widget, so it can get content modified by the widget
formControl->SetWidget(mWidget);
NS_RELEASE(formControl);
}
} else {
if ((PR_FALSE == NS_SUCCEEDED(result)) || (nsnull == mWidget)) { // keep the ref on mWidget
NS_ASSERTION(0, "could not get widget");
}
}

Просмотреть файл

@ -88,7 +88,8 @@ public:
NS_IMETHOD GetFormContent(nsIContent*& aContent) const = 0;
/**
* Set a property on the form control frame
* Set a property on the form control frame.
*
* @param aName name of the property to set
* @param aValue value of the property
* @returns NS_OK if the property name is valid, otherwise an error code
@ -98,6 +99,7 @@ public:
/**
* Get a property from the form control frame
*
* @param aName name of the property to get
* @param aValue value of the property
* @returns NS_OK if the property name is valid, otherwise an error code
@ -105,7 +107,7 @@ public:
NS_IMETHOD GetProperty(nsIAtom* aName, nsString& aValue) = 0;
};

Просмотреть файл

@ -198,6 +198,8 @@ nsIFrame* nsListControlFrame::GetNextSelectableFrame(nsVoidArray *aList, PRInt32
}
//----------------------------------------------------------------------
NS_IMETHODIMP
nsListControlFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
@ -214,7 +216,12 @@ nsListControlFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
rv = GetFrameForPointUsing(aPoint, nsnull, aFrame);
if (NS_OK == rv) {
if (*aFrame != this) {
mHitFrame = *aFrame;
*aFrame = GetSelectableFrame(*aFrame);
if (nsnull == *aFrame) {
mHitFrame = this;
} else {
mHitFrame = *aFrame;
}
*aFrame = this;
}
return NS_OK;
@ -591,6 +598,50 @@ nsListControlFrame::GetFont(nsIPresContext* aPresContext,
}
PRBool nsListControlFrame::IsOptionElement(nsIContent* aContent)
{
PRBool result = PR_FALSE;
nsIDOMHTMLOptionElement* oe = nsnull;
if (NS_SUCCEEDED(aContent->QueryInterface(kIDOMHTMLOptionElementIID, (void**) &oe))) {
if (oe != nsnull) {
result = PR_TRUE;
NS_RELEASE(oe);
}
}
return result;
}
PRBool nsListControlFrame::IsOptionElementFrame(nsIFrame *aFrame)
{
nsIContent *content = nsnull;
aFrame->GetContent(&content);
PRBool result = PR_FALSE;
if (nsnull != content) {
result = IsOptionElement(content);
NS_RELEASE(content);
}
return(result);
}
// Go up the frame tree looking for the first ancestor that has content
// which is selectable
nsIFrame *nsListControlFrame::GetSelectableFrame(nsIFrame *aFrame)
{
nsIFrame* selectedFrame = aFrame;
while ((nsnull != selectedFrame) &&
(PR_FALSE ==IsOptionElementFrame(selectedFrame))) {
selectedFrame->GetParent(&selectedFrame);
}
return(selectedFrame);
}
void nsListControlFrame::ForceRedraw(nsIContent* aContent)
{
//XXX: Hack. This should not be needed. The problem is DisplaySelected
@ -728,6 +779,39 @@ void nsListControlFrame::ExtendedSelection(PRInt32 aStartIndex, PRInt32 aEndInde
void nsListControlFrame::SingleSelection()
{
//XXX: Experimental code for supporting option groups
#if 0
// Donothing if a item was not clicked on
if (this == mHitFrame)
return;
// Store previous selection
nsIFrame* oldSelectedFrame = mSelectedFrame;
// Get Current selection
mSelectedFrame = mHitFrame;
if (mSelectedFrame != nsnull) {
if (oldSelectedFrame != mSelectedFrame) {
// Deselect the previous selection if there is one
if (oldSelectedFrame != nsnull) {
nsIContent* content = nsnull;
oldSelectedFrame->GetContent(&content);
DisplayDeselected(content);
NS_RELEASE(content);
}
// Display the new selection
nsIContent* content = nsnull;
mSelectedFrame->GetContent(&content);
DisplaySelected(content);
NS_RELEASE(content);
mSelectedContent = mHitContent;
} else {
// Selecting the currently selected item so do nothing.
}
}
#endif
//XXX: Endof experimental code
// Store previous selection
PRInt32 oldSelectedIndex = mSelectedIndex;
// Get Current selection
@ -738,13 +822,14 @@ void nsListControlFrame::SingleSelection()
if (oldSelectedIndex != kNothingSelected) {
SetFrameSelected(oldSelectedIndex, PR_FALSE);
}
// Dipslay the new selection
// Display the new selection
SetFrameSelected(mSelectedIndex, PR_TRUE);
mSelectedContent = mHitContent;
} else {
// Selecting the currently selected item so do nothing.
}
}
}
void nsListControlFrame::MultipleSelection(PRBool aIsShift, PRBool aIsControl)

Просмотреть файл

@ -173,6 +173,9 @@ protected:
// Utility methods
PRBool IsOptionElement(nsIContent* aContent);
PRBool IsOptionElementFrame(nsIFrame *aFrame);
nsIFrame *GetSelectableFrame(nsIFrame *aFrame);
void DisplaySelected(nsIContent* aContent);
void DisplayDeselected(nsIContent* aContent);
void UpdateItem(nsIContent* aContent, PRBool aSelected);
@ -220,6 +223,7 @@ protected:
nsIFrame * mCurrentHitFrame;
nsIContent * mCurrentHitContent;
nsIContent * mSelectedContent;
nsIFrame * mSelectedFrame;
PRBool mIsInitializedFromContent;
nsIFrame * mContentFrame;
PRBool mInDropDownMode;

Просмотреть файл

@ -857,13 +857,30 @@ void nsTextControlFrame::SetTextControlFrameState(const nsString& aValue)
NS_IMETHODIMP nsTextControlFrame::SetProperty(nsIAtom* aName, const nsString& aValue)
{
nsresult rv = NS_OK;
if (nsHTMLAtoms::value == aName) {
SetTextControlFrameState(aValue);
} else if (nsHTMLAtoms::select == aName) {
if (nsnull != mWidget) {
nsITextWidget *textWidget;
rv = mWidget->QueryInterface(kITextWidgetIID, (void**)&textWidget);
if (NS_SUCCEEDED(rv)) {
textWidget->SelectAll();
NS_RELEASE(textWidget);
}
nsITextAreaWidget *textAreaWidget;
rv = mWidget->QueryInterface(kITextAreaWidgetIID, (void**)&textAreaWidget);
if (NS_SUCCEEDED(rv)) {
textAreaWidget->SelectAll();
NS_RELEASE(textAreaWidget);
}
}
}
else {
return nsFormControlFrame::SetProperty(aName, aValue);
}
return NS_OK;
return rv;
}
NS_IMETHODIMP nsTextControlFrame::GetProperty(nsIAtom* aName, nsString& aValue)

Просмотреть файл

@ -20,7 +20,6 @@
#include "nsISupports.h"
class nsIDOMHTMLFormElement;
class nsIWidget;
#define NS_FORM_BROWSE 0
#define NS_FORM_BUTTON_BUTTON 1
@ -79,8 +78,6 @@ public:
*/
NS_IMETHOD GetType(PRInt32* aType) = 0;
NS_IMETHOD SetWidget(nsIWidget* aWidget) = 0;
NS_IMETHOD Init() = 0;
};

Просмотреть файл

@ -95,7 +95,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget) { return NS_OK; };
NS_IMETHOD Init() { return NS_OK; }
// nsIFocusableContent

Просмотреть файл

@ -75,7 +75,6 @@ public:
// nsIFormControl
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init() { return NS_OK; }
protected:
@ -262,12 +261,6 @@ nsHTMLFieldSetElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLFieldSetElement::SetWidget(nsIWidget* aWidget)
{
NS_ASSERTION(0, "Fieldset has no widget");
return NS_FORM_NOTOK;
}
NS_IMETHODIMP
nsHTMLFieldSetElement::GetStyleHintForAttributeChange(

Просмотреть файл

@ -30,13 +30,6 @@
#include "nsIHTMLAttributes.h"
#include "nsIFormControl.h"
#include "nsIForm.h"
#include "nsIWidget.h"
#include "nsITextWidget.h"
// XXX: All of the header files related to accessing widgets directly
// should be removed when all widget references are replaced with
// frame references.
#include "nsICheckButton.h"
#include "nsIRadioButton.h"
#include "nsIDocument.h"
#include "nsIPresShell.h"
#include "nsIFormControlFrame.h"
@ -50,9 +43,6 @@ static NS_DEFINE_IID(kIDOMHTMLInputElementIID, NS_IDOMHTMLINPUTELEMENT_IID);
static NS_DEFINE_IID(kIDOMHTMLFormElementIID, NS_IDOMHTMLFORMELEMENT_IID);
static NS_DEFINE_IID(kIFormIID, NS_IFORM_IID);
static NS_DEFINE_IID(kIFormControlIID, NS_IFORMCONTROL_IID);
static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID);
static NS_DEFINE_IID(kIRadioIID, NS_IRADIOBUTTON_IID);
static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID);
static NS_DEFINE_IID(kIFormControlFrameIID, NS_IFORMCONTROLFRAME_IID);
static NS_DEFINE_IID(kIFocusableContentIID, NS_IFOCUSABLECONTENT_IID);
@ -134,7 +124,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init() { return NS_OK; }
// nsIFocusableContent
@ -143,7 +132,6 @@ public:
protected:
nsGenericHTMLLeafElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
PRInt32 mType;
@ -176,14 +164,12 @@ nsHTMLInputElement::nsHTMLInputElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mType = NS_FORM_INPUT_TEXT; // default value
mForm = nsnull;
mWidget = nsnull;
//nsTraceRefcnt::Create((nsIFormControl*)this, "nsHTMLFormControlElement", __FILE__, __LINE__);
}
nsHTMLInputElement::~nsHTMLInputElement()
{
NS_IF_RELEASE(mWidget);
if (nsnull != mForm) {
// prevent mForm from decrementing its ref count on us
mForm->RemoveElement(this, PR_FALSE);
@ -333,7 +319,6 @@ nsHTMLInputElement::GetValue(nsString& aValue)
if (NS_SUCCEEDED(nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame))) {
if (nsnull != formControlFrame) {
formControlFrame->GetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -353,7 +338,6 @@ nsHTMLInputElement::SetValue(const nsString& aValue)
if (NS_SUCCEEDED(nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame))) {
if (nsnull != formControlFrame ) {
formControlFrame->SetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -374,8 +358,6 @@ nsHTMLInputElement::GetChecked(PRBool* aValue)
*aValue = PR_TRUE;
else
*aValue = PR_FALSE;
NS_RELEASE(formControlFrame);
}
}
return NS_OK;
@ -393,7 +375,6 @@ nsHTMLInputElement::SetChecked(PRBool aValue)
else {
formControlFrame->SetProperty(nsHTMLAtoms::checked, "0");
}
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -401,23 +382,27 @@ nsHTMLInputElement::SetChecked(PRBool aValue)
NS_IMETHODIMP
nsHTMLInputElement::Blur()
{
if (nsnull != mWidget) {
nsIWidget *mParentWidget = mWidget->GetParent();
if (nsnull != mParentWidget) {
mParentWidget->SetFocus();
NS_RELEASE(mParentWidget);
}
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
// Ask the frame to Deselect focus (i.e Blur).
formControlFrame->SetFocus(PR_FALSE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
nsHTMLInputElement::Focus()
{
if (nsnull != mWidget) {
mWidget->SetFocus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@ -447,18 +432,18 @@ nsHTMLInputElement::RemoveFocus(nsIPresContext* aPresContext)
return NS_OK;
}
NS_IMETHODIMP
nsHTMLInputElement::Select()
{
if ((NS_FORM_INPUT_TEXT == mType) && (nsnull != mWidget)) {
nsITextWidget *textWidget;
if (NS_OK == mWidget->QueryInterface(kITextWidgetIID, (void**)&textWidget)) {
textWidget->SelectAll();
NS_RELEASE(textWidget);
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
if (nsnull != formControlFrame ) {
formControlFrame->SetProperty(nsHTMLAtoms::select, "");
return NS_OK;
}
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@ -706,24 +691,13 @@ nsHTMLInputElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLInputElement::SetWidget(nsIWidget* aWidget)
{
if (aWidget != mWidget) {
NS_IF_RELEASE(mWidget);
NS_IF_ADDREF(aWidget);
mWidget = aWidget;
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLInputElement::GetStyleHintForAttributeChange(
const nsIAtom* aAttribute,
PRInt32 *aHint) const
{
*aHint = (nsnull != mWidget ? NS_STYLE_HINT_CONTENT : NS_STYLE_HINT_REFLOW);
*aHint = NS_STYLE_HINT_CONTENT;
return NS_OK;
}

Просмотреть файл

@ -80,7 +80,6 @@ public:
// nsIFormControl
NS_IMETHOD GetType(PRInt32* aType) { return NS_FORM_LABEL; }
NS_IMETHOD SetWidget(nsIWidget* aWidget) { return NS_OK; }
NS_IMETHOD Init() { return NS_OK; }
protected:

Просмотреть файл

@ -30,7 +30,6 @@
#include "nsIHTMLAttributes.h"
#include "nsIFormControl.h"
#include "nsIForm.h"
#include "nsIWidget.h"
#include "nsIDOMHTMLCollection.h"
#include "nsIDOMHTMLOptionElement.h"
#include "nsIFocusableContent.h"
@ -160,7 +159,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init();
NS_IMETHOD SetFocus(nsIPresContext* aPresContext);
@ -172,7 +170,6 @@ public:
protected:
nsGenericHTMLContainerElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
nsOptionList* mOptions;
};
@ -202,12 +199,10 @@ nsHTMLSelectElement::nsHTMLSelectElement(nsIAtom* aTag)
mInner.Init(this, aTag);
mOptions = nsnull;
mForm = nsnull;
mWidget = nsnull;
}
nsHTMLSelectElement::~nsHTMLSelectElement()
{
NS_IF_RELEASE(mWidget);
if (nsnull != mForm) {
// prevent mForm from decrementing its ref count on us
mForm->RemoveElement(this, PR_FALSE);
@ -480,7 +475,6 @@ nsHTMLSelectElement::SetSelectedIndex(PRInt32 aValue)
nsString value;
value.Append(aValue, 10);
formControlFrame->SetProperty(nsHTMLAtoms::selectedindex, value);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -495,23 +489,27 @@ NS_IMPL_INT_ATTR(nsHTMLSelectElement, TabIndex, tabindex)
NS_IMETHODIMP
nsHTMLSelectElement::Blur() // XXX not tested
{
if (nsnull != mWidget) {
nsIWidget *mParentWidget = mWidget->GetParent();
if (nsnull != mParentWidget) {
mParentWidget->SetFocus();
NS_RELEASE(mParentWidget);
}
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
// Ask the frame to Deselect focus (i.e Blur).
formControlFrame->SetFocus(PR_FALSE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
nsHTMLSelectElement::Focus()
{
if (nsnull != mWidget) { // XXX not tested
mWidget->SetFocus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@ -651,16 +649,6 @@ nsHTMLSelectElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLSelectElement::SetWidget(nsIWidget* aWidget)
{
if (aWidget != mWidget) {
NS_IF_RELEASE(mWidget);
NS_IF_ADDREF(aWidget);
mWidget = aWidget;
}
return NS_OK;
}
// An important assumption is that if aForm is null, the previous mForm will not be released
// This allows nsHTMLFormElement to deal with circular references.

Просмотреть файл

@ -29,8 +29,6 @@
#include "nsIStyleContext.h"
#include "nsStyleConsts.h"
#include "nsIPresContext.h"
#include "nsIWidget.h"
#include "nsITextAreaWidget.h"
#include "nsIHTMLAttributes.h"
#include "nsIFormControlFrame.h"
#include "nsIFocusableContent.h"
@ -40,7 +38,6 @@ static NS_DEFINE_IID(kIDOMHTMLTextAreaElementIID, NS_IDOMHTMLTEXTAREAELEMENT_IID
static NS_DEFINE_IID(kIDOMHTMLFormElementIID, NS_IDOMHTMLFORMELEMENT_IID);
static NS_DEFINE_IID(kIFormControlIID, NS_IFORMCONTROL_IID);
static NS_DEFINE_IID(kIFormIID, NS_IFORM_IID);
static NS_DEFINE_IID(kITextAreaWidgetIID, NS_ITEXTAREAWIDGET_IID);
static NS_DEFINE_IID(kIFocusableContentIID, NS_IFOCUSABLECONTENT_IID);
class nsHTMLTextAreaElement : public nsIDOMHTMLTextAreaElement,
@ -106,7 +103,6 @@ public:
// nsIFormControl
NS_IMETHOD SetForm(nsIDOMHTMLFormElement* aForm);
NS_IMETHOD GetType(PRInt32* aType);
NS_IMETHOD SetWidget(nsIWidget* aWidget);
NS_IMETHOD Init() { return NS_OK; }
// nsIFocusableContent
@ -115,7 +111,6 @@ public:
protected:
nsGenericHTMLContainerElement mInner;
nsIWidget* mWidget; // XXX this needs to go away when FindFrameWithContent is efficient
nsIForm* mForm;
};
@ -138,12 +133,10 @@ nsHTMLTextAreaElement::nsHTMLTextAreaElement(nsIAtom* aTag)
NS_INIT_REFCNT();
mInner.Init(this, aTag);
mForm = nsnull;
mWidget = nsnull;
}
nsHTMLTextAreaElement::~nsHTMLTextAreaElement()
{
NS_IF_RELEASE(mWidget);
if (nsnull != mForm) {
// prevent mForm from decrementing its ref count on us
mForm->RemoveElement(this, PR_FALSE);
@ -223,23 +216,27 @@ nsHTMLTextAreaElement::GetForm(nsIDOMHTMLFormElement** aForm)
NS_IMETHODIMP
nsHTMLTextAreaElement::Blur() // XXX not tested
{
if (nsnull != mWidget) {
nsIWidget *mParentWidget = mWidget->GetParent();
if (nsnull != mParentWidget) {
mParentWidget->SetFocus();
NS_RELEASE(mParentWidget);
}
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
// Ask the frame to Deselect focus (i.e Blur).
formControlFrame->SetFocus(PR_FALSE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
nsHTMLTextAreaElement::Focus() // XXX not tested
nsHTMLTextAreaElement::Focus()
{
if (nsnull != mWidget) {
mWidget->SetFocus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
return NS_OK;
return rv;
}
@ -266,16 +263,17 @@ nsHTMLTextAreaElement::RemoveFocus(nsIPresContext* aPresContext)
}
NS_IMETHODIMP
nsHTMLTextAreaElement::Select() // XXX not tested
nsHTMLTextAreaElement::Select()
{
if (nsnull != mWidget) {
nsITextAreaWidget *textWidget;
if (NS_OK == mWidget->QueryInterface(kITextAreaWidgetIID, (void**)&textWidget)) {
textWidget->SelectAll();
NS_RELEASE(textWidget);
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
if (nsnull != formControlFrame ) {
formControlFrame->SetProperty(nsHTMLAtoms::select, "");
return NS_OK;
}
}
return NS_OK;
return rv;
}
NS_IMPL_STRING_ATTR(nsHTMLTextAreaElement, AccessKey, accesskey)
@ -300,7 +298,6 @@ nsHTMLTextAreaElement::GetValue(nsString& aValue)
nsIFormControlFrame* formControlFrame = nsnull;
if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
formControlFrame->GetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
return NS_OK;
}
//XXX: Should this ASSERT instead of getting the default value here?
@ -314,7 +311,6 @@ nsHTMLTextAreaElement::SetValue(const nsString& aValue)
nsIFormControlFrame* formControlFrame = nsnull;
if (NS_OK == nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame)) {
formControlFrame->SetProperty(nsHTMLAtoms::value, aValue);
NS_RELEASE(formControlFrame);
}
return NS_OK;
}
@ -436,16 +432,6 @@ nsHTMLTextAreaElement::GetType(PRInt32* aType)
}
}
NS_IMETHODIMP
nsHTMLTextAreaElement::SetWidget(nsIWidget* aWidget)
{
if (aWidget != mWidget) {
NS_IF_RELEASE(mWidget);
NS_IF_ADDREF(aWidget);
mWidget = aWidget;
}
return NS_OK;
}
// An important assumption is that if aForm is null, the previous mForm will not be released
// This allows nsHTMLFormElement to deal with circular references.

Просмотреть файл

@ -88,7 +88,8 @@ public:
NS_IMETHOD GetFormContent(nsIContent*& aContent) const = 0;
/**
* Set a property on the form control frame
* Set a property on the form control frame.
*
* @param aName name of the property to set
* @param aValue value of the property
* @returns NS_OK if the property name is valid, otherwise an error code
@ -98,6 +99,7 @@ public:
/**
* Get a property from the form control frame
*
* @param aName name of the property to get
* @param aValue value of the property
* @returns NS_OK if the property name is valid, otherwise an error code
@ -105,7 +107,7 @@ public:
NS_IMETHOD GetProperty(nsIAtom* aName, nsString& aValue) = 0;
};

Просмотреть файл

@ -77,9 +77,12 @@ public:
// nsIFormControLFrame
NS_IMETHOD SetProperty(nsIAtom* aName, const nsString& aValue);
NS_IMETHOD GetProperty(nsIAtom* aName, nsString& aValue);
void SetFocus(PRBool aOn, PRBool aRepaint);
virtual void PostCreateWidget(nsIPresContext* aPresContext,
nscoord& aWidth,
nscoord& aHeight);
//nsTextControlFrame* GetTextFrame() { return mTextFrame; }
@ -87,7 +90,6 @@ public:
//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();

Просмотреть файл

@ -28,7 +28,6 @@
#include "nsHTMLIIDs.h"
#include "nsHTMLAtoms.h"
#include "nsIFileWidget.h"
#include "nsITextWidget.h"
#include "nsWidgetsCID.h"
#include "nsIComponentManager.h"
#include "nsIView.h"
@ -43,7 +42,6 @@
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(kIDOMHTMLInputElementIID, NS_IDOMHTMLINPUTELEMENT_IID);
@ -142,19 +140,8 @@ void nsFileControlFrame::MouseClicked(nsIPresContext* aPresContext)
if (nsnull == textView) {
return;
}
nsIWidget* widget;
mTextFrame->GetWidget(&widget);
if (!widget) {
return;
}
nsITextWidget* textWidget;
nsresult result = widget->QueryInterface(kITextWidgetIID, (void**)&textWidget);
if (NS_OK != result) {
NS_RELEASE(widget);
return;
}
nsresult result = NS_OK;
nsIView* parentView;
textView->GetParent(parentView);
nsIWidget* parentWidget = GetWindowTemp(parentView);
@ -174,16 +161,13 @@ void nsFileControlFrame::MouseClicked(nsIPresContext* aPresContext)
result = fileWidget->Show();
if (result) {
PRUint32 size;
nsString fileName;
fileWidget->GetFile(fileName);
textWidget->SetText(fileName,size);
mTextFrame->SetProperty(nsHTMLAtoms::value,fileName);
}
NS_RELEASE(fileWidget);
}
NS_RELEASE(parentWidget);
NS_RELEASE(textWidget);
NS_RELEASE(widget);
}
@ -348,17 +332,12 @@ nsFileControlFrame::GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
// 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);
if (NS_SUCCEEDED(mTextFrame->GetProperty(nsHTMLAtoms::value, aValues[0]))) {
aNumValues = 1;
NS_RELEASE(textWidget);
status = PR_TRUE;
}
NS_IF_RELEASE(widget);
return status;
}
@ -468,12 +447,14 @@ nsFileControlFrame::Paint(nsIPresContext& aPresContext,
if (HasWidget())
return NS_OK;
nsAutoString browse("Browse...");
nsRect rect;
mBrowseFrame->GetRect(rect);
mBrowseFrame->PaintButton(aPresContext, aRenderingContext, aDirtyRect,
browse, rect);
mTextFrame->PaintTextControlBackground(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {

Просмотреть файл

@ -299,15 +299,7 @@ nsFormControlFrame::Reflow(nsIPresContext& aPresContext,
// set our widget
result = GetWidget(view, &mWidget);
if ((NS_OK == result) && mWidget) { // keep the ref on mWidget
nsIFormControl* formControl = nsnull;
result = mContent->QueryInterface(kIFormControlIID, (void**)&formControl);
if ((NS_OK == result) && formControl) {
// set the content's widget, so it can get content modified by the widget
formControl->SetWidget(mWidget);
NS_RELEASE(formControl);
}
} else {
if ((PR_FALSE == NS_SUCCEEDED(result)) || (nsnull == mWidget)) { // keep the ref on mWidget
NS_ASSERTION(0, "could not get widget");
}
}

Просмотреть файл

@ -198,6 +198,8 @@ nsIFrame* nsListControlFrame::GetNextSelectableFrame(nsVoidArray *aList, PRInt32
}
//----------------------------------------------------------------------
NS_IMETHODIMP
nsListControlFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
@ -214,7 +216,12 @@ nsListControlFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
rv = GetFrameForPointUsing(aPoint, nsnull, aFrame);
if (NS_OK == rv) {
if (*aFrame != this) {
mHitFrame = *aFrame;
*aFrame = GetSelectableFrame(*aFrame);
if (nsnull == *aFrame) {
mHitFrame = this;
} else {
mHitFrame = *aFrame;
}
*aFrame = this;
}
return NS_OK;
@ -591,6 +598,50 @@ nsListControlFrame::GetFont(nsIPresContext* aPresContext,
}
PRBool nsListControlFrame::IsOptionElement(nsIContent* aContent)
{
PRBool result = PR_FALSE;
nsIDOMHTMLOptionElement* oe = nsnull;
if (NS_SUCCEEDED(aContent->QueryInterface(kIDOMHTMLOptionElementIID, (void**) &oe))) {
if (oe != nsnull) {
result = PR_TRUE;
NS_RELEASE(oe);
}
}
return result;
}
PRBool nsListControlFrame::IsOptionElementFrame(nsIFrame *aFrame)
{
nsIContent *content = nsnull;
aFrame->GetContent(&content);
PRBool result = PR_FALSE;
if (nsnull != content) {
result = IsOptionElement(content);
NS_RELEASE(content);
}
return(result);
}
// Go up the frame tree looking for the first ancestor that has content
// which is selectable
nsIFrame *nsListControlFrame::GetSelectableFrame(nsIFrame *aFrame)
{
nsIFrame* selectedFrame = aFrame;
while ((nsnull != selectedFrame) &&
(PR_FALSE ==IsOptionElementFrame(selectedFrame))) {
selectedFrame->GetParent(&selectedFrame);
}
return(selectedFrame);
}
void nsListControlFrame::ForceRedraw(nsIContent* aContent)
{
//XXX: Hack. This should not be needed. The problem is DisplaySelected
@ -728,6 +779,39 @@ void nsListControlFrame::ExtendedSelection(PRInt32 aStartIndex, PRInt32 aEndInde
void nsListControlFrame::SingleSelection()
{
//XXX: Experimental code for supporting option groups
#if 0
// Donothing if a item was not clicked on
if (this == mHitFrame)
return;
// Store previous selection
nsIFrame* oldSelectedFrame = mSelectedFrame;
// Get Current selection
mSelectedFrame = mHitFrame;
if (mSelectedFrame != nsnull) {
if (oldSelectedFrame != mSelectedFrame) {
// Deselect the previous selection if there is one
if (oldSelectedFrame != nsnull) {
nsIContent* content = nsnull;
oldSelectedFrame->GetContent(&content);
DisplayDeselected(content);
NS_RELEASE(content);
}
// Display the new selection
nsIContent* content = nsnull;
mSelectedFrame->GetContent(&content);
DisplaySelected(content);
NS_RELEASE(content);
mSelectedContent = mHitContent;
} else {
// Selecting the currently selected item so do nothing.
}
}
#endif
//XXX: Endof experimental code
// Store previous selection
PRInt32 oldSelectedIndex = mSelectedIndex;
// Get Current selection
@ -738,13 +822,14 @@ void nsListControlFrame::SingleSelection()
if (oldSelectedIndex != kNothingSelected) {
SetFrameSelected(oldSelectedIndex, PR_FALSE);
}
// Dipslay the new selection
// Display the new selection
SetFrameSelected(mSelectedIndex, PR_TRUE);
mSelectedContent = mHitContent;
} else {
// Selecting the currently selected item so do nothing.
}
}
}
void nsListControlFrame::MultipleSelection(PRBool aIsShift, PRBool aIsControl)

Просмотреть файл

@ -173,6 +173,9 @@ protected:
// Utility methods
PRBool IsOptionElement(nsIContent* aContent);
PRBool IsOptionElementFrame(nsIFrame *aFrame);
nsIFrame *GetSelectableFrame(nsIFrame *aFrame);
void DisplaySelected(nsIContent* aContent);
void DisplayDeselected(nsIContent* aContent);
void UpdateItem(nsIContent* aContent, PRBool aSelected);
@ -220,6 +223,7 @@ protected:
nsIFrame * mCurrentHitFrame;
nsIContent * mCurrentHitContent;
nsIContent * mSelectedContent;
nsIFrame * mSelectedFrame;
PRBool mIsInitializedFromContent;
nsIFrame * mContentFrame;
PRBool mInDropDownMode;

Просмотреть файл

@ -857,13 +857,30 @@ void nsTextControlFrame::SetTextControlFrameState(const nsString& aValue)
NS_IMETHODIMP nsTextControlFrame::SetProperty(nsIAtom* aName, const nsString& aValue)
{
nsresult rv = NS_OK;
if (nsHTMLAtoms::value == aName) {
SetTextControlFrameState(aValue);
} else if (nsHTMLAtoms::select == aName) {
if (nsnull != mWidget) {
nsITextWidget *textWidget;
rv = mWidget->QueryInterface(kITextWidgetIID, (void**)&textWidget);
if (NS_SUCCEEDED(rv)) {
textWidget->SelectAll();
NS_RELEASE(textWidget);
}
nsITextAreaWidget *textAreaWidget;
rv = mWidget->QueryInterface(kITextAreaWidgetIID, (void**)&textAreaWidget);
if (NS_SUCCEEDED(rv)) {
textAreaWidget->SelectAll();
NS_RELEASE(textAreaWidget);
}
}
}
else {
return nsFormControlFrame::SetProperty(aName, aValue);
}
return NS_OK;
return rv;
}
NS_IMETHODIMP nsTextControlFrame::GetProperty(nsIAtom* aName, nsString& aValue)