This commit is contained in:
Olli.Pettay%helsinki.fi 2007-03-19 08:13:01 +00:00
Родитель b9eb989a03
Коммит c9355efc94
4 изменённых файлов: 34 добавлений и 59 удалений

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

@ -1031,6 +1031,7 @@ nsTextControlFrame::nsTextControlFrame(nsIPresShell* aShell, nsStyleContext* aCo
, mDidPreDestroy(PR_FALSE)
, mFireChangeEventState(PR_FALSE)
, mTextListener(nsnull)
, mScrollableView(nsnull)
#ifdef DEBUG
, mCreateFrameForCalled(PR_FALSE)
#endif
@ -1124,10 +1125,7 @@ nsTextControlFrame::PreDestroy()
mEditor = nsnull;
mSelCon = nsnull;
if (mFrameSel) {
mFrameSel->SetScrollableViewProvider(nsnull);
mFrameSel = nsnull;
}
mFrameSel = nsnull;
//unregister self from content
mTextListener->SetFrame(nsnull);
@ -1166,9 +1164,6 @@ nsTextControlFrame::Destroy()
if (!mDidPreDestroy) {
PreDestroy();
}
if (mFrameSel) {
mFrameSel->SetScrollableViewProvider(nsnull);
}
nsContentUtils::DestroyAnonymousContent(&mAnonymousDiv);
nsBoxFrame::Destroy();
}
@ -1387,7 +1382,6 @@ nsTextControlFrame::CreateFrameFor(nsIContent* aContent)
mFrameSel = do_CreateInstance(kFrameSelectionCID, &rv);
if (NS_FAILED(rv))
return nsnull;
mFrameSel->SetScrollableViewProvider(this);
// Create a SelectionController
@ -1870,8 +1864,7 @@ nsresult nsTextControlFrame::SetFormProperty(nsIAtom* aName, const nsAString& aV
// has changed.
SetValueChanged(PR_TRUE);
}
nsresult rv = SetValue(aValue); // set new text value
NS_ENSURE_SUCCESS(rv, rv);
SetValue(aValue); // set new text value
}
else if (nsGkAtoms::select == aName)
{
@ -2573,15 +2566,13 @@ nsTextControlFrame::GetValue(nsAString& aValue, PRBool aIgnoreWrap) const
// END IMPLEMENTING NS_IFORMCONTROLFRAME
nsresult
void
nsTextControlFrame::SetValue(const nsAString& aValue)
{
// XXX this method should actually propagate errors! It'd make debugging it
// so much easier...
if (mEditor && mUseEditor)
{
nsCOMPtr<nsIEditor> editor = mEditor;
nsWeakFrame weakFrame(this);
nsAutoString currentValue;
GetValue(currentValue, PR_FALSE);
if (IsSingleLineTextControl())
@ -2599,9 +2590,9 @@ nsTextControlFrame::SetValue(const nsAString& aValue)
::PlatformToDOMLineBreaks(currentValue);
nsCOMPtr<nsIDOMDocument>domDoc;
nsresult rv = editor->GetDocument(getter_AddRefs(domDoc));
NS_ENSURE_SUCCESS(rv, rv);
NS_ENSURE_STATE(domDoc);
nsresult rv = mEditor->GetDocument(getter_AddRefs(domDoc));
if (NS_FAILED(rv)) return;
if (!domDoc) return;
// Time to mess with our security context... See comments in GetValue()
// for why this is needed. Note that we have to do this up here, because
@ -2621,15 +2612,15 @@ nsTextControlFrame::SetValue(const nsAString& aValue)
}
mSelCon->SelectAll();
nsCOMPtr<nsIPlaintextEditor> plaintextEditor = do_QueryInterface(editor);
if (!plaintextEditor) {
nsCOMPtr<nsIPlaintextEditor> htmlEditor = do_QueryInterface(mEditor);
if (!htmlEditor) {
NS_WARNING("Somehow not a plaintext editor?");
if (pushed) {
JSContext* cx;
stack->Pop(&cx);
NS_ASSERTION(!cx, "Unexpected JSContext popped!");
}
return NS_ERROR_FAILURE;
return;
}
// Since this code does not handle user-generated changes to the text,
@ -2646,21 +2637,21 @@ nsTextControlFrame::SetValue(const nsAString& aValue)
// get the flags, remove readonly and disabled, set the value,
// restore flags
PRUint32 flags, savedFlags;
editor->GetFlags(&savedFlags);
mEditor->GetFlags(&savedFlags);
flags = savedFlags;
flags &= ~(nsIPlaintextEditor::eEditorDisabledMask);
flags &= ~(nsIPlaintextEditor::eEditorReadonlyMask);
editor->SetFlags(flags);
mEditor->SetFlags(flags);
if (currentValue.Length() < 1)
editor->DeleteSelection(nsIEditor::eNone);
mEditor->DeleteSelection(nsIEditor::eNone);
else {
nsCOMPtr<nsIPlaintextEditor> textEditor = do_QueryInterface(editor);
nsCOMPtr<nsIPlaintextEditor> textEditor = do_QueryInterface(mEditor);
if (textEditor)
textEditor->InsertText(currentValue);
}
editor->SetFlags(savedFlags);
mEditor->SetFlags(savedFlags);
if (selPriv)
selPriv->EndBatchChanges();
@ -2670,7 +2661,6 @@ nsTextControlFrame::SetValue(const nsAString& aValue)
NS_ASSERTION(!cx, "Unexpected JSContext popped!");
}
NS_ENSURE_STATE(weakFrame.IsAlive());
if (outerTransaction)
mNotifyOnInput = PR_TRUE;
@ -2683,14 +2673,12 @@ nsTextControlFrame::SetValue(const nsAString& aValue)
}
}
NS_ENSURE_STATE(weakFrame.IsAlive());
nsIScrollableView* scrollableView = GetScrollableView();
if (scrollableView)
if (mScrollableView)
{
// Scroll the upper left corner of the text control's
// content area back into view.
scrollableView->ScrollTo(0, 0, NS_VMREFRESH_NO_SYNC);
mScrollableView->ScrollTo(0, 0, NS_VMREFRESH_NO_SYNC);
}
}
else
@ -2702,7 +2690,6 @@ nsTextControlFrame::SetValue(const nsAString& aValue)
textControl->TakeTextFrameValue(aValue);
}
}
return NS_OK;
}
@ -2761,17 +2748,17 @@ nsTextControlFrame::SetInitialChildList(nsIAtom* aListName,
listener, PR_FALSE, systemGroup);
}
if (scrollableFrame) {
mScrollableView = scrollableFrame->GetScrollableView();
mFrameSel->SetScrollableView(mScrollableView);
}
return rv;
}
nsIScrollableView* nsTextControlFrame::GetScrollableView()
{
nsIFrame* first = GetFirstChild(nsnull);
nsIScrollableFrame* scrollableFrame = nsnull;
if (first) {
CallQueryInterface(first, &scrollableFrame);
}
return scrollableFrame ? scrollableFrame->GetScrollableView() : nsnull;
return mScrollableView;
}
PRBool

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

