summaryrefslogtreecommitdiff
path: root/chromium/ash/shelf/shelf_button.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/shelf/shelf_button.h')
-rw-r--r--chromium/ash/shelf/shelf_button.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/chromium/ash/shelf/shelf_button.h b/chromium/ash/shelf/shelf_button.h
new file mode 100644
index 00000000000..60158f2ea95
--- /dev/null
+++ b/chromium/ash/shelf/shelf_button.h
@@ -0,0 +1,160 @@
+// Copyright 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 ASH_SHELF_SHELF_BUTTON_H_
+#define ASH_SHELF_SHELF_BUTTON_H_
+
+#include "ash/ash_export.h"
+#include "ui/gfx/shadow_value.h"
+#include "ui/views/controls/button/custom_button.h"
+#include "ui/views/controls/image_view.h"
+
+namespace ash {
+namespace internal {
+
+class ShelfButtonHost;
+class ShelfLayoutManager;
+
+// Button used for items on the launcher, except for the AppList.
+class ASH_EXPORT ShelfButton : public views::CustomButton {
+ public:
+ // Used to indicate the current state of the button.
+ enum State {
+ // Nothing special. Usually represents an app shortcut item with no running
+ // instance.
+ STATE_NORMAL = 0,
+ // Button has mouse hovering on it.
+ STATE_HOVERED = 1 << 0,
+ // Underlying LauncherItem has a running instance.
+ STATE_RUNNING = 1 << 1,
+ // Underlying LauncherItem is active (i.e. has focus).
+ STATE_ACTIVE = 1 << 2,
+ // Underlying LauncherItem needs user's attention.
+ STATE_ATTENTION = 1 << 3,
+ STATE_FOCUSED = 1 << 4,
+ // Hide the status (temporarily for some animations).
+ STATE_HIDDEN = 1 << 5,
+ };
+
+ virtual ~ShelfButton();
+
+ // Called to create an instance of a ShelfButton.
+ static ShelfButton* Create(views::ButtonListener* listener,
+ ShelfButtonHost* host,
+ ShelfLayoutManager* shelf_layout_manager);
+
+ // Sets the image to display for this entry.
+ void SetImage(const gfx::ImageSkia& image);
+
+ // Retrieve the image to show proxy operations.
+ const gfx::ImageSkia& GetImage() const;
+
+ // |state| is or'd into the current state.
+ void AddState(State state);
+ void ClearState(State state);
+ int state() const { return state_; }
+ const ShelfLayoutManager* shelf_layout_manager() const {
+ return shelf_layout_manager_;
+ }
+
+ // Returns the bounds of the icon.
+ gfx::Rect GetIconBounds() const;
+
+ // Overrides to views::CustomButton:
+ virtual void ShowContextMenu(const gfx::Point& p,
+ ui::MenuSourceType source_type) OVERRIDE;
+
+ // View override - needed by unit test.
+ virtual void OnMouseCaptureLost() OVERRIDE;
+
+ protected:
+ ShelfButton(views::ButtonListener* listener,
+ ShelfButtonHost* host,
+ ShelfLayoutManager* shelf_layout_manager);
+
+ // Class that draws the icon part of a button, so it can be animated
+ // independently of the rest. This can be subclassed to provide a custom
+ // implementation, by overriding CreateIconView().
+ class IconView : public views::ImageView {
+ public:
+ IconView();
+ virtual ~IconView();
+
+ void set_icon_size(int icon_size) { icon_size_ = icon_size; }
+ int icon_size() const { return icon_size_; }
+
+ // views::View overrides.
+ virtual bool HitTestRect(const gfx::Rect& rect) const OVERRIDE;
+
+ private:
+ // Set to non-zero to force icons to be resized to fit within a square,
+ // while maintaining original proportions.
+ int icon_size_;
+
+ DISALLOW_COPY_AND_ASSIGN(IconView);
+ };
+
+ // View overrides:
+ virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
+ virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
+ virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
+ virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE;
+ virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
+ virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
+ virtual void Layout() OVERRIDE;
+ virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
+ virtual void OnFocus() OVERRIDE;
+ virtual void OnBlur() OVERRIDE;
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
+
+ // ui::EventHandler overrides:
+ virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
+
+ // Sets the icon image with a shadow.
+ void SetShadowedImage(const gfx::ImageSkia& bitmap);
+ // Override for custom initialization.
+ virtual void Init();
+ // Override to subclass IconView.
+ virtual IconView* CreateIconView();
+ IconView* icon_view() const { return icon_view_; }
+ ShelfButtonHost* host() const { return host_; }
+
+ private:
+ class BarView;
+
+ // Returns true if the shelf is horizontal. If this returns false the shelf is
+ // vertical.
+ bool IsShelfHorizontal() const;
+
+ // Updates the parts of the button to reflect the current |state_| and
+ // alignment. This may add or remove views, layout and paint.
+ void UpdateState();
+
+ // Updates the status bar (bitmap, orientation, visibility).
+ void UpdateBar();
+
+ ShelfButtonHost* host_;
+ IconView* icon_view_;
+ // Draws a bar underneath the image to represent the state of the application.
+ BarView* bar_;
+ // The current state of the application, multiple values of AppState are or'd
+ // together.
+ int state_;
+
+ ShelfLayoutManager* shelf_layout_manager_;
+
+ gfx::ShadowValues icon_shadows_;
+
+ // If non-null the destuctor sets this to true. This is set while the menu is
+ // showing and used to detect if the menu was deleted while running.
+ bool* destroyed_flag_;
+
+ DISALLOW_COPY_AND_ASSIGN(ShelfButton);
+};
+
+} // namespace internal
+} // namespace ash
+
+#endif // ASH_SHELF_SHELF_BUTTON_H_