diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 1c201d1af..a5fc880b5 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -88,9 +88,6 @@ var CPTabViewDidSelectTabViewItemSelector = 1, _box = [[CPBox alloc] initWithFrame:[self bounds]]; [self setBackgroundColor:[CPColor colorWithCalibratedWhite:0.95 alpha:1.0]]; - [_box setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; - [_tabs setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin]; - [self addSubview:_box]; [self addSubview:_tabs]; } @@ -343,21 +340,9 @@ var CPTabViewDidSelectTabViewItemSelector = 1, _type = aTabViewType; if (_type !== CPTopTabsBezelBorder && _type !== CPBottomTabsBezelBorder) - { - [_box setFrame:[self bounds]]; [_tabs removeFromSuperview]; - } else - { - var aFrame = [self frame], - segmentedHeight = _CGRectGetHeight([_tabs frame]), - origin = _type === CPTopTabsBezelBorder ? segmentedHeight / 2 : 0; - - [_box setFrame:_CGRectMake(0, origin, _CGRectGetWidth(aFrame), - _CGRectGetHeight(aFrame) - segmentedHeight / 2)]; - [self addSubview:_tabs]; - } switch (_type) { @@ -373,6 +358,29 @@ var CPTabViewDidSelectTabViewItemSelector = 1, [_box setBorderType:CPNoBorder]; break; } + + [self setNeedsLayout]; +} + +- (void)layoutSubviews +{ + // Even if CPTabView's autoresizesSubviews is NO, _tabs and _box has to be laid out. + // This means we can't rely on autoresize masks. + if (_type !== CPTopTabsBezelBorder && _type !== CPBottomTabsBezelBorder) + { + [_box setFrame:[self bounds]]; + } + else + { + var aFrame = [self frame], + segmentedHeight = _CGRectGetHeight([_tabs frame]), + origin = _type === CPTopTabsBezelBorder ? segmentedHeight / 2 : 0; + + [_box setFrame:_CGRectMake(0, origin, _CGRectGetWidth(aFrame), + _CGRectGetHeight(aFrame) - segmentedHeight / 2)]; + + [self _repositionTabs]; + } } /*! @@ -497,7 +505,6 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", [_items makeObjectsPerformSelector:@selector(_setTabView:) withObject:self]; [self _updateItems]; - [self _repositionTabs]; [self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]]; @@ -506,6 +513,8 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", [self selectTabViewItem:selected]; [self setTabViewType:[aCoder decodeIntForKey:CPTabViewTypeKey]]; + + [self setNeedsLayout]; } return self; diff --git a/Tests/Manual/CPTabView2/AppController.j b/Tests/Manual/CPTabView2/AppController.j index 22658b7a2..9e4018f00 100644 --- a/Tests/Manual/CPTabView2/AppController.j +++ b/Tests/Manual/CPTabView2/AppController.j @@ -11,15 +11,18 @@ @implementation AppController : CPObject +{ + CPTabView tabView1; +} - (void)applicationDidFinishLaunching:(CPNotification)aNotification { var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], contentView = [theWindow contentView]; - var tabView = [[CPTabView alloc] initWithFrame:CGRectMake(50,50,400,400)]; - [tabView setTabViewType:CPNoTabsBezelBorder]; - [tabView setTabViewType:CPTopTabsBezelBorder]; + tabView1 = [[CPTabView alloc] initWithFrame:CGRectMake(50,50,400,400)]; + [tabView1 setTabViewType:CPNoTabsBezelBorder]; + [tabView1 setTabViewType:CPTopTabsBezelBorder]; var tabs = [ "First Tab", "a label", @@ -39,14 +42,27 @@ var item = [[CPTabViewItem alloc] initWithIdentifier:tabs[i]]; [item setView:view]; [item setLabel:tabs[i]]; - [tabView addTabViewItem:item]; + [tabView1 addTabViewItem:item]; } - [contentView addSubview:tabView]; + [contentView addSubview:tabView1]; - [tabView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [tabView1 setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + + var toggleButton = [CPButton buttonWithTitle:@"Cycle Tab View Type"]; + [toggleButton setAction:@selector(switchTabType:)]; + [toggleButton setTarget:self]; + [toggleButton sizeToFit]; + [toggleButton setFrameOrigin:CGPointMake(CGRectGetWidth([contentView frame]) - CGRectGetWidth([toggleButton frame]) - 15, 15)]; + [toggleButton setAutoresizingMask:CPViewMinXMargin | CPViewMaxYMargin]; + [contentView addSubview:toggleButton]; [theWindow orderFront:self]; } +- (@action)switchTabType:(id)sender +{ + [tabView1 setTabViewType:[tabView1 tabViewType] < CPNoTabsNoBorder ? [tabView1 tabViewType] + 1 : CPTopTabsBezelBorder]; +} + @end