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

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: Check that dragged panel is in panel container before stacking at top. 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
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..823d78a1dcf3a9590421f99cc1baf4e1ed3c5768 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* extra_handler_container_;
sky 2013/03/18 16:17:47 Can you name this target_contaienr_ ?
flackr 2013/03/20 01:59:32 Done.
+
DISALLOW_COPY_AND_ASSIGN(ScopedWindowResizer);
};
@@ -78,16 +88,27 @@ ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer(
ToplevelWindowEventHandler* handler,
WindowResizer* resizer)
: handler_(handler),
- resizer_(resizer) {
+ resizer_(resizer),
+ extra_handler_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() &&
+ params.receiver->GetProperty(internal::kContinueDragAfterReparent)) {
+ params.receiver->SetProperty(internal::kContinueDragAfterReparent, false);
+ AddHandlers(params.new_parent);
+ }
+}
+
void ToplevelWindowEventHandler::ScopedWindowResizer::OnWindowPropertyChanged(
aura::Window* window,
const void* key,
@@ -103,11 +124,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_);
+ extra_handler_container_ = container;
+ }
+}
+
+void ToplevelWindowEventHandler::ScopedWindowResizer::RemoveHandlers() {
+ if (extra_handler_container_) {
+ extra_handler_container_->RemovePreTargetHandler(handler_);
+ extra_handler_container_->RemovePostTargetHandler(handler_);
+ extra_handler_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) {

Powered by Google App Engine
This is Rietveld 408576698