blob: 59cff170b22f831ebbfffdaf71dbbbce9da1a772 [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 ASH_LAUNCHER_LAUNCHER_VIEW_H_
#define ASH_LAUNCHER_LAUNCHER_VIEW_H_
#pragma once
#include <utility>
#include <vector>
#include "ash/launcher/launcher_button_host.h"
#include "ash/launcher/launcher_model_observer.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/view.h"
namespace views {
class BoundsAnimator;
class ImageButton;
class MenuRunner;
}
namespace ash {
class LauncherDelegate;
struct LauncherItem;
class LauncherModel;
class ViewModel;
namespace internal {
class LauncherButton;
class ASH_EXPORT LauncherView : public views::View,
public LauncherModelObserver,
public views::ButtonListener,
public LauncherButtonHost,
public views::ContextMenuController {
public:
// Use the api in this class for testing only.
class ASH_EXPORT TestAPI {
public:
explicit TestAPI(LauncherView* launcher_view)
: launcher_view_(launcher_view) {
}
// Number of icons displayed.
int GetButtonCount();
// Retrieve the button at |index|.
LauncherButton* GetButton(int index);
private:
LauncherView* launcher_view_;
DISALLOW_COPY_AND_ASSIGN(TestAPI);
};
LauncherView(LauncherModel* model, LauncherDelegate* delegate);
virtual ~LauncherView();
void Init();
// Returns the ideal bounds of the specified item, or an empty rect if id
// isn't know.
gfx::Rect GetIdealBoundsOfItemIcon(LauncherID id);
// Returns true if we're showing a menu.
bool IsShowingMenu() const;
private:
class FadeOutAnimationDelegate;
class StartFadeAnimationDelegate;
struct IdealBounds {
gfx::Rect overflow_bounds;
};
// Sets the bounds of each view to its ideal bounds.
void LayoutToIdealBounds();
// Calculates the ideal bounds. The bounds of each button corresponding to an
// item in the model is set in |view_model_|.
void CalculateIdealBounds(IdealBounds* bounds);
// Returns the index of the last view whose max x-coordinate is less than
// |max_x|. Returns -1 if nothing fits, or there are no views.
int DetermineLastVisibleIndex(int max_x);
// Animates the bounds of each view to its ideal bounds.
void AnimateToIdealBounds();
// Creates the view used to represent |item|.
views::View* CreateViewForItem(const LauncherItem& item);
// Fades |view| from an opacity of 0 to 1. This is when adding a new item.
void FadeIn(views::View* view);
// Invoked when the mouse has moved enough to trigger a drag. Sets internal
// state in preparation for the drag.
void PrepareForDrag(const views::MouseEvent& event);
// Invoked when the mouse is dragged. Updates the models as appropriate.
void ContinueDrag(const views::MouseEvent& event);
// Returns true if |typea| and |typeb| should be in the same drag range.
bool SameDragType(LauncherItemType typea, LauncherItemType typeb) const;
// Returns the range (in the model) the item at the specified index can be
// dragged to.
std::pair<int,int> GetDragRange(int index);
// If there is a drag operation in progress it's canceled.
void CancelDrag(views::View* deleted_view);
// Common setup done for all children.
void ConfigureChildView(views::View* view);
// Returns the items whose icons are not shown because they don't fit.
void GetOverflowItems(std::vector<LauncherItem>* items);
// Shows the overflow menu.
void ShowOverflowMenu();
// Overridden from views::View:
virtual gfx::Size GetPreferredSize() OVERRIDE;
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
// Overridden from LauncherModelObserver:
virtual void LauncherItemAdded(int model_index) OVERRIDE;
virtual void LauncherItemRemoved(int model_index, LauncherID id) OVERRIDE;
virtual void LauncherItemChanged(int model_index,
const ash::LauncherItem& old_item) OVERRIDE;
virtual void LauncherItemMoved(int start_index, int target_index) OVERRIDE;
virtual void LauncherItemWillChange(int index) OVERRIDE;
// Overridden from LauncherButtonHost:
virtual void MousePressedOnButton(views::View* view,
const views::MouseEvent& event) OVERRIDE;
virtual void MouseDraggedOnButton(views::View* view,
const views::MouseEvent& event) OVERRIDE;
virtual void MouseReleasedOnButton(views::View* view,
bool canceled) OVERRIDE;
virtual void MouseExitedButton(views::View* view) OVERRIDE;
virtual string16 GetAccessibleName(const views::View* view) OVERRIDE;
// Overriden from views::ButtonListener:
virtual void ButtonPressed(views::Button* sender,
const views::Event& event) OVERRIDE;
// Overriden from views::ContextMenuController:
virtual void ShowContextMenuForView(views::View* source,
const gfx::Point& point) OVERRIDE;
// The model; owned by Launcher.
LauncherModel* model_;
// Delegate; owned by Launcher.
LauncherDelegate* delegate_;
// Used to manage the set of active launcher buttons. There is a view per
// item in |model_|.
scoped_ptr<ViewModel> view_model_;
scoped_ptr<views::BoundsAnimator> bounds_animator_;
views::ImageButton* overflow_button_;
// Are we dragging? This is only set if the mouse is dragged far enough to
// trigger a drag.
bool dragging_;
// The view being dragged. This is set immediately when the mouse is pressed.
// |dragging_| is set only if the mouse is dragged far enough.
views::View* drag_view_;
// X coordinate of the mouse down event in |drag_view_|s coordinates.
int drag_offset_;
// Index |drag_view_| was initially at.
int start_drag_index_;
// Used for the context menu of a particular item.
LauncherID context_menu_id_;
#if !defined(OS_MACOSX)
scoped_ptr<views::MenuRunner> overflow_menu_runner_;
scoped_ptr<views::MenuRunner> launcher_menu_runner_;
#endif
DISALLOW_COPY_AND_ASSIGN(LauncherView);
};
} // namespace internal
} // namespace ash
#endif // ASH_LAUNCHER_LAUNCHER_VIEW_H_