| Index: ui/views/desktop/desktop_window_manager.cc
|
| ===================================================================
|
| --- ui/views/desktop/desktop_window_manager.cc (revision 110826)
|
| +++ ui/views/desktop/desktop_window_manager.cc (working copy)
|
| @@ -1,305 +0,0 @@
|
| -// Copyright (c) 2011 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 "ui/views/desktop/desktop_window_manager.h"
|
| -
|
| -#include "ui/base/hit_test.h"
|
| -#include "ui/gfx/point.h"
|
| -#include "ui/gfx/rect.h"
|
| -#include "ui/views/events/event.h"
|
| -#include "ui/views/window/non_client_view.h"
|
| -#include "views/widget/native_widget_private.h"
|
| -#include "views/widget/native_widget_view.h"
|
| -#include "views/widget/native_widget_views.h"
|
| -#include "views/widget/widget_delegate.h"
|
| -
|
| -namespace {
|
| -
|
| -class MoveWindowController : public views::desktop::WindowController {
|
| - public:
|
| - MoveWindowController(views::Widget* widget, const gfx::Point& start)
|
| - : target_(widget),
|
| - offset_(start) {
|
| - }
|
| -
|
| - virtual ~MoveWindowController() {
|
| - }
|
| -
|
| - bool OnMouseEvent(const views::MouseEvent& event) {
|
| - if (event.type()== ui::ET_MOUSE_DRAGGED) {
|
| - gfx::Point origin = event.location().Subtract(offset_);
|
| - gfx::Rect rect = target_->GetWindowScreenBounds();
|
| - rect.set_origin(origin);
|
| - target_->SetBounds(rect);
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - private:
|
| - views::Widget* target_;
|
| - gfx::Point offset_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MoveWindowController);
|
| -};
|
| -
|
| -// Simple resize controller that handle all resize as if the bottom
|
| -// right corner is selected.
|
| -class ResizeWindowController : public views::desktop::WindowController {
|
| - public:
|
| - ResizeWindowController(views::Widget* widget)
|
| - : target_(widget) {
|
| - }
|
| -
|
| - virtual ~ResizeWindowController() {
|
| - }
|
| -
|
| - bool OnMouseEvent(const views::MouseEvent& event) OVERRIDE {
|
| - if (event.type()== ui::ET_MOUSE_DRAGGED) {
|
| - gfx::Point location = event.location();
|
| - gfx::Rect rect = target_->GetWindowScreenBounds();
|
| - gfx::Point size = location.Subtract(rect.origin());
|
| - target_->SetSize(gfx::Size(std::max(10, size.x()),
|
| - std::max(10, size.y())));
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - private:
|
| - views::Widget* target_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ResizeWindowController);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -namespace views {
|
| -namespace desktop {
|
| -
|
| -WindowController::WindowController() {
|
| -}
|
| -
|
| -WindowController::~WindowController() {
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// DesktopWindowManager, public:
|
| -
|
| -DesktopWindowManager::DesktopWindowManager(Widget* desktop)
|
| - : desktop_(desktop),
|
| - mouse_capture_(NULL),
|
| - active_widget_(NULL) {
|
| -}
|
| -
|
| -DesktopWindowManager::~DesktopWindowManager() {
|
| - DCHECK_EQ(0U, toplevels_.size()) << "Window manager getting destroyed "
|
| - << "before all the windows are closed.";
|
| -}
|
| -
|
| -void DesktopWindowManager::UpdateWindowsAfterScreenSizeChanged(
|
| - const gfx::Rect& new_size) {
|
| - for (std::vector<Widget*>::iterator i = toplevels_.begin();
|
| - i != toplevels_.end(); ++i) {
|
| - Widget* toplevel = *i;
|
| - if (!toplevel->IsMaximized())
|
| - continue;
|
| -
|
| - // If the window is maximized, then resize it!
|
| - toplevel->SetSize(new_size.size());
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// DesktopWindowManager, WindowManager implementation:
|
| -
|
| -void DesktopWindowManager::StartMoveDrag(
|
| - views::Widget* widget,
|
| - const gfx::Point& point) {
|
| - DCHECK(!window_controller_.get());
|
| - DCHECK(!HasMouseCapture());
|
| - if (!widget->IsMaximized() && !widget->IsMinimized()) {
|
| - gfx::Point new_point = point;
|
| - if (desktop_->non_client_view()) {
|
| - gfx::Rect client =
|
| - desktop_->non_client_view()->frame_view()->GetBoundsForClientView();
|
| - new_point.Offset(client.x(), client.y());
|
| - }
|
| - SetMouseCapture();
|
| - window_controller_.reset(new MoveWindowController(widget, new_point));
|
| - }
|
| -}
|
| -
|
| -void DesktopWindowManager::StartResizeDrag(
|
| - views::Widget* widget, const gfx::Point& point, int hittest_code) {
|
| - DCHECK(!window_controller_.get());
|
| - DCHECK(!HasMouseCapture());
|
| - if (!widget->IsMaximized() &&
|
| - !widget->IsMinimized() &&
|
| - (widget->widget_delegate() || widget->widget_delegate()->CanResize())) {
|
| - SetMouseCapture();
|
| - window_controller_.reset(new ResizeWindowController(widget));
|
| - }
|
| -}
|
| -
|
| -bool DesktopWindowManager::SetMouseCapture(views::Widget* widget) {
|
| - if (mouse_capture_)
|
| - return false;
|
| - if (mouse_capture_ == widget)
|
| - return true;
|
| - DCHECK(!HasMouseCapture());
|
| - SetMouseCapture();
|
| - mouse_capture_ = widget;
|
| - return true;
|
| -}
|
| -
|
| -bool DesktopWindowManager::ReleaseMouseCapture(views::Widget* widget) {
|
| - if (!widget || mouse_capture_ != widget)
|
| - return false;
|
| - DCHECK(HasMouseCapture());
|
| - ReleaseMouseCapture();
|
| - mouse_capture_ = NULL;
|
| - return true;
|
| -}
|
| -
|
| -bool DesktopWindowManager::HasMouseCapture(const views::Widget* widget) const {
|
| - return widget && mouse_capture_ == widget;
|
| -}
|
| -
|
| -bool DesktopWindowManager::HandleKeyEvent(
|
| - views::Widget* widget, const views::KeyEvent& event) {
|
| - return active_widget_ ?
|
| - static_cast<NativeWidgetViews*>(active_widget_->native_widget_private())
|
| - ->OnKeyEvent(event) : false;
|
| -}
|
| -
|
| -bool DesktopWindowManager::HandleMouseEvent(
|
| - views::Widget* widget, const views::MouseEvent& event) {
|
| - if (mouse_capture_) {
|
| - views::MouseEvent translated(event, widget->GetRootView(),
|
| - mouse_capture_->GetRootView());
|
| - mouse_capture_->OnMouseEvent(translated);
|
| - return true;
|
| - }
|
| -
|
| - if (event.type() == ui::ET_MOUSE_PRESSED)
|
| - ActivateWidgetAtLocation(widget, event.location());
|
| - else if (event.type() == ui::ET_MOUSEWHEEL && active_widget_)
|
| - return active_widget_->OnMouseEvent(event);
|
| -
|
| - if (window_controller_.get()) {
|
| - if (!window_controller_->OnMouseEvent(event)) {
|
| - ReleaseMouseCapture();
|
| - window_controller_.reset();
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -ui::TouchStatus DesktopWindowManager::HandleTouchEvent(Widget* widget,
|
| - const TouchEvent& event) {
|
| - // If there is a widget capturing mouse events, the widget should also receive
|
| - // touch events.
|
| - if (mouse_capture_) {
|
| - views::TouchEvent translated(event, widget->GetRootView(),
|
| - mouse_capture_->GetRootView());
|
| - return mouse_capture_->OnTouchEvent(translated);
|
| - }
|
| -
|
| - // If a touch event activates a Widget, let the event still go through to the
|
| - // activated Widget.
|
| - if (event.type() == ui::ET_TOUCH_PRESSED)
|
| - ActivateWidgetAtLocation(widget, event.location());
|
| - return ui::TOUCH_STATUS_UNKNOWN;
|
| -}
|
| -
|
| -void DesktopWindowManager::Register(Widget* widget) {
|
| - DCHECK(!widget->HasObserver(this));
|
| - if (widget->is_top_level())
|
| - toplevels_.push_back(widget);
|
| - widget->AddObserver(this);
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// DesktopWindowManager, private:
|
| -
|
| -void DesktopWindowManager::OnWidgetClosing(Widget* widget) {
|
| - if (active_widget_ && active_widget_ == widget)
|
| - active_widget_ = NULL;
|
| - if (widget->is_top_level()) {
|
| - for (std::vector<Widget*>::iterator i = toplevels_.begin();
|
| - i != toplevels_.end(); ++i) {
|
| - if (*i == widget) {
|
| - toplevels_.erase(i);
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -void DesktopWindowManager::OnWidgetVisibilityChanged(Widget* widget,
|
| - bool visible) {
|
| - // If there's no active Widget, then activate the first visible toplevel
|
| - // Widget.
|
| - if (widget->is_top_level() && widget->CanActivate() && visible &&
|
| - active_widget_ == NULL) {
|
| - Activate(widget);
|
| - }
|
| -}
|
| -
|
| -void DesktopWindowManager::OnWidgetActivationChanged(Widget* widget,
|
| - bool active) {
|
| - if (active) {
|
| - if (active_widget_)
|
| - active_widget_->Deactivate();
|
| - active_widget_ = widget;
|
| - } else if (widget == active_widget_) {
|
| - active_widget_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void DesktopWindowManager::SetMouseCapture() {
|
| - return desktop_->native_widget_private()->SetMouseCapture();
|
| -}
|
| -
|
| -void DesktopWindowManager::ReleaseMouseCapture() {
|
| - return desktop_->native_widget_private()->ReleaseMouseCapture();
|
| -}
|
| -
|
| -bool DesktopWindowManager::HasMouseCapture() const {
|
| - return desktop_->native_widget_private()->HasMouseCapture();
|
| -}
|
| -
|
| -void DesktopWindowManager::Activate(Widget* widget) {
|
| - if (widget && widget->IsActive())
|
| - return;
|
| -
|
| - if (widget) {
|
| - if (!widget->HasObserver(this))
|
| - widget->AddObserver(this);
|
| - widget->Activate();
|
| - }
|
| -}
|
| -
|
| -bool DesktopWindowManager::ActivateWidgetAtLocation(Widget* widget,
|
| - const gfx::Point& point) {
|
| - View* target = widget->GetRootView()->GetEventHandlerForPoint(point);
|
| -
|
| - if (target->GetClassName() == internal::NativeWidgetView::kViewClassName) {
|
| - internal::NativeWidgetView* native_widget_view =
|
| - static_cast<internal::NativeWidgetView*>(target);
|
| - views::Widget* target_widget = native_widget_view->GetAssociatedWidget();
|
| - if (!target_widget->IsActive() && target_widget->CanActivate()) {
|
| - Activate(target_widget);
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -} // namespace desktop
|
| -} // namespace views
|
|
|