diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.mm | 36 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_cell.mm | 20 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_strip_controller.h | 26 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_strip_controller.mm | 92 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_strip_view.mm | 2 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_view.mm | 143 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_window_controller.h | 13 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_window_controller.mm | 18 |
8 files changed, 264 insertions, 86 deletions
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm index 048b641..c9d325f 100644 --- a/chrome/browser/cocoa/browser_window_controller.mm +++ b/chrome/browser/cocoa/browser_window_controller.mm @@ -275,6 +275,18 @@ willPositionSheet:(NSWindow *)sheet return [tabStripController_ selectedTabGrowBoxRect]; } +- (void)dropTabView:(NSView *)view atIndex:(NSUInteger)index { + [tabStripController_ dropTabView:view atIndex:index]; +} + +- (NSView *)selectedTabView { + return [tabStripController_ selectedTabView]; +} + +- (TabStripController *)tabStripController { + return tabStripController_; +} + - (void)setIsLoading:(BOOL)isLoading { [toolbarController_ setIsLoading:isLoading]; } @@ -296,8 +308,8 @@ willPositionSheet:(NSWindow *)sheet [toolbarController_ focusLocationBar]; } -- (void)arrangeTabs { - NOTIMPLEMENTED(); +- (void)layoutTabs { + [tabStripController_ layoutTabs]; } - (TabWindowController*)detachTabToNewWindow:(TabView*)tabView { @@ -317,6 +329,8 @@ willPositionSheet:(NSWindow *)sheet gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y, windowRect.size.width, windowRect.size.height); + NSRect tabRect = [tabView frame]; + // Detach it from the source window, which just updates the model without // deleting the tab contents. This needs to come before creating the new // Browser because it clears the TabContents' delegate, which gets hooked @@ -336,15 +350,27 @@ willPositionSheet:(NSWindow *)sheet [newBrowser->window()->GetNativeHandle() delegate]; DCHECK(controller && [controller isKindOfClass:[TabWindowController class]]); + // Force the added tab to the right size (remove stretching) + tabRect.size.height = [TabStripController defaultTabHeight]; + NSView *newTabView = [controller selectedTabView]; + [newTabView setFrame:tabRect]; + return controller; } -- (void)insertPlaceholderForTab:(TabView*)tab atLocation:(NSInteger)xLocation { - NOTIMPLEMENTED(); + +- (void)insertPlaceholderForTab:(TabView*)tab + frame:(NSRect)frame + yStretchiness:(CGFloat)yStretchiness { + [tabStripController_ insertPlaceholderForTab:tab + frame:frame + yStretchiness:yStretchiness]; } - (void)removePlaceholder { - NOTIMPLEMENTED(); + [tabStripController_ insertPlaceholderForTab:nil + frame:NSZeroRect + yStretchiness:0]; } - (BOOL)isBookmarkBarVisible { diff --git a/chrome/browser/cocoa/tab_cell.mm b/chrome/browser/cocoa/tab_cell.mm index 0600c21..088f848 100644 --- a/chrome/browser/cocoa/tab_cell.mm +++ b/chrome/browser/cocoa/tab_cell.mm @@ -21,9 +21,6 @@ } - (NSBackgroundStyle)interiorBackgroundStyle { - // GTMThemeStyle style = - // [self isHighlighted] ? GTMThemeStyleTabBarSelected - // : GTMThemeStyleTabBarDeselected; return [[GTMTheme defaultTheme] interiorBackgroundStyleForStyle:GTMThemeStyleTabBarSelected active:YES]; @@ -97,7 +94,6 @@ active:active]; // Stroke with a translucent black [[NSColor colorWithCalibratedWhite:0.0 alpha:active ? 0.3 : 0.1] set]; - [path fill]; } [[NSGraphicsContext currentContext] saveGraphicsState]; @@ -105,17 +101,27 @@ [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set]; [path setLineWidth:selected ? 2.0 : 1.0]; [path stroke]; + [[NSGraphicsContext currentContext] restoreGraphicsState]; [gradient drawInBezierPath:path angle:90.0]; - [[NSColor darkGrayColor] set]; + + if (!selected) { + [path addClip]; + NSRect borderRect, contentRect; + NSDivideRect(rect, &borderRect, &contentRect, 1, NSMaxYEdge); + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.4] set]; + NSRectFillUsingOperation(borderRect, NSCompositeSourceOver); + } [[NSGraphicsContext currentContext] restoreGraphicsState]; // Inset where the text and favicon are drawn to keep them away from the - // sloping edges of the tab. + // sloping edges of the tab and the close box. int kInteriorInset = cellFrame.size.height / 2.0; - [self drawInteriorWithFrame:NSInsetRect(cellFrame, kInteriorInset, 0) + NSRect frame = NSInsetRect(cellFrame, kInteriorInset, 0); + frame.size.width -= 16; // Inset for close box + [self drawInteriorWithFrame:frame inView:controlView]; } diff --git a/chrome/browser/cocoa/tab_strip_controller.h b/chrome/browser/cocoa/tab_strip_controller.h index d4bd199..28e5ff0 100644 --- a/chrome/browser/cocoa/tab_strip_controller.h +++ b/chrome/browser/cocoa/tab_strip_controller.h @@ -11,6 +11,7 @@ #include "base/scoped_ptr.h" #import "chrome/browser/cocoa/tab_controller_target.h" +@class TabView; @class TabStripView; class TabStripModelObserverBridge; @@ -45,6 +46,11 @@ class ToolbarModel; // an array of TabControllers which manage the actual tab views. As above, // this is kept in the same order as the tab strip model. scoped_nsobject<NSMutableArray> tabArray_; + + // These values are only used during a drag, and override tab positioning + TabView* placeholderTab_; // weak. Tab being dragged + NSRect placeholderFrame_; // Frame to use + CGFloat placeholderStretchiness_; // Vertical force indicated by streching tab } // Initialize the controller with a view and browser that contains @@ -60,9 +66,29 @@ class ToolbarModel; // in the coordinate system of the content area of the currently selected tab. - (NSRect)selectedTabGrowBoxRect; +// Return the view for the currently selected tab. +- (NSView *)selectedTabView; + +// Drop a tab view at a new index in the array. +- (void)dropTabView:(NSView *)view atIndex:(NSUInteger)index; + // Given a tab view in the strip, return its index. Returns -1 if not present. - (NSInteger)indexForTabView:(NSView*)view; +// return the view at a given index +- (NSView*)viewAtIndex:(NSUInteger)index; + +// Set the placeholder for a dragged tab, allowing the |frame| and |strechiness| +// to be specified. This causes this tab to be rendered in an arbitrary position +- (void)insertPlaceholderForTab:(TabView*)tab + frame:(NSRect)frame + yStretchiness:(CGFloat)yStretchiness; + +// Force the tabs to rearrange themselves to reflect the current model +- (void)layoutTabs; + +// Default height for tabs. ++ (CGFloat)defaultTabHeight; @end #endif // CHROME_BROWSER_COCOA_TAB_STRIP_CONTROLLER_H_ diff --git a/chrome/browser/cocoa/tab_strip_controller.mm b/chrome/browser/cocoa/tab_strip_controller.mm index 524d11c..5d33a32 100644 --- a/chrome/browser/cocoa/tab_strip_controller.mm +++ b/chrome/browser/cocoa/tab_strip_controller.mm @@ -47,6 +47,10 @@ return self; } ++ (CGFloat)defaultTabHeight { + return 24.0; +} + // Finds the associated TabContentsController at the given |index| and swaps // out the sole child of the contentArea to display its contents. - (void)swapInTabAtIndex:(NSInteger)index { @@ -119,11 +123,29 @@ // Called when the user closes a tab. Asks the model to close the tab. - (void)closeTab:(id)sender { - int index = [self indexForTabView:sender]; - if (index >= 0 && tabModel_->ContainsIndex(index)) - tabModel_->CloseTabContentsAt(index); + if ([self numberOfTabViews] > 1) { + int index = [self indexForTabView:sender]; + if (index >= 0 && tabModel_->ContainsIndex(index)) + tabModel_->CloseTabContentsAt(index); + } else { + // Use the standard window close if this is the last tab + // this prevents the tab from being removed from the model until after + // the window dissapears + [[tabView_ window] performClose:nil]; + } +} + + +- (void)insertPlaceholderForTab:(TabView*)tab + frame:(NSRect)frame + yStretchiness:(CGFloat)yStretchiness { + placeholderTab_ = tab; + placeholderFrame_ = frame; + placeholderStretchiness_ = yStretchiness; + [self layoutTabs]; } + // Lay out all tabs in the order of their TabContentsControllers, which matches // the ordering in the TabStripModel. This call isn't that expensive, though // it is O(n) in the number of tabs. Tabs will animate to their new position @@ -152,24 +174,45 @@ kMaxTabWidth), kMinTabWidth); + CGFloat minX = NSMinX(placeholderFrame_); + + NSUInteger i = 0; + NSInteger gap = -1; for (TabController* tab in tabArray_.get()) { - // BOOL isPlaceholder = ![[[tab view] superview] isEqual:tabView_]; - BOOL isPlaceholder = NO; + BOOL isPlaceholder = [[tab view] isEqual:placeholderTab_]; NSRect tabFrame = [[tab view] frame]; - // If the tab is all the way on the left, we consider it a new tab. We - // need to show it, but not animate the movement. We do however want to - // animate the display. - BOOL newTab = NSMinX(tabFrame) == 0; + tabFrame.size.height = [[self class] defaultTabHeight]; + tabFrame.origin.y = 0; + tabFrame.origin.x = offset; + + // If the tab is hidden, we consider it a new tab. We make it visible + // and animate it in. + BOOL newTab = [[tab view] isHidden]; if (newTab) { - id visibilityTarget = visible ? [[tab view] animator] : [tab view]; - [visibilityTarget setHidden:NO]; + [[tab view] setHidden:NO]; } - tabFrame.origin = NSMakePoint(offset, 0); - if (!isPlaceholder) { - // Set the tab's new frame and animate the tab to its new location. Don't - // animate if the window isn't visible or if the tab is new. - BOOL animate = visible && !newTab; - id frameTarget = animate ? [[tab view] animator] : [tab view]; + + if (isPlaceholder) { + tabFrame.origin.x = placeholderFrame_.origin.x; + tabFrame.size.height += 10.0 * placeholderStretchiness_; + [[tab view] setFrame:tabFrame]; + continue; + } else { + // If our left edge is to the left of the placeholder's left, but our mid + // is to the right of it we should slide over to make space for it. + if (placeholderTab_ && gap < 0 && NSMidX(tabFrame) > minX) { + gap = i; + offset += NSWidth(tabFrame); + offset -= kTabOverlap; + tabFrame.origin.x = offset; + } + + // Animate the tab in by putting it below the horizon. + if (newTab && visible) { + [[tab view] setFrame:NSOffsetRect(tabFrame, 0, -NSHeight(tabFrame))]; + } + + id frameTarget = visible ? [[tab view] animator] : [tab view]; tabFrame.size.width = [tab selected] ? kMaxTabWidth : baseTabWidth; [frameTarget setFrame:tabFrame]; } @@ -178,11 +221,13 @@ offset += NSWidth(tabFrame); offset -= kTabOverlap; } + i++; } // Move the new tab button into place [[newTabButton_ animator] setFrameOrigin: NSMakePoint(MIN(availableWidth, offset + kNewTabButtonOffset), 0)]; + if (i > 0) [[newTabButton_ animator] setHidden:NO]; [NSAnimationContext endGrouping]; } @@ -222,6 +267,9 @@ TabController* newController = [self newTab]; [tabArray_ insertObject:newController atIndex:index]; NSView* newView = [newController view]; + [newView setFrame:NSOffsetRect([newView frame], + 0, [[self class] defaultTabHeight])]; + [tabView_ addSubview:newView positioned:inForeground ? NSWindowAbove : NSWindowBelow relativeTo:nil]; @@ -301,6 +349,16 @@ [updatedController tabDidChange:contents]; } +- (NSView *)selectedTabView { + int selectedIndex = tabModel_->selected_index(); + return [self viewAtIndex:selectedIndex]; +} + +- (void)dropTabView:(NSView *)view atIndex:(NSUInteger)index { + // TODO(pinkerton): implement drop + NOTIMPLEMENTED(); +} + // Return the rect, in WebKit coordinates (flipped), of the window's grow box // in the coordinate system of the content area of the currently selected tab. - (NSRect)selectedTabGrowBoxRect { diff --git a/chrome/browser/cocoa/tab_strip_view.mm b/chrome/browser/cocoa/tab_strip_view.mm index d63d6ef..fd61766 100644 --- a/chrome/browser/cocoa/tab_strip_view.mm +++ b/chrome/browser/cocoa/tab_strip_view.mm @@ -18,7 +18,7 @@ NSRect boundsRect = [self bounds]; NSRect borderRect, contentRect; NSDivideRect(boundsRect, &borderRect, &contentRect, 1, NSMinYEdge); - [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set]; + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.3] set]; NSRectFillUsingOperation(borderRect, NSCompositeSourceOver); } diff --git a/chrome/browser/cocoa/tab_view.mm b/chrome/browser/cocoa/tab_view.mm index 2aef856..fd31652 100644 --- a/chrome/browser/cocoa/tab_view.mm +++ b/chrome/browser/cocoa/tab_view.mm @@ -3,7 +3,6 @@ // found in the LICENSE file. #include "chrome/browser/cocoa/tab_view.h" - #include "chrome/browser/cocoa/tab_window_controller.h" @implementation TabView @@ -44,6 +43,8 @@ // ideas of dragging cocoa views between windows and how the Browser and // TabStrip models want to manage tabs. - (void)mouseDown:(NSEvent *)theEvent { + static const CGFloat kTearDistance = 36.0; + // Make sure the controller doesn't go away while we're doing this. // TODO(pinkerton): cole had this, not sure why it's necessary. [[controller_ retain] autorelease]; @@ -53,26 +54,63 @@ [[controller_ target] performSelector:[controller_ action] withObject:self]; - // TODO(pinkerton): necessary to pre-arrange the tabs here? - // Resolve overlay back to original window. NSWindow* sourceWindow = [self window]; if ([sourceWindow isKindOfClass:[NSPanel class]]) { sourceWindow = [sourceWindow parentWindow]; } + TabWindowController* sourceController = [sourceWindow windowController]; - TabWindowController* draggedController = nil; - TabWindowController* targetController = nil; // We don't want to "tear off" a tab if there's only one in the window. Treat - // it like we're dragging around a tab we've already detached. - BOOL isLastRemainingTab = [sourceController numberOfTabs] == 1; + // it like we're dragging around a tab we've already detached. Note that + // unit tests might have |-numberOfTabs| reporting zero since the model + // won't be fully hooked up. We need to be prepared for that and not send + // them into the "magnetic" codepath. + BOOL isLastRemainingTab = [sourceController numberOfTabs] <= 1; - NSWindow* dragWindow = nil; - NSWindow* dragOverlay = nil; BOOL dragging = YES; BOOL moved = NO; + NSPoint lastPoint = + [[theEvent window] convertBaseToScreen:[theEvent locationInWindow]]; + + // First, go through the magnetic drag cycle. We break out of this if + // "stretchiness" ever exceeds the a set amount. + NSRect frame = [self frame]; + if (!isLastRemainingTab) { + while (dragging) { + theEvent = + [NSApp nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask + untilDate:[NSDate distantFuture] + inMode:NSDefaultRunLoopMode dequeue:YES]; + NSPoint thisPoint = [NSEvent mouseLocation]; + CGFloat stretchiness = thisPoint.y - lastPoint.y; + stretchiness = copysign(sqrtf(fabs(stretchiness))/sqrtf(kTearDistance), + stretchiness); + [sourceController insertPlaceholderForTab:self + frame:NSOffsetRect(frame, + thisPoint.x - lastPoint.x, 0) + yStretchiness:stretchiness]; + + CGFloat tearForce = fabs(thisPoint.y - lastPoint.y); + if (tearForce > kTearDistance) break; + if ([theEvent type] == NSLeftMouseUp) { + // Mouse up, break out of the drag event tracking loop + dragging = NO; + break; + } + } + } + + [sourceController removePlaceholder]; + + TabWindowController* draggedController = nil; + TabWindowController* targetController = nil; + + NSWindow* dragWindow = nil; + NSWindow* dragOverlay = nil; + // Do not start dragging until the user has "torn" the tab off by // moving more than 3 pixels. BOOL torn = NO; @@ -81,9 +119,6 @@ NSDate* targetDwellDate = nil; // The date this target was first chosen NSMutableArray* targets = [NSMutableArray array]; - NSPoint lastPoint = - [[theEvent window] convertBaseToScreen:[theEvent locationInWindow]]; - while (dragging) { theEvent = [NSApp nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask @@ -91,16 +126,13 @@ inMode:NSDefaultRunLoopMode dequeue:YES]; NSPoint thisPoint = [NSEvent mouseLocation]; - // TODO(alcor): Pinkerton indicated that cole is adding a more - // formal concept of "magnetism" to tab detachment, which would - // be an alternative solution. if (!torn) { double dx = thisPoint.x - lastPoint.x; double dy = thisPoint.y - lastPoint.y; if (dx * dx + dy * dy < kDragStartDistance * kDragStartDistance - && [theEvent type] == NSLeftMouseDragged) { - continue; + && [theEvent type] == NSLeftMouseDragged) { + continue; } torn = YES; } @@ -125,7 +157,11 @@ for (TabWindowController* target in targets) { NSRect windowFrame = [[target window] frame]; if (NSPointInRect(thisPoint, windowFrame)) { - if (NSPointInRect(thisPoint, [[target tabStripView] frame])) { + NSRect tabStripFrame = [[target tabStripView] frame]; + tabStripFrame = [[target tabStripView] convertRectToBase:tabStripFrame]; + tabStripFrame.origin = [[target window] + convertBaseToScreen:tabStripFrame.origin]; + if (NSPointInRect(thisPoint, tabStripFrame)) { newTarget = target; } break; @@ -136,7 +172,7 @@ // target and reset how long we've been hovering over this new one. if (targetController != newTarget) { targetDwellDate = [NSDate date]; - [targetController arrangeTabs]; + [targetController removePlaceholder]; targetController = newTarget; } @@ -161,8 +197,12 @@ [draggedController showOverlay]; dragOverlay = [draggedController overlayWindow]; - if (![targets count]) - [dragOverlay setHasShadow:NO]; + NSPoint origin = [sourceWindow frame].origin; + + origin.y += thisPoint.y - lastPoint.y; + [dragWindow setFrameOrigin:NSMakePoint(origin.x, origin.y)]; + //if (![targets count]) + // [dragOverlay setHasShadow:NO]; } else { NSPoint origin = [dragWindow frame].origin; origin.x += thisPoint.x - lastPoint.x; @@ -173,9 +213,7 @@ // If we're not hovering over any window, make the window is fully // opaque. Otherwise, find where the tab might be dropped and insert // a placeholder so it appears like it's part of that window. - if (!targetController) { - [[dragWindow animator] setAlphaValue:1.0]; - } else { + if (targetController) { if (![[targetController window] isKeyWindow]) { // && ([targetDwellDate timeIntervalSinceNow] < -REQUIRED_DWELL)) { [[targetController window] makeKeyAndOrderFront:nil]; @@ -186,21 +224,30 @@ // Compute where placeholder should go and insert it into the // destination tab strip. NSRect dropTabFrame = [[targetController tabStripView] frame]; + NSView *draggedTabView = [draggedController selectedTabView]; + NSRect tabFrame = [draggedTabView frame]; + tabFrame = [draggedTabView convertRectToBase:[self bounds]]; + tabFrame.origin = [dragWindow + convertBaseToScreen:tabFrame.origin]; + tabFrame.origin = [[targetController window] + convertScreenToBase:tabFrame.origin]; + tabFrame = [[targetController tabStripView] + convertRectFromBase:tabFrame]; NSPoint point = [sourceWindow convertBaseToScreen: [self convertPointToBase:NSZeroPoint]]; - int x = NSWidth([self bounds]) / 2 + point.x - dropTabFrame.origin.x; - [targetController insertPlaceholderForTab:self atLocation:x]; - [targetController arrangeTabs]; - - if (!targetController) - [dragWindow makeKeyAndOrderFront:nil]; - [[dragWindow animator] setAlphaValue:targetController ? 0.0 : 0.333]; - - [[[draggedController overlayWindow] animator] - setAlphaValue:targetController ? 0.85 : 1.0]; - // [setAlphaValue:targetController ? 0.0 : 0.6]; + [targetController insertPlaceholderForTab:self + frame:tabFrame + yStretchiness:0]; + [targetController layoutTabs]; + } else { + [dragWindow makeKeyAndOrderFront:nil]; } + + [dragWindow setHasShadow:NO]; + [dragWindow setAlphaValue:targetController ? 0.1 : 0.5]; + [[draggedController overlayWindow] + setAlphaValue:targetController ? 0.85 : 1.0]; } else if (type == NSLeftMouseUp) { // Mouse up, break out of the drag event tracking loop dragging = NO; @@ -212,38 +259,38 @@ // and clean up. if (moved) { TabWindowController *dropController = targetController; +#if 1 + dropController = nil; // Don't allow drops on other windows for now +#endif if (dropController) { -#if 0 -// TODO(alcor/pinkerton): hookup drops on existing windows + // TODO(alcor/pinkerton): hookup drops on existing windows NSRect adjustedFrame = [self bounds]; NSRect dropTabFrame = [[dropController tabStripView] frame]; adjustedFrame.origin = [self convertPointToBase:NSZeroPoint]; adjustedFrame.origin = - [sourceWindow convertBaseToScreen:adjustedFrame.origin]; + [sourceWindow convertBaseToScreen:adjustedFrame.origin]; adjustedFrame.origin.x = adjustedFrame.origin.x - dropTabFrame.origin.x; -// adjustedFrame.origin.y = adjustedFrame.origin.y - dropTabFrame.origin.y; -// adjustedFrame.size.height += adjustedFrame.origin.y; + //adjustedFrame.origin.y = adjustedFrame.origin.y - dropTabFrame.origin.y; + //adjustedFrame.size.height += adjustedFrame.origin.y; adjustedFrame.origin.y = 0; - // TODO(alcor): get add tab stuff working // [dropController addTab:tab_]; - [self setFrame:adjustedFrame]; - [dropController arrangeTabs]; + [dropController layoutTabs]; [draggedController close]; [dropController showWindow:nil]; -#endif } else { + [targetController removePlaceholder]; [[dragWindow animator] setAlphaValue:1.0]; [dragOverlay setHasShadow:NO]; - [draggedController removeOverlayAfterDelay: - [[NSAnimationContext currentContext] duration]]; + [dragWindow setHasShadow:YES]; + [draggedController removeOverlay]; [dragWindow makeKeyAndOrderFront:nil]; [[draggedController window] setLevel:NSNormalWindowLevel]; - [draggedController arrangeTabs]; + [draggedController layoutTabs]; } - [sourceController arrangeTabs]; + [sourceController layoutTabs]; } } diff --git a/chrome/browser/cocoa/tab_window_controller.h b/chrome/browser/cocoa/tab_window_controller.h index 60d13de..e86c829 100644 --- a/chrome/browser/cocoa/tab_window_controller.h +++ b/chrome/browser/cocoa/tab_window_controller.h @@ -47,7 +47,7 @@ // appropriate. // Layout the tabs based on the current ordering of the model. -- (void)arrangeTabs; +- (void)layoutTabs; // Creates a new window by pulling the given tab out and placing it in // the new window. Returns the controller for the new window. The size of the @@ -55,8 +55,9 @@ - (TabWindowController*)detachTabToNewWindow:(TabView*)tabView; // Make room in the tab strip for |tab| at the given x coordinate. -// TODO(pink): is |tab| a necessary parameter? -- (void)insertPlaceholderForTab:(TabView*)tab atLocation:(NSInteger)xLocation; +- (void)insertPlaceholderForTab:(TabView*)tab + frame:(NSRect)frame + yStretchiness:(CGFloat)yStretchiness; // Removes the placeholder installed by |-insertPlaceholderForTab:atLocation:|. - (void)removePlaceholder; @@ -65,6 +66,12 @@ // dragging the only tab in the window. - (NSInteger)numberOfTabs; +// Return the view of the selected tab. +- (NSView *)selectedTabView; + +// Drop a given tab view at a new index. +- (void)dropTabView:(NSView *)view atIndex:(NSUInteger)index; + // The title of the selected tab. - (NSString*)selectedTabTitle; diff --git a/chrome/browser/cocoa/tab_window_controller.mm b/chrome/browser/cocoa/tab_window_controller.mm index 89ae67f..f7e6079 100644 --- a/chrome/browser/cocoa/tab_window_controller.mm +++ b/chrome/browser/cocoa/tab_window_controller.mm @@ -79,13 +79,10 @@ [contentView addSubview:[self tabStripView]]; cachedContentView_ = [[self window] contentView]; [self moveViewsBetweenWindowAndOverlay:useOverlay]; - [overlayWindow_ setHasShadow:YES]; [[self window] addChildWindow:overlayWindow_ ordered:NSWindowAbove]; [overlayWindow_ orderFront:nil]; - [[self window] setHasShadow:NO]; } else if (!useOverlay && overlayWindow_) { DCHECK(cachedContentView_); - [[self window] setHasShadow:YES]; [[self window] setContentView:cachedContentView_]; [self moveViewsBetweenWindowAndOverlay:useOverlay]; [[self window] makeFirstResponder:cachedContentView_]; @@ -102,7 +99,16 @@ return overlayWindow_; } -- (void)arrangeTabs { +- (void)dropTabView:(NSView *)view atIndex:(NSUInteger)index { + NOTIMPLEMENTED(); +} + +- (NSView *)selectedTabView { + NOTIMPLEMENTED(); + return nil; +} + +- (void)layoutTabs { // subclass must implement NOTIMPLEMENTED(); } @@ -113,7 +119,9 @@ return NULL; } -- (void)insertPlaceholderForTab:(TabView*)tab atLocation:(NSInteger)xLocation { +- (void)insertPlaceholderForTab:(TabView*)tab + frame:(NSRect)frame + yStretchiness:(CGFloat)yStretchiness { // subclass must implement NOTIMPLEMENTED(); } |