changing way we access caret. use the selection controller whenever possible. because it will make the caret do the right thing even when we have multiple selections accessing same caret.

This commit is contained in:
mjudge%netscape.com 2000-05-11 04:25:43 +00:00
Родитель 4798aea6be
Коммит 55912eddb8
39 изменённых файлов: 1107 добавлений и 516 удалений

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

@ -52,8 +52,9 @@ interface nsISelectionController : nsISupports
const short NUM_SELECTION_REGIONS = 2; const short NUM_SELECTION_REGIONS = 2;
const short SELECTION_OFF = 0; const short SELECTION_OFF = 0;
const short SELECTION_ON = 1; const short SELECTION_HIDDEN =1;//>HIDDEN displays selection
const short SELECTION_DISABLED = 2; const short SELECTION_ON = 2;
const short SELECTION_DISABLED = 3;
/** /**
* SetDisplaySelection will set the display mode for the selection. OFF,ON,DISABLED * SetDisplaySelection will set the display mode for the selection. OFF,ON,DISABLED
@ -98,6 +99,14 @@ interface nsISelectionController : nsISupports
*/ */
void setCaretEnabled(in boolean enabled); void setCaretEnabled(in boolean enabled);
/**
* Set the caret readonly or not. An readonly caret will
* draw but not blink when made visible.
* @param aReadOnly PR_TRUE to enable caret. PR_FALSE to disable.
* @return always NS_OK
*/
void setCaretReadOnly(in boolean readOnly);
/** /**
* Gets the current state of the caret. * Gets the current state of the caret.
* @param aEnabled [OUT] set to the current caret state, as set by SetCaretEnabled * @param aEnabled [OUT] set to the current caret state, as set by SetCaretEnabled
@ -113,7 +122,7 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void characterMove(in boolean aForward, in boolean aExtend); void characterMove(in boolean forward, in boolean extend);
/** WordMove will move the selection one word forward/backward in the document. /** WordMove will move the selection one word forward/backward in the document.
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -123,7 +132,7 @@ interface nsISelectionController : nsISupports
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void wordMove(in boolean aForward, in boolean aExtend); void wordMove(in boolean forward, in boolean extend);
/** LineMove will move the selection one line forward/backward in the document. /** LineMove will move the selection one line forward/backward in the document.
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -132,7 +141,7 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void lineMove(in boolean aForward, in boolean aExtend); void lineMove(in boolean forward, in boolean extend);
/** IntraLineMove will move the selection to the front of the line or end of the line /** IntraLineMove will move the selection to the front of the line or end of the line
* in the document. * in the document.
@ -142,7 +151,7 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void intraLineMove(in boolean aForward, in boolean aExtend); void intraLineMove(in boolean forward, in boolean extend);
/** PageMove will move the selection one page forward/backward in the document. /** PageMove will move the selection one page forward/backward in the document.
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -151,12 +160,12 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void pageMove(in boolean aForward, in boolean aExtend); void pageMove(in boolean forward, in boolean extend);
/** CompleteScroll will move page view to the top or bottom of the document /** CompleteScroll will move page view to the top or bottom of the document
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
*/ */
void completeScroll(in boolean aForward); void completeScroll(in boolean forward);
/** CompleteMove will move page view to the top or bottom of the document /** CompleteMove will move page view to the top or bottom of the document
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -165,23 +174,23 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void completeMove(in boolean aForward, in boolean aExtend); void completeMove(in boolean forward, in boolean extend);
/** ScrollPage will scroll the page without affecting the selection. /** ScrollPage will scroll the page without affecting the selection.
* @param aForward scroll forward or backwards in selection * @param aForward scroll forward or backwards in selection
*/ */
void scrollPage(in boolean aForward); void scrollPage(in boolean forward);
/** ScrolLine will scroll line up or down dependent on the boolean /** ScrolLine will scroll line up or down dependent on the boolean
* @param aForward scroll forward or backwards in selection * @param aForward scroll forward or backwards in selection
*/ */
void scrollLine(in boolean aForward); void scrollLine(in boolean forward);
/** ScrolHorizontal will scroll left or right dependent on the boolean /** ScrolHorizontal will scroll left or right dependent on the boolean
* @param aLeft if true will scroll left. if not will scroll right. * @param aLeft if true will scroll left. if not will scroll right.
*/ */
void scrollHorizontal(in boolean aLeft); void scrollHorizontal(in boolean left);
/** SelectAll will select the whole page /** SelectAll will select the whole page
*/ */
void selectAll(); void selectAll();

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

@ -1831,7 +1831,7 @@ nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
selCon->GetDisplaySelection( &selectionStatus); selCon->GetDisplaySelection( &selectionStatus);
//if selection was nsISelectionController::SELECTION_OFF, do nothing //if selection was nsISelectionController::SELECTION_OFF, do nothing
//otherwise re-enable it. //otherwise re-enable it.
if(selectionStatus == nsISelectionController::SELECTION_DISABLED) if(selectionStatus == nsISelectionController::SELECTION_DISABLED)
{ {
selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON); selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON);
@ -1839,12 +1839,12 @@ nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
} }
return result; return result;
} }
nsresult nsresult
nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent) nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
if(!mDocViewer) if(!mDocViewer)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref

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

@ -111,6 +111,7 @@ class nsAutoScrollTimer;
class nsDOMSelection : public nsIDOMSelection , public nsIScriptObjectOwner, public nsSupportsWeakReference class nsDOMSelection : public nsIDOMSelection , public nsIScriptObjectOwner, public nsSupportsWeakReference
{ {
public: public:
nsDOMSelection();
nsDOMSelection(nsSelection *aList); nsDOMSelection(nsSelection *aList);
virtual ~nsDOMSelection(); virtual ~nsDOMSelection();
@ -523,15 +524,21 @@ nsresult NS_NewSelection(nsIFrameSelection **aFrameSelection)
if (!rlist) if (!rlist)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
*aFrameSelection = (nsIFrameSelection *)rlist; *aFrameSelection = (nsIFrameSelection *)rlist;
nsresult result = rlist->AddRef(); rlist->AddRef();
if (!NS_SUCCEEDED(result)) return NS_OK;
{
delete rlist;
}
return result;
} }
nsresult NS_NewDomSelection(nsIDOMSelection **aDomSelection);
nsresult NS_NewDomSelection(nsIDOMSelection **aDomSelection)
{
nsDOMSelection *rlist = new nsDOMSelection;
if (!rlist)
return NS_ERROR_OUT_OF_MEMORY;
*aDomSelection = (nsIDOMSelection *)rlist;
rlist->AddRef();
return NS_OK;
}
//Horrible statics but no choice //Horrible statics but no choice
nsIAtom *nsSelection::sTableAtom = 0; nsIAtom *nsSelection::sTableAtom = 0;
@ -781,12 +788,12 @@ nsSelection::nsSelection()
if (mDomSelections[index]) if (mDomSelections[index])
autoCopyService->Listen(mDomSelections[index]); autoCopyService->Listen(mDomSelections[index]);
} }
mDisplaySelection = nsISelectionController::SELECTION_ON; mDisplaySelection = nsISelectionController::SELECTION_OFF;
} }
nsSelection::~nsSelection() nsSelection::~nsSelection()
{ {
if (sInstanceCount <= 1) if (sInstanceCount <= 1)
{ {
@ -1608,10 +1615,8 @@ nsSelection::TakeFocus(nsIContent *aNewFocus, PRUint32 aContentOffset,
nsCOMPtr<nsIContent> parent2; nsCOMPtr<nsIContent> parent2;
if (NS_FAILED(aNewFocus->GetParent(*getter_AddRefs(parent))) || !parent) if (NS_FAILED(aNewFocus->GetParent(*getter_AddRefs(parent))) || !parent)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
//if (NS_FAILED(parent->GetParent(*getter_AddRefs(parent2))) || !parent2)
//return NS_ERROR_FAILURE;
//END HACKHACKHACK /checking for root frames/content //END HACKHACKHACK /checking for root frames/content
PRInt8 index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL); PRInt8 index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
domNode = do_QueryInterface(aNewFocus); domNode = do_QueryInterface(aNewFocus);
//traverse through document and unselect crap here //traverse through document and unselect crap here
@ -1688,7 +1693,7 @@ nsSelection::SetMouseDownState(PRBool aState)
mSelectingTableCells = PR_FALSE; mSelectingTableCells = PR_FALSE;
mStartSelectedCell = nsnull; mStartSelectedCell = nsnull;
mEndSelectedCell = nsnull; mEndSelectedCell = nsnull;
NotifySelectionListeners(nsISelectionController::SELECTION_NORMAL); //NotifySelectionListeners(nsISelectionController::SELECTION_NORMAL);
} }
return NS_OK; return NS_OK;
} }
@ -2625,6 +2630,18 @@ nsDOMSelection::nsDOMSelection(nsSelection *aList)
} }
nsDOMSelection::nsDOMSelection()
{
mFixupState = PR_FALSE;
mDirection = eDirNext;
NS_NewISupportsArray(getter_AddRefs(mRangeArray));
mScriptObject = nsnull;
mAutoScrollTimer = nsnull;
NS_NewISupportsArray(getter_AddRefs(mSelectionListeners));
NS_INIT_REFCNT();
}
nsDOMSelection::~nsDOMSelection() nsDOMSelection::~nsDOMSelection()
{ {
@ -2986,7 +3003,7 @@ nsDOMSelection::GetPrimaryFrameForAnchorNode(nsIFrame **aReturnFrame)
PRInt32 frameOffset = 0; PRInt32 frameOffset = 0;
*aReturnFrame = 0; *aReturnFrame = 0;
nsCOMPtr<nsIContent> content = do_QueryInterface(FetchAnchorNode()); nsCOMPtr<nsIContent> content = do_QueryInterface(FetchAnchorNode());
if (content) if (content && mFrameSelection)
return mFrameSelection->GetFrameForNodeOffset(content, FetchAnchorOffset(),aReturnFrame, &frameOffset); return mFrameSelection->GetFrameForNodeOffset(content, FetchAnchorOffset(),aReturnFrame, &frameOffset);
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3001,7 +3018,7 @@ nsDOMSelection::GetPrimaryFrameForFocusNode(nsIFrame **aReturnFrame)
*aReturnFrame = 0; *aReturnFrame = 0;
nsCOMPtr<nsIContent> content = do_QueryInterface(FetchFocusNode()); nsCOMPtr<nsIContent> content = do_QueryInterface(FetchFocusNode());
if (content) if (content && mFrameSelection)
return mFrameSelection->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame, &frameOffset); return mFrameSelection->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame, &frameOffset);
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3017,6 +3034,8 @@ nsDOMSelection::selectFrames(nsIPresContext* aPresContext,
nsIPresShell *aPresShell, nsIPresShell *aPresShell,
PRBool aFlags) PRBool aFlags)
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
nsresult result; nsresult result;
nsCOMPtr<nsIGeneratedContentIterator> genericiter = do_QueryInterface(aInnerIter); nsCOMPtr<nsIGeneratedContentIterator> genericiter = do_QueryInterface(aInnerIter);
if (genericiter && aPresShell) if (genericiter && aPresShell)
@ -3065,6 +3084,8 @@ nsDOMSelection::selectFrames(nsIPresContext* aPresContext,
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::selectFrames(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool aFlags) nsDOMSelection::selectFrames(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool aFlags)
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
if (!aRange || !aPresContext) if (!aRange || !aPresContext)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsIContentIterator> iter; nsCOMPtr<nsIContentIterator> iter;
@ -3314,6 +3335,8 @@ nsresult
nsDOMSelection::StartAutoScrollTimer(nsIPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint, PRUint32 aDelay) nsDOMSelection::StartAutoScrollTimer(nsIPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint, PRUint32 aDelay)
{ {
nsresult result; nsresult result;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (!mAutoScrollTimer) if (!mAutoScrollTimer)
{ {
@ -3572,6 +3595,8 @@ nsDOMSelection::GetEnumerator(nsIEnumerator **aIterator)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::ClearSelection() nsDOMSelection::ClearSelection()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
nsCOMPtr<nsIPresContext> presContext; nsCOMPtr<nsIPresContext> presContext;
GetPresContext(getter_AddRefs(presContext)); GetPresContext(getter_AddRefs(presContext));
@ -3608,7 +3633,8 @@ nsDOMSelection::AddRange(nsIDOMRange* aRange)
GetPresContext(getter_AddRefs(presContext)); GetPresContext(getter_AddRefs(presContext));
selectFrames(presContext, aRange, PR_TRUE); selectFrames(presContext, aRange, PR_TRUE);
//ScrollIntoView(); this should not happen automatically //ScrollIntoView(); this should not happen automatically
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -3632,6 +3658,8 @@ nsDOMSelection::RemoveRange(nsIDOMRange* aRange)
ScrollIntoView(); ScrollIntoView();
} }
} }
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -3695,7 +3723,8 @@ nsDOMSelection::Collapse(nsIDOMNode* aParentNode, PRInt32 aOffset)
selectFrames(presContext, range,PR_TRUE); selectFrames(presContext, range,PR_TRUE);
if (NS_FAILED(result)) if (NS_FAILED(result))
return result; return result;
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -4503,6 +4532,8 @@ nsDOMSelection::Extend(nsIDOMNode* aParentNode, PRInt32 aOffset)
printf ("Sel. Extend set to null parent.\n"); printf ("Sel. Extend set to null parent.\n");
} }
#endif #endif
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -4572,6 +4603,8 @@ nsDOMSelection::ContainsNode(nsIDOMNode* aNode, PRBool aRecursive, PRBool* aYes)
nsresult nsresult
nsDOMSelection::GetPresContext(nsIPresContext **aPresContext) nsDOMSelection::GetPresContext(nsIPresContext **aPresContext)
{ {
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsIFocusTracker *tracker = mFrameSelection->GetTracker(); nsIFocusTracker *tracker = mFrameSelection->GetTracker();
if (!tracker) if (!tracker)
@ -4584,6 +4617,8 @@ nsresult
nsDOMSelection::GetPresShell(nsIPresShell **aPresShell) nsDOMSelection::GetPresShell(nsIPresShell **aPresShell)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsIFocusTracker *tracker = mFrameSelection->GetTracker(); nsIFocusTracker *tracker = mFrameSelection->GetTracker();
@ -4614,6 +4649,8 @@ nsDOMSelection::GetRootScrollableView(nsIScrollableView **aScrollableView)
// NOTE: This method returns a NON-AddRef'd pointer // NOTE: This method returns a NON-AddRef'd pointer
// to the scrollable view! // to the scrollable view!
// //
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsresult rv = NS_OK; nsresult rv = NS_OK;
@ -4648,6 +4685,8 @@ nsresult
nsDOMSelection::GetFrameToRootViewOffset(nsIFrame *aFrame, nscoord *aX, nscoord *aY) nsDOMSelection::GetFrameToRootViewOffset(nsIFrame *aFrame, nscoord *aX, nscoord *aY)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aFrame || !aX || !aY) { if (!aFrame || !aX || !aY) {
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4705,6 +4744,8 @@ nsresult
nsDOMSelection::GetPointFromOffset(nsIFrame *aFrame, PRInt32 aContentOffset, nsPoint *aPoint) nsDOMSelection::GetPointFromOffset(nsIFrame *aFrame, PRInt32 aContentOffset, nsPoint *aPoint)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aFrame || !aPoint) if (!aFrame || !aPoint)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4800,6 +4841,8 @@ nsresult
nsDOMSelection::GetSelectionRegionRect(SelectionRegion aRegion, nsRect *aRect) nsDOMSelection::GetSelectionRegionRect(SelectionRegion aRegion, nsRect *aRect)
{ {
nsresult result = NS_OK; nsresult result = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aRect) if (!aRect)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4976,6 +5019,8 @@ nsDOMSelection::ScrollRectIntoView(nsRect& aRect,
PRIntn aHPercent) PRIntn aHPercent)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_OK;//nothing to do
nsIScrollableView *scrollingView = 0; nsIScrollableView *scrollingView = 0;
@ -5052,6 +5097,8 @@ NS_IMETHODIMP
nsDOMSelection::ScrollIntoView(SelectionRegion aRegion) nsDOMSelection::ScrollIntoView(SelectionRegion aRegion)
{ {
nsresult result; nsresult result;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (mFrameSelection->GetBatching()) if (mFrameSelection->GetBatching())
return NS_OK; return NS_OK;
@ -5119,6 +5166,8 @@ nsDOMSelection::NotifySelectionListeners()
{ {
if (!mSelectionListeners) if (!mSelectionListeners)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (mFrameSelection->GetBatching()){ if (mFrameSelection->GetBatching()){
mFrameSelection->SetDirty(); mFrameSelection->SetDirty();
@ -5152,6 +5201,8 @@ nsDOMSelection::NotifySelectionListeners()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::StartBatchChanges() nsDOMSelection::StartBatchChanges()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->StartBatchChanges(); return mFrameSelection->StartBatchChanges();
} }
@ -5160,6 +5211,8 @@ nsDOMSelection::StartBatchChanges()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::EndBatchChanges() nsDOMSelection::EndBatchChanges()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->EndBatchChanges(); return mFrameSelection->EndBatchChanges();
} }
@ -5168,6 +5221,8 @@ nsDOMSelection::EndBatchChanges()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::DeleteFromDocument() nsDOMSelection::DeleteFromDocument()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->DeleteFromDocument(); return mFrameSelection->DeleteFromDocument();
} }

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

@ -737,7 +737,9 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
if ((ui->mUserFocus != NS_STYLE_USER_FOCUS_IGNORE) && if ((ui->mUserFocus != NS_STYLE_USER_FOCUS_IGNORE) &&
(ui->mUserFocus != NS_STYLE_USER_FOCUS_NONE)) { (ui->mUserFocus != NS_STYLE_USER_FOCUS_NONE)) {
currFrame->GetContent(getter_AddRefs(newFocus)); currFrame->GetContent(getter_AddRefs(newFocus));
break; nsCOMPtr<nsIDOMElement> domElement(do_QueryInterface(newFocus));
if (domElement)
break;
} }
currFrame->GetParent(&currFrame); currFrame->GetParent(&currFrame);
} }

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

