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_VIEW_H_
      6 #define UI_APP_LIST_VIEWS_APP_LIST_VIEW_H_
      7 
      8 #include "base/callback.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/observer_list.h"
     11 #include "ui/app_list/app_list_export.h"
     12 #include "ui/app_list/app_list_view_delegate_observer.h"
     13 #include "ui/app_list/speech_ui_model_observer.h"
     14 #include "ui/views/bubble/bubble_delegate.h"
     15 #include "ui/views/widget/widget.h"
     16 
     17 namespace base {
     18 class FilePath;
     19 }
     20 
     21 namespace test {
     22 class AppListViewTestApi;
     23 }
     24 
     25 namespace views {
     26 class ImageView;
     27 }
     28 
     29 namespace app_list {
     30 class ApplicationDragAndDropHost;
     31 class AppListMainView;
     32 class AppListModel;
     33 class AppListViewDelegate;
     34 class AppListViewObserver;
     35 class HideViewAnimationObserver;
     36 class PaginationModel;
     37 class SpeechView;
     38 
     39 // AppListView is the top-level view and controller of app list UI. It creates
     40 // and hosts a AppsGridView and passes AppListModel to it for display.
     41 class APP_LIST_EXPORT AppListView : public views::BubbleDelegateView,
     42                                     public AppListViewDelegateObserver,
     43                                     public SpeechUIModelObserver {
     44  public:
     45   // Does not take ownership of |delegate|.
     46   explicit AppListView(AppListViewDelegate* delegate);
     47   virtual ~AppListView();
     48 
     49   // Initializes the widget and use a given |anchor| plus an |anchor_offset| for
     50   // positioning.
     51   void InitAsBubbleAttachedToAnchor(gfx::NativeView parent,
     52                                     int initial_apps_page,
     53                                     views::View* anchor,
     54                                     const gfx::Vector2d& anchor_offset,
     55                                     views::BubbleBorder::Arrow arrow,
     56                                     bool border_accepts_events);
     57 
     58   // Initializes the widget and use a fixed |anchor_point_in_screen| for
     59   // positioning.
     60   void InitAsBubbleAtFixedLocation(gfx::NativeView parent,
     61                                    int initial_apps_page,
     62                                    const gfx::Point& anchor_point_in_screen,
     63                                    views::BubbleBorder::Arrow arrow,
     64                                    bool border_accepts_events);
     65 
     66   void SetBubbleArrow(views::BubbleBorder::Arrow arrow);
     67 
     68   void SetAnchorPoint(const gfx::Point& anchor_point);
     69 
     70   // If |drag_and_drop_host| is not NULL it will be called upon drag and drop
     71   // operations outside the application list. This has to be called after
     72   // InitAsBubble was called since the app list object needs to exist so that
     73   // it can set the host.
     74   void SetDragAndDropHostOfCurrentAppList(
     75       ApplicationDragAndDropHost* drag_and_drop_host);
     76 
     77   // Shows the UI when there are no pending icon loads. Otherwise, starts a
     78   // timer to show the UI when a maximum allowed wait time has expired.
     79   void ShowWhenReady();
     80 
     81   void Close();
     82 
     83   void UpdateBounds();
     84 
     85   // Enables/disables a semi-transparent overlay over the app list (good for
     86   // hiding the app list when a modal dialog is being shown).
     87   void SetAppListOverlayVisible(bool visible);
     88 
     89   // Returns true if the app list should be centered and in landscape mode.
     90   bool ShouldCenterWindow() const;
     91 
     92   // Overridden from views::View:
     93   virtual gfx::Size GetPreferredSize() const OVERRIDE;
     94   virtual void Paint(gfx::Canvas* canvas,
     95                      const views::CullSet& cull_set) OVERRIDE;
     96   virtual void OnThemeChanged() OVERRIDE;
     97 
     98   // WidgetDelegate overrides:
     99   virtual bool ShouldHandleSystemCommands() const OVERRIDE;
    100 
    101   // Overridden from AppListViewDelegateObserver:
    102   virtual void OnProfilesChanged() OVERRIDE;
    103   virtual void OnShutdown() OVERRIDE;
    104 
    105   void Prerender();
    106 
    107   void SetProfileByPath(const base::FilePath& profile_path);
    108 
    109   void AddObserver(AppListViewObserver* observer);
    110   void RemoveObserver(AppListViewObserver* observer);
    111 
    112   // Set a callback to be called the next time any app list paints.
    113   void SetNextPaintCallback(const base::Closure& callback);
    114 
    115 #if defined(OS_WIN)
    116   HWND GetHWND() const;
    117 #endif
    118 
    119   AppListMainView* app_list_main_view() { return app_list_main_view_; }
    120 
    121   // Gets the PaginationModel owned by this view's apps grid.
    122   PaginationModel* GetAppsPaginationModel();
    123 
    124  private:
    125   friend class ::test::AppListViewTestApi;
    126 
    127   void InitAsBubbleInternal(gfx::NativeView parent,
    128                             int initial_apps_page,
    129                             views::BubbleBorder::Arrow arrow,
    130                             bool border_accepts_events,
    131                             const gfx::Vector2d& anchor_offset);
    132 
    133   // Overridden from views::BubbleDelegateView:
    134   virtual void OnBeforeBubbleWidgetInit(
    135       views::Widget::InitParams* params,
    136       views::Widget* widget) const OVERRIDE;
    137 
    138   // Overridden from views::WidgetDelegateView:
    139   virtual views::View* GetInitiallyFocusedView() OVERRIDE;
    140   virtual gfx::ImageSkia GetWindowIcon() OVERRIDE;
    141   virtual bool WidgetHasHitTestMask() const OVERRIDE;
    142   virtual void GetWidgetHitTestMask(gfx::Path* mask) const OVERRIDE;
    143 
    144   // Overridden from views::View:
    145   virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
    146   virtual void Layout() OVERRIDE;
    147   virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
    148 
    149   // Overridden from views::WidgetObserver:
    150   virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
    151   virtual void OnWidgetVisibilityChanged(
    152       views::Widget* widget, bool visible) OVERRIDE;
    153   virtual void OnWidgetActivationChanged(
    154       views::Widget* widget, bool active) OVERRIDE;
    155 
    156   // Overridden from SpeechUIModelObserver:
    157   virtual void OnSpeechRecognitionStateChanged(
    158       SpeechRecognitionState new_state) OVERRIDE;
    159 
    160   AppListViewDelegate* delegate_;  // Weak. Owned by AppListService.
    161 
    162   AppListMainView* app_list_main_view_;
    163   SpeechView* speech_view_;
    164 
    165   // The red "experimental" banner for the experimental app list.
    166   views::ImageView* experimental_banner_view_;
    167 
    168   // A semi-transparent white overlay that covers the app list while dialogs are
    169   // open.
    170   views::View* overlay_view_;
    171 
    172   ObserverList<AppListViewObserver> observers_;
    173   scoped_ptr<HideViewAnimationObserver> animation_observer_;
    174 
    175   // For UMA and testing. If non-null, triggered when the app list is painted.
    176   base::Closure next_paint_callback_;
    177 
    178   DISALLOW_COPY_AND_ASSIGN(AppListView);
    179 };
    180 
    181 }  // namespace app_list
    182 
    183 #endif  // UI_APP_LIST_VIEWS_APP_LIST_VIEW_H_
    184