blob: 5b9345285fb95e4f592a6bd21427b3038dfd787f [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/desktop_background/desktop_background_widget_controller.h"
#include "ash/ash_export.h"
#include "ui/aura/root_window.h"
#include "ui/aura/window_property.h"
#include "ui/views/widget/widget.h"
// Exported for tests.
DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(
ASH_EXPORT, ash::internal::DesktopBackgroundWidgetController*);
DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(
ASH_EXPORT, ash::internal::AnimatingDesktopController*);
namespace ash {
namespace internal {
DEFINE_OWNED_WINDOW_PROPERTY_KEY(DesktopBackgroundWidgetController,
kDesktopController, NULL);
DEFINE_OWNED_WINDOW_PROPERTY_KEY(AnimatingDesktopController,
kAnimatingDesktopController, NULL);
DesktopBackgroundWidgetController::DesktopBackgroundWidgetController(
views::Widget* widget) : widget_(widget) {
DCHECK(widget_);
widget_->AddObserver(this);
}
DesktopBackgroundWidgetController::DesktopBackgroundWidgetController(
ui::Layer* layer) : widget_(NULL) {
layer_.reset(layer);
}
DesktopBackgroundWidgetController::~DesktopBackgroundWidgetController() {
if (widget_) {
widget_->RemoveObserver(this);
widget_->CloseNow();
widget_ = NULL;
} else if (layer_.get())
layer_.reset(NULL);
}
void DesktopBackgroundWidgetController::OnWidgetDestroying(
views::Widget* widget) {
widget_->RemoveObserver(this);
widget_ = NULL;
}
void DesktopBackgroundWidgetController::SetBounds(gfx::Rect bounds) {
if (widget_)
widget_->SetBounds(bounds);
else if (layer_.get())
layer_->SetBounds(bounds);
}
bool DesktopBackgroundWidgetController::Reparent(aura::RootWindow* root_window,
int src_container,
int dest_container) {
if (widget_) {
views::Widget::ReparentNativeView(widget_->GetNativeView(),
root_window->GetChildById(dest_container));
return true;
}
if (layer_.get()) {
ui::Layer* layer = layer_.get();
root_window->GetChildById(src_container)->layer()->Remove(layer);
root_window->GetChildById(dest_container)->layer()->Add(layer);
return true;
}
// Nothing to reparent.
return false;
}
AnimatingDesktopController::AnimatingDesktopController(
DesktopBackgroundWidgetController* component) {
controller_.reset(component);
}
AnimatingDesktopController::~AnimatingDesktopController() {
}
void AnimatingDesktopController::StopAnimating() {
if (controller_) {
ui::Layer* layer = controller_->layer() ? controller_->layer() :
controller_->widget()->GetNativeView()->layer();
layer->GetAnimator()->StopAnimating();
}
}
DesktopBackgroundWidgetController* AnimatingDesktopController::GetController(
bool pass_ownership) {
if (pass_ownership)
return controller_.release();
return controller_.get();
}
} // namespace internal
} // namespace ash