diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-07 23:12:38 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-07 23:12:38 +0000 |
commit | c6f9cc2dda4fc4541d0ee4bc91491ed2a6ef57cd (patch) | |
tree | 19a05b1605a19a38391b0d4c5abc4082dcd7399d /chrome | |
parent | ad7b6319e6b005a4d289695f5c22013a0f9dd933 (diff) | |
download | chromium_src-c6f9cc2dda4fc4541d0ee4bc91491ed2a6ef57cd.zip chromium_src-c6f9cc2dda4fc4541d0ee4bc91491ed2a6ef57cd.tar.gz chromium_src-c6f9cc2dda4fc4541d0ee4bc91491ed2a6ef57cd.tar.bz2 |
Move all the stuff relating to detached tab dragging out of BrowserFrameWin and onto the TabStrip2 object. It was mostly cross platform anyway.Adds APIs to Widget that:- allow a Widget to be obtained for a given gfx::NativeView- allow native properties to be set on a Widget.Adds an API to Window that lets the caller convert the window's appearance into a lightly transparent transient looking thing for dragging.BUG=noneTEST=none
Review URL: http://codereview.chromium.org/149440
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31394 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/views/frame/browser_frame_win.cc | 76 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_frame_win.h | 17 | ||||
-rw-r--r-- | chrome/browser/views/tabs/tab_strip_2.cc | 75 | ||||
-rw-r--r-- | chrome/browser/views/tabs/tab_strip_2.h | 28 |
4 files changed, 109 insertions, 87 deletions
diff --git a/chrome/browser/views/frame/browser_frame_win.cc b/chrome/browser/views/frame/browser_frame_win.cc index a732934..a72bc3a 100644 --- a/chrome/browser/views/frame/browser_frame_win.cc +++ b/chrome/browser/views/frame/browser_frame_win.cc @@ -14,7 +14,6 @@ #include "app/win_util.h" #include "chrome/browser/profile.h" #include "chrome/browser/browser_list.h" -#include "chrome/browser/dock_info.h" #include "chrome/browser/views/frame/browser_non_client_frame_view.h" #include "chrome/browser/views/frame/browser_root_view.h" #include "chrome/browser/views/frame/browser_view.h" @@ -43,10 +42,6 @@ BrowserFrame* BrowserFrame::Create(BrowserView* browser_view, BrowserFrameWin::BrowserFrameWin(BrowserView* browser_view, Profile* profile) : WindowWin(browser_view), browser_view_(browser_view), - saved_window_style_(0), - saved_window_ex_style_(0), - detached_drag_mode_(false), - drop_tabstrip_(NULL), root_view_(NULL), frame_initialized_(false), profile_(profile) { @@ -92,11 +87,6 @@ void BrowserFrameWin::UpdateThrobber(bool running) { } void BrowserFrameWin::ContinueDraggingDetachedTab() { - detached_drag_mode_ = true; - - // Set the frame to partially transparent. - UpdateWindowAlphaForTabDragging(detached_drag_mode_); - // Send the message directly, so that the window is positioned appropriately. SendMessage(GetNativeWindow(), WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(0, 0)); } @@ -146,26 +136,14 @@ void BrowserFrameWin::OnEndSession(BOOL ending, UINT logoff) { } void BrowserFrameWin::OnEnterSizeMove() { - drop_tabstrip_ = NULL; + if (TabStrip2::Enabled()) + browser_view_->tabstrip()->AsBrowserTabStrip()->DetachDragStarted(); browser_view_->WindowMoveOrResizeStarted(); } void BrowserFrameWin::OnExitSizeMove() { - if (TabStrip2::Enabled()) { - if (detached_drag_mode_) { - detached_drag_mode_ = false; - if (drop_tabstrip_) { - gfx::Point screen_point = views::Screen::GetCursorScreenPoint(); - BrowserTabStrip* tabstrip = - browser_view_->tabstrip()->AsBrowserTabStrip(); - gfx::Rect tsb = tabstrip->GetDraggedTabScreenBounds(screen_point); - drop_tabstrip_->AttachTab(tabstrip->DetachTab(0), screen_point, tsb); - } else { - UpdateWindowAlphaForTabDragging(detached_drag_mode_); - browser_view_->tabstrip()->AsBrowserTabStrip()->SendDraggedTabHome(); - } - } - } + if (TabStrip2::Enabled()) + browser_view_->tabstrip()->AsBrowserTabStrip()->DetachDragEnded(); WidgetWin::OnExitSizeMove(); } @@ -209,30 +187,8 @@ LRESULT BrowserFrameWin::OnNCHitTest(const CPoint& pt) { } void BrowserFrameWin::OnWindowPosChanged(WINDOWPOS* window_pos) { - if (TabStrip2::Enabled()) { - if (detached_drag_mode_) { - // TODO(beng): move all to BrowserTabStrip... - - // We check to see if the mouse cursor is in the magnetism zone of another - // visible TabStrip. If so, we should dock to it. - std::set<HWND> ignore_windows; - ignore_windows.insert(GetNativeWindow()); - - gfx::Point screen_point = views::Screen::GetCursorScreenPoint(); - HWND local_window = - DockInfo::GetLocalProcessWindowAtPoint(screen_point, ignore_windows); - if (local_window) { - BrowserView* browser_view = - BrowserView::GetBrowserViewForNativeWindow(local_window); - drop_tabstrip_ = browser_view->tabstrip()->AsBrowserTabStrip(); - if (TabStrip2::IsDragRearrange(drop_tabstrip_, screen_point)) { - ReleaseCapture(); - return; - } - } - drop_tabstrip_ = NULL; - } - } + if (TabStrip2::Enabled()) + browser_view_->tabstrip()->AsBrowserTabStrip()->DetachDragMoved(); // Windows lies to us about the position of the minimize button before a // window is visible. We use the position of the minimize button to place the @@ -319,23 +275,3 @@ void BrowserFrameWin::UpdateDWMFrame() { } DwmExtendFrameIntoClientArea(GetNativeView(), &margins); } - -void BrowserFrameWin::UpdateWindowAlphaForTabDragging(bool dragging) { - HWND frame_hwnd = GetNativeWindow(); - if (dragging) { - // Make the frame slightly transparent during the drag operation. - saved_window_style_ = ::GetWindowLong(frame_hwnd, GWL_STYLE); - saved_window_ex_style_ = ::GetWindowLong(frame_hwnd, GWL_EXSTYLE); - ::SetWindowLong(frame_hwnd, GWL_EXSTYLE, - saved_window_ex_style_ | WS_EX_LAYERED); - // Remove the captions tyle so the window doesn't have window controls for a - // more "transparent" look. - ::SetWindowLong(frame_hwnd, GWL_STYLE, - saved_window_style_ & ~WS_CAPTION); - SetLayeredWindowAttributes(frame_hwnd, RGB(0xFF, 0xFF, 0xFF), - kTabDragWindowAlpha, LWA_ALPHA); - } else { - ::SetWindowLong(frame_hwnd, GWL_STYLE, saved_window_style_); - ::SetWindowLong(frame_hwnd, GWL_EXSTYLE, saved_window_ex_style_); - } -} diff --git a/chrome/browser/views/frame/browser_frame_win.h b/chrome/browser/views/frame/browser_frame_win.h index 789795b..04dc35b 100644 --- a/chrome/browser/views/frame/browser_frame_win.h +++ b/chrome/browser/views/frame/browser_frame_win.h @@ -76,10 +76,6 @@ class BrowserFrameWin : public BrowserFrame, public views::WindowWin { // Updates the DWM with the frame bounds. void UpdateDWMFrame(); - // Update the window's pacity when entering and exiting detached dragging - // mode. - void UpdateWindowAlphaForTabDragging(bool dragging); - // The BrowserView is our ClientView. This is a pointer to it. BrowserView* browser_view_; @@ -95,19 +91,6 @@ class BrowserFrameWin : public BrowserFrame, public views::WindowWin { Profile* profile_; - // The window styles before we modified them for a tab dragging operation. - DWORD saved_window_style_; - DWORD saved_window_ex_style_; - - // True if the window is currently being moved in a detached tab drag - // operation. - bool detached_drag_mode_; - - // When this frame represents a detached tab being dragged, this is a TabStrip - // in another window that the tab being dragged would be docked to if the - // mouse were released, or NULL if there is no suitable TabStrip. - BrowserTabStrip* drop_tabstrip_; - DISALLOW_COPY_AND_ASSIGN(BrowserFrameWin); }; diff --git a/chrome/browser/views/tabs/tab_strip_2.cc b/chrome/browser/views/tabs/tab_strip_2.cc index 280413d..12296eb 100644 --- a/chrome/browser/views/tabs/tab_strip_2.cc +++ b/chrome/browser/views/tabs/tab_strip_2.cc @@ -10,6 +10,7 @@ #include "base/compiler_specific.h" #include "base/message_loop.h" #include "build/build_config.h" +#include "chrome/browser/dock_info.h" #include "chrome/common/chrome_switches.h" #include "views/animator.h" #include "views/screen.h" @@ -23,12 +24,16 @@ static const int kHorizontalMoveThreshold = 16; // pixels +static const wchar_t* kTabStripKey = L"__VIEWS_TABSTRIP__"; + //////////////////////////////////////////////////////////////////////////////// // TabStrip2, public: TabStrip2::TabStrip2(TabStrip2Model* model) : model_(model), last_move_screen_x_(0), + detached_drag_mode_(false), + drop_tabstrip_(NULL), ALLOW_THIS_IN_INITIALIZER_LIST(detach_factory_(this)), ALLOW_THIS_IN_INITIALIZER_LIST(drag_start_factory_(this)) { } @@ -42,6 +47,17 @@ bool TabStrip2::Enabled() { switches::kEnableTabtastic2); } +// static +TabStrip2* TabStrip2::GetTabStripFromWindow(gfx::NativeWindow window) { + views::Widget* widget = views::Widget::GetWidgetFromNativeView(window); + if (widget) { + void* tabstrip = widget->GetNativeWindowProperty(kTabStripKey); + if (tabstrip) + return reinterpret_cast<TabStrip2*>(tabstrip); + } + return NULL; +} + void TabStrip2::AddTabAt(int index) { Tab2* tab = new Tab2(this); int insertion_index = GetInternalIndex(index); @@ -133,6 +149,55 @@ void TabStrip2::ResumeDraggingTab(int index, const gfx::Rect& tab_bounds) { tab_bounds)); } +void TabStrip2::DetachDragStarted() { + drop_tabstrip_ = NULL; + detached_drag_mode_ = true; + + // Set the frame to partially transparent. + GetWindow()->SetUseDragFrame(detached_drag_mode_); +} + +void TabStrip2::DetachDragMoved() { + if (detached_drag_mode_) { + // We check to see if the mouse cursor is in the magnetism zone of another + // visible TabStrip. If so, we should dock to it. + std::set<gfx::NativeWindow> ignore_windows; + ignore_windows.insert(GetWidget()->GetWindow()->GetNativeWindow()); + + gfx::Point screen_point = views::Screen::GetCursorScreenPoint(); + gfx::NativeWindow local_window = + DockInfo::GetLocalProcessWindowAtPoint(screen_point, ignore_windows); + if (local_window) { + drop_tabstrip_ = GetTabStripFromWindow(local_window); + if (IsDragRearrange(drop_tabstrip_, screen_point)) { +#if defined(OS_WIN) + ReleaseCapture(); +#elif defined(OS_LINUX) + // release grab maybe? + NOTIMPLEMENTED(); +#endif + return; + } + } + drop_tabstrip_ = NULL; + } +} + +void TabStrip2::DetachDragEnded() { + if (detached_drag_mode_) { + detached_drag_mode_ = false; + if (drop_tabstrip_) { + gfx::Point screen_point = views::Screen::GetCursorScreenPoint(); + gfx::Rect tsb = GetDraggedTabScreenBounds(screen_point); + // TODO(beng): figure this one out. + //drop_tabstrip_->AttachTab(tabstrip->DetachTab(0), screen_point, tsb); + } else { + GetWindow()->SetUseDragFrame(detached_drag_mode_); + SendDraggedTabHome(); + } + } +} + // static bool TabStrip2::IsDragRearrange(TabStrip2* tabstrip, const gfx::Point& screen_point) { @@ -314,6 +379,16 @@ void TabStrip2::PaintChildren(gfx::Canvas* canvas) { selected_tab->ProcessPaint(canvas); } +void TabStrip2::ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child) { + if (is_add && child == this) { + // Widget must exist now, otherwise someone has screwed up the order in + // which views are added to the hierarchy. + GetWidget()->SetNativeWindowProperty(kTabStripKey, this); + } +} + //////////////////////////////////////////////////////////////////////////////// // TabStrip2, views::AnimatorDelegate implementation: diff --git a/chrome/browser/views/tabs/tab_strip_2.h b/chrome/browser/views/tabs/tab_strip_2.h index f407d89..dc61569 100644 --- a/chrome/browser/views/tabs/tab_strip_2.h +++ b/chrome/browser/views/tabs/tab_strip_2.h @@ -60,6 +60,10 @@ class TabStrip2 : public views::View, // Returns true if the new TabStrip is enabled. static bool Enabled(); + // Returns the tabstrip associated with the specificied top level window, or + // NULL if there is no tabstrip. + static TabStrip2* GetTabStripFromWindow(gfx::NativeWindow window); + // API for adding, removing, selecting and moving tabs around. void AddTabAt(int index); void RemoveTabAt(int index, Tab2Model* removing_model); @@ -87,6 +91,17 @@ class TabStrip2 : public views::View, // Continue a drag operation on the Tab2 at the specified index. void ResumeDraggingTab(int index, const gfx::Rect& tab_bounds); + // Notifies the tabstrip that a detach drag operation has begun. + void DetachDragStarted(); + + // Notifies the tabstrip that a detach drag operation is underway and the + // dragged representation has been moved. + void DetachDragMoved(); + + // Notifies the tabstrip that a detach drag operation has completed. Called + // by the window that contains this tabstrip. + void DetachDragEnded(); + // Returns true if the mouse pointer at the specified point (screen bounds) // constitutes a rearrange rather than a detach. static bool IsDragRearrange(TabStrip2* tabstrip, @@ -113,6 +128,9 @@ class TabStrip2 : public views::View, private: virtual void PaintChildren(gfx::Canvas* canvas); + virtual void ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child); // Overridden from views::AnimatorDelegate: virtual views::View* GetClampedView(views::View* host); @@ -164,6 +182,16 @@ class TabStrip2 : public views::View, // beyond the minimum horizontal threshold to initiate a drag operation. int last_move_screen_x_; + // True if the window containing this tabstrip is currently being moved as + // part of a detached tab drag operation. + bool detached_drag_mode_; + + // When the window containing this tabstrip represents a detached tab being + // dragged, this is a tabstrip in another window that the tab being dragged + // would be docked to if the mouse were released, or NULL if there is no + // suitable tabstrip. + TabStrip2* drop_tabstrip_; + // Factories to help break up work and avoid nesting message loops. ScopedRunnableMethodFactory<TabStrip2> detach_factory_; ScopedRunnableMethodFactory<TabStrip2> drag_start_factory_; |