Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1079)

Side by Side Diff: ash/launcher/launcher_view.cc

Issue 25823002: Refactor LauncherItemController and LauncherItemDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ash/launcher/launcher_unittest.cc ('k') | ash/launcher/launcher_view_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 last_visible_index_ > 0 && last_visible_index_ < last_button_index) 815 last_visible_index_ > 0 && last_visible_index_ < last_button_index)
816 --last_visible_index_; 816 --last_visible_index_;
817 for (int i = 0; i < view_model_->view_size(); ++i) { 817 for (int i = 0; i < view_model_->view_size(); ++i) {
818 bool visible = i <= last_visible_index_ || i > last_hidden_index_; 818 bool visible = i <= last_visible_index_ || i > last_hidden_index_;
819 // Always show the app list. 819 // Always show the app list.
820 if (!ash::switches::UseAlternateShelfLayout()) 820 if (!ash::switches::UseAlternateShelfLayout())
821 visible |= (i == last_button_index); 821 visible |= (i == last_button_index);
822 // To receive drag event continously from |drag_view_| during the dragging 822 // To receive drag event continously from |drag_view_| during the dragging
823 // off from the shelf, don't make |drag_view_| invisible. It will be 823 // off from the shelf, don't make |drag_view_| invisible. It will be
824 // eventually invisible and removed from the |view_model_| by 824 // eventually invisible and removed from the |view_model_| by
825 // FinalizeRipOffDrag(). 825 // FinalizeRipOffDrag().
Mr4D (OOO till 08-26) 2013/10/09 00:38:22 Actually that is a problem: There are two views a.
826 if (dragged_off_shelf_ && view_model_->view_at(i) == drag_view_) 826 if (dragged_off_shelf_ && view_model_->view_at(i) == drag_view_)
827 continue; 827 continue;
828 view_model_->view_at(i)->SetVisible(visible); 828 view_model_->view_at(i)->SetVisible(visible);
829 } 829 }
830 830
831 overflow_button_->SetVisible(show_overflow); 831 overflow_button_->SetVisible(show_overflow);
832 if (show_overflow) { 832 if (show_overflow) {
833 DCHECK_NE(0, view_model_->view_size()); 833 DCHECK_NE(0, view_model_->view_size());
834 if (last_visible_index_ == -1) { 834 if (last_visible_index_ == -1) {
835 x = shelf->SelectValueForShelfAlignment(inset, 0, 0, inset); 835 x = shelf->SelectValueForShelfAlignment(inset, 0, 0, inset);
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 drag_pointer_ = pointer; 986 drag_pointer_ = pointer;
987 start_drag_index_ = view_model_->GetIndexOfView(drag_view_); 987 start_drag_index_ = view_model_->GetIndexOfView(drag_view_);
988 988
989 if (start_drag_index_== -1) { 989 if (start_drag_index_== -1) {
990 CancelDrag(-1); 990 CancelDrag(-1);
991 return; 991 return;
992 } 992 }
993 993
994 // If the item is no longer draggable, bail out. 994 // If the item is no longer draggable, bail out.
995 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate( 995 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate(
996 model_->items()[start_drag_index_].type); 996 model_->items()[start_drag_index_].id);
997 if (!item_delegate->IsDraggable(model_->items()[start_drag_index_])) { 997 if (item_delegate && !item_delegate->IsDraggable()) {
998 CancelDrag(-1); 998 CancelDrag(-1);
999 return; 999 return;
1000 } 1000 }
1001 1001
1002 // Move the view to the front so that it appears on top of other views. 1002 // Move the view to the front so that it appears on top of other views.
1003 ReorderChildView(drag_view_, -1); 1003 ReorderChildView(drag_view_, -1);
1004 bounds_animator_->StopAnimatingView(drag_view_); 1004 bounds_animator_->StopAnimatingView(drag_view_);
1005 } 1005 }
1006 1006
1007 void LauncherView::ContinueDrag(const ui::LocatedEvent& event) { 1007 void LauncherView::ContinueDrag(const ui::LocatedEvent& event) {
1008 // Due to a syncing operation the application might have been removed. 1008 // Due to a syncing operation the application might have been removed.
1009 // Bail if it is gone. 1009 // Bail if it is gone.
1010 int current_index = view_model_->GetIndexOfView(drag_view_); 1010 int current_index = view_model_->GetIndexOfView(drag_view_);
1011 DCHECK_NE(-1, current_index); 1011 DCHECK_NE(-1, current_index);
1012 1012
1013 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate( 1013 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate(
1014 model_->items()[current_index].type); 1014 model_->items()[current_index].id);
1015 if (!item_delegate->IsDraggable(model_->items()[current_index])) { 1015 if (item_delegate && !item_delegate->IsDraggable()) {
1016 CancelDrag(-1); 1016 CancelDrag(-1);
1017 return; 1017 return;
1018 } 1018 }
1019 1019
1020 // If this is not a drag and drop host operation and not the app list item, 1020 // If this is not a drag and drop host operation and not the app list item,
1021 // check if the item got ripped off the shelf - if it did we are done. 1021 // check if the item got ripped off the shelf - if it did we are done.
1022 if (!drag_and_drop_launcher_id_ && ash::switches::UseDragOffShelf() && 1022 if (!drag_and_drop_launcher_id_ && ash::switches::UseDragOffShelf() &&
1023 RemovableByRipOff(current_index) != NOT_REMOVABLE) { 1023 RemovableByRipOff(current_index) != NOT_REMOVABLE) {
1024 if (HandleRipOffDrag(event)) 1024 if (HandleRipOffDrag(event))
1025 return; 1025 return;
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 Pointer pointer, 1539 Pointer pointer,
1540 const ui::LocatedEvent& event) { 1540 const ui::LocatedEvent& event) {
1541 if (drag_view_) 1541 if (drag_view_)
1542 return; 1542 return;
1543 1543
1544 int index = view_model_->GetIndexOfView(view); 1544 int index = view_model_->GetIndexOfView(view);
1545 if (index == -1) 1545 if (index == -1)
1546 return; 1546 return;
1547 1547
1548 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate( 1548 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate(
1549 model_->items()[index].type); 1549 model_->items()[index].id);
1550 if (view_model_->view_size() <= 1 || 1550 if (view_model_->view_size() <= 1 ||
1551 !item_delegate->IsDraggable(model_->items()[index])) 1551 (item_delegate && !item_delegate->IsDraggable()))
1552 return; // View is being deleted or not draggable, ignore request. 1552 return; // View is being deleted or not draggable, ignore request.
1553 1553
1554 ShelfLayoutManager* shelf = tooltip_->shelf_layout_manager(); 1554 ShelfLayoutManager* shelf = tooltip_->shelf_layout_manager();
1555 1555
1556 drag_view_ = view; 1556 drag_view_ = view;
1557 drag_offset_ = shelf->PrimaryAxisValue(event.x(), event.y()); 1557 drag_offset_ = shelf->PrimaryAxisValue(event.x(), event.y());
1558 } 1558 }
1559 1559
1560 void LauncherView::PointerDraggedOnButton(views::View* view, 1560 void LauncherView::PointerDraggedOnButton(views::View* view,
1561 Pointer pointer, 1561 Pointer pointer,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 tooltip_->StopTimer(); 1611 tooltip_->StopTimer();
1612 } 1612 }
1613 1613
1614 base::string16 LauncherView::GetAccessibleName(const views::View* view) { 1614 base::string16 LauncherView::GetAccessibleName(const views::View* view) {
1615 int view_index = view_model_->GetIndexOfView(view); 1615 int view_index = view_model_->GetIndexOfView(view);
1616 // May be -1 while in the process of animating closed. 1616 // May be -1 while in the process of animating closed.
1617 if (view_index == -1) 1617 if (view_index == -1)
1618 return base::string16(); 1618 return base::string16();
1619 1619
1620 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate( 1620 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate(
1621 model_->items()[view_index].type); 1621 model_->items()[view_index].id);
1622 return item_delegate->GetTitle(model_->items()[view_index]); 1622 return item_delegate ? item_delegate->GetTitle() : base::string16();
1623 } 1623 }
1624 1624
1625 void LauncherView::ButtonPressed(views::Button* sender, 1625 void LauncherView::ButtonPressed(views::Button* sender,
1626 const ui::Event& event) { 1626 const ui::Event& event) {
1627 // Do not handle mouse release during drag. 1627 // Do not handle mouse release during drag.
1628 if (dragging()) 1628 if (dragging())
1629 return; 1629 return;
1630 1630
1631 if (sender == overflow_button_) { 1631 if (sender == overflow_button_) {
1632 ToggleOverflowBubble(); 1632 ToggleOverflowBubble();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1671 case TYPE_APP_PANEL: 1671 case TYPE_APP_PANEL:
1672 break; 1672 break;
1673 1673
1674 case TYPE_UNDEFINED: 1674 case TYPE_UNDEFINED:
1675 NOTREACHED() << "LauncherItemType must be set."; 1675 NOTREACHED() << "LauncherItemType must be set.";
1676 break; 1676 break;
1677 } 1677 }
1678 1678
1679 LauncherItemDelegate* item_delegate = 1679 LauncherItemDelegate* item_delegate =
1680 item_manager_->GetLauncherItemDelegate( 1680 item_manager_->GetLauncherItemDelegate(
1681 model_->items()[view_index].type); 1681 model_->items()[view_index].id);
1682 item_delegate->ItemSelected(model_->items()[view_index], event); 1682 if (item_delegate)
1683 item_delegate->ItemSelected(event);
1683 1684
1684 ShowListMenuForView(model_->items()[view_index], sender, event); 1685 ShowListMenuForView(model_->items()[view_index], sender, event);
1685 } 1686 }
1686 } 1687 }
1687 1688
1688 bool LauncherView::ShowListMenuForView(const LauncherItem& item, 1689 bool LauncherView::ShowListMenuForView(const LauncherItem& item,
1689 views::View* source, 1690 views::View* source,
1690 const ui::Event& event) { 1691 const ui::Event& event) {
1691 scoped_ptr<ash::LauncherMenuModel> menu_model; 1692 scoped_ptr<ash::LauncherMenuModel> menu_model;
1692 LauncherItemDelegate* item_delegate = 1693 LauncherItemDelegate* item_delegate =
1693 item_manager_->GetLauncherItemDelegate(item.type); 1694 item_manager_->GetLauncherItemDelegate(item.id);
1694 menu_model.reset(item_delegate->CreateApplicationMenu(item, event.flags())); 1695 if (item_delegate)
1696 menu_model.reset(item_delegate->CreateApplicationMenu(event.flags()));
1695 1697
1696 // Make sure we have a menu and it has at least two items in addition to the 1698 // Make sure we have a menu and it has at least two items in addition to the
1697 // application title and the 3 spacing separators. 1699 // application title and the 3 spacing separators.
1698 if (!menu_model.get() || menu_model->GetItemCount() <= 5) 1700 if (!menu_model.get() || menu_model->GetItemCount() <= 5)
1699 return false; 1701 return false;
1700 1702
1701 ShowMenu(scoped_ptr<views::MenuModelAdapter>( 1703 ShowMenu(scoped_ptr<views::MenuModelAdapter>(
1702 new LauncherMenuModelAdapter(menu_model.get())), 1704 new LauncherMenuModelAdapter(menu_model.get())),
1703 source, 1705 source,
1704 gfx::Point(), 1706 gfx::Point(),
(...skipping 12 matching lines...) Expand all
1717 model_->items()[view_index].type == TYPE_APP_LIST) { 1719 model_->items()[view_index].type == TYPE_APP_LIST) {
1718 view_index = -1; 1720 view_index = -1;
1719 } 1721 }
1720 1722
1721 if (view_index == -1) { 1723 if (view_index == -1) {
1722 Shell::GetInstance()->ShowContextMenu(point, source_type); 1724 Shell::GetInstance()->ShowContextMenu(point, source_type);
1723 return; 1725 return;
1724 } 1726 }
1725 scoped_ptr<ui::MenuModel> menu_model; 1727 scoped_ptr<ui::MenuModel> menu_model;
1726 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate( 1728 LauncherItemDelegate* item_delegate = item_manager_->GetLauncherItemDelegate(
1727 model_->items()[view_index].type); 1729 model_->items()[view_index].id);
1728 menu_model.reset(item_delegate->CreateContextMenu( 1730 if (item_delegate) {
1729 model_->items()[view_index], 1731 menu_model.reset(item_delegate->CreateContextMenu(
1730 source->GetWidget()->GetNativeView()->GetRootWindow())); 1732 source->GetWidget()->GetNativeView()->GetRootWindow()));
1733 }
1731 if (!menu_model) 1734 if (!menu_model)
1732 return; 1735 return;
1733 1736
1734 base::AutoReset<LauncherID> reseter( 1737 base::AutoReset<LauncherID> reseter(
1735 &context_menu_id_, 1738 &context_menu_id_,
1736 view_index == -1 ? 0 : model_->items()[view_index].id); 1739 view_index == -1 ? 0 : model_->items()[view_index].id);
1737 1740
1738 ShowMenu(scoped_ptr<views::MenuModelAdapter>( 1741 ShowMenu(scoped_ptr<views::MenuModelAdapter>(
1739 new views::MenuModelAdapter(menu_model.get())), 1742 new views::MenuModelAdapter(menu_model.get())),
1740 source, 1743 source,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1809 NULL, 1812 NULL,
1810 anchor_point, 1813 anchor_point,
1811 menu_alignment, 1814 menu_alignment,
1812 source_type, 1815 source_type,
1813 context_menu ? views::MenuRunner::CONTEXT_MENU : 0) == 1816 context_menu ? views::MenuRunner::CONTEXT_MENU : 0) ==
1814 views::MenuRunner::MENU_DELETED) { 1817 views::MenuRunner::MENU_DELETED) {
1815 if (!got_deleted) { 1818 if (!got_deleted) {
1816 got_deleted_ = NULL; 1819 got_deleted_ = NULL;
1817 shelf->ForceUndimming(false); 1820 shelf->ForceUndimming(false);
1818 } 1821 }
1819 LOG(ERROR) << __FUNCTION__; 1822 LOG(ERROR) << __FUNCTION__;
Mr4D (OOO till 08-26) 2013/10/09 00:38:22 I guess this can be removed?
1820 return; 1823 return;
1821 } 1824 }
1822 LOG(ERROR) << __FUNCTION__ << " " << IsShowingMenu(); 1825 LOG(ERROR) << __FUNCTION__ << " " << IsShowingMenu();
Mr4D (OOO till 08-26) 2013/10/09 00:38:22 And this?
1823 got_deleted_ = NULL; 1826 got_deleted_ = NULL;
1824 shelf->ForceUndimming(false); 1827 shelf->ForceUndimming(false);
1825 1828
1826 // If it is a context menu and we are showing overflow bubble 1829 // If it is a context menu and we are showing overflow bubble
1827 // we want to hide overflow bubble. 1830 // we want to hide overflow bubble.
1828 //if (owner_overflow_bubble_) 1831 //if (owner_overflow_bubble_)
1829 // owner_overflow_bubble_->HideBubbleAndRefreshButton(); 1832 // owner_overflow_bubble_->HideBubbleAndRefreshButton();
Mr4D (OOO till 08-26) 2013/10/09 00:38:22 I think this can go?
1830 1833
1831 // Unpinning an item will reset the |launcher_menu_runner_| before coming 1834 // Unpinning an item will reset the |launcher_menu_runner_| before coming
1832 // here. 1835 // here.
1833 if (launcher_menu_runner_) 1836 if (launcher_menu_runner_)
1834 closing_event_time_ = launcher_menu_runner_->closing_event_time(); 1837 closing_event_time_ = launcher_menu_runner_->closing_event_time();
1835 Shell::GetInstance()->UpdateShelfVisibility(); 1838 Shell::GetInstance()->UpdateShelfVisibility();
1836 } 1839 }
1837 1840
1838 void LauncherView::OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) { 1841 void LauncherView::OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) {
1839 FOR_EACH_OBSERVER(LauncherIconObserver, observers_, 1842 FOR_EACH_OBSERVER(LauncherIconObserver, observers_,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1882 } 1885 }
1883 1886
1884 bool LauncherView::ShouldShowTooltipForView(const views::View* view) const { 1887 bool LauncherView::ShouldShowTooltipForView(const views::View* view) const {
1885 if (view == GetAppListButtonView() && 1888 if (view == GetAppListButtonView() &&
1886 Shell::GetInstance()->GetAppListWindow()) 1889 Shell::GetInstance()->GetAppListWindow())
1887 return false; 1890 return false;
1888 const LauncherItem* item = LauncherItemForView(view); 1891 const LauncherItem* item = LauncherItemForView(view);
1889 if (!item) 1892 if (!item)
1890 return true; 1893 return true;
1891 LauncherItemDelegate* item_delegate = 1894 LauncherItemDelegate* item_delegate =
1892 item_manager_->GetLauncherItemDelegate(item->type); 1895 item_manager_->GetLauncherItemDelegate(item->id);
1893 return item_delegate->ShouldShowTooltip(*item); 1896 return item_delegate ? item_delegate->ShouldShowTooltip() : false;
1894 } 1897 }
1895 1898
1896 int LauncherView::CalculateShelfDistance(const gfx::Point& coordinate) const { 1899 int LauncherView::CalculateShelfDistance(const gfx::Point& coordinate) const {
1897 ShelfWidget* shelf = RootWindowController::ForLauncher( 1900 ShelfWidget* shelf = RootWindowController::ForLauncher(
1898 GetWidget()->GetNativeView())->shelf(); 1901 GetWidget()->GetNativeView())->shelf();
1899 ash::ShelfAlignment align = shelf->GetAlignment(); 1902 ash::ShelfAlignment align = shelf->GetAlignment();
1900 const gfx::Rect bounds = GetBoundsInScreen(); 1903 const gfx::Rect bounds = GetBoundsInScreen();
1901 int distance = 0; 1904 int distance = 0;
1902 switch (align) { 1905 switch (align) {
1903 case ash::SHELF_ALIGNMENT_BOTTOM: 1906 case ash::SHELF_ALIGNMENT_BOTTOM:
1904 distance = bounds.y() - coordinate.y(); 1907 distance = bounds.y() - coordinate.y();
1905 break; 1908 break;
1906 case ash::SHELF_ALIGNMENT_LEFT: 1909 case ash::SHELF_ALIGNMENT_LEFT:
1907 distance = coordinate.x() - bounds.right(); 1910 distance = coordinate.x() - bounds.right();
1908 break; 1911 break;
1909 case ash::SHELF_ALIGNMENT_RIGHT: 1912 case ash::SHELF_ALIGNMENT_RIGHT:
1910 distance = bounds.x() - coordinate.x(); 1913 distance = bounds.x() - coordinate.x();
1911 break; 1914 break;
1912 case ash::SHELF_ALIGNMENT_TOP: 1915 case ash::SHELF_ALIGNMENT_TOP:
1913 distance = coordinate.y() - bounds.bottom(); 1916 distance = coordinate.y() - bounds.bottom();
1914 break; 1917 break;
1915 } 1918 }
1916 return distance > 0 ? distance : 0; 1919 return distance > 0 ? distance : 0;
1917 } 1920 }
1918 1921
1919 } // namespace internal 1922 } // namespace internal
1920 } // namespace ash 1923 } // namespace ash
OLDNEW
« no previous file with comments | « ash/launcher/launcher_unittest.cc ('k') | ash/launcher/launcher_view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698