diff --git a/mozilla/content/base/src/nsRange.cpp b/mozilla/content/base/src/nsRange.cpp index 0fdc54b3844..244dfca2a71 100644 --- a/mozilla/content/base/src/nsRange.cpp +++ b/mozilla/content/base/src/nsRange.cpp @@ -78,6 +78,16 @@ public: NS_IMETHOD Clone(nsIDOMRange** aReturn); NS_IMETHOD ToString(nsString& aReturn); + +private: + PR_Bool mIsPositioned; + nsIDOMElement* mStartParent; + PRInt32 mStartOffset; + nsIDOMElement* mEndParent; + PRInt32 mEndOffset; + + PR_Bool IsIncreasing(nsIDOMElement* sParent, PRInt32 sOffset, + nsIDOMElement* eParent, PRInt32 eOffset); }; nsresult @@ -105,6 +115,12 @@ nsresult nsRange::QueryInterface(const nsIID& aIID, nsRange::nsRange() { NS_INIT_REFCNT(); + + mIsPositioned = PR_FALSE; + nsIDOMElement* mStartParent = NULL; + PRInt32 mStartOffset = 0; + nsIDOMElement* mEndParent = NULL; + PRInt32 mEndOffset = 0; } nsRange::~nsRange() { @@ -113,65 +129,220 @@ nsRange::~nsRange() { NS_IMPL_ADDREF(nsRange) NS_IMPL_RELEASE(nsRange) -nsresult nsRange::GetIsPositioned(PRBool* aIsPositioned) -{ return NS_ERROR_NOT_IMPLEMENTED; } +PR_Bool nsRange::IsIncreasing(nsIDOMElement* sParent, PRInt32 sOffset, + nsIDOMElement* eParent, PRInt32 eOffset) +{ + // XXX NEED IMPLEMENTATION! + return PR_TRUE; +} -nsresult nsRange::SetIsPositioned(PRBool aIsPositioned) -{ return NS_ERROR_NOT_IMPLEMENTED; } +nsresult nsRange::GetIsPositioned(PRBool* aIsPositioned) +{ + *aIsPositioned = mIsPositioned; + return NS_OK; +} nsresult nsRange::GetStartParent(nsIDOMElement** aStartParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + NS_IF_RELEASE(*aStartParent); + NS_IF_ADDREF(mStartParent); + *aStartParent = mStartParent; + return NS_OK; +} nsresult nsRange::SetStartParent(nsIDOMElement* aStartParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(aStartParent, mStartOffset, + mEndParent, mEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + NS_IF_RELEASE(mStartParent); + NS_IF_ADDREF(aStartParent); + mStartParent = aStartParent; + return NS_OK; +} nsresult nsRange::GetStartOffset(PRInt32* aStartOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + *aStartOffset = mStartOffset; + return NS_OK; +} nsresult nsRange::SetStartOffset(PRInt32 aStartOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(mStartParent, aStartOffset, + mEndParent, mEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + mStartOffset = aStartOffset; + return NS_OK; +} nsresult nsRange::GetEndParent(nsIDOMElement** aEndParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + NS_IF_RELEASE(*aEndParent); + NS_IF_ADDREF(mEndParent); + *aEndParent = mEndParent; + return NS_OK; +} nsresult nsRange::SetEndParent(nsIDOMElement* aEndParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(mStartParent, mStartOffset, + aEndParent, mEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + NS_IF_RELEASE(mEndParent); + NS_IF_ADDREF(aEndParent); + mEndParent = aEndParent; + return NS_OK; +} nsresult nsRange::GetEndOffset(PRInt32* aEndOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + *aEndOffset = mEndOffset; + return NS_OK; +} nsresult nsRange::SetEndOffset(PRInt32 aEndOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(mStartParent, mStartOffset, + mEndParent, aEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + mEndOffset = aEndOffset; + return NS_OK; +} nsresult nsRange::GetIsCollapsed(PRBool* aIsCollapsed) -{ return NS_ERROR_NOT_IMPLEMENTED; } - -nsresult nsRange::SetIsCollapsed(PRBool aIsCollapsed) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (mEndParent == 0 || + (mStartParent == mEndParent && mStartOffset == mEndOffset)) + *aIsCollapsed = PR_TRUE; + else + *aIsCollapsed = PR_FALSE; + return NS_OK; +} nsresult nsRange::GetCommonParent(nsIDOMNode** aCommonParent) { return NS_ERROR_NOT_IMPLEMENTED; } -nsresult nsRange::SetCommonParent(nsIDOMNode* aCommonParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } - nsresult nsRange::SetStart(nsIDOMNode* aParent, PRInt32 aOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + { + NS_IF_RELEASE(mEndParent); + mEndParent = NULL; + mEndOffset = NULL; + mIsPositioned = PR_TRUE; + } + NS_IF_ADDREF(aParent); + mStartParent = aParent; + mStartOffset = aOffset; + return NS_OK; +} nsresult nsRange::SetEnd(nsIDOMNode* aParent, PRInt32 aOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; // can't set end before start + + NS_IF_ADDREF(aParent); + mEndParent = aParent; + mEndOffset = aOffset; + return NS_OK; +} nsresult nsRange::Collapse(PRBool aToStart) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + + if (aToStart) + { + NS_IF_RELEASE(mEndParent); + NS_IF_ADDREF(mStartParent); + mEndParent = mStartParent; + mEndOffset = mStartOffset; + return NS_OK; + } + else + { + NS_IF_RELEASE(mStartParent); + NS_IF_ADDREF(mEndParent); + mStartParent = mEndParent; + mStartOffset = mEndOffset; + return NS_OK; + } +} nsresult nsRange::Unposition() -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + NS_IF_RELEASE(mStartParent); + mStartParent = NULL; + mStartOffset = 0; + NS_IF_RELEASE(mEndParent); + mEndParent = NULL; + mEndOffset = 0; + mIsPositioned = PR_FALSE; + return NS_OK; +} nsresult nsRange::SelectNode(nsIDOMNode* aN) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + nsIDOMNode* node; + nsresult res = aN->GetParentNode(aN, &node); + if (!NS_SUCCEEDED(res)) + return res; + + if (mIsPositioned) + Unposition(); + NS_IF_ADDREF(node); + mStartParent = node; + mStartOffset = 0; // XXX NO DIRECT WAY TO GET CHILD # OF THIS NODE! + NS_IF_ADDREF(node); + mEndParent = node; + mEndOffset = mStartOffset; +} nsresult nsRange::SelectNodeContents(nsIDOMNode* aN) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (mIsPositioned) + Unposition(); + + NS_IF_ADDREF(aN); + mStartParent = aN; + mStartOffset = 0; + NS_IF_ADDREF(aN); + mEndParent = aN; + mEndOffset = 0; // WRONG! SHOULD BE # OF LAST CHILD! +} nsresult nsRange::DeleteContents() { return NS_ERROR_NOT_IMPLEMENTED; } @@ -194,3 +365,19 @@ nsresult nsRange::Clone(nsIDOMRange** aReturn) nsresult nsRange::ToString(nsString& aReturn) { return NS_ERROR_NOT_IMPLEMENTED; } +// +// We don't actually want to allow setting this ... +// it should be set only by actually positioning the range. +// +nsresult nsRange::SetIsPositioned(PRBool aIsPositioned) +{ return NS_ERROR_NOT_IMPLEMENTED; } + +// +// Various other things which we don't want to implement yet: +// +nsresult nsRange::SetIsCollapsed(PRBool aIsCollapsed) +{ return NS_ERROR_NOT_IMPLEMENTED; } + +nsresult nsRange::SetCommonParent(nsIDOMNode* aCommonParent) +{ return NS_ERROR_NOT_IMPLEMENTED; } + diff --git a/mozilla/content/base/src/nsRange.h b/mozilla/content/base/src/nsRange.h new file mode 100644 index 00000000000..6f8a3f3d9cb --- /dev/null +++ b/mozilla/content/base/src/nsRange.h @@ -0,0 +1,31 @@ +/* -*- 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. + */ + +/* + * nsRange.cpp: Implementation of the nsIDOMRange object. + * + * This header file is intended to live inside layout/base/src; + * if you find yourself wanting to export it, that's a sign that + * it's time to implement a COM-legal factory method for nsRange. + */ + +#include "nsIDOMRange.h" + +extern "C" nsresult +NS_NewRange(nsIRange** aRange); + diff --git a/mozilla/layout/base/src/nsRange.cpp b/mozilla/layout/base/src/nsRange.cpp index 0fdc54b3844..244dfca2a71 100644 --- a/mozilla/layout/base/src/nsRange.cpp +++ b/mozilla/layout/base/src/nsRange.cpp @@ -78,6 +78,16 @@ public: NS_IMETHOD Clone(nsIDOMRange** aReturn); NS_IMETHOD ToString(nsString& aReturn); + +private: + PR_Bool mIsPositioned; + nsIDOMElement* mStartParent; + PRInt32 mStartOffset; + nsIDOMElement* mEndParent; + PRInt32 mEndOffset; + + PR_Bool IsIncreasing(nsIDOMElement* sParent, PRInt32 sOffset, + nsIDOMElement* eParent, PRInt32 eOffset); }; nsresult @@ -105,6 +115,12 @@ nsresult nsRange::QueryInterface(const nsIID& aIID, nsRange::nsRange() { NS_INIT_REFCNT(); + + mIsPositioned = PR_FALSE; + nsIDOMElement* mStartParent = NULL; + PRInt32 mStartOffset = 0; + nsIDOMElement* mEndParent = NULL; + PRInt32 mEndOffset = 0; } nsRange::~nsRange() { @@ -113,65 +129,220 @@ nsRange::~nsRange() { NS_IMPL_ADDREF(nsRange) NS_IMPL_RELEASE(nsRange) -nsresult nsRange::GetIsPositioned(PRBool* aIsPositioned) -{ return NS_ERROR_NOT_IMPLEMENTED; } +PR_Bool nsRange::IsIncreasing(nsIDOMElement* sParent, PRInt32 sOffset, + nsIDOMElement* eParent, PRInt32 eOffset) +{ + // XXX NEED IMPLEMENTATION! + return PR_TRUE; +} -nsresult nsRange::SetIsPositioned(PRBool aIsPositioned) -{ return NS_ERROR_NOT_IMPLEMENTED; } +nsresult nsRange::GetIsPositioned(PRBool* aIsPositioned) +{ + *aIsPositioned = mIsPositioned; + return NS_OK; +} nsresult nsRange::GetStartParent(nsIDOMElement** aStartParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + NS_IF_RELEASE(*aStartParent); + NS_IF_ADDREF(mStartParent); + *aStartParent = mStartParent; + return NS_OK; +} nsresult nsRange::SetStartParent(nsIDOMElement* aStartParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(aStartParent, mStartOffset, + mEndParent, mEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + NS_IF_RELEASE(mStartParent); + NS_IF_ADDREF(aStartParent); + mStartParent = aStartParent; + return NS_OK; +} nsresult nsRange::GetStartOffset(PRInt32* aStartOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + *aStartOffset = mStartOffset; + return NS_OK; +} nsresult nsRange::SetStartOffset(PRInt32 aStartOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(mStartParent, aStartOffset, + mEndParent, mEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + mStartOffset = aStartOffset; + return NS_OK; +} nsresult nsRange::GetEndParent(nsIDOMElement** aEndParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + NS_IF_RELEASE(*aEndParent); + NS_IF_ADDREF(mEndParent); + *aEndParent = mEndParent; + return NS_OK; +} nsresult nsRange::SetEndParent(nsIDOMElement* aEndParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(mStartParent, mStartOffset, + aEndParent, mEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + NS_IF_RELEASE(mEndParent); + NS_IF_ADDREF(aEndParent); + mEndParent = aEndParent; + return NS_OK; +} nsresult nsRange::GetEndOffset(PRInt32* aEndOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!aStartParent) + return NS_ERROR_NULL_POINTER; + *aEndOffset = mEndOffset; + return NS_OK; +} nsresult nsRange::SetEndOffset(PRInt32 aEndOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (!IsIncreasing(mStartParent, mStartOffset, + mEndParent, aEndOffset)) + return NS_ERROR_ILLEGAL_VALUE; + + mEndOffset = aEndOffset; + return NS_OK; +} nsresult nsRange::GetIsCollapsed(PRBool* aIsCollapsed) -{ return NS_ERROR_NOT_IMPLEMENTED; } - -nsresult nsRange::SetIsCollapsed(PRBool aIsCollapsed) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + if (mEndParent == 0 || + (mStartParent == mEndParent && mStartOffset == mEndOffset)) + *aIsCollapsed = PR_TRUE; + else + *aIsCollapsed = PR_FALSE; + return NS_OK; +} nsresult nsRange::GetCommonParent(nsIDOMNode** aCommonParent) { return NS_ERROR_NOT_IMPLEMENTED; } -nsresult nsRange::SetCommonParent(nsIDOMNode* aCommonParent) -{ return NS_ERROR_NOT_IMPLEMENTED; } - nsresult nsRange::SetStart(nsIDOMNode* aParent, PRInt32 aOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + { + NS_IF_RELEASE(mEndParent); + mEndParent = NULL; + mEndOffset = NULL; + mIsPositioned = PR_TRUE; + } + NS_IF_ADDREF(aParent); + mStartParent = aParent; + mStartOffset = aOffset; + return NS_OK; +} nsresult nsRange::SetEnd(nsIDOMNode* aParent, PRInt32 aOffset) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; // can't set end before start + + NS_IF_ADDREF(aParent); + mEndParent = aParent; + mEndOffset = aOffset; + return NS_OK; +} nsresult nsRange::Collapse(PRBool aToStart) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (!mIsPositioned) + return NS_ERROR_NOT_INITIALIZED; + + if (aToStart) + { + NS_IF_RELEASE(mEndParent); + NS_IF_ADDREF(mStartParent); + mEndParent = mStartParent; + mEndOffset = mStartOffset; + return NS_OK; + } + else + { + NS_IF_RELEASE(mStartParent); + NS_IF_ADDREF(mEndParent); + mStartParent = mEndParent; + mStartOffset = mEndOffset; + return NS_OK; + } +} nsresult nsRange::Unposition() -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + NS_IF_RELEASE(mStartParent); + mStartParent = NULL; + mStartOffset = 0; + NS_IF_RELEASE(mEndParent); + mEndParent = NULL; + mEndOffset = 0; + mIsPositioned = PR_FALSE; + return NS_OK; +} nsresult nsRange::SelectNode(nsIDOMNode* aN) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + nsIDOMNode* node; + nsresult res = aN->GetParentNode(aN, &node); + if (!NS_SUCCEEDED(res)) + return res; + + if (mIsPositioned) + Unposition(); + NS_IF_ADDREF(node); + mStartParent = node; + mStartOffset = 0; // XXX NO DIRECT WAY TO GET CHILD # OF THIS NODE! + NS_IF_ADDREF(node); + mEndParent = node; + mEndOffset = mStartOffset; +} nsresult nsRange::SelectNodeContents(nsIDOMNode* aN) -{ return NS_ERROR_NOT_IMPLEMENTED; } +{ + if (mIsPositioned) + Unposition(); + + NS_IF_ADDREF(aN); + mStartParent = aN; + mStartOffset = 0; + NS_IF_ADDREF(aN); + mEndParent = aN; + mEndOffset = 0; // WRONG! SHOULD BE # OF LAST CHILD! +} nsresult nsRange::DeleteContents() { return NS_ERROR_NOT_IMPLEMENTED; } @@ -194,3 +365,19 @@ nsresult nsRange::Clone(nsIDOMRange** aReturn) nsresult nsRange::ToString(nsString& aReturn) { return NS_ERROR_NOT_IMPLEMENTED; } +// +// We don't actually want to allow setting this ... +// it should be set only by actually positioning the range. +// +nsresult nsRange::SetIsPositioned(PRBool aIsPositioned) +{ return NS_ERROR_NOT_IMPLEMENTED; } + +// +// Various other things which we don't want to implement yet: +// +nsresult nsRange::SetIsCollapsed(PRBool aIsCollapsed) +{ return NS_ERROR_NOT_IMPLEMENTED; } + +nsresult nsRange::SetCommonParent(nsIDOMNode* aCommonParent) +{ return NS_ERROR_NOT_IMPLEMENTED; } + diff --git a/mozilla/layout/base/src/nsRange.h b/mozilla/layout/base/src/nsRange.h new file mode 100644 index 00000000000..6f8a3f3d9cb --- /dev/null +++ b/mozilla/layout/base/src/nsRange.h @@ -0,0 +1,31 @@ +/* -*- 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. + */ + +/* + * nsRange.cpp: Implementation of the nsIDOMRange object. + * + * This header file is intended to live inside layout/base/src; + * if you find yourself wanting to export it, that's a sign that + * it's time to implement a COM-legal factory method for nsRange. + */ + +#include "nsIDOMRange.h" + +extern "C" nsresult +NS_NewRange(nsIRange** aRange); +