OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/launcher/launcher_view.h" | 5 #include "ash/launcher/launcher_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/ash_constants.h" | 9 #include "ash/ash_constants.h" |
10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
11 #include "ash/launcher/app_list_button.h" | 11 #include "ash/launcher/app_list_button.h" |
12 #include "ash/launcher/launcher_button.h" | 12 #include "ash/launcher/launcher_button.h" |
13 #include "ash/launcher/launcher_delegate.h" | 13 #include "ash/launcher/launcher_delegate.h" |
14 #include "ash/launcher/launcher_icon_observer.h" | 14 #include "ash/launcher/launcher_icon_observer.h" |
15 #include "ash/launcher/launcher_model.h" | 15 #include "ash/launcher/launcher_model.h" |
16 #include "ash/launcher/launcher_tooltip_manager.h" | 16 #include "ash/launcher/launcher_tooltip_manager.h" |
17 #include "ash/launcher/overflow_bubble.h" | 17 #include "ash/launcher/overflow_bubble.h" |
18 #include "ash/launcher/overflow_button.h" | 18 #include "ash/launcher/overflow_button.h" |
19 #include "ash/launcher/tabbed_launcher_button.h" | 19 #include "ash/launcher/tabbed_launcher_button.h" |
20 #include "ash/root_window_controller.h" | 20 #include "ash/root_window_controller.h" |
21 #include "ash/shelf/shelf_layout_manager.h" | 21 #include "ash/shelf/shelf_layout_manager.h" |
22 #include "ash/shelf/shelf_widget.h" | 22 #include "ash/shelf/shelf_widget.h" |
23 #include "ash/shell_delegate.h" | 23 #include "ash/shell_delegate.h" |
24 #include "base/auto_reset.h" | 24 #include "base/auto_reset.h" |
25 #include "base/command_line.h" | |
25 #include "base/memory/scoped_ptr.h" | 26 #include "base/memory/scoped_ptr.h" |
26 #include "grit/ash_resources.h" | 27 #include "grit/ash_resources.h" |
27 #include "grit/ash_strings.h" | 28 #include "grit/ash_strings.h" |
28 #include "ui/aura/window.h" | 29 #include "ui/aura/window.h" |
29 #include "ui/base/l10n/l10n_util.h" | 30 #include "ui/base/l10n/l10n_util.h" |
30 #include "ui/base/models/simple_menu_model.h" | 31 #include "ui/base/models/simple_menu_model.h" |
31 #include "ui/base/resource/resource_bundle.h" | 32 #include "ui/base/resource/resource_bundle.h" |
32 #include "ui/compositor/layer.h" | 33 #include "ui/compositor/layer.h" |
33 #include "ui/compositor/layer_animator.h" | 34 #include "ui/compositor/layer_animator.h" |
34 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 35 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
370 overflow_button_(NULL), | 371 overflow_button_(NULL), |
371 drag_pointer_(NONE), | 372 drag_pointer_(NONE), |
372 drag_view_(NULL), | 373 drag_view_(NULL), |
373 drag_offset_(0), | 374 drag_offset_(0), |
374 start_drag_index_(-1), | 375 start_drag_index_(-1), |
375 context_menu_id_(0), | 376 context_menu_id_(0), |
376 leading_inset_(kDefaultLeadingInset), | 377 leading_inset_(kDefaultLeadingInset), |
377 cancelling_drag_model_changed_(false), | 378 cancelling_drag_model_changed_(false), |
378 last_hidden_index_(0), | 379 last_hidden_index_(0), |
379 closing_event_time_(base::TimeDelta()), | 380 closing_event_time_(base::TimeDelta()), |
380 got_deleted_(NULL) { | 381 got_deleted_(NULL), |
382 drag_and_drop_item_created_(false), | |
383 drag_and_drop_launcher_id_(0) { | |
381 DCHECK(model_); | 384 DCHECK(model_); |
382 bounds_animator_.reset(new views::BoundsAnimator(this)); | 385 bounds_animator_.reset(new views::BoundsAnimator(this)); |
383 bounds_animator_->AddObserver(this); | 386 bounds_animator_->AddObserver(this); |
384 set_context_menu_controller(this); | 387 set_context_menu_controller(this); |
385 focus_search_.reset(new LauncherFocusSearch(view_model_.get())); | 388 focus_search_.reset(new LauncherFocusSearch(view_model_.get())); |
386 tooltip_.reset(new LauncherTooltipManager( | 389 tooltip_.reset(new LauncherTooltipManager( |
387 shelf_layout_manager, this)); | 390 shelf_layout_manager, this)); |
388 } | 391 } |
389 | 392 |
390 LauncherView::~LauncherView() { | 393 LauncherView::~LauncherView() { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
516 } | 519 } |
517 | 520 |
518 views::FocusTraversable* LauncherView::GetFocusTraversableParent() { | 521 views::FocusTraversable* LauncherView::GetFocusTraversableParent() { |
519 return parent()->GetFocusTraversable(); | 522 return parent()->GetFocusTraversable(); |
520 } | 523 } |
521 | 524 |
522 View* LauncherView::GetFocusTraversableParentView() { | 525 View* LauncherView::GetFocusTraversableParentView() { |
523 return this; | 526 return this; |
524 } | 527 } |
525 | 528 |
529 bool LauncherView::StartDrag(const std::string& app_id, | |
530 const gfx::Point& location_in_screen_coordinates) { | |
531 // Bail if an operation is already going on - or the cursor is not inside. | |
532 // This could happen if mouse / touch operations overlap. | |
533 if (drag_and_drop_launcher_id_ || | |
534 !GetBoundsInScreen().Contains(location_in_screen_coordinates)) | |
535 return false; | |
536 | |
537 // If the AppsGridView (which was dispatching this event) was opened by our | |
538 // button, LauncherView dragging operations are locked and we have to unlock. | |
539 CancelDrag(-1); | |
540 drag_and_drop_item_created_ = false; | |
541 drag_and_drop_app_id_ = app_id; | |
542 drag_and_drop_launcher_id_ = | |
543 delegate_->GetLauncherIDForAppID(drag_and_drop_app_id_); | |
544 | |
545 if (!drag_and_drop_launcher_id_) { | |
546 delegate_->PinAppWithID(app_id); | |
547 drag_and_drop_launcher_id_ = | |
548 delegate_->GetLauncherIDForAppID(drag_and_drop_app_id_); | |
549 if (!drag_and_drop_launcher_id_) | |
550 return false; | |
551 drag_and_drop_item_created_ = true; | |
552 } | |
553 views::View* drag_and_drop_view = view_model_->view_at( | |
554 model_->ItemIndexByID(drag_and_drop_launcher_id_)); | |
555 DCHECK(drag_and_drop_view); | |
556 | |
557 // Since there is already an icon presented, we hide this one for now. | |
558 drag_and_drop_view->SetVisible(false); | |
559 // First we have to center the mouse cursor over the item. | |
560 gfx::Point pt = drag_and_drop_view->GetBoundsInScreen().CenterPoint(); | |
561 views::View::ConvertPointFromScreen(drag_and_drop_view, &pt); | |
562 ui::MouseEvent event(ui::ET_MOUSE_PRESSED, | |
563 pt, location_in_screen_coordinates, 0); | |
564 PointerPressedOnButton( | |
565 drag_and_drop_view, LauncherButtonHost::DRAG_AND_DROP, event); | |
566 | |
567 // Drag the item where it really belongs. | |
568 Drag(location_in_screen_coordinates); | |
569 return true; | |
570 } | |
571 | |
572 bool LauncherView::Drag(const gfx::Point& location_in_screen_coordinates) { | |
573 if (!drag_and_drop_launcher_id_ || | |
574 !GetBoundsInScreen().Contains(location_in_screen_coordinates)) | |
575 return false; | |
576 | |
577 gfx::Point pt = location_in_screen_coordinates; | |
578 views::View* drag_and_drop_view = view_model_->view_at( | |
579 model_->ItemIndexByID(drag_and_drop_launcher_id_)); | |
580 views::View::ConvertPointFromScreen(drag_and_drop_view, &pt); | |
581 | |
582 ui::MouseEvent event(ui::ET_MOUSE_DRAGGED, pt, gfx::Point(), 0); | |
583 PointerDraggedOnButton( | |
584 drag_and_drop_view, LauncherButtonHost::DRAG_AND_DROP, event); | |
585 return true; | |
586 } | |
587 | |
588 void LauncherView::EndDrag(bool cancel) { | |
589 if (!drag_and_drop_launcher_id_) | |
590 return; | |
591 | |
592 views::View* drag_and_drop_view = view_model_->view_at( | |
593 model_->ItemIndexByID(drag_and_drop_launcher_id_)); | |
594 PointerReleasedOnButton( | |
595 drag_and_drop_view, LauncherButtonHost::DRAG_AND_DROP, cancel); | |
596 | |
597 if (drag_and_drop_item_created_ && cancel) | |
598 delegate_->UnpinAppsWithID(drag_and_drop_app_id_); | |
599 | |
600 if (drag_and_drop_view) | |
601 drag_and_drop_view->SetVisible(true); | |
602 | |
603 drag_and_drop_launcher_id_ = 0; | |
604 } | |
605 | |
526 void LauncherView::LayoutToIdealBounds() { | 606 void LauncherView::LayoutToIdealBounds() { |
527 IdealBounds ideal_bounds; | 607 IdealBounds ideal_bounds; |
528 CalculateIdealBounds(&ideal_bounds); | 608 CalculateIdealBounds(&ideal_bounds); |
529 | 609 |
530 if (bounds_animator_->IsAnimating()) | 610 if (bounds_animator_->IsAnimating()) |
531 AnimateToIdealBounds(); | 611 AnimateToIdealBounds(); |
532 else | 612 else |
533 views::ViewModelUtils::SetViewBoundsToIdealBounds(*view_model_); | 613 views::ViewModelUtils::SetViewBoundsToIdealBounds(*view_model_); |
534 | 614 |
535 overflow_button_->SetBoundsRect(ideal_bounds.overflow_bounds); | 615 overflow_button_->SetBoundsRect(ideal_bounds.overflow_bounds); |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1333 return; | 1413 return; |
1334 | 1414 |
1335 { | 1415 { |
1336 // Slow down activation animations if shift key is pressed. | 1416 // Slow down activation animations if shift key is pressed. |
1337 scoped_ptr<ui::ScopedAnimationDurationScaleMode> slowing_animations; | 1417 scoped_ptr<ui::ScopedAnimationDurationScaleMode> slowing_animations; |
1338 if (event.IsShiftDown()) { | 1418 if (event.IsShiftDown()) { |
1339 slowing_animations.reset(new ui::ScopedAnimationDurationScaleMode( | 1419 slowing_animations.reset(new ui::ScopedAnimationDurationScaleMode( |
1340 ui::ScopedAnimationDurationScaleMode::SLOW_DURATION)); | 1420 ui::ScopedAnimationDurationScaleMode::SLOW_DURATION)); |
1341 } | 1421 } |
1342 | 1422 |
1343 // Collect usage statistics before we decide what to do with the click. | 1423 // Collect usage statistics before we decide what to do with the click. |
1344 switch (model_->items()[view_index].type) { | 1424 switch (model_->items()[view_index].type) { |
1345 case TYPE_APP_SHORTCUT: | 1425 case TYPE_APP_SHORTCUT: |
1346 case TYPE_WINDOWED_APP: | 1426 case TYPE_WINDOWED_APP: |
1347 case TYPE_PLATFORM_APP: | 1427 case TYPE_PLATFORM_APP: |
1348 Shell::GetInstance()->delegate()->RecordUserMetricsAction( | 1428 Shell::GetInstance()->delegate()->RecordUserMetricsAction( |
1349 UMA_LAUNCHER_CLICK_ON_APP); | 1429 UMA_LAUNCHER_CLICK_ON_APP); |
1350 // Fallthrough | 1430 // Fallthrough |
1351 case TYPE_TABBED: | 1431 case TYPE_TABBED: |
1352 case TYPE_APP_PANEL: | 1432 case TYPE_APP_PANEL: |
1353 delegate_->ItemSelected(model_->items()[view_index], event); | 1433 delegate_->ItemSelected(model_->items()[view_index], event); |
1354 break; | 1434 break; |
1355 | 1435 |
1356 case TYPE_APP_LIST: | 1436 case TYPE_APP_LIST: |
1357 Shell::GetInstance()->delegate()->RecordUserMetricsAction( | 1437 Shell::GetInstance()->delegate()->RecordUserMetricsAction( |
1358 UMA_LAUNCHER_CLICK_ON_APPLIST_BUTTON); | 1438 UMA_LAUNCHER_CLICK_ON_APPLIST_BUTTON); |
1359 Shell::GetInstance()->ToggleAppList(GetWidget()->GetNativeView()); | 1439 Shell::GetInstance()->ToggleAppList(GetWidget()->GetNativeView()); |
1360 break; | 1440 // By setting us as DnD recipient, the app list knows that we can |
1441 // handle items. | |
1442 // TODO(skuhne): Invert the flag | |
1443 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
1444 ash::switches::kAshDragAndDropAppListToLauncher)) | |
1445 Shell::GetInstance()->SetDragAndDropHostOfCurrentAppList(this); | |
xiyuan
2013/05/08 16:43:47
What happens if app list is invoked via shortcut k
| |
1446 break; | |
1361 | 1447 |
1362 case TYPE_BROWSER_SHORTCUT: | 1448 case TYPE_BROWSER_SHORTCUT: |
1363 // Click on browser icon is counted in app clicks. | 1449 // Click on browser icon is counted in app clicks. |
1364 Shell::GetInstance()->delegate()->RecordUserMetricsAction( | 1450 Shell::GetInstance()->delegate()->RecordUserMetricsAction( |
1365 UMA_LAUNCHER_CLICK_ON_APP); | 1451 UMA_LAUNCHER_CLICK_ON_APP); |
1366 delegate_->OnBrowserShortcutClicked(event.flags()); | 1452 delegate_->OnBrowserShortcutClicked(event.flags()); |
1367 break; | 1453 break; |
1368 } | 1454 } |
1369 } | 1455 } |
1370 | 1456 |
1371 if (model_->items()[view_index].type != TYPE_APP_LIST) | 1457 if (model_->items()[view_index].type != TYPE_APP_LIST) |
1372 ShowListMenuForView(model_->items()[view_index], sender, event.flags()); | 1458 ShowListMenuForView(model_->items()[view_index], sender, event.flags()); |
1373 } | 1459 } |
1374 | 1460 |
1375 bool LauncherView::ShowListMenuForView(const LauncherItem& item, | 1461 bool LauncherView::ShowListMenuForView(const LauncherItem& item, |
1376 views::View* source, | 1462 views::View* source, |
1377 int event_flags) { | 1463 int event_flags) { |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1522 bool LauncherView::ShouldShowTooltipForView(const views::View* view) const { | 1608 bool LauncherView::ShouldShowTooltipForView(const views::View* view) const { |
1523 if (view == GetAppListButtonView() && | 1609 if (view == GetAppListButtonView() && |
1524 Shell::GetInstance()->GetAppListWindow()) | 1610 Shell::GetInstance()->GetAppListWindow()) |
1525 return false; | 1611 return false; |
1526 const LauncherItem* item = LauncherItemForView(view); | 1612 const LauncherItem* item = LauncherItemForView(view); |
1527 return (!item || delegate_->ShouldShowTooltip(*item)); | 1613 return (!item || delegate_->ShouldShowTooltip(*item)); |
1528 } | 1614 } |
1529 | 1615 |
1530 } // namespace internal | 1616 } // namespace internal |
1531 } // namespace ash | 1617 } // namespace ash |
OLD | NEW |