From e2d1d73278e3da5b75ea89f6e315ac5da3c73143 Mon Sep 17 00:00:00 2001 From: "mjudge%netscape.com" Date: Mon, 13 Sep 1999 22:19:31 +0000 Subject: [PATCH] fixes for selection. up/down arrow behavior and also extending selection. all should be in peek offset ect. Also adding in a slight change to the hack (which should go away soon) that will stop the editor from scrolling when up/down left/right ect are clicked. when key events go in this code will be removed --- layout/base/nsPresShell.cpp | 19 ++++++++++++------- layout/base/src/nsRangeList.cpp | 20 ++++++++++++++++---- layout/generic/nsTextFrame.cpp | 7 +++++-- layout/html/base/src/nsPresShell.cpp | 19 ++++++++++++------- layout/html/base/src/nsTextFrame.cpp | 7 +++++-- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index cbf03a5e3ced..835093fe00a9 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -1943,6 +1943,18 @@ PresShell::HandleEvent(nsIView *aView, aView->GetClientData(clientData); frame = (nsIFrame *)clientData; + if (mSelection && aEvent->eventStructType == NS_KEY_EVENT) + {//KEY HANDLERS WILL GET RID OF THIS + mSelection->EnableFrameNotification(PR_FALSE); + if (mDisplayNonTextSelection && NS_SUCCEEDED(mSelection->HandleKeyEvent(aEvent))) + { + mSelection->EnableFrameNotification(PR_TRUE); //prevents secondary reset selection called since + return NS_OK; + } + mSelection->EnableFrameNotification(PR_TRUE); //prevents secondary reset selection called since + //we are a listener now. + } + if (nsnull != frame) { PushCurrentEventFrame(); @@ -1956,13 +1968,6 @@ PresShell::HandleEvent(nsIView *aView, NS_RELEASE(container); } - if (mSelection && aEvent->eventStructType == NS_KEY_EVENT) - { - mSelection->EnableFrameNotification(PR_FALSE); - mSelection->HandleKeyEvent(aEvent); - mSelection->EnableFrameNotification(PR_TRUE); //prevents secondary reset selection called since - //we are a listener now. - } nsIEventStateManager *manager; nsIContent* focusContent = nsnull; if (NS_OK == mPresContext->GetEventStateManager(&manager)) { diff --git a/layout/base/src/nsRangeList.cpp b/layout/base/src/nsRangeList.cpp index df5ff9de5dbf..06f8d350e3d2 100644 --- a/layout/base/src/nsRangeList.cpp +++ b/layout/base/src/nsRangeList.cpp @@ -729,9 +729,21 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent) return NS_ERROR_NULL_POINTER; STATUS_CHECK_RETURN_MACRO(); - nsresult result = NS_OK; + nsresult result = NS_ERROR_FAILURE; if (NS_KEY_DOWN == aGuiEvent->message) { nsKeyEvent *keyEvent = (nsKeyEvent *)aGuiEvent; //this is ok. It really is a keyevent + switch (keyEvent->keyCode) + { + case nsIDOMUIEvent::VK_LEFT : + case nsIDOMUIEvent::VK_UP : + case nsIDOMUIEvent::VK_DOWN : + case nsIDOMUIEvent::VK_RIGHT : + case nsIDOMUIEvent::VK_HOME : + case nsIDOMUIEvent::VK_END : + break; + default: + return NS_ERROR_FAILURE; + } nsCOMPtr weakNodeUsed; PRInt32 offsetused = 0; nsSelectionAmount amount = eSelectCharacter; @@ -815,7 +827,7 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent) InvalidateDesiredX(); mHint = HINTLEFT;//stick to this line break; - default :return result; + default :return NS_ERROR_FAILURE; } if (NS_SUCCEEDED(result) && NS_SUCCEEDED(frame->PeekOffset(&pos)) && pos.mResultContent) result = TakeFocus(pos.mResultContent, pos.mContentOffset, pos.mContentOffset, keyEvent->isShift, PR_FALSE); @@ -1623,7 +1635,7 @@ nsDOMSelection::GetPrimaryFrameForFocusNode(nsIFrame **aReturnFrame) *aReturnFrame = 0; - nsCOMPtr content = do_QueryInterface(FetchAnchorNode()); + nsCOMPtr content = do_QueryInterface(FetchFocusNode()); if (content) return mRangeList->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame); return NS_ERROR_FAILURE; @@ -2391,7 +2403,7 @@ nsDOMSelection::Extend(nsIDOMNode* aParentNode, PRInt32 aOffset) // First, find the range containing the old focus point: if (!mRangeArray || !mAnchorFocusRange) return NS_ERROR_NOT_INITIALIZED; - mRangeList->InvalidateDesiredX(); + //mRangeList->InvalidateDesiredX(); nsCOMPtr difRange; nsresult res; res = nsComponentManager::CreateInstance(kRangeCID, nsnull, diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 4d5b1fe8ba65..31fcad6ad827 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -1935,11 +1935,14 @@ nsTextFrame::GetChildFrameContainingOffset(PRInt32 inContentOffset, nsIFrame *nextInFlow; nextInFlow = GetNextInFlow(); if (nextInFlow) + { return nextInFlow->GetChildFrameContainingOffset(inContentOffset, inHint, outFrameContentOffset, outChildFrame); - else + } + else if (contentOffset != mContentLength) //that condition was only for when there is a choice return NS_ERROR_FAILURE; } - else if (inContentOffset < mContentOffset) //could happen with floaters! + + if (inContentOffset < mContentOffset) //could happen with floaters! { result = GetPrevInFlow(outChildFrame); if (NS_SUCCEEDED(result)) diff --git a/layout/html/base/src/nsPresShell.cpp b/layout/html/base/src/nsPresShell.cpp index cbf03a5e3ced..835093fe00a9 100644 --- a/layout/html/base/src/nsPresShell.cpp +++ b/layout/html/base/src/nsPresShell.cpp @@ -1943,6 +1943,18 @@ PresShell::HandleEvent(nsIView *aView, aView->GetClientData(clientData); frame = (nsIFrame *)clientData; + if (mSelection && aEvent->eventStructType == NS_KEY_EVENT) + {//KEY HANDLERS WILL GET RID OF THIS + mSelection->EnableFrameNotification(PR_FALSE); + if (mDisplayNonTextSelection && NS_SUCCEEDED(mSelection->HandleKeyEvent(aEvent))) + { + mSelection->EnableFrameNotification(PR_TRUE); //prevents secondary reset selection called since + return NS_OK; + } + mSelection->EnableFrameNotification(PR_TRUE); //prevents secondary reset selection called since + //we are a listener now. + } + if (nsnull != frame) { PushCurrentEventFrame(); @@ -1956,13 +1968,6 @@ PresShell::HandleEvent(nsIView *aView, NS_RELEASE(container); } - if (mSelection && aEvent->eventStructType == NS_KEY_EVENT) - { - mSelection->EnableFrameNotification(PR_FALSE); - mSelection->HandleKeyEvent(aEvent); - mSelection->EnableFrameNotification(PR_TRUE); //prevents secondary reset selection called since - //we are a listener now. - } nsIEventStateManager *manager; nsIContent* focusContent = nsnull; if (NS_OK == mPresContext->GetEventStateManager(&manager)) { diff --git a/layout/html/base/src/nsTextFrame.cpp b/layout/html/base/src/nsTextFrame.cpp index 4d5b1fe8ba65..31fcad6ad827 100644 --- a/layout/html/base/src/nsTextFrame.cpp +++ b/layout/html/base/src/nsTextFrame.cpp @@ -1935,11 +1935,14 @@ nsTextFrame::GetChildFrameContainingOffset(PRInt32 inContentOffset, nsIFrame *nextInFlow; nextInFlow = GetNextInFlow(); if (nextInFlow) + { return nextInFlow->GetChildFrameContainingOffset(inContentOffset, inHint, outFrameContentOffset, outChildFrame); - else + } + else if (contentOffset != mContentLength) //that condition was only for when there is a choice return NS_ERROR_FAILURE; } - else if (inContentOffset < mContentOffset) //could happen with floaters! + + if (inContentOffset < mContentOffset) //could happen with floaters! { result = GetPrevInFlow(outChildFrame); if (NS_SUCCEEDED(result))