@ -1132,7 +1132,7 @@ nsHTMLInputElement::GetTextLength(PRInt32* aTextLength)
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->GetTextLength(aTextLength); textControlFrame->GetTextLength(aTextLength);
@ -1148,7 +1148,7 @@ nsHTMLInputElement::SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectio
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->SetSelectionRange(aSelectionStart, aSelectionEnd); textControlFrame->SetSelectionRange(aSelectionStart, aSelectionEnd);
@ -1173,7 +1173,7 @@ nsHTMLInputElement::SetSelectionStart(PRInt32 aSelectionStart)
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->SetSelectionStart(aSelectionStart); textControlFrame->SetSelectionStart(aSelectionStart);
@ -1199,7 +1199,7 @@ nsHTMLInputElement::SetSelectionEnd(PRInt32 aSelectionEnd)
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->SetSelectionEnd(aSelectionEnd); textControlFrame->SetSelectionEnd(aSelectionEnd);
@ -1215,7 +1215,7 @@ nsHTMLInputElement::GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelect
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->GetSelectionRange(aSelectionStart, aSelectionEnd); textControlFrame->GetSelectionRange(aSelectionStart, aSelectionEnd);

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

@ -161,8 +161,9 @@ NS_IMETHODIMP nsCaret::QueryInterface(const nsIID& aIID,
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
NS_IMETHODIMP nsCaret::SetCaretVisible(PRBool inMakeVisible) NS_IMETHODIMP nsCaret::SetCaretVisible(PRBool inMakeVisible, nsIDOMSelection *aDOMSel)
{ {
mDomSelectionWeak = getter_AddRefs( NS_GetWeakReference(aDOMSel) ); // weak reference to pres shell
mVisible = inMakeVisible; mVisible = inMakeVisible;
nsresult err = NS_OK; nsresult err = NS_OK;
if (mVisible) if (mVisible)
@ -175,8 +176,10 @@ NS_IMETHODIMP nsCaret::SetCaretVisible(PRBool inMakeVisible)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
NS_IMETHODIMP nsCaret::SetCaretReadOnly(PRBool inMakeReadonly) NS_IMETHODIMP nsCaret::SetCaretReadOnly(PRBool inMakeReadonly, nsIDOMSelection *aDOMSel)
{ {
mDomSelectionWeak = getter_AddRefs( NS_GetWeakReference(aDOMSel) ); // weak reference to pres shell
mReadOnly = inMakeReadonly; mReadOnly = inMakeReadonly;
return NS_OK; return NS_OK;
} }
@ -187,6 +190,8 @@ NS_IMETHODIMP nsCaret::GetWindowRelativeCoordinates(nsRect& outCoordinates, PRBo
{ {
if (!mPresShell) if (!mPresShell)
return NS_ERROR_NOT_INITIALIZED; return NS_ERROR_NOT_INITIALIZED;
mDomSelectionWeak = getter_AddRefs( NS_GetWeakReference(aDOMSel) ); // weak reference to pres shell
nsCOMPtr<nsIDOMSelection> domSelection = aDOMSel; nsCOMPtr<nsIDOMSelection> domSelection = aDOMSel;
nsresult err; nsresult err;
@ -501,8 +506,6 @@ void nsCaret::GetViewForRendering(nsIFrame *caretFrame, EViewCoordinates coordTy
do { do {
theView->GetPosition(&x, &y); theView->GetPosition(&x, &y);
viewOffset.x += x;
viewOffset.y += y;
if (!returnView) if (!returnView)
{ {
@ -516,6 +519,8 @@ void nsCaret::GetViewForRendering(nsIFrame *caretFrame, EViewCoordinates coordTy
if (coordType == eViewCoordinates) if (coordType == eViewCoordinates)
break; break;
} }
viewOffset.x += x;
viewOffset.y += y;
} }
theView->GetParent(theView); theView->GetParent(theView);

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

@ -53,8 +53,8 @@ class nsCaret : public nsICaret,
// nsICaret interface // nsICaret interface
NS_IMETHOD Init(nsIPresShell *inPresShell); NS_IMETHOD Init(nsIPresShell *inPresShell);
NS_IMETHOD SetCaretVisible(PRBool inMakeVisible); NS_IMETHOD SetCaretVisible(PRBool inMakeVisible, nsIDOMSelection *aSel);
NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly); NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly, nsIDOMSelection *aSel);
NS_IMETHOD GetWindowRelativeCoordinates(nsRect& outCoordinates, PRBool& outIsCollapsed, nsIDOMSelection *aDOMSel); NS_IMETHOD GetWindowRelativeCoordinates(nsRect& outCoordinates, PRBool& outIsCollapsed, nsIDOMSelection *aDOMSel);
NS_IMETHOD ClearFrameRefs(nsIFrame* aFrame); NS_IMETHOD ClearFrameRefs(nsIFrame* aFrame);

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

@ -1831,7 +1831,7 @@ nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
selCon->GetDisplaySelection( &selectionStatus); selCon->GetDisplaySelection( &selectionStatus);
//if selection was nsISelectionController::SELECTION_OFF, do nothing //if selection was nsISelectionController::SELECTION_OFF, do nothing
//otherwise re-enable it. //otherwise re-enable it.
if(selectionStatus == nsISelectionController::SELECTION_DISABLED) if(selectionStatus == nsISelectionController::SELECTION_DISABLED)
{ {
selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON); selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON);
@ -1839,12 +1839,12 @@ nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
} }
return result; return result;
} }
nsresult nsresult
nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent) nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
if(!mDocViewer) if(!mDocViewer)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref

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

@ -47,13 +47,13 @@ public:
/** SetCaretVisible will set the visibility of the caret /** SetCaretVisible will set the visibility of the caret
* @param inMakeVisible PR_TRUE to show the caret, PR_FALSE to hide it * @param inMakeVisible PR_TRUE to show the caret, PR_FALSE to hide it
*/ */
NS_IMETHOD SetCaretVisible(PRBool inMakeVisible) = 0; NS_IMETHOD SetCaretVisible(PRBool inMakeVisible, nsIDOMSelection *aDOMSel) = 0;
/** SetCaretReadOnly set the appearance of the caret /** SetCaretReadOnly set the appearance of the caret
* @param inMakeReadonly PR_TRUE to show the caret in a 'read only' state, * @param inMakeReadonly PR_TRUE to show the caret in a 'read only' state,
* PR_FALSE to show the caret in normal, editing state * PR_FALSE to show the caret in normal, editing state
*/ */
NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly) = 0; NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly, nsIDOMSelection *aDOMSel) = 0;
/** GetWindowRelativeCoordinates /** GetWindowRelativeCoordinates
* Get the position of the caret in (top-level) window coordinates. * Get the position of the caret in (top-level) window coordinates.

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

@ -651,10 +651,11 @@ public:
NS_IMETHOD ScrollFrameIntoView(nsIFrame *aFrame); NS_IMETHOD ScrollFrameIntoView(nsIFrame *aFrame);
// caret handling // caret handling
NS_IMETHOD GetCaret(nsICaret **aOutCaret); NS_IMETHOD GetCaret(nsICaret **aOutCaret);
NS_IMETHOD SetCaretEnabled(PRBool aaInEnable); NS_IMETHOD SetCaretEnabled(PRBool aInEnable);
NS_IMETHOD SetCaretReadOnly(PRBool aReadOnly);
NS_IMETHOD GetCaretEnabled(PRBool *aOutEnabled); NS_IMETHOD GetCaretEnabled(PRBool *aOutEnabled);
NS_IMETHOD SetDisplayNonTextSelection(PRBool aaInEnable); NS_IMETHOD SetDisplayNonTextSelection(PRBool aInEnable);
NS_IMETHOD GetDisplayNonTextSelection(PRBool *aOutEnable); NS_IMETHOD GetDisplayNonTextSelection(PRBool *aOutEnable);
// nsISelectionController // nsISelectionController
@ -1772,17 +1773,30 @@ NS_IMETHODIMP PresShell::SetCaretEnabled(PRBool aInEnable)
if (mCaret && (mCaretEnabled != oldEnabled)) if (mCaret && (mCaretEnabled != oldEnabled))
{ {
// Update the document's content and frame models. // Update the document's content and frame models.
if (mDocument) mDocument->FlushPendingNotifications(); if (mDocument)
mDocument->FlushPendingNotifications();
if (mCaretEnabled) nsCOMPtr<nsIDOMSelection> sel;
result = mCaret->SetCaretVisible(PR_TRUE); if (NS_SUCCEEDED(GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(sel))) && sel)
else {
result = mCaret->SetCaretVisible(PR_FALSE); result = mCaret->SetCaretVisible(mCaretEnabled, sel);
}
} }
return result; return result;
} }
NS_IMETHODIMP PresShell::SetCaretReadOnly(PRBool aReadOnly)
{
nsCOMPtr<nsIDOMSelection> domSel;
if (NS_SUCCEEDED(GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel))) && domSel)
{
return mCaret->SetCaretReadOnly(aReadOnly, domSel);
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP PresShell::GetCaretEnabled(PRBool *aOutEnabled) NS_IMETHODIMP PresShell::GetCaretEnabled(PRBool *aOutEnabled)
{ {
if (!aOutEnabled) { return NS_ERROR_INVALID_ARG; } if (!aOutEnabled) { return NS_ERROR_INVALID_ARG; }

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

@ -47,13 +47,13 @@ public:
/** SetCaretVisible will set the visibility of the caret /** SetCaretVisible will set the visibility of the caret
* @param inMakeVisible PR_TRUE to show the caret, PR_FALSE to hide it * @param inMakeVisible PR_TRUE to show the caret, PR_FALSE to hide it
*/ */
NS_IMETHOD SetCaretVisible(PRBool inMakeVisible) = 0; NS_IMETHOD SetCaretVisible(PRBool inMakeVisible, nsIDOMSelection *aDOMSel) = 0;
/** SetCaretReadOnly set the appearance of the caret /** SetCaretReadOnly set the appearance of the caret
* @param inMakeReadonly PR_TRUE to show the caret in a 'read only' state, * @param inMakeReadonly PR_TRUE to show the caret in a 'read only' state,
* PR_FALSE to show the caret in normal, editing state * PR_FALSE to show the caret in normal, editing state
*/ */
NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly) = 0; NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly, nsIDOMSelection *aDOMSel) = 0;
/** GetWindowRelativeCoordinates /** GetWindowRelativeCoordinates
* Get the position of the caret in (top-level) window coordinates. * Get the position of the caret in (top-level) window coordinates.

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

@ -52,8 +52,9 @@ interface nsISelectionController : nsISupports
const short NUM_SELECTION_REGIONS = 2; const short NUM_SELECTION_REGIONS = 2;
const short SELECTION_OFF = 0; const short SELECTION_OFF = 0;
const short SELECTION_ON = 1; const short SELECTION_HIDDEN =1;//>HIDDEN displays selection
const short SELECTION_DISABLED = 2; const short SELECTION_ON = 2;
const short SELECTION_DISABLED = 3;
/** /**
* SetDisplaySelection will set the display mode for the selection. OFF,ON,DISABLED * SetDisplaySelection will set the display mode for the selection. OFF,ON,DISABLED
@ -98,6 +99,14 @@ interface nsISelectionController : nsISupports
*/ */
void setCaretEnabled(in boolean enabled); void setCaretEnabled(in boolean enabled);
/**
* Set the caret readonly or not. An readonly caret will
* draw but not blink when made visible.
* @param aReadOnly PR_TRUE to enable caret. PR_FALSE to disable.
* @return always NS_OK
*/
void setCaretReadOnly(in boolean readOnly);
/** /**
* Gets the current state of the caret. * Gets the current state of the caret.
* @param aEnabled [OUT] set to the current caret state, as set by SetCaretEnabled * @param aEnabled [OUT] set to the current caret state, as set by SetCaretEnabled
@ -113,7 +122,7 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void characterMove(in boolean aForward, in boolean aExtend); void characterMove(in boolean forward, in boolean extend);
/** WordMove will move the selection one word forward/backward in the document. /** WordMove will move the selection one word forward/backward in the document.
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -123,7 +132,7 @@ interface nsISelectionController : nsISupports
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void wordMove(in boolean aForward, in boolean aExtend); void wordMove(in boolean forward, in boolean extend);
/** LineMove will move the selection one line forward/backward in the document. /** LineMove will move the selection one line forward/backward in the document.
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -132,7 +141,7 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void lineMove(in boolean aForward, in boolean aExtend); void lineMove(in boolean forward, in boolean extend);
/** IntraLineMove will move the selection to the front of the line or end of the line /** IntraLineMove will move the selection to the front of the line or end of the line
* in the document. * in the document.
@ -142,7 +151,7 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void intraLineMove(in boolean aForward, in boolean aExtend); void intraLineMove(in boolean forward, in boolean extend);
/** PageMove will move the selection one page forward/backward in the document. /** PageMove will move the selection one page forward/backward in the document.
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -151,12 +160,12 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void pageMove(in boolean aForward, in boolean aExtend); void pageMove(in boolean forward, in boolean extend);
/** CompleteScroll will move page view to the top or bottom of the document /** CompleteScroll will move page view to the top or bottom of the document
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
*/ */
void completeScroll(in boolean aForward); void completeScroll(in boolean forward);
/** CompleteMove will move page view to the top or bottom of the document /** CompleteMove will move page view to the top or bottom of the document
* this will also have the effect of collapsing the selection if the aExtend = PR_FALSE * this will also have the effect of collapsing the selection if the aExtend = PR_FALSE
@ -165,23 +174,23 @@ interface nsISelectionController : nsISupports
* @param aForward forward or backward if PR_FALSE * @param aForward forward or backward if PR_FALSE
* @param aExtend should it collapse the selection of extend it? * @param aExtend should it collapse the selection of extend it?
*/ */
void completeMove(in boolean aForward, in boolean aExtend); void completeMove(in boolean forward, in boolean extend);
/** ScrollPage will scroll the page without affecting the selection. /** ScrollPage will scroll the page without affecting the selection.
* @param aForward scroll forward or backwards in selection * @param aForward scroll forward or backwards in selection
*/ */
void scrollPage(in boolean aForward); void scrollPage(in boolean forward);
/** ScrolLine will scroll line up or down dependent on the boolean /** ScrolLine will scroll line up or down dependent on the boolean
* @param aForward scroll forward or backwards in selection * @param aForward scroll forward or backwards in selection
*/ */
void scrollLine(in boolean aForward); void scrollLine(in boolean forward);
/** ScrolHorizontal will scroll left or right dependent on the boolean /** ScrolHorizontal will scroll left or right dependent on the boolean
* @param aLeft if true will scroll left. if not will scroll right. * @param aLeft if true will scroll left. if not will scroll right.
*/ */
void scrollHorizontal(in boolean aLeft); void scrollHorizontal(in boolean left);
/** SelectAll will select the whole page /** SelectAll will select the whole page
*/ */
void selectAll(); void selectAll();

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

