From 53a4f6ba7dc04239ce6c22c43cf6ab0484a9bcda Mon Sep 17 00:00:00 2001 From: "buster%netscape.com" Date: Fri, 22 Jan 1999 19:05:08 +0000 Subject: [PATCH] delete range now iterates through the selection properly. fixed an xpcom usage problem with macros...ALWAYS use {} on your if statements! git-svn-id: svn://10.0.0.236/trunk@18325 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/editor/base/editor.cpp | 91 +++++++++++++++++----------------- mozilla/editor/core/editor.cpp | 91 +++++++++++++++++----------------- 2 files changed, 90 insertions(+), 92 deletions(-) diff --git a/mozilla/editor/base/editor.cpp b/mozilla/editor/base/editor.cpp index 1366e123661..b25cb3c0a85 100644 --- a/mozilla/editor/base/editor.cpp +++ b/mozilla/editor/base/editor.cpp @@ -843,7 +843,9 @@ nsresult nsEditor::CreateTxnForDeleteSelection(nsIEditor::Direction aDir, // allocate the out-param transaction result = TransactionFactory::GetNewTransaction(kEditAggregateTxnIID, (EditTxn **)aTxn); if (NS_FAILED(result)) + { return result; + } nsISelection* selection; result = mPresShell->GetSelection(&selection); if ((NS_SUCCEEDED(result)) && (nsnull!=selection)) @@ -852,58 +854,47 @@ nsresult nsEditor::CreateTxnForDeleteSelection(nsIEditor::Direction aDir, enumerator = selection; if (enumerator) { - enumerator->First(); - nsISupports *currentItem; - result = enumerator->CurrentItem(¤tItem); - /*while */ if ((NS_SUCCEEDED(result)) && (nsnull!=currentItem)) + for (enumerator->First();NS_OK != enumerator->IsDone() ; enumerator->Next()) { - nsCOMPtr range(currentItem); - PRBool isCollapsed; - range->GetIsCollapsed(&isCollapsed); - if (PR_FALSE==isCollapsed) + nsISupports *currentItem=nsnull; + result = enumerator->CurrentItem(¤tItem); + if ((NS_SUCCEEDED(result)) && (currentItem)) { - DeleteRangeTxn *txn; - result = TransactionFactory::GetNewTransaction(kDeleteRangeTxnIID, (EditTxn **)&txn); - if (nsnull!=txn) + nsCOMPtr range(currentItem); + PRBool isCollapsed; + range->GetIsCollapsed(&isCollapsed); + if (PR_FALSE==isCollapsed) { - txn->Init(range); - (*aTxn)->AppendChild(txn); + DeleteRangeTxn *txn; + result = TransactionFactory::GetNewTransaction(kDeleteRangeTxnIID, (EditTxn **)&txn); + if (nsnull!=txn) + { + txn->Init(range); + (*aTxn)->AppendChild(txn); + } + else + result = NS_ERROR_OUT_OF_MEMORY; } else - result = NS_ERROR_OUT_OF_MEMORY; - } - else - { // we have an insertion point. delete the thing in front of it or behind it, depending on aDir - nsCOMPtr node; - PRInt32 offset; - PRInt32 length=1; - result = range->GetStartParent(getter_AddRefs(node)); - result = range->GetStartOffset(&offset); - nsCOMPtr text(node); - if (node) - { // we have text, so delete a char at the proper offset - // XXX: doesn't handle beginning/end of text node, which needs to jump to next|prev node - if (nsIEditor::eRTL==aDir) - { - if (0!=offset) - offset --; + { // we have an insertion point. delete the thing in front of it or behind it, depending on aDir + nsCOMPtr node; + PRInt32 offset; + PRInt32 length=1; + result = range->GetStartParent(getter_AddRefs(node)); + result = range->GetStartOffset(&offset); + nsCOMPtr text(node); + if (node) + { // we have text, so delete a char at the proper offset + // XXX: doesn't handle beginning/end of text node, which needs to jump to next|prev node + if (nsIEditor::eRTL==aDir) + { + if (0!=offset) + offset --; + } + DeleteTextTxn *txn; + result = CreateTxnForDeleteText(text, offset, length, &txn); + (*aTxn)->AppendChild(txn); } - DeleteTextTxn *txn; - result = CreateTxnForDeleteText(text, offset, length, &txn); - (*aTxn)->AppendChild(txn); - } - } - // XXX: should call IsDone -- waiting for fix from greg - // when fixed, change if to while - if (NS_SUCCEEDED(result)) - { - nsresult nextResult = enumerator->Next(); - // XXX hack for now - if (nextResult==NS_ERROR_FAILURE) - return result; - if (NS_SUCCEEDED(nextResult)) - { - result = enumerator->CurrentItem(¤tItem); } } } @@ -914,7 +905,15 @@ nsresult nsEditor::CreateTxnForDeleteSelection(nsIEditor::Direction aDir, // if we didn't build the transaction correctly, destroy the out-param transaction so we don't leak it. if (NS_FAILED(result)) + { + printf ("new result = %d, NS_FAILED=%d, macro expanded out=%d\n", + result, NS_FAILED(result), ((result) & 0x80000000)); + } + + if (NS_FAILED(result)) + { NS_IF_RELEASE(*aTxn); + } return result; } diff --git a/mozilla/editor/core/editor.cpp b/mozilla/editor/core/editor.cpp index 1366e123661..b25cb3c0a85 100644 --- a/mozilla/editor/core/editor.cpp +++ b/mozilla/editor/core/editor.cpp @@ -843,7 +843,9 @@ nsresult nsEditor::CreateTxnForDeleteSelection(nsIEditor::Direction aDir, // allocate the out-param transaction result = TransactionFactory::GetNewTransaction(kEditAggregateTxnIID, (EditTxn **)aTxn); if (NS_FAILED(result)) + { return result; + } nsISelection* selection; result = mPresShell->GetSelection(&selection); if ((NS_SUCCEEDED(result)) && (nsnull!=selection)) @@ -852,58 +854,47 @@ nsresult nsEditor::CreateTxnForDeleteSelection(nsIEditor::Direction aDir, enumerator = selection; if (enumerator) { - enumerator->First(); - nsISupports *currentItem; - result = enumerator->CurrentItem(¤tItem); - /*while */ if ((NS_SUCCEEDED(result)) && (nsnull!=currentItem)) + for (enumerator->First();NS_OK != enumerator->IsDone() ; enumerator->Next()) { - nsCOMPtr range(currentItem); - PRBool isCollapsed; - range->GetIsCollapsed(&isCollapsed); - if (PR_FALSE==isCollapsed) + nsISupports *currentItem=nsnull; + result = enumerator->CurrentItem(¤tItem); + if ((NS_SUCCEEDED(result)) && (currentItem)) { - DeleteRangeTxn *txn; - result = TransactionFactory::GetNewTransaction(kDeleteRangeTxnIID, (EditTxn **)&txn); - if (nsnull!=txn) + nsCOMPtr range(currentItem); + PRBool isCollapsed; + range->GetIsCollapsed(&isCollapsed); + if (PR_FALSE==isCollapsed) { - txn->Init(range); - (*aTxn)->AppendChild(txn); + DeleteRangeTxn *txn; + result = TransactionFactory::GetNewTransaction(kDeleteRangeTxnIID, (EditTxn **)&txn); + if (nsnull!=txn) + { + txn->Init(range); + (*aTxn)->AppendChild(txn); + } + else + result = NS_ERROR_OUT_OF_MEMORY; } else - result = NS_ERROR_OUT_OF_MEMORY; - } - else - { // we have an insertion point. delete the thing in front of it or behind it, depending on aDir - nsCOMPtr node; - PRInt32 offset; - PRInt32 length=1; - result = range->GetStartParent(getter_AddRefs(node)); - result = range->GetStartOffset(&offset); - nsCOMPtr text(node); - if (node) - { // we have text, so delete a char at the proper offset - // XXX: doesn't handle beginning/end of text node, which needs to jump to next|prev node - if (nsIEditor::eRTL==aDir) - { - if (0!=offset) - offset --; + { // we have an insertion point. delete the thing in front of it or behind it, depending on aDir + nsCOMPtr node; + PRInt32 offset; + PRInt32 length=1; + result = range->GetStartParent(getter_AddRefs(node)); + result = range->GetStartOffset(&offset); + nsCOMPtr text(node); + if (node) + { // we have text, so delete a char at the proper offset + // XXX: doesn't handle beginning/end of text node, which needs to jump to next|prev node + if (nsIEditor::eRTL==aDir) + { + if (0!=offset) + offset --; + } + DeleteTextTxn *txn; + result = CreateTxnForDeleteText(text, offset, length, &txn); + (*aTxn)->AppendChild(txn); } - DeleteTextTxn *txn; - result = CreateTxnForDeleteText(text, offset, length, &txn); - (*aTxn)->AppendChild(txn); - } - } - // XXX: should call IsDone -- waiting for fix from greg - // when fixed, change if to while - if (NS_SUCCEEDED(result)) - { - nsresult nextResult = enumerator->Next(); - // XXX hack for now - if (nextResult==NS_ERROR_FAILURE) - return result; - if (NS_SUCCEEDED(nextResult)) - { - result = enumerator->CurrentItem(¤tItem); } } } @@ -914,7 +905,15 @@ nsresult nsEditor::CreateTxnForDeleteSelection(nsIEditor::Direction aDir, // if we didn't build the transaction correctly, destroy the out-param transaction so we don't leak it. if (NS_FAILED(result)) + { + printf ("new result = %d, NS_FAILED=%d, macro expanded out=%d\n", + result, NS_FAILED(result), ((result) & 0x80000000)); + } + + if (NS_FAILED(result)) + { NS_IF_RELEASE(*aTxn); + } return result; }