Completely changed the way focus is handled, both from JS and from the events mgr notifications.

These changes do not help the problems we have with gfxtextfields because they have an embbeded wehshell with a native window
This commit is contained in:
rods%netscape.com 1999-09-30 11:57:45 +00:00
Родитель 2036813036
Коммит 3ff1376604
2 изменённых файлов: 134 добавлений и 30 удалений

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

@ -138,6 +138,8 @@ protected:
nsIForm* mForm;
PRInt32 mType;
NS_IMETHOD GetPresContext(nsIPresContext ** aPresContext);
PRBool IsImage() const {
nsAutoString tmp;
mInner.GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::type, tmp);
@ -437,15 +439,51 @@ nsHTMLInputElement::SetChecked(PRBool aValue)
return NS_OK;
}
NS_IMETHODIMP
nsHTMLInputElement::GetPresContext(nsIPresContext ** aPresContext)
{
if (nsnull == aPresContext) {
return NS_ERROR_FAILURE;
}
*aPresContext = nsnull;
nsIDocument* doc;
nsresult rv = GetDocument(doc);
if (nsnull != doc) {
nsIPresShell* presShell = doc->GetShellAt(0);
if (nsnull != presShell) {
rv = presShell->GetPresContext(aPresContext);
NS_RELEASE(presShell);
}
NS_RELEASE(doc);
}
return rv;
}
NS_IMETHODIMP
nsHTMLInputElement::Blur()
{
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;
nsIPresContext * context;
nsresult rv = GetPresContext(&context);
if (NS_SUCCEEDED(rv) && nsnull != context) {
nsIEventStateManager* esm;
if (NS_OK == context->GetEventStateManager(&esm)) {
nsIContent * focusedContent;
nsIContent * content;
rv = QueryInterface(nsIContent::GetIID(), (void **)&content);
if (NS_SUCCEEDED(rv) && nsnull != content) {
esm->GetFocusedContent(&focusedContent);
if (nsnull != focusedContent && content == focusedContent) {
rv = esm->SetContentState(nsnull, NS_EVENT_STATE_FOCUS);
NS_RELEASE(focusedContent);
}
NS_RELEASE(content);
}
NS_RELEASE(esm);
}
NS_RELEASE(context);
}
return rv;
}
@ -453,12 +491,13 @@ nsHTMLInputElement::Blur()
NS_IMETHODIMP
nsHTMLInputElement::Focus()
{
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
nsIPresContext * context;
nsresult rv = GetPresContext(&context);
if (NS_SUCCEEDED(rv) && nsnull != context) {
SetFocus(context);
NS_RELEASE(context);
}
return rv;
}
@ -477,14 +516,14 @@ nsHTMLInputElement::SetFocus(nsIPresContext* aPresContext)
NS_RELEASE(esm);
}
// XXX Should focus only this presContext
Focus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
formControlFrame->ScrollIntoView(aPresContext);
return NS_OK;
}
return rv;
}
@ -492,7 +531,7 @@ NS_IMETHODIMP
nsHTMLInputElement::RemoveFocus(nsIPresContext* aPresContext)
{
// XXX Should focus only this presContext
Blur();
//Blur();
return NS_OK;
}
@ -551,6 +590,19 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext& aPresContext,
if ((NS_OK == ret) && (nsEventStatus_eIgnore == aEventStatus)) {
switch (aEvent->message) {
case NS_FOCUS_CONTENT:
{
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
//SetFocus(&aPresContext);
}
break;
case NS_KEY_PRESS:
{
nsKeyEvent * keyEvent = (nsKeyEvent *)aEvent;

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

@ -138,6 +138,8 @@ protected:
nsIForm* mForm;
PRInt32 mType;
NS_IMETHOD GetPresContext(nsIPresContext ** aPresContext);
PRBool IsImage() const {
nsAutoString tmp;
mInner.GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::type, tmp);
@ -437,15 +439,51 @@ nsHTMLInputElement::SetChecked(PRBool aValue)
return NS_OK;
}
NS_IMETHODIMP
nsHTMLInputElement::GetPresContext(nsIPresContext ** aPresContext)
{
if (nsnull == aPresContext) {
return NS_ERROR_FAILURE;
}
*aPresContext = nsnull;
nsIDocument* doc;
nsresult rv = GetDocument(doc);
if (nsnull != doc) {
nsIPresShell* presShell = doc->GetShellAt(0);
if (nsnull != presShell) {
rv = presShell->GetPresContext(aPresContext);
NS_RELEASE(presShell);
}
NS_RELEASE(doc);
}
return rv;
}
NS_IMETHODIMP
nsHTMLInputElement::Blur()
{
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;
nsIPresContext * context;
nsresult rv = GetPresContext(&context);
if (NS_SUCCEEDED(rv) && nsnull != context) {
nsIEventStateManager* esm;
if (NS_OK == context->GetEventStateManager(&esm)) {
nsIContent * focusedContent;
nsIContent * content;
rv = QueryInterface(nsIContent::GetIID(), (void **)&content);
if (NS_SUCCEEDED(rv) && nsnull != content) {
esm->GetFocusedContent(&focusedContent);
if (nsnull != focusedContent && content == focusedContent) {
rv = esm->SetContentState(nsnull, NS_EVENT_STATE_FOCUS);
NS_RELEASE(focusedContent);
}
NS_RELEASE(content);
}
NS_RELEASE(esm);
}
NS_RELEASE(context);
}
return rv;
}
@ -453,12 +491,13 @@ nsHTMLInputElement::Blur()
NS_IMETHODIMP
nsHTMLInputElement::Focus()
{
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
nsIPresContext * context;
nsresult rv = GetPresContext(&context);
if (NS_SUCCEEDED(rv) && nsnull != context) {
SetFocus(context);
NS_RELEASE(context);
}
return rv;
}
@ -477,14 +516,14 @@ nsHTMLInputElement::SetFocus(nsIPresContext* aPresContext)
NS_RELEASE(esm);
}
// XXX Should focus only this presContext
Focus();
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
formControlFrame->ScrollIntoView(aPresContext);
return NS_OK;
}
return rv;
}
@ -492,7 +531,7 @@ NS_IMETHODIMP
nsHTMLInputElement::RemoveFocus(nsIPresContext* aPresContext)
{
// XXX Should focus only this presContext
Blur();
//Blur();
return NS_OK;
}
@ -551,6 +590,19 @@ nsHTMLInputElement::HandleDOMEvent(nsIPresContext& aPresContext,
if ((NS_OK == ret) && (nsEventStatus_eIgnore == aEventStatus)) {
switch (aEvent->message) {
case NS_FOCUS_CONTENT:
{
nsIFormControlFrame* formControlFrame = nsnull;
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv)) {
formControlFrame->SetFocus(PR_TRUE, PR_TRUE);
return NS_OK;
}
//SetFocus(&aPresContext);
}
break;
case NS_KEY_PRESS:
{
nsKeyEvent * keyEvent = (nsKeyEvent *)aEvent;