@ -161,8 +161,9 @@ NS_IMETHODIMP nsCaret::QueryInterface(const nsIID& aIID,
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
NS_IMETHODIMP nsCaret::SetCaretVisible(PRBool inMakeVisible) NS_IMETHODIMP nsCaret::SetCaretVisible(PRBool inMakeVisible, nsIDOMSelection *aDOMSel)
{ {
mDomSelectionWeak = getter_AddRefs( NS_GetWeakReference(aDOMSel) ); // weak reference to pres shell
mVisible = inMakeVisible; mVisible = inMakeVisible;
nsresult err = NS_OK; nsresult err = NS_OK;
if (mVisible) if (mVisible)
@ -175,8 +176,10 @@ NS_IMETHODIMP nsCaret::SetCaretVisible(PRBool inMakeVisible)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
NS_IMETHODIMP nsCaret::SetCaretReadOnly(PRBool inMakeReadonly) NS_IMETHODIMP nsCaret::SetCaretReadOnly(PRBool inMakeReadonly, nsIDOMSelection *aDOMSel)
{ {
mDomSelectionWeak = getter_AddRefs( NS_GetWeakReference(aDOMSel) ); // weak reference to pres shell
mReadOnly = inMakeReadonly; mReadOnly = inMakeReadonly;
return NS_OK; return NS_OK;
} }
@ -187,6 +190,8 @@ NS_IMETHODIMP nsCaret::GetWindowRelativeCoordinates(nsRect& outCoordinates, PRBo
{ {
if (!mPresShell) if (!mPresShell)
return NS_ERROR_NOT_INITIALIZED; return NS_ERROR_NOT_INITIALIZED;
mDomSelectionWeak = getter_AddRefs( NS_GetWeakReference(aDOMSel) ); // weak reference to pres shell
nsCOMPtr<nsIDOMSelection> domSelection = aDOMSel; nsCOMPtr<nsIDOMSelection> domSelection = aDOMSel;
nsresult err; nsresult err;
@ -501,8 +506,6 @@ void nsCaret::GetViewForRendering(nsIFrame *caretFrame, EViewCoordinates coordTy
do { do {
theView->GetPosition(&x, &y); theView->GetPosition(&x, &y);
viewOffset.x += x;
viewOffset.y += y;
if (!returnView) if (!returnView)
{ {
@ -516,6 +519,8 @@ void nsCaret::GetViewForRendering(nsIFrame *caretFrame, EViewCoordinates coordTy
if (coordType == eViewCoordinates) if (coordType == eViewCoordinates)
break; break;
} }
viewOffset.x += x;
viewOffset.y += y;
} }
theView->GetParent(theView); theView->GetParent(theView);

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

@ -53,8 +53,8 @@ class nsCaret : public nsICaret,
// nsICaret interface // nsICaret interface
NS_IMETHOD Init(nsIPresShell *inPresShell); NS_IMETHOD Init(nsIPresShell *inPresShell);
NS_IMETHOD SetCaretVisible(PRBool inMakeVisible); NS_IMETHOD SetCaretVisible(PRBool inMakeVisible, nsIDOMSelection *aSel);
NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly); NS_IMETHOD SetCaretReadOnly(PRBool inMakeReadonly, nsIDOMSelection *aSel);
NS_IMETHOD GetWindowRelativeCoordinates(nsRect& outCoordinates, PRBool& outIsCollapsed, nsIDOMSelection *aDOMSel); NS_IMETHOD GetWindowRelativeCoordinates(nsRect& outCoordinates, PRBool& outIsCollapsed, nsIDOMSelection *aDOMSel);
NS_IMETHOD ClearFrameRefs(nsIFrame* aFrame); NS_IMETHOD ClearFrameRefs(nsIFrame* aFrame);

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

@ -1831,7 +1831,7 @@ nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
selCon->GetDisplaySelection( &selectionStatus); selCon->GetDisplaySelection( &selectionStatus);
//if selection was nsISelectionController::SELECTION_OFF, do nothing //if selection was nsISelectionController::SELECTION_OFF, do nothing
//otherwise re-enable it. //otherwise re-enable it.
if(selectionStatus == nsISelectionController::SELECTION_DISABLED) if(selectionStatus == nsISelectionController::SELECTION_DISABLED)
{ {
selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON); selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON);
@ -1839,12 +1839,12 @@ nsDocViewerFocusListener::Focus(nsIDOMEvent* aEvent)
} }
return result; return result;
} }
nsresult nsresult
nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent) nsDocViewerFocusListener::Blur(nsIDOMEvent* aEvent)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
if(!mDocViewer) if(!mDocViewer)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref nsresult result = mDocViewer->GetPresShell(*getter_AddRefs(shell));//deref once cause it take a ptr ref

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

@ -111,6 +111,7 @@ class nsAutoScrollTimer;
class nsDOMSelection : public nsIDOMSelection , public nsIScriptObjectOwner, public nsSupportsWeakReference class nsDOMSelection : public nsIDOMSelection , public nsIScriptObjectOwner, public nsSupportsWeakReference
{ {
public: public:
nsDOMSelection();
nsDOMSelection(nsSelection *aList); nsDOMSelection(nsSelection *aList);
virtual ~nsDOMSelection(); virtual ~nsDOMSelection();
@ -523,15 +524,21 @@ nsresult NS_NewSelection(nsIFrameSelection **aFrameSelection)
if (!rlist) if (!rlist)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
*aFrameSelection = (nsIFrameSelection *)rlist; *aFrameSelection = (nsIFrameSelection *)rlist;
nsresult result = rlist->AddRef(); rlist->AddRef();
if (!NS_SUCCEEDED(result)) return NS_OK;
{
delete rlist;
}
return result;
} }
nsresult NS_NewDomSelection(nsIDOMSelection **aDomSelection);
nsresult NS_NewDomSelection(nsIDOMSelection **aDomSelection)
{
nsDOMSelection *rlist = new nsDOMSelection;
if (!rlist)
return NS_ERROR_OUT_OF_MEMORY;
*aDomSelection = (nsIDOMSelection *)rlist;
rlist->AddRef();
return NS_OK;
}
//Horrible statics but no choice //Horrible statics but no choice
nsIAtom *nsSelection::sTableAtom = 0; nsIAtom *nsSelection::sTableAtom = 0;
@ -781,12 +788,12 @@ nsSelection::nsSelection()
if (mDomSelections[index]) if (mDomSelections[index])
autoCopyService->Listen(mDomSelections[index]); autoCopyService->Listen(mDomSelections[index]);
} }
mDisplaySelection = nsISelectionController::SELECTION_ON; mDisplaySelection = nsISelectionController::SELECTION_OFF;
} }
nsSelection::~nsSelection() nsSelection::~nsSelection()
{ {
if (sInstanceCount <= 1) if (sInstanceCount <= 1)
{ {
@ -1608,10 +1615,8 @@ nsSelection::TakeFocus(nsIContent *aNewFocus, PRUint32 aContentOffset,
nsCOMPtr<nsIContent> parent2; nsCOMPtr<nsIContent> parent2;
if (NS_FAILED(aNewFocus->GetParent(*getter_AddRefs(parent))) || !parent) if (NS_FAILED(aNewFocus->GetParent(*getter_AddRefs(parent))) || !parent)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
//if (NS_FAILED(parent->GetParent(*getter_AddRefs(parent2))) || !parent2)
//return NS_ERROR_FAILURE;
//END HACKHACKHACK /checking for root frames/content //END HACKHACKHACK /checking for root frames/content
PRInt8 index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL); PRInt8 index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
domNode = do_QueryInterface(aNewFocus); domNode = do_QueryInterface(aNewFocus);
//traverse through document and unselect crap here //traverse through document and unselect crap here
@ -1688,7 +1693,7 @@ nsSelection::SetMouseDownState(PRBool aState)
mSelectingTableCells = PR_FALSE; mSelectingTableCells = PR_FALSE;
mStartSelectedCell = nsnull; mStartSelectedCell = nsnull;
mEndSelectedCell = nsnull; mEndSelectedCell = nsnull;
NotifySelectionListeners(nsISelectionController::SELECTION_NORMAL); //NotifySelectionListeners(nsISelectionController::SELECTION_NORMAL);
} }
return NS_OK; return NS_OK;
} }
@ -2625,6 +2630,18 @@ nsDOMSelection::nsDOMSelection(nsSelection *aList)
} }
nsDOMSelection::nsDOMSelection()
{
mFixupState = PR_FALSE;
mDirection = eDirNext;
NS_NewISupportsArray(getter_AddRefs(mRangeArray));
mScriptObject = nsnull;
mAutoScrollTimer = nsnull;
NS_NewISupportsArray(getter_AddRefs(mSelectionListeners));
NS_INIT_REFCNT();
}
nsDOMSelection::~nsDOMSelection() nsDOMSelection::~nsDOMSelection()
{ {
@ -2986,7 +3003,7 @@ nsDOMSelection::GetPrimaryFrameForAnchorNode(nsIFrame **aReturnFrame)
PRInt32 frameOffset = 0; PRInt32 frameOffset = 0;
*aReturnFrame = 0; *aReturnFrame = 0;
nsCOMPtr<nsIContent> content = do_QueryInterface(FetchAnchorNode()); nsCOMPtr<nsIContent> content = do_QueryInterface(FetchAnchorNode());
if (content) if (content && mFrameSelection)
return mFrameSelection->GetFrameForNodeOffset(content, FetchAnchorOffset(),aReturnFrame, &frameOffset); return mFrameSelection->GetFrameForNodeOffset(content, FetchAnchorOffset(),aReturnFrame, &frameOffset);
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3001,7 +3018,7 @@ nsDOMSelection::GetPrimaryFrameForFocusNode(nsIFrame **aReturnFrame)
*aReturnFrame = 0; *aReturnFrame = 0;
nsCOMPtr<nsIContent> content = do_QueryInterface(FetchFocusNode()); nsCOMPtr<nsIContent> content = do_QueryInterface(FetchFocusNode());
if (content) if (content && mFrameSelection)
return mFrameSelection->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame, &frameOffset); return mFrameSelection->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame, &frameOffset);
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3017,6 +3034,8 @@ nsDOMSelection::selectFrames(nsIPresContext* aPresContext,
nsIPresShell *aPresShell, nsIPresShell *aPresShell,
PRBool aFlags) PRBool aFlags)
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
nsresult result; nsresult result;
nsCOMPtr<nsIGeneratedContentIterator> genericiter = do_QueryInterface(aInnerIter); nsCOMPtr<nsIGeneratedContentIterator> genericiter = do_QueryInterface(aInnerIter);
if (genericiter && aPresShell) if (genericiter && aPresShell)
@ -3065,6 +3084,8 @@ nsDOMSelection::selectFrames(nsIPresContext* aPresContext,
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::selectFrames(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool aFlags) nsDOMSelection::selectFrames(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool aFlags)
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
if (!aRange || !aPresContext) if (!aRange || !aPresContext)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsIContentIterator> iter; nsCOMPtr<nsIContentIterator> iter;
@ -3314,6 +3335,8 @@ nsresult
nsDOMSelection::StartAutoScrollTimer(nsIPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint, PRUint32 aDelay) nsDOMSelection::StartAutoScrollTimer(nsIPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint, PRUint32 aDelay)
{ {
nsresult result; nsresult result;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (!mAutoScrollTimer) if (!mAutoScrollTimer)
{ {
@ -3572,6 +3595,8 @@ nsDOMSelection::GetEnumerator(nsIEnumerator **aIterator)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::ClearSelection() nsDOMSelection::ClearSelection()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
nsCOMPtr<nsIPresContext> presContext; nsCOMPtr<nsIPresContext> presContext;
GetPresContext(getter_AddRefs(presContext)); GetPresContext(getter_AddRefs(presContext));
@ -3608,7 +3633,8 @@ nsDOMSelection::AddRange(nsIDOMRange* aRange)
GetPresContext(getter_AddRefs(presContext)); GetPresContext(getter_AddRefs(presContext));
selectFrames(presContext, aRange, PR_TRUE); selectFrames(presContext, aRange, PR_TRUE);
//ScrollIntoView(); this should not happen automatically //ScrollIntoView(); this should not happen automatically
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -3632,6 +3658,8 @@ nsDOMSelection::RemoveRange(nsIDOMRange* aRange)
ScrollIntoView(); ScrollIntoView();
} }
} }
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -3695,7 +3723,8 @@ nsDOMSelection::Collapse(nsIDOMNode* aParentNode, PRInt32 aOffset)
selectFrames(presContext, range,PR_TRUE); selectFrames(presContext, range,PR_TRUE);
if (NS_FAILED(result)) if (NS_FAILED(result))
return result; return result;
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -4503,6 +4532,8 @@ nsDOMSelection::Extend(nsIDOMNode* aParentNode, PRInt32 aOffset)
printf ("Sel. Extend set to null parent.\n"); printf ("Sel. Extend set to null parent.\n");
} }
#endif #endif
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -4572,6 +4603,8 @@ nsDOMSelection::ContainsNode(nsIDOMNode* aNode, PRBool aRecursive, PRBool* aYes)
nsresult nsresult
nsDOMSelection::GetPresContext(nsIPresContext **aPresContext) nsDOMSelection::GetPresContext(nsIPresContext **aPresContext)
{ {
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsIFocusTracker *tracker = mFrameSelection->GetTracker(); nsIFocusTracker *tracker = mFrameSelection->GetTracker();
if (!tracker) if (!tracker)
@ -4584,6 +4617,8 @@ nsresult
nsDOMSelection::GetPresShell(nsIPresShell **aPresShell) nsDOMSelection::GetPresShell(nsIPresShell **aPresShell)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsIFocusTracker *tracker = mFrameSelection->GetTracker(); nsIFocusTracker *tracker = mFrameSelection->GetTracker();
@ -4614,6 +4649,8 @@ nsDOMSelection::GetRootScrollableView(nsIScrollableView **aScrollableView)
// NOTE: This method returns a NON-AddRef'd pointer // NOTE: This method returns a NON-AddRef'd pointer
// to the scrollable view! // to the scrollable view!
// //
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsresult rv = NS_OK; nsresult rv = NS_OK;
@ -4648,6 +4685,8 @@ nsresult
nsDOMSelection::GetFrameToRootViewOffset(nsIFrame *aFrame, nscoord *aX, nscoord *aY) nsDOMSelection::GetFrameToRootViewOffset(nsIFrame *aFrame, nscoord *aX, nscoord *aY)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aFrame || !aX || !aY) { if (!aFrame || !aX || !aY) {
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4705,6 +4744,8 @@ nsresult
nsDOMSelection::GetPointFromOffset(nsIFrame *aFrame, PRInt32 aContentOffset, nsPoint *aPoint) nsDOMSelection::GetPointFromOffset(nsIFrame *aFrame, PRInt32 aContentOffset, nsPoint *aPoint)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aFrame || !aPoint) if (!aFrame || !aPoint)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4800,6 +4841,8 @@ nsresult
nsDOMSelection::GetSelectionRegionRect(SelectionRegion aRegion, nsRect *aRect) nsDOMSelection::GetSelectionRegionRect(SelectionRegion aRegion, nsRect *aRect)
{ {
nsresult result = NS_OK; nsresult result = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aRect) if (!aRect)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4976,6 +5019,8 @@ nsDOMSelection::ScrollRectIntoView(nsRect& aRect,
PRIntn aHPercent) PRIntn aHPercent)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_OK;//nothing to do
nsIScrollableView *scrollingView = 0; nsIScrollableView *scrollingView = 0;
@ -5052,6 +5097,8 @@ NS_IMETHODIMP
nsDOMSelection::ScrollIntoView(SelectionRegion aRegion) nsDOMSelection::ScrollIntoView(SelectionRegion aRegion)
{ {
nsresult result; nsresult result;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (mFrameSelection->GetBatching()) if (mFrameSelection->GetBatching())
return NS_OK; return NS_OK;
@ -5119,6 +5166,8 @@ nsDOMSelection::NotifySelectionListeners()
{ {
if (!mSelectionListeners) if (!mSelectionListeners)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (mFrameSelection->GetBatching()){ if (mFrameSelection->GetBatching()){
mFrameSelection->SetDirty(); mFrameSelection->SetDirty();
@ -5152,6 +5201,8 @@ nsDOMSelection::NotifySelectionListeners()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::StartBatchChanges() nsDOMSelection::StartBatchChanges()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->StartBatchChanges(); return mFrameSelection->StartBatchChanges();
} }
@ -5160,6 +5211,8 @@ nsDOMSelection::StartBatchChanges()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::EndBatchChanges() nsDOMSelection::EndBatchChanges()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->EndBatchChanges(); return mFrameSelection->EndBatchChanges();
} }
@ -5168,6 +5221,8 @@ nsDOMSelection::EndBatchChanges()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::DeleteFromDocument() nsDOMSelection::DeleteFromDocument()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->DeleteFromDocument(); return mFrameSelection->DeleteFromDocument();
} }

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

@ -115,6 +115,10 @@
{/* {905F80F1-8A7B-11d2-918C-0080C8E44DB5}*/ \ {/* {905F80F1-8A7B-11d2-918C-0080C8E44DB5}*/ \
0x905f80f1, 0x8a7b, 0x11d2, { 0x91, 0x8c, 0x0, 0x80, 0xc8, 0xe4, 0x4d, 0xb5 } } 0x905f80f1, 0x8a7b, 0x11d2, { 0x91, 0x8c, 0x0, 0x80, 0xc8, 0xe4, 0x4d, 0xb5 } }
#define NS_DOMSELECTION_CID \
{/* {C87A37FC-8109-4ce2-A322-8CDEC925379F}*/ \
0xc87a37fc, 0x8109, 0x4ce2, { 0xa3, 0x22, 0x8c, 0xde, 0xc9, 0x25, 0x37, 0x9f } }
#define NS_RANGE_CID \ #define NS_RANGE_CID \
{/* {56AD2981-8A87-11d2-918C-0080C8E44DB5}*/ \ {/* {56AD2981-8A87-11d2-918C-0080C8E44DB5}*/ \
0x56ad2981, 0x8a87, 0x11d2, { 0x91, 0x8c, 0x0, 0x80, 0xc8, 0xe4, 0x4d, 0xb5 } } 0x56ad2981, 0x8a87, 0x11d2, { 0x91, 0x8c, 0x0, 0x80, 0xc8, 0xe4, 0x4d, 0xb5 } }

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

@ -79,6 +79,8 @@ static NS_DEFINE_IID(kHTMLOptionElementCID, NS_HTMLOPTIONELEMENT_CID);
static NS_DEFINE_CID(kSelectionCID, NS_SELECTION_CID); static NS_DEFINE_CID(kSelectionCID, NS_SELECTION_CID);
static NS_DEFINE_IID(kFrameSelectionCID, NS_FRAMESELECTION_CID); static NS_DEFINE_IID(kFrameSelectionCID, NS_FRAMESELECTION_CID);
static NS_DEFINE_IID(kDOMSelectionCID, NS_DOMSELECTION_CID);
static NS_DEFINE_IID(kRangeCID, NS_RANGE_CID); static NS_DEFINE_IID(kRangeCID, NS_RANGE_CID);
static NS_DEFINE_IID(kContentIteratorCID, NS_CONTENTITERATOR_CID); static NS_DEFINE_IID(kContentIteratorCID, NS_CONTENTITERATOR_CID);
static NS_DEFINE_IID(kGeneratedContentIteratorCID, NS_GENERATEDCONTENTITERATOR_CID); static NS_DEFINE_IID(kGeneratedContentIteratorCID, NS_GENERATEDCONTENTITERATOR_CID);
@ -106,6 +108,7 @@ static NS_DEFINE_CID(kAutoCopyServiceCID, NS_AUTOCOPYSERVICE_CID);
extern nsresult NS_NewSelection(nsIFrameSelection** aResult); extern nsresult NS_NewSelection(nsIFrameSelection** aResult);
extern nsresult NS_NewDomSelection(nsIDOMSelection** aResult);
extern nsresult NS_NewRange(nsIDOMRange** aResult); extern nsresult NS_NewRange(nsIDOMRange** aResult);
extern nsresult NS_NewContentIterator(nsIContentIterator** aResult); extern nsresult NS_NewContentIterator(nsIContentIterator** aResult);
extern nsresult NS_NewGenRegularIterator(nsIContentIterator** aResult); extern nsresult NS_NewGenRegularIterator(nsIContentIterator** aResult);
@ -238,6 +241,13 @@ nsLayoutFactory::CreateInstance(nsISupports *aOuter,
return res; return res;
} }
} }
else if (mClassID.Equals(kDOMSelectionCID)) {
res = NS_NewDomSelection((nsIDOMSelection**)&inst);
if (NS_FAILED(res)) {
LOG_NEW_FAILURE("NS_NewDomSelection", res);
return res;
}
}
else if (mClassID.Equals(kRangeCID)) { else if (mClassID.Equals(kRangeCID)) {
res = NS_NewRange((nsIDOMRange **)&inst); res = NS_NewRange((nsIDOMRange **)&inst);
if (NS_FAILED(res)) { if (NS_FAILED(res)) {

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

@ -737,7 +737,9 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
if ((ui->mUserFocus != NS_STYLE_USER_FOCUS_IGNORE) && if ((ui->mUserFocus != NS_STYLE_USER_FOCUS_IGNORE) &&
(ui->mUserFocus != NS_STYLE_USER_FOCUS_NONE)) { (ui->mUserFocus != NS_STYLE_USER_FOCUS_NONE)) {
currFrame->GetContent(getter_AddRefs(newFocus)); currFrame->GetContent(getter_AddRefs(newFocus));
break; nsCOMPtr<nsIDOMElement> domElement(do_QueryInterface(newFocus));
if (domElement)
break;
} }
currFrame->GetParent(&currFrame); currFrame->GetParent(&currFrame);
} }

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

@ -23,8 +23,8 @@
#include "nsFileControlFrame.h" #include "nsFileControlFrame.h"
#include "nsFormFrame.h" #include "nsFormFrame.h"
#ifdef DEBUG_MJUDGE #ifdef DEBUG_mjudge
#define DEBUG_NEWFRAME 1 #define DEBUG_NEWFRAME 1
#endif #endif

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

@ -24,6 +24,8 @@
class nsIEditor; class nsIEditor;
class nsIDocShell; class nsIDocShell;
class nsISelectionController;
#define NS_IGFXTEXTCONTROLFRAME_IID \ #define NS_IGFXTEXTCONTROLFRAME_IID \
{/* d3ea33ea-9e00-11d3-bccc-0060b0fc76bd*/ \ {/* d3ea33ea-9e00-11d3-bccc-0060b0fc76bd*/ \
@ -46,5 +48,28 @@ public:
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0; NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0;
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0; NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0;
};
#define NS_IGFXTEXTCONTROLFRAME2_IID \
{/* A744CFC9-2DA8-416d-A058-ADB1D4B3B534*/ \
0xa744cfc9, 0x2da8, 0x416d, \
{ 0xa0, 0x58, 0xad, 0xb1, 0xd4, 0xb3, 0xb5, 0x34 } }
class nsIGfxTextControlFrame2 : public nsISupports
{
public:
static const nsIID& GetIID() { static nsIID iid = NS_IGFXTEXTCONTROLFRAME2_IID; return iid; }
NS_IMETHOD GetEditor(nsIEditor **aEditor) = 0;
NS_IMETHOD GetTextLength(PRInt32* aTextLength) = 0;
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart) = 0;
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd) = 0;
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0;
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0;
NS_IMETHOD GetSelectionController(nsISelectionController **aSelCon) = 0;
}; };

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