@ -121,11 +121,7 @@ public:
virtual void PostCreateFrames();
// Utility methods to set current widget state
// Be careful when using this method.
// Calling it may cause |this| to be deleted.
// In that case the method returns an error value.
nsresult SetValue(const nsAString& aValue);
void SetValue(const nsAString& aValue);
NS_IMETHOD SetInitialChildList(nsIAtom* aListName,
nsIFrame* aChildList);
@ -296,6 +292,8 @@ private:
nsCOMPtr<nsISelectionController> mSelCon;
nsCOMPtr<nsFrameSelection> mFrameSel;
nsTextInputListener* mTextListener;
// XXX This seems unsafe; what's keeping it around?
nsIScrollableView *mScrollableView;
nsString mFocusedValue;
#ifdef DEBUG

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

@ -41,7 +41,7 @@
#include "nsIFrame.h"
#include "nsIContent.h"
#include "nsISelectionController.h"
#include "nsIScrollableViewProvider.h"
#include "nsITableLayout.h"
#include "nsITableCellLayout.h"
#include "nsIDOMElement.h"
@ -209,24 +209,14 @@ public:
*/
void Init(nsIPresShell *aShell, nsIContent *aLimiter);
/**
* SetScrollableViewProvider sets the scroll view provider.
* @param aProvider The provider of the scroll view.
/* SetScrollableView sets the scroll view
* @param aScrollView is the scroll view for this selection.
*/
void SetScrollableViewProvider(nsIScrollableViewProvider* aProvider)
{
mScrollableViewProvider = aProvider;
}
void SetScrollableView(nsIScrollableView *aScrollView) { mScrollView = aScrollView; }
/**
* GetScrollableView returns the current scroll view.
/* GetScrollableView gets the current scroll view
*/
nsIScrollableView* GetScrollableView()
{
return mScrollableViewProvider
? mScrollableViewProvider->GetScrollableView()
: nsnull;
}
nsIScrollableView* GetScrollableView() { return mScrollView; }
/** HandleClick will take the focus to the new frame at the new offset and
* will either extend the selection from the old anchor, or replace the old anchor.
@ -642,7 +632,7 @@ private:
#endif
PRInt32 mDesiredX;
nsIScrollableViewProvider* mScrollableViewProvider;
nsIScrollableView *mScrollView;
nsMouseEvent mDelayedMouseEvent;

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

@ -1205,7 +1205,7 @@ nsFrameSelection::Init(nsIPresShell *aShell, nsIContent *aLimiter)
mMouseDownState = PR_FALSE;
mDesiredXSet = PR_FALSE;
mLimiter = aLimiter;
mScrollableViewProvider = nsnull;
mScrollView = nsnull;
mCaretMovementStyle = nsContentUtils::GetIntPref("bidi.edit.caret_movement_style", 2);
}