| 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" |
| 11 #include "ash/drag_drop/drag_image_view.h" | 11 #include "ash/drag_drop/drag_image_view.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_item_delegate.h" | 14 #include "ash/launcher/launcher_item_delegate.h" |
| 15 #include "ash/launcher/launcher_item_delegate_manager.h" | 15 #include "ash/launcher/launcher_item_delegate_manager.h" |
| 16 #include "ash/launcher/launcher_model.h" | |
| 17 #include "ash/root_window_controller.h" | 16 #include "ash/root_window_controller.h" |
| 18 #include "ash/scoped_target_root_window.h" | 17 #include "ash/scoped_target_root_window.h" |
| 19 #include "ash/shelf/alternate_app_list_button.h" | 18 #include "ash/shelf/alternate_app_list_button.h" |
| 20 #include "ash/shelf/app_list_button.h" | 19 #include "ash/shelf/app_list_button.h" |
| 21 #include "ash/shelf/overflow_bubble.h" | 20 #include "ash/shelf/overflow_bubble.h" |
| 22 #include "ash/shelf/overflow_button.h" | 21 #include "ash/shelf/overflow_button.h" |
| 23 #include "ash/shelf/shelf_icon_observer.h" | 22 #include "ash/shelf/shelf_icon_observer.h" |
| 24 #include "ash/shelf/shelf_layout_manager.h" | 23 #include "ash/shelf/shelf_layout_manager.h" |
| 24 #include "ash/shelf/shelf_model.h" |
| 25 #include "ash/shelf/shelf_tooltip_manager.h" | 25 #include "ash/shelf/shelf_tooltip_manager.h" |
| 26 #include "ash/shelf/shelf_widget.h" | 26 #include "ash/shelf/shelf_widget.h" |
| 27 #include "ash/shell_delegate.h" | 27 #include "ash/shell_delegate.h" |
| 28 #include "base/auto_reset.h" | 28 #include "base/auto_reset.h" |
| 29 #include "base/memory/scoped_ptr.h" | 29 #include "base/memory/scoped_ptr.h" |
| 30 #include "grit/ash_resources.h" | 30 #include "grit/ash_resources.h" |
| 31 #include "grit/ash_strings.h" | 31 #include "grit/ash_strings.h" |
| 32 #include "ui/aura/client/screen_position_client.h" | 32 #include "ui/aura/client/screen_position_client.h" |
| 33 #include "ui/aura/root_window.h" | 33 #include "ui/aura/root_window.h" |
| 34 #include "ui/aura/window.h" | 34 #include "ui/aura/window.h" |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 view_->layer()->SetOpacity(1.0f); | 368 view_->layer()->SetOpacity(1.0f); |
| 369 } | 369 } |
| 370 | 370 |
| 371 private: | 371 private: |
| 372 ShelfView* shelf_view_; | 372 ShelfView* shelf_view_; |
| 373 views::View* view_; | 373 views::View* view_; |
| 374 | 374 |
| 375 DISALLOW_COPY_AND_ASSIGN(StartFadeAnimationDelegate); | 375 DISALLOW_COPY_AND_ASSIGN(StartFadeAnimationDelegate); |
| 376 }; | 376 }; |
| 377 | 377 |
| 378 ShelfView::ShelfView(LauncherModel* model, | 378 ShelfView::ShelfView(ShelfModel* model, |
| 379 LauncherDelegate* delegate, | 379 LauncherDelegate* delegate, |
| 380 ShelfLayoutManager* shelf_layout_manager) | 380 ShelfLayoutManager* shelf_layout_manager) |
| 381 : model_(model), | 381 : model_(model), |
| 382 delegate_(delegate), | 382 delegate_(delegate), |
| 383 view_model_(new views::ViewModel), | 383 view_model_(new views::ViewModel), |
| 384 first_visible_index_(0), | 384 first_visible_index_(0), |
| 385 last_visible_index_(-1), | 385 last_visible_index_(-1), |
| 386 overflow_button_(NULL), | 386 overflow_button_(NULL), |
| 387 owner_overflow_bubble_(NULL), | 387 owner_overflow_bubble_(NULL), |
| 388 drag_pointer_(NONE), | 388 drag_pointer_(NONE), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 UpdateFirstButtonPadding(); | 437 UpdateFirstButtonPadding(); |
| 438 | 438 |
| 439 // We'll layout when our bounds change. | 439 // We'll layout when our bounds change. |
| 440 } | 440 } |
| 441 | 441 |
| 442 void ShelfView::OnShelfAlignmentChanged() { | 442 void ShelfView::OnShelfAlignmentChanged() { |
| 443 UpdateFirstButtonPadding(); | 443 UpdateFirstButtonPadding(); |
| 444 overflow_button_->OnShelfAlignmentChanged(); | 444 overflow_button_->OnShelfAlignmentChanged(); |
| 445 LayoutToIdealBounds(); | 445 LayoutToIdealBounds(); |
| 446 for (int i=0; i < view_model_->view_size(); ++i) { | 446 for (int i=0; i < view_model_->view_size(); ++i) { |
| 447 // TODO: remove when AppIcon is a Launcher Button. | 447 // TODO: remove when AppIcon is a Shelf Button. |
| 448 if (TYPE_APP_LIST == model_->items()[i].type && | 448 if (TYPE_APP_LIST == model_->items()[i].type && |
| 449 !ash::switches::UseAlternateShelfLayout()) { | 449 !ash::switches::UseAlternateShelfLayout()) { |
| 450 static_cast<AppListButton*>(view_model_->view_at(i))->SetImageAlignment( | 450 static_cast<AppListButton*>(view_model_->view_at(i))->SetImageAlignment( |
| 451 layout_manager_->SelectValueForShelfAlignment( | 451 layout_manager_->SelectValueForShelfAlignment( |
| 452 views::ImageButton::ALIGN_CENTER, | 452 views::ImageButton::ALIGN_CENTER, |
| 453 views::ImageButton::ALIGN_LEFT, | 453 views::ImageButton::ALIGN_LEFT, |
| 454 views::ImageButton::ALIGN_RIGHT, | 454 views::ImageButton::ALIGN_RIGHT, |
| 455 views::ImageButton::ALIGN_CENTER), | 455 views::ImageButton::ALIGN_CENTER), |
| 456 layout_manager_->SelectValueForShelfAlignment( | 456 layout_manager_->SelectValueForShelfAlignment( |
| 457 views::ImageButton::ALIGN_TOP, | 457 views::ImageButton::ALIGN_TOP, |
| (...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1459 base::AutoReset<bool> cancelling_drag( | 1459 base::AutoReset<bool> cancelling_drag( |
| 1460 &cancelling_drag_model_changed_, true); | 1460 &cancelling_drag_model_changed_, true); |
| 1461 model_index = CancelDrag(model_index); | 1461 model_index = CancelDrag(model_index); |
| 1462 } | 1462 } |
| 1463 views::View* view = view_model_->view_at(model_index); | 1463 views::View* view = view_model_->view_at(model_index); |
| 1464 view_model_->Remove(model_index); | 1464 view_model_->Remove(model_index); |
| 1465 | 1465 |
| 1466 // When the overflow bubble is visible, the overflow range needs to be set | 1466 // When the overflow bubble is visible, the overflow range needs to be set |
| 1467 // before CalculateIdealBounds() gets called. Otherwise CalculateIdealBounds() | 1467 // before CalculateIdealBounds() gets called. Otherwise CalculateIdealBounds() |
| 1468 // could trigger a LauncherItemChanged() by hiding the overflow bubble and | 1468 // could trigger a LauncherItemChanged() by hiding the overflow bubble and |
| 1469 // since the overflow bubble is not yet synced with the LauncherModel this | 1469 // since the overflow bubble is not yet synced with the ShelfModel this |
| 1470 // could cause a crash. | 1470 // could cause a crash. |
| 1471 if (overflow_bubble_ && overflow_bubble_->IsShowing()) { | 1471 if (overflow_bubble_ && overflow_bubble_->IsShowing()) { |
| 1472 last_hidden_index_ = std::min(last_hidden_index_, | 1472 last_hidden_index_ = std::min(last_hidden_index_, |
| 1473 view_model_->view_size() - 1); | 1473 view_model_->view_size() - 1); |
| 1474 UpdateOverflowRange(overflow_bubble_->shelf_view()); | 1474 UpdateOverflowRange(overflow_bubble_->shelf_view()); |
| 1475 } | 1475 } |
| 1476 | 1476 |
| 1477 if (view->visible()) { | 1477 if (view->visible()) { |
| 1478 // The first animation fades out the view. When done we'll animate the rest | 1478 // The first animation fades out the view. When done we'll animate the rest |
| 1479 // of the views to their target location. | 1479 // of the views to their target location. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1509 AddChildView(new_view); | 1509 AddChildView(new_view); |
| 1510 view_model_->Add(new_view, model_index); | 1510 view_model_->Add(new_view, model_index); |
| 1511 view_model_->set_ideal_bounds(model_index, old_ideal_bounds); | 1511 view_model_->set_ideal_bounds(model_index, old_ideal_bounds); |
| 1512 new_view->SetBoundsRect(old_view->bounds()); | 1512 new_view->SetBoundsRect(old_view->bounds()); |
| 1513 return; | 1513 return; |
| 1514 } | 1514 } |
| 1515 | 1515 |
| 1516 views::View* view = view_model_->view_at(model_index); | 1516 views::View* view = view_model_->view_at(model_index); |
| 1517 switch (item.type) { | 1517 switch (item.type) { |
| 1518 case TYPE_BROWSER_SHORTCUT: | 1518 case TYPE_BROWSER_SHORTCUT: |
| 1519 // Fallthrough for the new Launcher since it needs to show the activation | 1519 // Fallthrough for the new Shelf since it needs to show the activation |
| 1520 // change as well. | 1520 // change as well. |
| 1521 case TYPE_APP_SHORTCUT: | 1521 case TYPE_APP_SHORTCUT: |
| 1522 case TYPE_WINDOWED_APP: | 1522 case TYPE_WINDOWED_APP: |
| 1523 case TYPE_PLATFORM_APP: | 1523 case TYPE_PLATFORM_APP: |
| 1524 case TYPE_APP_PANEL: { | 1524 case TYPE_APP_PANEL: { |
| 1525 LauncherButton* button = static_cast<LauncherButton*>(view); | 1525 LauncherButton* button = static_cast<LauncherButton*>(view); |
| 1526 ReflectItemStatus(item, button); | 1526 ReflectItemStatus(item, button); |
| 1527 // The browser shortcut is currently not a "real" item and as such the | 1527 // The browser shortcut is currently not a "real" item and as such the |
| 1528 // the image is bogous as well. We therefore keep the image as is for it. | 1528 // the image is bogous as well. We therefore keep the image as is for it. |
| 1529 if (item.type != TYPE_BROWSER_SHORTCUT) | 1529 if (item.type != TYPE_BROWSER_SHORTCUT) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1545 // at this time the |view_model_| is inconsistent with the |model_|. | 1545 // at this time the |view_model_| is inconsistent with the |model_|. |
| 1546 if (!cancelling_drag_model_changed_) | 1546 if (!cancelling_drag_model_changed_) |
| 1547 AnimateToIdealBounds(); | 1547 AnimateToIdealBounds(); |
| 1548 } | 1548 } |
| 1549 | 1549 |
| 1550 void ShelfView::ShelfStatusChanged() { | 1550 void ShelfView::ShelfStatusChanged() { |
| 1551 if (ash::switches::UseAlternateShelfLayout()) | 1551 if (ash::switches::UseAlternateShelfLayout()) |
| 1552 return; | 1552 return; |
| 1553 AppListButton* app_list_button = | 1553 AppListButton* app_list_button = |
| 1554 static_cast<AppListButton*>(GetAppListButtonView()); | 1554 static_cast<AppListButton*>(GetAppListButtonView()); |
| 1555 if (model_->status() == LauncherModel::STATUS_LOADING) | 1555 if (model_->status() == ShelfModel::STATUS_LOADING) |
| 1556 app_list_button->StartLoadingAnimation(); | 1556 app_list_button->StartLoadingAnimation(); |
| 1557 else | 1557 else |
| 1558 app_list_button->StopLoadingAnimation(); | 1558 app_list_button->StopLoadingAnimation(); |
| 1559 } | 1559 } |
| 1560 | 1560 |
| 1561 void ShelfView::PointerPressedOnButton(views::View* view, | 1561 void ShelfView::PointerPressedOnButton(views::View* view, |
| 1562 Pointer pointer, | 1562 Pointer pointer, |
| 1563 const ui::LocatedEvent& event) { | 1563 const ui::LocatedEvent& event) { |
| 1564 if (drag_view_) | 1564 if (drag_view_) |
| 1565 return; | 1565 return; |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1785 anchor_point = source->GetBoundsInScreen(); | 1785 anchor_point = source->GetBoundsInScreen(); |
| 1786 | 1786 |
| 1787 // It is possible to invoke the menu while it is sliding into view. To cover | 1787 // It is possible to invoke the menu while it is sliding into view. To cover |
| 1788 // that case, the screen coordinates are offsetted by the animation delta. | 1788 // that case, the screen coordinates are offsetted by the animation delta. |
| 1789 gfx::Vector2d offset = | 1789 gfx::Vector2d offset = |
| 1790 source->GetWidget()->GetNativeWindow()->bounds().origin() - | 1790 source->GetWidget()->GetNativeWindow()->bounds().origin() - |
| 1791 source->GetWidget()->GetNativeWindow()->GetTargetBounds().origin(); | 1791 source->GetWidget()->GetNativeWindow()->GetTargetBounds().origin(); |
| 1792 anchor_point.set_x(anchor_point.x() - offset.x()); | 1792 anchor_point.set_x(anchor_point.x() - offset.x()); |
| 1793 anchor_point.set_y(anchor_point.y() - offset.y()); | 1793 anchor_point.set_y(anchor_point.y() - offset.y()); |
| 1794 | 1794 |
| 1795 // Launcher items can have an asymmetrical border for spacing reasons. | 1795 // Shelf items can have an asymmetrical border for spacing reasons. |
| 1796 // Adjust anchor location for this. | 1796 // Adjust anchor location for this. |
| 1797 if (source->border()) | 1797 if (source->border()) |
| 1798 anchor_point.Inset(source->border()->GetInsets()); | 1798 anchor_point.Inset(source->border()->GetInsets()); |
| 1799 | 1799 |
| 1800 switch (align) { | 1800 switch (align) { |
| 1801 case ash::SHELF_ALIGNMENT_BOTTOM: | 1801 case ash::SHELF_ALIGNMENT_BOTTOM: |
| 1802 menu_alignment = views::MenuItemView::BUBBLE_ABOVE; | 1802 menu_alignment = views::MenuItemView::BUBBLE_ABOVE; |
| 1803 break; | 1803 break; |
| 1804 case ash::SHELF_ALIGNMENT_LEFT: | 1804 case ash::SHELF_ALIGNMENT_LEFT: |
| 1805 menu_alignment = views::MenuItemView::BUBBLE_RIGHT; | 1805 menu_alignment = views::MenuItemView::BUBBLE_RIGHT; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1925 break; | 1925 break; |
| 1926 case ash::SHELF_ALIGNMENT_TOP: | 1926 case ash::SHELF_ALIGNMENT_TOP: |
| 1927 distance = coordinate.y() - bounds.bottom(); | 1927 distance = coordinate.y() - bounds.bottom(); |
| 1928 break; | 1928 break; |
| 1929 } | 1929 } |
| 1930 return distance > 0 ? distance : 0; | 1930 return distance > 0 ? distance : 0; |
| 1931 } | 1931 } |
| 1932 | 1932 |
| 1933 } // namespace internal | 1933 } // namespace internal |
| 1934 } // namespace ash | 1934 } // namespace ash |
| OLD | NEW |