@ -6307,17 +6307,17 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent, nsGUIEvent* aEvent,
nsEventStatus* aEventStatus) nsEventStatus* aEventStatus)
{ {
nsresult result;
if (aEvent->message == NS_MOUSE_MOVE) { if (aEvent->message == NS_MOUSE_MOVE) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv)){ if (NS_FAILED(result) || !selCon)
nsCOMPtr<nsIFrameSelection> frameselection; return result?result:NS_ERROR_FAILURE;
if (NS_SUCCEEDED(shell->GetFrameSelection(getter_AddRefs(frameselection))) && frameselection){ nsCOMPtr<nsIFrameSelection> frameSelection = do_QueryInterface(selCon);
PRBool mouseDown = PR_FALSE; PRBool mouseDown = PR_FALSE;
if (NS_FAILED(frameselection->GetMouseDownState(&mouseDown)) || !mouseDown) if (!frameSelection || NS_FAILED(frameSelection->GetMouseDownState(&mouseDown)) || !mouseDown)
return NS_OK;//do not handle return NS_OK;//do not handle
}
}
} }
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE || if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE ||
@ -6330,7 +6330,6 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
} }
nsresult result;
nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we
//can tell who to pass it to //can tell who to pass it to
nsCOMPtr<nsILineIterator> it; nsCOMPtr<nsILineIterator> it;

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

@ -6307,17 +6307,17 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent, nsGUIEvent* aEvent,
nsEventStatus* aEventStatus) nsEventStatus* aEventStatus)
{ {
nsresult result;
if (aEvent->message == NS_MOUSE_MOVE) { if (aEvent->message == NS_MOUSE_MOVE) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv)){ if (NS_FAILED(result) || !selCon)
nsCOMPtr<nsIFrameSelection> frameselection; return result?result:NS_ERROR_FAILURE;
if (NS_SUCCEEDED(shell->GetFrameSelection(getter_AddRefs(frameselection))) && frameselection){ nsCOMPtr<nsIFrameSelection> frameSelection = do_QueryInterface(selCon);
PRBool mouseDown = PR_FALSE; PRBool mouseDown = PR_FALSE;
if (NS_FAILED(frameselection->GetMouseDownState(&mouseDown)) || !mouseDown) if (!frameSelection || NS_FAILED(frameSelection->GetMouseDownState(&mouseDown)) || !mouseDown)
return NS_OK;//do not handle return NS_OK;//do not handle
}
}
} }
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE || if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE ||
@ -6330,7 +6330,6 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
} }
nsresult result;
nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we
//can tell who to pass it to //can tell who to pass it to
nsCOMPtr<nsILineIterator> it; nsCOMPtr<nsILineIterator> it;

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

@ -6307,17 +6307,17 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent, nsGUIEvent* aEvent,
nsEventStatus* aEventStatus) nsEventStatus* aEventStatus)
{ {
nsresult result;
if (aEvent->message == NS_MOUSE_MOVE) { if (aEvent->message == NS_MOUSE_MOVE) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv)){ if (NS_FAILED(result) || !selCon)
nsCOMPtr<nsIFrameSelection> frameselection; return result?result:NS_ERROR_FAILURE;
if (NS_SUCCEEDED(shell->GetFrameSelection(getter_AddRefs(frameselection))) && frameselection){ nsCOMPtr<nsIFrameSelection> frameSelection = do_QueryInterface(selCon);
PRBool mouseDown = PR_FALSE; PRBool mouseDown = PR_FALSE;
if (NS_FAILED(frameselection->GetMouseDownState(&mouseDown)) || !mouseDown) if (!frameSelection || NS_FAILED(frameSelection->GetMouseDownState(&mouseDown)) || !mouseDown)
return NS_OK;//do not handle return NS_OK;//do not handle
}
}
} }
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE || if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE ||
@ -6330,7 +6330,6 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
} }
nsresult result;
nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we
//can tell who to pass it to //can tell who to pass it to
nsCOMPtr<nsILineIterator> it; nsCOMPtr<nsILineIterator> it;

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

@ -60,6 +60,8 @@
#include "nsIDOMRange.h" #include "nsIDOMRange.h"
#include "nsITableLayout.h" //selection neccesity #include "nsITableLayout.h" //selection neccesity
#include "nsITableCellLayout.h"// " #include "nsITableCellLayout.h"// "
#include "nsIGfxTextControlFrame.h"
// Some Misc #defines // Some Misc #defines
@ -654,76 +656,71 @@ nsFrame::Paint(nsIPresContext* aPresContext,
const nsRect& aDirtyRect, const nsRect& aDirtyRect,
nsFramePaintLayer aWhichLayer) nsFramePaintLayer aWhichLayer)
{ {
//if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) { nsCOMPtr<nsIDocument> doc;
/** GetDocument nsresult result;
*/ nsCOMPtr<nsIPresShell> shell;
nsCOMPtr<nsIDocument> doc; result = aPresContext->GetShell(getter_AddRefs(shell));
nsresult result; if (NS_FAILED(result))
nsCOMPtr<nsIPresShell> shell; return result;
result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
PRBool displyNonTextSelection = PR_TRUE; PRBool displaySelection = PR_TRUE;
result = shell->GetDisplayNonTextSelection(&displyNonTextSelection); result = shell->GetDisplayNonTextSelection(&displaySelection);
if (NS_FAILED(result)) if (NS_FAILED(result))
return result;
if (!displaySelection)
return NS_OK;
if (mContent) {
result = mContent->GetDocument(*getter_AddRefs(doc));
}
//check frame selection state
PRBool isSelected;
nsFrameState frameState;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
//if not selected then return
if (!isSelected)
return NS_OK; //nothing to do
//get the selection controller
nsCOMPtr<nsISelectionController> selCon;
result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
PRInt16 selectionValue;
selCon->GetDisplaySelection(&selectionValue);
displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
//check display selection state.
if (!displaySelection)
return NS_OK; //if frame does not allow selection. do nothing
nsCOMPtr<nsIContent> newContent;
result = mContent->GetParent(*getter_AddRefs(newContent));
//check to see if we are anonymouse content
PRInt32 offset;
if (NS_SUCCEEDED(result) && newContent){
result = newContent->IndexOf(mContent, offset);
if (NS_FAILED(result))
{
return result; return result;
PRInt16 displaySelection = displyNonTextSelection;
if (!displaySelection)
return NS_OK;
if (mContent) {
result = mContent->GetDocument(*getter_AddRefs(doc));
} }
}
nsCOMPtr<nsISelectionController> selCon; SelectionDetails *details;
result = GetSelectionController(aPresContext, getter_AddRefs(selCon)); if (NS_SUCCEEDED(result) && shell){
if (NS_FAILED(result) || !selCon)
return result? result:NS_ERROR_FAILURE;
selCon->GetDisplaySelection(&displaySelection);
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
// PRInt32 selectionStartOffset = 0;//frame coordinates
// PRInt32 selectionEndOffset = 0;//frame coordinates
if (!displaySelection || !isSelected)
return NS_OK;
nsCOMPtr<nsIDOMSelection> selection;
nsCOMPtr<nsIFrameSelection> frameSelection; nsCOMPtr<nsIFrameSelection> frameSelection;
if (NS_SUCCEEDED(result) && selCon)
nsCOMPtr<nsIContent> newContent; {
result = mContent->GetParent(*getter_AddRefs(newContent)); frameSelection = do_QueryInterface(selCon); //this MAY implement
SelectionDetails *details;
PRInt32 offset;
if (NS_SUCCEEDED(result) && newContent){
result = newContent->IndexOf(mContent, offset);
if (NS_FAILED(result))
{
return result;
}
} }
if (!frameSelection)
if (NS_SUCCEEDED(result) && shell){ result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result) && frameSelection){
nsCOMPtr<nsISelectionController> selCon; result = frameSelection->LookUpSelection(newContent, offset,
result = GetSelectionController(aPresContext, getter_AddRefs(selCon)); 1, &details, PR_FALSE);//look up to see what selection(s) are on this frame
nsCOMPtr<nsIFrameSelection> frameselection;
if (NS_SUCCEEDED(result) && selCon)
{
frameSelection = do_QueryInterface(selCon); //this MAY implement
}
if (!frameSelection)
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result) && frameSelection){
result = frameSelection->LookUpSelection(newContent, offset,
1, &details, PR_FALSE);
}
} }
//} }
if (details) if (details)
{ {
nsRect rect; nsRect rect;
@ -741,8 +738,6 @@ nsFrame::Paint(nsIPresContext* aPresContext,
details = deletingDetails; details = deletingDetails;
} }
delete details; delete details;
//aRenderingContext.DrawLine(rect.x, rect.y, rect.XMost(), rect.YMost());
//aRenderingContext.DrawLine(rect.x, rect.YMost(), rect.XMost(), rect.y);
} }
return NS_OK; return NS_OK;
} }
@ -972,10 +967,18 @@ nsFrame::HandlePress(nsIPresContext* aPresContext,
{ {
if (!IsMouseCaptured(aPresContext)) if (!IsMouseCaptured(aPresContext))
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
if (DisplaySelection(aPresContext) == nsISelectionController::SELECTION_OFF) {
return NS_OK; PRInt16 displayresult = nsISelectionController::SELECTION_OFF;
nsresult rv;
nsCOMPtr<nsISelectionController> selCon;
rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv) && selCon) {
selCon->GetDisplaySelection(&displayresult);
if (displayresult == nsISelectionController::SELECTION_OFF)
return NS_OK;//nothing to do we cannot affect selection from here
} }
nsMouseEvent *me = (nsMouseEvent *)aEvent; nsMouseEvent *me = (nsMouseEvent *)aEvent;
if (me->clickCount >1 ) if (me->clickCount >1 )
return HandleMultiplePress(aPresContext,aEvent,aEventStatus); return HandleMultiplePress(aPresContext,aEvent,aEventStatus);
@ -986,7 +989,7 @@ nsFrame::HandlePress(nsIPresContext* aPresContext,
if (!IsSelectable(this)) if (!IsSelectable(this))
return NS_OK; return NS_OK;
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); rv = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_SUCCEEDED(rv) && shell) { if (NS_SUCCEEDED(rv) && shell) {
PRInt32 startPos = 0; PRInt32 startPos = 0;
// PRUint32 contentOffset = 0; // PRUint32 contentOffset = 0;
@ -1992,23 +1995,19 @@ nsFrame::GetSelectionController(nsIPresContext *aPresContext, nsISelectionContro
nsIFrame *tmp = this; nsIFrame *tmp = this;
while ( NS_SUCCEEDED(tmp->GetParent(&tmp)) && tmp) while ( NS_SUCCEEDED(tmp->GetParent(&tmp)) && tmp)
{ {
tmp->GetFrameState(&state); nsIGfxTextControlFrame2 *tcf;
if (! (state & NS_FRAME_INDEPENDENT_SELECTION)) //we have found the nsGfx* if (NS_SUCCEEDED(tmp->QueryInterface(nsIGfxTextControlFrame2::GetIID(),(void**)&tcf)))
{ {
nsFrame* castParent = NS_STATIC_CAST(nsFrame *,tmp); return tcf->GetSelectionController(aSelCon);
return castParent->GetSelectionController(aPresContext, aSelCon);
} }
} }
} }
else nsCOMPtr<nsIPresShell> shell;
if (NS_SUCCEEDED(aPresContext->GetShell(getter_AddRefs(shell))) && shell)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(shell);
if (NS_SUCCEEDED(aPresContext->GetShell(getter_AddRefs(shell))) && shell) NS_IF_ADDREF(*aSelCon = selCon);
{ return NS_OK;
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(shell);
NS_IF_ADDREF(*aSelCon = selCon);
return NS_OK;
}
} }
return NS_OK; return NS_OK;
} }

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

