910e62b5创建于 1月15日历史提交
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_BASE_MODELS_TABLE_MODEL_H_
#define UI_BASE_MODELS_TABLE_MODEL_H_

#include <string>
#include <vector>

#include "base/component_export.h"
#include "third_party/icu/source/common/unicode/uversion.h"

// third_party/icu/source/common/unicode/uversion.h will set namespace icu.
namespace U_ICU_NAMESPACE {
class Collator;
}

namespace ui {

class ImageModel;
class TableModelObserver;

// The model driving the TableView.
class COMPONENT_EXPORT(UI_BASE) TableModel {
 public:
  // Size of the table row icon, if used.
  static constexpr int kIconSize = 16;

  // Number of rows in the model.
  virtual size_t RowCount() = 0;

  // Returns the value at a particular location in text.
  virtual std::u16string GetText(size_t row, int column_id) = 0;

  // Returns the small icon (|kIconSize| x |kIconSize|) that should be displayed
  // in the first column before the text. This is only used when the TableView
  // was created with the ICON_AND_TEXT table type. An empty ImageModel if there
  // is no image.
  virtual ui::ImageModel GetIcon(size_t row);

  // Returns the tooltip, if any, to show for a particular row.  If there are
  // multiple columns in the row, this will only be shown when hovering over
  // column zero.
  virtual std::u16string GetTooltip(size_t row);

  // Returns the accessibility name and sort status for the header.
  // If there are multiple columns in the table, the AX name will be combined
  // names from all visible columns' titles and sort status.
  // For example: The table has 3 visible columns with title as `col1`, `col2`
  // and `col3` correspondingly. Their sortable status is `unsorted`,`sorted in
  // ascending order`,`sorted in descending order`.The accessibility name for
  // the `header` would be `col1 unsorted col2 sorted in ascending order col3
  // sorted in descending order`.
  virtual std::u16string GetAXNameForHeader(
      const std::vector<std::u16string>& visible_column_titles,
      const std::vector<std::u16string>& visible_column_sortable);

  // Returns the accessibility name and sort status for the header cell.
  // For example:  `col1` has sortable status as `sorted in ascending
  // order`. The accessibility name for the `header` cell would be `col1 sorted
  // in ascending order`.
  virtual std::u16string GetAXNameForHeaderCell(
      const std::u16string& visible_column_title,
      const std::u16string& visible_column_sortable);

  // Returns the accessibility name for the row.
  // If there are multiple columns in the `row`, the AX name will be
  // combined names from all visible columns. For example: The indexed `row`
  // has 3 visible columns with value as `col1`, `col2` and `col3`
  // correspondingly. The accessibility name for the `row` would be `col1
  // col2 col3`.
  virtual std::u16string GetAXNameForRow(
      size_t row,
      const std::vector<int>& visible_column_ids);

  // Sets the observer for the model. The TableView should NOT take ownership
  // of the observer.
  virtual void SetObserver(TableModelObserver* observer) = 0;

  // Compares the values in the column with id |column_id| for the two rows.
  // Returns a value < 0, == 0 or > 0 as to whether the first value is
  // <, == or > the second value.
  //
  // This implementation does a case insensitive locale specific string
  // comparison.
  virtual int CompareValues(size_t row1, size_t row2, int column_id);

  // Reset the collator.
  void ClearCollator();

 protected:
  virtual ~TableModel();

  // Returns the collator used by CompareValues.
  icu::Collator* GetCollator();
};

// TableColumn specifies the title, alignment and size of a particular column.
struct COMPONENT_EXPORT(UI_BASE) TableColumn {
  enum Alignment : uint8_t { LEFT, RIGHT, CENTER };

  TableColumn();
  TableColumn(int id, Alignment alignment, int width, float percent);
  TableColumn(const TableColumn& other);
  TableColumn& operator=(const TableColumn& other);

  // Note: Please be mindful of ordering when adding, modifying, or removing
  //       fields. The struct should be as tightly packed together as possible.

  // The title for the column.
  std::u16string title;

  // A unique identifier for the column.
  int id;

  // The size of a column may be specified in two ways:
  // 1. A fixed width. Set the width field to a positive number and the
  //    column will be given that width, in pixels.
  // 2. As a percentage of the available width. If width is -1, and percent is
  //    > 0, the column is given a width of
  //    available_width * percent / total_percent.
  // 3. If the width == -1 and percent == 0, the column is autosized based on
  //    the width of the column header text.
  //
  // Sizing is done in four passes. Fixed width columns are given
  // their width, percentages are applied, autosized columns are autosized,
  // and finally percentages are applied again taking into account the widths
  // of autosized columns.
  int width;
  float percent;

  // The minimum width required for all items in this column
  // (including the header) to be visible.
  int min_visible_width;

  // Alignment for the content.
  Alignment alignment;

  // Is this column sortable? Default is false.
  bool sortable;

  // Determines what sort order to apply initially. Default is true.
  bool initial_sort_is_ascending;
};

}  // namespace ui

#endif  // UI_BASE_MODELS_TABLE_MODEL_H_