diff --git a/editor/base/nsJSTxnLog.cpp b/editor/base/nsJSTxnLog.cpp new file mode 100644 index 000000000000..9d1b0e42d8d9 --- /dev/null +++ b/editor/base/nsJSTxnLog.cpp @@ -0,0 +1,288 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include +#include "nsJSTxnLog.h" + +#define LOCK_LOG(doc) +#define UNLOCK_LOG(doc) + +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); + +nsJSTxnLog::nsJSTxnLog() +{ + mRefCnt = 0; + mIndentLevel = 0; + mBatchCount = 0; +} + +nsJSTxnLog::~nsJSTxnLog() +{ +} + +#define DEBUG_JS_TXN_LOG_REFCNT 1 + +#ifdef DEBUG_JS_TXN_LOG_REFCNT + +nsrefcnt nsJSTxnLog::AddRef(void) +{ + return ++mRefCnt; +} + +nsrefcnt nsJSTxnLog::Release(void) +{ + NS_PRECONDITION(0 != mRefCnt, "dup release"); + if (--mRefCnt == 0) { + NS_DELETEXPCOM(this); + return 0; + } + return mRefCnt; +} + +#else + +NS_IMPL_ADDREF(nsJSTxnLog) +NS_IMPL_RELEASE(nsJSTxnLog) + +#endif + +NS_IMETHODIMP +nsJSTxnLog::QueryInterface(REFNSIID aIID, void** aInstancePtr) +{ + if (nsnull == aInstancePtr) { + return NS_ERROR_NULL_POINTER; + } + if (aIID.Equals(kISupportsIID)) { + *aInstancePtr = (void*)(nsISupports*)this; + NS_ADDREF_THIS(); + return NS_OK; + } + if (aIID.Equals(nsITransactionListener::GetIID())) { + *aInstancePtr = (void*)(nsITransactionListener*)this; + NS_ADDREF_THIS(); + return NS_OK; + } + *aInstancePtr = 0; + return NS_NOINTERFACE; +} + +NS_IMETHODIMP +nsJSTxnLog::WillDo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel++); + printf("WillDo: %s\n", GetString(aTransaction)); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::DidDo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction, nsresult aDoResult) +{ + LOCK_LOG(this); + + PrintIndent(--mIndentLevel); + printf("DidDo: %s (%d)\n", GetString(aTransaction), aDoResult); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::WillUndo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel++); + + if (aTransaction) + printf("WillUndo: %s\n", GetString(aTransaction)); + else + printf("WillUndoBatch\n"); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::DidUndo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction, nsresult aUndoResult) +{ + LOCK_LOG(this); + + PrintIndent(--mIndentLevel); + + if (aTransaction) + printf("DidUndo: %s (%d)\n", GetString(aTransaction), aUndoResult); + else + printf("EndUndoBatch (%d)\n", aUndoResult); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::WillRedo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel++); + + if (aTransaction) + printf("WillRedo: %s\n", GetString(aTransaction)); + else + printf("WillRedoBatch\n"); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::DidRedo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction, nsresult aRedoResult) +{ + LOCK_LOG(this); + + PrintIndent(--mIndentLevel); + + if (aTransaction) + printf("DidRedo: %s (%d)\n", GetString(aTransaction), aRedoResult); + else + printf("DidRedoBatch (%d)\n", aRedoResult); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::WillBeginBatch(nsITransactionManager *aTxMgr) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel); + printf("WillBeginBatch: %d\n", mBatchCount); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::DidBeginBatch(nsITransactionManager *aTxMgr, nsresult aResult) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel++); + printf("DidBeginBatch: %d (%d)\n", mBatchCount++, aResult); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::WillEndBatch(nsITransactionManager *aTxMgr) +{ + LOCK_LOG(this); + + PrintIndent(--mIndentLevel); + printf("WillEndBatch: %d\n", --mBatchCount); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::DidEndBatch(nsITransactionManager *aTxMgr, nsresult aResult) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel); + printf("DidEndBatch: %d (%d)\n", mBatchCount, aResult); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::WillMerge(nsITransactionManager *aTxMgr, nsITransaction *aTopTransaction, nsITransaction *aTransaction) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel); + printf("WillMerge: %s <-- %s\n", + GetString(aTopTransaction), GetString(aTransaction)); + + UNLOCK_LOG(this); + + return NS_OK; +} + +NS_IMETHODIMP +nsJSTxnLog::DidMerge(nsITransactionManager *aTxMgr, nsITransaction *aTopTransaction, nsITransaction *aTransaction, PRBool aDidMerge, nsresult aMergeResult) +{ + LOCK_LOG(this); + + PrintIndent(mIndentLevel); + printf("DidMerge: %s <-- %s (%s, %d)\n", + GetString(aTopTransaction), GetString(aTransaction), + aDidMerge ? "TRUE" : "FALSE", aMergeResult); + + UNLOCK_LOG(this); + + return NS_OK; +} + +const char * +nsJSTxnLog::GetString(nsITransaction *aTransaction) +{ + static char buf[256]; + + nsString str = ""; + + aTransaction->GetRedoString(&str); + + if (str.Length() == 0) + str = ""; + + buf[0] = '\0'; + str.ToCString(buf, 256); + + return buf; +} + +nsresult +nsJSTxnLog::PrintIndent(PRInt32 aIndentLevel) +{ + PRInt32 i; + + printf(" // "); + + for (i = 0; i < aIndentLevel; i++) + printf(" "); + + return NS_OK; +} diff --git a/editor/base/nsJSTxnLog.h b/editor/base/nsJSTxnLog.h new file mode 100644 index 000000000000..8c5fa5c19cbf --- /dev/null +++ b/editor/base/nsJSTxnLog.h @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://wwwt.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsJSTxnLog_h__ +#define nsJSTxnLog_h__ + +#include "nsITransaction.h" +#include "nsITransactionManager.h" +#include "nsITransactionListener.h" + +/** implementation of a transaction listener object. + * + */ +class nsJSTxnLog : public nsITransactionListener +{ +private: + + PRInt32 mIndentLevel; + PRInt32 mBatchCount; + +public: + + /** The default constructor. + */ + nsJSTxnLog(); + + /** The default destructor. + */ + virtual ~nsJSTxnLog(); + + /* Macro for AddRef(), Release(), and QueryInterface() */ + NS_DECL_ISUPPORTS + + /* nsITransactionListener method implementations. */ + NS_IMETHOD WillDo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction); + NS_IMETHOD DidDo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction, nsresult aDoResult); + NS_IMETHOD WillUndo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction); + NS_IMETHOD DidUndo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction, nsresult aUndoResult); + NS_IMETHOD WillRedo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction); + NS_IMETHOD DidRedo(nsITransactionManager *aTxMgr, nsITransaction *aTransaction, nsresult aRedoResult); + NS_IMETHOD WillBeginBatch(nsITransactionManager *aTxMgr); + NS_IMETHOD DidBeginBatch(nsITransactionManager *aTxMgr, nsresult aResult); + NS_IMETHOD WillEndBatch(nsITransactionManager *aTxMgr); + NS_IMETHOD DidEndBatch(nsITransactionManager *aTxMgr, nsresult aResult); + NS_IMETHOD WillMerge(nsITransactionManager *aTxMgr, nsITransaction *aTopTransaction, nsITransaction *aTransaction); + NS_IMETHOD DidMerge(nsITransactionManager *aTxMgr, nsITransaction *aTopTransaction, nsITransaction *aTransaction, PRBool aDidMerge, nsresult aMergeResult); + + +private: + + /* nsJSTxnLog private methods. */ + const char *GetString(nsITransaction *aTransaction); + nsresult PrintIndent(PRInt32 aIndentLevel); +}; + +#endif // nsJSTxnLog_h__