blob: f6cd8718f2db46f95e9e7b08d1f88dc2815f3d10 [file] [log] [blame]
// Copyright (c) 2012 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 UI_APP_LIST_APPS_GRID_VIEW_H_
#define UI_APP_LIST_APPS_GRID_VIEW_H_
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "ui/app_list/app_list_export.h"
#include "ui/app_list/app_list_model.h"
#include "ui/app_list/pagination_model_observer.h"
#include "ui/base/models/list_model_observer.h"
#include "ui/views/view.h"
namespace views {
class ButtonListener;
}
namespace app_list {
class AppListItemView;
class PaginationModel;
// AppsGridView displays a grid for AppListModel::Apps sub model.
class APP_LIST_EXPORT AppsGridView : public views::View,
public ui::ListModelObserver,
public PaginationModelObserver {
public:
AppsGridView(views::ButtonListener* listener,
PaginationModel* pagination_model);
virtual ~AppsGridView();
// Sets fixed layout parameters. After setting this, CalculateLayout below
// is no longer called to dynamically choosing those layout params.
void SetLayout(int icon_size, int cols, int rows_per_page);
// Sets |model| to use. Note this does not take ownership of |model|.
void SetModel(AppListModel::Apps* model);
void SetSelectedItem(AppListItemView* item);
void ClearSelectedItem(AppListItemView* item);
bool IsSelectedItem(const AppListItemView* item) const;
void EnsureItemVisible(const AppListItemView* item);
bool HasPageTransition() const;
int tiles_per_page() const { return cols_ * rows_per_page_; }
// Overridden from views::View:
virtual gfx::Size GetPreferredSize() OVERRIDE;
virtual void Layout() OVERRIDE;
virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE;
virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE;
virtual void ViewHierarchyChanged(bool is_add,
views::View* parent,
views::View* child) OVERRIDE;
private:
// Updates from model.
void Update();
// Updates total pages and auto select first page is no page is selected.
void UpdatePaginationModel();
AppListItemView* CreateViewForItemAtIndex(size_t index);
AppListItemView* GetItemViewAtIndex(int index);
void SetSelectedItemByIndex(int index);
// Overridden from ListModelObserver:
virtual void ListItemsAdded(size_t start, size_t count) OVERRIDE;
virtual void ListItemsRemoved(size_t start, size_t count) OVERRIDE;
virtual void ListItemMoved(size_t index, size_t target_index) OVERRIDE;
virtual void ListItemsChanged(size_t start, size_t count) OVERRIDE;
// Overridden from PaginationModelObserver:
virtual void TotalPagesChanged() OVERRIDE;
virtual void SelectedPageChanged(int old_selected, int new_selected) OVERRIDE;
virtual void TransitionChanged() OVERRIDE;
AppListModel::Apps* model_; // Owned by AppListModel.
views::ButtonListener* listener_;
PaginationModel* pagination_model_; // Owned by AppListController.
gfx::Size icon_size_;
int cols_;
int rows_per_page_;
int selected_item_index_;
DISALLOW_COPY_AND_ASSIGN(AppsGridView);
};
} // namespace app_list
#endif // UI_APP_LIST_APPS_GRID_VIEW_H_