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

Unified Diff: ash/wm/toplevel_window_event_handler.cc

Issue 12441010: Attach panel while dragging to bring it in front of other panels. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix merge. Created 7 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/wm/toplevel_window_event_handler.h ('k') | ash/wm/window_properties.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/toplevel_window_event_handler.cc
diff --git a/ash/wm/toplevel_window_event_handler.cc b/ash/wm/toplevel_window_event_handler.cc
index 4f0826986bba4e2188281a0a6d36e0e844fbf746..e62631f32b62bc3601437f4d43255e25d08b09aa 100644
--- a/ash/wm/toplevel_window_event_handler.cc
+++ b/ash/wm/toplevel_window_event_handler.cc
@@ -7,6 +7,7 @@
#include "ash/shell.h"
#include "ash/wm/property_util.h"
#include "ash/wm/resize_shadow_controller.h"
+#include "ash/wm/window_properties.h"
#include "ash/wm/window_resizer.h"
#include "ash/wm/window_util.h"
#include "ash/wm/workspace/snap_sizer.h"
@@ -62,15 +63,24 @@ class ToplevelWindowEventHandler::ScopedWindowResizer
WindowResizer* resizer() { return resizer_.get(); }
// WindowObserver overrides:
+ virtual void OnWindowHierarchyChanging(
+ const HierarchyChangeParams& params) OVERRIDE;
virtual void OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) OVERRIDE;
virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
private:
+ void AddHandlers(aura::Window* container);
+ void RemoveHandlers();
+
ToplevelWindowEventHandler* handler_;
scoped_ptr<WindowResizer> resizer_;
+ // If not NULL, this is an additional container that the dragged window has
+ // moved to which ScopedWindowResizer has temporarily added observers on.
+ aura::Window* target_container_;
+
DISALLOW_COPY_AND_ASSIGN(ScopedWindowResizer);
};
@@ -78,16 +88,31 @@ ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer(
ToplevelWindowEventHandler* handler,
WindowResizer* resizer)
: handler_(handler),
- resizer_(resizer) {
+ resizer_(resizer),
+ target_container_(NULL) {
if (resizer_.get())
resizer_->GetTarget()->AddObserver(this);
}
ToplevelWindowEventHandler::ScopedWindowResizer::~ScopedWindowResizer() {
+ RemoveHandlers();
if (resizer_.get())
resizer_->GetTarget()->RemoveObserver(this);
}
+void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowHierarchyChanging(
+ const HierarchyChangeParams& params) {
+ if (params.receiver != resizer_->GetTarget())
+ return;
+
+ if (params.receiver->GetProperty(internal::kContinueDragAfterReparent)) {
+ params.receiver->SetProperty(internal::kContinueDragAfterReparent, false);
+ AddHandlers(params.new_parent);
+ } else {
+ handler_->CompleteDrag(DRAG_COMPLETE, 0);
flackr 2013/03/20 10:01:40 If the new parent is also contained by handler_->o
+ }
+}
+
void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowPropertyChanged(
aura::Window* window,
const void* key,
@@ -103,11 +128,30 @@ void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowDestroying(
handler_->ResizerWindowDestroyed();
}
+void ToplevelWindowEventHandler::ScopedWindowResizer::AddHandlers(
+ aura::Window* container) {
+ RemoveHandlers();
+ if (!handler_->owner()->Contains(container)) {
+ container->AddPreTargetHandler(handler_);
+ container->AddPostTargetHandler(handler_);
+ target_container_ = container;
+ }
+}
+
+void ToplevelWindowEventHandler::ScopedWindowResizer::RemoveHandlers() {
+ if (target_container_) {
+ target_container_->RemovePreTargetHandler(handler_);
+ target_container_->RemovePostTargetHandler(handler_);
+ target_container_ = NULL;
+ }
+}
+
// ToplevelWindowEventHandler --------------------------------------------------
ToplevelWindowEventHandler::ToplevelWindowEventHandler(aura::Window* owner)
- : in_move_loop_(false),
+ : owner_(owner),
+ in_move_loop_(false),
move_cancelled_(false),
in_gesture_drag_(false),
destroyed_(NULL) {
« no previous file with comments | « ash/wm/toplevel_window_event_handler.h ('k') | ash/wm/window_properties.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698