@ -111,6 +111,7 @@ class nsAutoScrollTimer;
class nsDOMSelection : public nsIDOMSelection , public nsIScriptObjectOwner, public nsSupportsWeakReference class nsDOMSelection : public nsIDOMSelection , public nsIScriptObjectOwner, public nsSupportsWeakReference
{ {
public: public:
nsDOMSelection();
nsDOMSelection(nsSelection *aList); nsDOMSelection(nsSelection *aList);
virtual ~nsDOMSelection(); virtual ~nsDOMSelection();
@ -523,15 +524,21 @@ nsresult NS_NewSelection(nsIFrameSelection **aFrameSelection)
if (!rlist) if (!rlist)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
*aFrameSelection = (nsIFrameSelection *)rlist; *aFrameSelection = (nsIFrameSelection *)rlist;
nsresult result = rlist->AddRef(); rlist->AddRef();
if (!NS_SUCCEEDED(result)) return NS_OK;
{
delete rlist;
}
return result;
} }
nsresult NS_NewDomSelection(nsIDOMSelection **aDomSelection);
nsresult NS_NewDomSelection(nsIDOMSelection **aDomSelection)
{
nsDOMSelection *rlist = new nsDOMSelection;
if (!rlist)
return NS_ERROR_OUT_OF_MEMORY;
*aDomSelection = (nsIDOMSelection *)rlist;
rlist->AddRef();
return NS_OK;
}
//Horrible statics but no choice //Horrible statics but no choice
nsIAtom *nsSelection::sTableAtom = 0; nsIAtom *nsSelection::sTableAtom = 0;
@ -781,12 +788,12 @@ nsSelection::nsSelection()
if (mDomSelections[index]) if (mDomSelections[index])
autoCopyService->Listen(mDomSelections[index]); autoCopyService->Listen(mDomSelections[index]);
} }
mDisplaySelection = nsISelectionController::SELECTION_ON; mDisplaySelection = nsISelectionController::SELECTION_OFF;
} }
nsSelection::~nsSelection() nsSelection::~nsSelection()
{ {
if (sInstanceCount <= 1) if (sInstanceCount <= 1)
{ {
@ -1608,10 +1615,8 @@ nsSelection::TakeFocus(nsIContent *aNewFocus, PRUint32 aContentOffset,
nsCOMPtr<nsIContent> parent2; nsCOMPtr<nsIContent> parent2;
if (NS_FAILED(aNewFocus->GetParent(*getter_AddRefs(parent))) || !parent) if (NS_FAILED(aNewFocus->GetParent(*getter_AddRefs(parent))) || !parent)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
//if (NS_FAILED(parent->GetParent(*getter_AddRefs(parent2))) || !parent2)
//return NS_ERROR_FAILURE;
//END HACKHACKHACK /checking for root frames/content //END HACKHACKHACK /checking for root frames/content
PRInt8 index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL); PRInt8 index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
domNode = do_QueryInterface(aNewFocus); domNode = do_QueryInterface(aNewFocus);
//traverse through document and unselect crap here //traverse through document and unselect crap here
@ -1688,7 +1693,7 @@ nsSelection::SetMouseDownState(PRBool aState)
mSelectingTableCells = PR_FALSE; mSelectingTableCells = PR_FALSE;
mStartSelectedCell = nsnull; mStartSelectedCell = nsnull;
mEndSelectedCell = nsnull; mEndSelectedCell = nsnull;
NotifySelectionListeners(nsISelectionController::SELECTION_NORMAL); //NotifySelectionListeners(nsISelectionController::SELECTION_NORMAL);
} }
return NS_OK; return NS_OK;
} }
@ -2625,6 +2630,18 @@ nsDOMSelection::nsDOMSelection(nsSelection *aList)
} }
nsDOMSelection::nsDOMSelection()
{
mFixupState = PR_FALSE;
mDirection = eDirNext;
NS_NewISupportsArray(getter_AddRefs(mRangeArray));
mScriptObject = nsnull;
mAutoScrollTimer = nsnull;
NS_NewISupportsArray(getter_AddRefs(mSelectionListeners));
NS_INIT_REFCNT();
}
nsDOMSelection::~nsDOMSelection() nsDOMSelection::~nsDOMSelection()
{ {
@ -2986,7 +3003,7 @@ nsDOMSelection::GetPrimaryFrameForAnchorNode(nsIFrame **aReturnFrame)
PRInt32 frameOffset = 0; PRInt32 frameOffset = 0;
*aReturnFrame = 0; *aReturnFrame = 0;
nsCOMPtr<nsIContent> content = do_QueryInterface(FetchAnchorNode()); nsCOMPtr<nsIContent> content = do_QueryInterface(FetchAnchorNode());
if (content) if (content && mFrameSelection)
return mFrameSelection->GetFrameForNodeOffset(content, FetchAnchorOffset(),aReturnFrame, &frameOffset); return mFrameSelection->GetFrameForNodeOffset(content, FetchAnchorOffset(),aReturnFrame, &frameOffset);
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3001,7 +3018,7 @@ nsDOMSelection::GetPrimaryFrameForFocusNode(nsIFrame **aReturnFrame)
*aReturnFrame = 0; *aReturnFrame = 0;
nsCOMPtr<nsIContent> content = do_QueryInterface(FetchFocusNode()); nsCOMPtr<nsIContent> content = do_QueryInterface(FetchFocusNode());
if (content) if (content && mFrameSelection)
return mFrameSelection->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame, &frameOffset); return mFrameSelection->GetFrameForNodeOffset(content, FetchFocusOffset(),aReturnFrame, &frameOffset);
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3017,6 +3034,8 @@ nsDOMSelection::selectFrames(nsIPresContext* aPresContext,
nsIPresShell *aPresShell, nsIPresShell *aPresShell,
PRBool aFlags) PRBool aFlags)
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
nsresult result; nsresult result;
nsCOMPtr<nsIGeneratedContentIterator> genericiter = do_QueryInterface(aInnerIter); nsCOMPtr<nsIGeneratedContentIterator> genericiter = do_QueryInterface(aInnerIter);
if (genericiter && aPresShell) if (genericiter && aPresShell)
@ -3065,6 +3084,8 @@ nsDOMSelection::selectFrames(nsIPresContext* aPresContext,
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::selectFrames(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool aFlags) nsDOMSelection::selectFrames(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool aFlags)
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
if (!aRange || !aPresContext) if (!aRange || !aPresContext)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsIContentIterator> iter; nsCOMPtr<nsIContentIterator> iter;
@ -3314,6 +3335,8 @@ nsresult
nsDOMSelection::StartAutoScrollTimer(nsIPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint, PRUint32 aDelay) nsDOMSelection::StartAutoScrollTimer(nsIPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint, PRUint32 aDelay)
{ {
nsresult result; nsresult result;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (!mAutoScrollTimer) if (!mAutoScrollTimer)
{ {
@ -3572,6 +3595,8 @@ nsDOMSelection::GetEnumerator(nsIEnumerator **aIterator)
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::ClearSelection() nsDOMSelection::ClearSelection()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
nsCOMPtr<nsIPresContext> presContext; nsCOMPtr<nsIPresContext> presContext;
GetPresContext(getter_AddRefs(presContext)); GetPresContext(getter_AddRefs(presContext));
@ -3608,7 +3633,8 @@ nsDOMSelection::AddRange(nsIDOMRange* aRange)
GetPresContext(getter_AddRefs(presContext)); GetPresContext(getter_AddRefs(presContext));
selectFrames(presContext, aRange, PR_TRUE); selectFrames(presContext, aRange, PR_TRUE);
//ScrollIntoView(); this should not happen automatically //ScrollIntoView(); this should not happen automatically
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -3632,6 +3658,8 @@ nsDOMSelection::RemoveRange(nsIDOMRange* aRange)
ScrollIntoView(); ScrollIntoView();
} }
} }
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -3695,7 +3723,8 @@ nsDOMSelection::Collapse(nsIDOMNode* aParentNode, PRInt32 aOffset)
selectFrames(presContext, range,PR_TRUE); selectFrames(presContext, range,PR_TRUE);
if (NS_FAILED(result)) if (NS_FAILED(result))
return result; return result;
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -4503,6 +4532,8 @@ nsDOMSelection::Extend(nsIDOMNode* aParentNode, PRInt32 aOffset)
printf ("Sel. Extend set to null parent.\n"); printf ("Sel. Extend set to null parent.\n");
} }
#endif #endif
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->NotifySelectionListeners(GetType()); return mFrameSelection->NotifySelectionListeners(GetType());
} }
@ -4572,6 +4603,8 @@ nsDOMSelection::ContainsNode(nsIDOMNode* aNode, PRBool aRecursive, PRBool* aYes)
nsresult nsresult
nsDOMSelection::GetPresContext(nsIPresContext **aPresContext) nsDOMSelection::GetPresContext(nsIPresContext **aPresContext)
{ {
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsIFocusTracker *tracker = mFrameSelection->GetTracker(); nsIFocusTracker *tracker = mFrameSelection->GetTracker();
if (!tracker) if (!tracker)
@ -4584,6 +4617,8 @@ nsresult
nsDOMSelection::GetPresShell(nsIPresShell **aPresShell) nsDOMSelection::GetPresShell(nsIPresShell **aPresShell)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsIFocusTracker *tracker = mFrameSelection->GetTracker(); nsIFocusTracker *tracker = mFrameSelection->GetTracker();
@ -4614,6 +4649,8 @@ nsDOMSelection::GetRootScrollableView(nsIScrollableView **aScrollableView)
// NOTE: This method returns a NON-AddRef'd pointer // NOTE: This method returns a NON-AddRef'd pointer
// to the scrollable view! // to the scrollable view!
// //
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
nsresult rv = NS_OK; nsresult rv = NS_OK;
@ -4648,6 +4685,8 @@ nsresult
nsDOMSelection::GetFrameToRootViewOffset(nsIFrame *aFrame, nscoord *aX, nscoord *aY) nsDOMSelection::GetFrameToRootViewOffset(nsIFrame *aFrame, nscoord *aX, nscoord *aY)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aFrame || !aX || !aY) { if (!aFrame || !aX || !aY) {
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4705,6 +4744,8 @@ nsresult
nsDOMSelection::GetPointFromOffset(nsIFrame *aFrame, PRInt32 aContentOffset, nsPoint *aPoint) nsDOMSelection::GetPointFromOffset(nsIFrame *aFrame, PRInt32 aContentOffset, nsPoint *aPoint)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aFrame || !aPoint) if (!aFrame || !aPoint)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4800,6 +4841,8 @@ nsresult
nsDOMSelection::GetSelectionRegionRect(SelectionRegion aRegion, nsRect *aRect) nsDOMSelection::GetSelectionRegionRect(SelectionRegion aRegion, nsRect *aRect)
{ {
nsresult result = NS_OK; nsresult result = NS_OK;
if (!mFrameSelection)
return NS_ERROR_FAILURE;//nothing to do
if (!aRect) if (!aRect)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
@ -4976,6 +5019,8 @@ nsDOMSelection::ScrollRectIntoView(nsRect& aRect,
PRIntn aHPercent) PRIntn aHPercent)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (!mFrameSelection)
return NS_OK;//nothing to do
nsIScrollableView *scrollingView = 0; nsIScrollableView *scrollingView = 0;
@ -5052,6 +5097,8 @@ NS_IMETHODIMP
nsDOMSelection::ScrollIntoView(SelectionRegion aRegion) nsDOMSelection::ScrollIntoView(SelectionRegion aRegion)
{ {
nsresult result; nsresult result;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (mFrameSelection->GetBatching()) if (mFrameSelection->GetBatching())
return NS_OK; return NS_OK;
@ -5119,6 +5166,8 @@ nsDOMSelection::NotifySelectionListeners()
{ {
if (!mSelectionListeners) if (!mSelectionListeners)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
if (!mFrameSelection)
return NS_OK;//nothing to do
if (mFrameSelection->GetBatching()){ if (mFrameSelection->GetBatching()){
mFrameSelection->SetDirty(); mFrameSelection->SetDirty();
@ -5152,6 +5201,8 @@ nsDOMSelection::NotifySelectionListeners()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::StartBatchChanges() nsDOMSelection::StartBatchChanges()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->StartBatchChanges(); return mFrameSelection->StartBatchChanges();
} }
@ -5160,6 +5211,8 @@ nsDOMSelection::StartBatchChanges()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::EndBatchChanges() nsDOMSelection::EndBatchChanges()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->EndBatchChanges(); return mFrameSelection->EndBatchChanges();
} }
@ -5168,6 +5221,8 @@ nsDOMSelection::EndBatchChanges()
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::DeleteFromDocument() nsDOMSelection::DeleteFromDocument()
{ {
if (!mFrameSelection)
return NS_OK;//nothing to do
return mFrameSelection->DeleteFromDocument(); return mFrameSelection->DeleteFromDocument();
} }

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

@ -1027,7 +1027,7 @@ DrawSelectionIterator::CurrentForeGroundColor()
PRBool PRBool
DrawSelectionIterator::CurrentBackGroundColor(nscolor &aColor) DrawSelectionIterator::CurrentBackGroundColor(nscolor &aColor)
{ {
//Find color based on mTypes[mCurrentIdx]; //Find color based on mTypes[mCurrentIdx];
if (!mTypes) if (!mTypes)
{ {
@ -1750,12 +1750,13 @@ nsTextFrame::PaintUnicodeText(nsIPresContext* aPresContext,
if (NS_FAILED(rv) || !shell) if (NS_FAILED(rv) || !shell)
return; return;
nsCOMPtr<nsISelectionController> selCon; nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(shell, &rv); rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_FAILED(rv) || !selCon) if (NS_FAILED(rv) || !selCon)
return; return;
PRInt16 displaySelection; PRInt16 selectionValue;
selCon->GetDisplaySelection(&displaySelection); selCon->GetDisplaySelection(&selectionValue);
PRBool displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
// Make enough space to transform // Make enough space to transform
nsAutoTextBuffer paintBuffer; nsAutoTextBuffer paintBuffer;
@ -1838,7 +1839,7 @@ nsTextFrame::PaintUnicodeText(nsIPresContext* aPresContext,
} }
//while we have substrings... //while we have substrings...
PRBool drawn = PR_FALSE; PRBool drawn = PR_FALSE;
DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, displaySelection); DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, selectionValue);
if (!iter.IsDone() && iter.First()) if (!iter.IsDone() && iter.First())
{ {
nscoord currentX = dx; nscoord currentX = dx;
@ -2275,12 +2276,13 @@ nsTextFrame::PaintTextSlowly(nsIPresContext* aPresContext,
if (NS_FAILED(rv) || !shell) if (NS_FAILED(rv) || !shell)
return; return;
nsCOMPtr<nsISelectionController> selCon; nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(shell, &rv); rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_FAILED(rv) || !selCon) if (NS_FAILED(rv) || !selCon)
return; return;
PRInt16 displaySelection; PRInt16 selectionValue;
selCon->GetDisplaySelection(&displaySelection); selCon->GetDisplaySelection(&selectionValue);
PRBool displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
// Make enough space to transform // Make enough space to transform
@ -2356,7 +2358,7 @@ nsTextFrame::PaintTextSlowly(nsIPresContext* aPresContext,
sdptr = sdptr->mNext; sdptr = sdptr->mNext;
} }
DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, displaySelection); DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, selectionValue);
if (!iter.IsDone() && iter.First()) if (!iter.IsDone() && iter.First())
{ {
nscoord currentX = dx; nscoord currentX = dx;
@ -2421,13 +2423,14 @@ nsTextFrame::PaintAsciiText(nsIPresContext* aPresContext,
if (NS_FAILED(rv) || !shell) if (NS_FAILED(rv) || !shell)
return; return;
nsCOMPtr<nsISelectionController> selCon; nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(shell, &rv); rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_FAILED(rv) || !selCon) if (NS_FAILED(rv) || !selCon)
return; return;
PRInt16 displaySelection; PRInt16 selectionValue;
PRBool isSelected; PRBool isSelected;
selCon->GetDisplaySelection(&displaySelection); selCon->GetDisplaySelection(&selectionValue);
PRBool displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
isSelected = (mState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT; isSelected = (mState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
@ -2562,7 +2565,7 @@ nsTextFrame::PaintAsciiText(nsIPresContext* aPresContext,
sdptr->mEnd = ip[sdptr->mEnd] - mContentOffset; sdptr->mEnd = ip[sdptr->mEnd] - mContentOffset;
sdptr = sdptr->mNext; sdptr = sdptr->mNext;
} }
DrawSelectionIterator iter(details,(PRUnichar *)text,(PRUint32)textLength,aTextStyle, displaySelection);//ITS OK TO CAST HERE THE RESULT WE USE WILLNOT DO BAD CONVERSION DrawSelectionIterator iter(details,(PRUnichar *)text,(PRUint32)textLength,aTextStyle, selectionValue);//ITS OK TO CAST HERE THE RESULT WE USE WILLNOT DO BAD CONVERSION
if (!iter.IsDone() && iter.First()) if (!iter.IsDone() && iter.First())
{ {
nscoord currentX = dx; nscoord currentX = dx;
@ -3420,9 +3423,10 @@ nsTextFrame::HandleMultiplePress(nsIPresContext* aPresContext,
nsMouseEvent *me = (nsMouseEvent *)aEvent; nsMouseEvent *me = (nsMouseEvent *)aEvent;
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); nsresult rv = aPresContext->GetShell(getter_AddRefs(shell));
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(shell); nsCOMPtr<nsISelectionController> selCon;
if (NS_FAILED(rv) || !shell || !selCon) rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
return rv ?rv:NS_ERROR_FAILURE; if (NS_FAILED(rv) || !selCon)
return rv?rv:NS_ERROR_FAILURE;
if (me->clickCount > 2)//triple clicking if (me->clickCount > 2)//triple clicking
{ {
nsCOMPtr<nsIPref> mPrefs; nsCOMPtr<nsIPref> mPrefs;

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

@ -6307,17 +6307,17 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent, nsGUIEvent* aEvent,
nsEventStatus* aEventStatus) nsEventStatus* aEventStatus)
{ {
nsresult result;
if (aEvent->message == NS_MOUSE_MOVE) { if (aEvent->message == NS_MOUSE_MOVE) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv)){ if (NS_FAILED(result) || !selCon)
nsCOMPtr<nsIFrameSelection> frameselection; return result?result:NS_ERROR_FAILURE;
if (NS_SUCCEEDED(shell->GetFrameSelection(getter_AddRefs(frameselection))) && frameselection){ nsCOMPtr<nsIFrameSelection> frameSelection = do_QueryInterface(selCon);
PRBool mouseDown = PR_FALSE; PRBool mouseDown = PR_FALSE;
if (NS_FAILED(frameselection->GetMouseDownState(&mouseDown)) || !mouseDown) if (!frameSelection || NS_FAILED(frameSelection->GetMouseDownState(&mouseDown)) || !mouseDown)
return NS_OK;//do not handle return NS_OK;//do not handle
}
}
} }
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE || if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE ||
@ -6330,7 +6330,6 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
} }
nsresult result;
nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we
//can tell who to pass it to //can tell who to pass it to
nsCOMPtr<nsILineIterator> it; nsCOMPtr<nsILineIterator> it;

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

@ -6307,17 +6307,17 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent, nsGUIEvent* aEvent,
nsEventStatus* aEventStatus) nsEventStatus* aEventStatus)
{ {
nsresult result;
if (aEvent->message == NS_MOUSE_MOVE) { if (aEvent->message == NS_MOUSE_MOVE) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv)){ if (NS_FAILED(result) || !selCon)
nsCOMPtr<nsIFrameSelection> frameselection; return result?result:NS_ERROR_FAILURE;
if (NS_SUCCEEDED(shell->GetFrameSelection(getter_AddRefs(frameselection))) && frameselection){ nsCOMPtr<nsIFrameSelection> frameSelection = do_QueryInterface(selCon);
PRBool mouseDown = PR_FALSE; PRBool mouseDown = PR_FALSE;
if (NS_FAILED(frameselection->GetMouseDownState(&mouseDown)) || !mouseDown) if (!frameSelection || NS_FAILED(frameSelection->GetMouseDownState(&mouseDown)) || !mouseDown)
return NS_OK;//do not handle return NS_OK;//do not handle
}
}
} }
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE || if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE ||
@ -6330,7 +6330,6 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
} }
nsresult result;
nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we
//can tell who to pass it to //can tell who to pass it to
nsCOMPtr<nsILineIterator> it; nsCOMPtr<nsILineIterator> it;

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

@ -6307,17 +6307,17 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent, nsGUIEvent* aEvent,
nsEventStatus* aEventStatus) nsEventStatus* aEventStatus)
{ {
nsresult result;
if (aEvent->message == NS_MOUSE_MOVE) { if (aEvent->message == NS_MOUSE_MOVE) {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv)){ if (NS_FAILED(result) || !selCon)
nsCOMPtr<nsIFrameSelection> frameselection; return result?result:NS_ERROR_FAILURE;
if (NS_SUCCEEDED(shell->GetFrameSelection(getter_AddRefs(frameselection))) && frameselection){ nsCOMPtr<nsIFrameSelection> frameSelection = do_QueryInterface(selCon);
PRBool mouseDown = PR_FALSE; PRBool mouseDown = PR_FALSE;
if (NS_FAILED(frameselection->GetMouseDownState(&mouseDown)) || !mouseDown) if (!frameSelection || NS_FAILED(frameSelection->GetMouseDownState(&mouseDown)) || !mouseDown)
return NS_OK;//do not handle return NS_OK;//do not handle
}
}
} }
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE || if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN || aEvent->message == NS_MOUSE_MOVE ||
@ -6330,7 +6330,6 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
} }
nsresult result;
nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we nsIFrame *resultFrame = nsnull;//this will be passed the handle event when we
//can tell who to pass it to //can tell who to pass it to
nsCOMPtr<nsILineIterator> it; nsCOMPtr<nsILineIterator> it;

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

