Index: views/widget/widget_impl.cc |
=================================================================== |
--- views/widget/widget_impl.cc (revision 75181) |
+++ views/widget/widget_impl.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include "base/compiler_specific.h" |
#include "base/message_loop.h" |
#include "views/focus/focus_manager.h" |
+#include "views/focus/view_storage.h" |
#include "views/view.h" |
#include "views/widget/native_widget.h" |
#include "views/widget/root_view.h" |
@@ -53,7 +54,8 @@ |
is_mouse_button_pressed_(false), |
last_mouse_event_was_move_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), |
- delete_on_destroy_(true) { |
+ delete_on_destroy_(true), |
+ dragged_view_(NULL) { |
} |
WidgetImpl::~WidgetImpl() { |
@@ -365,7 +367,14 @@ |
} |
void WidgetImpl::ViewHierarchyChanged(bool is_add, View* parent, View* child) { |
- NOTIMPLEMENTED(); |
+ if (!is_add) { |
+ if (child == dragged_view_) |
+ dragged_view_ = NULL; |
+ FocusManager* focus_manager = GetFocusManager(); |
+ if (focus_manager) |
+ focus_manager->ViewRemoved(parent, child); |
+ ViewStorage::GetInstance()->ViewRemoved(parent, child); |
+ } |
} |
bool WidgetImpl::ContainsNativeView(gfx::NativeView native_view) { |
@@ -373,6 +382,26 @@ |
return false; |
} |
+void WidgetImpl::StartDragForViewFromMouseEvent( |
+ View* view, |
+ const OSExchangeData& data, |
+ int operation) { |
+ // NOTE: view may be NULL. |
+ dragged_view_ = view; |
+ native_widget_->RunShellDrag(data, operation); |
+ |
+ // If the view is removed during the drag operation, dragged_view_ is set to |
+ // NULL. |
+ if (view && dragged_view_ == view) { |
+ dragged_view_ = NULL; |
+ view->OnDragDone(); |
+ } |
+} |
+ |
+View* WidgetImpl::GetDraggedView() { |
+ return dragged_view_; |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// WidgetImpl, private: |