From 975786079e510b014666ebfd5e9e991381269495 Mon Sep 17 00:00:00 2001 From: "pollmann%netscape.com" Date: Tue, 14 Sep 1999 19:28:45 +0000 Subject: [PATCH] Bug 13058: Implement nsIStatefulFrame for file inputs, cache value until child textbox is created, and misc cleanups. git-svn-id: svn://10.0.0.236/trunk@47361 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/forms/nsFileControlFrame.cpp | 91 ++++++++++++++++--- mozilla/layout/forms/nsFileControlFrame.h | 10 +- .../html/forms/src/nsFileControlFrame.cpp | 91 ++++++++++++++++--- .../html/forms/src/nsFileControlFrame.h | 10 +- 4 files changed, 172 insertions(+), 30 deletions(-) diff --git a/mozilla/layout/forms/nsFileControlFrame.cpp b/mozilla/layout/forms/nsFileControlFrame.cpp index b9db0c8aa0e..d770233fec6 100644 --- a/mozilla/layout/forms/nsFileControlFrame.cpp +++ b/mozilla/layout/forms/nsFileControlFrame.cpp @@ -45,7 +45,9 @@ #include "nsIDOMMouseListener.h" #include "nsIPresShell.h" #include "nsIDOMHTMLInputElement.h" - +#include "nsIStatefulFrame.h" +#include "nsISupportsPrimitives.h" +#include "nsIComponentManager.h" static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID); static NS_DEFINE_IID(kIFileWidgetIID, NS_IFILEWIDGET_IID); @@ -76,11 +78,16 @@ nsFileControlFrame::nsFileControlFrame(): { //Shrink the area around it's contents SetFlags(NS_BLOCK_SHRINK_WRAP); + mCachedState = nsnull; } nsFileControlFrame::~nsFileControlFrame() { NS_IF_RELEASE(mTextContent); + if (mCachedState) { + delete mCachedState; + mCachedState = nsnull; + } } NS_IMETHODIMP @@ -121,25 +128,28 @@ nsFileControlFrame::CreateAnonymousContent(nsISupportsArray& aChildList) return NS_OK; } -nsresult +NS_IMETHODIMP nsFileControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) { NS_PRECONDITION(0 != aInstancePtr, "null ptr"); if (NULL == aInstancePtr) { return NS_ERROR_NULL_POINTER; - } else if (aIID.Equals(kIAnonymousContentCreatorIID)) { - *aInstancePtr = (void*)(nsIAnonymousContentCreator*) this; - NS_ADDREF_THIS(); - return NS_OK; + } else if (aIID.Equals(kIAnonymousContentCreatorIID)) { + *aInstancePtr = (void*)(nsIAnonymousContentCreator*) this; + NS_ADDREF_THIS(); + return NS_OK; } else if (aIID.Equals(kIFormControlFrameIID)) { *aInstancePtr = (void*) ((nsIFormControlFrame*) this); return NS_OK; - } else if (aIID.Equals(kIDOMMouseListenerIID)) { - *aInstancePtr = (void*)(nsIDOMMouseListener*) this; - NS_ADDREF_THIS(); - return NS_OK; - } - + } else if (aIID.Equals(kIDOMMouseListenerIID)) { + *aInstancePtr = (void*)(nsIDOMMouseListener*) this; + NS_ADDREF_THIS(); + return NS_OK; + } else if (aIID.Equals(NS_GET_IID(nsIStatefulFrame))) { + *aInstancePtr = (void*)(nsIStatefulFrame*) this; + NS_ADDREF_THIS(); + return NS_OK; + } return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr); } @@ -260,6 +270,12 @@ NS_IMETHODIMP nsFileControlFrame::Reflow(nsIPresContext& aPresContext, // add ourself as an nsIFormControlFrame nsFormFrame::AddFormControlFrame(aPresContext, *this); mTextFrame = GetTextControlFrame(this); + if (!mTextFrame) return NS_ERROR_UNEXPECTED; + if (mCachedState) { + mTextFrame->SetProperty(nsHTMLAtoms::value, *mCachedState); + delete mCachedState; + mCachedState = nsnull; + } } return nsAreaFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); @@ -291,7 +307,7 @@ nsFileControlFrame::GetTextControlFrame(nsIFrame* aStart) nsIFrame* childFrame = nsnull; aStart->FirstChild(nsnull, &childFrame); - while (nsnull != childFrame) { + while (childFrame) { // see if the child is a text control nsCOMPtr content; childFrame->GetContent(getter_AddRefs(content)); @@ -308,7 +324,7 @@ nsFileControlFrame::GetTextControlFrame(nsIFrame* aStart) // if not continue looking nsTextControlFrame* frame = GetTextControlFrame(childFrame); - if (frame != nsnull) + if (frame) return frame; nsresult rv = childFrame->GetNextSibling(&childFrame); @@ -486,3 +502,50 @@ nsFileControlFrame::Paint(nsIPresContext& aPresContext, { return nsAreaFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); } + +//---------------------------------------------------------------------- +// nsIStatefulFrame +//---------------------------------------------------------------------- +NS_IMETHODIMP +nsFileControlFrame::GetStateType(StateType* aStateType) +{ + *aStateType = eFileType; + return NS_OK; +} + +NS_IMETHODIMP +nsFileControlFrame::SaveState(nsISupports** aState) +{ + nsISupportsString* value = nsnull; + nsAutoString string; + nsresult res = mTextFrame->GetProperty(nsHTMLAtoms::value, string); + if (NS_SUCCEEDED(res)) { + char* chars = string.ToNewCString(); + if (chars) { + res = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull, + NS_GET_IID(nsISupportsString), (void**)&value); + if (NS_SUCCEEDED(res) && value) { + value->SetData(chars); + } + nsCRT::free(chars); + } else { + res = NS_ERROR_OUT_OF_MEMORY; + } + } + *aState = (nsISupports*)value; + return res; +} + +NS_IMETHODIMP +nsFileControlFrame::RestoreState(nsISupports* aState) +{ + char* chars = nsnull; + nsresult res = ((nsISupportsString*)aState)->GetData(&chars); + if (NS_SUCCEEDED(res) && chars) { + // Don't poke mTextFrame, it's not there yet. + mCachedState = new nsString(chars); + if (!mCachedState) res = NS_ERROR_OUT_OF_MEMORY; + nsCRT::free(chars); + } + return res; +} diff --git a/mozilla/layout/forms/nsFileControlFrame.h b/mozilla/layout/forms/nsFileControlFrame.h index a49ab236f33..12efcab41ca 100644 --- a/mozilla/layout/forms/nsFileControlFrame.h +++ b/mozilla/layout/forms/nsFileControlFrame.h @@ -23,6 +23,7 @@ #include "nsIFormControlFrame.h" #include "nsIDOMMouseListener.h" #include "nsIAnonymousContentCreator.h" +#include "nsIStatefulFrame.h" class nsButtonControlFrame; class nsTextControlFrame; @@ -33,7 +34,8 @@ class nsIHTMLContent; class nsFileControlFrame : public nsAreaFrame, public nsIFormControlFrame, public nsIDOMMouseListener, - public nsIAnonymousContentCreator + public nsIAnonymousContentCreator, + public nsIStatefulFrame { public: @@ -144,6 +146,11 @@ public: virtual nsresult HandleEvent(nsIDOMEvent* aEvent) { return NS_OK; } + //nsIStatefulFrame + NS_IMETHOD GetStateType(StateType* aStateType); + NS_IMETHOD SaveState(nsISupports** aState); + NS_IMETHOD RestoreState(nsISupports* aState); + protected: nsIWidget* GetWindowTemp(nsIView *aView); // XXX temporary @@ -152,6 +159,7 @@ protected: nsTextControlFrame* mTextFrame; nsFormFrame* mFormFrame; nsIHTMLContent* mTextContent; + nsString* mCachedState; private: nsTextControlFrame* GetTextControlFrame(nsIFrame* aStart); diff --git a/mozilla/layout/html/forms/src/nsFileControlFrame.cpp b/mozilla/layout/html/forms/src/nsFileControlFrame.cpp index b9db0c8aa0e..d770233fec6 100644 --- a/mozilla/layout/html/forms/src/nsFileControlFrame.cpp +++ b/mozilla/layout/html/forms/src/nsFileControlFrame.cpp @@ -45,7 +45,9 @@ #include "nsIDOMMouseListener.h" #include "nsIPresShell.h" #include "nsIDOMHTMLInputElement.h" - +#include "nsIStatefulFrame.h" +#include "nsISupportsPrimitives.h" +#include "nsIComponentManager.h" static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID); static NS_DEFINE_IID(kIFileWidgetIID, NS_IFILEWIDGET_IID); @@ -76,11 +78,16 @@ nsFileControlFrame::nsFileControlFrame(): { //Shrink the area around it's contents SetFlags(NS_BLOCK_SHRINK_WRAP); + mCachedState = nsnull; } nsFileControlFrame::~nsFileControlFrame() { NS_IF_RELEASE(mTextContent); + if (mCachedState) { + delete mCachedState; + mCachedState = nsnull; + } } NS_IMETHODIMP @@ -121,25 +128,28 @@ nsFileControlFrame::CreateAnonymousContent(nsISupportsArray& aChildList) return NS_OK; } -nsresult +NS_IMETHODIMP nsFileControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) { NS_PRECONDITION(0 != aInstancePtr, "null ptr"); if (NULL == aInstancePtr) { return NS_ERROR_NULL_POINTER; - } else if (aIID.Equals(kIAnonymousContentCreatorIID)) { - *aInstancePtr = (void*)(nsIAnonymousContentCreator*) this; - NS_ADDREF_THIS(); - return NS_OK; + } else if (aIID.Equals(kIAnonymousContentCreatorIID)) { + *aInstancePtr = (void*)(nsIAnonymousContentCreator*) this; + NS_ADDREF_THIS(); + return NS_OK; } else if (aIID.Equals(kIFormControlFrameIID)) { *aInstancePtr = (void*) ((nsIFormControlFrame*) this); return NS_OK; - } else if (aIID.Equals(kIDOMMouseListenerIID)) { - *aInstancePtr = (void*)(nsIDOMMouseListener*) this; - NS_ADDREF_THIS(); - return NS_OK; - } - + } else if (aIID.Equals(kIDOMMouseListenerIID)) { + *aInstancePtr = (void*)(nsIDOMMouseListener*) this; + NS_ADDREF_THIS(); + return NS_OK; + } else if (aIID.Equals(NS_GET_IID(nsIStatefulFrame))) { + *aInstancePtr = (void*)(nsIStatefulFrame*) this; + NS_ADDREF_THIS(); + return NS_OK; + } return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr); } @@ -260,6 +270,12 @@ NS_IMETHODIMP nsFileControlFrame::Reflow(nsIPresContext& aPresContext, // add ourself as an nsIFormControlFrame nsFormFrame::AddFormControlFrame(aPresContext, *this); mTextFrame = GetTextControlFrame(this); + if (!mTextFrame) return NS_ERROR_UNEXPECTED; + if (mCachedState) { + mTextFrame->SetProperty(nsHTMLAtoms::value, *mCachedState); + delete mCachedState; + mCachedState = nsnull; + } } return nsAreaFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); @@ -291,7 +307,7 @@ nsFileControlFrame::GetTextControlFrame(nsIFrame* aStart) nsIFrame* childFrame = nsnull; aStart->FirstChild(nsnull, &childFrame); - while (nsnull != childFrame) { + while (childFrame) { // see if the child is a text control nsCOMPtr content; childFrame->GetContent(getter_AddRefs(content)); @@ -308,7 +324,7 @@ nsFileControlFrame::GetTextControlFrame(nsIFrame* aStart) // if not continue looking nsTextControlFrame* frame = GetTextControlFrame(childFrame); - if (frame != nsnull) + if (frame) return frame; nsresult rv = childFrame->GetNextSibling(&childFrame); @@ -486,3 +502,50 @@ nsFileControlFrame::Paint(nsIPresContext& aPresContext, { return nsAreaFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); } + +//---------------------------------------------------------------------- +// nsIStatefulFrame +//---------------------------------------------------------------------- +NS_IMETHODIMP +nsFileControlFrame::GetStateType(StateType* aStateType) +{ + *aStateType = eFileType; + return NS_OK; +} + +NS_IMETHODIMP +nsFileControlFrame::SaveState(nsISupports** aState) +{ + nsISupportsString* value = nsnull; + nsAutoString string; + nsresult res = mTextFrame->GetProperty(nsHTMLAtoms::value, string); + if (NS_SUCCEEDED(res)) { + char* chars = string.ToNewCString(); + if (chars) { + res = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull, + NS_GET_IID(nsISupportsString), (void**)&value); + if (NS_SUCCEEDED(res) && value) { + value->SetData(chars); + } + nsCRT::free(chars); + } else { + res = NS_ERROR_OUT_OF_MEMORY; + } + } + *aState = (nsISupports*)value; + return res; +} + +NS_IMETHODIMP +nsFileControlFrame::RestoreState(nsISupports* aState) +{ + char* chars = nsnull; + nsresult res = ((nsISupportsString*)aState)->GetData(&chars); + if (NS_SUCCEEDED(res) && chars) { + // Don't poke mTextFrame, it's not there yet. + mCachedState = new nsString(chars); + if (!mCachedState) res = NS_ERROR_OUT_OF_MEMORY; + nsCRT::free(chars); + } + return res; +} diff --git a/mozilla/layout/html/forms/src/nsFileControlFrame.h b/mozilla/layout/html/forms/src/nsFileControlFrame.h index a49ab236f33..12efcab41ca 100644 --- a/mozilla/layout/html/forms/src/nsFileControlFrame.h +++ b/mozilla/layout/html/forms/src/nsFileControlFrame.h @@ -23,6 +23,7 @@ #include "nsIFormControlFrame.h" #include "nsIDOMMouseListener.h" #include "nsIAnonymousContentCreator.h" +#include "nsIStatefulFrame.h" class nsButtonControlFrame; class nsTextControlFrame; @@ -33,7 +34,8 @@ class nsIHTMLContent; class nsFileControlFrame : public nsAreaFrame, public nsIFormControlFrame, public nsIDOMMouseListener, - public nsIAnonymousContentCreator + public nsIAnonymousContentCreator, + public nsIStatefulFrame { public: @@ -144,6 +146,11 @@ public: virtual nsresult HandleEvent(nsIDOMEvent* aEvent) { return NS_OK; } + //nsIStatefulFrame + NS_IMETHOD GetStateType(StateType* aStateType); + NS_IMETHOD SaveState(nsISupports** aState); + NS_IMETHOD RestoreState(nsISupports* aState); + protected: nsIWidget* GetWindowTemp(nsIView *aView); // XXX temporary @@ -152,6 +159,7 @@ protected: nsTextControlFrame* mTextFrame; nsFormFrame* mFormFrame; nsIHTMLContent* mTextContent; + nsString* mCachedState; private: nsTextControlFrame* GetTextControlFrame(nsIFrame* aStart);