diff options
Diffstat (limited to 'layout/xul/grid/nsGrid.h')
-rw-r--r-- | layout/xul/grid/nsGrid.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/layout/xul/grid/nsGrid.h b/layout/xul/grid/nsGrid.h new file mode 100644 index 000000000..d8726a946 --- /dev/null +++ b/layout/xul/grid/nsGrid.h @@ -0,0 +1,132 @@ +/* -*- 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 nsGrid_h___ +#define nsGrid_h___ + +#include "nsStackLayout.h" +#include "nsIGridPart.h" +#include "nsCOMPtr.h" +#include "mozilla/UniquePtr.h" + +class nsBoxLayoutState; +class nsGridCell; + +//#define DEBUG_grid 1 + +/** + * The grid data structure, i.e., the grid cellmap. + */ +class nsGrid +{ +public: + nsGrid(); + ~nsGrid(); + + nsGridRow* GetColumnAt(int32_t aIndex, bool aIsHorizontal = true); + nsGridRow* GetRowAt(int32_t aIndex, bool aIsHorizontal = true); + nsGridCell* GetCellAt(int32_t aX, int32_t aY); + + void NeedsRebuild(nsBoxLayoutState& aBoxLayoutState); + void RebuildIfNeeded(); + + // For all the methods taking an aIsHorizontal parameter: + // * When aIsHorizontal is true, the words "rows" and (for + // GetColumnCount) "columns" refer to their normal meanings. + // * When aIsHorizontal is false, the meanings are flipped. + // FIXME: Maybe eliminate GetColumnCount and change aIsHorizontal to + // aIsRows? (Calling it horizontal doesn't really make sense because + // row groups and columns have vertical orientation, whereas column + // groups and rows are horizontal.) + + nsSize GetPrefRowSize(nsBoxLayoutState& aBoxLayoutState, int32_t aRowIndex, bool aIsHorizontal = true); + nsSize GetMinRowSize(nsBoxLayoutState& aBoxLayoutState, int32_t aRowIndex, bool aIsHorizontal = true); + nsSize GetMaxRowSize(nsBoxLayoutState& aBoxLayoutState, int32_t aRowIndex, bool aIsHorizontal = true); + nscoord GetRowFlex(int32_t aRowIndex, bool aIsHorizontal = true); + + nscoord GetPrefRowHeight(nsBoxLayoutState& aBoxLayoutState, int32_t aRowIndex, bool aIsHorizontal = true); + nscoord GetMinRowHeight(nsBoxLayoutState& aBoxLayoutState, int32_t aRowIndex, bool aIsHorizontal = true); + nscoord GetMaxRowHeight(nsBoxLayoutState& aBoxLayoutState, int32_t aRowIndex, bool aIsHorizontal = true); + void GetRowOffsets(int32_t aIndex, nscoord& aTop, nscoord& aBottom, bool aIsHorizontal = true); + + void RowAddedOrRemoved(nsBoxLayoutState& aBoxLayoutState, int32_t aIndex, bool aIsHorizontal = true); + void CellAddedOrRemoved(nsBoxLayoutState& aBoxLayoutState, int32_t aIndex, bool aIsHorizontal = true); + void DirtyRows(nsIFrame* aRowBox, nsBoxLayoutState& aState); +#ifdef DEBUG_grid + void PrintCellMap(); +#endif + int32_t GetExtraColumnCount(bool aIsHorizontal = true); + int32_t GetExtraRowCount(bool aIsHorizontal = true); + +// accessors + void SetBox(nsIFrame* aBox) { mBox = aBox; } + nsIFrame* GetBox() { return mBox; } + nsIFrame* GetRowsBox() { return mRowsBox; } + nsIFrame* GetColumnsBox() { return mColumnsBox; } + int32_t GetRowCount(int32_t aIsHorizontal = true); + int32_t GetColumnCount(int32_t aIsHorizontal = true); + + static nsIFrame* GetScrolledBox(nsIFrame* aChild); + static nsIFrame* GetScrollBox(nsIFrame* aChild); + static nsIGridPart* GetPartFromBox(nsIFrame* aBox); + void GetFirstAndLastRow(int32_t& aFirstIndex, + int32_t& aLastIndex, + nsGridRow*& aFirstRow, + nsGridRow*& aLastRow, + bool aIsHorizontal); + +private: + + nsMargin GetBoxTotalMargin(nsIFrame* aBox, bool aIsHorizontal = true); + + void FreeMap(); + void FindRowsAndColumns(nsIFrame** aRows, nsIFrame** aColumns); + mozilla::UniquePtr<nsGridRow[]> BuildRows(nsIFrame* aBox, int32_t aSize, + bool aIsHorizontal = true); + mozilla::UniquePtr<nsGridCell[]> BuildCellMap(int32_t aRows, int32_t aColumns); + void PopulateCellMap(nsGridRow* aRows, nsGridRow* aColumns, int32_t aRowCount, int32_t aColumnCount, bool aIsHorizontal = true); + void CountRowsColumns(nsIFrame* aBox, int32_t& aRowCount, int32_t& aComputedColumnCount); + void SetLargestSize(nsSize& aSize, nscoord aHeight, bool aIsHorizontal = true); + void SetSmallestSize(nsSize& aSize, nscoord aHeight, bool aIsHorizontal = true); + bool IsGrid(nsIFrame* aBox); + + // the box that implement the <grid> tag + nsIFrame* mBox; + + // an array of row object + mozilla::UniquePtr<nsGridRow[]> mRows; + + // an array of columns objects. + mozilla::UniquePtr<nsGridRow[]> mColumns; + + // the first in the <grid> that implements the <rows> tag. + nsIFrame* mRowsBox; + + // the first in the <grid> that implements the <columns> tag. + nsIFrame* mColumnsBox; + + // a flag that is false tells us to rebuild the who grid + bool mNeedsRebuild; + + // number of rows and columns as defined by the XUL + int32_t mRowCount; + int32_t mColumnCount; + + // number of rows and columns that are implied but not + // explicitly defined int he XUL + int32_t mExtraRowCount; + int32_t mExtraColumnCount; + + // x,y array of cells in the rows and columns + mozilla::UniquePtr<nsGridCell[]> mCellMap; + + // a flag that when true suppresses all other MarkDirties. This + // prevents lots of extra work being done. + bool mMarkingDirty; +}; + +#endif + |