summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authortkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-14 07:48:40 +0000
committertkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-14 07:48:40 +0000
commitc5cb2ed8738c6117a24b984b2f065f2839a585a3 (patch)
tree2635954ee1b2759225f25768a7c85f70f483097f /chrome/browser/cocoa
parent8a6461cf71bd1401e9b551d30818bfe39a2e4061 (diff)
downloadchromium_src-c5cb2ed8738c6117a24b984b2f065f2839a585a3.zip
chromium_src-c5cb2ed8738c6117a24b984b2f065f2839a585a3.tar.gz
chromium_src-c5cb2ed8738c6117a24b984b2f065f2839a585a3.tar.bz2
Mac: push back the detached tab position inside the dragging window.
BUG=32597 TEST=manual Patch by morrita@google Original code review: http://codereview.chromium.org/3333018/show git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59342 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r--chrome/browser/cocoa/browser_window_controller.h4
-rw-r--r--chrome/browser/cocoa/browser_window_controller.mm31
2 files changed, 34 insertions, 1 deletions
diff --git a/chrome/browser/cocoa/browser_window_controller.h b/chrome/browser/cocoa/browser_window_controller.h
index 7bbbe96..c90de7a 100644
--- a/chrome/browser/cocoa/browser_window_controller.h
+++ b/chrome/browser/cocoa/browser_window_controller.h
@@ -378,6 +378,10 @@ class TabContents;
// or the download shelf), so that future shrinking will occur from the bottom.
- (void)resetWindowGrowthState;
+// Computes by how far in each direction, horizontal and vertical, the
+// |source| rect doesn't fit into |target|.
+- (NSSize)overflowFrom:(NSRect)source
+ to:(NSRect)target;
@end // @interface BrowserWindowController(TestingAPI)
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm
index b2ec489..b7bbe34 100644
--- a/chrome/browser/cocoa/browser_window_controller.mm
+++ b/chrome/browser/cocoa/browser_window_controller.mm
@@ -1155,7 +1155,15 @@
gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y,
windowRect.size.width, windowRect.size.height);
- NSRect tabRect = [tabView frame];
+ NSRect sourceTabRect = [tabView frame];
+ NSView* tabStrip = [self tabStripView];
+
+ // Pushes tabView's frame back inside the tabstrip.
+ NSSize tabOverflow =
+ [self overflowFrom:[tabStrip convertRectToBase:sourceTabRect]
+ to:[tabStrip frame]];
+ NSRect tabRect = NSOffsetRect(sourceTabRect,
+ -tabOverflow.width, -tabOverflow.height);
// Before detaching the tab, store the pinned state.
bool isPinned = browser_->tabstrip_model()->IsTabPinned(index);
@@ -1684,6 +1692,27 @@ willAnimateFromState:(bookmarks::VisualState)oldState
isShrinkingFromZoomed_ = NO;
}
+- (NSSize)overflowFrom:(NSRect)source
+ to:(NSRect)target {
+ // If |source|'s boundary is outside of |target|'s, set its distance
+ // to |x|. Note that |source| can overflow to both side, but we
+ // have nothing to do for such case.
+ CGFloat x = 0;
+ if (NSMaxX(target) < NSMaxX(source)) // |source| overflows to right
+ x = NSMaxX(source) - NSMaxX(target);
+ else if (NSMinX(source) < NSMinX(target)) // |source| overflows to left
+ x = NSMinX(source) - NSMinX(target);
+
+ // Same as |x| above.
+ CGFloat y = 0;
+ if (NSMaxY(target) < NSMaxY(source))
+ y = NSMaxY(source) - NSMaxY(target);
+ else if (NSMinY(source) < NSMinY(target))
+ y = NSMinY(source) - NSMinY(target);
+
+ return NSMakeSize(x, y);
+}
+
// Override to swap in the correct tab strip controller based on the new
// tab strip mode.
- (void)toggleTabStripDisplayMode {