@ -60,6 +60,8 @@
#include "nsIDOMRange.h" #include "nsIDOMRange.h"
#include "nsITableLayout.h" //selection neccesity #include "nsITableLayout.h" //selection neccesity
#include "nsITableCellLayout.h"// " #include "nsITableCellLayout.h"// "
#include "nsIGfxTextControlFrame.h"
// Some Misc #defines // Some Misc #defines
@ -654,76 +656,71 @@ nsFrame::Paint(nsIPresContext* aPresContext,
const nsRect& aDirtyRect, const nsRect& aDirtyRect,
nsFramePaintLayer aWhichLayer) nsFramePaintLayer aWhichLayer)
{ {
//if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) { nsCOMPtr<nsIDocument> doc;
/** GetDocument nsresult result;
*/ nsCOMPtr<nsIPresShell> shell;
nsCOMPtr<nsIDocument> doc; result = aPresContext->GetShell(getter_AddRefs(shell));
nsresult result; if (NS_FAILED(result))
nsCOMPtr<nsIPresShell> shell; return result;
result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
PRBool displyNonTextSelection = PR_TRUE; PRBool displaySelection = PR_TRUE;
result = shell->GetDisplayNonTextSelection(&displyNonTextSelection); result = shell->GetDisplayNonTextSelection(&displaySelection);
if (NS_FAILED(result)) if (NS_FAILED(result))
return result;
if (!displaySelection)
return NS_OK;
if (mContent) {
result = mContent->GetDocument(*getter_AddRefs(doc));
}
//check frame selection state
PRBool isSelected;
nsFrameState frameState;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
//if not selected then return
if (!isSelected)
return NS_OK; //nothing to do
//get the selection controller
nsCOMPtr<nsISelectionController> selCon;
result = GetSelectionController(aPresContext, getter_AddRefs(selCon));
PRInt16 selectionValue;
selCon->GetDisplaySelection(&selectionValue);
displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
//check display selection state.
if (!displaySelection)
return NS_OK; //if frame does not allow selection. do nothing
nsCOMPtr<nsIContent> newContent;
result = mContent->GetParent(*getter_AddRefs(newContent));
//check to see if we are anonymouse content
PRInt32 offset;
if (NS_SUCCEEDED(result) && newContent){
result = newContent->IndexOf(mContent, offset);
if (NS_FAILED(result))
{
return result; return result;
PRInt16 displaySelection = displyNonTextSelection;
if (!displaySelection)
return NS_OK;
if (mContent) {
result = mContent->GetDocument(*getter_AddRefs(doc));
} }
}
nsCOMPtr<nsISelectionController> selCon; SelectionDetails *details;
result = GetSelectionController(aPresContext, getter_AddRefs(selCon)); if (NS_SUCCEEDED(result) && shell){
if (NS_FAILED(result) || !selCon)
return result? result:NS_ERROR_FAILURE;
selCon->GetDisplaySelection(&displaySelection);
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
// PRInt32 selectionStartOffset = 0;//frame coordinates
// PRInt32 selectionEndOffset = 0;//frame coordinates
if (!displaySelection || !isSelected)
return NS_OK;
nsCOMPtr<nsIDOMSelection> selection;
nsCOMPtr<nsIFrameSelection> frameSelection; nsCOMPtr<nsIFrameSelection> frameSelection;
if (NS_SUCCEEDED(result) && selCon)
nsCOMPtr<nsIContent> newContent; {
result = mContent->GetParent(*getter_AddRefs(newContent)); frameSelection = do_QueryInterface(selCon); //this MAY implement
SelectionDetails *details;
PRInt32 offset;
if (NS_SUCCEEDED(result) && newContent){
result = newContent->IndexOf(mContent, offset);
if (NS_FAILED(result))
{
return result;
}
} }
if (!frameSelection)
if (NS_SUCCEEDED(result) && shell){ result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result) && frameSelection){
nsCOMPtr<nsISelectionController> selCon; result = frameSelection->LookUpSelection(newContent, offset,
result = GetSelectionController(aPresContext, getter_AddRefs(selCon)); 1, &details, PR_FALSE);//look up to see what selection(s) are on this frame
nsCOMPtr<nsIFrameSelection> frameselection;
if (NS_SUCCEEDED(result) && selCon)
{
frameSelection = do_QueryInterface(selCon); //this MAY implement
}
if (!frameSelection)
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result) && frameSelection){
result = frameSelection->LookUpSelection(newContent, offset,
1, &details, PR_FALSE);
}
} }
//} }
if (details) if (details)
{ {
nsRect rect; nsRect rect;
@ -741,8 +738,6 @@ nsFrame::Paint(nsIPresContext* aPresContext,
details = deletingDetails; details = deletingDetails;
} }
delete details; delete details;
//aRenderingContext.DrawLine(rect.x, rect.y, rect.XMost(), rect.YMost());
//aRenderingContext.DrawLine(rect.x, rect.YMost(), rect.XMost(), rect.y);
} }
return NS_OK; return NS_OK;
} }
@ -972,10 +967,18 @@ nsFrame::HandlePress(nsIPresContext* aPresContext,
{ {
if (!IsMouseCaptured(aPresContext)) if (!IsMouseCaptured(aPresContext))
CaptureMouse(aPresContext, PR_TRUE); CaptureMouse(aPresContext, PR_TRUE);
if (DisplaySelection(aPresContext) == nsISelectionController::SELECTION_OFF) {
return NS_OK; PRInt16 displayresult = nsISelectionController::SELECTION_OFF;
nsresult rv;
nsCOMPtr<nsISelectionController> selCon;
rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_SUCCEEDED(rv) && selCon) {
selCon->GetDisplaySelection(&displayresult);
if (displayresult == nsISelectionController::SELECTION_OFF)
return NS_OK;//nothing to do we cannot affect selection from here
} }
nsMouseEvent *me = (nsMouseEvent *)aEvent; nsMouseEvent *me = (nsMouseEvent *)aEvent;
if (me->clickCount >1 ) if (me->clickCount >1 )
return HandleMultiplePress(aPresContext,aEvent,aEventStatus); return HandleMultiplePress(aPresContext,aEvent,aEventStatus);
@ -986,7 +989,7 @@ nsFrame::HandlePress(nsIPresContext* aPresContext,
if (!IsSelectable(this)) if (!IsSelectable(this))
return NS_OK; return NS_OK;
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); rv = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_SUCCEEDED(rv) && shell) { if (NS_SUCCEEDED(rv) && shell) {
PRInt32 startPos = 0; PRInt32 startPos = 0;
// PRUint32 contentOffset = 0; // PRUint32 contentOffset = 0;
@ -1992,23 +1995,19 @@ nsFrame::GetSelectionController(nsIPresContext *aPresContext, nsISelectionContro
nsIFrame *tmp = this; nsIFrame *tmp = this;
while ( NS_SUCCEEDED(tmp->GetParent(&tmp)) && tmp) while ( NS_SUCCEEDED(tmp->GetParent(&tmp)) && tmp)
{ {
tmp->GetFrameState(&state); nsIGfxTextControlFrame2 *tcf;
if (! (state & NS_FRAME_INDEPENDENT_SELECTION)) //we have found the nsGfx* if (NS_SUCCEEDED(tmp->QueryInterface(nsIGfxTextControlFrame2::GetIID(),(void**)&tcf)))
{ {
nsFrame* castParent = NS_STATIC_CAST(nsFrame *,tmp); return tcf->GetSelectionController(aSelCon);
return castParent->GetSelectionController(aPresContext, aSelCon);
} }
} }
} }
else nsCOMPtr<nsIPresShell> shell;
if (NS_SUCCEEDED(aPresContext->GetShell(getter_AddRefs(shell))) && shell)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(shell);
if (NS_SUCCEEDED(aPresContext->GetShell(getter_AddRefs(shell))) && shell) NS_IF_ADDREF(*aSelCon = selCon);
{ return NS_OK;
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(shell);
NS_IF_ADDREF(*aSelCon = selCon);
return NS_OK;
}
} }
return NS_OK; return NS_OK;
} }

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

