michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set shiftwidth=2 tabstop=8 autoindent cindent expandtab: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef FrameChildList_h_ michael@0: #define FrameChildList_h_ michael@0: michael@0: #include "nsFrameList.h" michael@0: #include "nsTArray.h" michael@0: michael@0: class nsIFrame; michael@0: michael@0: namespace mozilla { michael@0: namespace layout { michael@0: michael@0: // enum FrameChildListID lives in nsFrameList.h to solve circular dependencies. michael@0: michael@0: #ifdef DEBUG_FRAME_DUMP michael@0: extern const char* ChildListName(FrameChildListID aListID); michael@0: #endif michael@0: michael@0: class FrameChildListIDs { michael@0: friend class FrameChildListIterator; michael@0: public: michael@0: FrameChildListIDs() : mIDs(0) {} michael@0: FrameChildListIDs(const FrameChildListIDs& aOther) : mIDs(aOther.mIDs) {} michael@0: FrameChildListIDs(FrameChildListID aListID) : mIDs(aListID) {} michael@0: michael@0: FrameChildListIDs operator|(FrameChildListIDs aOther) const { michael@0: return FrameChildListIDs(mIDs | aOther.mIDs); michael@0: } michael@0: FrameChildListIDs& operator|=(FrameChildListIDs aOther) { michael@0: mIDs |= aOther.mIDs; michael@0: return *this; michael@0: } michael@0: bool operator==(FrameChildListIDs aOther) const { michael@0: return mIDs == aOther.mIDs; michael@0: } michael@0: bool operator!=(FrameChildListIDs aOther) const { michael@0: return !(*this == aOther); michael@0: } michael@0: bool Contains(FrameChildListIDs aOther) const { michael@0: return (mIDs & aOther.mIDs) == aOther.mIDs; michael@0: } michael@0: michael@0: protected: michael@0: FrameChildListIDs(uint32_t aIDs) : mIDs(aIDs) {} michael@0: uint32_t mIDs; michael@0: }; michael@0: michael@0: class FrameChildList { michael@0: public: michael@0: FrameChildList(const nsFrameList& aList, FrameChildListID aID) michael@0: : mList(aList), mID(aID) {} michael@0: nsFrameList mList; michael@0: FrameChildListID mID; michael@0: }; michael@0: michael@0: /** michael@0: * A class to iterate frame child lists. michael@0: */ michael@0: class MOZ_STACK_CLASS FrameChildListArrayIterator { michael@0: public: michael@0: FrameChildListArrayIterator(const nsTArray& aLists) michael@0: : mLists(aLists), mCurrentIndex(0) {} michael@0: bool IsDone() const { return mCurrentIndex >= mLists.Length(); } michael@0: FrameChildListID CurrentID() const { michael@0: NS_ASSERTION(!IsDone(), "CurrentID(): iterator at end"); michael@0: return mLists[mCurrentIndex].mID; michael@0: } michael@0: const nsFrameList& CurrentList() const { michael@0: NS_ASSERTION(!IsDone(), "CurrentList(): iterator at end"); michael@0: return mLists[mCurrentIndex].mList; michael@0: } michael@0: void Next() { michael@0: NS_ASSERTION(!IsDone(), "Next(): iterator at end"); michael@0: ++mCurrentIndex; michael@0: } michael@0: michael@0: protected: michael@0: const nsTArray& mLists; michael@0: uint32_t mCurrentIndex; michael@0: }; michael@0: michael@0: /** michael@0: * A class for retrieving a frame's child lists and iterate them. michael@0: */ michael@0: class MOZ_STACK_CLASS FrameChildListIterator michael@0: : public FrameChildListArrayIterator { michael@0: public: michael@0: FrameChildListIterator(const nsIFrame* aFrame); michael@0: michael@0: protected: michael@0: nsAutoTArray mLists; michael@0: }; michael@0: michael@0: inline mozilla::layout::FrameChildListIDs michael@0: operator|(mozilla::layout::FrameChildListID aLeftOp, michael@0: mozilla::layout::FrameChildListID aRightOp) michael@0: { michael@0: return mozilla::layout::FrameChildListIDs(aLeftOp) | michael@0: mozilla::layout::FrameChildListIDs(aRightOp); michael@0: } michael@0: michael@0: inline mozilla::layout::FrameChildListIDs michael@0: operator|(mozilla::layout::FrameChildListID aLeftOp, michael@0: mozilla::layout::FrameChildListIDs aRightOp) michael@0: { michael@0: return mozilla::layout::FrameChildListIDs(aLeftOp) | aRightOp; michael@0: } michael@0: michael@0: } // namespace layout michael@0: } // namespace mozilla michael@0: michael@0: inline void nsFrameList::AppendIfNonempty( michael@0: nsTArray* aLists, michael@0: mozilla::layout::FrameChildListID aListID) const michael@0: { michael@0: if (NotEmpty()) { michael@0: aLists->AppendElement(mozilla::layout::FrameChildList(*this, aListID)); michael@0: } michael@0: } michael@0: michael@0: #endif /* !defined(FrameChildList_h_) */