15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/default_theme_provider.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_font_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager_factory.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/widget_focus_manager.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_private.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/tooltip_manager.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget_deletion_observer.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_observer.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/custom_frame_view.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_controller.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |view| has a layer the layer is added to |layers|. Else this recurses
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// through the children. This is used to build a list of the layers created by
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views that are direct children of the Widgets layer.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BuildRootLayers(View* view, std::vector<ui::Layer*>* layers) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view->layer()) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layers->push_back(view->layer());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < view->child_count(); ++i)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BuildRootLayers(view->child_at(i), layers);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a native widget implementation.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// First, use the supplied one if non-NULL.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finally, make a default one.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidget* CreateNativeWidget(NativeWidget* native_widget,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 internal::NativeWidgetDelegate* delegate) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_widget) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    native_widget =
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        internal::NativeWidgetPrivate::CreateNativeWidget(delegate);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A default implementation of WidgetDelegate, used by Widget when no
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WidgetDelegate is supplied.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultWidgetDelegate : public WidgetDelegate {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DefaultWidgetDelegate(Widget* widget, const Widget::InitParams& params)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : widget_(widget),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        can_activate_(!params.child &&
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      params.type != Widget::InitParams::TYPE_POPUP) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DefaultWidgetDelegate() {}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from WidgetDelegate:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteDelegate() OVERRIDE {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Widget* GetWidget() OVERRIDE {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return widget_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const Widget* GetWidget() const OVERRIDE {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return widget_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanActivate() const OVERRIDE {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return can_activate_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Widget* widget_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_activate_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultWidgetDelegate);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, InitParams:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::InitParams::InitParams()
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type(TYPE_WINDOW),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate(NULL),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child(false),
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      opacity((ViewsDelegate::views_delegate &&
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               ViewsDelegate::views_delegate->UseTransparentWindows()) ?
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              TRANSLUCENT_WINDOW : INFER_OPACITY),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      accept_events(true),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_activate(true),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keep_on_top(false),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership(NATIVE_WIDGET_OWNS_WIDGET),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mirror_origin_in_rtl(false),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_dropshadow(false),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_standard_frame(false),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      use_system_default_icon(false),
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_state(ui::SHOW_STATE_DEFAULT),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double_buffer(false),
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent(NULL),
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget(NULL),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      desktop_root_window_host(NULL),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      top_level(false),
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_type(ui::LAYER_TEXTURED),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context(NULL) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::InitParams::InitParams(Type type)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type(type),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate(NULL),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child(type == TYPE_CONTROL),
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      opacity(((type == TYPE_WINDOW || type == TYPE_PANEL) &&
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               ViewsDelegate::views_delegate &&
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               ViewsDelegate::views_delegate->UseTransparentWindows()) ?
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              TRANSLUCENT_WINDOW : INFER_OPACITY),
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      accept_events(true),
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_activate(type != TYPE_POPUP && type != TYPE_MENU),
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keep_on_top(type == TYPE_MENU),
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership(NATIVE_WIDGET_OWNS_WIDGET),
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mirror_origin_in_rtl(false),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_dropshadow(false),
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_standard_frame(false),
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      use_system_default_icon(false),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_state(ui::SHOW_STATE_DEFAULT),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double_buffer(false),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent(NULL),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget(NULL),
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      desktop_root_window_host(NULL),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      top_level(false),
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_type(ui::LAYER_TEXTURED),
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      context(NULL) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, public:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::Widget()
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : native_widget_(NULL),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_delegate_(NULL),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_client_view_(NULL),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dragged_view_(NULL),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_secondary_widget_(true),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_type_(FRAME_TYPE_DEFAULT),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      disable_inactive_rendering_(false),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_closed_(false),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      saved_show_state_(ui::SHOW_STATE_DEFAULT),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      focus_on_creation_(true),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_top_level_(false),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_initialized_(false),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_destroyed_(false),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_mouse_button_pressed_(false),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_touch_down_(false),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_was_move_(false),
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_layers_dirty_(false),
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      movement_disabled_(false) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::~Widget() {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DestroyRootView();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete native_widget_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(native_widget_destroyed_)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Destroying a widget with a live native widget. "
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Widget probably should use WIDGET_OWNS_NATIVE_WIDGET ownership.";
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::CreateWindow(WidgetDelegate* delegate) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CreateWindowWithBounds(delegate, gfx::Rect());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithBounds(WidgetDelegate* delegate,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const gfx::Rect& bounds) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* widget = new Widget;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget::InitParams params;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = bounds;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.delegate = delegate;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.top_level = true;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return widget;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       gfx::NativeWindow parent) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CreateWindowWithParentAndBounds(delegate, parent, gfx::Rect());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::CreateWindowWithParentAndBounds(WidgetDelegate* delegate,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                gfx::NativeWindow parent,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const gfx::Rect& bounds) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Widget* widget = new Widget;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Widget::InitParams params;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.delegate = delegate;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.parent = parent;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = bounds;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return widget;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithContext(WidgetDelegate* delegate,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        gfx::NativeView context) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CreateWindowWithContextAndBounds(delegate, context, gfx::Rect());
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithContextAndBounds(WidgetDelegate* delegate,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 gfx::NativeView context,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 const gfx::Rect& bounds) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* widget = new Widget;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget::InitParams params;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.delegate = delegate;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = context;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.bounds = bounds;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetWidgetForNativeView(gfx::NativeView native_view) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::NativeWidgetPrivate* native_widget =
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::NativeWidgetPrivate::GetNativeWidgetForNativeView(native_view);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget ? native_widget->GetWidget() : NULL;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetWidgetForNativeWindow(gfx::NativeWindow native_window) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::NativeWidgetPrivate* native_widget =
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::NativeWidgetPrivate::GetNativeWidgetForNativeWindow(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          native_window);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget ? native_widget->GetWidget() : NULL;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetTopLevelWidgetForNativeView(gfx::NativeView native_view) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::NativeWidgetPrivate* native_widget =
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internal::NativeWidgetPrivate::GetTopLevelNativeWidget(native_view);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget ? native_widget->GetWidget() : NULL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::GetAllChildWidgets(gfx::NativeView native_view,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Widgets* children) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::NativeWidgetPrivate::GetAllChildWidgets(native_view, children);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ReparentNativeView(gfx::NativeView native_view,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                gfx::NativeView new_parent) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::NativeWidgetPrivate::ReparentNativeView(native_view, new_parent);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Widget::GetLocalizedContentsWidth(int col_resource_id) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::GetLocalizedContentsWidthForFont(col_resource_id,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Widget::GetLocalizedContentsHeight(int row_resource_id) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::GetLocalizedContentsHeightForFont(row_resource_id,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size Widget::GetLocalizedContentsSize(int col_resource_id,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int row_resource_id) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(GetLocalizedContentsWidth(col_resource_id),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   GetLocalizedContentsHeight(row_resource_id));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::RequiresNonClientView(InitParams::Type type) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type == InitParams::TYPE_WINDOW ||
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         type == InitParams::TYPE_PANEL ||
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         type == InitParams::TYPE_BUBBLE;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::Init(const InitParams& in_params) {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("views", "Widget::Init");
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitParams params = in_params;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_top_level_ = params.top_level ||
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (!params.child &&
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       params.type != InitParams::TYPE_CONTROL &&
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       params.type != InitParams::TYPE_TOOLTIP);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.top_level = is_top_level_;
315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (params.opacity == InitParams::INFER_OPACITY) {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // By default, make all top-level windows but the main window transparent
318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // initially so that they can be made to fade in.
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (is_top_level_ && params.type != InitParams::TYPE_WINDOW)
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      params.opacity = InitParams::TRANSLUCENT_WINDOW;
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      params.opacity = InitParams::OPAQUE_WINDOW;
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    params.opacity = InitParams::OPAQUE_WINDOW;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ViewsDelegate::views_delegate)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ViewsDelegate::views_delegate->OnBeforeWidgetInit(&params, this);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_ = params.delegate ?
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.delegate : new DefaultWidgetDelegate(this, params);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ownership_ = params.ownership;
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  native_widget_ = CreateNativeWidget(params.native_widget, this)->
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   AsNativeWidgetPrivate();
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_view_.reset(CreateRootView());
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  default_theme_provider_.reset(new ui::DefaultThemeProvider);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params.type == InitParams::TYPE_MENU) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_mouse_button_pressed_ =
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        internal::NativeWidgetPrivate::IsMouseButtonDown();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->InitNativeWidget(params);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (RequiresNonClientView(params.type)) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_ = new NonClientView;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_->SetFrameView(CreateNonClientFrameView());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create the ClientView, add it to the NonClientView and add the
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NonClientView to the RootView. This will cause everything to be parented.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_->set_client_view(widget_delegate_->CreateClientView(this));
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    non_client_view_->SetOverlayView(widget_delegate_->CreateOverlayView());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentsView(non_client_view_);
3512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // Initialize the window's title before setting the window's initial bounds;
3522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    // the frame view's preferred height may depend on the presence of a title.
3532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    UpdateWindowTitle();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInitialBounds(params.bounds);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (params.show_state == ui::SHOW_STATE_MAXIMIZED)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Maximize();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (params.show_state == ui::SHOW_STATE_MINIMIZED)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Minimize();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (params.delegate) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetContentsView(params.delegate->GetContentsView());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInitialBoundsForFramelessWindow(params.bounds);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_initialized_ = true;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unconverted methods (see header) --------------------------------------------
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView Widget::GetNativeView() const {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetNativeView();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow Widget::GetNativeWindow() const {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetNativeWindow();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::AddObserver(WidgetObserver* observer) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(observer);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::RemoveObserver(WidgetObserver* observer) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.RemoveObserver(observer);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasObserver(WidgetObserver* observer) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return observers_.HasObserver(observer);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void Widget::ViewHierarchyChanged(
393a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const View::ViewHierarchyChangedDetails& details) {
394a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!details.is_add) {
395a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (details.child == dragged_view_)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dragged_view_ = NULL;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FocusManager* focus_manager = GetFocusManager();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (focus_manager)
399a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      focus_manager->ViewRemoved(details.child);
400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ViewStorage::GetInstance()->ViewRemoved(details.child);
401a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    native_widget_->ViewRemoved(details.child);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::NotifyNativeViewHierarchyChanged(bool attached,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              gfx::NativeView native_view) {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!attached) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FocusManager* focus_manager = GetFocusManager();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We are being removed from a window hierarchy.  Treat this as
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the root_view_ being removed.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (focus_manager)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      focus_manager->ViewRemoved(root_view_.get());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->NotifyNativeViewHierarchyChanged(attached, native_view);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converted methods (see header) ----------------------------------------------
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetTopLevelWidget() {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return const_cast<Widget*>(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const Widget*>(this)->GetTopLevelWidget());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* Widget::GetTopLevelWidget() const {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetTopLevelNativeWidget doesn't work during destruction because
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // property is gone after gobject gets deleted. Short circuit here
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for toplevel so that InputMethod can remove itself from
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // focus manager.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_top_level() ? this : native_widget_->GetTopLevelWidget();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetContentsView(View* view) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not SetContentsView() again if it is already set to the same view.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view == GetContentsView())
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->SetContentsView(view);
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (non_client_view_ != view) {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |non_client_view_| can only be non-NULL here if RequiresNonClientView()
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // was true when the widget was initialized. Creating widgets with non
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // client views and then setting the contents view can cause subtle
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // problems on Windows, where the native widget thinks there is still a
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |non_client_view_|. If you get this error, either use a different type
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // when initializing the widget, or don't call SetContentsView().
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!non_client_view_);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_ = NULL;
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetContentsView() {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_view_->GetContentsView();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetWindowBoundsInScreen() const {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetWindowBoundsInScreen();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetClientAreaBoundsInScreen() const {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetClientAreaBoundsInScreen();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetRestoredBounds() const {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetRestoredBounds();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetBounds(const gfx::Rect& bounds) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetBounds(bounds);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetSize(const gfx::Size& size) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetSize(size);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::CenterWindow(const gfx::Size& size) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->CenterWindow(size);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetBoundsConstrained(const gfx::Rect& bounds) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area =
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetDisplayNearestPoint(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bounds.origin()).work_area();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (work_area.IsEmpty()) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetBounds(bounds);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inset the work area slightly.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_area.Inset(10, 10, 10, 10);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_area.AdjustToFit(bounds);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetBounds(work_area);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetVisibilityChangedAnimationsEnabled(bool value) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetVisibilityChangedAnimationsEnabled(value);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget::MoveLoopResult Widget::RunMoveLoop(const gfx::Vector2d& drag_offset,
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           MoveLoopSource source) {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return native_widget_->RunMoveLoop(drag_offset, source);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::EndMoveLoop() {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->EndMoveLoop();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackAboveWidget(Widget* widget) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->StackAbove(widget->GetNativeView());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackAbove(gfx::NativeView native_view) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->StackAbove(native_view);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackAtTop() {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->StackAtTop();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackBelow(gfx::NativeView native_view) {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->StackBelow(native_view);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetShape(gfx::NativeRegion shape) {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetShape(shape);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Close() {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (widget_closed_) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // It appears we can hit this code path if you close a modal dialog then
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // close the last browser before the destructor is hit, which triggers
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // invoking Close again.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_close = true;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (non_client_view_)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    can_close = non_client_view_->CanClose();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (can_close) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SaveWindowPlacement();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // During tear-down the top-level focus manager becomes unavailable to
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GTK tabbed panes and their children, so normal deregistration via
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |FormManager::ViewRemoved()| calls are fouled.  We clear focus here
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to avoid these redundant steps and to avoid accessing deleted views
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that may have been in focus.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_top_level() && focus_manager_.get())
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      focus_manager_->SetFocusedView(NULL);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetClosing(this));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    native_widget_->Close();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_closed_ = true;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::CloseNow() {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetClosing(this));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->CloseNow();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool Widget::IsClosed() const {
5587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return widget_closed_;
5597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Show() {
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("views", "Widget::Show");
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (non_client_view_) {
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // On the Mac the FullScreenBookmarkBar test is different then for any other
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // OS. Since the new maximize logic from ash does not apply to the mac, we
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // continue to ignore the fullscreen mode here.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED &&
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !initial_restored_bounds_.IsEmpty()) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_->ShowWithWindowState(saved_show_state_);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // While initializing, the kiosk mode will go to full screen before the
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // widget gets shown. In that case we stay in full screen mode, regardless
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // of the |saved_show_state_| member.
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED &&
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !initial_restored_bounds_.IsEmpty() &&
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !IsFullscreen()) {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_);
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      native_widget_->ShowWithWindowState(
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IsFullscreen() ? ui::SHOW_STATE_FULLSCREEN : saved_show_state_);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |saved_show_state_| only applies the first time the window is shown.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we don't reset the value the window may be shown maximized every time
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it is subsequently shown after being hidden.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    saved_show_state_ = ui::SHOW_STATE_NORMAL;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    native_widget_->Show();
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Hide() {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->Hide();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ShowInactive() {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this gets called with saved_show_state_ == ui::SHOW_STATE_MAXIMIZED,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call SetBounds()with the restored bounds to set the correct size. This
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normally should not happen, but if it does we should avoid showing unsized
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // windows.
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED &&
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !initial_restored_bounds_.IsEmpty()) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetBounds(initial_restored_bounds_);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    saved_show_state_ = ui::SHOW_STATE_NORMAL;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->ShowWithWindowState(ui::SHOW_STATE_INACTIVE);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Activate() {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->Activate();
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Deactivate() {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->Deactivate();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsActive() const {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->IsActive();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::DisableInactiveRendering() {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetInactiveRenderingDisabled(true);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetAlwaysOnTop(bool on_top) {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetAlwaysOnTop(on_top);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Maximize() {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->Maximize();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Minimize() {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->Minimize();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Restore() {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->Restore();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsMaximized() const {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->IsMaximized();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsMinimized() const {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->IsMinimized();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetFullscreen(bool fullscreen) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetFullscreen(fullscreen);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsFullscreen() const {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->IsFullscreen();
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetOpacity(unsigned char opacity) {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetOpacity(opacity);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetUseDragFrame(bool use_drag_frame) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetUseDragFrame(use_drag_frame);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::FlashFrame(bool flash) {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->FlashFrame(flash);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetRootView() {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_view_.get();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const View* Widget::GetRootView() const {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_view_.get();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsVisible() const {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->IsVisible();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ThemeProvider* Widget::GetThemeProvider() const {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Widget* root_widget = GetTopLevelWidget();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_widget && root_widget != this) {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Attempt to get the theme provider, and fall back to the default theme
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // provider if not found.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ThemeProvider* provider = root_widget->GetThemeProvider();
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (provider)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return provider;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider = root_widget->default_theme_provider_.get();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (provider)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return provider;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_theme_provider_.get();
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::NativeTheme* Widget::GetNativeTheme() const {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetNativeTheme();
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusManager* Widget::GetFocusManager() {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Widget* toplevel_widget = GetTopLevelWidget();
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return toplevel_widget ? toplevel_widget->focus_manager_.get() : NULL;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FocusManager* Widget::GetFocusManager() const {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Widget* toplevel_widget = GetTopLevelWidget();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return toplevel_widget ? toplevel_widget->focus_manager_.get() : NULL;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputMethod* Widget::GetInputMethod() {
716ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return const_cast<InputMethod*>(
717ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const_cast<const Widget*>(this)->GetInputMethod());
718ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
719ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
720ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst InputMethod* Widget::GetInputMethod() const {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_top_level()) {
722ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!input_method_.get())
723ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      input_method_ = const_cast<Widget*>(this)->CreateInputMethod().Pass();
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return input_method_.get();
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
726ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const Widget* toplevel = GetTopLevelWidget();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If GetTopLevelWidget() returns itself which is not toplevel,
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the widget is detached from toplevel widget.
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(oshima): Fix GetTopLevelWidget() to return NULL
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if there is no toplevel. We probably need to add GetTopMostWidget()
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to replace some use cases.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (toplevel && toplevel != this) ? toplevel->GetInputMethod() : NULL;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::RunShellDrag(View* view,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const ui::OSExchangeData& data,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Point& location,
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int operation,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ui::DragDropTypes::DragEventSource source) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dragged_view_ = view;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->RunShellDrag(view, data, location, operation, source);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the view is removed during the drag operation, dragged_view_ is set to
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL.
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view && dragged_view_ == view) {
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dragged_view_ = NULL;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view->OnDragDone();
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SchedulePaintInRect(const gfx::Rect& rect) {
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SchedulePaintInRect(rect);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetCursor(gfx::NativeCursor cursor) {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetCursor(cursor);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool Widget::IsMouseEventsEnabled() const {
7607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return native_widget_->IsMouseEventsEnabled();
7617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetNativeWindowProperty(const char* name, void* value) {
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetNativeWindowProperty(name, value);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* Widget::GetNativeWindowProperty(const char* name) const {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetNativeWindowProperty(name);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::UpdateWindowTitle() {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!non_client_view_)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the native frame's text. We do this regardless of whether or not
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the native frame is being used, since this also updates the taskbar, etc.
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 window_title = widget_delegate_->GetWindowTitle();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::i18n::AdjustStringForLocaleDirection(&window_title);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetWindowTitle(window_title);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non_client_view_->UpdateWindowTitle();
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the non-client view is rendering its own title, it'll need to relayout
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // now and to get a paint update later on.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non_client_view_->Layout();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::UpdateWindowIcon() {
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (non_client_view_)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_->UpdateWindowIcon();
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetWindowIcons(widget_delegate_->GetWindowIcon(),
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 widget_delegate_->GetWindowAppIcon());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusTraversable* Widget::GetFocusTraversable() {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<internal::RootView*>(root_view_.get());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ThemeChanged() {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->ThemeChanged();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::LocaleChanged() {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->LocaleChanged();
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetFocusTraversableParent(FocusTraversable* parent) {
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->SetFocusTraversableParent(parent);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetFocusTraversableParentView(View* parent_view) {
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->SetFocusTraversableParentView(parent_view);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ClearNativeFocus() {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->ClearNativeFocus();
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NonClientFrameView* Widget::CreateNonClientFrameView() {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NonClientFrameView* frame_view =
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_delegate_->CreateNonClientFrameView(this);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!frame_view)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_view = native_widget_->CreateNonClientFrameView();
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!frame_view && ViewsDelegate::views_delegate) {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_view =
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ViewsDelegate::views_delegate->CreateDefaultNonClientFrameView(this);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_view)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return frame_view;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CustomFrameView* custom_frame_view = new CustomFrameView;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  custom_frame_view->Init(this);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return custom_frame_view;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ShouldUseNativeFrame() const {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_type_ != FRAME_TYPE_DEFAULT)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return frame_type_ == FRAME_TYPE_FORCE_NATIVE;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->ShouldUseNativeFrame();
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::DebugToggleFrameType() {
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_type_ == FRAME_TYPE_DEFAULT) {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_type_ = ShouldUseNativeFrame() ? FRAME_TYPE_FORCE_CUSTOM :
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FRAME_TYPE_FORCE_NATIVE;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_type_ = frame_type_ == FRAME_TYPE_FORCE_CUSTOM ?
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FRAME_TYPE_FORCE_NATIVE : FRAME_TYPE_FORCE_CUSTOM;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FrameTypeChanged();
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::FrameTypeChanged() {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->FrameTypeChanged();
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Compositor* Widget::GetCompositor() const {
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetCompositor();
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::Compositor* Widget::GetCompositor() {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetCompositor();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::Layer* Widget::GetLayer() {
86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return native_widget_->GetLayer();
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void Widget::ReorderNativeViews() {
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  native_widget_->ReorderNativeViews();
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::UpdateRootLayers() {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculate the layers requires traversing the tree, and since nearly any
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mutation of the tree can trigger this call we delay until absolutely
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // necessary.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_layers_dirty_ = true;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NativeWidget* Widget::native_widget() const {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidget* Widget::native_widget() {
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetCapture(View* view) {
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internal::NativeWidgetPrivate::IsMouseButtonDown())
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_mouse_button_pressed_ = true;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internal::NativeWidgetPrivate::IsTouchDown())
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_touch_down_ = true;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->SetMouseHandler(view);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_widget_->HasCapture())
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    native_widget_->SetCapture();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ReleaseCapture() {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_widget_->HasCapture())
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    native_widget_->ReleaseCapture();
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasCapture() {
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->HasCapture();
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::TooltipTextChanged(View* view) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TooltipManager* manager = native_widget_private()->GetTooltipManager();
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->TooltipTextChanged(view);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::SetInitialFocus() {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v = widget_delegate_->GetInitiallyFocusedView();
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!focus_on_creation_) {
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If not focusing the window now, tell the focus manager which view to
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // focus when the window is restored.
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (v)
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      focus_manager_->SetStoredFocusView(v);
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v->RequestFocus();
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!v;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetChildViewParent() {
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentsView() ? GetContentsView() : GetRootView();
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetWorkAreaBoundsInScreen() const {
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_->GetWorkAreaBoundsInScreen();
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Widget::SynthesizeMouseMoveEvent() {
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  last_mouse_event_was_move_ = false;
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui::MouseEvent mouse_event(ui::ET_MOUSE_MOVED,
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             last_mouse_event_position_,
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             last_mouse_event_position_,
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             ui::EF_IS_SYNTHESIZED);
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_view_->OnMouseMoved(mouse_event);
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnOwnerClosing() {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, NativeWidgetDelegate implementation:
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsModal() const {
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_delegate_->GetModalType() != ui::MODAL_TYPE_NONE;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsDialogBox() const {
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!widget_delegate_->AsDialogDelegate();
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::CanActivate() const {
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_delegate_->CanActivate();
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsInactiveRenderingDisabled() const {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return disable_inactive_rendering_;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::EnableInactiveRendering() {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetInactiveRenderingDisabled(false);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetActivationChanged(bool active) {
970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // On windows we may end up here before we've completed initialization (from
971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // an WM_NCACTIVATE). If that happens the WidgetDelegate likely doesn't know
972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the Widget and will crash attempting to access it.
973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!active && native_widget_initialized_)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SaveWindowPlacement();
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_,
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    OnWidgetActivationChanged(this, active));
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeFocus(gfx::NativeView old_focused_view) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(old_focused_view,
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        GetNativeView());
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeBlur(gfx::NativeView new_focused_view) {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(GetNativeView(),
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        new_focused_view);
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetVisibilityChanged(bool visible) {
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* root = GetRootView();
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (root)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root->PropagateVisibilityNotifications(root, visible);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_,
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    OnWidgetVisibilityChanged(this, visible));
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetCompositor() && root && root->layer())
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->layer()->SetVisible(visible);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void Widget::OnNativeWidgetCreated(bool desktop_widget) {
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_top_level())
1002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    focus_manager_.reset(FocusManagerFactory::Create(this, desktop_widget));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->InitModalType(widget_delegate_->GetModalType());
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetCreated(this));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetDestroying() {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the focus manager (if any) that root_view is being removed
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in case that the focused view is under this root view.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetFocusManager())
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetFocusManager()->ViewRemoved(root_view_.get());
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetDestroying(this));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (non_client_view_)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_->WindowClosing();
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->WindowClosing();
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetDestroyed() {
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetDestroyed(this));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->DeleteDelegate();
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_ = NULL;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_destroyed_ = true;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size Widget::GetMinimumSize() {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return non_client_view_ ? non_client_view_->GetMinimumSize() : gfx::Size();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size Widget::GetMaximumSize() {
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return non_client_view_ ? non_client_view_->GetMaximumSize() : gfx::Size();
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetMove() {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->OnWidgetMove();
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged(
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this,
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBoundsInScreen()));
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_->SetSize(new_size);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size changed notifications can fire prior to full initialization
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // i.e. during session restore.  Avoid saving session state during these
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // startup procedures.
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_widget_initialized_)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SaveWindowPlacement();
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged(
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this,
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetWindowBoundsInScreen()));
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetBeginUserBoundsChange() {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->OnWindowBeginUserBoundsChange();
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetEndUserBoundsChange() {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->OnWindowEndUserBoundsChange();
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasFocusManager() const {
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!focus_manager_.get();
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::OnNativeWidgetPaintAccelerated(const gfx::Rect& dirty_region) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Compositor* compositor = GetCompositor();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!compositor)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  compositor->ScheduleRedrawRect(dirty_region);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetPaint(gfx::Canvas* canvas) {
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // On Linux Aura, we can get here during Init() because of the
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetInitialBounds call.
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (native_widget_initialized_)
1081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GetRootView()->Paint(canvas);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Widget::GetNonClientComponent(const gfx::Point& point) {
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int component = non_client_view_ ?
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_client_view_->NonClientHitTest(point) :
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HTNOWHERE;
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (movement_disabled_ && (component == HTCAPTION || component == HTSYSMENU))
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return HTNOWHERE;
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return component;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnKeyEvent(ui::KeyEvent* event) {
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<internal::RootView*>(GetRootView())->
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DispatchKeyEvent(event);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnMouseEvent(ui::MouseEvent* event) {
11017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!IsMouseEventsEnabled())
11027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
11037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* root_view = GetRootView();
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (event->type()) {
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_MOUSE_PRESSED: {
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_was_move_ = false;
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // We may get deleted by the time we return from OnMousePressed. So we
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // use an observer to make sure we are still alive.
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      WidgetDeletionObserver widget_deletion_observer(this);
11127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Make sure we're still visible before we attempt capture as the mouse
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // press processing may have made the window hide (as happens with menus).
11157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
11167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // It is possible for a View to show a context menu on mouse-press. Since
11177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // the menu does a capture and starts a nested message-loop, the release
11187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // would go to the menu. The next click (i.e. both mouse-press and release
11197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // events) also go to the menu. The menu (and the nested message-loop)
11207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // gets closed after this second release event. The code then resumes from
11217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // here. So make sure that the mouse-button is still down before doing a
11227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // capture.
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (root_view && root_view->OnMousePressed(*event) &&
11247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          widget_deletion_observer.IsWidgetAlive() && IsVisible() &&
11257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          internal::NativeWidgetPrivate::IsMouseButtonDown()) {
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_mouse_button_pressed_ = true;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!native_widget_->HasCapture())
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          native_widget_->SetCapture();
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event->SetHandled();
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_RELEASED:
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_was_move_ = false;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_mouse_button_pressed_ = false;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Release capture first, to avoid confusion if OnMouseReleased blocks.
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (native_widget_->HasCapture() &&
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ShouldReleaseCaptureOnMouseReleased()) {
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        native_widget_->ReleaseCapture();
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (root_view)
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root_view->OnMouseReleased(*event);
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if ((event->flags() & ui::EF_IS_NON_CLIENT) == 0)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event->SetHandled();
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED:
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_DRAGGED:
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (native_widget_->HasCapture() && is_mouse_button_pressed_) {
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_mouse_event_was_move_ = false;
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (root_view)
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          root_view->OnMouseDragged(*event);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (!last_mouse_event_was_move_ ||
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 last_mouse_event_position_ != event->location()) {
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        last_mouse_event_position_ = event->location();
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_mouse_event_was_move_ = true;
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (root_view)
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          root_view->OnMouseMoved(*event);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_EXITED:
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_was_move_ = false;
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (root_view)
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root_view->OnMouseExited(*event);
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSEWHEEL:
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (root_view && root_view->OnMouseWheel(
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          static_cast<const ui::MouseWheelEvent&>(*event)))
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event->SetHandled();
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnMouseCaptureLost() {
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_mouse_button_pressed_ || is_touch_down_) {
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    View* root_view = GetRootView();
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (root_view)
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_view->OnMouseCaptureLost();
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_touch_down_ = false;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_mouse_button_pressed_ = false;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnTouchEvent(ui::TouchEvent* event) {
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<internal::RootView*>(GetRootView())->
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DispatchTouchEvent(event);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnScrollEvent(ui::ScrollEvent* event) {
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<internal::RootView*>(GetRootView())->
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DispatchScrollEvent(event);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnGestureEvent(ui::GestureEvent* event) {
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_TAP_DOWN:
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_touch_down_ = true;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We explicitly don't capture here. Not capturing enables multiple
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // widgets to get tap events at the same time. Views (such as tab
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // dragging) may explicitly capture.
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_GESTURE_END:
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event->details().touch_points() == 1) {
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_touch_down_ = false;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ShouldReleaseCaptureOnMouseReleased())
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ReleaseCapture();
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<internal::RootView*>(GetRootView())->DispatchGestureEvent(event);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ExecuteCommand(int command_id) {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_delegate_->ExecuteWindowsCommand(command_id);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputMethod* Widget::GetInputMethodDirect() {
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input_method_.get();
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::vector<ui::Layer*>& Widget::GetRootLayers() {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layers_dirty_) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_layers_dirty_ = false;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_layers_.clear();
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildRootLayers(GetRootView(), &root_layers_);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_layers_;
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasHitTestMask() const {
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_delegate_->WidgetHasHitTestMask();
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::GetHitTestMask(gfx::Path* mask) const {
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(mask);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->GetWidgetHitTestMask(mask);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::AsWidget() {
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* Widget::AsWidget() const {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, FocusTraversable implementation:
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusSearch* Widget::GetFocusSearch() {
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_view_->GetFocusSearch();
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusTraversable* Widget::GetFocusTraversableParent() {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are a proxy to the root view, so we should be bypassed when traversing
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // up and as a result this should not be called.
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetFocusTraversableParentView() {
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are a proxy to the root view, so we should be bypassed when traversing
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // up and as a result this should not be called.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, protected:
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::RootView* Widget::CreateRootView() {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new internal::RootView(this);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::DestroyRootView() {
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non_client_view_ = NULL;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_view_.reset();
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Input method has to be destroyed before focus manager.
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method_.reset();
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, private:
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ShouldReleaseCaptureOnMouseReleased() const {
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetInactiveRenderingDisabled(bool value) {
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (value == disable_inactive_rendering_)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disable_inactive_rendering_ = value;
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (non_client_view_)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_client_view_->SetInactiveRenderingDisabled(value);
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->SetInactiveRenderingDisabled(value);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SaveWindowPlacement() {
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The window delegate does the actual saving for us. It seems like (judging
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by go/crash) that in some circumstances we can end up here after
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WM_DESTROY, at which point the window delegate is likely gone. So just
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bail.
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!widget_delegate_)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_->GetWindowPlacement(&bounds, &show_state);
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_delegate_->SaveWindowPlacement(bounds, show_state);
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetInitialBounds(const gfx::Rect& bounds) {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!non_client_view_)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect saved_bounds;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetSavedWindowPlacement(&saved_bounds, &saved_show_state_)) {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED) {
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If we're going to maximize, wait until Show is invoked to set the
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // bounds. That way we avoid a noticeable resize.
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      initial_restored_bounds_ = saved_bounds;
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (!saved_bounds.IsEmpty()) {
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If the saved bounds are valid, use them.
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetBounds(saved_bounds);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bounds.IsEmpty()) {
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // No initial bounds supplied, so size the window to its content and
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // center over its parent.
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_->CenterWindow(non_client_view_->GetPreferredSize());
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Use the supplied initial bounds.
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetBoundsConstrained(bounds);
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetInitialBoundsForFramelessWindow(const gfx::Rect& bounds) {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bounds.IsEmpty()) {
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* contents_view = GetContentsView();
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(contents_view);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No initial bounds supplied, so size the window to its content and
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // center over its parent if preferred size is provided.
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size size = contents_view->GetPreferredSize();
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!size.IsEmpty())
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_->CenterWindow(size);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use the supplied initial bounds.
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetBoundsConstrained(bounds);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::GetSavedWindowPlacement(gfx::Rect* bounds,
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ui::WindowShowState* show_state) {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First we obtain the window's saved show-style and store it. We need to do
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this here, rather than in Show() because by the time Show() is called,
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the window's size will have been reset (below) and the saved maximized
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state will have been lost. Sadly there's no way to tell on Windows when
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a window is restored from maximized state, so we can't more accurately
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // track maximized state independently of sizing information.
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the window's placement from the controller.
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (widget_delegate_->GetSavedWindowPlacement(bounds, show_state)) {
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!widget_delegate_->ShouldRestoreWindowSize()) {
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bounds->set_size(non_client_view_->GetPreferredSize());
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Size minimum_size = GetMinimumSize();
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Make sure the bounds are at least the minimum size.
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (bounds->width() < minimum_size.width())
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bounds->set_width(minimum_size.width());
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (bounds->height() < minimum_size.height())
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bounds->set_height(minimum_size.height());
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochscoped_ptr<InputMethod> Widget::CreateInputMethod() {
1388ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<InputMethod> input_method(native_widget_->CreateInputMethod());
1389ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (input_method.get())
1390ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    input_method->Init(this);
1391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return input_method.Pass();
1392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ReplaceInputMethod(InputMethod* input_method) {
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method_.reset(input_method);
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  input_method->SetDelegate(native_widget_->GetInputMethodDelegate());
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method->Init(this);
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal::NativeWidgetPrivate, NativeWidget implementation:
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() {
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
1411