// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_UI_COCOA_AUTOFILL_SIMPLE_GRID_LAYOUT_H_ #define CHROME_BROWSER_UI_COCOA_AUTOFILL_SIMPLE_GRID_LAYOUT_H_ #import <Cocoa/Cocoa.h> #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" class Column; class ColumnSet; class Row; class ViewState; // SimpleGridLayout is a layout manager that positions child views in a grid. // Each row has exactly one ColumnSet, ColumnSets can be shared between rows. // See ui/views/layout/grid_layout.h for more details - this is a very // simplified version of the views class. // This is based on GridLayout in ui/views/layout/grid_layout.h. // TODO(groby): Unify both classes, create cross-platform abstraction. // http://crbug.com/240461 class SimpleGridLayout { public: SimpleGridLayout(NSView* host); ~SimpleGridLayout(); // Creates a new column set with the specified id and returns it. // The id is later used when starting a new row. // Layout takes ownership of the ColumnSet and will delete it when // it is deleted. ColumnSet* AddColumnSet(int id); // Returns the column set for the specified id, or NULL if one doesn't exist. ColumnSet* GetColumnSet(int id); // Adds a padding row. Padding rows typically don't have any views, but are // used to provide vertical white space between views. // |size| specifies the height of the row. void AddPaddingRow(int size); // Starts a new row with the specified column set. void StartRow(float vertical_resize, int column_set_id); // This is a convenience function that starts a new row, // and returns a new ColumnSet associated with it. All rows created by this // will have a height of 0 and resize_percent set to 1.0. ColumnSet* AddRow(); // Advances past columns. Use this when the current column should not // contain any views. void SkipColumns(int col_count); // TODO(groby): This currently *must* be called after a StartRow for the row // the view is in. At some point, I'd like an AddView that just populates // the next available slot, if possible. void AddView(NSView* view); // Layout all contained views according to constraints. void Layout(NSView* superView); void SizeRowsAndColumns(float width); // Advances next_column_ past any padding columns. void SkipPaddingColumns(); // Returns the column set of the last non-padding row. ColumnSet* GetLastValidColumnSet(); // Get the height of a given row. float GetRowHeight(int row); // Y-position for a given row. float GetRowLocation(int row_index) const; // Get the preferred height for the given width. float GetPreferredHeightForWidth(float with); int num_rows() const { return static_cast<int>(rows_.size()); } // These functions are mostly for testing & deviate from Views Layout class. int next_column() { return next_column_; } void AdvanceColumn() { next_column_++; } private: // Adds a new row, updating associated counters and positions. void AddRow(Row* row); // Next column in the current ColumnSet. int next_column_; int current_auto_id_; // Starting value for autogenerated columnset ids. ScopedVector<ViewState> view_states_; ScopedVector<ColumnSet> column_sets_; ScopedVector<Row> rows_; NSView* host_; }; // ColumnSet is used to define a set of columns. // You don't create a ColumnSet directly, instead use the AddRow method // of SimpleGridLayout. class ColumnSet { public: explicit ColumnSet(int id); ~ColumnSet(); void AddPaddingColumn(int fixed_width); void AddColumn(float resize_percent); void CalculateSize(float width); void ResetColumnXCoordinates(); // ID of this ColumnSet. int id() const { return id_; } int num_columns() const { return static_cast<int>(columns_.size()); } // Returns the width of the specified columns. float GetColumnWidth(int column); Column* GetColumn(int column_index) { DCHECK(column_index >=0 && column_index < num_columns()); return columns_[column_index]; } // These functions are mostly for testing & deviate from Views Layout class. float ColumnLocation(int column_index); private: float CalculateRemainingWidth(float width); void DistributeRemainingWidth(float width); ScopedVector<Column> columns_; int id_; }; #endif // CHROME_BROWSER_UI_COCOA_AUTOFILL_SIMPLE_GRID_LAYOUT_H_