diff --git a/AppKit/CPCookie.j b/AppKit/CPCookie.j index a34d6e59f..5e0f9bd4c 100644 --- a/AppKit/CPCookie.j +++ b/AppKit/CPCookie.j @@ -23,6 +23,7 @@ @import @import +#include "Platform/Platform.h" /*! @ingroup appkit diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index 9aad1b8fd..9b04aaebe 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -166,7 +166,7 @@ /*! Returns the size of the scroll view's content view. */ -- (CGRect)contentSize +- (CGSize)contentSize { return [_contentView frame].size; } diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index 04fa320ba..7c52a0cbb 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -1,31 +1,5 @@ -/* - * CPTabView.j - * AppKit - * - * Created by Francisco Tolmasky. - * Copyright 2008, 280 North, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -@import "CPImageView.j" -@import "CPTabViewItem.j" -@import "CPView.j" - -#include "CoreGraphics/CGGeometry.h" - +@import +@import /* Places tabs on top with a bezeled border. @@ -34,7 +8,7 @@ */ CPTopTabsBezelBorder = 0; //CPLeftTabsBezelBorder = 1; -//CPBottomTabsBezelBorder = 2; +CPBottomTabsBezelBorder = 2; //CPRightTabsBezelBorder = 3; /* Displays no tabs and has a bezeled border. @@ -55,173 +29,52 @@ CPNoTabsLineBorder = 5; */ CPNoTabsNoBorder = 6; -var CPTabViewBezelBorderLeftImage = nil, - CPTabViewBackgroundCenterImage = nil, - CPTabViewBezelBorderRightImage = nil, - CPTabViewBezelBorderColor = nil, - CPTabViewBezelBorderBackgroundColor = nil; - -var LEFT_INSET = 7.0, - RIGHT_INSET = 7.0; - var CPTabViewDidSelectTabViewItemSelector = 1, CPTabViewShouldSelectTabViewItemSelector = 2, CPTabViewWillSelectTabViewItemSelector = 4, CPTabViewDidChangeNumberOfTabViewItemsSelector = 8; -/*! - @ingroup appkit - @class CPTabView +var HEIGHT_OF_SEGMENTED_CONTROL = 24; - This class represents a view that has multiple subviews (CPTabViewItem) presented as individual tabs. - Only one CPTabViewItem is shown at a time, and other CPTabViewItems can be made visible - (one at a time) by clicking on the CPTabViewItem's tab at the top of the tab view. - - THe currently selected CPTabViewItem is the view that is displayed. -*/ @implementation CPTabView : CPView { - CPView _labelsView; - CPView _backgroundView; - CPView _separatorView; + CPArray items; - CPView _auxiliaryView; - CPView _contentView; + CPSegmentedControl tabs; + CPBox box; - CPArray _tabViewItems; - CPTabViewItem _selectedTabViewItem; + CPNumber selectedIndex; - CPTabViewType _tabViewType; - - id _delegate; - unsigned _delegateSelectors; -} - -/* - @ignore -*/ -+ (void)initialize -{ - if (self != CPTabView) - return; - - var bundle = [CPBundle bundleForClass:self], - - emptyImage = [[CPImage alloc] initByReferencingFile:@"" size:CGSizeMake(7.0, 0.0)], - backgroundImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/CPTabViewBezelBackgroundCenter.png"] size:CGSizeMake(1.0, 1.0)], - - bezelBorderLeftImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/CPTabViewBezelBorderLeft.png"] size:CGSizeMake(7.0, 1.0)], - bezerBorderImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/CPTabViewBezelBorder.png"] size:CGSizeMake(1.0, 1.0)], - bezelBorderRightImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/CPTabViewBezelBorderRight.png"] size:CGSizeMake(7.0, 1.0)]; - - CPTabViewBezelBorderBackgroundColor = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices: - [ - emptyImage, - emptyImage, - emptyImage, - - bezelBorderLeftImage, - backgroundImage, - bezelBorderRightImage, - - bezelBorderLeftImage, - bezerBorderImage, - bezelBorderRightImage - ]]]; - - CPTabViewBezelBorderColor = [CPColor colorWithPatternImage:bezerBorderImage]; -} - -/* - @ignore -*/ -+ (CPColor)bezelBorderColor -{ - return CPTabViewBezelBorderColor; + CPTabViewType type; + + id delegate; + unsigned delegateSelectors; } - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; - if (self) { - _tabViewType = CPTopTabsBezelBorder; - _tabViewItems = []; + items = [CPArray array]; + + tabs = [[CPSegmentedControl alloc] initWithFrame:CGRectMake(0, 0, 0, HEIGHT_OF_SEGMENTED_CONTROL)]; + [tabs setHitTests:NO]; + + box = [[CPBox alloc] initWithFrame:CGRectMake(0, HEIGHT_OF_SEGMENTED_CONTROL / 2, CGRectGetWidth(aFrame), + CGRectGetHeight(aFrame) - HEIGHT_OF_SEGMENTED_CONTROL)]; + + selectedIndex = CPNotFound; + + [self setTabViewType:CPTopTabsBezelBorder]; + [self setBackgroundColor:[CPColor colorWithCalibratedWhite:0.95 alpha:1.0]]; + + [self addSubview:box]; + [self addSubview:tabs]; } - return self; } -- (void)viewDidMoveToWindow -{ - if (_tabViewType != CPTopTabsBezelBorder || _labelsView) - return; - - [self _createBezelBorder]; - [self layoutSubviews]; -} - -/* @ignore */ -- (void)_createBezelBorder -{ - var bounds = [self bounds]; - - _labelsView = [[_CPTabLabelsView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(bounds), 0.0)]; - - [_labelsView setTabView:self]; - [_labelsView setAutoresizingMask:CPViewWidthSizable]; - - [self addSubview:_labelsView]; - - _backgroundView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; - - [_backgroundView setBackgroundColor:CPTabViewBezelBorderBackgroundColor]; - - [_backgroundView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; - - [self addSubview:_backgroundView]; - - _separatorView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; - - [_separatorView setBackgroundColor:[[self class] bezelBorderColor]]; - [_separatorView setAutoresizingMask:CPViewWidthSizable | CPViewMaxYMargin]; - - [self addSubview:_separatorView]; -} - -/* - Lays out the subviews - @ignore -*/ -- (void)layoutSubviews -{ - if (_tabViewType == CPTopTabsBezelBorder) - { - var backgroundRect = [self bounds], - labelsViewHeight = [_CPTabLabelsView height]; - - backgroundRect.origin.y += labelsViewHeight; - backgroundRect.size.height -= labelsViewHeight; - - [_backgroundView setFrame:backgroundRect]; - - var auxiliaryViewHeight = 5.0; - - if (_auxiliaryView) - { - auxiliaryViewHeight = CGRectGetHeight([_auxiliaryView frame]); - - [_auxiliaryView setFrame:CGRectMake(LEFT_INSET, labelsViewHeight, CGRectGetWidth(backgroundRect) - LEFT_INSET - RIGHT_INSET, auxiliaryViewHeight)]; - } - - [_separatorView setFrame:CGRectMake(LEFT_INSET, labelsViewHeight + auxiliaryViewHeight, CGRectGetWidth(backgroundRect) - LEFT_INSET - RIGHT_INSET, 1.0)]; - } - - // CPNoTabsNoBorder - [_contentView setFrame:[self contentRect]]; -} - // Adding and Removing Tabs /*! Adds a CPTabViewItem to the tab view. @@ -229,7 +82,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)addTabViewItem:(CPTabViewItem)aTabViewItem { - [self insertTabViewItem:aTabViewItem atIndex:[_tabViewItems count]]; + [self insertTabViewItem:aTabViewItem atIndex:[items count]]; } /*! @@ -240,20 +93,13 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)insertTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(unsigned)anIndex { - if (!_labelsView) - [self _createBezelBorder]; + [items insertObject:aTabViewItem atIndex:anIndex]; + + [self _updateItems]; + [self _repositionTabs]; - [_tabViewItems insertObject:aTabViewItem atIndex:anIndex]; - - [_labelsView tabView:self didAddTabViewItem:aTabViewItem]; - - [aTabViewItem _setTabView:self]; - - if ([_tabViewItems count] == 1) - [self selectFirstTabViewItem:self]; - - if (_delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) - [_delegate tabViewDidChangeNumberOfTabViewItems:self]; + if (delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) + [delegate tabViewDidChangeNumberOfTabViewItems:self]; } /*! @@ -262,16 +108,19 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)removeTabViewItem:(CPTabViewItem)aTabViewItem { - var index = [self indexOfTabViewItem:aTabViewItem]; + for (var i = 0; i < [items count]; i++) + { + if ([items objectAtIndex:i] === aTabViewItem) + { + [items removeObjectAtIndex:i]; + } + } - [_tabViewItems removeObjectIdenticalTo:aTabViewItem]; - - [_labelsView tabView:self didRemoveTabViewItemAtIndex:index]; - - [aTabViewItem _setTabView:nil]; - - if (_delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) - [_delegate tabViewDidChangeNumberOfTabViewItems:self]; + [self _updateItems]; + [self _repositionTabs]; + + if (delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) + [delegate tabViewDidChangeNumberOfTabViewItems:self]; } // Accessing Tabs @@ -281,7 +130,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (int)indexOfTabViewItem:(CPTabViewItem)aTabViewItem { - return [_tabViewItems indexOfObjectIdenticalTo:aTabViewItem]; + return [items indexOfObjectIdenticalTo:aTabViewItem]; } /*! @@ -290,14 +139,11 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (int)indexOfTabViewItemWithIdentifier:(CPString)anIdentifier { - var index = 0, - count = [_tabViewItems count]; - - for (; index < count; ++index) - if ([[_tabViewItems[index] identifier] isEqual:anIdentifier]) + for (var index = [items count]; index >= 0; index--) + if ([[items[index] identifier] isEqual:anIdentifier]) return index; - return index; + return CPNotFound; } /*! @@ -305,7 +151,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (unsigned)numberOfTabViewItems { - return [_tabViewItems count]; + return [items count]; } /*! @@ -313,7 +159,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (CPTabViewItem)tabViewItemAtIndex:(unsigned)anIndex { - return _tabViewItems[anIndex]; + return [items objectAtIndex:anIndex]; } /*! @@ -321,7 +167,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (CPArray)tabViewItems { - return _tabViewItems; + return [items copy]; // Copy? } // Selecting a Tab @@ -331,10 +177,10 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)selectFirstTabViewItem:(id)aSender { - var count = [_tabViewItems count]; - - if (count) - [self selectTabViewItemAtIndex:0]; + if ([items count] === 0) + return; // throw? + + [self selectTabViewItemAtIndex:0]; } /*! @@ -343,10 +189,10 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)selectLastTabViewItem:(id)aSender { - var count = [_tabViewItems count]; - - if (count) - [self selectTabViewItemAtIndex:count - 1]; + if ([items count] === 0) + return; // throw? + + [self selectTabViewItemAtIndex:[items count] - 1]; } /*! @@ -355,13 +201,15 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)selectNextTabViewItem:(id)aSender { - if (!_selectedTabViewItem) + if (selectedIndex === CPNotFound) return; - - var index = [self indexOfTabViewItem:_selectedTabViewItem], - count = [_tabViewItems count]; - - [self selectTabViewItemAtIndex:index + 1 % count]; + + var nextIndex = selectedIndex + 1; + + if (nextIndex === [items count]) + return; // does nothing. According to spec at (http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSTabView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTabView/selectNextTabViewItem:) + + [self selectTabViewItemAtIndex:nextIndex]; } /*! @@ -370,13 +218,15 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)selectPreviousTabViewItem:(id)aSender { - if (!_selectedTabViewItem) + if (selectedIndex === CPNotFound) return; + + var previousIndex = selectedIndex - 1; - var index = [self indexOfTabViewItem:_selectedTabViewItem], - count = [_tabViewItems count]; - - [self selectTabViewItemAtIndex:index == 0 ? count : index - 1]; + if (previousIndex < 0) + return; // does nothing. See above. + + [self selectTabViewItemAtIndex:previousIndex]; } /*! @@ -385,47 +235,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)selectTabViewItem:(CPTabViewItem)aTabViewItem { - if ((_delegateSelectors & CPTabViewShouldSelectTabViewItemSelector) && ![_delegate tabView:self shouldSelectTabViewItem:aTabViewItem]) - return; - - if (_delegateSelectors & CPTabViewWillSelectTabViewItemSelector) - [_delegate tabView:self willSelectTabViewItem:aTabViewItem]; - - if (_selectedTabViewItem) - { - _selectedTabViewItem._tabState = CPBackgroundTab; - [_labelsView tabView:self didChangeStateOfTabViewItem:_selectedTabViewItem]; - } - _selectedTabViewItem = aTabViewItem; - - _selectedTabViewItem._tabState = CPSelectedTab; - - var _previousContentView = _contentView; - _contentView = [_selectedTabViewItem view]; - - if (_previousContentView !== _contentView) - { - [_previousContentView removeFromSuperview]; - [_contentView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; - [self addSubview:_contentView]; - } - - var _previousAuxiliaryView = _auxiliaryView; - _auxiliaryView = [_selectedTabViewItem auxiliaryView]; - - if (_previousAuxiliaryView !== _auxiliaryView) - { - [_previousAuxiliaryView removeFromSuperview]; - [_auxiliaryView setAutoresizingMask:CPViewWidthSizable]; - [self addSubview:_auxiliaryView]; - } - - [_labelsView tabView:self didChangeStateOfTabViewItem:_selectedTabViewItem]; - - [self layoutSubviews]; - - if (_delegateSelectors & CPTabViewDidSelectTabViewItemSelector) - [_delegate tabView:self didSelectTabViewItem:aTabViewItem]; + [self selectTabViewItemAtIndex:[self indexOfTabViewItem:aTabViewItem]]; } /*! @@ -434,7 +244,20 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)selectTabViewItemAtIndex:(unsigned)anIndex { - [self selectTabViewItem:_tabViewItems[anIndex]]; + if (anIndex === selectedIndex) + return; + + if ((delegateSelectors & CPTabViewShouldSelectTabViewItemSelector) && ![delegate tabView:self shouldSelectTabViewItem:aTabViewItem]) + return; + + if (delegateSelectors & CPTabViewWillSelectTabViewItemSelector) + [delegate tabView:self willSelectTabViewItem:aTabViewItem]; + + [tabs selectSegmentWithTag:anIndex]; + [self _setSelectedIndex:anIndex]; + + if (delegateSelectors & CPTabViewDidSelectTabViewItemSelector) + [delegate tabView:self didSelectTabViewItem:aTabViewItem]; } /*! @@ -442,7 +265,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (CPTabViewItem)selectedTabViewItem { - return _selectedTabViewItem; + return [items objectAtIndex:selectedIndex]; } // @@ -452,22 +275,32 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)setTabViewType:(CPTabViewType)aTabViewType { - if (_tabViewType == aTabViewType) + if (type === aTabViewType) return; - - _tabViewType = aTabViewType; - - if (_tabViewType == CPNoTabsBezelBorder || _tabViewType == CPNoTabsLineBorder || _tabViewType == CPNoTabsNoBorder) - [_labelsView removeFromSuperview]; - else if (_labelsView && ![_labelsView superview]) - [self addSubview:_labelsView]; - - if (_tabViewType == CPNoTabsLineBorder || _tabViewType == CPNoTabsNoBorder) - [_backgroundView removeFromSuperview]; - else if (_backgroundView && ![_backgroundView superview]) - [self addSubview:_backgroundView]; - - [self layoutSubviews]; + + if ((type === CPTopTabsBezelBorder || type === CPBottomTabsBezelBorder) + && (aTabViewType !== CPTopTabsBezelBorder && aTabViewType !== CPBottomTabsBezelBorder)) + [tabs removeFromSuperview]; + + if ((type === CPNoTabsBezelBorder || type === CPNoTabsLineBorder || type === CPNoTabsNoBorder) + && (aTabViewType !== CPNoTabsBezelBorder && aTabViewType !== CPNoTabsBezelBorder && aTabViewType !== CPNoTabsNoBorder)) + [self addSubview:tabs]; + + type = aTabViewType; + + switch (type) { + case CPTopTabsBezelBorder: + case CPBottomTabsBezelBorder: + case CPNoTabsBezelBorder: + [box setBorderType:CPBezelBorder]; + break; + case CPNoTabsLineBorder: + [box setBorderType:CPLineBorder]; + break; + case CPNoTabsNoBorder: + [box setBorderType:CPNoBorder]; + break; + } } /*! @@ -475,31 +308,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (CPTabViewType)tabViewType { - return _tabViewType; -} - -// Determining the Size -/*! - Returns the content rectangle. -*/ -- (CGRect)contentRect -{ - var contentRect = CGRectMakeCopy([self bounds]); - - if (_tabViewType == CPTopTabsBezelBorder) - { - var labelsViewHeight = [_CPTabLabelsView height], - auxiliaryViewHeight = _auxiliaryView ? CGRectGetHeight([_auxiliaryView frame]) : 5.0, - separatorViewHeight = 1.0; - - contentRect.origin.y += labelsViewHeight + auxiliaryViewHeight + separatorViewHeight; - contentRect.size.height -= labelsViewHeight + auxiliaryViewHeight + separatorViewHeight * 2.0; // 2 for the bottom border as well. - - contentRect.origin.x += LEFT_INSET; - contentRect.size.width -= LEFT_INSET + RIGHT_INSET; - } - - return contentRect; + return type; } /*! @@ -507,7 +316,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (id)delegate { - return _delegate; + return delegate; } /*! @@ -516,35 +325,74 @@ var CPTabViewDidSelectTabViewItemSelector = 1, */ - (void)setDelegate:(id)aDelegate { - if (_delegate == aDelegate) + if (delegate == aDelegate) return; - _delegate = aDelegate; + delegate = aDelegate; - _delegateSelectors = 0; + delegateSelectors = 0; - if ([_delegate respondsToSelector:@selector(tabView:shouldSelectTabViewItem:)]) - _delegateSelectors |= CPTabViewShouldSelectTabViewItemSelector; + if ([delegate respondsToSelector:@selector(tabView:shouldSelectTabViewItem:)]) + delegateSelectors |= CPTabViewShouldSelectTabViewItemSelector; - if ([_delegate respondsToSelector:@selector(tabView:willSelectTabViewItem:)]) - _delegateSelectors |= CPTabViewWillSelectTabViewItemSelector; + if ([delegate respondsToSelector:@selector(tabView:willSelectTabViewItem:)]) + delegateSelectors |= CPTabViewWillSelectTabViewItemSelector; - if ([_delegate respondsToSelector:@selector(tabView:didSelectTabViewItem:)]) - _delegateSelectors |= CPTabViewDidSelectTabViewItemSelector; + if ([delegate respondsToSelector:@selector(tabView:didSelectTabViewItem:)]) + delegateSelectors |= CPTabViewDidSelectTabViewItemSelector; - if ([_delegate respondsToSelector:@selector(tabViewDidChangeNumberOfTabViewItems:)]) - _delegateSelectors |= CPTabViewDidChangeNumberOfTabViewItemsSelector; + if ([delegate respondsToSelector:@selector(tabViewDidChangeNumberOfTabViewItems:)]) + delegateSelectors |= CPTabViewDidChangeNumberOfTabViewItemsSelector; } -// +- (void)setBackgroundColor:(CPColor)aColor +{ + [box setBackgroundColor:aColor]; +} - (void)mouseDown:(CPEvent)anEvent { - var location = [_labelsView convertPoint:[anEvent locationInWindow] fromView:nil], - tabViewItem = [_labelsView representedTabViewItemAtPoint:location]; + var segmentIndex = [tabs testSegment:[tabs convertPoint:[anEvent locationInWindow] fromView:nil]]; + + if (segmentIndex != CPNotFound) + { + [self selectTabViewItemAtIndex:segmentIndex]; + [tabs trackSegment:anEvent]; + } +} - if (tabViewItem) - [self selectTabViewItem:tabViewItem]; +- (void)_repositionTabs +{ + var horizontalCenterOfSelf = CGRectGetWidth([self bounds]) / 2, + verticalCenterOfTabs = CGRectGetHeight([tabs bounds]) / 2; + + if (type === CPBottomTabsBezelBorder) + [tabs setCenter:CGPointMake(horizontalCenterOfSelf, CGRectGetHeight([self bounds]) - verticalCenterOfTabs)]; + else + [tabs setCenter:CGPointMake(horizontalCenterOfSelf, verticalCenterOfTabs)]; +} + +- (void)_setSelectedIndex:(CPNumber)index +{ + selectedIndex = index; + + [box setContentView:[[items objectAtIndex:selectedIndex] view]]; +} + +- (void)_updateItems +{ + [tabs setSegmentCount:[items count]]; + + for (var i = 0; i < [items count]; i++) + { + [tabs setLabel:[[items objectAtIndex:i] label] forSegment:i]; + [tabs setTag:i forSegment:i]; + } + + if (selectedIndex === CPNotFound) + { + [self selectFirstTabViewItem:self]; + } } @end @@ -560,15 +408,12 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", { if (self = [super initWithCoder:aCoder]) { - _tabViewType = [aCoder decodeIntForKey:CPTabViewTypeKey]; - _tabViewItems = []; + type = [aCoder decodeIntForKey:CPTabViewTypeKey]; + items = []; - // FIXME: this is somewhat hacky - [self _createBezelBorder]; - - var items = [aCoder decodeObjectForKey:CPTabViewItemsKey]; - for (var i = 0; items && i < items.length; i++) - [self insertTabViewItem:items[i] atIndex:i]; + var encodedItems = [aCoder decodeObjectForKey:CPTabViewItemsKey]; + for (var i = 0; encodedItems && i < encodedItems.length; i++) + [self insertTabViewItem:encodedItems[i] atIndex:i]; var selected = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; if (selected) @@ -582,227 +427,14 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", - (void)encodeWithCoder:(CPCoder)aCoder { - var actualSubviews = _subviews; - _subviews = []; [super encodeWithCoder:aCoder]; - _subviews = actualSubviews; + + [aCoder encodeObject:items forKey:CPTabViewItemsKey];; + [aCoder encodeObject:[self selectedTabViewItem] forKey:CPTabViewSelectedItemKey]; - [aCoder encodeObject:_tabViewItems forKey:CPTabViewItemsKey];; - [aCoder encodeObject:_selectedTabViewItem forKey:CPTabViewSelectedItemKey]; + [aCoder encodeInt:type forKey:CPTabViewTypeKey]; - [aCoder encodeInt:_tabViewType forKey:CPTabViewTypeKey]; - - [aCoder encodeConditionalObject:_delegate forKey:CPTabViewDelegateKey]; -} - -@end - - -var _CPTabLabelsViewBackgroundColor = nil, - _CPTabLabelsViewInsideMargin = 10.0, - _CPTabLabelsViewOutsideMargin = 15.0; - -/* @ignore */ -@implementation _CPTabLabelsView : CPView -{ - CPTabView _tabView; - CPDictionary _tabLabels; -} - -+ (void)initialize -{ - if (self != [_CPTabLabelsView class]) - return; - - var bundle = [CPBundle bundleForClass:self]; - - _CPTabLabelsViewBackgroundColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: - [ - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelsViewLeft.png"] size:CGSizeMake(12.0, 26.0)], - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelsViewCenter.png"] size:CGSizeMake(1.0, 26.0)], - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelsViewRight.png"] size:CGSizeMake(12.0, 26.0)] - ] isVertical:NO]]; -} - -+ (float)height -{ - return 26.0; -} - -- (id)initWithFrame:(CGRect)aFrame -{ - self = [super initWithFrame:aFrame]; - - if (self) - { - _tabLabels = []; - - [self setBackgroundColor:_CPTabLabelsViewBackgroundColor]; - - [self setFrameSize:CGSizeMake(CGRectGetWidth(aFrame), 26.0)]; - } - - return self; -} - -- (void)setTabView:(CPTabView)aTabView -{ - _tabView = aTabView; -} - -- (CPTabView)tabView -{ - return _tabView; -} - -- (void)tabView:(CPTabView)aTabView didAddTabViewItem:(CPTabViewItem)aTabViewItem -{ - var label = [[_CPTabLabel alloc] initWithFrame:CGRectMakeZero()]; - - [label setTabViewItem:aTabViewItem]; - - _tabLabels.push(label); - - [self addSubview:label]; - - [self layoutSubviews]; -} - -- (void)tabView:(CPTabView)aTabView didRemoveTabViewItemAtIndex:(unsigned)index -{ - var label = _tabLabels[index]; - - [_tabLabels removeObjectAtIndex:index]; - - [label removeFromSuperview]; - - [self layoutSubviews]; -} - - -(void)tabView:(CPTabView)aTabView didChangeStateOfTabViewItem:(CPTabViewItem)aTabViewItem - { - [_tabLabels[[aTabView indexOfTabViewItem:aTabViewItem]] setTabState:[aTabViewItem tabState]]; - } - -- (CPTabViewItem)representedTabViewItemAtPoint:(CGPoint)aPoint -{ - var index = 0, - count = _tabLabels.length; - - for (; index < count; ++index) - { - var label = _tabLabels[index]; - - if (CGRectContainsPoint([label frame], aPoint)) - return [label tabViewItem]; - } - - return nil; -} - -- (void)layoutSubviews -{ - var index = 0, - count = _tabLabels.length, - width = (_CGRectGetWidth([self bounds]) - (count - 1) * _CPTabLabelsViewInsideMargin - 2 * _CPTabLabelsViewOutsideMargin) / count, - x = _CPTabLabelsViewOutsideMargin; - - for (; index < count; ++index) - { - var label = _tabLabels[index], - frame = _CGRectMake(x, 8.0, width, 18.0); - - [label setFrame:frame]; - - x = _CGRectGetMaxX(frame) + _CPTabLabelsViewInsideMargin; - } -} - -- (void)setFrameSize:(CGSize)aSize -{ - if (CGSizeEqualToSize([self frame].size, aSize)) - return; - - [super setFrameSize:aSize]; - - [self layoutSubviews]; -} - -@end - -var _CPTabLabelBackgroundColor = nil, - _CPTabLabelSelectedBackgroundColor = nil; - -/* @ignore */ -@implementation _CPTabLabel : CPView -{ - CPTabViewItem _tabViewItem; - CPTextField _labelField; -} - -+ (void)initialize -{ - if (self != [_CPTabLabel class]) - return; - - var bundle = [CPBundle bundleForClass:self]; - - _CPTabLabelBackgroundColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: - [ - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelBackgroundLeft.png"] size:CGSizeMake(6.0, 18.0)], - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelBackgroundCenter.png"] size:CGSizeMake(1.0, 18.0)], - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelBackgroundRight.png"] size:CGSizeMake(6.0, 18.0)] - ] isVertical:NO]]; - - _CPTabLabelSelectedBackgroundColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: - [ - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelSelectedLeft.png"] size:CGSizeMake(3.0, 18.0)], - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelSelectedCenter.png"] size:CGSizeMake(1.0, 18.0)], - [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPTabView/_CPTabLabelSelectedRight.png"] size:CGSizeMake(3.0, 18.0)] - ] isVertical:NO]]; -} - -- (id)initWithFrame:(CGRect)aFrame -{ - self = [super initWithFrame:aFrame]; - - if (self) - { - _labelField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; - - [_labelField setAlignment:CPCenterTextAlignment]; - [_labelField setFrame:CGRectMake(5.0, 0.0, CGRectGetWidth(aFrame) - 10.0, 20.0)]; - [_labelField setAutoresizingMask:CPViewWidthSizable]; - [_labelField setFont:[CPFont boldSystemFontOfSize:11.0]]; - - [self addSubview:_labelField]; - - [self setTabState:CPBackgroundTab]; - } - - return self; -} - -- (void)setTabState:(CPTabState)aTabState -{ - [self setBackgroundColor:aTabState == CPSelectedTab ? _CPTabLabelSelectedBackgroundColor : _CPTabLabelBackgroundColor]; -} - -- (void)setTabViewItem:(CPTabViewItem)aTabViewItem -{ - _tabViewItem = aTabViewItem; - - [self update]; -} - -- (CPTabViewItem)tabViewItem -{ - return _tabViewItem; -} - -- (void)update -{ - [_labelField setStringValue:[_tabViewItem label]]; + [aCoder encodeConditionalObject:delegate forKey:CPTabViewDelegateKey]; } @end diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 6ae3eb5a8..f2090f24f 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -1071,7 +1071,7 @@ var themedButtonValues = nil, [ [@"track-width", 5.0], [@"track-color", trackColor, CPThemeStateVertical], - [@"track-color", trackDisabledColor, CPThemeStateDisabled], + [@"track-color", trackDisabledColor, CPThemeStateVertical | CPThemeStateDisabled], [@"knob-size", CGSizeMake(23.0, 24.0)], [@"knob-color", knobColor], diff --git a/Tests/Manual/CPTabView2/AppController.j b/Tests/Manual/CPTabView2/AppController.j new file mode 100644 index 000000000..df2af9cb8 --- /dev/null +++ b/Tests/Manual/CPTabView2/AppController.j @@ -0,0 +1,43 @@ +/* + * AppController.j + * CPTabView2 + * + * Created by You on August 27, 2010. + * Copyright 2010, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject + +- (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]; + + var view = [[CPView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)]; + [view addSubview:[CPTextField labelWithTitle:@"First"]]; + var item = [[CPTabViewItem alloc] initWithIdentifier:@"a"]; + [item setView:view]; + [item setLabel:"Test"]; + [tabView addTabViewItem:item]; + + view = [[CPView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)]; + [view addSubview:[CPTextField labelWithTitle:@"Second"]]; + item = [[CPTabViewItem alloc] initWithIdentifier:@"a"]; + [item setView:view]; + [item setLabel:"Test2"]; + [tabView addTabViewItem:item]; + + [contentView addSubview:tabView]; + + [theWindow orderFront:self]; +} + +@end diff --git a/Tests/Manual/CPTabView2/Info.plist b/Tests/Manual/CPTabView2/Info.plist new file mode 100644 index 000000000..f00b01f29 --- /dev/null +++ b/Tests/Manual/CPTabView2/Info.plist @@ -0,0 +1,12 @@ + + + + + CPApplicationDelegateClass + AppController + CPBundleName + CPTabView2 + CPPrincipalClass + CPApplication + + diff --git a/Tests/Manual/CPTabView2/Jakefile b/Tests/Manual/CPTabView2/Jakefile new file mode 100644 index 000000000..43a74e5db --- /dev/null +++ b/Tests/Manual/CPTabView2/Jakefile @@ -0,0 +1,93 @@ +/* + * Jakefile + * CPTabView2 + * + * Created by You on August 27, 2010. + * Copyright 2010, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"); + +app ("CPTabView2", function(task) +{ + task.setBuildIntermediatesPath(FILE.join("Build", "CPTabView2.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPTabView2"); + task.setIdentifier("com.yourcompany.CPTabView2"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPTabView2"); + task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", ["CPTabView2"], function() +{ + printResults(configuration); +}); + +task ("build", ["default"]); + +task ("debug", function() +{ + ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", "CPTabView2", "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", "CPTabView2", "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", "CPTabView2")); + OS.system(["press", "-f", FILE.join("Build", "Release", "CPTabView2"), FILE.join("Build", "Deployment", "CPTabView2")]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", "CPTabView2")); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "CPTabView2"), FILE.join("Build", "Desktop", "CPTabView2", "CPTabView2.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", "CPTabView2", "CPTabView2.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPTabView2")); + print("----------------------------"); +} diff --git a/Tests/Manual/CPTabView2/Resources/spinner.gif b/Tests/Manual/CPTabView2/Resources/spinner.gif new file mode 100644 index 000000000..06dbc2bc2 Binary files /dev/null and b/Tests/Manual/CPTabView2/Resources/spinner.gif differ diff --git a/Tests/Manual/CPTabView2/index-debug.html b/Tests/Manual/CPTabView2/index-debug.html new file mode 100644 index 000000000..d794ea518 --- /dev/null +++ b/Tests/Manual/CPTabView2/index-debug.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + CPTabView2 + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPTabView2/index.html b/Tests/Manual/CPTabView2/index.html new file mode 100644 index 000000000..904d15f6b --- /dev/null +++ b/Tests/Manual/CPTabView2/index.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + CPTabView2 + + + + + + + + + + + + +
+
+ + + +
+
+ + + + diff --git a/Tests/Manual/CPTabView2/main.j b/Tests/Manual/CPTabView2/main.j new file mode 100644 index 000000000..e4ad3053f --- /dev/null +++ b/Tests/Manual/CPTabView2/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPTabView2 + * + * Created by You on August 27, 2010. + * Copyright 2010, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/common.jake b/common.jake index 1aac31031..3607393e4 100644 --- a/common.jake +++ b/common.jake @@ -123,8 +123,8 @@ global.$BUILD_CJS_CAPPUCCINO_FRAMEWORKS = FILE.join($BUILD_CJS_CAPPUCCINO, "Fram global.CLEAN = require("jake/clean").CLEAN; global.CLOBBER = require("jake/clean").CLOBBER; -global.CLEAN.push(global.$BUILD_DIR); -global.CLOBBER.push(global.$BUILD_DIR); +global.CLEAN.include(global.$BUILD_DIR); +global.CLOBBER.include(global.$BUILD_DIR); global.$HOME_DIR = FILE.absolute(FILE.dirname(module.path)); global.$LICENSE_FILE = FILE.absolute(FILE.join(FILE.dirname(module.path), 'LICENSE'));