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 "ui/app_list/views/apps_grid_view.h" | 5 #include "ui/app_list/views/apps_grid_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 DISALLOW_COPY_AND_ASSIGN(SynchronousDrag); | 309 DISALLOW_COPY_AND_ASSIGN(SynchronousDrag); |
310 }; | 310 }; |
311 #endif // defined(OS_WIN) | 311 #endif // defined(OS_WIN) |
312 | 312 |
313 AppsGridView::AppsGridView(AppsGridViewDelegate* delegate, | 313 AppsGridView::AppsGridView(AppsGridViewDelegate* delegate, |
314 PaginationModel* pagination_model, | 314 PaginationModel* pagination_model, |
315 content::WebContents* start_page_contents) | 315 content::WebContents* start_page_contents) |
316 : model_(NULL), | 316 : model_(NULL), |
317 item_list_(NULL), | 317 item_list_(NULL), |
318 delegate_(delegate), | 318 delegate_(delegate), |
319 folder_delegate_(NULL), | |
319 pagination_model_(pagination_model), | 320 pagination_model_(pagination_model), |
320 page_switcher_view_(new PageSwitcher(pagination_model)), | 321 page_switcher_view_(new PageSwitcher(pagination_model)), |
321 start_page_view_(NULL), | 322 start_page_view_(NULL), |
322 cols_(0), | 323 cols_(0), |
323 rows_per_page_(0), | 324 rows_per_page_(0), |
324 selected_view_(NULL), | 325 selected_view_(NULL), |
325 drag_view_(NULL), | 326 drag_view_(NULL), |
326 drag_start_page_(-1), | 327 drag_start_page_(-1), |
327 drag_pointer_(NONE), | 328 drag_pointer_(NONE), |
328 drop_attempt_(DROP_FOR_NONE), | 329 drop_attempt_(DROP_FOR_NONE), |
329 drag_and_drop_host_(NULL), | 330 drag_and_drop_host_(NULL), |
330 forward_events_to_drag_and_drop_host_(false), | 331 forward_events_to_drag_and_drop_host_(false), |
331 page_flip_target_(-1), | 332 page_flip_target_(-1), |
332 page_flip_delay_in_ms_(kPageFlipDelayInMs), | 333 page_flip_delay_in_ms_(kPageFlipDelayInMs), |
333 bounds_animator_(this), | 334 bounds_animator_(this), |
334 is_root_level_(true), | |
335 activated_item_view_(NULL), | 335 activated_item_view_(NULL), |
336 dragging_for_reparent_item_(false) { | 336 dragging_for_reparent_item_(false) { |
337 SetPaintToLayer(true); | 337 SetPaintToLayer(true); |
338 SetFillsBoundsOpaquely(false); | 338 SetFillsBoundsOpaquely(false); |
339 | 339 |
340 pagination_model_->AddObserver(this); | 340 pagination_model_->AddObserver(this); |
341 AddChildView(page_switcher_view_); | 341 AddChildView(page_switcher_view_); |
342 | 342 |
343 if (start_page_contents) { | 343 if (start_page_contents) { |
344 start_page_view_ = | 344 start_page_view_ = |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
492 synchronous_drag_->EndDragExternally(); | 492 synchronous_drag_->EndDragExternally(); |
493 | 493 |
494 synchronous_drag_ = NULL; | 494 synchronous_drag_ = NULL; |
495 #endif | 495 #endif |
496 } | 496 } |
497 | 497 |
498 bool AppsGridView::UpdateDragFromItem(Pointer pointer, | 498 bool AppsGridView::UpdateDragFromItem(Pointer pointer, |
499 const ui::LocatedEvent& event) { | 499 const ui::LocatedEvent& event) { |
500 DCHECK(drag_view_); | 500 DCHECK(drag_view_); |
501 | 501 |
502 if (!is_root_level_) | 502 if (folder_delegate_) |
503 UpdateDragStateInsideFolder(pointer, event); | 503 UpdateDragStateInsideFolder(pointer, event); |
504 | 504 |
505 gfx::Point drag_point_in_grid_view; | 505 gfx::Point drag_point_in_grid_view; |
506 ExtractDragLocation(event, &drag_point_in_grid_view); | 506 ExtractDragLocation(event, &drag_point_in_grid_view); |
507 UpdateDrag(pointer, drag_point_in_grid_view); | 507 UpdateDrag(pointer, drag_point_in_grid_view); |
508 if (!dragging()) | 508 if (!dragging()) |
509 return false; | 509 return false; |
510 | 510 |
511 // If a drag and drop host is provided, see if the drag operation needs to be | 511 // If a drag and drop host is provided, see if the drag operation needs to be |
512 // forwarded. | 512 // forwarded. |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
588 // EndDrag was called before if |drag_view_| is NULL. | 588 // EndDrag was called before if |drag_view_| is NULL. |
589 if (!drag_view_) | 589 if (!drag_view_) |
590 return; | 590 return; |
591 | 591 |
592 // Coming here a drag and drop was in progress. | 592 // Coming here a drag and drop was in progress. |
593 bool landed_in_drag_and_drop_host = forward_events_to_drag_and_drop_host_; | 593 bool landed_in_drag_and_drop_host = forward_events_to_drag_and_drop_host_; |
594 if (forward_events_to_drag_and_drop_host_) { | 594 if (forward_events_to_drag_and_drop_host_) { |
595 DCHECK(!IsDraggingForReparentInRootLevelGridView()); | 595 DCHECK(!IsDraggingForReparentInRootLevelGridView()); |
596 forward_events_to_drag_and_drop_host_ = false; | 596 forward_events_to_drag_and_drop_host_ = false; |
597 drag_and_drop_host_->EndDrag(cancel); | 597 drag_and_drop_host_->EndDrag(cancel); |
598 if (IsDraggingForReprentInHiddenGridView()) { | 598 if (IsDraggingForReprentInHiddenGridView()) { |
tapted
2014/03/26 02:53:54
nit: doesn't need curlies
calamity
2014/03/27 05:14:44
Done.
| |
599 static_cast<AppListFolderView*>(parent())-> | 599 folder_delegate_->DispatchEndDragEventForReparent(true); |
600 DispatchEndDragEventForReparent(true); | |
601 } | 600 } |
602 } else if (!cancel && dragging()) { | 601 } else if (!cancel && dragging()) { |
603 if (IsDraggingForReprentInHiddenGridView()) { | 602 if (IsDraggingForReprentInHiddenGridView()) { |
604 // Forward the EndDrag event to the root level grid view. | 603 // Forward the EndDrag event to the root level grid view. |
605 static_cast<AppListFolderView*>(parent())-> | 604 folder_delegate_->DispatchEndDragEventForReparent(false); |
606 DispatchEndDragEventForReparent(false); | |
607 EndDragForReparentInHiddenFolderGridView(); | 605 EndDragForReparentInHiddenFolderGridView(); |
608 return; | 606 return; |
609 } else { | 607 } else { |
610 // Regular drag ending path, ie, not for reparenting. | 608 // Regular drag ending path, ie, not for reparenting. |
611 CalculateDropTarget(last_drag_point_, true); | 609 CalculateDropTarget(last_drag_point_, true); |
612 if (IsValidIndex(drop_target_)) { | 610 if (IsValidIndex(drop_target_)) { |
613 if (!EnableFolderDragDropUI()) { | 611 if (!EnableFolderDragDropUI()) { |
614 MoveItemInModel(drag_view_, drop_target_); | 612 MoveItemInModel(drag_view_, drop_target_); |
615 } else { | 613 } else { |
616 if (drop_attempt_ == DROP_FOR_REORDER) | 614 if (drop_attempt_ == DROP_FOR_REORDER) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
651 drag_view_ = NULL; | 649 drag_view_ = NULL; |
652 drag_start_grid_view_ = gfx::Point(); | 650 drag_start_grid_view_ = gfx::Point(); |
653 drag_start_page_ = -1; | 651 drag_start_page_ = -1; |
654 drag_view_offset_ = gfx::Point(); | 652 drag_view_offset_ = gfx::Point(); |
655 AnimateToIdealBounds(); | 653 AnimateToIdealBounds(); |
656 | 654 |
657 StopPageFlipTimer(); | 655 StopPageFlipTimer(); |
658 | 656 |
659 // If user releases mouse inside a folder's grid view, burst the folder | 657 // If user releases mouse inside a folder's grid view, burst the folder |
660 // container ink bubble. | 658 // container ink bubble. |
661 if (!cancel && !is_root_level_ && !IsDraggingForReprentInHiddenGridView()) { | 659 if (folder_delegate_ && !IsDraggingForReprentInHiddenGridView()) |
tapted
2014/03/26 02:53:54
there's a typo in this function name: Reprent -> R
jennyz
2014/03/26 22:09:38
This change will crash chrome on chromeos, since t
calamity
2014/03/27 05:14:44
Done.
calamity
2014/03/27 05:14:44
Cool, thanks for fixing that.
| |
662 static_cast<AppListFolderView*>(parent())-> | 660 folder_delegate_->UpdateFolderViewBackground(false); |
663 UpdateFolderViewBackground(false); | |
664 } | |
665 | 661 |
666 if (IsDraggingForReprentInHiddenGridView()) | 662 if (IsDraggingForReprentInHiddenGridView()) |
667 dragging_for_reparent_item_ = false; | 663 dragging_for_reparent_item_ = false; |
668 } | 664 } |
669 | 665 |
670 void AppsGridView::StopPageFlipTimer() { | 666 void AppsGridView::StopPageFlipTimer() { |
671 page_flip_timer_.Stop(); | 667 page_flip_timer_.Stop(); |
672 page_flip_target_ = -1; | 668 page_flip_target_ = -1; |
673 } | 669 } |
674 | 670 |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1289 drop_target_ = GetNearestTileForDragView(); | 1285 drop_target_ = GetNearestTileForDragView(); |
1290 } | 1286 } |
1291 } | 1287 } |
1292 | 1288 |
1293 void AppsGridView::OnReorderTimer() { | 1289 void AppsGridView::OnReorderTimer() { |
1294 if (drop_attempt_ == DROP_FOR_REORDER) | 1290 if (drop_attempt_ == DROP_FOR_REORDER) |
1295 AnimateToIdealBounds(); | 1291 AnimateToIdealBounds(); |
1296 } | 1292 } |
1297 | 1293 |
1298 void AppsGridView::OnFolderItemReparentTimer() { | 1294 void AppsGridView::OnFolderItemReparentTimer() { |
1299 DCHECK(!is_root_level_); | 1295 DCHECK(folder_delegate_); |
1300 if (drag_out_of_folder_container_) { | 1296 if (drag_out_of_folder_container_) { |
1301 static_cast<AppListFolderView*>(parent())->ReparentItem( | 1297 folder_delegate_->ReparentItem(drag_view_, last_drag_point_); |
1302 drag_view_, last_drag_point_); | |
1303 | 1298 |
1304 // Set the flag in the folder's grid view. | 1299 // Set the flag in the folder's grid view. |
1305 dragging_for_reparent_item_ = true; | 1300 dragging_for_reparent_item_ = true; |
1306 | 1301 |
1307 // Do not observe any data change since it is going to be hidden. | 1302 // Do not observe any data change since it is going to be hidden. |
1308 item_list_->RemoveObserver(this); | 1303 item_list_->RemoveObserver(this); |
1309 item_list_ = NULL; | 1304 item_list_ = NULL; |
1310 } | 1305 } |
1311 } | 1306 } |
1312 | 1307 |
1313 void AppsGridView::OnFolderDroppingTimer() { | 1308 void AppsGridView::OnFolderDroppingTimer() { |
1314 if (drop_attempt_ == DROP_FOR_FOLDER) | 1309 if (drop_attempt_ == DROP_FOR_FOLDER) |
1315 SetAsFolderDroppingTarget(drop_target_, true); | 1310 SetAsFolderDroppingTarget(drop_target_, true); |
1316 } | 1311 } |
1317 | 1312 |
1318 void AppsGridView::UpdateDragStateInsideFolder( | 1313 void AppsGridView::UpdateDragStateInsideFolder( |
1319 Pointer pointer, | 1314 Pointer pointer, |
1320 const ui::LocatedEvent& event) { | 1315 const ui::LocatedEvent& event) { |
1321 if (IsDraggingForReprentInHiddenGridView()) { | 1316 if (IsDraggingForReprentInHiddenGridView()) { |
1322 // Dispatch drag event to root level grid view for re-parenting folder | 1317 // Dispatch drag event to root level grid view for re-parenting folder |
1323 // folder item purpose. | 1318 // folder item purpose. |
1324 DispatchDragEventForReparent(pointer, event); | 1319 DispatchDragEventForReparent(pointer, event); |
1325 return; | 1320 return; |
1326 } | 1321 } |
1327 | 1322 |
1328 // Regular drag and drop in a folder's grid view. | 1323 // Regular drag and drop in a folder's grid view. |
1329 AppListFolderView* folder_view = static_cast<AppListFolderView*>(parent()); | 1324 folder_delegate_->UpdateFolderViewBackground(true); |
1330 folder_view->UpdateFolderViewBackground(true); | |
1331 | 1325 |
1332 // Calculate if the drag_view_ is dragged out of the folder's container | 1326 // Calculate if the drag_view_ is dragged out of the folder's container |
1333 // ink bubble. | 1327 // ink bubble. |
1334 gfx::Rect bounds_to_folder_view = ConvertRectToParent(drag_view_->bounds()); | 1328 gfx::Rect bounds_to_folder_view = ConvertRectToParent(drag_view_->bounds()); |
1335 gfx::Point pt = bounds_to_folder_view.CenterPoint(); | 1329 gfx::Point pt = bounds_to_folder_view.CenterPoint(); |
1336 bool is_item_dragged_out_of_folder = | 1330 bool is_item_dragged_out_of_folder = |
1337 folder_view->IsPointOutsideOfFolderBoundray(pt); | 1331 folder_delegate_->IsPointOutsideOfFolderBoundary(pt); |
1338 if (is_item_dragged_out_of_folder) { | 1332 if (is_item_dragged_out_of_folder) { |
1339 if (!drag_out_of_folder_container_) { | 1333 if (!drag_out_of_folder_container_) { |
1340 folder_item_reparent_timer_.Start(FROM_HERE, | 1334 folder_item_reparent_timer_.Start(FROM_HERE, |
1341 base::TimeDelta::FromMilliseconds(kFolderItemReparentDealy), | 1335 base::TimeDelta::FromMilliseconds(kFolderItemReparentDealy), |
1342 this, &AppsGridView::OnFolderItemReparentTimer); | 1336 this, &AppsGridView::OnFolderItemReparentTimer); |
1343 drag_out_of_folder_container_ = true; | 1337 drag_out_of_folder_container_ = true; |
1344 } | 1338 } |
1345 } else { | 1339 } else { |
1346 folder_item_reparent_timer_.Stop(); | 1340 folder_item_reparent_timer_.Stop(); |
1347 drag_out_of_folder_container_ = false; | 1341 drag_out_of_folder_container_ = false; |
1348 } | 1342 } |
1349 } | 1343 } |
1350 | 1344 |
1351 bool AppsGridView::IsDraggingForReparentInRootLevelGridView() const { | 1345 bool AppsGridView::IsDraggingForReparentInRootLevelGridView() const { |
1352 return (is_root_level_ && dragging_for_reparent_item_); | 1346 return (!folder_delegate_ && dragging_for_reparent_item_); |
1353 } | 1347 } |
1354 | 1348 |
1355 bool AppsGridView::IsDraggingForReprentInHiddenGridView() const { | 1349 bool AppsGridView::IsDraggingForReprentInHiddenGridView() const { |
1356 return (!is_root_level_ && dragging_for_reparent_item_); | 1350 return (folder_delegate_ && dragging_for_reparent_item_); |
1357 } | 1351 } |
1358 | 1352 |
1359 gfx::Rect AppsGridView::GetTargetIconRectInFolder( | 1353 gfx::Rect AppsGridView::GetTargetIconRectInFolder( |
1360 AppListItemView* drag_item_view, | 1354 AppListItemView* drag_item_view, |
1361 AppListItemView* folder_item_view) { | 1355 AppListItemView* folder_item_view) { |
1362 gfx::Rect view_ideal_bounds = view_model_.ideal_bounds( | 1356 gfx::Rect view_ideal_bounds = view_model_.ideal_bounds( |
1363 view_model_.GetIndexOfView(folder_item_view)); | 1357 view_model_.GetIndexOfView(folder_item_view)); |
1364 gfx::Rect icon_ideal_bounds = | 1358 gfx::Rect icon_ideal_bounds = |
1365 folder_item_view->GetIconBoundsForTargetViewBounds(view_ideal_bounds); | 1359 folder_item_view->GetIconBoundsForTargetViewBounds(view_ideal_bounds); |
1366 AppListFolderItem* folder_item = | 1360 AppListFolderItem* folder_item = |
1367 static_cast<AppListFolderItem*>(folder_item_view->item()); | 1361 static_cast<AppListFolderItem*>(folder_item_view->item()); |
1368 return folder_item->GetTargetIconRectInFolderForItem( | 1362 return folder_item->GetTargetIconRectInFolderForItem( |
1369 drag_item_view->item(), icon_ideal_bounds); | 1363 drag_item_view->item(), icon_ideal_bounds); |
1370 } | 1364 } |
1371 | 1365 |
1372 void AppsGridView::DispatchDragEventForReparent( | 1366 void AppsGridView::DispatchDragEventForReparent( |
1373 Pointer pointer, | 1367 Pointer pointer, |
1374 const ui::LocatedEvent& event) { | 1368 const ui::LocatedEvent& event) { |
1375 static_cast<AppListFolderView*>(parent())-> | 1369 folder_delegate_->DispatchDragEventForReparent(pointer, event); |
1376 DispatchDragEventForReparent(pointer, event); | |
1377 } | 1370 } |
1378 | 1371 |
1379 void AppsGridView::EndDragFromReparentItemInRootLevel( | 1372 void AppsGridView::EndDragFromReparentItemInRootLevel( |
1380 bool events_forwarded_to_drag_drop_host) { | 1373 bool events_forwarded_to_drag_drop_host) { |
1381 // EndDrag was called before if |drag_view_| is NULL. | 1374 // EndDrag was called before if |drag_view_| is NULL. |
1382 if (!drag_view_) | 1375 if (!drag_view_) |
1383 return; | 1376 return; |
1384 | 1377 |
1385 DCHECK(IsDraggingForReparentInRootLevelGridView()); | 1378 DCHECK(IsDraggingForReparentInRootLevelGridView()); |
1386 bool cancel_reparent = false; | 1379 bool cancel_reparent = false; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1449 drop_target_ = Index(); | 1442 drop_target_ = Index(); |
1450 drag_view_->OnDragEnded(); | 1443 drag_view_->OnDragEnded(); |
1451 drag_view_ = NULL; | 1444 drag_view_ = NULL; |
1452 drag_start_grid_view_ = gfx::Point(); | 1445 drag_start_grid_view_ = gfx::Point(); |
1453 drag_start_page_ = -1; | 1446 drag_start_page_ = -1; |
1454 drag_view_offset_ = gfx::Point(); | 1447 drag_view_offset_ = gfx::Point(); |
1455 dragging_for_reparent_item_ = false; | 1448 dragging_for_reparent_item_ = false; |
1456 } | 1449 } |
1457 | 1450 |
1458 void AppsGridView::OnFolderItemRemoved() { | 1451 void AppsGridView::OnFolderItemRemoved() { |
1459 DCHECK(!is_root_level_); | 1452 DCHECK(folder_delegate_); |
1460 item_list_ = NULL; | 1453 item_list_ = NULL; |
1461 } | 1454 } |
1462 | 1455 |
1463 void AppsGridView::StartDragAndDropHostDrag(const gfx::Point& grid_location) { | 1456 void AppsGridView::StartDragAndDropHostDrag(const gfx::Point& grid_location) { |
1464 // When a drag and drop host is given, the item can be dragged out of the app | 1457 // When a drag and drop host is given, the item can be dragged out of the app |
1465 // list window. In that case a proxy widget needs to be used. | 1458 // list window. In that case a proxy widget needs to be used. |
1466 // Note: This code has very likely to be changed for Windows (non metro mode) | 1459 // Note: This code has very likely to be changed for Windows (non metro mode) |
1467 // when a |drag_and_drop_host_| gets implemented. | 1460 // when a |drag_and_drop_host_| gets implemented. |
1468 if (!drag_view_ || !drag_and_drop_host_) | 1461 if (!drag_view_ || !drag_and_drop_host_) |
1469 return; | 1462 return; |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1893 } | 1886 } |
1894 | 1887 |
1895 void AppsGridView::OnImplicitAnimationsCompleted() { | 1888 void AppsGridView::OnImplicitAnimationsCompleted() { |
1896 if (layer()->opacity() == 0.0f) | 1889 if (layer()->opacity() == 0.0f) |
1897 SetVisible(false); | 1890 SetVisible(false); |
1898 } | 1891 } |
1899 | 1892 |
1900 bool AppsGridView::EnableFolderDragDropUI() { | 1893 bool AppsGridView::EnableFolderDragDropUI() { |
1901 // Enable drag and drop folder UI only if it is at the app list root level | 1894 // Enable drag and drop folder UI only if it is at the app list root level |
1902 // and the switch is on and the target folder can still accept new items. | 1895 // and the switch is on and the target folder can still accept new items. |
1903 return switches::IsFolderUIEnabled() && is_root_level_ && | 1896 return switches::IsFolderUIEnabled() && !folder_delegate_ && |
1904 CanDropIntoTarget(drop_target_); | 1897 CanDropIntoTarget(drop_target_); |
1905 } | 1898 } |
1906 | 1899 |
1907 bool AppsGridView::CanDropIntoTarget(const Index& drop_target) { | 1900 bool AppsGridView::CanDropIntoTarget(const Index& drop_target) { |
1908 views::View* target_view = GetViewAtSlotOnCurrentPage(drop_target.slot); | 1901 views::View* target_view = GetViewAtSlotOnCurrentPage(drop_target.slot); |
1909 if (!target_view) | 1902 if (!target_view) |
1910 return true; | 1903 return true; |
1911 | 1904 |
1912 AppListItem* target_item = | 1905 AppListItem* target_item = |
1913 static_cast<AppListItemView*>(target_view)->item(); | 1906 static_cast<AppListItemView*>(target_view)->item(); |
1914 // Items can be dropped into non-folders (which have no children) or folders | 1907 // Items can be dropped into non-folders (which have no children) or folders |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2081 void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index, | 2074 void AppsGridView::SetAsFolderDroppingTarget(const Index& target_index, |
2082 bool is_target_folder) { | 2075 bool is_target_folder) { |
2083 AppListItemView* target_view = | 2076 AppListItemView* target_view = |
2084 static_cast<AppListItemView*>( | 2077 static_cast<AppListItemView*>( |
2085 GetViewAtSlotOnCurrentPage(target_index.slot)); | 2078 GetViewAtSlotOnCurrentPage(target_index.slot)); |
2086 if (target_view) | 2079 if (target_view) |
2087 target_view->SetAsAttemptedFolderTarget(is_target_folder); | 2080 target_view->SetAsAttemptedFolderTarget(is_target_folder); |
2088 } | 2081 } |
2089 | 2082 |
2090 } // namespace app_list | 2083 } // namespace app_list |
OLD | NEW |