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 #include "ash/launcher/launcher.h" 6 7 #include <algorithm> 8 #include <cmath> 9 10 #include "ash/focus_cycler.h" 11 #include "ash/root_window_controller.h" 12 #include "ash/screen_ash.h" 13 #include "ash/shelf/shelf_delegate.h" 14 #include "ash/shelf/shelf_item_delegate.h" 15 #include "ash/shelf/shelf_item_delegate_manager.h" 16 #include "ash/shelf/shelf_layout_manager.h" 17 #include "ash/shelf/shelf_model.h" 18 #include "ash/shelf/shelf_navigator.h" 19 #include "ash/shelf/shelf_util.h" 20 #include "ash/shelf/shelf_view.h" 21 #include "ash/shelf/shelf_widget.h" 22 #include "ash/shell.h" 23 #include "ash/shell_delegate.h" 24 #include "ash/shell_window_ids.h" 25 #include "ash/wm/window_properties.h" 26 #include "grit/ash_resources.h" 27 #include "ui/aura/client/activation_client.h" 28 #include "ui/aura/root_window.h" 29 #include "ui/aura/window.h" 30 #include "ui/aura/window_observer.h" 31 #include "ui/base/resource/resource_bundle.h" 32 #include "ui/compositor/layer.h" 33 #include "ui/gfx/canvas.h" 34 #include "ui/gfx/image/image.h" 35 #include "ui/gfx/image/image_skia_operations.h" 36 #include "ui/gfx/skbitmap_operations.h" 37 #include "ui/views/accessible_pane_view.h" 38 #include "ui/views/widget/widget.h" 39 #include "ui/views/widget/widget_delegate.h" 40 41 namespace ash { 42 43 const char Launcher::kNativeViewName[] = "ShelfView"; 44 45 Launcher::Launcher(ShelfModel* shelf_model, 46 ShelfDelegate* shelf_delegate, 47 ShelfWidget* shelf_widget) 48 : shelf_view_(NULL), 49 alignment_(shelf_widget->GetAlignment()), 50 delegate_(shelf_delegate), 51 shelf_widget_(shelf_widget) { 52 shelf_view_ = new internal::ShelfView( 53 shelf_model, delegate_, shelf_widget_->shelf_layout_manager()); 54 shelf_view_->Init(); 55 shelf_widget_->GetContentsView()->AddChildView(shelf_view_); 56 shelf_widget_->GetNativeView()->SetName(kNativeViewName); 57 delegate_->OnLauncherCreated(this); 58 } 59 60 Launcher::~Launcher() { 61 delegate_->OnLauncherDestroyed(this); 62 } 63 64 // static 65 Launcher* Launcher::ForPrimaryDisplay() { 66 ShelfWidget* shelf_widget = internal::RootWindowController::ForLauncher( 67 Shell::GetPrimaryRootWindow())->shelf(); 68 return shelf_widget ? shelf_widget->launcher() : NULL; 69 } 70 71 // static 72 Launcher* Launcher::ForWindow(aura::Window* window) { 73 ShelfWidget* shelf_widget = 74 internal::RootWindowController::ForLauncher(window)->shelf(); 75 return shelf_widget ? shelf_widget->launcher() : NULL; 76 } 77 78 void Launcher::SetAlignment(ShelfAlignment alignment) { 79 alignment_ = alignment; 80 shelf_view_->OnShelfAlignmentChanged(); 81 // ShelfLayoutManager will resize the launcher. 82 } 83 84 gfx::Rect Launcher::GetScreenBoundsOfItemIconForWindow(aura::Window* window) { 85 LauncherID id = GetLauncherIDForWindow(window); 86 gfx::Rect bounds(shelf_view_->GetIdealBoundsOfItemIcon(id)); 87 gfx::Point screen_origin; 88 views::View::ConvertPointToScreen(shelf_view_, &screen_origin); 89 return gfx::Rect(screen_origin.x() + bounds.x(), 90 screen_origin.y() + bounds.y(), 91 bounds.width(), 92 bounds.height()); 93 } 94 95 void Launcher::UpdateIconPositionForWindow(aura::Window* window) { 96 shelf_view_->UpdatePanelIconPosition( 97 GetLauncherIDForWindow(window), 98 ash::ScreenAsh::ConvertRectFromScreen( 99 shelf_widget()->GetNativeView(), 100 window->GetBoundsInScreen()).CenterPoint()); 101 } 102 103 void Launcher::ActivateLauncherItem(int index) { 104 // We pass in a keyboard event which will then trigger a switch to the 105 // next item if the current one is already active. 106 ui::KeyEvent event(ui::ET_KEY_RELEASED, 107 ui::VKEY_UNKNOWN, // The actual key gets ignored. 108 ui::EF_NONE, 109 false); 110 111 const LauncherItem& item = shelf_view_->model()->items()[index]; 112 ShelfItemDelegate* item_delegate = 113 Shell::GetInstance()->shelf_item_delegate_manager()->GetShelfItemDelegate( 114 item.id); 115 item_delegate->ItemSelected(event); 116 } 117 118 void Launcher::CycleWindowLinear(CycleDirection direction) { 119 int item_index = GetNextActivatedItemIndex( 120 *(shelf_view_->model()), direction); 121 if (item_index >= 0) 122 ActivateLauncherItem(item_index); 123 } 124 125 void Launcher::AddIconObserver(ShelfIconObserver* observer) { 126 shelf_view_->AddIconObserver(observer); 127 } 128 129 void Launcher::RemoveIconObserver(ShelfIconObserver* observer) { 130 shelf_view_->RemoveIconObserver(observer); 131 } 132 133 bool Launcher::IsShowingMenu() const { 134 return shelf_view_->IsShowingMenu(); 135 } 136 137 bool Launcher::IsShowingOverflowBubble() const { 138 return shelf_view_->IsShowingOverflowBubble(); 139 } 140 141 void Launcher::SetVisible(bool visible) const { 142 shelf_view_->SetVisible(visible); 143 } 144 145 bool Launcher::IsVisible() const { 146 return shelf_view_->visible(); 147 } 148 149 void Launcher::SchedulePaint() { 150 shelf_view_->SchedulePaintForAllButtons(); 151 } 152 153 views::View* Launcher::GetAppListButtonView() const { 154 return shelf_view_->GetAppListButtonView(); 155 } 156 157 void Launcher::LaunchAppIndexAt(int item_index) { 158 ShelfModel* shelf_model = shelf_view_->model(); 159 const LauncherItems& items = shelf_model->items(); 160 int item_count = shelf_model->item_count(); 161 int indexes_left = item_index >= 0 ? item_index : item_count; 162 int found_index = -1; 163 164 // Iterating until we have hit the index we are interested in which 165 // is true once indexes_left becomes negative. 166 for (int i = 0; i < item_count && indexes_left >= 0; i++) { 167 if (items[i].type != TYPE_APP_LIST) { 168 found_index = i; 169 indexes_left--; 170 } 171 } 172 173 // There are two ways how found_index can be valid: a.) the nth item was 174 // found (which is true when indexes_left is -1) or b.) the last item was 175 // requested (which is true when index was passed in as a negative number). 176 if (found_index >= 0 && (indexes_left == -1 || item_index < 0)) { 177 // Then set this one as active (or advance to the next item of its kind). 178 ActivateLauncherItem(found_index); 179 } 180 } 181 182 void Launcher::SetShelfViewBounds(gfx::Rect bounds) { 183 shelf_view_->SetBoundsRect(bounds); 184 } 185 186 gfx::Rect Launcher::GetShelfViewBounds() const { 187 return shelf_view_->bounds(); 188 } 189 190 gfx::Rect Launcher::GetVisibleItemsBoundsInScreen() const { 191 return shelf_view_->GetVisibleItemsBoundsInScreen(); 192 } 193 194 app_list::ApplicationDragAndDropHost* Launcher::GetDragAndDropHostForAppList() { 195 return shelf_view_; 196 } 197 198 } // namespace ash 199