Index: views/widget/native_widget_aura.cc |
diff --git a/views/widget/native_widget_aura.cc b/views/widget/native_widget_aura.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..57677f5e892d7f5833c796f2c124bc231d5fe5b8 |
--- /dev/null |
+++ b/views/widget/native_widget_aura.cc |
@@ -0,0 +1,794 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "views/widget/native_widget_aura.h" |
+ |
+#include "base/bind.h" |
+#include "base/string_util.h" |
+#include "ui/aura/client/aura_constants.h" |
+#include "ui/aura/client/drag_drop_client.h" |
+#include "ui/aura/desktop.h" |
+#include "ui/aura/desktop_observer.h" |
+#include "ui/aura/event.h" |
+#include "ui/aura/window.h" |
+#include "ui/aura/window_types.h" |
+#include "ui/base/dragdrop/os_exchange_data.h" |
+#include "ui/base/ui_base_types.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/gfx/compositor/layer.h" |
+#include "ui/gfx/font.h" |
+#include "ui/gfx/screen.h" |
+#include "views/widget/drop_helper.h" |
+#include "views/widget/native_widget_delegate.h" |
+#include "views/widget/tooltip_manager_views.h" |
+ |
+#if defined(OS_WIN) |
+#include "base/win/scoped_gdi_object.h" |
+#include "base/win/win_util.h" |
+#include "ui/base/l10n/l10n_util_win.h" |
+#endif |
+ |
+#if defined(HAVE_IBUS) |
+#include "ui/views/ime/input_method_ibus.h" |
+#else |
+#include "ui/views/ime/mock_input_method.h" |
+#endif |
+ |
+namespace views { |
+ |
+namespace { |
+ |
+aura::WindowType GetAuraWindowTypeForWidgetType(Widget::InitParams::Type type) { |
+ switch (type) { |
+ case Widget::InitParams::TYPE_WINDOW: |
+ return aura::WINDOW_TYPE_NORMAL; |
+ case Widget::InitParams::TYPE_WINDOW_FRAMELESS: |
+ case Widget::InitParams::TYPE_CONTROL: |
+ case Widget::InitParams::TYPE_POPUP: |
+ case Widget::InitParams::TYPE_BUBBLE: |
+ return aura::WINDOW_TYPE_POPUP; |
+ case Widget::InitParams::TYPE_MENU: |
+ return aura::WINDOW_TYPE_MENU; |
+ case Widget::InitParams::TYPE_TOOLTIP: |
+ return aura::WINDOW_TYPE_TOOLTIP; |
+ default: |
+ NOTREACHED() << "Unhandled widget type " << type; |
+ return aura::WINDOW_TYPE_UNKNOWN; |
+ } |
+} |
+ |
+} // namespace |
+ |
+// Used when SetInactiveRenderingDisabled() is invoked to track when active |
+// status changes in such a way that we should enable inactive rendering. |
+class NativeWidgetAura::DesktopObserverImpl : public aura::DesktopObserver { |
+ public: |
+ explicit DesktopObserverImpl(NativeWidgetAura* host) |
+ : host_(host) { |
+ aura::Desktop::GetInstance()->AddObserver(this); |
+ } |
+ |
+ virtual ~DesktopObserverImpl() { |
+ aura::Desktop::GetInstance()->RemoveObserver(this); |
+ } |
+ |
+ // DesktopObserver overrides: |
+ virtual void OnActiveWindowChanged(aura::Window* active) OVERRIDE { |
+ if (!active || (active != host_->window_ && |
+ active->transient_parent() != host_->window_)) { |
+ host_->delegate_->EnableInactiveRendering(); |
+ } |
+ } |
+ |
+ private: |
+ NativeWidgetAura* host_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DesktopObserverImpl); |
+}; |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NativeWidgetAura, public: |
+ |
+NativeWidgetAura::NativeWidgetAura(internal::NativeWidgetDelegate* delegate) |
+ : delegate_(delegate), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(window_(new aura::Window(this))), |
+ ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), |
+ can_activate_(true), |
+ cursor_(gfx::kNullCursor) { |
+} |
+ |
+NativeWidgetAura::~NativeWidgetAura() { |
+ if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) |
+ delete delegate_; |
+ else |
+ CloseNow(); |
+} |
+ |
+// static |
+gfx::Font NativeWidgetAura::GetWindowTitleFont() { |
+#if defined(OS_WIN) |
+ NONCLIENTMETRICS ncm; |
+ base::win::GetNonClientMetrics(&ncm); |
+ l10n_util::AdjustUIFont(&(ncm.lfCaptionFont)); |
+ base::win::ScopedHFONT caption_font(CreateFontIndirect(&(ncm.lfCaptionFont))); |
+ return gfx::Font(caption_font); |
+#else |
+ return gfx::Font(); |
+#endif |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NativeWidgetAura, internal::NativeWidgetPrivate implementation: |
+ |
+void NativeWidgetAura::InitNativeWidget(const Widget::InitParams& params) { |
+ ownership_ = params.ownership; |
+ window_->set_user_data(this); |
+ Widget::InitParams::Type window_type = |
+ params.child ? Widget::InitParams::TYPE_CONTROL : params.type; |
+ window_->SetType(GetAuraWindowTypeForWidgetType(window_type)); |
+ window_->SetIntProperty(aura::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ window_->Init(params.create_texture_for_layer ? |
+ ui::Layer::LAYER_HAS_TEXTURE : |
+ ui::Layer::LAYER_HAS_NO_TEXTURE); |
+ if (window_type == Widget::InitParams::TYPE_CONTROL) |
+ window_->Show(); |
+ |
+ window_->layer()->SetFillsBoundsOpaquely(!params.transparent); |
+ delegate_->OnNativeWidgetCreated(); |
+ window_->SetBounds(params.bounds); |
+ if (window_type == Widget::InitParams::TYPE_CONTROL) { |
+ window_->SetParent(params.GetParent()); |
+ } else { |
+ // Set up the transient child before the window is added. This way the |
+ // LayoutManager knows the window has a transient parent. |
+ gfx::NativeView parent = params.GetParent(); |
+ if (parent) |
+ parent->AddTransientChild(window_); |
+ // SetAlwaysOnTop before SetParent so that always-on-top container is used. |
+ SetAlwaysOnTop(params.keep_on_top); |
+ window_->SetParent(NULL); |
+ } |
+ window_->set_ignore_events(!params.accept_events); |
+ // TODO(beng): do this some other way. |
+ delegate_->OnNativeWidgetSizeChanged(params.bounds.size()); |
+ can_activate_ = params.can_activate; |
+ DCHECK(GetWidget()->GetRootView()); |
+ if (params.type != Widget::InitParams::TYPE_TOOLTIP && !params.child) { |
+ views::TooltipManagerViews* manager = new views::TooltipManagerViews( |
+ GetWidget()->GetRootView()); |
+ tooltip_manager_.reset(manager); |
+ } |
+ drop_helper_.reset(new DropHelper(GetWidget()->GetRootView())); |
+ if (params.type != Widget::InitParams::TYPE_TOOLTIP && |
+ params.type != Widget::InitParams::TYPE_POPUP) { |
+ window_->SetProperty(aura::kDragDropDelegateKey, |
+ static_cast<aura::WindowDragDropDelegate*>(this)); |
+ } |
+} |
+ |
+NonClientFrameView* NativeWidgetAura::CreateNonClientFrameView() { |
+ return NULL; |
+} |
+ |
+void NativeWidgetAura::UpdateFrameAfterFrameChange() { |
+ // We don't support changing the frame type. |
+ NOTREACHED(); |
+} |
+ |
+bool NativeWidgetAura::ShouldUseNativeFrame() const { |
+ // There is only one frame type for aura. |
+ return false; |
+} |
+ |
+void NativeWidgetAura::FrameTypeChanged() { |
+ // This is called when the Theme has changed; forward the event to the root |
+ // widget. |
+ GetWidget()->ThemeChanged(); |
+ GetWidget()->GetRootView()->SchedulePaint(); |
+} |
+ |
+Widget* NativeWidgetAura::GetWidget() { |
+ return delegate_->AsWidget(); |
+} |
+ |
+const Widget* NativeWidgetAura::GetWidget() const { |
+ return delegate_->AsWidget(); |
+} |
+ |
+gfx::NativeView NativeWidgetAura::GetNativeView() const { |
+ return window_; |
+} |
+ |
+gfx::NativeWindow NativeWidgetAura::GetNativeWindow() const { |
+ return window_; |
+} |
+ |
+Widget* NativeWidgetAura::GetTopLevelWidget() { |
+ NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView()); |
+ return native_widget ? native_widget->GetWidget() : NULL; |
+} |
+ |
+const ui::Compositor* NativeWidgetAura::GetCompositor() const { |
+ return window_->layer()->GetCompositor(); |
+} |
+ |
+ui::Compositor* NativeWidgetAura::GetCompositor() { |
+ return window_->layer()->GetCompositor(); |
+} |
+ |
+void NativeWidgetAura::CalculateOffsetToAncestorWithLayer( |
+ gfx::Point* offset, |
+ ui::Layer** layer_parent) { |
+ if (layer_parent) |
+ *layer_parent = window_->layer(); |
+} |
+ |
+void NativeWidgetAura::ReorderLayers() { |
+} |
+ |
+void NativeWidgetAura::ViewRemoved(View* view) { |
+ // DropTarget stuff. Most likely http://crbug.com/97845 |
+ //NOTIMPLEMENTED(); |
+} |
+ |
+void NativeWidgetAura::SetNativeWindowProperty(const char* name, void* value) { |
+ if (window_) |
+ window_->SetProperty(name, value); |
+} |
+ |
+void* NativeWidgetAura::GetNativeWindowProperty(const char* name) const { |
+ return window_ ? window_->GetProperty(name) : NULL; |
+} |
+ |
+TooltipManager* NativeWidgetAura::GetTooltipManager() const { |
+ return tooltip_manager_.get(); |
+} |
+ |
+bool NativeWidgetAura::IsScreenReaderActive() const { |
+ // http://crbug.com/102570 |
+ //NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+void NativeWidgetAura::SendNativeAccessibilityEvent( |
+ View* view, |
+ ui::AccessibilityTypes::Event event_type) { |
+ // http://crbug.com/102570 |
+ //NOTIMPLEMENTED(); |
+} |
+ |
+void NativeWidgetAura::SetMouseCapture() { |
+ window_->SetCapture(); |
+} |
+ |
+void NativeWidgetAura::ReleaseMouseCapture() { |
+ window_->ReleaseCapture(); |
+} |
+ |
+bool NativeWidgetAura::HasMouseCapture() const { |
+ return window_->HasCapture(); |
+} |
+ |
+InputMethod* NativeWidgetAura::CreateInputMethod() { |
+#if defined(HAVE_IBUS) |
+ InputMethod* input_method = new InputMethodIBus(this); |
+#else |
+ InputMethod* input_method = new MockInputMethod(this); |
+#endif |
+ input_method->Init(GetWidget()); |
+ return input_method; |
+} |
+ |
+void NativeWidgetAura::CenterWindow(const gfx::Size& size) { |
+ const gfx::Rect parent_bounds = window_->parent()->bounds(); |
+ window_->SetBounds(gfx::Rect((parent_bounds.width() - size.width())/2, |
+ (parent_bounds.height() - size.height())/2, |
+ size.width(), |
+ size.height())); |
+} |
+ |
+void NativeWidgetAura::GetWindowPlacement( |
+ gfx::Rect* bounds, |
+ ui::WindowShowState* show_state) const { |
+ *bounds = window_->GetTargetBounds(); |
+ *show_state = static_cast<ui::WindowShowState>( |
+ window_->GetIntProperty(aura::kShowStateKey)); |
+} |
+ |
+void NativeWidgetAura::SetWindowTitle(const string16& title) { |
+ window_->set_title(title); |
+} |
+ |
+void NativeWidgetAura::SetWindowIcons(const SkBitmap& window_icon, |
+ const SkBitmap& app_icon) { |
+ // Aura doesn't have window icons. |
+} |
+ |
+void NativeWidgetAura::SetAccessibleName(const string16& name) { |
+ // http://crbug.com/102570 |
+ //NOTIMPLEMENTED(); |
+} |
+ |
+void NativeWidgetAura::SetAccessibleRole(ui::AccessibilityTypes::Role role) { |
+ // http://crbug.com/102570 |
+ //NOTIMPLEMENTED(); |
+} |
+ |
+void NativeWidgetAura::SetAccessibleState(ui::AccessibilityTypes::State state) { |
+ // http://crbug.com/102570 |
+ //NOTIMPLEMENTED(); |
+} |
+ |
+void NativeWidgetAura::BecomeModal() { |
+ window_->SetIntProperty(aura::kModalKey, 1); |
+} |
+ |
+gfx::Rect NativeWidgetAura::GetWindowScreenBounds() const { |
+ return window_->GetScreenBounds(); |
+} |
+ |
+gfx::Rect NativeWidgetAura::GetClientAreaScreenBounds() const { |
+ // In Aura, the entire window is the client area. |
+ return window_->GetScreenBounds(); |
+} |
+ |
+gfx::Rect NativeWidgetAura::GetRestoredBounds() const { |
+ gfx::Rect* restore_bounds = reinterpret_cast<gfx::Rect*>( |
+ window_->GetProperty(aura::kRestoreBoundsKey)); |
+ return restore_bounds ? *restore_bounds : window_->bounds(); |
+} |
+ |
+void NativeWidgetAura::SetBounds(const gfx::Rect& bounds) { |
+ window_->SetBounds(bounds); |
+} |
+ |
+void NativeWidgetAura::SetSize(const gfx::Size& size) { |
+ window_->SetBounds(gfx::Rect(window_->bounds().origin(), size)); |
+} |
+ |
+void NativeWidgetAura::MoveAbove(gfx::NativeView native_view) { |
+ if (window_->parent() && window_->parent() == native_view->parent()) |
+ window_->parent()->MoveChildAbove(window_, native_view); |
+} |
+ |
+void NativeWidgetAura::MoveToTop() { |
+ window_->parent()->MoveChildToFront(window_); |
+} |
+ |
+void NativeWidgetAura::SetShape(gfx::NativeRegion region) { |
+ // No need for this. |
+} |
+ |
+void NativeWidgetAura::Close() { |
+ // |window_| may already be deleted by parent window. This can happen |
+ // when this widget is child widget or has transient parent |
+ // and ownership is WIDGET_OWNS_NATIVE_WIDGET. |
+ DCHECK(window_ || |
+ ownership_ == Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET); |
+ if (window_) |
+ Hide(); |
+ |
+ window_->SetIntProperty(aura::kModalKey, 0); |
+ |
+ if (!close_widget_factory_.HasWeakPtrs()) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&NativeWidgetAura::CloseNow, |
+ close_widget_factory_.GetWeakPtr())); |
+ } |
+} |
+ |
+void NativeWidgetAura::CloseNow() { |
+ delete window_; |
+} |
+ |
+void NativeWidgetAura::EnableClose(bool enable) { |
+ // http://crbug.com/102581 |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void NativeWidgetAura::Show() { |
+ ShowWithWindowState(ui::SHOW_STATE_INACTIVE); |
+} |
+ |
+void NativeWidgetAura::Hide() { |
+ window_->Hide(); |
+} |
+ |
+void NativeWidgetAura::ShowMaximizedWithBounds( |
+ const gfx::Rect& restored_bounds) { |
+ window_->SetBounds(restored_bounds); |
+ ShowWithWindowState(ui::SHOW_STATE_MAXIMIZED); |
+} |
+ |
+void NativeWidgetAura::ShowWithWindowState(ui::WindowShowState state) { |
+ if (state == ui::SHOW_STATE_MAXIMIZED || |
+ state == ui::SHOW_STATE_FULLSCREEN) { |
+ window_->SetIntProperty(aura::kShowStateKey, state); |
+ } |
+ window_->Show(); |
+ if (can_activate_ && (state != ui::SHOW_STATE_INACTIVE || |
+ !GetWidget()->SetInitialFocus())) { |
+ window_->Activate(); |
+ } |
+} |
+ |
+bool NativeWidgetAura::IsVisible() const { |
+ return window_->IsVisible(); |
+} |
+ |
+void NativeWidgetAura::Activate() { |
+ window_->Activate(); |
+} |
+ |
+void NativeWidgetAura::Deactivate() { |
+ window_->Deactivate(); |
+} |
+ |
+bool NativeWidgetAura::IsActive() const { |
+ return aura::Desktop::GetInstance()->active_window() == window_; |
+} |
+ |
+void NativeWidgetAura::SetAlwaysOnTop(bool on_top) { |
+ window_->SetIntProperty(aura::kAlwaysOnTopKey, on_top); |
+} |
+ |
+void NativeWidgetAura::Maximize() { |
+ window_->SetIntProperty(aura::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+} |
+ |
+void NativeWidgetAura::Minimize() { |
+ // No minimized window for aura. crbug.com/104571. |
+ NOTREACHED(); |
+} |
+ |
+bool NativeWidgetAura::IsMaximized() const { |
+ return window_->GetIntProperty(aura::kShowStateKey) == |
+ ui::SHOW_STATE_MAXIMIZED; |
+} |
+ |
+bool NativeWidgetAura::IsMinimized() const { |
+ return window_->GetIntProperty(aura::kShowStateKey) == |
+ ui::SHOW_STATE_MINIMIZED; |
+} |
+ |
+void NativeWidgetAura::Restore() { |
+ window_->SetIntProperty(aura::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+} |
+ |
+void NativeWidgetAura::SetFullscreen(bool fullscreen) { |
+ window_->SetIntProperty( |
+ aura::kShowStateKey, |
+ fullscreen ? ui::SHOW_STATE_FULLSCREEN : ui::SHOW_STATE_NORMAL); |
+} |
+ |
+bool NativeWidgetAura::IsFullscreen() const { |
+ return window_->GetIntProperty(aura::kShowStateKey) == |
+ ui::SHOW_STATE_FULLSCREEN; |
+} |
+ |
+void NativeWidgetAura::SetOpacity(unsigned char opacity) { |
+ window_->layer()->SetOpacity(opacity / 255.0); |
+} |
+ |
+void NativeWidgetAura::SetUseDragFrame(bool use_drag_frame) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+bool NativeWidgetAura::IsAccessibleWidget() const { |
+ // http://crbug.com/102570 |
+ //NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+void NativeWidgetAura::RunShellDrag(View* view, |
+ const ui::OSExchangeData& data, |
+ int operation) { |
+ aura::DragDropClient* client = static_cast<aura::DragDropClient*>( |
+ aura::Desktop::GetInstance()->GetProperty( |
+ aura::kDesktopDragDropClientKey)); |
+ if (client) |
+ client->StartDragAndDrop(data, operation); |
+} |
+ |
+void NativeWidgetAura::SchedulePaintInRect(const gfx::Rect& rect) { |
+ if (window_) |
+ window_->SchedulePaintInRect(rect); |
+} |
+ |
+void NativeWidgetAura::SetCursor(gfx::NativeCursor cursor) { |
+ cursor_ = cursor; |
+ aura::Desktop::GetInstance()->SetCursor(cursor); |
+} |
+ |
+void NativeWidgetAura::ClearNativeFocus() { |
+ if (window_ && window_->GetFocusManager()) |
+ window_->GetFocusManager()->SetFocusedWindow(window_); |
+} |
+ |
+void NativeWidgetAura::FocusNativeView(gfx::NativeView native_view) { |
+ // http://crbug.com/102572 |
+ NOTIMPLEMENTED(); |
+} |
+ |
+bool NativeWidgetAura::ConvertPointFromAncestor(const Widget* ancestor, |
+ gfx::Point* point) const { |
+ // http://crbug.com/102573 |
+ NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+gfx::Rect NativeWidgetAura::GetWorkAreaBoundsInScreen() const { |
+ return gfx::Screen::GetMonitorWorkAreaNearestWindow(GetNativeView()); |
+} |
+ |
+void NativeWidgetAura::SetInactiveRenderingDisabled(bool value) { |
+ if (!value) |
+ desktop_observer_.reset(); |
+ else |
+ desktop_observer_.reset(new DesktopObserverImpl(this)); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NativeWidgetAura, views::InputMethodDelegate implementation: |
+ |
+void NativeWidgetAura::DispatchKeyEventPostIME(const KeyEvent& key) { |
+ if (delegate_->OnKeyEvent(key)) |
+ return; |
+ if (key.type() == ui::ET_KEY_PRESSED && GetWidget()->GetFocusManager()) |
+ GetWidget()->GetFocusManager()->OnKeyEvent(key); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NativeWidgetAura, aura::WindowDelegate implementation: |
+ |
+void NativeWidgetAura::OnBoundsChanging(gfx::Rect* new_bounds) { |
+ // Enforces a minimum size. |
+ const gfx::Size& min_size = delegate_->GetMinimumSize(); |
+ new_bounds->set_width(std::max(min_size.width(), new_bounds->width())); |
+ new_bounds->set_height(std::max(min_size.height(), new_bounds->height())); |
+} |
+ |
+void NativeWidgetAura::OnBoundsChanged(const gfx::Rect& old_bounds, |
+ const gfx::Rect& new_bounds) { |
+ if (old_bounds.origin() != new_bounds.origin()) |
+ GetWidget()->widget_delegate()->OnWidgetMove(); |
+ if (old_bounds.size() != new_bounds.size()) |
+ delegate_->OnNativeWidgetSizeChanged(new_bounds.size()); |
+} |
+ |
+void NativeWidgetAura::OnFocus() { |
+ Widget* widget = GetWidget(); |
+ if (widget->is_top_level()) { |
+ InputMethod* input_method = widget->GetInputMethod(); |
+ input_method->OnFocus(); |
+ // See description of got_initial_focus_in_ for details on this. |
+ // TODO(mazda): Investigate this is actually necessary. |
+ // widget->GetFocusManager()->RestoreFocusedView(); |
+ } |
+ delegate_->OnNativeFocus(window_); |
+} |
+ |
+void NativeWidgetAura::OnBlur() { |
+ Widget* widget = GetWidget(); |
+ if (widget->is_top_level()) { |
+ InputMethod* input_method = widget->GetInputMethod(); |
+ input_method->OnBlur(); |
+ widget->GetFocusManager()->StoreFocusedView(); |
+ } |
+ delegate_->OnNativeBlur(NULL); |
+} |
+ |
+bool NativeWidgetAura::OnKeyEvent(aura::KeyEvent* event) { |
+ // TODO(beng): Need an InputMethodAura to properly handle character events. |
+ // Right now, we just skip these. |
+ if (event->is_char()) |
+ return false; |
+ |
+ DCHECK(window_->IsVisible()); |
+ InputMethod* input_method = GetWidget()->GetInputMethod(); |
+ DCHECK(input_method); |
+ // TODO(oshima): DispatchKeyEvent should return bool? |
+ KeyEvent views_event(event); |
+ input_method->DispatchKeyEvent(views_event); |
+ return true; |
+} |
+ |
+gfx::NativeCursor NativeWidgetAura::GetCursor(const gfx::Point& point) { |
+ return cursor_; |
+} |
+ |
+int NativeWidgetAura::GetNonClientComponent(const gfx::Point& point) const { |
+ return delegate_->GetNonClientComponent(point); |
+} |
+ |
+bool NativeWidgetAura::OnMouseEvent(aura::MouseEvent* event) { |
+ DCHECK(window_->IsVisible()); |
+ if (event->type() == ui::ET_MOUSEWHEEL) { |
+ MouseWheelEvent wheel_event(event); |
+ if (tooltip_manager_.get()) |
+ tooltip_manager_->UpdateForMouseEvent(wheel_event); |
+ return delegate_->OnMouseEvent(wheel_event); |
+ } |
+ MouseEvent mouse_event(event); |
+ if (tooltip_manager_.get()) |
+ tooltip_manager_->UpdateForMouseEvent(mouse_event); |
+ return delegate_->OnMouseEvent(mouse_event); |
+} |
+ |
+ui::TouchStatus NativeWidgetAura::OnTouchEvent(aura::TouchEvent* event) { |
+ DCHECK(window_->IsVisible()); |
+ TouchEvent touch_event(event); |
+ return delegate_->OnTouchEvent(touch_event); |
+} |
+ |
+bool NativeWidgetAura::ShouldActivate(aura::Event* event) { |
+ return can_activate_; |
+} |
+ |
+void NativeWidgetAura::OnActivated() { |
+ delegate_->OnNativeWidgetActivationChanged(true); |
+ if (IsVisible() && GetWidget()->non_client_view()) |
+ GetWidget()->non_client_view()->SchedulePaint(); |
+} |
+ |
+void NativeWidgetAura::OnLostActive() { |
+ delegate_->OnNativeWidgetActivationChanged(false); |
+ if (IsVisible() && GetWidget()->non_client_view()) |
+ GetWidget()->non_client_view()->SchedulePaint(); |
+} |
+ |
+void NativeWidgetAura::OnCaptureLost() { |
+ delegate_->OnMouseCaptureLost(); |
+} |
+ |
+void NativeWidgetAura::OnPaint(gfx::Canvas* canvas) { |
+ delegate_->OnNativeWidgetPaint(canvas); |
+} |
+ |
+void NativeWidgetAura::OnWindowDestroying() { |
+ window_->SetProperty(aura::kDragDropDelegateKey, NULL); |
+ delegate_->OnNativeWidgetDestroying(); |
+ |
+ // If the aura::Window is destroyed, we can no longer show tooltips. |
+ tooltip_manager_.reset(); |
+} |
+ |
+void NativeWidgetAura::OnWindowDestroyed() { |
+ window_ = NULL; |
+ tooltip_manager_.reset(); |
+ delegate_->OnNativeWidgetDestroyed(); |
+ if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) |
+ delete this; |
+} |
+ |
+void NativeWidgetAura::OnWindowVisibilityChanged(bool visible) { |
+ delegate_->OnNativeWidgetVisibilityChanged(visible); |
+} |
+ |
+bool NativeWidgetAura::CanDrop(const aura::DropTargetEvent& event) { |
+ DCHECK(drop_helper_.get() != NULL); |
+ View* view = drop_helper_->target_view(); |
+ if (view) |
+ return view->CanDrop(event.data()); |
+ return false; |
+} |
+ |
+void NativeWidgetAura::OnDragEntered(const aura::DropTargetEvent& event) { |
+ DCHECK(drop_helper_.get() != NULL); |
+ drop_helper_->OnDragOver(event.data(), event.location(), |
+ event.source_operations()); |
+} |
+ |
+int NativeWidgetAura::OnDragUpdated(const aura::DropTargetEvent& event) { |
+ DCHECK(drop_helper_.get() != NULL); |
+ return drop_helper_->OnDragOver(event.data(), event.location(), |
+ event.source_operations()); |
+} |
+ |
+void NativeWidgetAura::OnDragExited() { |
+ DCHECK(drop_helper_.get() != NULL); |
+ drop_helper_->OnDragExit(); |
+} |
+ |
+int NativeWidgetAura::OnPerformDrop(const aura::DropTargetEvent& event) { |
+ DCHECK(drop_helper_.get() != NULL); |
+ return drop_helper_->OnDrop(event.data(), event.location(), |
+ event.source_operations()); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// Widget, public: |
+ |
+// static |
+void Widget::NotifyLocaleChanged() { |
+ // http://crbug.com/102574 |
+ NOTIMPLEMENTED(); |
+} |
+ |
+// static |
+void Widget::CloseAllSecondaryWidgets() { |
+ // http://crbug.com/102575 |
+ NOTIMPLEMENTED(); |
+} |
+ |
+bool Widget::ConvertRect(const Widget* source, |
+ const Widget* target, |
+ gfx::Rect* rect) { |
+ return false; |
+} |
+ |
+namespace internal { |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// internal::NativeWidgetPrivate, public: |
+ |
+// static |
+NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget( |
+ internal::NativeWidgetDelegate* delegate) { |
+ return new NativeWidgetAura(delegate); |
+} |
+ |
+// static |
+NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView( |
+ gfx::NativeView native_view) { |
+ return reinterpret_cast<NativeWidgetAura*>(native_view->user_data()); |
+} |
+ |
+// static |
+NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow( |
+ gfx::NativeWindow native_window) { |
+ return reinterpret_cast<NativeWidgetAura*>(native_window->user_data()); |
+} |
+ |
+// static |
+NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( |
+ gfx::NativeView native_view) { |
+ aura::Window* window = native_view; |
+ NativeWidgetPrivate* top_level_native_widget = NULL; |
+ while (window) { |
+ NativeWidgetPrivate* native_widget = GetNativeWidgetForNativeView(window); |
+ if (native_widget) |
+ top_level_native_widget = native_widget; |
+ window = window->parent(); |
+ } |
+ return top_level_native_widget; |
+} |
+ |
+// static |
+void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, |
+ Widget::Widgets* children) { |
+ { |
+ // Code expects widget for |native_view| to be added to |children|. |
+ NativeWidgetAura* native_widget = static_cast<NativeWidgetAura*>( |
+ GetNativeWidgetForNativeView(native_view)); |
+ if (native_widget->GetWidget()) |
+ children->insert(native_widget->GetWidget()); |
+ } |
+ |
+ const aura::Window::Windows& child_windows = native_view->children(); |
+ for (aura::Window::Windows::const_iterator i = child_windows.begin(); |
+ i != child_windows.end(); ++i) { |
+ NativeWidgetAura* native_widget = |
+ static_cast<NativeWidgetAura*>(GetNativeWidgetForNativeView(*i)); |
+ if (native_widget) |
+ children->insert(native_widget->GetWidget()); |
+ } |
+} |
+ |
+// static |
+void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, |
+ gfx::NativeView new_parent) { |
+ // http://crbug.com/102576 |
+ NOTIMPLEMENTED(); |
+} |
+ |
+// static |
+bool NativeWidgetPrivate::IsMouseButtonDown() { |
+ return aura::Desktop::GetInstance()->IsMouseButtonDown(); |
+} |
+ |
+} // namespace internal |
+} // namespace views |