blob: ac5c8070d855e7bfd02e7a4c30c2d6221aeebf6d [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef MOZC_RENDERER_TABLE_LAYOUT_H_
#define MOZC_RENDERER_TABLE_LAYOUT_H_
#include <string>
#include <vector>
#include "base/coordinates.h"
#include "base/port.h"
#include "renderer/table_layout_interface.h"
namespace mozc {
namespace renderer {
// ------------------------------------------------------------------------
// Schematic view of layout system
// ------------------------------------------------------------------------
//
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// +HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH+
// +HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH+
// +...................................................II+
// +.0000000001111122222222222222222222233333333 .II+
// +.0000000001111122222222222222222222233333333 .II+
// +.0000000001111122222222222222222222233333333 .II+
// +...................................................II+
// +...................................................II+
// +.0000000001111122222222222222222222233333333 .II+
// +.0000000001111122222222222222222222233333333 .II+
// +.0000000001111122222222222222222222233333333 .II+
// +...................................................II+
// +...................................................II+
// +.0000000001111122222222222222222222233333333 .II+
// +.0000000001111122222222222222222222233333333 .II+
// +.0000000001111122222222222222222222233333333 .II+
// +...................................................II+
// +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+
// +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+
// +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Legend:
// +: WindowBorder (window_border_pixels_)
// .: RowRectPadding (row_rect_padding_pixels_)
// I: Position Indicator
// H: Header width = total_size_.width - 2 * window_border_pixels_
// >= minimum_header_size_.width
// height = minimum_header_size_.height
// F: Footer width = total_size_.width - 2 * window_border_pixels_
// >= minimum_footer_size_.width
// height = minimum_footer_size_.height
// 1: First Cell width = column_width_[0]
// height = row_height_ - 2 * row_rect_padding_pixels_
// 2: Second Cell width = column_width_[1]
// height = row_height_ - 2 * row_rect_padding_pixels_
//
// All cells have the same height.
// All cells within the same column have the same width.
//
// GetRowRect(1)
// ..................................................
// .0000000001111122222222222222222222233333333 .
// .0000000001111122222222222222222222233333333 .
// .0000000001111122222222222222222222233333333 .
// ..................................................
//
// GetColumnRect(1)
// .....
// 11111
// 11111
// 11111
// .....
// .....
// 11111
// 11111
// 11111
// .....
// .....
// 11111
// 11111
// 11111
// .....
class TableLayout : public TableLayoutInterface {
public:
TableLayout();
// Reset layout freeze and initialize the number of rows and columns.
void Initialize(int num_rows, int num_columns);
// Set layout element.
void SetVScrollBar(int width_in_pixels);
void SetWindowBorder(int width_in_pixels);
void SetRowRectPadding(int width_pixels);
// Ensure the cell size is same to or larger than the specified size.
// - size.width affects cells within the specified column.
// - size.height affects all cells.
// You should not call this function when the layout is frozen.
void EnsureCellSize(int column, const Size &size);
// Ensure the total width from "from_column" to "to_width" is at
// least "width" or larger. If total width is smaller than the
// "width", the last column (== "to_column") will extend. If this
// method is called twice, parameters specified by the second call
// will be used. Note that "to_column" should be bigger than
// "from_column". Otherwise, the call will be ignored. If you
// want to ensure a cell width, you should use EnsureCellSize instead.
void EnsureColumnsWidth(int from_column, int to_column, int width);
// Ensure the size of header/footer is same to or larger than the
// specified size.
// You should not call this function when the layout is frozen.
void EnsureFooterSize(const Size &size_in_pixels);
void EnsureHeaderSize(const Size &size_in_pixels);
// Fix the layout and calculate the total size.
void FreezeLayout();
bool IsLayoutFrozen() const;
// Get the rect which is bounding the specified cell.
// This rect does not include RowRectPadding.
// You should call FreezeLayout prior to this function.
Rect GetCellRect(int row, int column) const;
// Get specified component rect.
// You should call FreezeLayout prior to these function.
Size GetTotalSize() const;
Rect GetHeaderRect() const;
Rect GetFooterRect() const;
Rect GetVScrollBarRect() const;
Rect GetVScrollIndicatorRect(
int begin_index, int end_index, int candidates_total) const;
// Get the rect which is bounding the specified row.
// This rect includes RowRectPadding.
// You should call FreezeLayout prior to these function.
Rect GetRowRect(int row) const;
// Get specified row rect.
// This rect includes RowRectPadding.
// You should call FreezeLayout prior to these function.
Rect GetColumnRect(int column) const;
// Parameter getters
int number_of_rows() const;
int number_of_columns() const;
private:
vector<int> column_width_list_;
Size padding_pixels_;
Size total_size_; // this value is valid only when the layout is frozen.
Size minimum_footer_size_;
Size minimum_header_size_;
int ensure_width_from_column_;
int ensure_width_to_column_;
int ensure_width_;
int number_of_rows_;
int number_of_columns_;
int window_border_pixels_;
int row_rect_padding_pixels_;
int row_height_; // this value includes (row_rect_padding * 2)
int vscroll_width_pixels_;
bool layout_frozen_;
DISALLOW_COPY_AND_ASSIGN(TableLayout);
};
} // namespace renderer
} // namespace mozc
#endif // MOZC_RENDERER_TABLE_LAYOUT_H_