layout/xul/tree/nsTreeColumns.h

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef nsTreeColumns_h__
     7 #define nsTreeColumns_h__
     9 #include "nsITreeColumns.h"
    10 #include "nsITreeBoxObject.h"
    11 #include "mozilla/Attributes.h"
    12 #include "nsCoord.h"
    13 #include "nsCycleCollectionParticipant.h"
    14 #include "nsAutoPtr.h"
    15 #include "nsWrapperCache.h"
    16 #include "nsString.h"
    18 class nsTreeBodyFrame;
    19 class nsTreeColumns;
    20 class nsIFrame;
    21 class nsIContent;
    22 struct nsRect;
    24 namespace mozilla {
    25 namespace dom {
    26 class Element;
    27 } // namespace dom
    28 } // namespace mozilla
    30 #define NS_TREECOLUMN_IMPL_CID                       \
    31 { /* 02cd1963-4b5d-4a6c-9223-814d3ade93a3 */         \
    32     0x02cd1963,                                      \
    33     0x4b5d,                                          \
    34     0x4a6c,                                          \
    35     {0x92, 0x23, 0x81, 0x4d, 0x3a, 0xde, 0x93, 0xa3} \
    36 }
    38 // This class is our column info.  We use it to iterate our columns and to obtain
    39 // information about each column.
    40 class nsTreeColumn MOZ_FINAL : public nsITreeColumn {
    41 public:
    42   nsTreeColumn(nsTreeColumns* aColumns, nsIContent* aContent);
    43   ~nsTreeColumn();
    45   NS_DECLARE_STATIC_IID_ACCESSOR(NS_TREECOLUMN_IMPL_CID)
    47   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
    48   NS_DECL_CYCLE_COLLECTION_CLASS(nsTreeColumn)
    49   NS_DECL_NSITREECOLUMN
    51   friend class nsTreeBodyFrame;
    52   friend class nsTreeColumns;
    54 protected:
    55   nsIFrame* GetFrame();
    56   nsIFrame* GetFrame(nsTreeBodyFrame* aBodyFrame);
    57   // Don't call this if GetWidthInTwips or GetRect fails
    58   bool IsLastVisible(nsTreeBodyFrame* aBodyFrame);
    60   /**
    61    * Returns a rect with x and width taken from the frame's rect and specified
    62    * y and height. May fail in case there's no frame for the column.
    63    */
    64   nsresult GetRect(nsTreeBodyFrame* aBodyFrame, nscoord aY, nscoord aHeight,
    65                    nsRect* aResult);
    67   nsresult GetXInTwips(nsTreeBodyFrame* aBodyFrame, nscoord* aResult);
    68   nsresult GetWidthInTwips(nsTreeBodyFrame* aBodyFrame, nscoord* aResult);
    70   void SetColumns(nsTreeColumns* aColumns) { mColumns = aColumns; }
    72   const nsAString& GetId() { return mId; }
    73   nsIAtom* GetAtom() { return mAtom; }
    75   int32_t GetIndex() { return mIndex; }
    77   bool IsPrimary() { return mIsPrimary; }
    78   bool IsCycler() { return mIsCycler; }
    79   bool IsEditable() { return mIsEditable; }
    80   bool IsSelectable() { return mIsSelectable; }
    81   bool Overflow() { return mOverflow; }
    83   int16_t GetType() { return mType; }
    85   int8_t GetCropStyle() { return mCropStyle; }
    86   int32_t GetTextAlignment() { return mTextAlignment; }
    88   nsTreeColumn* GetNext() { return mNext; }
    89   nsTreeColumn* GetPrevious() { return mPrevious; }
    90   void SetNext(nsTreeColumn* aNext) {
    91     NS_ASSERTION(!mNext, "already have a next sibling");
    92     mNext = aNext;
    93   }
    94   void SetPrevious(nsTreeColumn* aPrevious) { mPrevious = aPrevious; }
    96 private:
    97   /**
    98    * Non-null nsIContent for the associated <treecol> element.
    99    */
   100   nsCOMPtr<nsIContent> mContent;
   102   nsTreeColumns* mColumns;
   104   nsString mId;
   105   nsCOMPtr<nsIAtom> mAtom;
   107   int32_t mIndex;
   109   bool mIsPrimary;
   110   bool mIsCycler;
   111   bool mIsEditable;
   112   bool mIsSelectable;
   113   bool mOverflow;
   115   int16_t mType;
   117   int8_t mCropStyle;
   118   int8_t mTextAlignment;
   120   nsRefPtr<nsTreeColumn> mNext;
   121   nsTreeColumn* mPrevious;
   122 };
   124 NS_DEFINE_STATIC_IID_ACCESSOR(nsTreeColumn, NS_TREECOLUMN_IMPL_CID)
   126 class nsTreeColumns MOZ_FINAL : public nsITreeColumns
   127                               , public nsWrapperCache
   128 {
   129 public:
   130   nsTreeColumns(nsTreeBodyFrame* aTree);
   131   ~nsTreeColumns();
   133   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   134   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsTreeColumns)
   135   NS_DECL_NSITREECOLUMNS
   137   nsIContent* GetParentObject() const;
   138   virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
   140   // WebIDL
   141   nsITreeBoxObject* GetTree() const;
   142   uint32_t Count();
   143   uint32_t Length()
   144   {
   145     return Count();
   146   }
   148   nsTreeColumn* GetFirstColumn() { EnsureColumns(); return mFirstColumn; }
   149   nsTreeColumn* GetLastColumn();
   151   nsTreeColumn* GetPrimaryColumn();
   152   nsTreeColumn* GetSortedColumn();
   153   nsTreeColumn* GetKeyColumn();
   155   nsTreeColumn* GetColumnFor(mozilla::dom::Element* aElement);
   157   nsTreeColumn* IndexedGetter(uint32_t aIndex, bool& aFound);
   158   nsTreeColumn* GetColumnAt(uint32_t aIndex);
   159   nsTreeColumn* NamedGetter(const nsAString& aId, bool& aFound);
   160   bool NameIsEnumerable(const nsAString& aName);
   161   nsTreeColumn* GetNamedColumn(const nsAString& aId);
   162   void GetSupportedNames(unsigned, nsTArray<nsString>& aNames);
   164   // Uses XPCOM InvalidateColumns().
   165   // Uses XPCOM RestoreNaturalOrder().
   167   friend class nsTreeBodyFrame;
   168 protected:
   169   void SetTree(nsTreeBodyFrame* aTree) { mTree = aTree; }
   171   // Builds our cache of column info.
   172   void EnsureColumns();
   174 private:
   175   nsTreeBodyFrame* mTree;
   177   /**
   178    * The first column in the list of columns. All of the columns are supposed
   179    * to be "alive", i.e. have a frame. This is achieved by clearing the columns
   180    * list each time an nsTreeColFrame is destroyed.
   181    *
   182    * XXX this means that new nsTreeColumn objects are unnecessarily created
   183    *     for untouched columns.
   184    */
   185   nsTreeColumn* mFirstColumn;
   186 };
   188 #endif // nsTreeColumns_h__

mercurial