| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/views/root_view_drop_target.h" | 5 #include "chrome/views/root_view_drop_target.h" |
| 6 | 6 |
| 7 #include "base/gfx/point.h" |
| 7 #include "base/logging.h" | 8 #include "base/logging.h" |
| 8 #include "chrome/common/drag_drop_types.h" | 9 #include "chrome/common/drag_drop_types.h" |
| 9 #include "chrome/views/root_view.h" | 10 #include "chrome/views/root_view.h" |
| 10 #include "chrome/views/view_container.h" | 11 #include "chrome/views/view_container.h" |
| 11 | 12 |
| 12 namespace ChromeViews { | 13 namespace ChromeViews { |
| 13 | 14 |
| 14 RootViewDropTarget::RootViewDropTarget(RootView* root_view) | 15 RootViewDropTarget::RootViewDropTarget(RootView* root_view) |
| 15 : BaseDropTarget(root_view->GetViewContainer()->GetHWND()), | 16 : BaseDropTarget(root_view->GetViewContainer()->GetHWND()), |
| 16 root_view_(root_view), | 17 root_view_(root_view), |
| 17 target_view_(NULL), | 18 target_view_(NULL), |
| 18 deepest_view_(NULL) { | 19 deepest_view_(NULL) { |
| 19 } | 20 } |
| 20 | 21 |
| 21 RootViewDropTarget::~RootViewDropTarget() { | 22 RootViewDropTarget::~RootViewDropTarget() { |
| 22 } | 23 } |
| 23 | 24 |
| 24 void RootViewDropTarget::ResetTargetViewIfEquals(View* view) { | 25 void RootViewDropTarget::ResetTargetViewIfEquals(View* view) { |
| 25 if (target_view_ == view) | 26 if (target_view_ == view) |
| 26 target_view_ = NULL; | 27 target_view_ = NULL; |
| 27 if (deepest_view_ == view) | 28 if (deepest_view_ == view) |
| 28 deepest_view_ = NULL; | 29 deepest_view_ = NULL; |
| 29 } | 30 } |
| 30 | 31 |
| 31 DWORD RootViewDropTarget::OnDragOver(IDataObject* data_object, | 32 DWORD RootViewDropTarget::OnDragOver(IDataObject* data_object, |
| 32 DWORD key_state, | 33 DWORD key_state, |
| 33 POINT cursor_position, | 34 POINT cursor_position, |
| 34 DWORD effect) { | 35 DWORD effect) { |
| 35 const OSExchangeData data(data_object); | 36 const OSExchangeData data(data_object); |
| 36 CPoint root_view_location(cursor_position.x, cursor_position.y); | 37 gfx::Point root_view_location(cursor_position.x, cursor_position.y); |
| 37 View::ConvertPointToView(NULL, root_view_, &root_view_location); | 38 View::ConvertPointToView(NULL, root_view_, &root_view_location); |
| 38 View* view = CalculateTargetView(root_view_location, data); | 39 View* view = CalculateTargetView(root_view_location, data); |
| 39 | 40 |
| 40 if (view != target_view_) { | 41 if (view != target_view_) { |
| 41 // Target changed notify old drag exited, then new drag entered. | 42 // Target changed notify old drag exited, then new drag entered. |
| 42 if (target_view_) | 43 if (target_view_) |
| 43 target_view_->OnDragExited(); | 44 target_view_->OnDragExited(); |
| 44 target_view_ = view; | 45 target_view_ = view; |
| 45 if (target_view_) { | 46 if (target_view_) { |
| 46 CPoint target_view_location(root_view_location.x, root_view_location.y); | 47 gfx::Point target_view_location(root_view_location); |
| 47 View::ConvertPointToView(root_view_, target_view_, &target_view_location); | 48 View::ConvertPointToView(root_view_, target_view_, &target_view_location); |
| 48 DropTargetEvent enter_event(data, | 49 DropTargetEvent enter_event(data, |
| 49 target_view_location.x, | 50 target_view_location.x(), |
| 50 target_view_location.y, | 51 target_view_location.y(), |
| 51 DragDropTypes::DropEffectToDragOperation(effect)); | 52 DragDropTypes::DropEffectToDragOperation(effect)); |
| 52 target_view_->OnDragEntered(enter_event); | 53 target_view_->OnDragEntered(enter_event); |
| 53 } | 54 } |
| 54 } | 55 } |
| 55 | 56 |
| 56 if (target_view_) { | 57 if (target_view_) { |
| 57 CPoint target_view_location(root_view_location.x, root_view_location.y); | 58 gfx::Point target_view_location(root_view_location); |
| 58 View::ConvertPointToView(root_view_, target_view_, &target_view_location); | 59 View::ConvertPointToView(root_view_, target_view_, &target_view_location); |
| 59 DropTargetEvent enter_event(data, | 60 DropTargetEvent enter_event(data, |
| 60 target_view_location.x, | 61 target_view_location.x(), |
| 61 target_view_location.y, | 62 target_view_location.y(), |
| 62 DragDropTypes::DropEffectToDragOperation(effect)); | 63 DragDropTypes::DropEffectToDragOperation(effect)); |
| 63 int result_operation = target_view_->OnDragUpdated(enter_event); | 64 int result_operation = target_view_->OnDragUpdated(enter_event); |
| 64 return DragDropTypes::DragOperationToDropEffect(result_operation); | 65 return DragDropTypes::DragOperationToDropEffect(result_operation); |
| 65 } else { | 66 } else { |
| 66 return DROPEFFECT_NONE; | 67 return DROPEFFECT_NONE; |
| 67 } | 68 } |
| 68 } | 69 } |
| 69 | 70 |
| 70 void RootViewDropTarget::OnDragLeave(IDataObject* data_object) { | 71 void RootViewDropTarget::OnDragLeave(IDataObject* data_object) { |
| 71 if (target_view_) | 72 if (target_view_) |
| 72 target_view_->OnDragExited(); | 73 target_view_->OnDragExited(); |
| 73 deepest_view_ = target_view_ = NULL; | 74 deepest_view_ = target_view_ = NULL; |
| 74 } | 75 } |
| 75 | 76 |
| 76 DWORD RootViewDropTarget::OnDrop(IDataObject* data_object, | 77 DWORD RootViewDropTarget::OnDrop(IDataObject* data_object, |
| 77 DWORD key_state, | 78 DWORD key_state, |
| 78 POINT cursor_position, | 79 POINT cursor_position, |
| 79 DWORD effect) { | 80 DWORD effect) { |
| 80 const OSExchangeData data(data_object); | 81 const OSExchangeData data(data_object); |
| 81 DWORD drop_effect = OnDragOver(data_object, key_state, cursor_position, | 82 DWORD drop_effect = OnDragOver(data_object, key_state, cursor_position, |
| 82 effect); | 83 effect); |
| 83 View* drop_view = target_view_; | 84 View* drop_view = target_view_; |
| 84 deepest_view_ = target_view_ = NULL; | 85 deepest_view_ = target_view_ = NULL; |
| 85 if (drop_effect != DROPEFFECT_NONE) { | 86 if (drop_effect != DROPEFFECT_NONE) { |
| 86 CPoint view_location(cursor_position.x, cursor_position.y); | 87 gfx::Point view_location(cursor_position.x, cursor_position.y); |
| 87 View::ConvertPointToView(NULL, drop_view, &view_location); | 88 View::ConvertPointToView(NULL, drop_view, &view_location); |
| 88 DropTargetEvent drop_event(data, view_location.x, view_location.y, | 89 DropTargetEvent drop_event(data, view_location.x(), view_location.y(), |
| 89 DragDropTypes::DropEffectToDragOperation(effect)); | 90 DragDropTypes::DropEffectToDragOperation(effect)); |
| 90 return DragDropTypes::DragOperationToDropEffect( | 91 return DragDropTypes::DragOperationToDropEffect( |
| 91 drop_view->OnPerformDrop(drop_event)); | 92 drop_view->OnPerformDrop(drop_event)); |
| 92 } else { | 93 } else { |
| 93 if (drop_view) | 94 if (drop_view) |
| 94 drop_view->OnDragExited(); | 95 drop_view->OnDragExited(); |
| 95 return DROPEFFECT_NONE; | 96 return DROPEFFECT_NONE; |
| 96 } | 97 } |
| 97 } | 98 } |
| 98 | 99 |
| 99 View* RootViewDropTarget::CalculateTargetView( | 100 View* RootViewDropTarget::CalculateTargetView( |
| 100 const CPoint& root_view_location, | 101 const gfx::Point& root_view_location, |
| 101 const OSExchangeData& data) { | 102 const OSExchangeData& data) { |
| 102 View* view = root_view_->GetViewForPoint(root_view_location); | 103 View* view = root_view_->GetViewForPoint(root_view_location.ToPOINT()); |
| 103 if (view == deepest_view_) { | 104 if (view == deepest_view_) { |
| 104 // The view the mouse is over hasn't changed; reuse the target. | 105 // The view the mouse is over hasn't changed; reuse the target. |
| 105 return target_view_; | 106 return target_view_; |
| 106 } | 107 } |
| 107 // View under mouse changed, which means a new view may want the drop. | 108 // View under mouse changed, which means a new view may want the drop. |
| 108 // Walk the tree, stopping at target_view_ as we know it'll accept the | 109 // Walk the tree, stopping at target_view_ as we know it'll accept the |
| 109 // drop. | 110 // drop. |
| 110 deepest_view_ = view; | 111 deepest_view_ = view; |
| 111 while (view && view != target_view_ && | 112 while (view && view != target_view_ && |
| 112 (!view->IsEnabled() || !view->CanDrop(data))) { | 113 (!view->IsEnabled() || !view->CanDrop(data))) { |
| 113 view = view->GetParent(); | 114 view = view->GetParent(); |
| 114 } | 115 } |
| 115 return view; | 116 return view; |
| 116 } | 117 } |
| 117 | 118 |
| 118 } // namespace | 119 } // namespace |
| 119 | 120 |
| OLD | NEW |