nsresult nsStyleUpdatingCommand::ToggleState(nsIEditor *aEditor) { nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(aEditor); NS_ENSURE_TRUE(htmlEditor, NS_ERROR_NO_INTERFACE); //create some params now... nsresult rv; nsCOMPtr<nsICommandParams> params = do_CreateInstance(NS_COMMAND_PARAMS_CONTRACTID,&rv); if (NS_FAILED(rv) || !params) return rv; // tags "href" and "name" are special cases in the core editor // they are used to remove named anchor/link and shouldn't be used for insertion bool doTagRemoval; if (mTagName == nsGkAtoms::href || mTagName == nsGkAtoms::name) { doTagRemoval = true; } else { // check current selection; set doTagRemoval if formatting should be removed rv = GetCurrentState(aEditor, params); NS_ENSURE_SUCCESS(rv, rv); rv = params->GetBooleanValue(STATE_ALL, &doTagRemoval); NS_ENSURE_SUCCESS(rv, rv); } if (doTagRemoval) { // Also remove equivalent properties (bug 317093) if (mTagName == nsGkAtoms::b) { rv = RemoveTextProperty(htmlEditor, NS_LITERAL_STRING("strong")); NS_ENSURE_SUCCESS(rv, rv); } else if (mTagName == nsGkAtoms::i) { rv = RemoveTextProperty(htmlEditor, NS_LITERAL_STRING("em")); NS_ENSURE_SUCCESS(rv, rv); } else if (mTagName == nsGkAtoms::strike) { rv = RemoveTextProperty(htmlEditor, NS_LITERAL_STRING("s")); NS_ENSURE_SUCCESS(rv, rv); } rv = RemoveTextProperty(htmlEditor, nsDependentAtomString(mTagName)); } else { // Superscript and Subscript styles are mutually exclusive aEditor->BeginTransaction(); nsDependentAtomString tagName(mTagName); if (mTagName == nsGkAtoms::sub || mTagName == nsGkAtoms::sup) { rv = RemoveTextProperty(htmlEditor, tagName); } if (NS_SUCCEEDED(rv)) rv = SetTextProperty(htmlEditor, tagName); aEditor->EndTransaction(); } return rv; }
nsresult nsStyleUpdatingCommand::ToggleState(nsIEditor *aEditor, const char* aTagName) { nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(aEditor); NS_ENSURE_TRUE(htmlEditor, NS_ERROR_NO_INTERFACE); //create some params now... nsresult rv; nsCOMPtr<nsICommandParams> params = do_CreateInstance(NS_COMMAND_PARAMS_CONTRACTID,&rv); if (NS_FAILED(rv) || !params) return rv; // tags "href" and "name" are special cases in the core editor // they are used to remove named anchor/link and shouldn't be used for insertion nsAutoString tagName; tagName.AssignWithConversion(aTagName); bool doTagRemoval; if (tagName.EqualsLiteral("href") || tagName.EqualsLiteral("name")) doTagRemoval = true; else { // check current selection; set doTagRemoval if formatting should be removed rv = GetCurrentState(aEditor, aTagName, params); NS_ENSURE_SUCCESS(rv, rv); rv = params->GetBooleanValue(STATE_ALL, &doTagRemoval); NS_ENSURE_SUCCESS(rv, rv); } if (doTagRemoval) rv = RemoveTextProperty(aEditor, tagName.get(), nsnull); else { // Superscript and Subscript styles are mutually exclusive nsAutoString removeName; aEditor->BeginTransaction(); if (tagName.EqualsLiteral("sub")) { removeName.AssignLiteral("sup"); rv = RemoveTextProperty(aEditor,tagName.get(), nsnull); } else if (tagName.EqualsLiteral("sup")) { removeName.AssignLiteral("sub"); rv = RemoveTextProperty(aEditor, tagName.get(), nsnull); } if (NS_SUCCEEDED(rv)) rv = SetTextProperty(aEditor,tagName.get(), nsnull, nsnull); aEditor->EndTransaction(); } return rv; }