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 app_list_main_view()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