Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: chrome/browser/ui/views/tabs/default_tab_drag_controller.h

Issue 10382060: Unifies the two tab dragging variants. I would have liked to better (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/ui/views/tabs/default_tab_drag_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/tabs/default_tab_drag_controller.h
===================================================================
--- chrome/browser/ui/views/tabs/default_tab_drag_controller.h (revision 135842)
+++ chrome/browser/ui/views/tabs/default_tab_drag_controller.h (working copy)
@@ -1,426 +0,0 @@
-// 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.
-
-#ifndef CHROME_BROWSER_UI_VIEWS_TABS_DEFAULT_TAB_DRAG_CONTROLLER_H_
-#define CHROME_BROWSER_UI_VIEWS_TABS_DEFAULT_TAB_DRAG_CONTROLLER_H_
-#pragma once
-
-#include <vector>
-
-#include "base/memory/scoped_ptr.h"
-#include "base/message_loop.h"
-#include "base/timer.h"
-#include "chrome/browser/tabs/tab_strip_selection_model.h"
-#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
-#include "chrome/browser/ui/tabs/dock_info.h"
-#include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/web_contents_delegate.h"
-#include "ui/gfx/rect.h"
-
-namespace views {
-class View;
-}
-class BaseTab;
-class DraggedTabView;
-class TabStrip;
-class TabStripModel;
-
-struct TabRendererData;
-
-// TabDragController implementation that creates a widget representing the
-// dragged tabs when detached (dragged out of the source window).
-class DefaultTabDragController : public TabDragController,
- public content::WebContentsDelegate,
- public content::NotificationObserver,
- public MessageLoopForUI::Observer {
- public:
- DefaultTabDragController();
- virtual ~DefaultTabDragController();
-
- // Initializes DefaultTabDragController to drag the tabs in |tabs| originating
- // from |source_tabstrip|. |source_tab| is the tab that initiated the drag and
- // is contained in |tabs|. |mouse_offset| is the distance of the mouse
- // pointer from the origin of the first tab in |tabs| and |source_tab_offset|
- // the offset from |source_tab|. |source_tab_offset| is the horizontal distant
- // for a horizontal tab strip, and the vertical distance for a vertical tab
- // strip. |initial_selection_model| is the selection model before the drag
- // started and is only non-empty if |source_tab| was not initially selected.
- // TODO(sky): clean up move_only.
- void Init(TabStrip* source_tabstrip,
- BaseTab* source_tab,
- const std::vector<BaseTab*>& tabs,
- const gfx::Point& mouse_offset,
- int source_tab_offset,
- const TabStripSelectionModel& initial_selection_model,
- bool move_only);
-
- // See description above fields for details on these.
- bool active() const { return active_; }
- const TabStrip* attached_tabstrip() const { return attached_tabstrip_; }
-
- private:
- class DockDisplayer;
- friend class DockDisplayer;
-
- typedef std::set<gfx::NativeView> DockWindows;
-
- // Used to indicate the direction the mouse has moved when attached.
- static const int kMovedMouseLeft = 1 << 0;
- static const int kMovedMouseRight = 1 << 1;
-
- // Enumeration of the ways a drag session can end.
- enum EndDragType {
- // Drag session exited normally: the user released the mouse.
- NORMAL,
-
- // The drag session was canceled (alt-tab during drag, escape ...)
- CANCELED,
-
- // The tab (NavigationController) was destroyed during the drag.
- TAB_DESTROYED
- };
-
- // Stores the date associated with a single tab that is being dragged.
- struct TabDragData {
- TabDragData();
- ~TabDragData();
-
- // The TabContentsWrapper being dragged.
- TabContentsWrapper* contents;
-
- // The original content::WebContentsDelegate of |contents|, before it was
- // detached from the browser window. We store this so that we can forward
- // certain delegate notifications back to it if we can't handle them
- // locally.
- content::WebContentsDelegate* original_delegate;
-
- // This is the index of the tab in |source_tabstrip_| when the drag
- // began. This is used to restore the previous state if the drag is aborted.
- int source_model_index;
-
- // If attached this is the tab in |attached_tabstrip_|.
- BaseTab* attached_tab;
-
- // Is the tab pinned?
- bool pinned;
- };
-
- typedef std::vector<TabDragData> DragData;
-
- // Sets |drag_data| from |tab|. This also registers for necessary
- // notifications and resets the delegate of the TabContentsWrapper.
- void InitTabDragData(BaseTab* tab, TabDragData* drag_data);
-
- // TabDragController overrides:
- virtual void Drag() OVERRIDE;
- virtual void EndDrag(bool canceled) OVERRIDE;
- virtual bool GetStartedDrag() const OVERRIDE;
-
- // Overridden from content::WebContentsDelegate:
- virtual content::WebContents* OpenURLFromTab(
- content::WebContents* source,
- const content::OpenURLParams& params) OVERRIDE;
- virtual void NavigationStateChanged(const content::WebContents* source,
- unsigned changed_flags) OVERRIDE;
- virtual void AddNewContents(content::WebContents* source,
- content::WebContents* new_contents,
- WindowOpenDisposition disposition,
- const gfx::Rect& initial_pos,
- bool user_gesture) OVERRIDE;
- virtual void LoadingStateChanged(content::WebContents* source) OVERRIDE;
- virtual bool ShouldSuppressDialogs() OVERRIDE;
- virtual content::JavaScriptDialogCreator*
- GetJavaScriptDialogCreator() OVERRIDE;
-
- // Overridden from content::NotificationObserver:
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE;
-
- // Overridden from MessageLoop::Observer:
-#if defined(OS_WIN) || defined(USE_AURA)
- virtual base::EventStatus WillProcessEvent(
- const base::NativeEvent& event) OVERRIDE;
- virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE;
-#endif
-
- // Initialize the offset used to calculate the position to create windows
- // in |GetWindowCreatePoint|. This should only be invoked from |Init|.
- void InitWindowCreatePoint();
-
- // Returns the point where a detached window should be created given the
- // current mouse position.
- gfx::Point GetWindowCreatePoint() const;
-
- void UpdateDockInfo(const gfx::Point& screen_point);
-
- // Saves focus in the window that the drag initiated from. Focus will be
- // restored appropriately if the drag ends within this same window.
- void SaveFocus();
-
- // Restore focus to the View that had focus before the drag was started, if
- // the drag ends within the same Window as it began.
- void RestoreFocus();
-
- // Tests whether the position of the mouse is past a minimum elasticity
- // threshold required to start a drag.
- bool CanStartDrag() const;
-
- // Move the DraggedTabView according to the current mouse screen position,
- // potentially updating the source and other TabStrips.
- void ContinueDragging();
-
- // Handles dragging for a touch tabstrip when the tabs are stacked. Doesn't
- // actually reorder the tabs in anyway, just changes what's visible.
- void DragActiveTabStacked(const gfx::Point& screen_point);
-
- // Moves the active tab to the next/previous tab. Used when the next/previous
- // tab is stacked.
- void MoveAttachedToNextStackedIndex();
- void MoveAttachedToPreviousStackedIndex();
-
- // Handles dragging tabs while the tabs are attached.
- void MoveAttached(const gfx::Point& screen_point);
-
- // Handles dragging while the tabs are detached.
- void MoveDetached(const gfx::Point& screen_point);
-
- // If necessary starts the |move_stacked_timer_|. The timer is started if
- // close enough to an edge with stacked tabs.
- void StartMoveStackedTimerIfNecessary(int delay_ms);
-
-#if defined(OS_WIN) && !defined(USE_AURA)
- // Returns the compatible TabStrip that is under the specified point (screen
- // coordinates), or NULL if there is none.
- TabStrip* GetTabStripForPoint(const gfx::Point& screen_point);
-#endif
-
- DockInfo GetDockInfoAtPoint(const gfx::Point& screen_point);
-
- // Returns the specified |tabstrip| if it contains the specified point
- // (screen coordinates), NULL if it does not.
- TabStrip* GetTabStripIfItContains(TabStrip* tabstrip,
- const gfx::Point& screen_point) const;
-
- // Attach the dragged Tab to the specified TabStrip.
- void Attach(TabStrip* attached_tabstrip, const gfx::Point& screen_point);
-
- // Detach the dragged Tab from the current TabStrip.
- void Detach();
-
- // Determines the index to insert tabs at. |dragged_bounds| is the bounds of
- // the tabs being dragged, |start| the index of the tab to start looking from
- // and |delta| the amount to increment (1 or -1).
- int GetInsertionIndexFrom(const gfx::Rect& dragged_bounds,
- int start,
- int delta) const;
-
- // Returns the index where the dragged WebContents should be inserted into
- // |attached_tabstrip_| given the DraggedTabView's bounds |dragged_bounds| in
- // coordinates relative to |attached_tabstrip_| and has had the mirroring
- // transformation applied.
- // NOTE: this is invoked from |Attach| before the tabs have been inserted.
- int GetInsertionIndexForDraggedBounds(const gfx::Rect& dragged_bounds) const;
-
- // Returns true if |dragged_bounds| is close enough to the next stacked tab
- // so that the active tab should be dragged there.
- bool ShouldDragToNextStackedTab(const gfx::Rect& dragged_bounds,
- int index) const;
-
- // Returns true if |dragged_bounds| is close enough to the previous stacked
- // tab so that the active tab should be dragged there.
- bool ShouldDragToPreviousStackedTab(const gfx::Rect& dragged_bounds,
- int index) const;
-
- // Used by GetInsertionIndexForDraggedBounds() when the tabstrip is stacked.
- int GetInsertionIndexForDraggedBoundsStacked(
- const gfx::Rect& dragged_bounds) const;
-
- // Retrieve the bounds of the DraggedTabView relative to the attached
- // TabStrip. |tab_strip_point| is in the attached TabStrip's coordinate
- // system.
- gfx::Rect GetDraggedViewTabStripBounds(const gfx::Point& tab_strip_point);
-
- // Get the position of the dragged tab view relative to the attached tab
- // strip with the mirroring transform applied.
- gfx::Point GetAttachedDragPoint(const gfx::Point& screen_point);
-
- // Finds the Tabs within the specified TabStrip that corresponds to the
- // WebContents of the dragged tabs. Returns an empty vector if not attached.
- std::vector<BaseTab*> GetTabsMatchingDraggedContents(TabStrip* tabstrip);
-
- // Does the work for EndDrag. If we actually started a drag and |how_end| is
- // not TAB_DESTROYED then one of EndDrag or RevertDrag is invoked.
- void EndDragImpl(EndDragType how_end);
-
- // Reverts a cancelled drag operation.
- void RevertDrag();
-
- // Reverts the tab at |drag_index| in |drag_data_|.
- void RevertDragAt(size_t drag_index);
-
- // Selects the dragged tabs in |model|. Does nothing if there are no longer
- // any dragged contents (as happens when a WebContents is deleted out from
- // under us).
- void ResetSelection(TabStripModel* model);
-
- // Finishes a succesful drag operation.
- void CompleteDrag();
-
- // Resets the delegates of the WebContents.
- void ResetDelegates();
-
- // Create the DraggedTabView.
- void CreateDraggedView(const std::vector<TabRendererData>& data,
- const std::vector<gfx::Rect>& renderer_bounds);
-
- // Utility for getting the mouse position in screen coordinates.
- gfx::Point GetCursorScreenPoint() const;
-
- // Returns the bounds (in screen coordinates) of the specified View.
- gfx::Rect GetViewScreenBounds(views::View* tabstrip) const;
-
- // Hides the frame for the window that contains the TabStrip the current
- // drag session was initiated from.
- void HideFrame();
-
- // Closes a hidden frame at the end of a drag session.
- void CleanUpHiddenFrame();
-
- void DockDisplayerDestroyed(DockDisplayer* controller);
-
- void BringWindowUnderMouseToFront();
-
- // Convenience for getting the TabDragData corresponding to the tab the user
- // started dragging.
- TabDragData* source_tab_drag_data() {
- return &(drag_data_[source_tab_index_]);
- }
-
- // Convenience for |source_tab_drag_data()->contents|.
- TabContentsWrapper* source_dragged_contents() {
- return source_tab_drag_data()->contents;
- }
-
- // Returns true if the tabs were originality one after the other in
- // |source_tabstrip_|.
- bool AreTabsConsecutive();
-
- // Returns the TabStripModel for the specified tabstrip.
- TabStripModel* GetModel(TabStrip* tabstrip) const;
-
- // Handles registering for notifications.
- content::NotificationRegistrar registrar_;
-
- // The TabStrip the drag originated from.
- TabStrip* source_tabstrip_;
-
- // The TabStrip the dragged Tab is currently attached to, or NULL if the
- // dragged Tab is detached.
- TabStrip* attached_tabstrip_;
-
- // The visual representation of the dragged Tab.
- scoped_ptr<DraggedTabView> view_;
-
- // The position of the mouse (in screen coordinates) at the start of the drag
- // operation. This is used to calculate minimum elasticity before a
- // DraggedTabView is constructed.
- gfx::Point start_screen_point_;
-
- // This is the offset of the mouse from the top left of the Tab where
- // dragging begun. This is used to ensure that the dragged view is always
- // positioned at the correct location during the drag, and to ensure that the
- // detached window is created at the right location.
- gfx::Point mouse_offset_;
-
- // Offset of the mouse relative to the source tab.
- int source_tab_offset_;
-
- // Ratio of the x-coordinate of the |source_tab_offset_| to the width of the
- // tab. Not used for vertical tabs.
- float offset_to_width_ratio_;
-
- // A hint to use when positioning new windows created by detaching Tabs. This
- // is the distance of the mouse from the top left of the dragged tab as if it
- // were the distance of the mouse from the top left of the first tab in the
- // attached TabStrip from the top left of the window.
- gfx::Point window_create_point_;
-
- // Location of the first tab in the source tabstrip in screen coordinates.
- // This is used to calculate window_create_point_.
- gfx::Point first_source_tab_point_;
-
- // The bounds of the browser window before the last Tab was detached. When
- // the last Tab is detached, rather than destroying the frame (which would
- // abort the drag session), the frame is moved off-screen. If the drag is
- // aborted (e.g. by the user pressing Esc, or capture being lost), the Tab is
- // attached to the hidden frame and the frame moved back to these bounds.
- gfx::Rect restore_bounds_;
-
- // The last view that had focus in the window containing |source_tab_|. This
- // is saved so that focus can be restored properly when a drag begins and
- // ends within this same window.
- views::View* old_focused_view_;
-
- // The position along the major axis of the mouse cursor in screen coordinates
- // at the time of the last re-order event.
- int last_move_screen_loc_;
-
- DockInfo dock_info_;
-
- DockWindows dock_windows_;
-
- std::vector<DockDisplayer*> dock_controllers_;
-
- // Timer used to bring the window under the cursor to front. If the user
- // stops moving the mouse for a brief time over a browser window, it is
- // brought to front.
- base::OneShotTimer<DefaultTabDragController> bring_to_front_timer_;
-
- // Timer used to move the stacked tabs. See comment aboue
- // StartMoveStackedTimerIfNecessary().
- base::OneShotTimer<DefaultTabDragController> move_stacked_timer_;
-
- // Did the mouse move enough that we started a drag?
- bool started_drag_;
-
- // Is the drag active?
- bool active_;
-
- DragData drag_data_;
-
- // Index of the source tab in drag_data_.
- size_t source_tab_index_;
-
- // True until |MoveAttached| is invoked once.
- bool initial_move_;
-
- // The selection model before the drag started. See comment above Init() for
- // details.
- TabStripSelectionModel initial_selection_model_;
-
- // The selection model of |attached_tabstrip_| before the tabs were attached.
- TabStripSelectionModel selection_model_before_attach_;
-
- // Initial x-coordinates of the tabs when the drag started. Only used for
- // touch mode.
- std::vector<int> initial_tab_positions_;
-
- // TODO(sky): clean up.
- bool move_only_;
-
- // Updated as the mouse is moved when attached. Indicates whether the mouse
- // has ever moved to the left or right. If the tabs are ever detached this
- // is set to kMovedMouseRight | kMovedMouseLeft.
- int mouse_move_direction_;
-
- // Coordinate last used in MoveAttached().
- gfx::Point last_screen_point_;
-
- DISALLOW_COPY_AND_ASSIGN(DefaultTabDragController);
-};
-
-#endif // CHROME_BROWSER_UI_VIEWS_TABS_DEFAULT_TAB_DRAG_CONTROLLER_H_
« no previous file with comments | « no previous file | chrome/browser/ui/views/tabs/default_tab_drag_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698