Index: ui/aura/window.cc |
diff --git a/ui/aura/window.cc b/ui/aura/window.cc |
index d1caa0416e6eab3ea3e35464644793eef6d29341..c10ef6a20fd883e509b63178e5123a68df6f6483 100644 |
--- a/ui/aura/window.cc |
+++ b/ui/aura/window.cc |
@@ -13,6 +13,7 @@ |
#include "ui/aura/event.h" |
#include "ui/aura/event_filter.h" |
#include "ui/aura/layout_manager.h" |
+#include "ui/aura/shadow.h" |
#include "ui/aura/window_delegate.h" |
#include "ui/aura/window_observer.h" |
#include "ui/aura/window_types.h" |
@@ -30,7 +31,8 @@ Window::Window(WindowDelegate* delegate) |
transient_parent_(NULL), |
id_(-1), |
user_data_(NULL), |
- stops_event_propagation_(false) { |
+ stops_event_propagation_(false), |
+ show_shadow_(false) { |
} |
Window::~Window() { |
@@ -74,6 +76,9 @@ void Window::Init(ui::Layer::LayerType layer_type) { |
layer_.reset(new ui::Layer(Desktop::GetInstance()->compositor(), layer_type)); |
layer_->SetVisible(false); |
layer_->set_delegate(this); |
+ |
+ if (show_shadow_) |
+ InitShadow(); |
} |
void Window::SetType(WindowType type) { |
@@ -190,6 +195,8 @@ void Window::MoveChildAbove(Window* child, Window* other) { |
// Reorder the layer. |
layer()->MoveAbove(child->layer(), other->layer()); |
+ if (child->shadow_.get()) |
+ layer()->MoveAbove(child->shadow_->layer(), other->layer()); |
// Move any transient children that share the same parent to be in front of |
// 'child'. |
@@ -214,7 +221,11 @@ void Window::AddChild(Window* child) { |
if (child->parent()) |
child->parent()->RemoveChild(child); |
child->parent_ = this; |
+ |
+ if (child->shadow_.get()) |
+ layer_->Add(child->shadow_->layer()); |
layer_->Add(child->layer_.get()); |
+ |
children_.push_back(child); |
if (layout_manager_.get()) |
layout_manager_->OnWindowAddedToLayout(child); |
@@ -250,6 +261,8 @@ void Window::RemoveChild(Window* child) { |
if (desktop) |
desktop->WindowDetachedFromDesktop(child); |
layer_->Remove(child->layer_.get()); |
+ if (child->shadow_.get()) |
+ layer_->Remove(child->shadow_->layer()); |
children_.erase(i); |
} |
@@ -405,6 +418,14 @@ int Window::GetIntProperty(const char* name) const { |
GetProperty(name))); |
} |
+void Window::SetShadowVisible(bool visible) { |
+ show_shadow_ = visible; |
+ if (visible && !shadow_.get() && layer()) |
+ InitShadow(); |
+ else if (shadow_.get()) |
+ shadow_->layer()->SetVisible(visible); |
+} |
+ |
Desktop* Window::GetDesktop() { |
return parent_ ? parent_->GetDesktop() : NULL; |
} |
@@ -418,6 +439,8 @@ void Window::SetBoundsInternal(const gfx::Rect& new_bounds) { |
// Always need to set the layer's bounds -- even if it is to the same thing. |
// This may cause important side effects such as stopping animation. |
layer_->SetBounds(new_bounds); |
+ if (shadow_.get()) |
+ shadow_->SetContentBounds(new_bounds); |
// If we're not changing the effective bounds, then we can bail early and skip |
// notifying our listeners. |
@@ -442,6 +465,10 @@ void Window::SetVisible(bool visible) { |
if (delegate_) |
delegate_->OnWindowVisibilityChanged(is_visible); |
} |
+ |
+ if (shadow_.get()) |
+ shadow_->layer()->SetVisible(show_shadow_ && visible); |
+ |
if (parent_ && parent_->layout_manager_.get()) |
parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); |
FOR_EACH_OBSERVER(WindowObserver, observers_, |
@@ -490,6 +517,25 @@ Window* Window::GetWindowForPoint(const gfx::Point& local_point, |
return delegate_ ? this : NULL; |
} |
+void Window::InitShadow() { |
+ DCHECK(layer()); |
+ |
+ shadow_.reset(new internal::Shadow()); |
+ shadow_->Init(); |
+ if (parent_) { |
+ // Stack the shadow directly below |layer_|. |
+ parent_->layer_->Add(shadow_->layer()); |
+ // TODO(derat): Add a MoveBelow() method and use that instead (although we |
+ // then run the risk of things getting stacked between a window and its |
+ // shadow). |
+ parent_->layer_->MoveAbove(shadow_->layer(), layer_.get()); |
+ parent_->layer_->MoveAbove(layer_.get(), shadow_->layer()); |
+ } |
+ |
+ shadow_->SetContentBounds(bounds()); |
+ shadow_->layer()->SetVisible(show_shadow_); |
+} |
+ |
void Window::OnPaintLayer(gfx::Canvas* canvas) { |
if (delegate_) |
delegate_->OnPaint(canvas); |