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/shelf/shelf_view.h" | 5 #include "ash/shelf/shelf_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" |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 view_->layer()->SetOpacity(1.0f); | 287 view_->layer()->SetOpacity(1.0f); |
288 view_->layer()->ScheduleDraw(); | 288 view_->layer()->ScheduleDraw(); |
289 } | 289 } |
290 | 290 |
291 private: | 291 private: |
292 views::View* view_; | 292 views::View* view_; |
293 | 293 |
294 DISALLOW_COPY_AND_ASSIGN(FadeInAnimationDelegate); | 294 DISALLOW_COPY_AND_ASSIGN(FadeInAnimationDelegate); |
295 }; | 295 }; |
296 | 296 |
297 void ReflectItemStatus(const LauncherItem& item, ShelfButton* button) { | 297 void ReflectItemStatus(const ShelfItem& item, ShelfButton* button) { |
298 switch (item.status) { | 298 switch (item.status) { |
299 case STATUS_CLOSED: | 299 case STATUS_CLOSED: |
300 button->ClearState(ShelfButton::STATE_ACTIVE); | 300 button->ClearState(ShelfButton::STATE_ACTIVE); |
301 button->ClearState(ShelfButton::STATE_RUNNING); | 301 button->ClearState(ShelfButton::STATE_RUNNING); |
302 button->ClearState(ShelfButton::STATE_ATTENTION); | 302 button->ClearState(ShelfButton::STATE_ATTENTION); |
303 break; | 303 break; |
304 case STATUS_RUNNING: | 304 case STATUS_RUNNING: |
305 button->ClearState(ShelfButton::STATE_ACTIVE); | 305 button->ClearState(ShelfButton::STATE_ACTIVE); |
306 button->AddState(ShelfButton::STATE_RUNNING); | 306 button->AddState(ShelfButton::STATE_RUNNING); |
307 button->ClearState(ShelfButton::STATE_ATTENTION); | 307 button->ClearState(ShelfButton::STATE_ATTENTION); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 drag_view_(NULL), | 390 drag_view_(NULL), |
391 drag_offset_(0), | 391 drag_offset_(0), |
392 start_drag_index_(-1), | 392 start_drag_index_(-1), |
393 context_menu_id_(0), | 393 context_menu_id_(0), |
394 leading_inset_(kDefaultLeadingInset), | 394 leading_inset_(kDefaultLeadingInset), |
395 cancelling_drag_model_changed_(false), | 395 cancelling_drag_model_changed_(false), |
396 last_hidden_index_(0), | 396 last_hidden_index_(0), |
397 closing_event_time_(base::TimeDelta()), | 397 closing_event_time_(base::TimeDelta()), |
398 got_deleted_(NULL), | 398 got_deleted_(NULL), |
399 drag_and_drop_item_pinned_(false), | 399 drag_and_drop_item_pinned_(false), |
400 drag_and_drop_launcher_id_(0), | 400 drag_and_drop_shelf_id_(0), |
401 dragged_off_shelf_(false), | 401 dragged_off_shelf_(false), |
402 snap_back_from_rip_off_view_(NULL), | 402 snap_back_from_rip_off_view_(NULL), |
403 item_manager_(Shell::GetInstance()->shelf_item_delegate_manager()), | 403 item_manager_(Shell::GetInstance()->shelf_item_delegate_manager()), |
404 layout_manager_(manager), | 404 layout_manager_(manager), |
405 overflow_mode_(false), | 405 overflow_mode_(false), |
406 main_shelf_(NULL), | 406 main_shelf_(NULL), |
407 dragged_off_from_overflow_to_shelf_(false) { | 407 dragged_off_from_overflow_to_shelf_(false) { |
408 DCHECK(model_); | 408 DCHECK(model_); |
409 bounds_animator_.reset(new views::BoundsAnimator(this)); | 409 bounds_animator_.reset(new views::BoundsAnimator(this)); |
410 bounds_animator_->AddObserver(this); | 410 bounds_animator_->AddObserver(this); |
411 set_context_menu_controller(this); | 411 set_context_menu_controller(this); |
412 focus_search_.reset(new ShelfFocusSearch(view_model_.get())); | 412 focus_search_.reset(new ShelfFocusSearch(view_model_.get())); |
413 tooltip_.reset(new ShelfTooltipManager(manager, this)); | 413 tooltip_.reset(new ShelfTooltipManager(manager, this)); |
414 } | 414 } |
415 | 415 |
416 ShelfView::~ShelfView() { | 416 ShelfView::~ShelfView() { |
417 bounds_animator_->RemoveObserver(this); | 417 bounds_animator_->RemoveObserver(this); |
418 model_->RemoveObserver(this); | 418 model_->RemoveObserver(this); |
419 // If we are inside the MenuRunner, we need to know if we were getting | 419 // If we are inside the MenuRunner, we need to know if we were getting |
420 // deleted while it was running. | 420 // deleted while it was running. |
421 if (got_deleted_) | 421 if (got_deleted_) |
422 *got_deleted_ = true; | 422 *got_deleted_ = true; |
423 } | 423 } |
424 | 424 |
425 void ShelfView::Init() { | 425 void ShelfView::Init() { |
426 model_->AddObserver(this); | 426 model_->AddObserver(this); |
427 | 427 |
428 const LauncherItems& items(model_->items()); | 428 const ShelfItems& items(model_->items()); |
429 for (LauncherItems::const_iterator i = items.begin(); i != items.end(); ++i) { | 429 for (ShelfItems::const_iterator i = items.begin(); i != items.end(); ++i) { |
430 views::View* child = CreateViewForItem(*i); | 430 views::View* child = CreateViewForItem(*i); |
431 child->SetPaintToLayer(true); | 431 child->SetPaintToLayer(true); |
432 view_model_->Add(child, static_cast<int>(i - items.begin())); | 432 view_model_->Add(child, static_cast<int>(i - items.begin())); |
433 AddChildView(child); | 433 AddChildView(child); |
434 } | 434 } |
435 ShelfStatusChanged(); | 435 ShelfStatusChanged(); |
436 overflow_button_ = new OverflowButton(this); | 436 overflow_button_ = new OverflowButton(this); |
437 overflow_button_->set_context_menu_controller(this); | 437 overflow_button_->set_context_menu_controller(this); |
438 ConfigureChildView(overflow_button_); | 438 ConfigureChildView(overflow_button_); |
439 AddChildView(overflow_button_); | 439 AddChildView(overflow_button_); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 | 472 |
473 void ShelfView::SchedulePaintForAllButtons() { | 473 void ShelfView::SchedulePaintForAllButtons() { |
474 for (int i = 0; i < view_model_->view_size(); ++i) { | 474 for (int i = 0; i < view_model_->view_size(); ++i) { |
475 if (i >= first_visible_index_ && i <= last_visible_index_) | 475 if (i >= first_visible_index_ && i <= last_visible_index_) |
476 view_model_->view_at(i)->SchedulePaint(); | 476 view_model_->view_at(i)->SchedulePaint(); |
477 } | 477 } |
478 if (overflow_button_ && overflow_button_->visible()) | 478 if (overflow_button_ && overflow_button_->visible()) |
479 overflow_button_->SchedulePaint(); | 479 overflow_button_->SchedulePaint(); |
480 } | 480 } |
481 | 481 |
482 gfx::Rect ShelfView::GetIdealBoundsOfItemIcon(LauncherID id) { | 482 gfx::Rect ShelfView::GetIdealBoundsOfItemIcon(ShelfID id) { |
483 int index = model_->ItemIndexByID(id); | 483 int index = model_->ItemIndexByID(id); |
484 if (index == -1 || (index > last_visible_index_ && | 484 if (index == -1 || (index > last_visible_index_ && |
485 index < model_->FirstPanelIndex())) | 485 index < model_->FirstPanelIndex())) |
486 return gfx::Rect(); | 486 return gfx::Rect(); |
487 const gfx::Rect& ideal_bounds(view_model_->ideal_bounds(index)); | 487 const gfx::Rect& ideal_bounds(view_model_->ideal_bounds(index)); |
488 DCHECK_NE(TYPE_APP_LIST, model_->items()[index].type); | 488 DCHECK_NE(TYPE_APP_LIST, model_->items()[index].type); |
489 ShelfButton* button = static_cast<ShelfButton*>(view_model_->view_at(index)); | 489 ShelfButton* button = static_cast<ShelfButton*>(view_model_->view_at(index)); |
490 gfx::Rect icon_bounds = button->GetIconBounds(); | 490 gfx::Rect icon_bounds = button->GetIconBounds(); |
491 return gfx::Rect(GetMirroredXWithWidthInView( | 491 return gfx::Rect(GetMirroredXWithWidthInView( |
492 ideal_bounds.x() + icon_bounds.x(), icon_bounds.width()), | 492 ideal_bounds.x() + icon_bounds.x(), icon_bounds.width()), |
493 ideal_bounds.y() + icon_bounds.y(), | 493 ideal_bounds.y() + icon_bounds.y(), |
494 icon_bounds.width(), | 494 icon_bounds.width(), |
495 icon_bounds.height()); | 495 icon_bounds.height()); |
496 } | 496 } |
497 | 497 |
498 void ShelfView::UpdatePanelIconPosition(LauncherID id, | 498 void ShelfView::UpdatePanelIconPosition(ShelfID id, |
499 const gfx::Point& midpoint) { | 499 const gfx::Point& midpoint) { |
500 int current_index = model_->ItemIndexByID(id); | 500 int current_index = model_->ItemIndexByID(id); |
501 int first_panel_index = model_->FirstPanelIndex(); | 501 int first_panel_index = model_->FirstPanelIndex(); |
502 if (current_index < first_panel_index) | 502 if (current_index < first_panel_index) |
503 return; | 503 return; |
504 | 504 |
505 gfx::Point midpoint_in_view(GetMirroredXInView(midpoint.x()), | 505 gfx::Point midpoint_in_view(GetMirroredXInView(midpoint.x()), |
506 midpoint.y()); | 506 midpoint.y()); |
507 int target_index = current_index; | 507 int target_index = current_index; |
508 while (target_index > first_panel_index && | 508 while (target_index > first_panel_index && |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 | 590 |
591 void ShelfView::DestroyDragIconProxy() { | 591 void ShelfView::DestroyDragIconProxy() { |
592 drag_image_.reset(); | 592 drag_image_.reset(); |
593 drag_image_offset_ = gfx::Vector2d(0, 0); | 593 drag_image_offset_ = gfx::Vector2d(0, 0); |
594 } | 594 } |
595 | 595 |
596 bool ShelfView::StartDrag(const std::string& app_id, | 596 bool ShelfView::StartDrag(const std::string& app_id, |
597 const gfx::Point& location_in_screen_coordinates) { | 597 const gfx::Point& location_in_screen_coordinates) { |
598 // Bail if an operation is already going on - or the cursor is not inside. | 598 // Bail if an operation is already going on - or the cursor is not inside. |
599 // This could happen if mouse / touch operations overlap. | 599 // This could happen if mouse / touch operations overlap. |
600 if (drag_and_drop_launcher_id_ || | 600 if (drag_and_drop_shelf_id_ || |
601 !GetBoundsInScreen().Contains(location_in_screen_coordinates)) | 601 !GetBoundsInScreen().Contains(location_in_screen_coordinates)) |
602 return false; | 602 return false; |
603 | 603 |
604 // If the AppsGridView (which was dispatching this event) was opened by our | 604 // If the AppsGridView (which was dispatching this event) was opened by our |
605 // button, ShelfView dragging operations are locked and we have to unlock. | 605 // button, ShelfView dragging operations are locked and we have to unlock. |
606 CancelDrag(-1); | 606 CancelDrag(-1); |
607 drag_and_drop_item_pinned_ = false; | 607 drag_and_drop_item_pinned_ = false; |
608 drag_and_drop_app_id_ = app_id; | 608 drag_and_drop_app_id_ = app_id; |
609 drag_and_drop_launcher_id_ = | 609 drag_and_drop_shelf_id_ = |
610 delegate_->GetLauncherIDForAppID(drag_and_drop_app_id_); | 610 delegate_->GetShelfIDForAppID(drag_and_drop_app_id_); |
611 // Check if the application is known and pinned - if not, we have to pin it so | 611 // Check if the application is known and pinned - if not, we have to pin it so |
612 // that we can re-arrange the shelf order accordingly. Note that items have | 612 // that we can re-arrange the shelf order accordingly. Note that items have |
613 // to be pinned to give them the same (order) possibilities as a shortcut. | 613 // to be pinned to give them the same (order) possibilities as a shortcut. |
614 // When an item is dragged from overflow to shelf, IsShowingOverflowBubble() | 614 // When an item is dragged from overflow to shelf, IsShowingOverflowBubble() |
615 // returns true. At this time, we don't need to pin the item. | 615 // returns true. At this time, we don't need to pin the item. |
616 if (!IsShowingOverflowBubble() && | 616 if (!IsShowingOverflowBubble() && |
617 (!drag_and_drop_launcher_id_ || | 617 (!drag_and_drop_shelf_id_ || |
618 !delegate_->IsAppPinned(app_id))) { | 618 !delegate_->IsAppPinned(app_id))) { |
619 delegate_->PinAppWithID(app_id); | 619 delegate_->PinAppWithID(app_id); |
620 drag_and_drop_launcher_id_ = | 620 drag_and_drop_shelf_id_ = |
621 delegate_->GetLauncherIDForAppID(drag_and_drop_app_id_); | 621 delegate_->GetShelfIDForAppID(drag_and_drop_app_id_); |
622 if (!drag_and_drop_launcher_id_) | 622 if (!drag_and_drop_shelf_id_) |
623 return false; | 623 return false; |
624 drag_and_drop_item_pinned_ = true; | 624 drag_and_drop_item_pinned_ = true; |
625 } | 625 } |
626 views::View* drag_and_drop_view = view_model_->view_at( | 626 views::View* drag_and_drop_view = view_model_->view_at( |
627 model_->ItemIndexByID(drag_and_drop_launcher_id_)); | 627 model_->ItemIndexByID(drag_and_drop_shelf_id_)); |
628 DCHECK(drag_and_drop_view); | 628 DCHECK(drag_and_drop_view); |
629 | 629 |
630 // Since there is already an icon presented by the caller, we hide this item | 630 // Since there is already an icon presented by the caller, we hide this item |
631 // for now. That has to be done by reducing the size since the visibility will | 631 // for now. That has to be done by reducing the size since the visibility will |
632 // change once a regrouping animation is performed. | 632 // change once a regrouping animation is performed. |
633 pre_drag_and_drop_size_ = drag_and_drop_view->size(); | 633 pre_drag_and_drop_size_ = drag_and_drop_view->size(); |
634 drag_and_drop_view->SetSize(gfx::Size()); | 634 drag_and_drop_view->SetSize(gfx::Size()); |
635 | 635 |
636 // First we have to center the mouse cursor over the item. | 636 // First we have to center the mouse cursor over the item. |
637 gfx::Point pt = drag_and_drop_view->GetBoundsInScreen().CenterPoint(); | 637 gfx::Point pt = drag_and_drop_view->GetBoundsInScreen().CenterPoint(); |
638 views::View::ConvertPointFromScreen(drag_and_drop_view, &pt); | 638 views::View::ConvertPointFromScreen(drag_and_drop_view, &pt); |
639 gfx::Point point_in_root = location_in_screen_coordinates; | 639 gfx::Point point_in_root = location_in_screen_coordinates; |
640 ash::wm::ConvertPointFromScreen( | 640 ash::wm::ConvertPointFromScreen( |
641 ash::wm::GetRootWindowAt(location_in_screen_coordinates), | 641 ash::wm::GetRootWindowAt(location_in_screen_coordinates), |
642 &point_in_root); | 642 &point_in_root); |
643 ui::MouseEvent event(ui::ET_MOUSE_PRESSED, pt, point_in_root, 0, 0); | 643 ui::MouseEvent event(ui::ET_MOUSE_PRESSED, pt, point_in_root, 0, 0); |
644 PointerPressedOnButton(drag_and_drop_view, | 644 PointerPressedOnButton(drag_and_drop_view, |
645 ShelfButtonHost::DRAG_AND_DROP, | 645 ShelfButtonHost::DRAG_AND_DROP, |
646 event); | 646 event); |
647 | 647 |
648 // Drag the item where it really belongs. | 648 // Drag the item where it really belongs. |
649 Drag(location_in_screen_coordinates); | 649 Drag(location_in_screen_coordinates); |
650 return true; | 650 return true; |
651 } | 651 } |
652 | 652 |
653 bool ShelfView::Drag(const gfx::Point& location_in_screen_coordinates) { | 653 bool ShelfView::Drag(const gfx::Point& location_in_screen_coordinates) { |
654 if (!drag_and_drop_launcher_id_ || | 654 if (!drag_and_drop_shelf_id_ || |
655 !GetBoundsInScreen().Contains(location_in_screen_coordinates)) | 655 !GetBoundsInScreen().Contains(location_in_screen_coordinates)) |
656 return false; | 656 return false; |
657 | 657 |
658 gfx::Point pt = location_in_screen_coordinates; | 658 gfx::Point pt = location_in_screen_coordinates; |
659 views::View* drag_and_drop_view = view_model_->view_at( | 659 views::View* drag_and_drop_view = view_model_->view_at( |
660 model_->ItemIndexByID(drag_and_drop_launcher_id_)); | 660 model_->ItemIndexByID(drag_and_drop_shelf_id_)); |
661 ConvertPointFromScreen(drag_and_drop_view, &pt); | 661 ConvertPointFromScreen(drag_and_drop_view, &pt); |
662 gfx::Point point_in_root = location_in_screen_coordinates; | 662 gfx::Point point_in_root = location_in_screen_coordinates; |
663 ash::wm::ConvertPointFromScreen( | 663 ash::wm::ConvertPointFromScreen( |
664 ash::wm::GetRootWindowAt(location_in_screen_coordinates), | 664 ash::wm::GetRootWindowAt(location_in_screen_coordinates), |
665 &point_in_root); | 665 &point_in_root); |
666 ui::MouseEvent event(ui::ET_MOUSE_DRAGGED, pt, point_in_root, 0, 0); | 666 ui::MouseEvent event(ui::ET_MOUSE_DRAGGED, pt, point_in_root, 0, 0); |
667 PointerDraggedOnButton(drag_and_drop_view, | 667 PointerDraggedOnButton(drag_and_drop_view, |
668 ShelfButtonHost::DRAG_AND_DROP, | 668 ShelfButtonHost::DRAG_AND_DROP, |
669 event); | 669 event); |
670 return true; | 670 return true; |
671 } | 671 } |
672 | 672 |
673 void ShelfView::EndDrag(bool cancel) { | 673 void ShelfView::EndDrag(bool cancel) { |
674 if (!drag_and_drop_launcher_id_) | 674 if (!drag_and_drop_shelf_id_) |
675 return; | 675 return; |
676 | 676 |
677 views::View* drag_and_drop_view = view_model_->view_at( | 677 views::View* drag_and_drop_view = view_model_->view_at( |
678 model_->ItemIndexByID(drag_and_drop_launcher_id_)); | 678 model_->ItemIndexByID(drag_and_drop_shelf_id_)); |
679 PointerReleasedOnButton( | 679 PointerReleasedOnButton( |
680 drag_and_drop_view, ShelfButtonHost::DRAG_AND_DROP, cancel); | 680 drag_and_drop_view, ShelfButtonHost::DRAG_AND_DROP, cancel); |
681 | 681 |
682 // Either destroy the temporarily created item - or - make the item visible. | 682 // Either destroy the temporarily created item - or - make the item visible. |
683 if (drag_and_drop_item_pinned_ && cancel) | 683 if (drag_and_drop_item_pinned_ && cancel) |
684 delegate_->UnpinAppWithID(drag_and_drop_app_id_); | 684 delegate_->UnpinAppWithID(drag_and_drop_app_id_); |
685 else if (drag_and_drop_view) { | 685 else if (drag_and_drop_view) { |
686 if (cancel) { | 686 if (cancel) { |
687 // When a hosted drag gets canceled, the item can remain in the same slot | 687 // When a hosted drag gets canceled, the item can remain in the same slot |
688 // and it might have moved within the bounds. In that case the item need | 688 // and it might have moved within the bounds. In that case the item need |
689 // to animate back to its correct location. | 689 // to animate back to its correct location. |
690 AnimateToIdealBounds(); | 690 AnimateToIdealBounds(); |
691 } else { | 691 } else { |
692 drag_and_drop_view->SetSize(pre_drag_and_drop_size_); | 692 drag_and_drop_view->SetSize(pre_drag_and_drop_size_); |
693 } | 693 } |
694 } | 694 } |
695 | 695 |
696 drag_and_drop_launcher_id_ = 0; | 696 drag_and_drop_shelf_id_ = 0; |
697 } | 697 } |
698 | 698 |
699 void ShelfView::LayoutToIdealBounds() { | 699 void ShelfView::LayoutToIdealBounds() { |
700 if (bounds_animator_->IsAnimating()) { | 700 if (bounds_animator_->IsAnimating()) { |
701 AnimateToIdealBounds(); | 701 AnimateToIdealBounds(); |
702 return; | 702 return; |
703 } | 703 } |
704 | 704 |
705 IdealBounds ideal_bounds; | 705 IdealBounds ideal_bounds; |
706 CalculateIdealBounds(&ideal_bounds); | 706 CalculateIdealBounds(&ideal_bounds); |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 // Now that the item animation starts, we have to make sure that the | 927 // Now that the item animation starts, we have to make sure that the |
928 // padding of the first gets properly transferred to the new first item. | 928 // padding of the first gets properly transferred to the new first item. |
929 if (i && view->border()) | 929 if (i && view->border()) |
930 view->SetBorder(views::Border::NullBorder()); | 930 view->SetBorder(views::Border::NullBorder()); |
931 else if (!i && !view->border()) | 931 else if (!i && !view->border()) |
932 UpdateFirstButtonPadding(); | 932 UpdateFirstButtonPadding(); |
933 } | 933 } |
934 overflow_button_->SetBoundsRect(ideal_bounds.overflow_bounds); | 934 overflow_button_->SetBoundsRect(ideal_bounds.overflow_bounds); |
935 } | 935 } |
936 | 936 |
937 views::View* ShelfView::CreateViewForItem(const LauncherItem& item) { | 937 views::View* ShelfView::CreateViewForItem(const ShelfItem& item) { |
938 views::View* view = NULL; | 938 views::View* view = NULL; |
939 switch (item.type) { | 939 switch (item.type) { |
940 case TYPE_BROWSER_SHORTCUT: | 940 case TYPE_BROWSER_SHORTCUT: |
941 case TYPE_APP_SHORTCUT: | 941 case TYPE_APP_SHORTCUT: |
942 case TYPE_WINDOWED_APP: | 942 case TYPE_WINDOWED_APP: |
943 case TYPE_PLATFORM_APP: | 943 case TYPE_PLATFORM_APP: |
944 case TYPE_DIALOG: | 944 case TYPE_DIALOG: |
945 case TYPE_APP_PANEL: { | 945 case TYPE_APP_PANEL: { |
946 ShelfButton* button = ShelfButton::Create(this, this, layout_manager_); | 946 ShelfButton* button = ShelfButton::Create(this, this, layout_manager_); |
947 button->SetImage(item.image); | 947 button->SetImage(item.image); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 | 1024 |
1025 ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( | 1025 ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( |
1026 model_->items()[current_index].id); | 1026 model_->items()[current_index].id); |
1027 if (!item_delegate->IsDraggable()) { | 1027 if (!item_delegate->IsDraggable()) { |
1028 CancelDrag(-1); | 1028 CancelDrag(-1); |
1029 return; | 1029 return; |
1030 } | 1030 } |
1031 | 1031 |
1032 // If this is not a drag and drop host operation and not the app list item, | 1032 // If this is not a drag and drop host operation and not the app list item, |
1033 // check if the item got ripped off the shelf - if it did we are done. | 1033 // check if the item got ripped off the shelf - if it did we are done. |
1034 if (!drag_and_drop_launcher_id_ && ash::switches::UseDragOffShelf() && | 1034 if (!drag_and_drop_shelf_id_ && ash::switches::UseDragOffShelf() && |
1035 RemovableByRipOff(current_index) != NOT_REMOVABLE) { | 1035 RemovableByRipOff(current_index) != NOT_REMOVABLE) { |
1036 if (HandleRipOffDrag(event)) | 1036 if (HandleRipOffDrag(event)) |
1037 return; | 1037 return; |
1038 // The rip off handler could have changed the location of the item. | 1038 // The rip off handler could have changed the location of the item. |
1039 current_index = view_model_->GetIndexOfView(drag_view_); | 1039 current_index = view_model_->GetIndexOfView(drag_view_); |
1040 } | 1040 } |
1041 | 1041 |
1042 // TODO: I don't think this works correctly with RTL. | 1042 // TODO: I don't think this works correctly with RTL. |
1043 gfx::Point drag_point(event.location()); | 1043 gfx::Point drag_point(event.location()); |
1044 ConvertPointToTarget(drag_view_, this, &drag_point); | 1044 ConvertPointToTarget(drag_view_, this, &drag_point); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1088 // Change the model, the ShelfItemMoved() callback will handle the | 1088 // Change the model, the ShelfItemMoved() callback will handle the |
1089 // |view_model_| update. | 1089 // |view_model_| update. |
1090 model_->Move(current_index, target_index); | 1090 model_->Move(current_index, target_index); |
1091 bounds_animator_->StopAnimatingView(drag_view_); | 1091 bounds_animator_->StopAnimatingView(drag_view_); |
1092 } | 1092 } |
1093 | 1093 |
1094 bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) { | 1094 bool ShelfView::HandleRipOffDrag(const ui::LocatedEvent& event) { |
1095 int current_index = view_model_->GetIndexOfView(drag_view_); | 1095 int current_index = view_model_->GetIndexOfView(drag_view_); |
1096 DCHECK_NE(-1, current_index); | 1096 DCHECK_NE(-1, current_index); |
1097 std::string dragged_app_id = | 1097 std::string dragged_app_id = |
1098 delegate_->GetAppIDForLauncherID(model_->items()[current_index].id); | 1098 delegate_->GetAppIDForShelfID(model_->items()[current_index].id); |
1099 | 1099 |
1100 gfx::Point screen_location = event.root_location(); | 1100 gfx::Point screen_location = event.root_location(); |
1101 ash::wm::ConvertPointToScreen(GetWidget()->GetNativeWindow()->GetRootWindow(), | 1101 ash::wm::ConvertPointToScreen(GetWidget()->GetNativeWindow()->GetRootWindow(), |
1102 &screen_location); | 1102 &screen_location); |
1103 | 1103 |
1104 // To avoid ugly forwards and backwards flipping we use different constants | 1104 // To avoid ugly forwards and backwards flipping we use different constants |
1105 // for ripping off / re-inserting the items. | 1105 // for ripping off / re-inserting the items. |
1106 if (dragged_off_shelf_) { | 1106 if (dragged_off_shelf_) { |
1107 // If the shelf/overflow bubble bounds contains |screen_location| we insert | 1107 // If the shelf/overflow bubble bounds contains |screen_location| we insert |
1108 // the item back into the shelf. | 1108 // the item back into the shelf. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1213 drag_view_->layer()->SetOpacity(1.0f); | 1213 drag_view_->layer()->SetOpacity(1.0f); |
1214 } else if (RemovableByRipOff(current_index) != REMOVABLE) { | 1214 } else if (RemovableByRipOff(current_index) != REMOVABLE) { |
1215 // Make sure we do not try to remove un-removable items like items which | 1215 // Make sure we do not try to remove un-removable items like items which |
1216 // were not pinned or have to be always there. | 1216 // were not pinned or have to be always there. |
1217 cancel = true; | 1217 cancel = true; |
1218 snap_back = true; | 1218 snap_back = true; |
1219 } else { | 1219 } else { |
1220 // Make sure the item stays invisible upon removal. | 1220 // Make sure the item stays invisible upon removal. |
1221 drag_view_->SetVisible(false); | 1221 drag_view_->SetVisible(false); |
1222 std::string app_id = | 1222 std::string app_id = |
1223 delegate_->GetAppIDForLauncherID(model_->items()[current_index].id); | 1223 delegate_->GetAppIDForShelfID(model_->items()[current_index].id); |
1224 delegate_->UnpinAppWithID(app_id); | 1224 delegate_->UnpinAppWithID(app_id); |
1225 } | 1225 } |
1226 } | 1226 } |
1227 if (cancel || snap_back) { | 1227 if (cancel || snap_back) { |
1228 if (dragged_off_from_overflow_to_shelf_) { | 1228 if (dragged_off_from_overflow_to_shelf_) { |
1229 dragged_off_from_overflow_to_shelf_ = false; | 1229 dragged_off_from_overflow_to_shelf_ = false; |
1230 // Main shelf handles revert of dragged item. | 1230 // Main shelf handles revert of dragged item. |
1231 main_shelf_->EndDrag(true); | 1231 main_shelf_->EndDrag(true); |
1232 drag_view_->layer()->SetOpacity(1.0f); | 1232 drag_view_->layer()->SetOpacity(1.0f); |
1233 } else if (!cancelling_drag_model_changed_) { | 1233 } else if (!cancelling_drag_model_changed_) { |
(...skipping 19 matching lines...) Expand all Loading... |
1253 } | 1253 } |
1254 DestroyDragIconProxy(); | 1254 DestroyDragIconProxy(); |
1255 } | 1255 } |
1256 | 1256 |
1257 ShelfView::RemovableState ShelfView::RemovableByRipOff(int index) { | 1257 ShelfView::RemovableState ShelfView::RemovableByRipOff(int index) { |
1258 DCHECK(index >= 0 && index < model_->item_count()); | 1258 DCHECK(index >= 0 && index < model_->item_count()); |
1259 ShelfItemType type = model_->items()[index].type; | 1259 ShelfItemType type = model_->items()[index].type; |
1260 if (type == TYPE_APP_LIST || type == TYPE_DIALOG || !delegate_->CanPin()) | 1260 if (type == TYPE_APP_LIST || type == TYPE_DIALOG || !delegate_->CanPin()) |
1261 return NOT_REMOVABLE; | 1261 return NOT_REMOVABLE; |
1262 | 1262 |
1263 std::string app_id = | 1263 std::string app_id = delegate_->GetAppIDForShelfID(model_->items()[index].id); |
1264 delegate_->GetAppIDForLauncherID(model_->items()[index].id); | |
1265 // Note: Only pinned app shortcuts can be removed! | 1264 // Note: Only pinned app shortcuts can be removed! |
1266 return (type == TYPE_APP_SHORTCUT && delegate_->IsAppPinned(app_id)) ? | 1265 return (type == TYPE_APP_SHORTCUT && delegate_->IsAppPinned(app_id)) ? |
1267 REMOVABLE : DRAGGABLE; | 1266 REMOVABLE : DRAGGABLE; |
1268 } | 1267 } |
1269 | 1268 |
1270 bool ShelfView::SameDragType(ShelfItemType typea, ShelfItemType typeb) const { | 1269 bool ShelfView::SameDragType(ShelfItemType typea, ShelfItemType typeb) const { |
1271 switch (typea) { | 1270 switch (typea) { |
1272 case TYPE_APP_SHORTCUT: | 1271 case TYPE_APP_SHORTCUT: |
1273 case TYPE_BROWSER_SHORTCUT: | 1272 case TYPE_BROWSER_SHORTCUT: |
1274 return (typeb == TYPE_APP_SHORTCUT || typeb == TYPE_BROWSER_SHORTCUT); | 1273 return (typeb == TYPE_APP_SHORTCUT || typeb == TYPE_BROWSER_SHORTCUT); |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1569 if (model_index <= last_visible_index_ || | 1568 if (model_index <= last_visible_index_ || |
1570 model_index >= model_->FirstPanelIndex()) { | 1569 model_index >= model_->FirstPanelIndex()) { |
1571 bounds_animator_->SetAnimationDelegate( | 1570 bounds_animator_->SetAnimationDelegate( |
1572 view, new StartFadeAnimationDelegate(this, view), true); | 1571 view, new StartFadeAnimationDelegate(this, view), true); |
1573 } else { | 1572 } else { |
1574 // Undo the hiding if animation does not run. | 1573 // Undo the hiding if animation does not run. |
1575 view->layer()->SetOpacity(1.0f); | 1574 view->layer()->SetOpacity(1.0f); |
1576 } | 1575 } |
1577 } | 1576 } |
1578 | 1577 |
1579 void ShelfView::ShelfItemRemoved(int model_index, LauncherID id) { | 1578 void ShelfView::ShelfItemRemoved(int model_index, ShelfID id) { |
1580 if (id == context_menu_id_) | 1579 if (id == context_menu_id_) |
1581 launcher_menu_runner_.reset(); | 1580 launcher_menu_runner_.reset(); |
1582 { | 1581 { |
1583 base::AutoReset<bool> cancelling_drag( | 1582 base::AutoReset<bool> cancelling_drag( |
1584 &cancelling_drag_model_changed_, true); | 1583 &cancelling_drag_model_changed_, true); |
1585 model_index = CancelDrag(model_index); | 1584 model_index = CancelDrag(model_index); |
1586 } | 1585 } |
1587 views::View* view = view_model_->view_at(model_index); | 1586 views::View* view = view_model_->view_at(model_index); |
1588 view_model_->Remove(model_index); | 1587 view_model_->Remove(model_index); |
1589 | 1588 |
(...skipping 19 matching lines...) Expand all Loading... |
1609 // item is ripped out from the shelf, its |view| is already invisible. | 1608 // item is ripped out from the shelf, its |view| is already invisible. |
1610 AnimateToIdealBounds(); | 1609 AnimateToIdealBounds(); |
1611 } | 1610 } |
1612 | 1611 |
1613 // Close the tooltip because it isn't needed any longer and its anchor view | 1612 // Close the tooltip because it isn't needed any longer and its anchor view |
1614 // will be deleted soon. | 1613 // will be deleted soon. |
1615 if (tooltip_->GetCurrentAnchorView() == view) | 1614 if (tooltip_->GetCurrentAnchorView() == view) |
1616 tooltip_->Close(); | 1615 tooltip_->Close(); |
1617 } | 1616 } |
1618 | 1617 |
1619 void ShelfView::ShelfItemChanged(int model_index, | 1618 void ShelfView::ShelfItemChanged(int model_index, const ShelfItem& old_item) { |
1620 const LauncherItem& old_item) { | 1619 const ShelfItem& item(model_->items()[model_index]); |
1621 const LauncherItem& item(model_->items()[model_index]); | |
1622 if (old_item.type != item.type) { | 1620 if (old_item.type != item.type) { |
1623 // Type changed, swap the views. | 1621 // Type changed, swap the views. |
1624 model_index = CancelDrag(model_index); | 1622 model_index = CancelDrag(model_index); |
1625 scoped_ptr<views::View> old_view(view_model_->view_at(model_index)); | 1623 scoped_ptr<views::View> old_view(view_model_->view_at(model_index)); |
1626 bounds_animator_->StopAnimatingView(old_view.get()); | 1624 bounds_animator_->StopAnimatingView(old_view.get()); |
1627 // Removing and re-inserting a view in our view model will strip the ideal | 1625 // Removing and re-inserting a view in our view model will strip the ideal |
1628 // bounds from the item. To avoid recalculation of everything the bounds | 1626 // bounds from the item. To avoid recalculation of everything the bounds |
1629 // get remembered and restored after the insertion to the previous value. | 1627 // get remembered and restored after the insertion to the previous value. |
1630 gfx::Rect old_ideal_bounds = view_model_->ideal_bounds(model_index); | 1628 gfx::Rect old_ideal_bounds = view_model_->ideal_bounds(model_index); |
1631 view_model_->Remove(model_index); | 1629 view_model_->Remove(model_index); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 break; | 1826 break; |
1829 } | 1827 } |
1830 | 1828 |
1831 ShelfItemDelegate* item_delegate = | 1829 ShelfItemDelegate* item_delegate = |
1832 item_manager_->GetShelfItemDelegate(model_->items()[view_index].id); | 1830 item_manager_->GetShelfItemDelegate(model_->items()[view_index].id); |
1833 if (!item_delegate->ItemSelected(event)) | 1831 if (!item_delegate->ItemSelected(event)) |
1834 ShowListMenuForView(model_->items()[view_index], sender, event); | 1832 ShowListMenuForView(model_->items()[view_index], sender, event); |
1835 } | 1833 } |
1836 } | 1834 } |
1837 | 1835 |
1838 bool ShelfView::ShowListMenuForView(const LauncherItem& item, | 1836 bool ShelfView::ShowListMenuForView(const ShelfItem& item, |
1839 views::View* source, | 1837 views::View* source, |
1840 const ui::Event& event) { | 1838 const ui::Event& event) { |
1841 scoped_ptr<ShelfMenuModel> menu_model; | 1839 scoped_ptr<ShelfMenuModel> menu_model; |
1842 ShelfItemDelegate* item_delegate = | 1840 ShelfItemDelegate* item_delegate = |
1843 item_manager_->GetShelfItemDelegate(item.id); | 1841 item_manager_->GetShelfItemDelegate(item.id); |
1844 menu_model.reset(item_delegate->CreateApplicationMenu(event.flags())); | 1842 menu_model.reset(item_delegate->CreateApplicationMenu(event.flags())); |
1845 | 1843 |
1846 // Make sure we have a menu and it has at least two items in addition to the | 1844 // Make sure we have a menu and it has at least two items in addition to the |
1847 // application title and the 3 spacing separators. | 1845 // application title and the 3 spacing separators. |
1848 if (!menu_model.get() || menu_model->GetItemCount() <= 5) | 1846 if (!menu_model.get() || menu_model->GetItemCount() <= 5) |
(...skipping 18 matching lines...) Expand all Loading... |
1867 } | 1865 } |
1868 | 1866 |
1869 scoped_ptr<ui::MenuModel> menu_model; | 1867 scoped_ptr<ui::MenuModel> menu_model; |
1870 ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( | 1868 ShelfItemDelegate* item_delegate = item_manager_->GetShelfItemDelegate( |
1871 model_->items()[view_index].id); | 1869 model_->items()[view_index].id); |
1872 menu_model.reset(item_delegate->CreateContextMenu( | 1870 menu_model.reset(item_delegate->CreateContextMenu( |
1873 source->GetWidget()->GetNativeView()->GetRootWindow())); | 1871 source->GetWidget()->GetNativeView()->GetRootWindow())); |
1874 if (!menu_model) | 1872 if (!menu_model) |
1875 return; | 1873 return; |
1876 | 1874 |
1877 base::AutoReset<LauncherID> reseter( | 1875 base::AutoReset<ShelfID> reseter( |
1878 &context_menu_id_, | 1876 &context_menu_id_, |
1879 view_index == -1 ? 0 : model_->items()[view_index].id); | 1877 view_index == -1 ? 0 : model_->items()[view_index].id); |
1880 | 1878 |
1881 ShowMenu(scoped_ptr<views::MenuModelAdapter>( | 1879 ShowMenu(scoped_ptr<views::MenuModelAdapter>( |
1882 new views::MenuModelAdapter(menu_model.get())), | 1880 new views::MenuModelAdapter(menu_model.get())), |
1883 source, | 1881 source, |
1884 point, | 1882 point, |
1885 true, | 1883 true, |
1886 source_type); | 1884 source_type); |
1887 } | 1885 } |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2006 return true; | 2004 return true; |
2007 | 2005 |
2008 base::TimeDelta delta = | 2006 base::TimeDelta delta = |
2009 base::TimeDelta(event.time_stamp() - closing_event_time_); | 2007 base::TimeDelta(event.time_stamp() - closing_event_time_); |
2010 closing_event_time_ = base::TimeDelta(); | 2008 closing_event_time_ = base::TimeDelta(); |
2011 // TODO(skuhne): This time seems excessive, but it appears that the reposting | 2009 // TODO(skuhne): This time seems excessive, but it appears that the reposting |
2012 // takes that long. Need to come up with a better way of doing this. | 2010 // takes that long. Need to come up with a better way of doing this. |
2013 return (delta.InMilliseconds() < 0 || delta.InMilliseconds() > 130); | 2011 return (delta.InMilliseconds() < 0 || delta.InMilliseconds() > 130); |
2014 } | 2012 } |
2015 | 2013 |
2016 const LauncherItem* ShelfView::LauncherItemForView( | 2014 const ShelfItem* ShelfView::ShelfItemForView(const views::View* view) const { |
2017 const views::View* view) const { | |
2018 int view_index = view_model_->GetIndexOfView(view); | 2015 int view_index = view_model_->GetIndexOfView(view); |
2019 if (view_index == -1) | 2016 if (view_index == -1) |
2020 return NULL; | 2017 return NULL; |
2021 return &(model_->items()[view_index]); | 2018 return &(model_->items()[view_index]); |
2022 } | 2019 } |
2023 | 2020 |
2024 bool ShelfView::ShouldShowTooltipForView(const views::View* view) const { | 2021 bool ShelfView::ShouldShowTooltipForView(const views::View* view) const { |
2025 if (view == GetAppListButtonView() && | 2022 if (view == GetAppListButtonView() && |
2026 Shell::GetInstance()->GetAppListWindow()) | 2023 Shell::GetInstance()->GetAppListWindow()) |
2027 return false; | 2024 return false; |
2028 const LauncherItem* item = LauncherItemForView(view); | 2025 const ShelfItem* item = ShelfItemForView(view); |
2029 if (!item) | 2026 if (!item) |
2030 return true; | 2027 return true; |
2031 ShelfItemDelegate* item_delegate = | 2028 ShelfItemDelegate* item_delegate = |
2032 item_manager_->GetShelfItemDelegate(item->id); | 2029 item_manager_->GetShelfItemDelegate(item->id); |
2033 return item_delegate->ShouldShowTooltip(); | 2030 return item_delegate->ShouldShowTooltip(); |
2034 } | 2031 } |
2035 | 2032 |
2036 int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const { | 2033 int ShelfView::CalculateShelfDistance(const gfx::Point& coordinate) const { |
2037 ShelfWidget* shelf = RootWindowController::ForShelf( | 2034 ShelfWidget* shelf = RootWindowController::ForShelf( |
2038 GetWidget()->GetNativeView())->shelf(); | 2035 GetWidget()->GetNativeView())->shelf(); |
(...skipping 12 matching lines...) Expand all Loading... |
2051 break; | 2048 break; |
2052 case SHELF_ALIGNMENT_TOP: | 2049 case SHELF_ALIGNMENT_TOP: |
2053 distance = coordinate.y() - bounds.bottom(); | 2050 distance = coordinate.y() - bounds.bottom(); |
2054 break; | 2051 break; |
2055 } | 2052 } |
2056 return distance > 0 ? distance : 0; | 2053 return distance > 0 ? distance : 0; |
2057 } | 2054 } |
2058 | 2055 |
2059 } // namespace internal | 2056 } // namespace internal |
2060 } // namespace ash | 2057 } // namespace ash |
OLD | NEW |