NS_IMETHODIMP nsTextEditRules::Init(nsPlaintextEditor *aEditor, PRUint32 aFlags) { if (!aEditor) { return NS_ERROR_NULL_POINTER; } mEditor = aEditor; // we hold a non-refcounted reference back to our editor // call SetFlags only aftet mEditor has been initialized! SetFlags(aFlags); nsCOMPtr<nsISelection> selection; mEditor->GetSelection(getter_AddRefs(selection)); NS_ASSERTION(selection, "editor cannot get selection"); // Cache our body node, if available. nsIDOMNode *body = mEditor->GetRoot(); // Put in a magic br if needed. This method handles null selection, // which should never happen anyway nsresult res = CreateBogusNodeIfNeeded(selection); if (NS_FAILED(res)) return res; if (mFlags & nsIPlaintextEditor::eEditorPlaintextMask) { // ensure trailing br node res = CreateTrailingBRIfNeeded(); if (NS_FAILED(res)) return res; } if (body) { // create a range that is the entire body contents nsCOMPtr<nsIDOMRange> wholeDoc = do_CreateInstance("@mozilla.org/content/range;1"); if (!wholeDoc) return NS_ERROR_NULL_POINTER; wholeDoc->SetStart(body,0); nsCOMPtr<nsIDOMNodeList> list; res = body->GetChildNodes(getter_AddRefs(list)); if (NS_FAILED(res)) return res; if (!list) return NS_ERROR_FAILURE; PRUint32 listCount; res = list->GetLength(&listCount); if (NS_FAILED(res)) return res; res = wholeDoc->SetEnd(body, listCount); if (NS_FAILED(res)) return res; // replace newlines in that range with breaks res = ReplaceNewlines(wholeDoc); } PRBool deleteBidiImmediately = PR_FALSE; nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID, &res); if (NS_SUCCEEDED(res)) prefBranch->GetBoolPref("bidi.edit.delete_immediately", &deleteBidiImmediately); mDeleteBidiImmediately = deleteBidiImmediately; return res; }
NS_IMETHODIMP nsTextEditRules::AfterEdit(PRInt32 action, nsIEditor::EDirection aDirection) { if (mLockRulesSniffing) return NS_OK; nsAutoLockRulesSniffing lockIt(this); NS_PRECONDITION(mActionNesting>0, "bad action nesting!"); nsresult res = NS_OK; if (!--mActionNesting) { nsCOMPtr<nsISelection>selection; res = mEditor->GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(res, res); res = mEditor->HandleInlineSpellCheck(action, selection, mCachedSelectionNode, mCachedSelectionOffset, nsnull, 0, nsnull, 0); NS_ENSURE_SUCCESS(res, res); // detect empty doc res = CreateBogusNodeIfNeeded(selection); NS_ENSURE_SUCCESS(res, res); // insure trailing br node res = CreateTrailingBRIfNeeded(); NS_ENSURE_SUCCESS(res, res); // collapse the selection to the trailing BR if it's at the end of our text node CollapseSelectionToTrailingBRIfNeeded(selection); /* After inserting text the cursor Bidi level must be set to the level of the inserted text. * This is difficult, because we cannot know what the level is until after the Bidi algorithm * is applied to the whole paragraph. * * So we set the cursor Bidi level to UNDEFINED here, and the caret code will set it correctly later */ if (action == nsEditor::kOpInsertText || action == nsEditor::kOpInsertIMEText) { nsCOMPtr<nsISelectionPrivate> privateSelection(do_QueryInterface(selection)); nsCOMPtr<nsFrameSelection> frameSelection; privateSelection->GetFrameSelection(getter_AddRefs(frameSelection)); if (frameSelection) { frameSelection->UndefineCaretBidiLevel(); } } } return res; }
NS_IMETHODIMP TextEditRules::AfterEdit(EditAction action, nsIEditor::EDirection aDirection) { if (mLockRulesSniffing) { return NS_OK; } AutoLockRulesSniffing lockIt(this); NS_PRECONDITION(mActionNesting>0, "bad action nesting!"); if (!--mActionNesting) { NS_ENSURE_STATE(mTextEditor); RefPtr<Selection> selection = mTextEditor->GetSelection(); NS_ENSURE_STATE(selection); NS_ENSURE_STATE(mTextEditor); nsresult rv = mTextEditor->HandleInlineSpellCheck(action, selection, GetAsDOMNode(mCachedSelectionNode), mCachedSelectionOffset, nullptr, 0, nullptr, 0); NS_ENSURE_SUCCESS(rv, rv); // no longer uses mCachedSelectionNode, so release it. mCachedSelectionNode = nullptr; // if only trailing <br> remaining remove it rv = RemoveRedundantTrailingBR(); if (NS_FAILED(rv)) { return rv; } // detect empty doc rv = CreateBogusNodeIfNeeded(selection); NS_ENSURE_SUCCESS(rv, rv); // ensure trailing br node rv = CreateTrailingBRIfNeeded(); NS_ENSURE_SUCCESS(rv, rv); // collapse the selection to the trailing BR if it's at the end of our text node CollapseSelectionToTrailingBRIfNeeded(selection); } return NS_OK; }
NS_IMETHODIMP nsTextEditRules::Init(nsPlaintextEditor *aEditor) { if (!aEditor) { return NS_ERROR_NULL_POINTER; } mEditor = aEditor; // we hold a non-refcounted reference back to our editor nsCOMPtr<nsISelection> selection; mEditor->GetSelection(getter_AddRefs(selection)); NS_ASSERTION(selection, "editor cannot get selection"); // Put in a magic br if needed. This method handles null selection, // which should never happen anyway nsresult res = CreateBogusNodeIfNeeded(selection); NS_ENSURE_SUCCESS(res, res); // If the selection hasn't been set up yet, set it up collapsed to the end of // our editable content. PRInt32 rangeCount; res = selection->GetRangeCount(&rangeCount); NS_ENSURE_SUCCESS(res, res); if (!rangeCount) { res = mEditor->EndOfDocument(); NS_ENSURE_SUCCESS(res, res); } if (IsPlaintextEditor()) { // ensure trailing br node res = CreateTrailingBRIfNeeded(); NS_ENSURE_SUCCESS(res, res); } PRBool deleteBidiImmediately = PR_FALSE; nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID, &res); if (NS_SUCCEEDED(res)) prefBranch->GetBoolPref("bidi.edit.delete_immediately", &deleteBidiImmediately); mDeleteBidiImmediately = deleteBidiImmediately; return res; }
NS_IMETHODIMP TextEditRules::Init(TextEditor* aTextEditor) { if (!aTextEditor) { return NS_ERROR_NULL_POINTER; } InitFields(); // We hold a non-refcounted reference back to our editor. mTextEditor = aTextEditor; RefPtr<Selection> selection = mTextEditor->GetSelection(); NS_WARNING_ASSERTION(selection, "editor cannot get selection"); // Put in a magic br if needed. This method handles null selection, // which should never happen anyway nsresult rv = CreateBogusNodeIfNeeded(selection); NS_ENSURE_SUCCESS(rv, rv); // If the selection hasn't been set up yet, set it up collapsed to the end of // our editable content. int32_t rangeCount; rv = selection->GetRangeCount(&rangeCount); NS_ENSURE_SUCCESS(rv, rv); if (!rangeCount) { rv = mTextEditor->CollapseSelectionToEnd(selection); NS_ENSURE_SUCCESS(rv, rv); } if (IsPlaintextEditor()) { // ensure trailing br node rv = CreateTrailingBRIfNeeded(); NS_ENSURE_SUCCESS(rv, rv); } mDeleteBidiImmediately = Preferences::GetBool("bidi.edit.delete_immediately", false); return NS_OK; }
NS_IMETHODIMP nsTextEditRules::Init(nsPlaintextEditor *aEditor) { if (!aEditor) { return NS_ERROR_NULL_POINTER; } mEditor = aEditor; // we hold a non-refcounted reference back to our editor nsCOMPtr<nsISelection> selection; mEditor->GetSelection(getter_AddRefs(selection)); NS_ASSERTION(selection, "editor cannot get selection"); // Cache our body node, if available. nsIDOMNode *body = mEditor->GetRoot(); // Put in a magic br if needed. This method handles null selection, // which should never happen anyway nsresult res = CreateBogusNodeIfNeeded(selection); NS_ENSURE_SUCCESS(res, res); // If the selection hasn't been set up yet, set it up collapsed to the end of // our editable content. PRInt32 rangeCount; res = selection->GetRangeCount(&rangeCount); NS_ENSURE_SUCCESS(res, res); if (!rangeCount) { res = mEditor->EndOfDocument(); NS_ENSURE_SUCCESS(res, res); } if (IsPlaintextEditor()) { // ensure trailing br node res = CreateTrailingBRIfNeeded(); NS_ENSURE_SUCCESS(res, res); } if (body) { // create a range that is the entire body contents nsCOMPtr<nsIDOMRange> wholeDoc = do_CreateInstance("@mozilla.org/content/range;1"); NS_ENSURE_TRUE(wholeDoc, NS_ERROR_NULL_POINTER); wholeDoc->SetStart(body,0); nsCOMPtr<nsIDOMNodeList> list; res = body->GetChildNodes(getter_AddRefs(list)); NS_ENSURE_SUCCESS(res, res); NS_ENSURE_TRUE(list, NS_ERROR_FAILURE); PRUint32 listCount; res = list->GetLength(&listCount); NS_ENSURE_SUCCESS(res, res); res = wholeDoc->SetEnd(body, listCount); NS_ENSURE_SUCCESS(res, res); // replace newlines in that range with breaks res = ReplaceNewlines(wholeDoc); } PRBool deleteBidiImmediately = PR_FALSE; nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID, &res); if (NS_SUCCEEDED(res)) prefBranch->GetBoolPref("bidi.edit.delete_immediately", &deleteBidiImmediately); mDeleteBidiImmediately = deleteBidiImmediately; return res; }