diff options
author | msw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-19 21:17:55 +0000 |
---|---|---|
committer | msw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-19 21:17:55 +0000 |
commit | e0183858d46edf4565534ef3274ae136a43136e6 (patch) | |
tree | 481b97e9931e3b975e4f42feb4e65ff1d1cd6768 /ui | |
parent | 38b50d99a2b010eea3628c520a85b3075830672f (diff) | |
download | chromium_src-e0183858d46edf4565534ef3274ae136a43136e6.zip chromium_src-e0183858d46edf4565534ef3274ae136a43136e6.tar.gz chromium_src-e0183858d46edf4565534ef3274ae136a43136e6.tar.bz2 |
Reland Propagate OnNativeWidgetMove to delegate/observers, etc.
Continuation of reverted CL http://codereview.chromium.org/10021029
The original CL was reverted due to a naming conflict between:
WidgetDelegate::OnWidgetMove and Widget::Observer::OnWidgetMove.
I renamed the new Observer method to OnWidgetMoved.
Original description:
Propagate OnNativeWidgetMove to delegate/observers, etc.
NativeWidget[Aura|Win] calls new Widget::OnNativeWidgetMove.
Widgets alert delegates and new Widget::Observer::OnWidgetMove.
TabDragController2: consume new observer method, simplify.
Nix BrowserWindowMoveObserver; use Widget::Observer instead.
Replace move_loop_browser_view_ with move_loop_widget.
Replace GetAttachedBrowserView with GetAttachedBrowserWidget.
BubbleDelegateView: consume new observer method.
Make bubbles move with their anchor_view's Widgets.
SchedulePaint on BubbleFrameView when mirroring its arrow.
BUG=105151, 116336
TEST=Bubbles can move with the browser window (inspecting extension popups, etc.); no Ash / --enable-tab-browser-dragging regressions.
Review URL: http://codereview.chromium.org/10025039
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133057 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/views/bubble/bubble_delegate.cc | 36 | ||||
-rw-r--r-- | ui/views/bubble/bubble_delegate.h | 2 | ||||
-rw-r--r-- | ui/views/bubble/bubble_frame_view.cc | 7 | ||||
-rw-r--r-- | ui/views/widget/native_widget_aura.cc | 2 | ||||
-rw-r--r-- | ui/views/widget/native_widget_delegate.h | 3 | ||||
-rw-r--r-- | ui/views/widget/native_widget_win.cc | 6 | ||||
-rw-r--r-- | ui/views/widget/widget.cc | 5 | ||||
-rw-r--r-- | ui/views/widget/widget.h | 2 |
8 files changed, 45 insertions, 18 deletions
diff --git a/ui/views/bubble/bubble_delegate.cc b/ui/views/bubble/bubble_delegate.cc index 3942c92..1fd3d4f 100644 --- a/ui/views/bubble/bubble_delegate.cc +++ b/ui/views/bubble/bubble_delegate.cc @@ -171,19 +171,30 @@ NonClientFrameView* BubbleDelegateView::CreateNonClientFrameView( return new BubbleFrameView(arrow_location(), color(), margin()); } +void BubbleDelegateView::OnWidgetClosing(Widget* widget) { + if (anchor_view() && anchor_view()->GetWidget() == widget) + anchor_view_ = NULL; +} + void BubbleDelegateView::OnWidgetVisibilityChanged(Widget* widget, bool visible) { - if (widget == GetWidget()) { - if (visible) { - if (border_widget_) - border_widget_->Show(); - GetFocusManager()->SetFocusedView(GetInitiallyFocusedView()); - Widget* anchor_widget = anchor_view() ? anchor_view()->GetWidget() : NULL; - if (anchor_widget && anchor_widget->GetTopLevelWidget()) - anchor_widget->GetTopLevelWidget()->DisableInactiveRendering(); - } else if (border_widget_) { + if (widget != GetWidget()) + return; + + Widget* anchor_widget = anchor_view() ? anchor_view()->GetWidget() : NULL; + if (visible) { + if (border_widget_) + border_widget_->Show(); + if (anchor_widget) + anchor_widget->AddObserver(this); + GetFocusManager()->SetFocusedView(GetInitiallyFocusedView()); + if (anchor_widget && anchor_widget->GetTopLevelWidget()) + anchor_widget->GetTopLevelWidget()->DisableInactiveRendering(); + } else { + if (border_widget_) border_widget_->Hide(); - } + if (anchor_widget) + anchor_widget->RemoveObserver(this); } } @@ -193,6 +204,11 @@ void BubbleDelegateView::OnWidgetActivationChanged(Widget* widget, GetWidget()->Close(); } +void BubbleDelegateView::OnWidgetMoved(Widget* widget) { + if (anchor_view() && anchor_view()->GetWidget() == widget) + SizeToContents(); +} + gfx::Rect BubbleDelegateView::GetAnchorRect() { return anchor_view() ? anchor_view()->GetScreenBounds() : gfx::Rect(); } diff --git a/ui/views/bubble/bubble_delegate.h b/ui/views/bubble/bubble_delegate.h index 75f6c16..145faf8 100644 --- a/ui/views/bubble/bubble_delegate.h +++ b/ui/views/bubble/bubble_delegate.h @@ -47,8 +47,10 @@ class VIEWS_EXPORT BubbleDelegateView : public WidgetDelegateView, views::Widget* widget) OVERRIDE; // Widget::Observer overrides: + virtual void OnWidgetClosing(Widget* widget) OVERRIDE; virtual void OnWidgetVisibilityChanged(Widget* widget, bool visible) OVERRIDE; virtual void OnWidgetActivationChanged(Widget* widget, bool active) OVERRIDE; + virtual void OnWidgetMoved(Widget* widget) OVERRIDE; bool close_on_esc() const { return close_on_esc_; } void set_close_on_esc(bool close_on_esc) { close_on_esc_ = close_on_esc; } diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index ab2ae24..176c010 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -117,9 +117,10 @@ void BubbleFrameView::MirrorArrowIfOffScreen( bubble_border_->GetBounds(anchor_rect, client_size); // Restore the original arrow if mirroring doesn't show more of the bubble. if (GetOffScreenLength(monitor_rect, mirror_bounds, vertical) >= - GetOffScreenLength(monitor_rect, window_bounds, vertical)) { + GetOffScreenLength(monitor_rect, window_bounds, vertical)) bubble_border_->set_arrow_location(arrow); - } + else + SchedulePaint(); } } diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc index 9de1e78..1f8e15e 100644 --- a/ui/views/widget/native_widget_aura.cc +++ b/ui/views/widget/native_widget_aura.cc @@ -738,7 +738,7 @@ gfx::Size NativeWidgetAura::GetMinimumSize() const { void NativeWidgetAura::OnBoundsChanged(const gfx::Rect& old_bounds, const gfx::Rect& new_bounds) { if (old_bounds.origin() != new_bounds.origin()) - GetWidget()->widget_delegate()->OnWidgetMove(); + delegate_->OnNativeWidgetMove(); if (old_bounds.size() != new_bounds.size()) { #if defined(ENABLE_DIP) delegate_->OnNativeWidgetSizeChanged( diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h index 4fac0b0..41e38e7 100644 --- a/ui/views/widget/native_widget_delegate.h +++ b/ui/views/widget/native_widget_delegate.h @@ -72,6 +72,9 @@ class VIEWS_EXPORT NativeWidgetDelegate { // Returns the largest size the window can be resized to by the user. virtual gfx::Size GetMaximumSize() = 0; + // Called when the NativeWidget changed position. + virtual void OnNativeWidgetMove() = 0; + // Called when the NativeWidget changed size to |new_size|. virtual void OnNativeWidgetSizeChanged(const gfx::Size& new_size) = 0; diff --git a/ui/views/widget/native_widget_win.cc b/ui/views/widget/native_widget_win.cc index 513b7fb9..ede049e 100644 --- a/ui/views/widget/native_widget_win.cc +++ b/ui/views/widget/native_widget_win.cc @@ -1613,14 +1613,12 @@ LRESULT NativeWidgetWin::OnMouseRange(UINT message, } void NativeWidgetWin::OnMove(const CPoint& point) { - // TODO(beng): move to Widget. - GetWidget()->widget_delegate()->OnWidgetMove(); + delegate_->OnNativeWidgetMove(); SetMsgHandled(FALSE); } void NativeWidgetWin::OnMoving(UINT param, const LPRECT new_bounds) { - // TODO(beng): move to Widget. - GetWidget()->widget_delegate()->OnWidgetMove(); + delegate_->OnNativeWidgetMove(); } LRESULT NativeWidgetWin::OnNCActivate(BOOL active) { diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index bc0c75a..3f780b7 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc @@ -959,6 +959,11 @@ gfx::Size Widget::GetMaximumSize() { return non_client_view_ ? non_client_view_->GetMaximumSize() : gfx::Size(); } +void Widget::OnNativeWidgetMove() { + widget_delegate_->OnWidgetMove(); + FOR_EACH_OBSERVER(Observer, observers_, OnWidgetMoved(this)); +} + void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) { root_view_->SetSize(new_size); diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index 8f1baca5..c2f4eb4 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h @@ -98,6 +98,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate, virtual void OnWidgetClosing(Widget* widget) {} virtual void OnWidgetVisibilityChanged(Widget* widget, bool visible) {} virtual void OnWidgetActivationChanged(Widget* widget, bool active) {} + virtual void OnWidgetMoved(Widget* widget) {} }; typedef std::set<Widget*> Widgets; @@ -620,6 +621,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate, virtual void OnNativeWidgetDestroyed() OVERRIDE; virtual gfx::Size GetMinimumSize() OVERRIDE; virtual gfx::Size GetMaximumSize() OVERRIDE; + virtual void OnNativeWidgetMove() OVERRIDE; virtual void OnNativeWidgetSizeChanged(const gfx::Size& new_size) OVERRIDE; virtual void OnNativeWidgetBeginUserBoundsChange() OVERRIDE; virtual void OnNativeWidgetEndUserBoundsChange() OVERRIDE; |