- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / autofill / simple_grid_layout.h
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_UI_COCOA_AUTOFILL_SIMPLE_GRID_LAYOUT_H_
6 #define CHROME_BROWSER_UI_COCOA_AUTOFILL_SIMPLE_GRID_LAYOUT_H_
7
8 #import <Cocoa/Cocoa.h>
9
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/scoped_vector.h"
12
13 class Column;
14 class ColumnSet;
15 class Row;
16 class ViewState;
17
18 // SimpleGridLayout is a layout manager that positions child views in a grid.
19 // Each row has exactly one ColumnSet, ColumnSets can be shared between rows.
20 // See ui/views/layout/grid_layout.h for more details - this is a very
21 // simplified version of the views class.
22 // This is based on GridLayout in ui/views/layout/grid_layout.h.
23 // TODO(groby): Unify both classes, create cross-platform abstraction.
24 // http://crbug.com/240461
25 class SimpleGridLayout {
26  public:
27   SimpleGridLayout(NSView* host);
28   ~SimpleGridLayout();
29
30   // Creates a new column set with the specified id and returns it.
31   // The id is later used when starting a new row.
32   // Layout takes ownership of the ColumnSet and will delete it when
33   // it is deleted.
34   ColumnSet* AddColumnSet(int id);
35
36   // Returns the column set for the specified id, or NULL if one doesn't exist.
37   ColumnSet* GetColumnSet(int id);
38
39   // Adds a padding row. Padding rows typically don't have any views, but are
40   // used to provide vertical white space between views.
41   // |size| specifies the height of the row.
42   void AddPaddingRow(int size);
43
44   // Starts a new row with the specified column set.
45   void StartRow(float vertical_resize, int column_set_id);
46
47   // This is a convenience function that starts a new row,
48   // and returns a new ColumnSet associated with it. All rows created by this
49   // will have a height of 0 and resize_percent set to 1.0.
50   ColumnSet* AddRow();
51
52   // Advances past columns. Use this when the current column should not
53   // contain any views.
54   void SkipColumns(int col_count);
55
56   // TODO(groby): This currently *must* be called after a StartRow for the row
57   // the view is in. At some point, I'd like an AddView that just populates
58   // the next available slot, if possible.
59   void AddView(NSView* view);
60
61   // Layout all contained views according to constraints.
62   void Layout(NSView* superView);
63
64   void SizeRowsAndColumns(float width);
65
66   // Advances next_column_ past any padding columns.
67   void SkipPaddingColumns();
68
69   // Returns the column set of the last non-padding row.
70   ColumnSet* GetLastValidColumnSet();
71
72   // Get the height of a given row.
73   float GetRowHeight(int row);
74
75   // Y-position for a given row.
76   float GetRowLocation(int row_index) const;
77
78   // Get the preferred height for the given width.
79   float GetPreferredHeightForWidth(float with);
80
81   int num_rows() const { return static_cast<int>(rows_.size()); }
82
83   // These functions are mostly for testing & deviate from Views Layout class.
84   int next_column() { return next_column_; }
85   void AdvanceColumn() { next_column_++; }
86
87  private:
88   // Adds a new row, updating associated counters and positions.
89   void AddRow(Row* row);
90
91   // Next column in the current ColumnSet.
92   int next_column_;
93
94   int current_auto_id_;  // Starting value for autogenerated columnset ids.
95   ScopedVector<ViewState> view_states_;
96   ScopedVector<ColumnSet> column_sets_;
97   ScopedVector<Row> rows_;
98
99   NSView* host_;
100 };
101
102 // ColumnSet is used to define a set of columns.
103 // You don't create a ColumnSet directly, instead use the AddRow method
104 // of SimpleGridLayout.
105 class ColumnSet {
106  public:
107   explicit ColumnSet(int id);
108   ~ColumnSet();
109
110   void AddPaddingColumn(int fixed_width);
111   void AddColumn(float resize_percent);
112
113   void CalculateSize(float width);
114   void ResetColumnXCoordinates();
115
116   // ID of this ColumnSet.
117   int id() const { return id_; }
118
119   int num_columns() const { return static_cast<int>(columns_.size()); }
120
121   // Returns the width of the specified columns.
122   float GetColumnWidth(int column);
123
124   Column* GetColumn(int column_index) {
125     DCHECK(column_index >=0 && column_index < num_columns());
126     return columns_[column_index];
127   }
128
129   // These functions are mostly for testing & deviate from Views Layout class.
130   float ColumnLocation(int column_index);
131
132  private:
133   float CalculateRemainingWidth(float width);
134   void DistributeRemainingWidth(float width);
135
136   ScopedVector<Column> columns_;
137   int id_;
138 };
139
140 #endif  // CHROME_BROWSER_UI_COCOA_AUTOFILL_SIMPLE_GRID_LAYOUT_H_