Home | History | Annotate | Download | only in views
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef UI_APP_LIST_VIEWS_APP_LIST_ITEM_VIEW_H_
      6 #define UI_APP_LIST_VIEWS_APP_LIST_ITEM_VIEW_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/timer/timer.h"
     13 #include "ui/app_list/app_list_export.h"
     14 #include "ui/app_list/app_list_item_observer.h"
     15 #include "ui/app_list/views/cached_label.h"
     16 #include "ui/gfx/shadow_value.h"
     17 #include "ui/views/context_menu_controller.h"
     18 #include "ui/views/controls/button/custom_button.h"
     19 
     20 class SkBitmap;
     21 
     22 namespace views {
     23 class ImageView;
     24 class Label;
     25 class MenuRunner;
     26 }
     27 
     28 namespace app_list {
     29 
     30 class AppListItem;
     31 class AppsGridView;
     32 class ProgressBarView;
     33 
     34 class APP_LIST_EXPORT AppListItemView : public views::CustomButton,
     35                                         public views::ContextMenuController,
     36                                         public AppListItemObserver {
     37  public:
     38   // Internal class name.
     39   static const char kViewClassName[];
     40 
     41   AppListItemView(AppsGridView* apps_grid_view, AppListItem* item);
     42   virtual ~AppListItemView();
     43 
     44   void SetIconSize(const gfx::Size& size);
     45 
     46   void Prerender();
     47 
     48   void CancelContextMenu();
     49 
     50   gfx::ImageSkia GetDragImage();
     51   void OnDragEnded();
     52   gfx::Point GetDragImageOffset();
     53 
     54   void SetAsAttemptedFolderTarget(bool is_target_folder);
     55 
     56   AppListItem* item() const { return item_; }
     57 
     58   const views::Label* title() const { return title_; }
     59 
     60   // In a synchronous drag the item view isn't informed directly of the drag
     61   // ending, so the runner of the drag should call this.
     62   void OnSyncDragEnd();
     63 
     64   // Returns the icon bounds relative to AppListItemView.
     65   const gfx::Rect& GetIconBounds() const;
     66 
     67   // Sets UI state to dragging state.
     68   void SetDragUIState();
     69 
     70   // Returns the icon bounds for the given |target_bounds| as
     71   // the assuming bounds of this view.
     72   gfx::Rect GetIconBoundsForTargetViewBounds(const gfx::Rect& target_bounds);
     73 
     74  private:
     75   enum UIState {
     76     UI_STATE_NORMAL,    // Normal UI (icon + label)
     77     UI_STATE_DRAGGING,  // Dragging UI (scaled icon only)
     78     UI_STATE_DROPPING_IN_FOLDER,  // Folder dropping preview UI
     79   };
     80 
     81   // Get icon from |item_| and schedule background processing.
     82   void UpdateIcon();
     83 
     84   // Update the tooltip text from |item_|.
     85   void UpdateTooltip();
     86 
     87   void SetUIState(UIState state);
     88 
     89   // Sets |touch_dragging_| flag and updates UI.
     90   void SetTouchDragging(bool touch_dragging);
     91 
     92   // Invoked when |mouse_drag_timer_| fires to show dragging UI.
     93   void OnMouseDragTimer();
     94 
     95   // If the item is not in a folder, not highlighted, not being dragged, and not
     96   // having something dropped onto it, enables subpixel AA for the title.
     97   void SetTitleSubpixelAA();
     98 
     99   // AppListItemObserver overrides:
    100   virtual void ItemIconChanged() OVERRIDE;
    101   virtual void ItemNameChanged() OVERRIDE;
    102   virtual void ItemHighlightedChanged() OVERRIDE;
    103   virtual void ItemIsInstallingChanged() OVERRIDE;
    104   virtual void ItemPercentDownloadedChanged() OVERRIDE;
    105 
    106   // views::View overrides:
    107   virtual const char* GetClassName() const OVERRIDE;
    108   virtual void Layout() OVERRIDE;
    109   virtual void SchedulePaintInRect(const gfx::Rect& r) OVERRIDE;
    110   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
    111 
    112   // views::ContextMenuController overrides:
    113   virtual void ShowContextMenuForView(views::View* source,
    114                                       const gfx::Point& point,
    115                                       ui::MenuSourceType source_type) OVERRIDE;
    116 
    117   // views::CustomButton overrides:
    118   virtual void StateChanged() OVERRIDE;
    119   virtual bool ShouldEnterPushedState(const ui::Event& event) OVERRIDE;
    120 
    121   // views::View overrides:
    122   virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
    123   virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
    124   virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
    125   virtual void OnMouseCaptureLost() OVERRIDE;
    126   virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
    127 
    128   // ui::EventHandler overrides:
    129   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
    130 
    131   AppListItem* item_;  // Owned by AppListModel.
    132 
    133   AppsGridView* apps_grid_view_;  // Owned by views hierarchy.
    134   views::ImageView* icon_;  // Owned by views hierarchy.
    135   CachedLabel* title_;  // Owned by views hierarchy.
    136   ProgressBarView* progress_bar_;  // Owned by views hierarchy.
    137 
    138   scoped_ptr<views::MenuRunner> context_menu_runner_;
    139 
    140   gfx::Size icon_size_;
    141   gfx::ShadowValues icon_shadows_;
    142 
    143   UIState ui_state_;
    144 
    145   // True if scroll gestures should contribute to dragging.
    146   bool touch_dragging_;
    147 
    148   // A timer to defer showing drag UI when mouse is pressed.
    149   base::OneShotTimer<AppListItemView> mouse_drag_timer_;
    150 
    151   DISALLOW_COPY_AND_ASSIGN(AppListItemView);
    152 };
    153 
    154 }  // namespace app_list
    155 
    156 #endif  // UI_APP_LIST_VIEWS_APP_LIST_ITEM_VIEW_H_
    157