@ -651,10 +651,11 @@ public:
NS_IMETHOD ScrollFrameIntoView(nsIFrame *aFrame); NS_IMETHOD ScrollFrameIntoView(nsIFrame *aFrame);
// caret handling // caret handling
NS_IMETHOD GetCaret(nsICaret **aOutCaret); NS_IMETHOD GetCaret(nsICaret **aOutCaret);
NS_IMETHOD SetCaretEnabled(PRBool aaInEnable); NS_IMETHOD SetCaretEnabled(PRBool aInEnable);
NS_IMETHOD SetCaretReadOnly(PRBool aReadOnly);
NS_IMETHOD GetCaretEnabled(PRBool *aOutEnabled); NS_IMETHOD GetCaretEnabled(PRBool *aOutEnabled);
NS_IMETHOD SetDisplayNonTextSelection(PRBool aaInEnable); NS_IMETHOD SetDisplayNonTextSelection(PRBool aInEnable);
NS_IMETHOD GetDisplayNonTextSelection(PRBool *aOutEnable); NS_IMETHOD GetDisplayNonTextSelection(PRBool *aOutEnable);
// nsISelectionController // nsISelectionController
@ -1772,17 +1773,30 @@ NS_IMETHODIMP PresShell::SetCaretEnabled(PRBool aInEnable)
if (mCaret && (mCaretEnabled != oldEnabled)) if (mCaret && (mCaretEnabled != oldEnabled))
{ {
// Update the document's content and frame models. // Update the document's content and frame models.
if (mDocument) mDocument->FlushPendingNotifications(); if (mDocument)
mDocument->FlushPendingNotifications();
if (mCaretEnabled) nsCOMPtr<nsIDOMSelection> sel;
result = mCaret->SetCaretVisible(PR_TRUE); if (NS_SUCCEEDED(GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(sel))) && sel)
else {
result = mCaret->SetCaretVisible(PR_FALSE); result = mCaret->SetCaretVisible(mCaretEnabled, sel);
}
} }
return result; return result;
} }
NS_IMETHODIMP PresShell::SetCaretReadOnly(PRBool aReadOnly)
{
nsCOMPtr<nsIDOMSelection> domSel;
if (NS_SUCCEEDED(GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel))) && domSel)
{
return mCaret->SetCaretReadOnly(aReadOnly, domSel);
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP PresShell::GetCaretEnabled(PRBool *aOutEnabled) NS_IMETHODIMP PresShell::GetCaretEnabled(PRBool *aOutEnabled)
{ {
if (!aOutEnabled) { return NS_ERROR_INVALID_ARG; } if (!aOutEnabled) { return NS_ERROR_INVALID_ARG; }

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

@ -1027,7 +1027,7 @@ DrawSelectionIterator::CurrentForeGroundColor()
PRBool PRBool
DrawSelectionIterator::CurrentBackGroundColor(nscolor &aColor) DrawSelectionIterator::CurrentBackGroundColor(nscolor &aColor)
{ {
//Find color based on mTypes[mCurrentIdx]; //Find color based on mTypes[mCurrentIdx];
if (!mTypes) if (!mTypes)
{ {
@ -1750,12 +1750,13 @@ nsTextFrame::PaintUnicodeText(nsIPresContext* aPresContext,
if (NS_FAILED(rv) || !shell) if (NS_FAILED(rv) || !shell)
return; return;
nsCOMPtr<nsISelectionController> selCon; nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(shell, &rv); rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_FAILED(rv) || !selCon) if (NS_FAILED(rv) || !selCon)
return; return;
PRInt16 displaySelection; PRInt16 selectionValue;
selCon->GetDisplaySelection(&displaySelection); selCon->GetDisplaySelection(&selectionValue);
PRBool displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
// Make enough space to transform // Make enough space to transform
nsAutoTextBuffer paintBuffer; nsAutoTextBuffer paintBuffer;
@ -1838,7 +1839,7 @@ nsTextFrame::PaintUnicodeText(nsIPresContext* aPresContext,
} }
//while we have substrings... //while we have substrings...
PRBool drawn = PR_FALSE; PRBool drawn = PR_FALSE;
DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, displaySelection); DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, selectionValue);
if (!iter.IsDone() && iter.First()) if (!iter.IsDone() && iter.First())
{ {
nscoord currentX = dx; nscoord currentX = dx;
@ -2275,12 +2276,13 @@ nsTextFrame::PaintTextSlowly(nsIPresContext* aPresContext,
if (NS_FAILED(rv) || !shell) if (NS_FAILED(rv) || !shell)
return; return;
nsCOMPtr<nsISelectionController> selCon; nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(shell, &rv); rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_FAILED(rv) || !selCon) if (NS_FAILED(rv) || !selCon)
return; return;
PRInt16 displaySelection; PRInt16 selectionValue;
selCon->GetDisplaySelection(&displaySelection); selCon->GetDisplaySelection(&selectionValue);
PRBool displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
// Make enough space to transform // Make enough space to transform
@ -2356,7 +2358,7 @@ nsTextFrame::PaintTextSlowly(nsIPresContext* aPresContext,
sdptr = sdptr->mNext; sdptr = sdptr->mNext;
} }
DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, displaySelection); DrawSelectionIterator iter(details,text,(PRUint32)textLength,aTextStyle, selectionValue);
if (!iter.IsDone() && iter.First()) if (!iter.IsDone() && iter.First())
{ {
nscoord currentX = dx; nscoord currentX = dx;
@ -2421,13 +2423,14 @@ nsTextFrame::PaintAsciiText(nsIPresContext* aPresContext,
if (NS_FAILED(rv) || !shell) if (NS_FAILED(rv) || !shell)
return; return;
nsCOMPtr<nsISelectionController> selCon; nsCOMPtr<nsISelectionController> selCon;
selCon = do_QueryInterface(shell, &rv); rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
if (NS_FAILED(rv) || !selCon) if (NS_FAILED(rv) || !selCon)
return; return;
PRInt16 displaySelection; PRInt16 selectionValue;
PRBool isSelected; PRBool isSelected;
selCon->GetDisplaySelection(&displaySelection); selCon->GetDisplaySelection(&selectionValue);
PRBool displaySelection = selectionValue > nsISelectionController::SELECTION_HIDDEN;
isSelected = (mState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT; isSelected = (mState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
@ -2562,7 +2565,7 @@ nsTextFrame::PaintAsciiText(nsIPresContext* aPresContext,
sdptr->mEnd = ip[sdptr->mEnd] - mContentOffset; sdptr->mEnd = ip[sdptr->mEnd] - mContentOffset;
sdptr = sdptr->mNext; sdptr = sdptr->mNext;
} }
DrawSelectionIterator iter(details,(PRUnichar *)text,(PRUint32)textLength,aTextStyle, displaySelection);//ITS OK TO CAST HERE THE RESULT WE USE WILLNOT DO BAD CONVERSION DrawSelectionIterator iter(details,(PRUnichar *)text,(PRUint32)textLength,aTextStyle, selectionValue);//ITS OK TO CAST HERE THE RESULT WE USE WILLNOT DO BAD CONVERSION
if (!iter.IsDone() && iter.First()) if (!iter.IsDone() && iter.First())
{ {
nscoord currentX = dx; nscoord currentX = dx;
@ -3420,9 +3423,10 @@ nsTextFrame::HandleMultiplePress(nsIPresContext* aPresContext,
nsMouseEvent *me = (nsMouseEvent *)aEvent; nsMouseEvent *me = (nsMouseEvent *)aEvent;
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell)); nsresult rv = aPresContext->GetShell(getter_AddRefs(shell));
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(shell); nsCOMPtr<nsISelectionController> selCon;
if (NS_FAILED(rv) || !shell || !selCon) rv = GetSelectionController(aPresContext, getter_AddRefs(selCon));
return rv ?rv:NS_ERROR_FAILURE; if (NS_FAILED(rv) || !selCon)
return rv?rv:NS_ERROR_FAILURE;
if (me->clickCount > 2)//triple clicking if (me->clickCount > 2)//triple clicking
{ {
nsCOMPtr<nsIPref> mPrefs; nsCOMPtr<nsIPref> mPrefs;

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

@ -1132,7 +1132,7 @@ nsHTMLInputElement::GetTextLength(PRInt32* aTextLength)
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->GetTextLength(aTextLength); textControlFrame->GetTextLength(aTextLength);
@ -1148,7 +1148,7 @@ nsHTMLInputElement::SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectio
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->SetSelectionRange(aSelectionStart, aSelectionEnd); textControlFrame->SetSelectionRange(aSelectionStart, aSelectionEnd);
@ -1173,7 +1173,7 @@ nsHTMLInputElement::SetSelectionStart(PRInt32 aSelectionStart)
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->SetSelectionStart(aSelectionStart); textControlFrame->SetSelectionStart(aSelectionStart);
@ -1199,7 +1199,7 @@ nsHTMLInputElement::SetSelectionEnd(PRInt32 aSelectionEnd)
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->SetSelectionEnd(aSelectionEnd); textControlFrame->SetSelectionEnd(aSelectionEnd);
@ -1215,7 +1215,7 @@ nsHTMLInputElement::GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelect
nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame); nsresult rv = nsGenericHTMLElement::GetPrimaryFrame(this, formControlFrame);
if (NS_SUCCEEDED(rv) && formControlFrame) if (NS_SUCCEEDED(rv) && formControlFrame)
{ {
nsCOMPtr<nsIGfxTextControlFrame> textControlFrame(do_QueryInterface(formControlFrame)); nsCOMPtr<nsIGfxTextControlFrame2> textControlFrame(do_QueryInterface(formControlFrame));
if (textControlFrame) if (textControlFrame)
textControlFrame->GetSelectionRange(aSelectionStart, aSelectionEnd); textControlFrame->GetSelectionRange(aSelectionStart, aSelectionEnd);

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

@ -24,6 +24,8 @@
class nsIEditor; class nsIEditor;
class nsIDocShell; class nsIDocShell;
class nsISelectionController;
#define NS_IGFXTEXTCONTROLFRAME_IID \ #define NS_IGFXTEXTCONTROLFRAME_IID \
{/* d3ea33ea-9e00-11d3-bccc-0060b0fc76bd*/ \ {/* d3ea33ea-9e00-11d3-bccc-0060b0fc76bd*/ \
@ -46,5 +48,28 @@ public:
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0; NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0;
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0; NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0;
};
#define NS_IGFXTEXTCONTROLFRAME2_IID \
{/* A744CFC9-2DA8-416d-A058-ADB1D4B3B534*/ \
0xa744cfc9, 0x2da8, 0x416d, \
{ 0xa0, 0x58, 0xad, 0xb1, 0xd4, 0xb3, 0xb5, 0x34 } }
class nsIGfxTextControlFrame2 : public nsISupports
{
public:
static const nsIID& GetIID() { static nsIID iid = NS_IGFXTEXTCONTROLFRAME2_IID; return iid; }
NS_IMETHOD GetEditor(nsIEditor **aEditor) = 0;
NS_IMETHOD GetTextLength(PRInt32* aTextLength) = 0;
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart) = 0;
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd) = 0;
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0;
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0;
NS_IMETHOD GetSelectionController(nsISelectionController **aSelCon) = 0;
}; };

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

@ -24,6 +24,8 @@
class nsIEditor; class nsIEditor;
class nsIDocShell; class nsIDocShell;
class nsISelectionController;
#define NS_IGFXTEXTCONTROLFRAME_IID \ #define NS_IGFXTEXTCONTROLFRAME_IID \
{/* d3ea33ea-9e00-11d3-bccc-0060b0fc76bd*/ \ {/* d3ea33ea-9e00-11d3-bccc-0060b0fc76bd*/ \
@ -46,5 +48,28 @@ public:
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0; NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0;
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0; NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0;
};
#define NS_IGFXTEXTCONTROLFRAME2_IID \
{/* A744CFC9-2DA8-416d-A058-ADB1D4B3B534*/ \
0xa744cfc9, 0x2da8, 0x416d, \
{ 0xa0, 0x58, 0xad, 0xb1, 0xd4, 0xb3, 0xb5, 0x34 } }
class nsIGfxTextControlFrame2 : public nsISupports
{
public:
static const nsIID& GetIID() { static nsIID iid = NS_IGFXTEXTCONTROLFRAME2_IID; return iid; }
NS_IMETHOD GetEditor(nsIEditor **aEditor) = 0;
NS_IMETHOD GetTextLength(PRInt32* aTextLength) = 0;
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart) = 0;
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd) = 0;
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) = 0;
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd) = 0;
NS_IMETHOD GetSelectionController(nsISelectionController **aSelCon) = 0;
}; };

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

@ -23,8 +23,8 @@
#include "nsFileControlFrame.h" #include "nsFileControlFrame.h"
#include "nsFormFrame.h" #include "nsFormFrame.h"
#ifdef DEBUG_MJUDGE #ifdef DEBUG_mjudge
#define DEBUG_NEWFRAME 1 #define DEBUG_NEWFRAME 1
#endif #endif

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

@ -45,6 +45,11 @@
#include "nsIElementFactory.h" #include "nsIElementFactory.h"
#include "nsIHTMLContent.h" #include "nsIHTMLContent.h"
#include "nsFormFrame.h" #include "nsFormFrame.h"
#include "nsIEditorIMESupport.h"
#include "nsIDOMHTMLTextAreaElement.h"
#include "nsINameSpaceManager.h"
#include "nsINodeInfo.h"
#include "nsIContent.h" #include "nsIContent.h"
@ -96,6 +101,7 @@ public:
NS_IMETHOD RepaintSelection(PRInt16 type); NS_IMETHOD RepaintSelection(PRInt16 type);
NS_IMETHOD RepaintSelection(nsIPresContext* aPresContext, SelectionType aSelectionType); NS_IMETHOD RepaintSelection(nsIPresContext* aPresContext, SelectionType aSelectionType);
NS_IMETHOD SetCaretEnabled(PRBool enabled); NS_IMETHOD SetCaretEnabled(PRBool enabled);
NS_IMETHOD SetCaretReadOnly(PRBool aReadOnly);
NS_IMETHOD GetCaretEnabled(PRBool *_retval); NS_IMETHOD GetCaretEnabled(PRBool *_retval);
NS_IMETHOD CharacterMove(PRBool aForward, PRBool aExtend); NS_IMETHOD CharacterMove(PRBool aForward, PRBool aExtend);
NS_IMETHOD WordMove(PRBool aForward, PRBool aExtend); NS_IMETHOD WordMove(PRBool aForward, PRBool aExtend);
@ -213,14 +219,45 @@ NS_IMETHODIMP
nsTextAreaSelectionImpl::SetCaretEnabled(PRBool enabled) nsTextAreaSelectionImpl::SetCaretEnabled(PRBool enabled)
{ {
if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED; if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsISelectionController> selCon = do_QueryReferent(mPresShellWeak); nsresult result;
if (selCon) nsCOMPtr<nsIPresShell> shell = do_QueryReferent(mPresShellWeak, &result);
if (shell)
{ {
return selCon->SetCaretEnabled(enabled);//we can use presshells because there is only 1 caret nsCOMPtr<nsICaret> caret;
if (NS_SUCCEEDED(result = shell->GetCaret(getter_AddRefs(caret))))
{
nsCOMPtr<nsIDOMSelection> domSel;
if (NS_SUCCEEDED(result = mFrameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel))))
{
return caret->SetCaretVisible(enabled, domSel);
}
}
} }
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
NS_IMETHODIMP
nsTextAreaSelectionImpl::SetCaretReadOnly(PRBool aReadOnly)
{
if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED;
nsresult result;
nsCOMPtr<nsIPresShell> shell = do_QueryReferent(mPresShellWeak, &result);
if (shell)
{
nsCOMPtr<nsICaret> caret;
if (NS_SUCCEEDED(result = shell->GetCaret(getter_AddRefs(caret))))
{
nsCOMPtr<nsIDOMSelection> domSel;
if (NS_SUCCEEDED(result = mFrameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel))))
{
return caret->SetCaretReadOnly(aReadOnly, domSel);
}
}
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP NS_IMETHODIMP
nsTextAreaSelectionImpl::GetCaretEnabled(PRBool *_retval) nsTextAreaSelectionImpl::GetCaretEnabled(PRBool *_retval)
@ -436,6 +473,10 @@ nsGfxTextControlFrame2::QueryInterface(const nsIID& aIID, void** aInstancePtr)
*aInstancePtr = (void*)(nsIAnonymousContentCreator*) this; *aInstancePtr = (void*)(nsIAnonymousContentCreator*) this;
return NS_OK; return NS_OK;
} }
if (aIID.Equals(NS_GET_IID(nsIGfxTextControlFrame2))) {
*aInstancePtr = (void*)(nsIGfxTextControlFrame2*) this;
return NS_OK;
}
return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr); return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr);
} }
@ -443,6 +484,7 @@ nsGfxTextControlFrame2::nsGfxTextControlFrame2()
{ {
mIsProcessing=PR_FALSE; mIsProcessing=PR_FALSE;
mFormFrame = nsnull; mFormFrame = nsnull;
mCachedState = nsnull;
} }
nsGfxTextControlFrame2::~nsGfxTextControlFrame2() nsGfxTextControlFrame2::~nsGfxTextControlFrame2()
@ -493,7 +535,7 @@ nsGfxTextControlFrame2::CreateFrameFor(nsIPresContext* aPresContext,
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
#define DIV_STRING "user-focus: none; overflow:scroll; border: 0px !important; padding: 0px; margin:0px"
NS_IMETHODIMP NS_IMETHODIMP
nsGfxTextControlFrame2::CreateAnonymousContent(nsIPresContext* aPresContext, nsGfxTextControlFrame2::CreateAnonymousContent(nsIPresContext* aPresContext,
@ -502,18 +544,34 @@ nsGfxTextControlFrame2::CreateAnonymousContent(nsIPresContext* aPresContext,
//create editor //create editor
//create selection //create selection
//init editor with div. //init editor with div.
//====
nsCAutoString progID = NS_ELEMENT_FACTORY_PROGID_PREFIX; //get the presshell
progID += "http://www.w3.org/TR/REC-html40"; mState |= NS_FRAME_INDEPENDENT_SELECTION;
nsresult rv;
NS_WITH_SERVICE(nsIElementFactory, elementFactory, progID, &rv);
if (!elementFactory)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIPresShell> shell;
nsresult rv = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(rv) || !shell)
return rv?rv:NS_ERROR_FAILURE;
//get the document
nsCOMPtr<nsIDocument> doc;
rv = shell->GetDocument(getter_AddRefs(doc));
if (NS_FAILED(rv) || !doc)
return rv?rv:NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMDocument> domdoc = do_QueryInterface(doc, &rv);
if (NS_FAILED(rv) || !domdoc)
return rv?rv:NS_ERROR_FAILURE;
nsCOMPtr<nsIContent> content; nsCOMPtr<nsIContent> content;
elementFactory->CreateInstanceByTag(NS_ConvertToString("div"), getter_AddRefs(content)); nsCOMPtr<nsIDOMElement> domElement;
if (NS_FAILED(domdoc->CreateElement(NS_ConvertToString("div"),getter_AddRefs(domElement))) && domElement)
content = do_QueryInterface(domElement);
if (content) if (content)
{ {
content->SetAttribute(kNameSpaceID_None,nsHTMLAtoms::style, NS_ConvertToString(DIV_STRING), PR_FALSE);
aChildList.AppendElement(content); aChildList.AppendElement(content);
//make the editor //make the editor
@ -525,11 +583,6 @@ nsGfxTextControlFrame2::CreateAnonymousContent(nsIPresContext* aPresContext,
if (!mEditor) if (!mEditor)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
//get the presshell
nsCOMPtr<nsIPresShell> shell;
rv = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(rv) || !shell)
return rv?rv:NS_ERROR_FAILURE;
//create selection //create selection
nsCOMPtr<nsIFrameSelection> frameSel; nsCOMPtr<nsIFrameSelection> frameSel;
rv = nsComponentManager::CreateInstance(kFrameSelectionCID, nsnull, rv = nsComponentManager::CreateInstance(kFrameSelectionCID, nsnull,
@ -539,15 +592,7 @@ nsGfxTextControlFrame2::CreateAnonymousContent(nsIPresContext* aPresContext,
nsTextAreaSelectionImpl * textSelImpl = new nsTextAreaSelectionImpl(frameSel,shell,content); nsTextAreaSelectionImpl * textSelImpl = new nsTextAreaSelectionImpl(frameSel,shell,content);
mSelCon = do_QueryInterface((nsISupports *)(nsISelectionController *)textSelImpl);//this will addref it once mSelCon = do_QueryInterface((nsISupports *)(nsISelectionController *)textSelImpl);//this will addref it once
mSelCon->SetDisplaySelection(nsISelectionController::SELECTION_ON); mSelCon->SetDisplaySelection(nsISelectionController::SELECTION_ON);
//get the document //get the flags
nsCOMPtr<nsIDocument> doc;
rv = shell->GetDocument(getter_AddRefs(doc));
if (NS_FAILED(rv) || !doc)
return rv?rv:NS_ERROR_FAILURE;
nsCOMPtr<nsIDOMDocument> domdoc = do_QueryInterface(doc, &rv);
if (NS_FAILED(rv) || !domdoc)
return rv?rv:NS_ERROR_FAILURE;
//get the flags
PRUint32 editorFlags = 0; PRUint32 editorFlags = 0;
if (IsPlainTextControl()) if (IsPlainTextControl())
editorFlags |= nsIHTMLEditor::eEditorPlaintextMask; editorFlags |= nsIHTMLEditor::eEditorPlaintextMask;
@ -687,6 +732,8 @@ NS_IMETHODIMP nsGfxTextControlFrame2::Reflow(nsIPresContext* aPresConte
const nsHTMLReflowState& aReflowState, const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus) nsReflowStatus& aStatus)
{ {
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
// assuming 1 child // assuming 1 child
nsIFrame* child = mFrames.FirstChild(); nsIFrame* child = mFrames.FirstChild();
//mFrames.FirstChild(aPresContext,nsnull,&child); //mFrames.FirstChild(aPresContext,nsnull,&child);
@ -700,17 +747,11 @@ NS_IMETHODIMP nsGfxTextControlFrame2::Reflow(nsIPresContext* aPresConte
if (kidReflowState.mComputedWidth != NS_INTRINSICSIZE) if (kidReflowState.mComputedWidth != NS_INTRINSICSIZE)
kidReflowState.mComputedWidth -= kidReflowState.mComputedBorderPadding.left + kidReflowState.mComputedBorderPadding.right; kidReflowState.mComputedWidth -= (kidReflowState.mComputedBorderPadding.left + kidReflowState.mComputedBorderPadding.right);
if (kidReflowState.mComputedHeight != NS_INTRINSICSIZE) if (kidReflowState.mComputedHeight != NS_INTRINSICSIZE)
kidReflowState.mComputedHeight -= kidReflowState.mComputedBorderPadding.top + kidReflowState.mComputedBorderPadding.bottom; kidReflowState.mComputedHeight -= (kidReflowState.mComputedBorderPadding.top + kidReflowState.mComputedBorderPadding.bottom);
if (aReflowState.reason == eReflowReason_Initial)
{
aDesiredSize.height = 10;
return nsHTMLContainerFrame::Reflow(aPresContext,aDesiredSize,aReflowState,aStatus);
}
else
if (aReflowState.reason == eReflowReason_Incremental) if (aReflowState.reason == eReflowReason_Incremental)
{ {
if (aReflowState.reflowCommand) { if (aReflowState.reflowCommand) {
@ -747,6 +788,8 @@ NS_IMETHODIMP nsGfxTextControlFrame2::Reflow(nsIPresContext* aPresConte
FinishReflowChild(child, aPresContext, aDesiredSize, aReflowState.mComputedBorderPadding.left, FinishReflowChild(child, aPresContext, aDesiredSize, aReflowState.mComputedBorderPadding.left,
aReflowState.mComputedBorderPadding.top, 0); aReflowState.mComputedBorderPadding.top, 0);
aStatus = NS_FRAME_COMPLETE;
return rv; return rv;
} }
//#endif //#endif
@ -761,14 +804,14 @@ nsGfxTextControlFrame2::GetSkipSides() const
NS_IMETHODIMP NS_IMETHODIMP
nsGfxTextControlFrame2::GetName(nsString* aResult) nsGfxTextControlFrame2::GetName(nsString* aResult)
{ {
nsresult result = NS_FORM_NOTOK; nsresult rv = NS_FORM_NOTOK;
if (mContent) { if (mContent) {
nsIHTMLContent* formControl = nsnull; nsIHTMLContent* formControl = nsnull;
result = mContent->QueryInterface(NS_GET_IID(nsIHTMLContent),(void**)&formControl); rv = mContent->QueryInterface(NS_GET_IID(nsIHTMLContent),(void**)&formControl);
if (NS_SUCCEEDED(result) && formControl) { if (NS_SUCCEEDED(rv) && formControl) {
nsHTMLValue value; nsHTMLValue value;
result = formControl->GetHTMLAttribute(nsHTMLAtoms::name, value); rv = formControl->GetHTMLAttribute(nsHTMLAtoms::name, value);
if (NS_CONTENT_ATTR_HAS_VALUE == result) { if (NS_CONTENT_ATTR_HAS_VALUE == rv) {
if (eHTMLUnit_String == value.GetUnit()) { if (eHTMLUnit_String == value.GetUnit()) {
value.GetStringValue(*aResult); value.GetStringValue(*aResult);
} }
@ -776,22 +819,22 @@ nsGfxTextControlFrame2::GetName(nsString* aResult)
NS_RELEASE(formControl); NS_RELEASE(formControl);
} }
} }
return result; return rv;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsGfxTextControlFrame2::GetType(PRInt32* aType) const nsGfxTextControlFrame2::GetType(PRInt32* aType) const
{ {
nsresult result = NS_FORM_NOTOK; nsresult rv = NS_FORM_NOTOK;
if (mContent) { if (mContent) {
nsIFormControl* formControl = nsnull; nsIFormControl* formControl = nsnull;
result = mContent->QueryInterface(NS_GET_IID(nsIFormControl), (void**)&formControl); rv = mContent->QueryInterface(NS_GET_IID(nsIFormControl), (void**)&formControl);
if ((NS_OK == result) && formControl) { if ((NS_OK == rv) && formControl) {
result = formControl->GetType(aType); rv = formControl->GetType(aType);
NS_RELEASE(formControl); NS_RELEASE(formControl);
} }
} }
return result; return rv;
} }
@ -912,6 +955,282 @@ NS_IMETHODIMP nsGfxTextControlFrame2::GetProperty(nsIAtom* aName, nsString& aVal
} }
NS_IMETHODIMP
nsGfxTextControlFrame2::GetEditor(nsIEditor **aEditor)
{
NS_ENSURE_ARG_POINTER(aEditor);
*aEditor = mEditor;
NS_IF_ADDREF(*aEditor);
return NS_OK;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::GetTextLength(PRInt32* aTextLength)
{
NS_ENSURE_ARG_POINTER(aTextLength);
nsString *str = GetCachedString();
if (str)
{
*aTextLength = str->Length();
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::SetSelectionStart(PRInt32 aSelectionStart)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::SetSelectionEnd(PRInt32 aSelectionEnd)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::GetSelectionController(nsISelectionController **aSelCon)
{
NS_ENSURE_ARG_POINTER(aSelCon);
NS_IF_ADDREF(*aSelCon = mSelCon);
return NS_OK;
}
/////END INTERFACE IMPLEMENTATIONS
////NSIFRAME
NS_IMETHODIMP
nsGfxTextControlFrame2::AttributeChanged(nsIPresContext* aPresContext,
nsIContent* aChild,
PRInt32 aNameSpaceID,
nsIAtom* aAttribute,
PRInt32 aHint)
{
if (!mEditor || !mSelCon) {return NS_ERROR_NOT_INITIALIZED;}
nsresult rv = NS_OK;
if (nsHTMLAtoms::value == aAttribute)
{
if (mEditor)
{
nsString value;
GetText(&value, PR_TRUE); // get the initial value from the content attribute
mEditor->EnableUndo(PR_FALSE); // wipe out undo info
SetTextControlFrameState(value); // set new text value
mEditor->EnableUndo(PR_TRUE); // fire up a new txn stack
}
if (aHint != NS_STYLE_HINT_REFLOW)
nsFormFrame::StyleChangeReflow(aPresContext, this);
}
else if (nsHTMLAtoms::maxlength == aAttribute)
{
PRInt32 maxLength;
nsresult rv = GetMaxLength(&maxLength);
nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(mEditor);
if (htmlEditor)
{
if (NS_CONTENT_ATTR_NOT_THERE != rv)
{ // set the maxLength attribute
htmlEditor->SetMaxTextLength(maxLength);
// if maxLength>docLength, we need to truncate the doc content
}
else { // unset the maxLength attribute
htmlEditor->SetMaxTextLength(-1);
}
}
}
else if (mEditor && nsHTMLAtoms::readonly == aAttribute)
{
nsresult rv = DoesAttributeExist(nsHTMLAtoms::readonly);
PRUint32 flags;
mEditor->GetFlags(&flags);
if (NS_CONTENT_ATTR_NOT_THERE != rv)
{ // set readonly
flags |= nsIHTMLEditor::eEditorReadonlyMask;
if (mSelCon)
mSelCon->SetCaretEnabled(PR_FALSE);
}
else
{ // unset readonly
flags &= ~(nsIHTMLEditor::eEditorReadonlyMask);
if (mSelCon)
mSelCon->SetCaretEnabled(PR_TRUE);
}
mEditor->SetFlags(flags);
}
else if (mEditor && nsHTMLAtoms::disabled == aAttribute)
{
nsCOMPtr<nsIPresShell> shell;
rv = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(rv) || !shell)
return rv?rv:NS_ERROR_FAILURE;
rv = DoesAttributeExist(nsHTMLAtoms::disabled);
PRUint32 flags;
mEditor->GetFlags(&flags);
if (NS_CONTENT_ATTR_NOT_THERE != rv)
{ // set readonly
flags |= nsIHTMLEditor::eEditorDisabledMask;
mSelCon->SetCaretEnabled(PR_FALSE);
mSelCon->SetDisplaySelection(nsISelectionController::SELECTION_OFF);
}
else
{ // unset readonly
flags &= ~(nsIHTMLEditor::eEditorDisabledMask);
mSelCon->SetCaretEnabled(PR_TRUE);
mSelCon->SetDisplaySelection(nsISelectionController::SELECTION_ON);
}
mEditor->SetFlags(flags);
}
else if ((nsHTMLAtoms::size == aAttribute ||
nsHTMLAtoms::rows == aAttribute) && aHint != NS_STYLE_HINT_REFLOW) {
nsFormFrame::StyleChangeReflow(aPresContext, this);
}
// Allow the base class to handle common attributes supported
// by all form elements...
else {
rv = nsHTMLContainerFrame::AttributeChanged(aPresContext, aChild, aNameSpaceID, aAttribute, aHint);
}
return rv;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::GetText(nsString* aText, PRBool aInitialValue)
{
nsresult rv = NS_CONTENT_ATTR_NOT_THERE;
PRInt32 type;
GetType(&type);
if ((NS_FORM_INPUT_TEXT == type) || (NS_FORM_INPUT_PASSWORD == type))
{
if (PR_TRUE==aInitialValue)
{
rv = nsFormControlHelper::GetInputElementValue(mContent, aText, aInitialValue);
}
else
{
if (mEditor)
{
nsCOMPtr<nsIEditorIMESupport> imeSupport = do_QueryInterface(mEditor);
if(imeSupport)
imeSupport->ForceCompositionEnd();
nsString format; format.AssignWithConversion("text/plain");
mEditor->OutputToString(*aText, format, 0);
}
// we've never built our editor, so the content attribute is the value
else
{
rv = nsFormControlHelper::GetInputElementValue(mContent, aText, aInitialValue);
}
}
RemoveNewlines(*aText);
}
else
{
nsIDOMHTMLTextAreaElement* textArea = nsnull;
rv = mContent->QueryInterface(NS_GET_IID(nsIDOMHTMLTextAreaElement), (void**)&textArea);
if ((NS_OK == rv) && textArea) {
if (PR_TRUE == aInitialValue) {
rv = textArea->GetDefaultValue(*aText);
}
else {
if(mEditor) {
nsCOMPtr<nsIEditorIMESupport> imeSupport = do_QueryInterface(mEditor);
if(imeSupport)
imeSupport->ForceCompositionEnd();
}
rv = textArea->GetValue(*aText);
}
NS_RELEASE(textArea);
}
}
return rv;
}
///END NSIFRAME OVERLOADS
/////BEGIN PROTECTED METHODS
void nsGfxTextControlFrame2::RemoveNewlines(nsString &aString)
{
// strip CR/LF and null
static const char badChars[] = {10, 13, 0};
aString.StripChars(badChars);
}
NS_IMETHODIMP
nsGfxTextControlFrame2::GetMaxLength(PRInt32* aSize)
{
*aSize = -1;
nsresult rv = NS_CONTENT_ATTR_NOT_THERE;
nsIHTMLContent* content = nsnull;
mContent->QueryInterface(kIHTMLContentIID, (void**) &content);
if (nsnull != content) {
nsHTMLValue value;
rv = content->GetHTMLAttribute(nsHTMLAtoms::maxlength, value);
if (eHTMLUnit_Integer == value.GetUnit()) {
*aSize = value.GetIntValue();
}
NS_RELEASE(content);
}
return rv;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::DoesAttributeExist(nsIAtom *aAtt)
{
nsresult rv = NS_CONTENT_ATTR_NOT_THERE;
nsIHTMLContent* content = nsnull;
mContent->QueryInterface(kIHTMLContentIID, (void**) &content);
if (nsnull != content)
{
nsHTMLValue value;
rv = content->GetHTMLAttribute(aAtt, value);
NS_RELEASE(content);
}
return rv;
}
nsString *
nsGfxTextControlFrame2::GetCachedString()
{
if (!mCachedState && mEditor)
{
mCachedState = new nsString;
if (!mCachedState)
return nsnull;
GetTextControlFrameState(*mCachedState);
}
return mCachedState;
}
void nsGfxTextControlFrame2::GetTextControlFrameState(nsString& aValue) void nsGfxTextControlFrame2::GetTextControlFrameState(nsString& aValue)
{ {
aValue.SetLength(0); // initialize out param aValue.SetLength(0); // initialize out param
@ -926,8 +1245,8 @@ void nsGfxTextControlFrame2::GetTextControlFrameState(nsString& aValue)
} }
nsFormControlHelper::nsHTMLTextWrap wrapProp; nsFormControlHelper::nsHTMLTextWrap wrapProp;
nsresult result = nsFormControlHelper::GetWrapPropertyEnum(mContent, wrapProp); nsresult rv = nsFormControlHelper::GetWrapPropertyEnum(mContent, wrapProp);
if (NS_CONTENT_ATTR_NOT_THERE != result) if (NS_CONTENT_ATTR_NOT_THERE != rv)
{ {
if (wrapProp == nsFormControlHelper::eHTMLTextWrap_Hard) if (wrapProp == nsFormControlHelper::eHTMLTextWrap_Hard)
{ {
@ -949,7 +1268,7 @@ nsGfxTextControlFrame2::SetTextControlFrameState(const nsString& aValue)
{ {
nsAutoString currentValue; nsAutoString currentValue;
nsAutoString format; format.AssignWithConversion("text/plain"); nsAutoString format; format.AssignWithConversion("text/plain");
nsresult result = mEditor->OutputToString(currentValue, format, 0); nsresult rv = mEditor->OutputToString(currentValue, format, 0);
if (PR_TRUE==IsSingleLineTextControl()) { if (PR_TRUE==IsSingleLineTextControl()) {
RemoveNewlines(currentValue); RemoveNewlines(currentValue);
} }
@ -963,11 +1282,11 @@ nsGfxTextControlFrame2::SetTextControlFrameState(const nsString& aValue)
nsFormControlHelper::PlatformToDOMLineBreaks(currentValue); nsFormControlHelper::PlatformToDOMLineBreaks(currentValue);
nsCOMPtr<nsIDOMDocument>domDoc; nsCOMPtr<nsIDOMDocument>domDoc;
result = mEditor->GetDocument(getter_AddRefs(domDoc)); rv = mEditor->GetDocument(getter_AddRefs(domDoc));
if (NS_FAILED(result)) return; if (NS_FAILED(rv)) return;
if (!domDoc) return; if (!domDoc) return;
result = mEditor->SelectAll(); rv = mEditor->SelectAll();
nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(mEditor); nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(mEditor);
if (!htmlEditor) return; if (!htmlEditor) return;
@ -992,7 +1311,7 @@ nsGfxTextControlFrame2::SetInitialChildList(nsIPresContext* aPresContext,
nsIAtom* aListName, nsIAtom* aListName,
nsIFrame* aChildList) nsIFrame* aChildList)
{ {
nsIFrame *list = aChildList; /*nsIFrame *list = aChildList;
nsFrameState frameState; nsFrameState frameState;
while (list) while (list)
{ {
@ -1001,58 +1320,11 @@ nsGfxTextControlFrame2::SetInitialChildList(nsIPresContext* aPresContext,
list->SetFrameState(frameState); list->SetFrameState(frameState);
list->GetNextSibling(&list); list->GetNextSibling(&list);
} }
nsresult result = nsHTMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList); */
nsresult rv = nsHTMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList);
if (mEditor) if (mEditor)
mEditor->PostCreate(); mEditor->PostCreate();
return result; return rv;
}
NS_IMETHODIMP
nsGfxTextControlFrame2::GetSelectionController(nsIPresContext *aPresContext, nsISelectionController **aSelCon)
{
if (!aSelCon)
return NS_ERROR_INVALID_ARG;
NS_IF_ADDREF(*aSelCon = mSelCon);
return NS_OK;
}
nsresult
nsGfxTextControlFrame2::GetColRowSizeAttr(nsIFormControlFrame* aFrame,
nsIAtom * aColSizeAttr,
nsHTMLValue & aColSize,
nsresult & aColStatus,
nsIAtom * aRowSizeAttr,
nsHTMLValue & aRowSize,
nsresult & aRowStatus)
{
nsIContent* iContent = nsnull;
aFrame->GetFormContent((nsIContent*&) iContent);
if (!iContent) {
return NS_ERROR_FAILURE;
}
nsIHTMLContent* hContent = nsnull;
nsresult result = iContent->QueryInterface(kIHTMLContentIID, (void**)&hContent);
if ((NS_OK != result) || !hContent) {
NS_RELEASE(iContent);
return NS_ERROR_FAILURE;
}
aColStatus = NS_CONTENT_ATTR_NOT_THERE;
if (nsnull != aColSizeAttr) {
aColStatus = hContent->GetHTMLAttribute(aColSizeAttr, aColSize);
}
aRowStatus= NS_CONTENT_ATTR_NOT_THERE;
if (nsnull != aRowSizeAttr) {
aRowStatus = hContent->GetHTMLAttribute(aRowSizeAttr, aRowSize);
}
NS_RELEASE(hContent);
NS_RELEASE(iContent);
return NS_OK;
} }
@ -1061,12 +1333,12 @@ nsGfxTextControlFrame2::GetWidthInCharacters() const
{ {
// see if there's a COL attribute, if so it wins // see if there's a COL attribute, if so it wins
nsCOMPtr<nsIHTMLContent> content; nsCOMPtr<nsIHTMLContent> content;
nsresult result = mContent->QueryInterface(NS_GET_IID(nsIHTMLContent), getter_AddRefs(content)); nsresult rv = mContent->QueryInterface(NS_GET_IID(nsIHTMLContent), getter_AddRefs(content));
if (NS_SUCCEEDED(result) && content) if (NS_SUCCEEDED(rv) && content)
{ {
nsHTMLValue resultValue; nsHTMLValue resultValue;
result = content->GetHTMLAttribute(nsHTMLAtoms::cols, resultValue); rv = content->GetHTMLAttribute(nsHTMLAtoms::cols, resultValue);
if (NS_CONTENT_ATTR_NOT_THERE != result) if (NS_CONTENT_ATTR_NOT_THERE != rv)
{ {
if (resultValue.GetUnit() == eHTMLUnit_Integer) if (resultValue.GetUnit() == eHTMLUnit_Integer)
{ {

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

@ -29,7 +29,7 @@
#include "nsIAnonymousContentCreator.h" #include "nsIAnonymousContentCreator.h"
#include "nsIStatefulFrame.h" #include "nsIStatefulFrame.h"
#include "nsIEditor.h" #include "nsIEditor.h"
#include "nsHTMLValue.h" #include "nsIGfxTextControlFrame.h"
class nsIPresState; class nsIPresState;
@ -45,7 +45,8 @@ class nsISelectionController;
class nsGfxTextControlFrame2 : public nsHTMLContainerFrame, class nsGfxTextControlFrame2 : public nsHTMLContainerFrame,
public nsIAnonymousContentCreator, public nsIFormControlFrame public nsIAnonymousContentCreator, public nsIFormControlFrame,
public nsIGfxTextControlFrame2
{ {
public: public:
nsGfxTextControlFrame2(); nsGfxTextControlFrame2();
@ -74,10 +75,6 @@ public:
NS_IMETHOD SetInitialChildList(nsIPresContext* aPresContext, NS_IMETHOD SetInitialChildList(nsIPresContext* aPresContext,
nsIAtom* aListName, nsIAtom* aListName,
nsIFrame* aChildList); nsIFrame* aChildList);
NS_IMETHOD GetSelectionController(nsIPresContext *aPresContext, nsISelectionController **aSelCon);
//==== BEGIN NSIFORMCONTROLFRAME //==== BEGIN NSIFORMCONTROLFRAME
NS_IMETHOD GetType(PRInt32* aType) const; //* NS_IMETHOD GetType(PRInt32* aType) const; //*
@ -108,9 +105,35 @@ public:
//==== END NSIFORMCONTROLFRAME //==== END NSIFORMCONTROLFRAME
//==== NSIGFXTEXTCONTROLFRAME2
NS_IMETHOD GetEditor(nsIEditor **aEditor);
NS_IMETHOD GetTextLength(PRInt32* aTextLength);
NS_IMETHOD SetSelectionStart(PRInt32 aSelectionStart);
NS_IMETHOD SetSelectionEnd(PRInt32 aSelectionEnd);
NS_IMETHOD SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd);
NS_IMETHOD GetSelectionRange(PRInt32* aSelectionStart, PRInt32* aSelectionEnd);
NS_IMETHOD GetSelectionController(nsISelectionController **aSelCon);
//==== END NSIGFXTEXTCONTROLFRAME2
//==== OVERLOAD of nsIFrame
/** handler for attribute changes to mContent */
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
nsIContent* aChild,
PRInt32 aNameSpaceID,
nsIAtom* aAttribute,
PRInt32 aHint);
NS_IMETHOD GetText(nsString* aText, PRBool aInitialValue);
NS_DECL_ISUPPORTS_INHERITED NS_DECL_ISUPPORTS_INHERITED
protected: protected:
nsString *GetCachedString();
virtual PRIntn GetSkipSides() const; virtual PRIntn GetSkipSides() const;
void RemoveNewlines(nsString &aString);
NS_IMETHOD GetMaxLength(PRInt32* aSize);
NS_IMETHOD DoesAttributeExist(nsIAtom *aAtt);
//helper methods //helper methods
virtual PRBool IsSingleLineTextControl() const; virtual PRBool IsSingleLineTextControl() const;
@ -121,30 +144,12 @@ protected:
nsIContent * aContent, nsIContent * aContent,
nsIFrame** aFrame); nsIFrame** aFrame);
nsresult GetColRowSizeAttr(nsIFormControlFrame* aFrame,
nsIAtom * aColSizeAttr,
nsHTMLValue & aColSize,
nsresult & aColStatus,
nsIAtom * aRowSizeAttr,
nsHTMLValue & aRowSize,
nsresult & aRowStatus);
NS_IMETHOD GetType(PRInt32* aType) const;
nsresult GetColRowSizeAttr(nsIFormControlFrame* aFrame,
nsIAtom * aColSizeAttr,
nsHTMLValue & aColSize,
nsresult & aColStatus,
nsIAtom * aRowSizeAttr,
nsHTMLValue & aRowSize,
nsresult & aRowStatus);
PRInt32 GetWidthInCharacters() const; PRInt32 GetWidthInCharacters() const;
>>>>>>> 1.6
private: private:
nsCOMPtr<nsIEditor> mEditor; nsCOMPtr<nsIEditor> mEditor;
nsCOMPtr<nsISelectionController> mSelCon; nsCOMPtr<nsISelectionController> mSelCon;
nsString mCachedState; nsString *mCachedState;
PRBool mIsProcessing; PRBool mIsProcessing;
nsFormFrame *mFormFrame; nsFormFrame *mFormFrame;
}; };