/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef nsTreeColumns_h__ #define nsTreeColumns_h__ #include "nsITreeColumns.h" #include "nsITreeBoxObject.h" #include "mozilla/Attributes.h" #include "nsCoord.h" #include "nsCycleCollectionParticipant.h" #include "nsAutoPtr.h" class nsTreeBodyFrame; class nsTreeColumns; class nsIFrame; class nsIContent; struct nsRect; #define NS_TREECOLUMN_IMPL_CID \ { /* 02cd1963-4b5d-4a6c-9223-814d3ade93a3 */ \ 0x02cd1963, \ 0x4b5d, \ 0x4a6c, \ {0x92, 0x23, 0x81, 0x4d, 0x3a, 0xde, 0x93, 0xa3} \ } // This class is our column info. We use it to iterate our columns and to obtain // information about each column. class nsTreeColumn MOZ_FINAL : public nsITreeColumn { public: nsTreeColumn(nsTreeColumns* aColumns, nsIContent* aContent); ~nsTreeColumn(); NS_DECLARE_STATIC_IID_ACCESSOR(NS_TREECOLUMN_IMPL_CID) NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_CLASS(nsTreeColumn) NS_DECL_NSITREECOLUMN friend class nsTreeBodyFrame; friend class nsTreeColumns; protected: nsIFrame* GetFrame(); nsIFrame* GetFrame(nsTreeBodyFrame* aBodyFrame); // Don't call this if GetWidthInTwips or GetRect fails bool IsLastVisible(nsTreeBodyFrame* aBodyFrame); /** * Returns a rect with x and width taken from the frame's rect and specified * y and height. May fail in case there's no frame for the column. */ nsresult GetRect(nsTreeBodyFrame* aBodyFrame, nscoord aY, nscoord aHeight, nsRect* aResult); nsresult GetXInTwips(nsTreeBodyFrame* aBodyFrame, nscoord* aResult); nsresult GetWidthInTwips(nsTreeBodyFrame* aBodyFrame, nscoord* aResult); void SetColumns(nsTreeColumns* aColumns) { mColumns = aColumns; } const nsAString& GetId() { return mId; } nsIAtom* GetAtom() { return mAtom; } int32_t GetIndex() { return mIndex; } bool IsPrimary() { return mIsPrimary; } bool IsCycler() { return mIsCycler; } bool IsEditable() { return mIsEditable; } bool IsSelectable() { return mIsSelectable; } bool Overflow() { return mOverflow; } int16_t GetType() { return mType; } int8_t GetCropStyle() { return mCropStyle; } int32_t GetTextAlignment() { return mTextAlignment; } nsTreeColumn* GetNext() { return mNext; } nsTreeColumn* GetPrevious() { return mPrevious; } void SetNext(nsTreeColumn* aNext) { NS_ASSERTION(!mNext, "already have a next sibling"); mNext = aNext; } void SetPrevious(nsTreeColumn* aPrevious) { mPrevious = aPrevious; } private: /** * Non-null nsIContent for the associated element. */ nsCOMPtr mContent; nsTreeColumns* mColumns; nsString mId; nsCOMPtr mAtom; int32_t mIndex; bool mIsPrimary; bool mIsCycler; bool mIsEditable; bool mIsSelectable; bool mOverflow; int16_t mType; int8_t mCropStyle; int8_t mTextAlignment; nsRefPtr mNext; nsTreeColumn* mPrevious; }; NS_DEFINE_STATIC_IID_ACCESSOR(nsTreeColumn, NS_TREECOLUMN_IMPL_CID) class nsTreeColumns MOZ_FINAL : public nsITreeColumns { public: nsTreeColumns(nsITreeBoxObject* aTree); ~nsTreeColumns(); NS_DECL_ISUPPORTS NS_DECL_NSITREECOLUMNS nsITreeColumn* GetColumnAt(int32_t aIndex); nsITreeColumn* GetNamedColumn(const nsAString& aId); static nsTreeColumns* FromSupports(nsISupports* aSupports) { #ifdef DEBUG { nsCOMPtr columns_qi = do_QueryInterface(aSupports); // If this assertion fires the QI implementation for the object in // question doesn't use the nsITreeColumns pointer as the nsISupports // pointer. That must be fixed, or we'll crash... NS_ASSERTION(columns_qi == static_cast(aSupports), "Uh, fix QI!"); } #endif return static_cast(aSupports); } friend class nsTreeBodyFrame; protected: void SetTree(nsITreeBoxObject* aTree) { mTree = aTree; } // Builds our cache of column info. void EnsureColumns(); nsTreeColumn* GetFirstColumn() { EnsureColumns(); return mFirstColumn; } nsTreeColumn* GetPrimaryColumn(); private: nsITreeBoxObject* mTree; /** * The first column in the list of columns. All of the columns are supposed * to be "alive", i.e. have a frame. This is achieved by clearing the columns * list each time an nsTreeColFrame is destroyed. * * XXX this means that new nsTreeColumn objects are unnecessarily created * for untouched columns. */ nsTreeColumn* mFirstColumn; }; #endif // nsTreeColumns_h__