Merge pull request #1120 from sfsam/tabs

Tabs
This commit is contained in:
Yee Cheng Chin
2025-01-24 09:13:39 +09:00
committed by GitHub
131 changed files with 1285 additions and 9364 deletions
+2 -1
View File
@@ -310,9 +310,10 @@ KEY VALUE ~
*MMSmoothResize* allow smooth resizing of MacVim window [bool]
*MMShareFindPboard* share search text to Find Pasteboard [bool]
*MMShowAddTabButton* enable "add tab" button on tabline [bool]
*MMTabMaxWidth* maximum width of a tab [int]
*MMShowTabScrollButtons* enable tab scroll buttons on tabline [bool]
*MMTabMinWidth* minimum width of a tab [int]
*MMTabOptimumWidth* default width of a tab [int]
*MMDefaultTablineColors* use default colors instead of colorscheme for tabs [bool]
*MMTextInsetBottom* text area offset in pixels [int]
*MMTextInsetLeft* text area offset in pixels [int]
*MMTextInsetRight* text area offset in pixels [int]
+2 -1
View File
@@ -5642,6 +5642,7 @@ MMAllowForceClickLookUp gui_mac.txt /*MMAllowForceClickLookUp*
MMAppearanceModeSelection gui_mac.txt /*MMAppearanceModeSelection*
MMCellWidthMultiplier gui_mac.txt /*MMCellWidthMultiplier*
MMCmdLineAlignBottom gui_mac.txt /*MMCmdLineAlignBottom*
MMDefaultTablineColors gui_mac.txt /*MMDefaultTablineColors*
MMDialogsTrackPwd gui_mac.txt /*MMDialogsTrackPwd*
MMDisableLaunchAnimation gui_mac.txt /*MMDisableLaunchAnimation*
MMFontPreserveLineSpacing gui_mac.txt /*MMFontPreserveLineSpacing*
@@ -5658,9 +5659,9 @@ MMRendererClipToRow gui_mac.txt /*MMRendererClipToRow*
MMScrollOneDirectionOnly gui_mac.txt /*MMScrollOneDirectionOnly*
MMShareFindPboard gui_mac.txt /*MMShareFindPboard*
MMShowAddTabButton gui_mac.txt /*MMShowAddTabButton*
MMShowTabScrollButtons gui_mac.txt /*MMShowTabScrollButtons*
MMShowWhatsNewOnStartup gui_mac.txt /*MMShowWhatsNewOnStartup*
MMSmoothResize gui_mac.txt /*MMSmoothResize*
MMTabMaxWidth gui_mac.txt /*MMTabMaxWidth*
MMTabMinWidth gui_mac.txt /*MMTabMinWidth*
MMTabOptimumWidth gui_mac.txt /*MMTabOptimumWidth*
MMTextInsetBottom gui_mac.txt /*MMTextInsetBottom*
+3 -19
View File
@@ -170,30 +170,14 @@ fsEventCallback(ConstFSEventStreamRef streamRef,
/// persisted user settings to have a clean environment.
+ (void)registerDefaults
{
int tabMinWidthKey;
int tabMaxWidthKey;
int tabOptimumWidthKey;
if (shouldUseYosemiteTabBarStyle()) {
tabMinWidthKey = 120;
tabMaxWidthKey = 0;
tabOptimumWidthKey = 0;
} else {
tabMinWidthKey = 64;
tabMaxWidthKey = 6*64;
tabOptimumWidthKey = 132;
}
NSUserDefaults *ud = NSUserDefaults.standardUserDefaults;
NSDictionary *macvimDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], MMNoWindowKey,
[NSNumber numberWithInt:tabMinWidthKey],
MMTabMinWidthKey,
[NSNumber numberWithInt:tabMaxWidthKey],
MMTabMaxWidthKey,
[NSNumber numberWithInt:tabOptimumWidthKey],
MMTabOptimumWidthKey,
[NSNumber numberWithInt:120], MMTabMinWidthKey,
[NSNumber numberWithInt:200], MMTabOptimumWidthKey,
[NSNumber numberWithBool:YES], MMShowAddTabButtonKey,
[NSNumber numberWithBool:NO], MMShowTabScrollButtonsKey,
[NSNumber numberWithInt:2], MMTextInsetLeftKey,
[NSNumber numberWithInt:1], MMTextInsetRightKey,
[NSNumber numberWithInt:1], MMTextInsetTopKey,
-1
View File
@@ -17,7 +17,6 @@
@interface MMFullScreenWindow : NSWindow {
NSWindow *target;
MMVimView *view;
NSString *oldTabBarStyle;
int options;
int state;
-9
View File
@@ -29,7 +29,6 @@
#import "MMVimView.h"
#import "MMWindowController.h"
#import "Miscellaneous.h"
#import <PSMTabBarControl/PSMTabBarControl.h>
// These have to be the same as in option.h
#define FUOPT_MAXVERT 0x001
@@ -178,12 +177,6 @@ enum {
}
[self setFrame:[screen frame] display:NO];
oldTabBarStyle = [[view tabBarControl] styleName];
NSString *style =
shouldUseYosemiteTabBarStyle() ? (shouldUseMojaveTabBarStyle() ? @"Mojave" : @"Yosemite") : @"Unified";
[[view tabBarControl] setStyleNamed:style];
// add text view
[view removeFromSuperviewWithoutNeedingDisplay];
[[self contentView] addSubview:view];
@@ -259,8 +252,6 @@ enum {
[self retain]; // NSWindowController releases us once
[[self windowController] setWindow:target];
[[view tabBarControl] setStyleNamed:oldTabBarStyle];
// fix delegate
id delegate = [self delegate];
[self setDelegate:nil];
+11
View File
@@ -0,0 +1,11 @@
#import <Cocoa/Cocoa.h>
// A button that fades in a circular background when hovered.
@interface MMHoverButton : NSButton
@property (nonatomic, retain) NSColor *fgColor;
+ (NSImage *)imageNamed:(NSString *)name;
@end
+140
View File
@@ -0,0 +1,140 @@
#import "MMHoverButton.h"
@implementation MMHoverButton
{
NSTrackingArea *_trackingArea;
NSBox *_circle;
}
+ (NSImage *)imageNamed:(NSString *)name
{
CGFloat size = [name isEqualToString:@"CloseTabButton"] ? 15 : 17;
return [NSImage imageWithSize:NSMakeSize(size, size) flipped:NO drawingHandler:^BOOL(NSRect dstRect) {
NSBezierPath *p = [NSBezierPath new];
if ([name isEqualToString:@"AddTabButton"]) {
[p moveToPoint:NSMakePoint( 8.5, 4.5)];
[p lineToPoint:NSMakePoint( 8.5, 12.5)];
[p moveToPoint:NSMakePoint( 4.5, 8.5)];
[p lineToPoint:NSMakePoint(12.5, 8.5)];
[p setLineWidth:1.2];
[p stroke];
}
else if ([name isEqualToString:@"CloseTabButton"]) {
[p moveToPoint:NSMakePoint( 4.5, 4.5)];
[p lineToPoint:NSMakePoint(10.5, 10.5)];
[p moveToPoint:NSMakePoint( 4.5, 10.5)];
[p lineToPoint:NSMakePoint(10.5, 4.5)];
[p setLineWidth:1.2];
[p stroke];
}
else if ([name isEqualToString:@"ScrollLeftButton"]) {
[p moveToPoint:NSMakePoint( 5.0, 8.5)];
[p lineToPoint:NSMakePoint(10.0, 4.5)];
[p lineToPoint:NSMakePoint(10.0, 12.5)];
[p fill];
}
else if ([name isEqualToString:@"ScrollRightButton"]) {
[p moveToPoint:NSMakePoint(12.0, 8.5)];
[p lineToPoint:NSMakePoint( 7.0, 4.5)];
[p lineToPoint:NSMakePoint( 7.0, 12.5)];
[p fill];
}
return YES;
}];
}
- (instancetype)initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
if (self) {
self.buttonType = NSButtonTypeMomentaryChange;
self.bordered = NO;
self.imagePosition = NSImageOnly;
// This view will fade in/out when hovered.
_circle = [NSBox new];
_circle.boxType = NSBoxCustom;
_circle.borderWidth = 0;
_circle.alphaValue = 0.16;
_circle.fillColor = NSColor.clearColor;
_circle.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
_circle.frame = self.bounds;
[self addSubview:_circle positioned:NSWindowBelow relativeTo:nil];
}
return self;
}
- (void)setFgColor:(NSColor *)color
{
_fgColor = color;
self.image = super.image;
}
- (void)setImage:(NSImage *)image
{
_circle.cornerRadius = image.size.width / 2.0;
NSColor *fillColor = self.fgColor ?: NSColor.controlTextColor;
super.image = [NSImage imageWithSize:image.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) {
[image drawInRect:dstRect];
[fillColor set];
NSRectFillUsingOperation(dstRect, NSCompositingOperationSourceAtop);
return YES;
}];
self.alternateImage = [NSImage imageWithSize:image.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) {
[[fillColor colorWithAlphaComponent:0.2] set];
[[NSBezierPath bezierPathWithOvalInRect:dstRect] fill];
[super.image drawInRect:dstRect];
return YES;
}];
}
- (void)setEnabled:(BOOL)enabled
{
[super setEnabled:enabled];
[self evaluateHover];
}
- (void)updateTrackingAreas
{
[self removeTrackingArea:_trackingArea];
_trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow) owner:self userInfo:nil];
[self addTrackingArea:_trackingArea];
[self evaluateHover];
[super updateTrackingAreas];
}
- (void)backgroundCircleShouldHighlight:(BOOL)shouldHighlight
{
NSColor *fillColor = NSColor.clearColor;
if (shouldHighlight) {
fillColor = self.fgColor ?: NSColor.controlTextColor;
}
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.1];
_circle.animator.fillColor = fillColor;
[NSAnimationContext endGrouping];
}
- (void)evaluateHover
{
NSPoint mouseLocation = [self.window mouseLocationOutsideOfEventStream];
mouseLocation = [self convertPoint:mouseLocation fromView:nil];
if (NSPointInRect(mouseLocation, self.bounds)) {
if (self.enabled) [self backgroundCircleShouldHighlight:YES];
else [self backgroundCircleShouldHighlight:NO];
} else {
[self backgroundCircleShouldHighlight:NO];
}
}
- (void)mouseEntered:(NSEvent *)event
{
if (self.enabled) [self backgroundCircleShouldHighlight:YES];
}
- (void)mouseExited:(NSEvent *)event
{
[self backgroundCircleShouldHighlight:NO];
}
@end
+23
View File
@@ -0,0 +1,23 @@
#import <Cocoa/Cocoa.h>
// A tab with a close button and title.
#define MMTabShadowBlurRadius (2)
typedef enum : NSInteger {
MMTabStateSelected,
MMTabStateUnselected,
MMTabStateUnselectedHover,
} MMTabState;
@class MMTabline;
@interface MMTab : NSView
@property (nonatomic, copy) NSString *title;
@property (nonatomic, getter=isCloseButtonHidden) BOOL closeButtonHidden;
@property (nonatomic) MMTabState state;
- (instancetype)initWithFrame:(NSRect)frameRect tabline:(MMTabline *)tabline;
@end
+167
View File
@@ -0,0 +1,167 @@
#import <QuartzCore/QuartzCore.h>
#import "MMTab.h"
#import "MMTabline.h"
#import "MMHoverButton.h"
#import "MacVim.h" // for availability macros
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_13
typedef NSString * NSAnimatablePropertyKey;
#endif
@interface MMTab ()
@property (nonatomic) NSColor *fillColor;
@end
@implementation MMTab
{
MMTabline __weak *_tabline;
MMHoverButton *_closeButton;
NSTextField *_titleLabel;
}
+ (id)defaultAnimationForKey:(NSAnimatablePropertyKey)key
{
if ([key isEqualToString:@"fillColor"]) {
CABasicAnimation *anim = [CABasicAnimation new];
anim.duration = 0.1;
return anim;
}
return [super defaultAnimationForKey:key];
}
- (instancetype)initWithFrame:(NSRect)frameRect tabline:(MMTabline *)tabline
{
self = [super initWithFrame:frameRect];
if (self) {
_tabline = tabline;
_closeButton = [MMHoverButton new];
_closeButton.image = [MMHoverButton imageNamed:@"CloseTabButton"];
_closeButton.target = self;
_closeButton.action = @selector(closeTab:);
_closeButton.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_closeButton];
_titleLabel = [NSTextField new];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11
if (AVAILABLE_MAC_OS(10,11)) {
_titleLabel.font = [NSFont systemFontOfSize:NSFont.smallSystemFontSize weight:NSFontWeightSemibold];
} else
#endif
{
_titleLabel.font = [NSFont systemFontOfSize:NSFont.smallSystemFontSize];
}
_titleLabel.textColor = NSColor.controlTextColor;
_titleLabel.editable = NO;
_titleLabel.selectable = NO;
_titleLabel.bordered = NO;
_titleLabel.bezeled = NO;
_titleLabel.drawsBackground = NO;
_titleLabel.cell.lineBreakMode = NSLineBreakByTruncatingTail;
// Title can be compressed smaller than its contents. See centerConstraint
// below where priority is set less than here for compression resistance.
// This breaks centering and allows label to fill all available space.
[_titleLabel setContentCompressionResistancePriority:NSLayoutPriorityFittingSizeCompression+2 forOrientation:NSLayoutConstraintOrientationHorizontal];
_titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_titleLabel];
NSDictionary *viewDict = NSDictionaryOfVariableBindings(_closeButton, _titleLabel);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-9-[_closeButton]-(>=5)-[_titleLabel]-(>=16)-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:viewDict]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:_titleLabel attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
NSLayoutConstraint *centerConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:_titleLabel attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
centerConstraint.priority = NSLayoutPriorityFittingSizeCompression+1;
[self addConstraint:centerConstraint];
self.state = MMTabStateUnselected;
}
return self;
}
- (void)closeTab:(id)sender
{
[_tabline closeTab:self force:NO layoutImmediately:NO];
}
- (NSString *)title
{
return _titleLabel.stringValue;
}
- (void)setTitle:(NSString *)title
{
_titleLabel.stringValue = title;
}
- (void)setCloseButtonHidden:(BOOL)closeButtonHidden
{
_closeButtonHidden = closeButtonHidden;
_closeButton.hidden = closeButtonHidden;
}
- (void)setFillColor:(NSColor *)fillColor
{
_fillColor = fillColor;
self.needsDisplay = YES;
}
- (void)setState:(MMTabState)state
{
// Transitions to and from MMTabStateSelected
// DO NOT animate so that UX feels snappier.
if (state == MMTabStateSelected) {
_closeButton.fgColor = _tabline.tablineSelFgColor;
_titleLabel.textColor = _tabline.tablineSelFgColor;
self.fillColor = _tabline.tablineSelBgColor;
}
else if (state == MMTabStateUnselected) {
if (_state == MMTabStateSelected) {
_closeButton.fgColor = _tabline.tablineFgColor;
_titleLabel.textColor = _tabline.tablineFgColor;
self.fillColor = _tabline.tablineBgColor;
} else {
_closeButton.animator.fgColor = _tabline.tablineFgColor;
_titleLabel.animator.textColor = _tabline.tablineFgColor;
self.animator.fillColor = _tabline.tablineBgColor;
}
}
else { // state == MMTabStateUnselectedHover
_closeButton.animator.fgColor = _tabline.tablineSelFgColor;
_titleLabel.animator.textColor = _tabline.tablineSelFgColor;
self.animator.fillColor = self.unselectedHoverColor;
}
_state = state;
}
- (NSColor *)unselectedHoverColor
{
return [_tabline.tablineSelBgColor blendedColorWithFraction:0.6 ofColor:_tabline.tablineBgColor];
}
- (void)drawRect:(NSRect)dirtyRect
{
[self.fillColor set];
CGFloat minX = MMTabShadowBlurRadius;
CGFloat maxX = NSMaxX(self.bounds);
CGFloat maxY = MMTablineHeight;
NSBezierPath *p = [NSBezierPath new];
[p moveToPoint:NSMakePoint(minX, 0)];
[p lineToPoint:NSMakePoint(minX + 3.6, maxY - 2.5)];
[p curveToPoint: NSMakePoint(minX + 6.5, maxY) controlPoint1: NSMakePoint(minX + 3.8, maxY - 1) controlPoint2: NSMakePoint(minX + 5.1, maxY)];
[p lineToPoint:NSMakePoint(maxX - 6.5 - minX, maxY)];
[p curveToPoint:NSMakePoint(maxX - 3.6 - minX, maxY - 2.5) controlPoint1: NSMakePoint(maxX - 5.1 - minX, maxY) controlPoint2: NSMakePoint(maxX - 3.8 - minX, maxY - 1)];
[p lineToPoint:NSMakePoint(maxX - minX, 0)];
[p closePath];
// On macOS 11, translate the tab down 1 pt to provide a thin
// line between the top of the tab and the window's title bar.
// It looks better given the new way macOS 11 draws title bars.
// Older macOS versions don't need this.
if (AVAILABLE_MAC_OS(11,0)) {
NSAffineTransform *transform = [NSAffineTransform new];
[transform translateXBy:0 yBy:-1.0];
[p transformUsingAffineTransform:transform];
}
[p fill];
}
@end
+47
View File
@@ -0,0 +1,47 @@
#import <Cocoa/Cocoa.h>
#import "MMHoverButton.h"
#import "MMTab.h"
// A tabline containing one or more tabs.
#define MMTablineHeight (23)
@protocol MMTablineDelegate;
@interface MMTabline : NSView
@property (nonatomic) NSInteger selectedTabIndex;
@property (nonatomic) NSInteger optimumTabWidth;
@property (nonatomic) NSInteger minimumTabWidth;
@property (nonatomic) BOOL showsAddTabButton;
@property (nonatomic) BOOL showsTabScrollButtons;
@property (nonatomic, readonly) NSInteger numberOfTabs;
@property (nonatomic, retain, readonly) MMHoverButton *addTabButton;
@property (nonatomic, retain) NSColor *tablineBgColor;
@property (nonatomic, retain) NSColor *tablineFgColor;
@property (nonatomic, retain) NSColor *tablineSelBgColor;
@property (nonatomic, retain) NSColor *tablineSelFgColor;
@property (nonatomic, retain) NSColor *tablineFillFgColor;
@property (nonatomic, weak) id <MMTablineDelegate> delegate;
- (NSInteger)addTabAtEnd;
- (NSInteger)addTabAfterSelectedTab;
- (NSInteger)addTabAtIndex:(NSInteger)index;
- (void)closeTab:(MMTab *)tab force:(BOOL)force layoutImmediately:(BOOL)layoutImmediately;
- (void)selectTabAtIndex:(NSInteger)index;
- (MMTab *)tabAtIndex:(NSInteger)index;
- (void)scrollTabToVisibleAtIndex:(NSInteger)index;
- (void)setTablineSelBackground:(NSColor *)back foreground:(NSColor *)fore;
@end
@protocol MMTablineDelegate <NSObject>
@optional
- (BOOL)tabline:(MMTabline *)tabline shouldSelectTabAtIndex:(NSInteger)index;
- (BOOL)tabline:(MMTabline *)tabline shouldCloseTabAtIndex:(NSInteger)index;
- (void)tabline:(MMTabline *)tabline didDragTab:(MMTab *)tab toIndex:(NSInteger)index;
- (NSDragOperation)tabline:(MMTabline *)tabline draggingEntered:(id <NSDraggingInfo>)dragInfo forTabAtIndex:(NSInteger)index;
- (BOOL)tabline:(MMTabline *)tabline performDragOperation:(id <NSDraggingInfo>)dragInfo forTabAtIndex:(NSInteger)index;
@end
+705
View File
@@ -0,0 +1,705 @@
#import <time.h>
#import <QuartzCore/QuartzCore.h>
#import "MMTabline.h"
#import "Miscellaneous.h"
typedef struct TabWidth {
CGFloat width;
CGFloat remainder;
} TabWidth;
const CGFloat OptimumTabWidth = 200;
const CGFloat MinimumTabWidth = 100;
const CGFloat TabOverlap = 6;
static MMHoverButton* MakeHoverButton(MMTabline *tabline, NSString *imageName, NSString *tooltip, SEL action, BOOL continuous) {
MMHoverButton *button = [MMHoverButton new];
button.image = [MMHoverButton imageNamed:imageName];
button.translatesAutoresizingMaskIntoConstraints = NO;
button.target = tabline;
button.action = action;
button.continuous = continuous;
[button sizeToFit];
[button setToolTip:NSLocalizedString(tooltip, @"Tabline button")];
[tabline addSubview:button];
return button;
}
static BOOL isDarkMode(NSAppearance *appearance) {
int flags = getCurrentAppearance(appearance);
return (flags == 1 || flags == 3);
}
@implementation MMTabline
{
NSView *_tabsContainer;
NSScrollView *_scrollView;
NSMutableArray <MMTab *> *_tabs;
NSTrackingArea *_trackingArea;
NSLayoutConstraint *_tabScrollButtonsLeadingConstraint;
NSLayoutConstraint *_addTabButtonTrailingConstraint;
BOOL _pendingFixupLayout;
MMTab *_selectedTab;
MMTab *_draggedTab;
CGFloat _xOffsetForDrag;
NSInteger _initialDraggedTabIndex;
NSInteger _finalDraggedTabIndex;
MMHoverButton *_leftScrollButton;
MMHoverButton *_rightScrollButton;
id _scrollWheelEventMonitor;
}
@synthesize tablineBgColor = _tablineBgColor;
@synthesize tablineFgColor = _tablineFgColor;
@synthesize tablineSelBgColor = _tablineSelBgColor;
@synthesize tablineSelFgColor = _tablineSelFgColor;
@synthesize tablineFillFgColor = _tablineFillFgColor;
- (instancetype)initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
if (self) {
self.wantsLayer = YES; // we use -updateLayer to fill background
_tabs = [NSMutableArray new];
_showsAddTabButton = YES; // get from NSUserDefaults
_showsTabScrollButtons = YES; // get from NSUserDefaults
// This view holds the tab views.
_tabsContainer = [NSView new];
_tabsContainer.frame = (NSRect){{0, 0}, frameRect.size};
_scrollView = [NSScrollView new];
_scrollView.drawsBackground = NO;
_scrollView.verticalScrollElasticity = NSScrollElasticityNone;
_scrollView.contentView.postsBoundsChangedNotifications = YES;
_scrollView.translatesAutoresizingMaskIntoConstraints = NO;
_scrollView.documentView = _tabsContainer;
[self addSubview:_scrollView];
_addTabButton = MakeHoverButton(self, @"AddTabButton", @"New Tab (⌘T)", @selector(addTabAtEnd), NO);
_leftScrollButton = MakeHoverButton(self, @"ScrollLeftButton", @"Scroll Tabs", @selector(scrollLeftOneTab), YES);
_rightScrollButton = MakeHoverButton(self, @"ScrollRightButton", @"Scroll Tabs", @selector(scrollRightOneTab), YES);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[_leftScrollButton][_rightScrollButton]-5-[_scrollView]-5-[_addTabButton]" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(_scrollView, _leftScrollButton, _rightScrollButton, _addTabButton)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_scrollView]|" options:0 metrics:nil views:@{@"_scrollView":_scrollView}]];
_tabScrollButtonsLeadingConstraint = [NSLayoutConstraint constraintWithItem:_leftScrollButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1 constant:5];
[self addConstraint:_tabScrollButtonsLeadingConstraint];
_addTabButtonTrailingConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:_addTabButton attribute:NSLayoutAttributeTrailing multiplier:1 constant:5];
[self addConstraint:_addTabButtonTrailingConstraint];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didScroll:) name:NSViewBoundsDidChangeNotification object:_scrollView.contentView];
// Monitor for scroll wheel events so we can scroll the tabline
// horizontally without the user having to hold down SHIFT.
_scrollWheelEventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskScrollWheel handler:^NSEvent * _Nullable(NSEvent * _Nonnull event) {
NSPoint location = [_scrollView convertPoint:event.locationInWindow fromView:nil];
// We want events:
// where the mouse is over the _scrollView
// and where the user is not modifying it with the SHIFT key
// and initiated by the scroll wheel and not the trackpad
if ([_scrollView mouse:location inRect:_scrollView.bounds]
&& !event.modifierFlags
&& !event.hasPreciseScrollingDeltas)
{
// Create a new scroll wheel event based on the original,
// but set the new deltaX to the original's deltaY.
// stackoverflow.com/a/38991946/111418
CGEventRef cgEvent = CGEventCreateCopy(event.CGEvent);
CGEventSetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2, event.scrollingDeltaY);
NSEvent *newEvent = [NSEvent eventWithCGEvent:cgEvent];
CFRelease(cgEvent);
return newEvent;
}
return event;
}];
}
return self;
}
- (void)layout
{
[super layout];
[self fixupLayoutWithAnimation:NO];
}
- (BOOL)wantsUpdateLayer { return YES; }
- (void)updateLayer
{
self.layer.backgroundColor = self.tablineFillFgColor.CGColor;
}
- (void)viewDidChangeEffectiveAppearance
{
for (MMTab *tab in _tabs) tab.state = tab.state;
}
#pragma mark - Accessors
- (NSInteger)numberOfTabs
{
return _tabs.count;
}
- (NSInteger)optimumTabWidth
{
return _optimumTabWidth ?: OptimumTabWidth;
}
- (NSInteger)minimumTabWidth
{
return _minimumTabWidth ?: MinimumTabWidth;
}
- (void)setShowsAddTabButton:(BOOL)showsAddTabButton
{
// showsAddTabButton:
// The trailing constraint is a 5pt margin.
// !showsAddTabButton:
// The trailing constraint is a negative margin so the add
// button is clipped out of the right side of the view. The
// amount of negative margin is the width of the button plus
// 5 to account for the margin between the scroll view and
// the button plus the shadow blur radius of each tab (see
// -drawRect: in MMTab.m).
if (_showsAddTabButton != showsAddTabButton) {
_showsAddTabButton = showsAddTabButton;
_addTabButtonTrailingConstraint.constant = showsAddTabButton ? 5 : -(NSWidth(_addTabButton.frame) + 5 + MMTabShadowBlurRadius);
}
}
- (void)setShowsTabScrollButtons:(BOOL)showsTabScrollButtons
{
// showsTabScrollButtons:
// The leading constraint is a 5pt margin.
// !showsTabScrollButtons:
// The leading constraint is a negative margin so the scroll
// buttons are clipped out of the left side of the view. The
// amount of the negative margin is the width of each button
// plus 5 to account for the margin between the buttons and
// the scroll view plus the shadow blur radius of each tab
// (see -drawRect: in MMTab.m).
if (_showsTabScrollButtons != showsTabScrollButtons) {
_showsTabScrollButtons = showsTabScrollButtons;
_tabScrollButtonsLeadingConstraint.constant = showsTabScrollButtons ? 5 : -((NSWidth(_leftScrollButton.frame) * 2) + 5 + MMTabShadowBlurRadius);
}
}
- (NSColor *)tablineBgColor
{
return _tablineBgColor ?: isDarkMode(self.effectiveAppearance)
? [NSColor colorWithWhite:0.2 alpha:1]
: [NSColor colorWithWhite:0.8 alpha:1];
}
- (void)setTablineBgColor:(NSColor *)color
{
_tablineBgColor = color;
for (MMTab *tab in _tabs) tab.state = tab.state;
}
- (NSColor *)tablineFgColor
{
return _tablineFgColor ?: NSColor.disabledControlTextColor;
}
- (void)setTablineFgColor:(NSColor *)color
{
_tablineFgColor = color;
for (MMTab *tab in _tabs) tab.state = tab.state;
}
- (NSColor *)tablineSelBgColor
{
return _tablineSelBgColor ?: isDarkMode(self.effectiveAppearance)
? [NSColor colorWithWhite:0.4 alpha:1]
: NSColor.whiteColor;
}
- (void)setTablineSelBgColor:(NSColor *)color
{
_tablineSelBgColor = color;
for (MMTab *tab in _tabs) tab.state = tab.state;
}
- (NSColor *)tablineSelFgColor
{
return _tablineSelFgColor ?: NSColor.controlTextColor;
}
- (void)setTablineSelFgColor:(NSColor *)color
{
_tablineSelFgColor = color;
_addTabButton.fgColor = color;
_leftScrollButton.fgColor = color;
_rightScrollButton.fgColor = color;
for (MMTab *tab in _tabs) tab.state = tab.state;
}
- (NSColor *)tablineFillFgColor
{
return _tablineFillFgColor ?: isDarkMode(self.effectiveAppearance)
? [NSColor colorWithWhite:0.2 alpha:1]
: [NSColor colorWithWhite:0.8 alpha:1];
}
- (void)setTablineFillFgColor:(NSColor *)color
{
_tablineFillFgColor = color;
self.needsDisplay = YES;
}
- (NSInteger)addTabAtEnd
{
return [self addTabAtIndex:(_tabs.count ? _tabs.count : 0)];
}
- (NSInteger)addTabAfterSelectedTab
{
return [self addTabAtIndex:(_tabs.count ? _selectedTabIndex + 1 : 0)];
}
- (NSInteger)addTabAtIndex:(NSInteger)index
{
if (!self.superview || index > _tabs.count) return NSNotFound;
TabWidth t = [self tabWidthForTabs:_tabs.count + 1];
NSRect frame = _tabsContainer.bounds;
frame.size.width = index == _tabs.count ? t.width + t.remainder : t.width;
frame.origin.x = index ? index * (t.width - TabOverlap) : 0;
MMTab *newTab = [[MMTab alloc] initWithFrame:frame tabline:self];
[_tabs insertObject:newTab atIndex:index];
[_tabsContainer addSubview:newTab];
[self selectTabAtIndex:index];
[self fixupLayoutWithAnimation:YES];
[self fixupCloseButtons];
/* Let MacVim handle scrolling to selected tab.
[self scrollTabToVisibleAtIndex:_selectedTabIndex]; */
[self evaluateHoverStateForMouse:[self.window mouseLocationOutsideOfEventStream]];
return index;
}
- (void)closeTab:(MMTab *)tab force:(BOOL)force layoutImmediately:(BOOL)layoutImmediately
{
NSInteger index = [_tabs indexOfObject:tab];
if (!force && [self.delegate respondsToSelector:@selector(tabline:shouldCloseTabAtIndex:)]) {
if (![self.delegate tabline:self shouldCloseTabAtIndex:index]) return;
}
if (index != NSNotFound) {
CGFloat w = NSWidth(tab.frame) - TabOverlap;
[tab removeFromSuperview];
for (NSInteger i = index + 1; i < _tabs.count; i++) {
MMTab *tv = _tabs[i];
NSRect frame = tv.frame;
frame.origin.x -= w;
tv.animator.frame = frame;
}
[_tabs removeObject:tab];
if (index <= _selectedTabIndex) {
if (index < _selectedTabIndex || index > _tabs.count - 1) {
[self selectTabAtIndex:_selectedTabIndex - 1];
}
else {
[self selectTabAtIndex:_selectedTabIndex];
}
}
[self fixupCloseButtons];
[self evaluateHoverStateForMouse:[self.window mouseLocationOutsideOfEventStream]];
if (layoutImmediately) [self fixupLayoutWithAnimation:YES];
else _pendingFixupLayout = YES;
} else {
NSLog(@"CANNOT FIND TAB TO REMOVE");
}
}
- (void)selectTabAtIndex:(NSInteger)index
{
if (_selectedTabIndex <= _tabs.count - 1) {
_tabs[_selectedTabIndex].state = MMTabStateUnselected;
}
if (index <= _tabs.count - 1) {
_selectedTabIndex = index;
_tabs[_selectedTabIndex].state = MMTabStateSelected;
}
else {
NSLog(@"TRIED TO SELECT OUT OF BOUNDS: %ld/%ld", index, _tabs.count - 1);
}
_selectedTab = _tabs[_selectedTabIndex];
[self fixupTabZOrder];
}
- (MMTab *)tabAtIndex:(NSInteger)index
{
if (index >= _tabs.count) {
[NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", index, _tabs.count - 1];
}
return _tabs[index];
}
- (void)setTablineSelBackground:(NSColor *)back foreground:(NSColor *)fore
{
// Reset to default tabline colors if user doesn't want auto-generated ones.
if ([NSUserDefaults.standardUserDefaults boolForKey:@"MMDefaultTablineColors"]) {
self.tablineBgColor = nil;
self.tablineFgColor = nil;
self.tablineSelBgColor = nil;
self.tablineSelFgColor = nil;
self.tablineFillFgColor = nil;
return;
}
// Set the colors for the tabline based on the default background and
// foreground colors. Calculate brightness according to a formula from
// the W3C that gives brightness as the eye perceives it. Then lighten
// or darken the default colors based on whether brightness is greater
// than 50% to achieve good visual contrast.
// www.w3.org/WAI/ER/WD-AERT/#color-contrast
CGFloat r, g, b, brightness;
[back getRed:&r green:&g blue:&b alpha:NULL];
brightness = r * 0.299 + g * 0.114 + b * 0.587;
self.tablineSelBgColor = back;
self.tablineSelFgColor = (brightness > 0.5)
? [fore blendedColorWithFraction:0.6 ofColor:NSColor.blackColor]
: [fore blendedColorWithFraction:0.6 ofColor:NSColor.whiteColor];
self.tablineBgColor = (brightness > 0.5)
? [back blendedColorWithFraction:0.16 ofColor:NSColor.blackColor]
: [back blendedColorWithFraction:0.13 ofColor:NSColor.whiteColor];
self.tablineFgColor = [self.tablineSelFgColor blendedColorWithFraction:0.5 ofColor:self.tablineBgColor];
self.tablineFillFgColor = (brightness > 0.5)
? [back blendedColorWithFraction:0.25 ofColor:NSColor.blackColor]
: [back blendedColorWithFraction:0.18 ofColor:NSColor.whiteColor];
}
#pragma mark - Helpers
NSComparisonResult SortTabsForZOrder(MMTab *tab1, MMTab *tab2, void *draggedTab)
{ // Z-order, highest to lowest: dragged, selected, hovered, rightmost
if (tab1 == (__bridge MMTab *)draggedTab) return NSOrderedDescending;
if (tab2 == (__bridge MMTab *)draggedTab) return NSOrderedAscending;
if (tab1.state == MMTabStateSelected) return NSOrderedDescending;
if (tab2.state == MMTabStateSelected) return NSOrderedAscending;
if (tab1.state == MMTabStateUnselectedHover) return NSOrderedDescending;
if (tab2.state == MMTabStateUnselectedHover) return NSOrderedAscending;
if (NSMinX(tab1.frame) < NSMinX(tab2.frame)) return NSOrderedAscending;
if (NSMinX(tab1.frame) > NSMinX(tab2.frame)) return NSOrderedDescending;
return NSOrderedSame;
}
- (TabWidth)tabWidthForTabs:(NSInteger)numTabs
{
// Each tab (except the first) overlaps the previous tab by TabOverlap
// points so we add TabOverlap * (numTabs - 1) to account for this.
CGFloat availableWidthForTabs = NSWidth(_scrollView.frame) + TabOverlap * (numTabs - 1);
CGFloat tabWidth = (availableWidthForTabs / numTabs);
if (tabWidth > self.optimumTabWidth) {
return (TabWidth){self.optimumTabWidth, 0};
}
if (tabWidth < self.minimumTabWidth) {
return (TabWidth){self.minimumTabWidth, 0};
}
// Round tabWidth down to nearest 0.5
CGFloat f = floor(tabWidth);
tabWidth = (tabWidth - f < 0.5) ? f : f + 0.5;
return (TabWidth){tabWidth, availableWidthForTabs - tabWidth * numTabs};
}
- (void)fixupCloseButtons
{
if (_tabs.count == 1) {
_tabs.firstObject.closeButtonHidden = YES;
}
else for (MMTab *tab in _tabs) {
tab.closeButtonHidden = NO;
}
}
- (void)fixupTabZOrder
{
[_tabsContainer sortSubviewsUsingFunction:SortTabsForZOrder context:(__bridge void *)(_draggedTab)];
}
- (void)fixupLayoutWithAnimation:(BOOL)shouldAnimate
{
if (_tabs.count == 0) return;
TabWidth t = [self tabWidthForTabs:_tabs.count];
for (NSInteger i = 0; i < _tabs.count; i++) {
MMTab *tab = _tabs[i];
if (_draggedTab == tab) continue;
NSRect frame = tab.frame;
frame.size.width = i == _tabs.count - 1 ? t.width + t.remainder : t.width;
frame.origin.x = i ? i * (t.width - TabOverlap) : 0;
if (shouldAnimate) {
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) {
context.allowsImplicitAnimation = YES;
tab.animator.frame = frame;
[tab layout];
} completionHandler:nil];
} else {
tab.frame = frame;
}
}
// _tabsContainer expands to fit tabs, is at least as wide as _scrollView.
NSRect frame = _tabsContainer.frame;
frame.size.width = t.width * _tabs.count - TabOverlap * (_tabs.count - 1);
frame.size.width = NSWidth(frame) < NSWidth(_scrollView.frame) ? NSWidth(_scrollView.frame) : NSWidth(frame);
if (shouldAnimate) _tabsContainer.animator.frame = frame;
else _tabsContainer.frame = frame;
[self updateTabScrollButtonsEnabledState];
}
#pragma mark - Mouse
- (void)updateTrackingAreas
{
[self removeTrackingArea:_trackingArea];
_trackingArea = [[NSTrackingArea alloc] initWithRect:_scrollView.frame options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil];
[self addTrackingArea:_trackingArea];
[super updateTrackingAreas];
}
- (BOOL)mouse:(NSPoint)windowLocation inTab:(MMTab *)tab
{
// YES if windowLocation is inside _scrollview AND tab.
NSPoint location = [_scrollView convertPoint:windowLocation fromView:nil];
if ([_scrollView mouse:location inRect:_scrollView.bounds]) {
location = [tab convertPoint:windowLocation fromView:nil];
return [tab mouse:location inRect:tab.bounds];
}
return NO;
}
- (NSInteger)indexOfTabAtMouse:(NSPoint)windowLocation
{
for (MMTab *tab in _tabs)
if ([self mouse:windowLocation inTab:tab])
return [_tabs indexOfObject:tab];
return NSNotFound;
}
- (void)evaluateHoverStateForMouse:(NSPoint)locationInWindow
{
for (MMTab *tab in _tabs) {
if ([self mouse:locationInWindow inTab:tab]) {
if (tab.state == MMTabStateUnselected) {
tab.state = MMTabStateUnselectedHover;
}
}
else if (tab.state == MMTabStateUnselectedHover) {
tab.state = MMTabStateUnselected;
}
}
[self fixupTabZOrder];
}
- (void)mouseExited:(NSEvent *)event
{
for (MMTab *tab in _tabs) {
if (tab.state == MMTabStateUnselectedHover) {
tab.state = MMTabStateUnselected;
}
}
if (_pendingFixupLayout) {
_pendingFixupLayout = NO;
[self fixupLayoutWithAnimation:YES];
}
[self fixupTabZOrder];
}
- (void)mouseMoved:(NSEvent *)event
{
[self evaluateHoverStateForMouse:event.locationInWindow];
}
- (void)mouseDown:(NSEvent *)event
{
_draggedTab = nil;
_initialDraggedTabIndex = _finalDraggedTabIndex = NSNotFound;
// Select clicked tab, possibly pending delegate's approval.
for (MMTab *tab in _tabs) {
if ([self mouse:event.locationInWindow inTab:tab]) {
_draggedTab = tab;
if (tab.state != MMTabStateSelected) {
NSInteger index = [_tabs indexOfObject:tab];
if ([self.delegate respondsToSelector:@selector(tabline:shouldSelectTabAtIndex:)]) {
if (![self.delegate tabline:self shouldSelectTabAtIndex:index]) break;
}
[self selectTabAtIndex:index];
}
[self scrollTabToVisibleAtIndex:_selectedTabIndex];
break;
}
}
}
- (void)mouseUp:(NSEvent *)event
{
_draggedTab = nil;
[self fixupLayoutWithAnimation:YES];
[self fixupTabZOrder];
if (_finalDraggedTabIndex != NSNotFound) [self scrollTabToVisibleAtIndex:_finalDraggedTabIndex];
if (_initialDraggedTabIndex != NSNotFound &&
_initialDraggedTabIndex != _finalDraggedTabIndex) {
if ([self.delegate respondsToSelector:@selector(tabline:didDragTab:toIndex:)]) {
[self.delegate tabline:self didDragTab:_tabs[_finalDraggedTabIndex] toIndex:_finalDraggedTabIndex];
}
}
}
- (void)mouseDragged:(NSEvent *)event
{
if (!_draggedTab || _tabs.count < 2) return;
NSPoint mouse = [_tabsContainer convertPoint:event.locationInWindow fromView:nil];
if (_initialDraggedTabIndex == NSNotFound) {
_initialDraggedTabIndex = [_tabs indexOfObject:_draggedTab];
_xOffsetForDrag = mouse.x - _draggedTab.frame.origin.x;
}
[_tabsContainer autoscroll:event];
[self fixupTabZOrder];
[_draggedTab setFrameOrigin:NSMakePoint(mouse.x - _xOffsetForDrag, 0)];
[_tabs sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(MMTab *t1, MMTab *t2) {
if (NSMinX(t1.frame) <= NSMinX(t2.frame)) return NSOrderedAscending;
if (NSMinX(t1.frame) > NSMinX(t2.frame)) return NSOrderedDescending;
return NSOrderedSame;
}];
_selectedTabIndex = [_tabs indexOfObject:_selectedTab];
_finalDraggedTabIndex = [_tabs indexOfObject:_draggedTab];
[self fixupLayoutWithAnimation:YES];
}
#pragma mark - Scroll
- (void)didScroll:(NSNotification *)note
{
[self evaluateHoverStateForMouse:[self.window mouseLocationOutsideOfEventStream]];
[self updateTabScrollButtonsEnabledState];
}
- (void)updateTabScrollButtonsEnabledState
{
// Enable scroll buttons if there is scrollable content
// on either side of _scrollView.
NSRect clipBounds = _scrollView.contentView.bounds;
if (NSWidth(_tabsContainer.frame) <= NSWidth(clipBounds)) {
_leftScrollButton.enabled = NO;
_rightScrollButton.enabled = NO;
} else {
_leftScrollButton.enabled = clipBounds.origin.x > 0;
_rightScrollButton.enabled = clipBounds.origin.x + NSWidth(clipBounds) < NSMaxX(_tabsContainer.frame);
}
}
- (void)scrollTabToVisibleAtIndex:(NSInteger)index
{
if (_tabs.count == 0) return;
// Get the amount of time elapsed between the previous invocation
// of this method and now. Use this elapsed time to set the animation
// duration such that rapid invocations of this method result in
// faster animations. For example, the user might hold down the tab
// scrolling buttons (causing them to repeatedly fire) or they might
// rapidly click them.
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12
static NSTimeInterval lastTime = 0;
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
NSTimeInterval currentTime = t.tv_sec + t.tv_nsec * 1.e-9;
NSTimeInterval elapsedTime = currentTime - lastTime;
lastTime = currentTime;
#else
// clock_gettime was only added in macOS 10.12. Just use a fixed value
// here. No need to find an alternative API for legacy macOS versions.
NSTimeInterval elapsedTime = 0.1;
#endif
NSRect tabFrame = _tabs[index].frame;
NSRect clipBounds = _scrollView.contentView.bounds;
// One side or the other of the selected tab is clipped.
if (!NSContainsRect(clipBounds, tabFrame)) {
if (NSMinX(tabFrame) > NSMinX(clipBounds)) {
// Right side of the selected tab is clipped.
clipBounds.origin.x = NSMaxX(tabFrame) - NSWidth(clipBounds);
} else {
// Left side of the selected tab is clipped.
clipBounds.origin.x = tabFrame.origin.x;
}
[NSAnimationContext beginGrouping];
[NSAnimationContext.currentContext setDuration:elapsedTime < 0.2 ? 0.05 : 0.2];
_scrollView.contentView.animator.bounds = clipBounds;
[NSAnimationContext endGrouping];
}
}
- (void)scrollLeftOneTab
{
NSRect clipBounds = _scrollView.contentView.bounds;
for (NSInteger i = _tabs.count - 1; i >= 0; i--) {
NSRect tabFrame = _tabs[i].frame;
if (!NSContainsRect(clipBounds, tabFrame)) {
if (NSMinX(tabFrame) < NSMinX(clipBounds)) {
[self scrollTabToVisibleAtIndex:i];
break;
}
}
}
}
- (void)scrollRightOneTab
{
NSRect clipBounds = _scrollView.contentView.bounds;
for (NSInteger i = 0; i < _tabs.count; i++) {
NSRect tabFrame = _tabs[i].frame;
if (!NSContainsRect(clipBounds, tabFrame)) {
if (NSMaxX(tabFrame) > NSMaxX(clipBounds)) {
[self scrollTabToVisibleAtIndex:i];
break;
}
}
}
}
#pragma mark - Drag and drop
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)dragInfo
{
[self evaluateHoverStateForMouse:dragInfo.draggingLocation];
if (self.delegate && [self.delegate respondsToSelector:@selector(tabline:draggingEntered:forTabAtIndex:)]) {
NSInteger index = [self indexOfTabAtMouse:dragInfo.draggingLocation];
return [self.delegate tabline:self draggingEntered:dragInfo forTabAtIndex:index];
}
return NSDragOperationNone;
}
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)dragInfo
{
return [self draggingEntered:dragInfo];
}
- (void)draggingExited:(id<NSDraggingInfo>)dragInfo
{
[self evaluateHoverStateForMouse:dragInfo.draggingLocation];
}
- (BOOL)performDragOperation:(id<NSDraggingInfo>)dragInfo
{
if (self.delegate && [self.delegate respondsToSelector:@selector(tabline:performDragOperation:forTabAtIndex:)]) {
NSInteger index = [self indexOfTabAtMouse:dragInfo.draggingLocation];
return [self.delegate tabline:self performDragOperation:dragInfo forTabAtIndex:index];
}
return NO;
}
@end
+1 -1
View File
@@ -74,7 +74,7 @@
- (void)cleanup;
- (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force;
- (void)file:(NSString *)filename draggedToTabAtIndex:(NSUInteger)tabIndex;
- (void)filesDraggedToTabBar:(NSArray *)filenames;
- (void)filesDraggedToTabline:(NSArray *)filenames;
- (void)dropString:(NSString *)string;
- (void)appearanceChanged:(int)flag;
+3 -3
View File
@@ -383,7 +383,7 @@ static BOOL isUnsafeMessage(int msgid);
// This is called when a file is dragged on top of the tab bar but not a
// particular tab (e.g. the new tab button). We will open the file list similar
// to drag-and-dropped files.
- (void)filesDraggedToTabBar:(NSArray *)filenames
- (void)filesDraggedToTabline:(NSArray *)filenames
{
filenames = normalizeFilenames(filenames);
ASLogInfo(@"%@", filenames);
@@ -714,13 +714,13 @@ static BOOL isUnsafeMessage(int msgid);
break;
case ShowTabBarMsgID:
{
[windowController showTabBar:YES];
[windowController showTabline:YES];
[self sendMessage:BackingPropertiesChangedMsgID data:nil];
}
break;
case HideTabBarMsgID:
{
[windowController showTabBar:NO];
[windowController showTabline:NO];
[self sendMessage:BackingPropertiesChangedMsgID data:nil];
}
break;
+6 -6
View File
@@ -12,17 +12,17 @@
@class PSMTabBarControl;
@class MMTabline;
@class MMTab;
@class MMTextView;
@class MMScroller;
@class MMVimController;
@interface MMVimView : NSView {
PSMTabBarControl *tabBarControl;
NSTabView *tabView;
MMTabline *tabline;
MMTab *tabToClose;
MMVimController *vimController;
BOOL vimTaskSelectedTab;
MMTextView *textView;
NSMutableArray *scrollbars;
}
@@ -41,11 +41,11 @@
- (NSSize)constrainRows:(int *)r columns:(int *)c toSize:(NSSize)size;
- (void)setDesiredRows:(int)r columns:(int)c;
- (PSMTabBarControl *)tabBarControl;
- (MMTabline *)tabline;
- (IBAction)addNewTab:(id)sender;
- (void)updateTabsWithData:(NSData *)data;
- (void)selectTabWithIndex:(int)idx;
- (NSTabViewItem *)addNewTabViewItem;
- (MMTab *)addNewTab;
- (void)createScrollbarWithIdentifier:(int32_t)ident type:(int)type;
- (BOOL)destroyScrollbarWithIdentifier:(int32_t)ident;
+106 -189
View File
@@ -24,7 +24,7 @@
#import "MMVimController.h"
#import "MMVimView.h"
#import "MMWindowController.h"
#import <PSMTabBarControl/PSMTabBarControl.h>
#import "MMTabline.h"
@@ -50,16 +50,14 @@ enum {
@end
@interface MMVimView (Private)
@interface MMVimView (Private) <MMTablineDelegate>
- (BOOL)bottomScrollbarVisible;
- (BOOL)leftScrollbarVisible;
- (BOOL)rightScrollbarVisible;
- (void)placeScrollbars;
- (NSUInteger)representedIndexOfTabViewItem:(NSTabViewItem *)tvi;
- (MMScroller *)scrollbarForIdentifier:(int32_t)ident index:(unsigned *)idx;
- (NSSize)vimViewSizeForTextViewSize:(NSSize)textViewSize;
- (NSRect)textViewRectForVimViewSize:(NSSize)contentSize;
- (NSTabView *)tabView;
- (void)frameSizeMayHaveChanged:(BOOL)keepGUISize;
@end
@@ -109,61 +107,21 @@ enum {
[textView setAutoresizingMask:NSViewNotSizable];
[self addSubview:textView];
// Create the tab view (which is never visible, but the tab bar control
// needs it to function).
tabView = [[NSTabView alloc] initWithFrame:NSZeroRect];
// Create the tab bar control (which is responsible for actually
// drawing the tabline and tabs).
NSRect tabFrame = { { 0, frame.size.height - kPSMTabBarControlHeight },
{ frame.size.width, kPSMTabBarControlHeight } };
tabBarControl = [[PSMTabBarControl alloc] initWithFrame:tabFrame];
[tabView setDelegate:tabBarControl];
[tabBarControl setTabView:tabView];
[tabBarControl setDelegate:self];
[tabBarControl setHidden:YES];
if (shouldUseYosemiteTabBarStyle() || shouldUseMojaveTabBarStyle()) {
CGFloat screenWidth = [[NSScreen mainScreen] frame].size.width;
int tabMaxWidth = (int)[ud integerForKey:MMTabMaxWidthKey];
if (tabMaxWidth == 0)
tabMaxWidth = (int)screenWidth;
int tabOptimumWidth = (int)[ud integerForKey:MMTabOptimumWidthKey];
if (tabOptimumWidth == 0)
tabOptimumWidth = (int)screenWidth;
NSString* tabStyleName = shouldUseMojaveTabBarStyle() ? @"Mojave" : @"Yosemite";
[tabBarControl setStyleNamed:tabStyleName];
[tabBarControl setCellMinWidth:(int)[ud integerForKey:MMTabMinWidthKey]];
[tabBarControl setCellMaxWidth:tabMaxWidth];
[tabBarControl setCellOptimumWidth:tabOptimumWidth];
} else {
[tabBarControl setCellMinWidth:(int)[ud integerForKey:MMTabMinWidthKey]];
[tabBarControl setCellMaxWidth:(int)[ud integerForKey:MMTabMaxWidthKey]];
[tabBarControl setCellOptimumWidth:
(int)[ud integerForKey:MMTabOptimumWidthKey]];
}
[tabBarControl setShowAddTabButton:[ud boolForKey:MMShowAddTabButtonKey]];
[[tabBarControl addTabButton] setTarget:self];
[[tabBarControl addTabButton] setAction:@selector(addNewTab:)];
[tabBarControl setAllowsDragBetweenWindows:NO];
[tabBarControl registerForDraggedTypes:[NSArray arrayWithObject:getPasteboardFilenamesType()]];
[tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin];
// Create the tabline which is responsible for drawing the tabline and tabs.
NSRect tablineFrame = {{0, frame.size.height - MMTablineHeight}, {frame.size.width, MMTablineHeight}};
tabline = [[MMTabline alloc] initWithFrame:tablineFrame];
tabline.autoresizingMask = NSViewWidthSizable | NSViewMinYMargin;
tabline.delegate = self;
tabline.hidden = YES;
tabline.showsAddTabButton = [ud boolForKey:MMShowAddTabButtonKey];
tabline.showsTabScrollButtons = [ud boolForKey:MMShowTabScrollButtonsKey];
tabline.optimumTabWidth = [ud integerForKey:MMTabOptimumWidthKey];
tabline.minimumTabWidth = [ud integerForKey:MMTabMinWidthKey];
tabline.addTabButton.target = self;
tabline.addTabButton.action = @selector(addNewTab:);
[tabline registerForDraggedTypes:@[getPasteboardFilenamesType()]];
[self addSubview:tabline];
//[tabBarControl setPartnerView:textView];
// tab bar resizing only works if awakeFromNib is called (that's where
// the NSViewFrameDidChangeNotification callback is installed). Sounds like
// a PSMTabBarControl bug, let's live with it for now.
[tabBarControl awakeFromNib];
[self addSubview:tabBarControl];
return self;
}
@@ -171,8 +129,7 @@ enum {
{
ASLogDebug(@"");
[tabBarControl release]; tabBarControl = nil;
[tabView release]; tabView = nil;
[tabline release];
[scrollbars release]; scrollbars = nil;
// HACK! The text storage is the principal owner of the text system, but we
@@ -250,37 +207,24 @@ enum {
return textView;
}
- (PSMTabBarControl *)tabBarControl
- (MMTabline *)tabline
{
return tabBarControl;
return tabline;
}
- (void)cleanup
{
vimController = nil;
// NOTE! There is a bug in PSMTabBarControl in that it retains the delegate
// so reset the delegate here, otherwise the delegate may never get
// released.
[tabView setDelegate:nil];
[tabBarControl setDelegate:nil];
[tabBarControl setTabView:nil];
[[self window] setDelegate:nil];
// NOTE! There is another bug in PSMTabBarControl where the control is not
// removed as an observer, so remove it here (failing to remove an observer
// may lead to very strange bugs).
[[NSNotificationCenter defaultCenter] removeObserver:tabBarControl];
[tabBarControl removeFromSuperviewWithoutNeedingDisplay];
[tabline removeFromSuperviewWithoutNeedingDisplay];
[textView removeFromSuperviewWithoutNeedingDisplay];
for (NSUInteger i = 0, count = scrollbars.count; i < count; ++i) {
MMScroller *sb = [scrollbars objectAtIndex:i];
[sb removeFromSuperviewWithoutNeedingDisplay];
}
[tabView removeAllTabViewItems];
}
- (NSSize)desiredSize
@@ -315,16 +259,35 @@ enum {
const void *p = [data bytes];
const void *end = p + [data length];
int tabIdx = 0;
BOOL didCloseTab = NO;
// Count how many tabs Vim has and compare to the number MacVim's tabline has.
const void *q = [data bytes];
int vimNumberOfTabs = 0;
q += sizeof(int); // skip over current tab index
while (q < end) {
int infoCount = *((int*)q); q += sizeof(int);
for (unsigned i = 0; i < infoCount; ++i) {
int length = *((int*)q); q += sizeof(int);
if (length <= 0) continue;
q += length;
if (i == MMTabLabel) ++vimNumberOfTabs;
}
}
// Close the specific tab where the user clicked the close button.
if (tabToClose && vimNumberOfTabs == tabline.numberOfTabs - 1) {
[tabline closeTab:tabToClose force:YES layoutImmediately:NO];
tabToClose = nil;
didCloseTab = YES;
}
// HACK! Current tab is first in the message. This way it is not
// necessary to guess which tab should be the selected one (this can be
// problematic for instance when new tabs are created).
int curtabIdx = *((int*)p); p += sizeof(int);
NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems];
while (p < end) {
NSTabViewItem *tvi = nil;
MMTab *tv;
//int wincount = *((int*)p); p += sizeof(int);
int infoCount = *((int*)p); p += sizeof(int);
@@ -342,16 +305,14 @@ enum {
switch (i) {
case MMTabLabel:
// Set the label of the tab, adding a new tab when needed.
tvi = [[self tabView] numberOfTabViewItems] <= tabIdx
? [self addNewTabViewItem]
: [tabViewItems objectAtIndex:tabIdx];
[tvi setLabel:val];
tv = tabline.numberOfTabs <= tabIdx
? [self addNewTab]
: [tabline tabAtIndex:tabIdx];
tv.title = val;
++tabIdx;
break;
case MMTabToolTip:
if (tvi)
[[self tabBarControl] setToolTip:val
forTabViewItem:tvi];
if (tv) tv.toolTip = val;
break;
default:
ASLogWarn(@"Unknown tab info for index: %d", i);
@@ -361,59 +322,48 @@ enum {
}
}
// Remove unused tabs from the NSTabView. Note that when a tab is closed
// the NSTabView will automatically select another tab, but we want Vim to
// take care of which tab to select so set the vimTaskSelectedTab flag to
// prevent the tab selection message to be passed on to the VimTask.
vimTaskSelectedTab = YES;
for (NSInteger i = [self tabView].numberOfTabViewItems-1; i >= tabIdx; --i) {
id tvi = [tabViewItems objectAtIndex:i];
[[self tabView] removeTabViewItem:tvi];
// Remove unused tabs from the tabline.
long i, count = tabline.numberOfTabs;
for (i = count-1; i >= tabIdx; --i) {
MMTab *tv = [tabline tabAtIndex:i];
[tabline closeTab:tv force:YES layoutImmediately:YES];
}
vimTaskSelectedTab = NO;
[self selectTabWithIndex:curtabIdx];
// It would be better if we could scroll to the selected tab only if it
// reflected user intent. Presumably, the user expects MacVim to scroll
// to the selected tab if they: added a tab, clicked a partially hidden
// tab, or navigated to a tab with a keyboard command. Since we don't
// have this kind of information, we always scroll to selected unless
// the window isn't key or we think the user is in the process of
// closing a tab by clicking its close button. Doing it this way instead
// of using a signal of explicit user intent is probably too aggressive.
if (self.window.isKeyWindow && !tabToClose && !didCloseTab) {
[tabline scrollTabToVisibleAtIndex:curtabIdx];
}
}
- (void)selectTabWithIndex:(int)idx
{
NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems];
if (idx < 0 || idx >= [tabViewItems count]) {
if (idx < 0 || idx >= tabline.numberOfTabs) {
ASLogWarn(@"No tab with index %d exists.", idx);
return;
}
// Do not try to select a tab if already selected.
NSTabViewItem *tvi = [tabViewItems objectAtIndex:idx];
if (tvi != [[self tabView] selectedTabViewItem]) {
vimTaskSelectedTab = YES;
[[self tabView] selectTabViewItem:tvi];
vimTaskSelectedTab = NO;
if (idx != tabline.selectedTabIndex) {
[tabline selectTabAtIndex:idx];
// We might need to change the scrollbars that are visible.
self.pendingPlaceScrollbars = YES;
}
}
- (NSTabViewItem *)addNewTabViewItem
- (MMTab *)addNewTab
{
// NOTE! A newly created tab is not by selected by default; Vim decides
// which tab should be selected at all times. However, the AppKit will
// automatically select the first tab added to a tab view.
// The documentation claims initWithIdentifier can be given a nil identifier, but the API itself
// is decorated such that doing so produces a warning, so the tab count is used as identifier.
NSInteger identifier = [[self tabView] numberOfTabViewItems];
NSTabViewItem *tvi = [[NSTabViewItem alloc] initWithIdentifier:[NSNumber numberWithInt:(int)identifier]];
// NOTE: If this is the first tab it will be automatically selected.
vimTaskSelectedTab = YES;
[[self tabView] addTabViewItem:tvi];
vimTaskSelectedTab = NO;
[tvi autorelease];
return tvi;
NSUInteger index = [tabline addTabAtEnd];
return [tabline tabAtIndex:index];
}
- (void)createScrollbarWithIdentifier:(int32_t)ident type:(int)type
@@ -508,6 +458,8 @@ enum {
- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore
{
[textView setDefaultColorsBackground:back foreground:fore];
[tabline setTablineSelBackground:back foreground:fore];
CALayer *backedLayer = [self layer];
if (backedLayer) {
@@ -527,91 +479,67 @@ enum {
}
// -- PSMTabBarControl delegate ----------------------------------------------
// -- MMTablineDelegate ----------------------------------------------
- (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem:
(NSTabViewItem *)tabViewItem
- (BOOL)tabline:(MMTabline *)tabline shouldSelectTabAtIndex:(NSUInteger)index
{
// NOTE: It would be reasonable to think that 'shouldSelect...' implies
// that this message only gets sent when the user clicks the tab.
// Unfortunately it is not so, which is why we need the
// 'vimTaskSelectedTab' flag.
//
// HACK! The selection message should not be propagated to Vim if Vim
// selected the tab (e.g. as opposed the user clicking the tab). The
// delegate method has no way of knowing who initiated the selection so a
// flag is set when Vim initiated the selection.
if (!vimTaskSelectedTab) {
// Propagate the selection message to Vim.
NSUInteger idx = [self representedIndexOfTabViewItem:tabViewItem];
if (NSNotFound != idx) {
int i = (int)idx; // HACK! Never more than MAXINT tabs?!
NSData *data = [NSData dataWithBytes:&i length:sizeof(int)];
[vimController sendMessage:SelectTabMsgID data:data];
}
// Propagate the selection message to Vim.
if (NSNotFound != index) {
int i = (int)index; // HACK! Never more than MAXINT tabs?!
NSData *data = [NSData dataWithBytes:&i length:sizeof(int)];
[vimController sendMessage:SelectTabMsgID data:data];
}
// Unless Vim selected the tab, return NO, and let Vim decide if the tab
// should get selected or not.
return vimTaskSelectedTab;
}
- (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem:
(NSTabViewItem *)tabViewItem
{
// HACK! This method is only called when the user clicks the close button
// on the tab. Instead of letting the tab bar close the tab, we return NO
// and pass a message on to Vim to let it handle the closing.
NSUInteger idx = [self representedIndexOfTabViewItem:tabViewItem];
int i = (int)idx; // HACK! Never more than MAXINT tabs?!
NSData *data = [NSData dataWithBytes:&i length:sizeof(int)];
[vimController sendMessage:CloseTabMsgID data:data];
// Let Vim decide whether to select the tab or not.
return NO;
}
- (void)tabView:(NSTabView *)theTabView didDragTabViewItem:
(NSTabViewItem *)tabViewItem toIndex:(int)idx
- (BOOL)tabline:(MMTabline *)tabline shouldCloseTabAtIndex:(NSUInteger)index
{
if (index >= 0 && index < tabline.numberOfTabs - 1) {
tabToClose = [tabline tabAtIndex:index];
}
// HACK! This method is only called when the user clicks the close button
// on the tab. Instead of letting the tab bar close the tab, we return NO
// and pass a message on to Vim to let it handle the closing.
int i = (int)index; // HACK! Never more than MAXINT tabs?!
NSData *data = [NSData dataWithBytes:&i length:sizeof(int)];
[vimController sendMessage:CloseTabMsgID data:data];
return NO;
}
- (void)tabline:(MMTabline *)tabline didDragTab:(MMTab *)tab toIndex:(NSUInteger)index
{
NSMutableData *data = [NSMutableData data];
[data appendBytes:&idx length:sizeof(int)];
[data appendBytes:&index length:sizeof(int)];
[vimController sendMessage:DraggedTabMsgID data:data];
}
- (NSDragOperation)tabBarControl:(PSMTabBarControl *)theTabBarControl
draggingEntered:(id <NSDraggingInfo>)sender
forTabAtIndex:(NSUInteger)tabIndex
- (NSDragOperation)tabline:(MMTabline *)tabline draggingEntered:(id <NSDraggingInfo>)dragInfo forTabAtIndex:(NSUInteger)index
{
NSPasteboard *pb = [sender draggingPasteboard];
return [[pb types] containsObject:getPasteboardFilenamesType()]
return [dragInfo.draggingPasteboard.types containsObject:getPasteboardFilenamesType()]
? NSDragOperationCopy
: NSDragOperationNone;
}
- (BOOL)tabBarControl:(PSMTabBarControl *)theTabBarControl
performDragOperation:(id <NSDraggingInfo>)sender
forTabAtIndex:(NSUInteger)tabIndex
- (BOOL)tabline:(MMTabline *)tabline performDragOperation:(id <NSDraggingInfo>)dragInfo forTabAtIndex:(NSUInteger)index
{
NSPasteboard *pb = [sender draggingPasteboard];
NSPasteboard *pb = dragInfo.draggingPasteboard;
NSArray<NSString*>* filenames = extractPasteboardFilenames(pb);
if (filenames == nil || filenames.count == 0)
return NO;
if (tabIndex != NSNotFound) {
if (index != NSNotFound) {
// If dropping on a specific tab, only open one file
[vimController file:[filenames objectAtIndex:0]
draggedToTabAtIndex:tabIndex];
[vimController file:[filenames objectAtIndex:0] draggedToTabAtIndex:index];
} else {
// Files were dropped on empty part of tab bar; open them all
[vimController filesDraggedToTabBar:filenames];
[vimController filesDraggedToTabline:filenames];
}
return YES;
}
// -- NSView customization ---------------------------------------------------
@@ -839,12 +767,6 @@ enum {
}
}
- (NSUInteger)representedIndexOfTabViewItem:(NSTabViewItem *)tvi
{
NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems];
return [tabViewItems indexOfObject:tvi];
}
- (MMScroller *)scrollbarForIdentifier:(int32_t)ident index:(unsigned *)idx
{
for (NSUInteger i = 0, count = scrollbars.count; i < count; ++i) {
@@ -867,8 +789,8 @@ enum {
CGFloat scrollerWidth = [NSScroller scrollerWidth];
#endif
if (![[self tabBarControl] isHidden])
size.height += [[self tabBarControl] frame].size.height;
if (!tabline.isHidden)
size.height += NSHeight(tabline.frame);
if ([self bottomScrollbarVisible])
size.height += scrollerWidth;
@@ -889,8 +811,8 @@ enum {
CGFloat scrollerWidth = [NSScroller scrollerWidth];
#endif
if (![[self tabBarControl] isHidden])
rect.size.height -= [[self tabBarControl] frame].size.height;
if (!tabline.isHidden)
rect.size.height -= NSHeight(tabline.frame);
if ([self bottomScrollbarVisible]) {
rect.size.height -= scrollerWidth;
@@ -906,11 +828,6 @@ enum {
return rect;
}
- (NSTabView *)tabView
{
return tabView;
}
- (void)frameSizeMayHaveChanged:(BOOL)keepGUISize
{
// NOTE: Whenever a call is made that may have changed the frame size we
+1 -1
View File
@@ -91,7 +91,7 @@
- (void)setWideFont:(NSFont *)font;
- (void)refreshFonts;
- (void)processInputQueueDidFinish;
- (void)showTabBar:(BOOL)on;
- (void)showTabline:(BOOL)on;
- (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode;
- (void)setMouseShape:(int)shape;
- (void)adjustLinespace:(int)linespace;
+6 -25
View File
@@ -71,7 +71,6 @@
#import "MMWindow.h"
#import "MMWindowController.h"
#import "Miscellaneous.h"
#import <PSMTabBarControl/PSMTabBarControl.h>
// These have to be the same as in option.h
@@ -86,7 +85,6 @@
keepOnScreen:(BOOL)onScreen;
- (NSSize)constrainContentSizeToScreenSize:(NSSize)contentSize;
- (NSRect)constrainFrame:(NSRect)frame;
- (NSTabViewItem *)addNewTabViewItem;
- (BOOL)askBackendForSelectedText:(NSPasteboard *)pb;
- (void)updateTablineSeparator;
- (void)hideTablineSeparator:(BOOL)hide;
@@ -96,8 +94,6 @@
- (void)applicationDidChangeScreenParameters:(NSNotification *)notification;
- (void)enterNativeFullScreen;
- (void)processAfterWindowPresentedQueue;
+ (NSString *)tabBarStyleForUnified;
+ (NSString *)tabBarStyleForMetal;
@end
@@ -336,7 +332,7 @@
// presentWindow: but must carefully check dependencies on 'setupDone'
// flag.
[self addNewTabViewItem];
[vimView addNewTab];
setupDone = YES;
}
@@ -457,7 +453,7 @@
// for example if 'showtabline=2').
// TODO: Store window pixel dimensions instead of rows/columns?
int autosaveRows = rows;
if (![[vimView tabBarControl] isHidden])
if (![[vimView tabline] isHidden])
++autosaveRows;
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
@@ -878,9 +874,9 @@
}
}
- (void)showTabBar:(BOOL)on
- (void)showTabline:(BOOL)on
{
[[vimView tabBarControl] setHidden:!on];
[[vimView tabline] setHidden:!on];
[self updateTablineSeparator];
shouldMaximizeWindow = YES;
}
@@ -1864,11 +1860,6 @@
return [decoratedWindow frameRectForContentRect:contentRect];
}
- (NSTabViewItem *)addNewTabViewItem
{
return [vimView addNewTabViewItem];
}
/// Ask Vim to fill in the pasteboard with the currently selected text in visual mode.
- (BOOL)askBackendForSelectedText:(NSPasteboard *)pb
{
@@ -1895,7 +1886,7 @@
- (void)updateTablineSeparator
{
BOOL tabBarVisible = ![[vimView tabBarControl] isHidden];
BOOL tablineVisible = ![[vimView tabline] isHidden];
BOOL toolbarHidden = [decoratedWindow toolbar] == nil;
BOOL hideSeparator = NO;
@@ -1914,7 +1905,7 @@
// modern macOS versions.
hideSeparator = YES;
} else {
if (fullScreenEnabled || tabBarVisible)
if (fullScreenEnabled || tablineVisible)
hideSeparator = YES;
else
hideSeparator = toolbarHidden && !windowTextured;
@@ -2117,15 +2108,5 @@
[afterWindowPresentedQueue release]; afterWindowPresentedQueue = nil;
}
+ (NSString *)tabBarStyleForUnified
{
return shouldUseYosemiteTabBarStyle() ? (shouldUseMojaveTabBarStyle() ? @"Mojave" : @"Yosemite") : @"Unified";
}
+ (NSString *)tabBarStyleForMetal
{
return shouldUseYosemiteTabBarStyle() ? (shouldUseMojaveTabBarStyle() ? @"Mojave" : @"Yosemite") : @"Metal";
}
@end // MMWindowController (Private)
+30 -45
View File
@@ -22,7 +22,6 @@
1D384A0E100D671700D3C22F /* KeyBinding.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D384A0D100D671700D3C22F /* KeyBinding.plist */; };
1D44972211FCA9B400B0630F /* MMCoreTextView+ToolTip.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D44972111FCA9B400B0630F /* MMCoreTextView+ToolTip.m */; };
1D493D580C5247BF00AB718C /* Vim in Copy Executables */ = {isa = PBXBuildFile; fileRef = 1D493D570C5247BF00AB718C /* Vim */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
1D60088B0E96A0B2003763F0 /* MMFindReplaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60088A0E96A0B2003763F0 /* MMFindReplaceController.m */; };
1D80591F0E1185EA001699D1 /* Miscellaneous.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80591D0E1185EA001699D1 /* Miscellaneous.m */; };
1D80FBD40CBBD3B700102A1C /* MMFullScreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD00CBBD3B700102A1C /* MMFullScreenWindow.m */; };
@@ -60,7 +59,6 @@
1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; };
1DE9B9500D341AB8008FEDD4 /* MMWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */; };
1DED78600C6DE43D0079945F /* vimrc in Copy default vimrc files */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; };
1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; };
52818B031C1C08CE00F59085 /* QLStephen.qlgenerator in Copy QuickLookPlugin */ = {isa = PBXBuildFile; fileRef = 52818AFF1C1C075300F59085 /* QLStephen.qlgenerator */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
528DA66A1426D4F9003380F1 /* macvim-askpass in Copy Scripts */ = {isa = PBXBuildFile; fileRef = 528DA6691426D4EB003380F1 /* macvim-askpass */; };
52A364731C4A5789005757EC /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52A364721C4A5789005757EC /* Sparkle.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
@@ -77,23 +75,13 @@
90A33BEA28D563DF003A2E2F /* MMSparkle2Delegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A33BE928D563DF003A2E2F /* MMSparkle2Delegate.m */; };
90AF83AB2A8C37F70046DA2E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90AF83A92A8C37F70046DA2E /* Security.framework */; };
90B9877D2A579F9500FC95D6 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90B9877B2A579F9500FC95D6 /* WebKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
925B55D5254B604A006B047E /* MMHoverButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 925B55D1254B604A006B047E /* MMHoverButton.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
925B55D7254B61AC006B047E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 925B55D6254B61AB006B047E /* QuartzCore.framework */; };
92C6F6E825587E1C007AE21E /* MMTab.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C6F6E325587E1C007AE21E /* MMTab.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
92C6F6E925587E1C007AE21E /* MMTabline.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C6F6E525587E1C007AE21E /* MMTabline.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
1D493DB80C52533B00AB718C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 53DF68FD067E5B5A0090B5B0;
remoteInfo = PSMTabBarControlFramework;
};
1D493DCC0C5254A400AB718C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 53DF68FC067E5B5A0090B5B0;
remoteInfo = PSMTabBarControlFramework;
};
52818AFE1C1C075300F59085 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 52818AFA1C1C075300F59085 /* QuickLookStephen.xcodeproj */;
@@ -136,7 +124,6 @@
dstSubfolderSpec = 10;
files = (
52A364761C4A57C1005757EC /* Sparkle.framework in Copy Frameworks */,
1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in Copy Frameworks */,
);
name = "Copy Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -203,7 +190,6 @@
1D384A0D100D671700D3C22F /* KeyBinding.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyBinding.plist; sourceTree = "<group>"; };
1D44972111FCA9B400B0630F /* MMCoreTextView+ToolTip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MMCoreTextView+ToolTip.m"; sourceTree = "<group>"; };
1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; };
1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = "<group>"; };
1D6008890E96A0B2003763F0 /* MMFindReplaceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMFindReplaceController.h; sourceTree = "<group>"; };
1D60088A0E96A0B2003763F0 /* MMFindReplaceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMFindReplaceController.m; sourceTree = "<group>"; };
1D80591D0E1185EA001699D1 /* Miscellaneous.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Miscellaneous.m; sourceTree = "<group>"; };
@@ -468,6 +454,13 @@
95241CF925749CC7001E3711 /* errors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = errors.h; path = ../errors.h; sourceTree = "<group>"; };
95241CFA25749CC7001E3711 /* textobject.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = textobject.c; path = ../textobject.c; sourceTree = "<group>"; };
95241CFB25749D4A001E3711 /* os_macosx.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = os_macosx.m; path = ../os_macosx.m; sourceTree = "<group>"; };
925B55CD254B604A006B047E /* MMHoverButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMHoverButton.h; sourceTree = "<group>"; };
925B55D1254B604A006B047E /* MMHoverButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMHoverButton.m; sourceTree = "<group>"; };
925B55D6254B61AB006B047E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
92C6F6E325587E1C007AE21E /* MMTab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMTab.m; sourceTree = "<group>"; };
92C6F6E525587E1C007AE21E /* MMTabline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMTabline.m; sourceTree = "<group>"; };
92C6F6E625587E1C007AE21E /* MMTabline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMTabline.h; sourceTree = "<group>"; };
92C6F6E725587E1C007AE21E /* MMTab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMTab.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -477,7 +470,7 @@
files = (
90AF83AB2A8C37F70046DA2E /* Security.framework in Frameworks */,
90B9877D2A579F9500FC95D6 /* WebKit.framework in Frameworks */,
1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */,
925B55D7254B61AC006B047E /* QuartzCore.framework in Frameworks */,
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
1D8B5A53104AF9FF002E59D5 /* Carbon.framework in Frameworks */,
52A364731C4A5789005757EC /* Sparkle.framework in Frameworks */,
@@ -499,6 +492,7 @@
children = (
9098943A2A56ECF6007B84A3 /* MMWhatsNewController.h */,
9098943B2A56ECF6007B84A3 /* MMWhatsNewController.m */,
925B55CB254B604A006B047E /* MMTabline */,
1D44972111FCA9B400B0630F /* MMCoreTextView+ToolTip.m */,
1D6008890E96A0B2003763F0 /* MMFindReplaceController.h */,
1D60088A0E96A0B2003763F0 /* MMFindReplaceController.m */,
@@ -583,14 +577,6 @@
name = Executables;
sourceTree = "<group>";
};
1D493DB40C52533B00AB718C /* Products */ = {
isa = PBXGroup;
children = (
1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */,
);
name = Products;
sourceTree = "<group>";
};
1DE602460C587F760055263D /* Vim Resources */ = {
isa = PBXGroup;
children = (
@@ -676,9 +662,9 @@
children = (
90AF83A92A8C37F70046DA2E /* Security.framework */,
90B9877B2A579F9500FC95D6 /* WebKit.framework */,
925B55D6254B61AB006B047E /* QuartzCore.framework */,
52A364721C4A5789005757EC /* Sparkle.framework */,
1D8B5A52104AF9FF002E59D5 /* Carbon.framework */,
1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */,
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
);
@@ -898,6 +884,19 @@
name = MacVim;
sourceTree = "<group>";
};
925B55CB254B604A006B047E /* MMTabline */ = {
isa = PBXGroup;
children = (
925B55CD254B604A006B047E /* MMHoverButton.h */,
925B55D1254B604A006B047E /* MMHoverButton.m */,
92C6F6E725587E1C007AE21E /* MMTab.h */,
92C6F6E325587E1C007AE21E /* MMTab.m */,
92C6F6E625587E1C007AE21E /* MMTabline.h */,
92C6F6E525587E1C007AE21E /* MMTabline.m */,
);
path = MMTabline;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -923,7 +922,6 @@
buildRules = (
);
dependencies = (
1D493DCD0C5254A400AB718C /* PBXTargetDependency */,
52818B011C1C084100F59085 /* PBXTargetDependency */,
);
name = MacVim;
@@ -997,10 +995,6 @@
mainGroup = 29B97314FDCFA39411CA2CEA /* MacVim */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 1D493DB40C52533B00AB718C /* Products */;
ProjectRef = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */;
},
{
ProductGroup = 52818AFB1C1C075300F59085 /* Products */;
ProjectRef = 52818AFA1C1C075300F59085 /* QuickLookStephen.xcodeproj */;
@@ -1015,13 +1009,6 @@
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = PSMTabBarControl.framework;
remoteRef = 1D493DB80C52533B00AB718C /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
52818AFF1C1C075300F59085 /* QLStephen.qlgenerator */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
@@ -1215,6 +1202,7 @@
files = (
8D11072D0486CEB800E47090 /* main.m in Sources */,
1D1474980C56703C0038FA2B /* MacVim.m in Sources */,
925B55D5254B604A006B047E /* MMHoverButton.m in Sources */,
1D1474A00C5673AE0038FA2B /* MMAppController.m in Sources */,
1D1474AA0C5677450038FA2B /* MMTextStorage.m in Sources */,
1D1474B00C5678370038FA2B /* MMTextView.m in Sources */,
@@ -1233,7 +1221,9 @@
1D145C7F0E5227CE00691AA0 /* MMTextViewHelper.m in Sources */,
1D60088B0E96A0B2003763F0 /* MMFindReplaceController.m in Sources */,
1DE63FFB0E71820F00959BDB /* MMCoreTextView.m in Sources */,
92C6F6E825587E1C007AE21E /* MMTab.m in Sources */,
1D44972211FCA9B400B0630F /* MMCoreTextView+ToolTip.m in Sources */,
92C6F6E925587E1C007AE21E /* MMTabline.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1248,11 +1238,6 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
1D493DCD0C5254A400AB718C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = PSMTabBarControlFramework;
targetProxy = 1D493DCC0C5254A400AB718C /* PBXContainerItemProxy */;
};
52818B011C1C084100F59085 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = QuickLookStephen;
@@ -23,7 +23,6 @@
1D384A0E100D671700D3C22F /* KeyBinding.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D384A0D100D671700D3C22F /* KeyBinding.plist */; };
1D44972211FCA9B400B0630F /* MMCoreTextView+ToolTip.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D44972111FCA9B400B0630F /* MMCoreTextView+ToolTip.m */; };
1D493D580C5247BF00AB718C /* Vim in Copy Executables */ = {isa = PBXBuildFile; fileRef = 1D493D570C5247BF00AB718C /* Vim */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
1D60088B0E96A0B2003763F0 /* MMFindReplaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60088A0E96A0B2003763F0 /* MMFindReplaceController.m */; };
1D80591F0E1185EA001699D1 /* Miscellaneous.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80591D0E1185EA001699D1 /* Miscellaneous.m */; };
1D80FBD40CBBD3B700102A1C /* MMFullScreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD00CBBD3B700102A1C /* MMFullScreenWindow.m */; };
@@ -61,7 +60,6 @@
1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; };
1DE9B9500D341AB8008FEDD4 /* MMWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */; };
1DED78600C6DE43D0079945F /* vimrc in Copy default vimrc files */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; };
1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; };
52818B031C1C08CE00F59085 /* QLStephen.qlgenerator in Copy QuickLookPlugin */ = {isa = PBXBuildFile; fileRef = 52818AFF1C1C075300F59085 /* QLStephen.qlgenerator */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
528DA66A1426D4F9003380F1 /* macvim-askpass in Copy Scripts */ = {isa = PBXBuildFile; fileRef = 528DA6691426D4EB003380F1 /* macvim-askpass */; };
52A364731C4A5789005757EC /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52A364721C4A5789005757EC /* Sparkle.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
@@ -78,23 +76,13 @@
90A33BEA28D563DF003A2E2F /* MMSparkle2Delegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A33BE928D563DF003A2E2F /* MMSparkle2Delegate.m */; };
90AF83AB2A8C37F70046DA2E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90AF83A92A8C37F70046DA2E /* Security.framework */; };
90B9877D2A579F9500FC95D6 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90B9877B2A579F9500FC95D6 /* WebKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
925B55D5254B604A006B047E /* MMHoverButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 925B55D1254B604A006B047E /* MMHoverButton.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
925B55D7254B61AC006B047E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 925B55D6254B61AB006B047E /* QuartzCore.framework */; };
92C6F6E825587E1C007AE21E /* MMTab.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C6F6E325587E1C007AE21E /* MMTab.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
92C6F6E925587E1C007AE21E /* MMTabline.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C6F6E525587E1C007AE21E /* MMTabline.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
1D493DB80C52533B00AB718C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 53DF68FD067E5B5A0090B5B0;
remoteInfo = PSMTabBarControlFramework;
};
1D493DCC0C5254A400AB718C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 53DF68FC067E5B5A0090B5B0;
remoteInfo = PSMTabBarControlFramework;
};
52818AFE1C1C075300F59085 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 52818AFA1C1C075300F59085 /* QuickLookStephen.xcodeproj */;
@@ -137,7 +125,6 @@
dstSubfolderSpec = 10;
files = (
52A364761C4A57C1005757EC /* Sparkle.framework in Copy Frameworks */,
1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in Copy Frameworks */,
);
name = "Copy Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -204,7 +191,6 @@
1D384A0D100D671700D3C22F /* KeyBinding.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyBinding.plist; sourceTree = "<group>"; };
1D44972111FCA9B400B0630F /* MMCoreTextView+ToolTip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MMCoreTextView+ToolTip.m"; sourceTree = "<group>"; };
1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; };
1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = "<group>"; };
1D6008890E96A0B2003763F0 /* MMFindReplaceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMFindReplaceController.h; sourceTree = "<group>"; };
1D60088A0E96A0B2003763F0 /* MMFindReplaceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMFindReplaceController.m; sourceTree = "<group>"; };
1D80591D0E1185EA001699D1 /* Miscellaneous.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Miscellaneous.m; sourceTree = "<group>"; };
@@ -469,6 +455,13 @@
95241CF925749CC7001E3711 /* errors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = errors.h; path = ../errors.h; sourceTree = "<group>"; };
95241CFA25749CC7001E3711 /* textobject.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = textobject.c; path = ../textobject.c; sourceTree = "<group>"; };
95241CFB25749D4A001E3711 /* os_macosx.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = os_macosx.m; path = ../os_macosx.m; sourceTree = "<group>"; };
925B55CD254B604A006B047E /* MMHoverButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMHoverButton.h; sourceTree = "<group>"; };
925B55D1254B604A006B047E /* MMHoverButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMHoverButton.m; sourceTree = "<group>"; };
925B55D6254B61AB006B047E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
92C6F6E325587E1C007AE21E /* MMTab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMTab.m; sourceTree = "<group>"; };
92C6F6E525587E1C007AE21E /* MMTabline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMTabline.m; sourceTree = "<group>"; };
92C6F6E625587E1C007AE21E /* MMTabline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMTabline.h; sourceTree = "<group>"; };
92C6F6E725587E1C007AE21E /* MMTab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMTab.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -478,7 +471,7 @@
files = (
90AF83AB2A8C37F70046DA2E /* Security.framework in Frameworks */,
90B9877D2A579F9500FC95D6 /* WebKit.framework in Frameworks */,
1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */,
925B55D7254B61AC006B047E /* QuartzCore.framework in Frameworks */,
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
1D8B5A53104AF9FF002E59D5 /* Carbon.framework in Frameworks */,
52A364731C4A5789005757EC /* Sparkle.framework in Frameworks */,
@@ -500,6 +493,7 @@
children = (
9098943A2A56ECF6007B84A3 /* MMWhatsNewController.h */,
9098943B2A56ECF6007B84A3 /* MMWhatsNewController.m */,
925B55CB254B604A006B047E /* MMTabline */,
1D44972111FCA9B400B0630F /* MMCoreTextView+ToolTip.m */,
1D6008890E96A0B2003763F0 /* MMFindReplaceController.h */,
1D60088A0E96A0B2003763F0 /* MMFindReplaceController.m */,
@@ -584,14 +578,6 @@
name = Executables;
sourceTree = "<group>";
};
1D493DB40C52533B00AB718C /* Products */ = {
isa = PBXGroup;
children = (
1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */,
);
name = Products;
sourceTree = "<group>";
};
1DE602460C587F760055263D /* Vim Resources */ = {
isa = PBXGroup;
children = (
@@ -677,9 +663,9 @@
children = (
90AF83A92A8C37F70046DA2E /* Security.framework */,
90B9877B2A579F9500FC95D6 /* WebKit.framework */,
925B55D6254B61AB006B047E /* QuartzCore.framework */,
52A364721C4A5789005757EC /* Sparkle.framework */,
1D8B5A52104AF9FF002E59D5 /* Carbon.framework */,
1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */,
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
);
@@ -899,6 +885,19 @@
name = MacVim;
sourceTree = "<group>";
};
925B55CB254B604A006B047E /* MMTabline */ = {
isa = PBXGroup;
children = (
925B55CD254B604A006B047E /* MMHoverButton.h */,
925B55D1254B604A006B047E /* MMHoverButton.m */,
92C6F6E725587E1C007AE21E /* MMTab.h */,
92C6F6E325587E1C007AE21E /* MMTab.m */,
92C6F6E625587E1C007AE21E /* MMTabline.h */,
92C6F6E525587E1C007AE21E /* MMTabline.m */,
);
path = MMTabline;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -924,7 +923,6 @@
buildRules = (
);
dependencies = (
1D493DCD0C5254A400AB718C /* PBXTargetDependency */,
52818B011C1C084100F59085 /* PBXTargetDependency */,
);
name = MacVim;
@@ -998,10 +996,6 @@
mainGroup = 29B97314FDCFA39411CA2CEA /* MacVim */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 1D493DB40C52533B00AB718C /* Products */;
ProjectRef = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */;
},
{
ProductGroup = 52818AFB1C1C075300F59085 /* Products */;
ProjectRef = 52818AFA1C1C075300F59085 /* QuickLookStephen.xcodeproj */;
@@ -1016,13 +1010,6 @@
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = PSMTabBarControl.framework;
remoteRef = 1D493DB80C52533B00AB718C /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
52818AFF1C1C075300F59085 /* QLStephen.qlgenerator */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
@@ -1216,6 +1203,7 @@
files = (
8D11072D0486CEB800E47090 /* main.m in Sources */,
1D1474980C56703C0038FA2B /* MacVim.m in Sources */,
925B55D5254B604A006B047E /* MMHoverButton.m in Sources */,
1D1474A00C5673AE0038FA2B /* MMAppController.m in Sources */,
1D1474AA0C5677450038FA2B /* MMTextStorage.m in Sources */,
1D1474B00C5678370038FA2B /* MMTextView.m in Sources */,
@@ -1234,7 +1222,9 @@
1D145C7F0E5227CE00691AA0 /* MMTextViewHelper.m in Sources */,
1D60088B0E96A0B2003763F0 /* MMFindReplaceController.m in Sources */,
1DE63FFB0E71820F00959BDB /* MMCoreTextView.m in Sources */,
92C6F6E825587E1C007AE21E /* MMTab.m in Sources */,
1D44972211FCA9B400B0630F /* MMCoreTextView+ToolTip.m in Sources */,
92C6F6E925587E1C007AE21E /* MMTabline.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1249,11 +1239,6 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
1D493DCD0C5254A400AB718C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = PSMTabBarControlFramework;
targetProxy = 1D493DCC0C5254A400AB718C /* PBXContainerItemProxy */;
};
52818B011C1C084100F59085 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = QuickLookStephen;
+1 -8
View File
@@ -22,6 +22,7 @@ extern NSString *MMTabMinWidthKey;
extern NSString *MMTabMaxWidthKey;
extern NSString *MMTabOptimumWidthKey;
extern NSString *MMShowAddTabButtonKey;
extern NSString *MMShowTabScrollButtonsKey;
extern NSString *MMTextInsetLeftKey;
extern NSString *MMTextInsetRightKey;
extern NSString *MMTextInsetTopKey;
@@ -148,11 +149,6 @@ enum {
@end
@interface NSTabView (MMExtras)
- (void)removeAllTabViewItems;
@end
@interface NSNumber (MMExtras)
// Used by modifyFont:/convertFont: to allow font size to be changed via menu
// (bound to Cmd+/Cmd-) or using macaction fontSizeUp:/fontSizeDown:.
@@ -177,9 +173,6 @@ NSView *showHiddenFilesView(void);
NSString *normalizeFilename(NSString *filename);
NSArray *normalizeFilenames(NSArray *filenames);
BOOL shouldUseYosemiteTabBarStyle(void);
BOOL shouldUseMojaveTabBarStyle(void);
int getCurrentAppearance(NSAppearance *appearance);
// Pasteboard helpers
+1 -33
View File
@@ -18,6 +18,7 @@ NSString *MMTabMinWidthKey = @"MMTabMinWidth";
NSString *MMTabMaxWidthKey = @"MMTabMaxWidth";
NSString *MMTabOptimumWidthKey = @"MMTabOptimumWidth";
NSString *MMShowAddTabButtonKey = @"MMShowAddTabButton";
NSString *MMShowTabScrollButtonsKey = @"MMShowTabScrollButtons";
NSString *MMTextInsetLeftKey = @"MMTextInsetLeft";
NSString *MMTextInsetRightKey = @"MMTextInsetRight";
NSString *MMTextInsetTopKey = @"MMTextInsetTop";
@@ -233,23 +234,6 @@ NSString *MMScrollOneDirectionOnlyKey = @"MMScrollOneDirectionOnly";
@implementation NSTabView (MMExtras)
- (void)removeAllTabViewItems
{
NSArray *existingItems = [self tabViewItems];
NSEnumerator *e = [existingItems objectEnumerator];
NSTabViewItem *item;
while ((item = [e nextObject])) {
[self removeTabViewItem:item];
}
}
@end // NSTabView (MMExtras)
@implementation NSNumber (MMExtras)
// HACK to allow font size to be changed via menu (bound to Cmd+/Cmd-)
@@ -320,22 +304,6 @@ normalizeFilenames(NSArray *filenames)
BOOL
shouldUseYosemiteTabBarStyle(void)
{
return floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_10;
}
BOOL
shouldUseMojaveTabBarStyle(void)
{
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
if (@available(macos 10.14, *)) {
return true;
}
#endif
return false;
}
int
getCurrentAppearance(NSAppearance *appearance){
int flag = 0; // for macOS 10.13 or earlier always return 0;
@@ -1,24 +0,0 @@
{
IBClasses = (
{
ACTIONS = {newWindow = id; };
CLASS = AppController;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{CLASS = FakeModel; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {addNewTab = id; closeTab = id; };
CLASS = FirstResponder;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
CLASS = PSMTabBarControl;
LANGUAGE = ObjC;
OUTLETS = {delegate = id; partnerView = id; style = id; tabView = NSTabView; };
SUPERCLASS = NSControl;
}
);
IBVersion = 1;
}
@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>135 107 356 240 0 0 1680 1028 </string>
<key>IBEditorPositions</key>
<dict>
<key>29</key>
<string>130 357 371 44 0 0 1680 1028 </string>
</dict>
<key>IBFramework Version</key>
<string>443.0</string>
<key>IBOpenObjects</key>
<array>
<integer>29</integer>
</array>
<key>IBSystem Version</key>
<string>8H14</string>
</dict>
</plist>
Binary file not shown.
@@ -1,22 +0,0 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
CLASS = PSMTabBarControlInspector;
LANGUAGE = ObjC;
OUTLETS = {
"_allowsDragBetweenWindows" = NSButton;
"_canCloseOnlyTab" = NSButton;
"_cellMaxWidth" = NSTextField;
"_cellMinWidth" = NSTextField;
"_cellOptimumWidth" = NSTextField;
"_hideForSingleTab" = NSButton;
"_showAddTab" = NSButton;
"_sizeToFit" = NSButton;
"_stylePopUp" = NSPopUpButton;
};
SUPERCLASS = IBInspector;
}
);
IBVersion = 1;
}
@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>83 72 356 240 0 0 1680 1028 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>3</integer>
</array>
<key>IBSystem Version</key>
<string>8I127</string>
</dict>
</plist>
@@ -1,28 +0,0 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = PSMAquaTabStyle; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = PSMMetalTabStyle; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = PSMOverflowPopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
{
CLASS = PSMProgressIndicator;
LANGUAGE = ObjC;
SUPERCLASS = NSProgressIndicator;
},
{CLASS = PSMRolloverButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{CLASS = PSMTabBarCell; LANGUAGE = ObjC; SUPERCLASS = NSActionCell; },
{
CLASS = PSMTabBarControl;
LANGUAGE = ObjC;
OUTLETS = {delegate = id; partnerView = id; style = id; tabView = NSTabView; };
SUPERCLASS = NSControl;
},
{
CLASS = PSMTabBarControlPalette;
LANGUAGE = ObjC;
OUTLETS = {repImage = NSImageView; };
SUPERCLASS = IBPalette;
}
);
IBVersion = 1;
}
@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>83 142 356 240 0 0 1680 1028 </string>
<key>IBFramework Version</key>
<string>443.0</string>
<key>IBOpenObjects</key>
<array>
<integer>2</integer>
</array>
<key>IBSystem Version</key>
<string>8H14</string>
</dict>
</plist>
@@ -1,38 +0,0 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {
addNewTab = id;
closeTab = id;
configAddTabButton = id;
configCanCloseOnlyTab = id;
configHideForSingleTab = id;
configStyle = id;
configTabMaxWidth = id;
configTabMinWidth = id;
configTabOptimumWidth = id;
configTabSizeToFit = id;
isProcessingAction = id;
setIconNamed = id;
setObjectCount = id;
setTabLabel = id;
stopProcessing = id;
toggleToolbar = id;
};
CLASS = WindowController;
LANGUAGE = ObjC;
OUTLETS = {
drawer = NSDrawer;
iconButton = NSPopUpButton;
isProcessingButton = NSButton;
objectCounterField = NSTextField;
tabBar = PSMTabBarControl;
tabField = NSTextField;
tabView = NSTabView;
};
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
}
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>35 49 356 240 0 0 1024 746 </string>
<key>IBEditorPositions</key>
<dict>
<key>18</key>
<string>271 466 481 64 0 0 1024 746 </string>
<key>20</key>
<string>400 254 224 482 0 0 1024 746 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>18</integer>
<integer>20</integer>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8J135</string>
</dict>
</plist>
-24
View File
@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>PSMTabBarControl</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.positivespinmedia.PSMTabBarControl</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleSignature</key>
<string>PSM1</string>
<key>CFBundleVersion</key>
<string>1.1</string>
</dict>
</plist>
@@ -1,6 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "189",
"alpha" : "1.000",
"blue" : "188",
"green" : "189"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "40",
"alpha" : "1.000",
"blue" : "42",
"green" : "40"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "168",
"alpha" : "1.000",
"blue" : "168",
"green" : "168"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "36",
"alpha" : "1.000",
"blue" : "39",
"green" : "37"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "209",
"alpha" : "1.000",
"blue" : "208",
"green" : "209"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "54",
"alpha" : "1.000",
"blue" : "57",
"green" : "55"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "221",
"alpha" : "1.000",
"blue" : "221",
"green" : "221"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "30",
"alpha" : "1.000",
"blue" : "33",
"green" : "31"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "198",
"alpha" : "1.000",
"blue" : "198",
"green" : "198"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "27",
"alpha" : "1.000",
"blue" : "30",
"green" : "28"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "246",
"alpha" : "1.000",
"blue" : "246",
"green" : "246"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "43",
"alpha" : "1.000",
"blue" : "47",
"green" : "45"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "169",
"alpha" : "1.000",
"blue" : "169",
"green" : "169"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "96",
"alpha" : "1.000",
"blue" : "99",
"green" : "97"
}
}
}
]
}
@@ -1,38 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "universal",
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "210",
"alpha" : "1.000",
"blue" : "210",
"green" : "210"
}
}
},
{
"idiom" : "universal",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"red" : "73",
"alpha" : "1.000",
"blue" : "77",
"green" : "74"
}
}
}
]
}
@@ -1,7 +0,0 @@
{
PSMTabBarControl = {
SuperClass = NSControl;
Attributes = {
};
};
}
@@ -1,731 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXAggregateTarget section */
53DF6901067E5B8E0090B5B0 /* All */ = {
isa = PBXAggregateTarget;
buildConfigurationList = C056398708A954F8003078D8 /* Build configuration list for PBXAggregateTarget "All" */;
buildPhases = (
);
dependencies = (
53DF6905067E5B930090B5B0 /* PBXTargetDependency */,
);
name = All;
productName = All;
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
13F8B89007B43554008AE28D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD92D38A0106425D02CA0E72 /* Cocoa.framework */; };
523897F415BDA9AC00498A53 /* TabClose_Front_Pressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 523897EE15BDA9AC00498A53 /* TabClose_Front_Pressed@2x.png */; };
523897F515BDA9AC00498A53 /* TabClose_Front_Rollover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 523897EF15BDA9AC00498A53 /* TabClose_Front_Rollover@2x.png */; };
523897F615BDA9AC00498A53 /* TabClose_Front@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 523897F015BDA9AC00498A53 /* TabClose_Front@2x.png */; };
523897F715BDA9AC00498A53 /* TabNewMetal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 523897F115BDA9AC00498A53 /* TabNewMetal@2x.png */; };
523897F815BDA9AC00498A53 /* TabNewMetalPressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 523897F215BDA9AC00498A53 /* TabNewMetalPressed@2x.png */; };
523897F915BDA9AC00498A53 /* TabNewMetalRollover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 523897F315BDA9AC00498A53 /* TabNewMetalRollover@2x.png */; };
52A57C0F15BBA230003EC59C /* TabClose_Front.png in Resources */ = {isa = PBXBuildFile; fileRef = 52A57C0C15BBA230003EC59C /* TabClose_Front.png */; };
52A57C1015BBA230003EC59C /* TabClose_Front_Pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 52A57C0D15BBA230003EC59C /* TabClose_Front_Pressed.png */; };
52A57C1115BBA230003EC59C /* TabClose_Front_Rollover.png in Resources */ = {isa = PBXBuildFile; fileRef = 52A57C0E15BBA230003EC59C /* TabClose_Front_Rollover.png */; };
52C0B9B415BDB7A9000C268F /* overflowImage@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 52C0B9B215BDB7A9000C268F /* overflowImage@2x.png */; };
52C0B9B515BDB7A9000C268F /* overflowImagePressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 52C0B9B315BDB7A9000C268F /* overflowImagePressed@2x.png */; };
52C268D015BDB72B0012FECA /* overflowImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 52C268CE15BDB72B0012FECA /* overflowImage.png */; };
52C268D115BDB72B0012FECA /* overflowImagePressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 52C268CF15BDB72B0012FECA /* overflowImagePressed.png */; };
52FAFCCF1C30F4B500C6E613 /* TabNewYosemite.png in Resources */ = {isa = PBXBuildFile; fileRef = 52FAFCCD1C30F4B500C6E613 /* TabNewYosemite.png */; };
52FAFCD01C30F4B500C6E613 /* TabNewYosemite@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 52FAFCCE1C30F4B500C6E613 /* TabNewYosemite@2x.png */; };
52FAFCD31C30F4DF00C6E613 /* PSMYosemiteTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 52FAFCD11C30F4DF00C6E613 /* PSMYosemiteTabStyle.h */; };
52FAFCD41C30F4DF00C6E613 /* PSMYosemiteTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 52FAFCD21C30F4DF00C6E613 /* PSMYosemiteTabStyle.m */; };
546DEAF1067F63070098DCC4 /* PSMTabBarControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */; };
546DEAF2067F630E0098DCC4 /* PSMTabBarControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */; settings = {ATTRIBUTES = (Public, ); }; };
90AD234F21A969C100CEF036 /* PSMMojaveTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 90AD234D21A969C100CEF036 /* PSMMojaveTabStyle.h */; };
90AD235021A969C100CEF036 /* PSMMojaveTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AD234E21A969C100CEF036 /* PSMMojaveTabStyle.m */; };
90DE16CC21A955EE004F0124 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 90DE16CB21A955EE004F0124 /* Media.xcassets */; };
A2082A9009EAEB34009AC8BE /* PSMTabDragAssistant.h in Headers */ = {isa = PBXBuildFile; fileRef = A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */; };
A2082A9109EAEB34009AC8BE /* PSMTabDragAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */; };
A2129BB209AEB58F00724E6C /* PSMProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */; };
A2129BB309AEB58F00724E6C /* PSMProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */; };
A251BE850959A1B90058BC7F /* PSMOverflowPopUpButton.h in Headers */ = {isa = PBXBuildFile; fileRef = A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */; };
A251BE860959A1B90058BC7F /* PSMOverflowPopUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */; };
A251BE870959A1B90058BC7F /* PSMTabBarCell.h in Headers */ = {isa = PBXBuildFile; fileRef = A251BE830959A1B90058BC7F /* PSMTabBarCell.h */; };
A251BE880959A1B90058BC7F /* PSMTabBarCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A251BE840959A1B90058BC7F /* PSMTabBarCell.m */; };
A268E80409A9822A00E082AA /* AquaTabNew.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7F809A9822900E082AA /* AquaTabNew.png */; };
A268E80509A9822A00E082AA /* AquaTabNewPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7F909A9822900E082AA /* AquaTabNewPressed.png */; };
A268E80609A9822A00E082AA /* AquaTabNewRollover.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */; };
A268E80709A9822A00E082AA /* TabNewMetal.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FB09A9822900E082AA /* TabNewMetal.png */; };
A268E80809A9822A00E082AA /* TabNewMetalPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */; };
A268E80909A9822A00E082AA /* TabNewMetalRollover.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */; };
A268EA6209A9831800E082AA /* PSMRolloverButton.h in Headers */ = {isa = PBXBuildFile; fileRef = A268EA5F09A9831800E082AA /* PSMRolloverButton.h */; };
A268EA6309A9831800E082AA /* PSMRolloverButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A268EA6009A9831800E082AA /* PSMRolloverButton.m */; };
A27E47850A28EE76007BA395 /* TabIcon.tif in Resources */ = {isa = PBXBuildFile; fileRef = A20822F00959F6AA00C5F5A4 /* TabIcon.tif */; };
A27E47880A28EE7C007BA395 /* TabControlRep.tif in Resources */ = {isa = PBXBuildFile; fileRef = A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */; };
A2C0D99509AF870000ED379C /* pi.png in Resources */ = {isa = PBXBuildFile; fileRef = A2C0D99309AF870000ED379C /* pi.png */; };
A2D32EDC09A634C900EC8662 /* PSMTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */; };
A2D32EF709A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */; };
A2D32EF809A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */; };
A2D32EF909A63BF700EC8662 /* AquaTabClose_Front.tif in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */; };
A2D32EFA09A63BF700EC8662 /* AquaTabsBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */; };
A2D32EFB09A63BF700EC8662 /* AquaTabsDown.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */; };
A2D32EFC09A63BF700EC8662 /* AquaTabsSeparator.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */; };
A2D32EFD09A63BF700EC8662 /* AquaTabsSeparatorDown.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */; };
A2D32F0009A63D7A00EC8662 /* PSMMetalTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */; };
A2D32F0109A63D7A00EC8662 /* PSMMetalTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */; };
A2D3317C09A68B7500EC8662 /* AquaTabsDownGraphite.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */; };
A2D3317D09A68B7500EC8662 /* AquaTabsDownNonKey.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */; };
A2D98B0A0A2B432C0064C6F8 /* PSMUnifiedTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */; };
A2D98B0B0A2B432C0064C6F8 /* PSMUnifiedTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */; };
A2D98B120A2B43FA0064C6F8 /* NSBezierPath_AMShading.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */; };
A2D98B130A2B43FA0064C6F8 /* NSBezierPath_AMShading.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
53DF6904067E5B930090B5B0 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0259C573FE90428111CA0C5A /* Project object */;
proxyType = 1;
remoteGlobalIDString = 53DF68FC067E5B5A0090B5B0;
remoteInfo = PSMTabBarControlFramework;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
0259C576FE90428111CA0C5A /* PSMTabBarControl.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarControl.m; path = source/PSMTabBarControl.m; sourceTree = "<group>"; };
0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarControlInspector.m; path = source/PSMTabBarControlInspector.m; sourceTree = "<group>"; };
0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarControlPalette.m; path = source/PSMTabBarControlPalette.m; sourceTree = "<group>"; };
0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControl.h; path = source/PSMTabBarControl.h; sourceTree = "<group>"; };
0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControlInspector.h; path = source/PSMTabBarControlInspector.h; sourceTree = "<group>"; };
0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControlPalette.h; path = source/PSMTabBarControlPalette.h; sourceTree = "<group>"; };
0259C57FFE90428111CA0C5A /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/PSMTabBarControlInspector.nib; sourceTree = "<group>"; };
0259C581FE90428111CA0C5A /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/PSMTabBarControlPalette.nib; sourceTree = "<group>"; };
0259C583FE90428111CA0C5A /* palette.table */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = palette.table; sourceTree = "<group>"; };
13EB9DBD07DE0F1E00EB933A /* InterfaceBuilder.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = InterfaceBuilder.framework; path = /System/Library/Frameworks/InterfaceBuilder.framework; sourceTree = "<absolute>"; };
13F8B88807B434F6008AE28D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
13F8B88A07B434F6008AE28D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControl_Prefix.pch; path = source/PSMTabBarControl_Prefix.pch; sourceTree = "<group>"; };
523897EE15BDA9AC00498A53 /* TabClose_Front_Pressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabClose_Front_Pressed@2x.png"; path = "images/TabClose_Front_Pressed@2x.png"; sourceTree = "<group>"; };
523897EF15BDA9AC00498A53 /* TabClose_Front_Rollover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabClose_Front_Rollover@2x.png"; path = "images/TabClose_Front_Rollover@2x.png"; sourceTree = "<group>"; };
523897F015BDA9AC00498A53 /* TabClose_Front@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabClose_Front@2x.png"; path = "images/TabClose_Front@2x.png"; sourceTree = "<group>"; };
523897F115BDA9AC00498A53 /* TabNewMetal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabNewMetal@2x.png"; path = "images/TabNewMetal@2x.png"; sourceTree = "<group>"; };
523897F215BDA9AC00498A53 /* TabNewMetalPressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabNewMetalPressed@2x.png"; path = "images/TabNewMetalPressed@2x.png"; sourceTree = "<group>"; };
523897F315BDA9AC00498A53 /* TabNewMetalRollover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabNewMetalRollover@2x.png"; path = "images/TabNewMetalRollover@2x.png"; sourceTree = "<group>"; };
52A57C0C15BBA230003EC59C /* TabClose_Front.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabClose_Front.png; path = images/TabClose_Front.png; sourceTree = "<group>"; };
52A57C0D15BBA230003EC59C /* TabClose_Front_Pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabClose_Front_Pressed.png; path = images/TabClose_Front_Pressed.png; sourceTree = "<group>"; };
52A57C0E15BBA230003EC59C /* TabClose_Front_Rollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabClose_Front_Rollover.png; path = images/TabClose_Front_Rollover.png; sourceTree = "<group>"; };
52C0B9B215BDB7A9000C268F /* overflowImage@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "overflowImage@2x.png"; path = "images/overflowImage@2x.png"; sourceTree = "<group>"; };
52C0B9B315BDB7A9000C268F /* overflowImagePressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "overflowImagePressed@2x.png"; path = "images/overflowImagePressed@2x.png"; sourceTree = "<group>"; };
52C268CE15BDB72B0012FECA /* overflowImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = overflowImage.png; path = images/overflowImage.png; sourceTree = "<group>"; };
52C268CF15BDB72B0012FECA /* overflowImagePressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = overflowImagePressed.png; path = images/overflowImagePressed.png; sourceTree = "<group>"; };
52FAFCCD1C30F4B500C6E613 /* TabNewYosemite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewYosemite.png; path = images/TabNewYosemite.png; sourceTree = "<group>"; };
52FAFCCE1C30F4B500C6E613 /* TabNewYosemite@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TabNewYosemite@2x.png"; path = "images/TabNewYosemite@2x.png"; sourceTree = "<group>"; };
52FAFCD11C30F4DF00C6E613 /* PSMYosemiteTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMYosemiteTabStyle.h; path = source/PSMYosemiteTabStyle.h; sourceTree = "<group>"; };
52FAFCD21C30F4DF00C6E613 /* PSMYosemiteTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMYosemiteTabStyle.m; path = source/PSMYosemiteTabStyle.m; sourceTree = "<group>"; };
53DF68FD067E5B5A0090B5B0 /* PSMTabBarControl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PSMTabBarControl.framework; sourceTree = BUILT_PRODUCTS_DIR; };
53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "PSMTabBarControlFramework-Info.plist"; sourceTree = "<group>"; };
54D33B2806778E3300C9C163 /* PSMTabBarControl.ibclassdescription */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PSMTabBarControl.ibclassdescription; sourceTree = "<group>"; };
8D1AC9730486D14A00FE50C9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D1AC97B0486D23100FE50C9 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
90AD234D21A969C100CEF036 /* PSMMojaveTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMMojaveTabStyle.h; path = source/PSMMojaveTabStyle.h; sourceTree = "<group>"; };
90AD234E21A969C100CEF036 /* PSMMojaveTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMMojaveTabStyle.m; path = source/PSMMojaveTabStyle.m; sourceTree = "<group>"; };
90DE16CB21A955EE004F0124 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = "<group>"; };
A2072A2409ABD88600304BCB /* Folder.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Folder.tif; path = images/Folder.tif; sourceTree = "<group>"; };
A2072A2509ABD88600304BCB /* Globe.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Globe.tiff; path = images/Globe.tiff; sourceTree = "<group>"; };
A2072B5C09AC1FA500304BCB /* Warning.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Warning.png; path = images/Warning.png; sourceTree = "<group>"; };
A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabControlRep.tif; path = images/TabControlRep.tif; sourceTree = "<group>"; };
A20822F00959F6AA00C5F5A4 /* TabIcon.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabIcon.tif; path = images/TabIcon.tif; sourceTree = "<group>"; };
A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMTabDragAssistant.h; path = source/PSMTabDragAssistant.h; sourceTree = "<group>"; };
A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMTabDragAssistant.m; path = source/PSMTabDragAssistant.m; sourceTree = "<group>"; wrapsLines = 0; };
A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMProgressIndicator.h; path = source/PSMProgressIndicator.h; sourceTree = "<group>"; };
A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMProgressIndicator.m; path = source/PSMProgressIndicator.m; sourceTree = "<group>"; };
A246FB040A2BD6F9005BDF7B /* PSMTabBarControlDoc.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html.documentation; name = PSMTabBarControlDoc.html; path = documentation/PSMTabBarControlDoc.html; sourceTree = "<group>"; };
A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 30; name = PSMOverflowPopUpButton.h; path = source/PSMOverflowPopUpButton.h; sourceTree = "<group>"; };
A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMOverflowPopUpButton.m; path = source/PSMOverflowPopUpButton.m; sourceTree = "<group>"; };
A251BE830959A1B90058BC7F /* PSMTabBarCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarCell.h; path = source/PSMTabBarCell.h; sourceTree = "<group>"; };
A251BE840959A1B90058BC7F /* PSMTabBarCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarCell.m; path = source/PSMTabBarCell.m; sourceTree = "<group>"; };
A251BE890959A1EA0058BC7F /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AppController.h; path = source/AppController.h; sourceTree = "<group>"; };
A251BE8A0959A1EA0058BC7F /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = AppController.m; path = source/AppController.m; sourceTree = "<group>"; };
A251BE8B0959A1EA0058BC7F /* FakeModel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = FakeModel.h; path = source/FakeModel.h; sourceTree = "<group>"; };
A251BE8C0959A1EA0058BC7F /* FakeModel.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = FakeModel.m; path = source/FakeModel.m; sourceTree = "<group>"; };
A251BE8D0959A1EA0058BC7F /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = main.m; path = source/main.m; sourceTree = "<group>"; };
A251BE8F0959A23A0058BC7F /* 32x32cancel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = 32x32cancel.png; path = images/32x32cancel.png; sourceTree = "<group>"; };
A251BE9B0959A2530058BC7F /* ReadMe.rtfd */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; path = ReadMe.rtfd; sourceTree = "<group>"; };
A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TabBarControlDemo-Info.plist"; sourceTree = "<group>"; };
A251BEC30959BC0E0058BC7F /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; };
A268E7F809A9822900E082AA /* AquaTabNew.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabNew.png; path = images/AquaTabNew.png; sourceTree = "<group>"; };
A268E7F909A9822900E082AA /* AquaTabNewPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabNewPressed.png; path = images/AquaTabNewPressed.png; sourceTree = "<group>"; };
A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabNewRollover.png; path = images/AquaTabNewRollover.png; sourceTree = "<group>"; };
A268E7FB09A9822900E082AA /* TabNewMetal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewMetal.png; path = images/TabNewMetal.png; sourceTree = "<group>"; };
A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewMetalPressed.png; path = images/TabNewMetalPressed.png; sourceTree = "<group>"; };
A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewMetalRollover.png; path = images/TabNewMetalRollover.png; sourceTree = "<group>"; };
A268EA5F09A9831800E082AA /* PSMRolloverButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMRolloverButton.h; path = source/PSMRolloverButton.h; sourceTree = "<group>"; };
A268EA6009A9831800E082AA /* PSMRolloverButton.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMRolloverButton.m; path = source/PSMRolloverButton.m; sourceTree = "<group>"; };
A269361009A778770006911E /* 32x32_log.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = 32x32_log.tiff; path = images/32x32_log.tiff; sourceTree = "<group>"; };
A2A711BA09E5AE1E00D0089B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Window.nib; sourceTree = "<group>"; };
A2A711BD09E5BF0500D0089B /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WindowController.h; path = source/WindowController.h; sourceTree = "<group>"; };
A2A711BE09E5BF0500D0089B /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WindowController.m; path = source/WindowController.m; sourceTree = "<group>"; };
A2C0D99309AF870000ED379C /* pi.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pi.png; path = images/pi.png; sourceTree = "<group>"; };
A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMTabStyle.h; path = source/PSMTabStyle.h; sourceTree = "<group>"; };
A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = AquaTabClose_Front_Pressed.tif; path = images/AquaTabClose_Front_Pressed.tif; sourceTree = "<group>"; };
A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = AquaTabClose_Front_Rollover.tif; path = images/AquaTabClose_Front_Rollover.tif; sourceTree = "<group>"; };
A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = AquaTabClose_Front.tif; path = images/AquaTabClose_Front.tif; sourceTree = "<group>"; };
A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsBackground.png; path = images/AquaTabsBackground.png; sourceTree = "<group>"; };
A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsDown.png; path = images/AquaTabsDown.png; sourceTree = "<group>"; };
A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsSeparator.png; path = images/AquaTabsSeparator.png; sourceTree = "<group>"; };
A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsSeparatorDown.png; path = images/AquaTabsSeparatorDown.png; sourceTree = "<group>"; };
A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMMetalTabStyle.h; path = source/PSMMetalTabStyle.h; sourceTree = "<group>"; };
A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMMetalTabStyle.m; path = source/PSMMetalTabStyle.m; sourceTree = "<group>"; };
A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsDownGraphite.png; path = images/AquaTabsDownGraphite.png; sourceTree = "<group>"; };
A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsDownNonKey.png; path = images/AquaTabsDownNonKey.png; sourceTree = "<group>"; };
A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMUnifiedTabStyle.h; path = source/PSMUnifiedTabStyle.h; sourceTree = "<group>"; };
A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMUnifiedTabStyle.m; path = source/PSMUnifiedTabStyle.m; sourceTree = "<group>"; };
A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = NSBezierPath_AMShading.h; path = source/NSBezierPath_AMShading.h; sourceTree = "<group>"; };
A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = NSBezierPath_AMShading.m; path = source/NSBezierPath_AMShading.m; sourceTree = "<group>"; };
DD92D38A0106425D02CA0E72 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
53DF68FB067E5B5A0090B5B0 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
13F8B89007B43554008AE28D /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0259C574FE90428111CA0C5A /* PSMTabBarControl */ = {
isa = PBXGroup;
children = (
A251BE9B0959A2530058BC7F /* ReadMe.rtfd */,
A246FADE0A2BD446005BDF7B /* Documentation */,
32DBCF9E0370C38000C91783 /* Palette */,
54D33B2C06778E4400C9C163 /* Framework */,
A251BE590959A0550058BC7F /* Demo App */,
0259C582FE90428111CA0C5A /* Resources */,
1ED78706FE9D4A0611CA0C5A /* Products */,
2E58F364FFB232C311CA0CBA /* Frameworks */,
);
name = PSMTabBarControl;
sourceTree = "<group>";
};
0259C582FE90428111CA0C5A /* Resources */ = {
isa = PBXGroup;
children = (
90DE16CB21A955EE004F0124 /* Media.xcassets */,
A251BEC20959BC0E0058BC7F /* MainMenu.nib */,
A251BE8E0959A21A0058BC7F /* Images */,
8D1AC9730486D14A00FE50C9 /* Info.plist */,
53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */,
A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */,
8D1AC97F0486D23B00FE50C9 /* InfoPlist.strings */,
A2A711B909E5AE1E00D0089B /* Window.nib */,
);
name = Resources;
sourceTree = "<group>";
};
131E8FE8067F80F40006E0CE /* Resources */ = {
isa = PBXGroup;
children = (
A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */,
A20822F00959F6AA00C5F5A4 /* TabIcon.tif */,
0259C57EFE90428111CA0C5A /* PSMTabBarControlInspector.nib */,
0259C580FE90428111CA0C5A /* PSMTabBarControlPalette.nib */,
);
name = Resources;
sourceTree = "<group>";
};
13F8B6FD07B43410008AE28D /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
13EB9DBD07DE0F1E00EB933A /* InterfaceBuilder.framework */,
DD92D38A0106425D02CA0E72 /* Cocoa.framework */,
);
name = "Linked Frameworks";
sourceTree = "<group>";
};
13F8B70407B43425008AE28D /* Other Frameworks */ = {
isa = PBXGroup;
children = (
13F8B88807B434F6008AE28D /* AppKit.framework */,
13F8B88A07B434F6008AE28D /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
1ED78706FE9D4A0611CA0C5A /* Products */ = {
isa = PBXGroup;
children = (
53DF68FD067E5B5A0090B5B0 /* PSMTabBarControl.framework */,
);
name = Products;
sourceTree = "<group>";
};
2E58F364FFB232C311CA0CBA /* Frameworks */ = {
isa = PBXGroup;
children = (
13F8B6FD07B43410008AE28D /* Linked Frameworks */,
13F8B70407B43425008AE28D /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
32DBCF9E0370C38000C91783 /* Palette */ = {
isa = PBXGroup;
children = (
54D33B2406778DD400C9C163 /* Undo Support */,
54D33B2506778DF000C9C163 /* Classes */,
32DBCF9F0370C38200C91783 /* Other Sources */,
131E8FE8067F80F40006E0CE /* Resources */,
0259C583FE90428111CA0C5A /* palette.table */,
);
name = Palette;
sourceTree = "<group>";
};
32DBCF9F0370C38200C91783 /* Other Sources */ = {
isa = PBXGroup;
children = (
32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */,
);
name = "Other Sources";
sourceTree = "<group>";
};
54D33B2406778DD400C9C163 /* Undo Support */ = {
isa = PBXGroup;
children = (
54D33B2806778E3300C9C163 /* PSMTabBarControl.ibclassdescription */,
);
name = "Undo Support";
sourceTree = "<group>";
};
54D33B2506778DF000C9C163 /* Classes */ = {
isa = PBXGroup;
children = (
0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */,
0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */,
0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */,
0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */,
);
name = Classes;
sourceTree = "<group>";
};
54D33B2C06778E4400C9C163 /* Framework */ = {
isa = PBXGroup;
children = (
90AD234D21A969C100CEF036 /* PSMMojaveTabStyle.h */,
90AD234E21A969C100CEF036 /* PSMMojaveTabStyle.m */,
0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */,
0259C576FE90428111CA0C5A /* PSMTabBarControl.m */,
A251BE830959A1B90058BC7F /* PSMTabBarCell.h */,
A251BE840959A1B90058BC7F /* PSMTabBarCell.m */,
A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */,
A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */,
A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */,
A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */,
A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */,
52FAFCD11C30F4DF00C6E613 /* PSMYosemiteTabStyle.h */,
52FAFCD21C30F4DF00C6E613 /* PSMYosemiteTabStyle.m */,
A268EA5F09A9831800E082AA /* PSMRolloverButton.h */,
A268EA6009A9831800E082AA /* PSMRolloverButton.m */,
A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */,
A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */,
A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */,
A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */,
A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */,
A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */,
A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */,
A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */,
);
name = Framework;
sourceTree = "<group>";
};
A246FADE0A2BD446005BDF7B /* Documentation */ = {
isa = PBXGroup;
children = (
A246FB040A2BD6F9005BDF7B /* PSMTabBarControlDoc.html */,
);
name = Documentation;
sourceTree = "<group>";
};
A251BE590959A0550058BC7F /* Demo App */ = {
isa = PBXGroup;
children = (
A251BE890959A1EA0058BC7F /* AppController.h */,
A251BE8A0959A1EA0058BC7F /* AppController.m */,
A2A711BD09E5BF0500D0089B /* WindowController.h */,
A2A711BE09E5BF0500D0089B /* WindowController.m */,
A251BE8B0959A1EA0058BC7F /* FakeModel.h */,
A251BE8C0959A1EA0058BC7F /* FakeModel.m */,
A251BE8D0959A1EA0058BC7F /* main.m */,
);
name = "Demo App";
sourceTree = "<group>";
};
A251BE8E0959A21A0058BC7F /* Images */ = {
isa = PBXGroup;
children = (
A2C0D99309AF870000ED379C /* pi.png */,
A2072B5C09AC1FA500304BCB /* Warning.png */,
A2072A2409ABD88600304BCB /* Folder.tif */,
A2072A2509ABD88600304BCB /* Globe.tiff */,
A268E7F809A9822900E082AA /* AquaTabNew.png */,
A268E7F909A9822900E082AA /* AquaTabNewPressed.png */,
A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */,
A268E7FB09A9822900E082AA /* TabNewMetal.png */,
523897F115BDA9AC00498A53 /* TabNewMetal@2x.png */,
A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */,
523897F215BDA9AC00498A53 /* TabNewMetalPressed@2x.png */,
A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */,
523897F315BDA9AC00498A53 /* TabNewMetalRollover@2x.png */,
A269361009A778770006911E /* 32x32_log.tiff */,
A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */,
A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */,
A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */,
A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */,
A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */,
A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */,
A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */,
A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */,
A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */,
A251BE8F0959A23A0058BC7F /* 32x32cancel.png */,
52C268CE15BDB72B0012FECA /* overflowImage.png */,
52C0B9B215BDB7A9000C268F /* overflowImage@2x.png */,
52C268CF15BDB72B0012FECA /* overflowImagePressed.png */,
52C0B9B315BDB7A9000C268F /* overflowImagePressed@2x.png */,
52A57C0C15BBA230003EC59C /* TabClose_Front.png */,
523897F015BDA9AC00498A53 /* TabClose_Front@2x.png */,
52A57C0D15BBA230003EC59C /* TabClose_Front_Pressed.png */,
523897EE15BDA9AC00498A53 /* TabClose_Front_Pressed@2x.png */,
52A57C0E15BBA230003EC59C /* TabClose_Front_Rollover.png */,
523897EF15BDA9AC00498A53 /* TabClose_Front_Rollover@2x.png */,
52FAFCCD1C30F4B500C6E613 /* TabNewYosemite.png */,
52FAFCCE1C30F4B500C6E613 /* TabNewYosemite@2x.png */,
);
name = Images;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
53DF68F8067E5B5A0090B5B0 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
546DEAF2067F630E0098DCC4 /* PSMTabBarControl.h in Headers */,
A251BE850959A1B90058BC7F /* PSMOverflowPopUpButton.h in Headers */,
A251BE870959A1B90058BC7F /* PSMTabBarCell.h in Headers */,
52FAFCD31C30F4DF00C6E613 /* PSMYosemiteTabStyle.h in Headers */,
A2D32EDC09A634C900EC8662 /* PSMTabStyle.h in Headers */,
A2D32F0009A63D7A00EC8662 /* PSMMetalTabStyle.h in Headers */,
A268EA6209A9831800E082AA /* PSMRolloverButton.h in Headers */,
A2129BB209AEB58F00724E6C /* PSMProgressIndicator.h in Headers */,
A2082A9009EAEB34009AC8BE /* PSMTabDragAssistant.h in Headers */,
A2D98B0A0A2B432C0064C6F8 /* PSMUnifiedTabStyle.h in Headers */,
A2D98B120A2B43FA0064C6F8 /* NSBezierPath_AMShading.h in Headers */,
90AD234F21A969C100CEF036 /* PSMMojaveTabStyle.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */ = {
isa = PBXNativeTarget;
buildConfigurationList = C056397F08A954F8003078D8 /* Build configuration list for PBXNativeTarget "PSMTabBarControlFramework" */;
buildPhases = (
53DF68F8067E5B5A0090B5B0 /* Headers */,
53DF68F9067E5B5A0090B5B0 /* Resources */,
53DF68FA067E5B5A0090B5B0 /* Sources */,
53DF68FB067E5B5A0090B5B0 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = PSMTabBarControlFramework;
productName = PSMTabBarControlFramework;
productReference = 53DF68FD067E5B5A0090B5B0 /* PSMTabBarControl.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0259C573FE90428111CA0C5A /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0710;
};
buildConfigurationList = C056398B08A954F8003078D8 /* Build configuration list for PBXProject "PSMTabBarControl" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
en,
);
mainGroup = 0259C574FE90428111CA0C5A /* PSMTabBarControl */;
projectDirPath = "";
projectRoot = "";
targets = (
53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */,
53DF6901067E5B8E0090B5B0 /* All */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
53DF68F9067E5B5A0090B5B0 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A2D32EF709A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif in Resources */,
A2D32EF809A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif in Resources */,
A2D32EF909A63BF700EC8662 /* AquaTabClose_Front.tif in Resources */,
A2D32EFA09A63BF700EC8662 /* AquaTabsBackground.png in Resources */,
A2D32EFB09A63BF700EC8662 /* AquaTabsDown.png in Resources */,
A2D32EFC09A63BF700EC8662 /* AquaTabsSeparator.png in Resources */,
A2D32EFD09A63BF700EC8662 /* AquaTabsSeparatorDown.png in Resources */,
A2D3317C09A68B7500EC8662 /* AquaTabsDownGraphite.png in Resources */,
A2D3317D09A68B7500EC8662 /* AquaTabsDownNonKey.png in Resources */,
A268E80409A9822A00E082AA /* AquaTabNew.png in Resources */,
A268E80509A9822A00E082AA /* AquaTabNewPressed.png in Resources */,
A268E80609A9822A00E082AA /* AquaTabNewRollover.png in Resources */,
A268E80709A9822A00E082AA /* TabNewMetal.png in Resources */,
A268E80809A9822A00E082AA /* TabNewMetalPressed.png in Resources */,
A268E80909A9822A00E082AA /* TabNewMetalRollover.png in Resources */,
A2C0D99509AF870000ED379C /* pi.png in Resources */,
A27E47850A28EE76007BA395 /* TabIcon.tif in Resources */,
A27E47880A28EE7C007BA395 /* TabControlRep.tif in Resources */,
52A57C0F15BBA230003EC59C /* TabClose_Front.png in Resources */,
52A57C1015BBA230003EC59C /* TabClose_Front_Pressed.png in Resources */,
90DE16CC21A955EE004F0124 /* Media.xcassets in Resources */,
52A57C1115BBA230003EC59C /* TabClose_Front_Rollover.png in Resources */,
52FAFCCF1C30F4B500C6E613 /* TabNewYosemite.png in Resources */,
523897F415BDA9AC00498A53 /* TabClose_Front_Pressed@2x.png in Resources */,
523897F515BDA9AC00498A53 /* TabClose_Front_Rollover@2x.png in Resources */,
52FAFCD01C30F4B500C6E613 /* TabNewYosemite@2x.png in Resources */,
523897F615BDA9AC00498A53 /* TabClose_Front@2x.png in Resources */,
523897F715BDA9AC00498A53 /* TabNewMetal@2x.png in Resources */,
523897F815BDA9AC00498A53 /* TabNewMetalPressed@2x.png in Resources */,
523897F915BDA9AC00498A53 /* TabNewMetalRollover@2x.png in Resources */,
52C268D015BDB72B0012FECA /* overflowImage.png in Resources */,
52C268D115BDB72B0012FECA /* overflowImagePressed.png in Resources */,
52C0B9B415BDB7A9000C268F /* overflowImage@2x.png in Resources */,
52C0B9B515BDB7A9000C268F /* overflowImagePressed@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
53DF68FA067E5B5A0090B5B0 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
546DEAF1067F63070098DCC4 /* PSMTabBarControl.m in Sources */,
A251BE860959A1B90058BC7F /* PSMOverflowPopUpButton.m in Sources */,
A251BE880959A1B90058BC7F /* PSMTabBarCell.m in Sources */,
A2D32F0109A63D7A00EC8662 /* PSMMetalTabStyle.m in Sources */,
A268EA6309A9831800E082AA /* PSMRolloverButton.m in Sources */,
A2129BB309AEB58F00724E6C /* PSMProgressIndicator.m in Sources */,
90AD235021A969C100CEF036 /* PSMMojaveTabStyle.m in Sources */,
A2082A9109EAEB34009AC8BE /* PSMTabDragAssistant.m in Sources */,
52FAFCD41C30F4DF00C6E613 /* PSMYosemiteTabStyle.m in Sources */,
A2D98B0B0A2B432C0064C6F8 /* PSMUnifiedTabStyle.m in Sources */,
A2D98B130A2B43FA0064C6F8 /* NSBezierPath_AMShading.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
53DF6905067E5B930090B5B0 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */;
targetProxy = 53DF6904067E5B930090B5B0 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
0259C57EFE90428111CA0C5A /* PSMTabBarControlInspector.nib */ = {
isa = PBXVariantGroup;
children = (
0259C57FFE90428111CA0C5A /* English */,
);
name = PSMTabBarControlInspector.nib;
sourceTree = "<group>";
};
0259C580FE90428111CA0C5A /* PSMTabBarControlPalette.nib */ = {
isa = PBXVariantGroup;
children = (
0259C581FE90428111CA0C5A /* English */,
);
name = PSMTabBarControlPalette.nib;
sourceTree = "<group>";
};
8D1AC97F0486D23B00FE50C9 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
8D1AC97B0486D23100FE50C9 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
A251BEC20959BC0E0058BC7F /* MainMenu.nib */ = {
isa = PBXVariantGroup;
children = (
A251BEC30959BC0E0058BC7F /* English */,
);
name = MainMenu.nib;
sourceTree = "<group>";
};
A2A711B909E5AE1E00D0089B /* Window.nib */ = {
isa = PBXVariantGroup;
children = (
A2A711BA09E5AE1E00D0089B /* English */,
);
name = Window.nib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C056398008A954F8003078D8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
GCC_VERSION = "";
INFOPLIST_FILE = "PSMTabBarControlFramework-Info.plist";
INSTALL_PATH = "@executable_path/../Frameworks";
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = com.positivespinmedia.PSMTabBarControlFramework;
PRODUCT_NAME = PSMTabBarControl;
SYMROOT = ../build;
ZERO_LINK = NO;
};
name = Debug;
};
C056398108A954F8003078D8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
GCC_VERSION = "";
INFOPLIST_FILE = "PSMTabBarControlFramework-Info.plist";
INSTALL_PATH = "@executable_path/../Frameworks";
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = com.positivespinmedia.PSMTabBarControlFramework;
PRODUCT_NAME = PSMTabBarControl;
SYMROOT = ../build;
};
name = Release;
};
C056398808A954F8003078D8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
PRODUCT_NAME = All;
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
ZERO_LINK = YES;
};
name = Debug;
};
C056398908A954F8003078D8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
PRODUCT_NAME = All;
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
};
name = Release;
};
C056398C08A954F8003078D8 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ENABLE_TESTABILITY = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
SYMROOT = ../build;
};
name = Debug;
};
C056398D08A954F8003078D8 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
SYMROOT = ../build;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C056397F08A954F8003078D8 /* Build configuration list for PBXNativeTarget "PSMTabBarControlFramework" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C056398008A954F8003078D8 /* Debug */,
C056398108A954F8003078D8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C056398708A954F8003078D8 /* Build configuration list for PBXAggregateTarget "All" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C056398808A954F8003078D8 /* Debug */,
C056398908A954F8003078D8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C056398B08A954F8003078D8 /* Build configuration list for PBXProject "PSMTabBarControl" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C056398C08A954F8003078D8 /* Debug */,
C056398D08A954F8003078D8 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0259C573FE90428111CA0C5A /* Project object */;
}
@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>PSMTabBarControl</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>PSM1</string>
<key>CFBundleVersion</key>
<string>1.1</string>
<key>NSPrincipalClass</key>
<string>PSMTabBarControl</string>
</dict>
</plist>
@@ -1,8 +0,0 @@
//
// Prefix header for all source files of the 'PSMTabBarControl' target in the 'PSMTabBarControl' project
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#import <InterfaceBuilder/InterfaceBuilder.h>
#endif
@@ -1,186 +0,0 @@
{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf380
{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique;
\f3\fnil\fcharset77 Monaco;}
{\colortbl;\red255\green255\blue255;\red118\green15\blue80;\red0\green0\blue255;\red35\green110\blue37;
}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\f0\b\fs24 \cf0 \
PSMTabBarControl (and related classes)\
\f1\b0 developed by John Pannell, Positive Spin Media\
\
as seen in the super-cool app...\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\cf0 {{\NeXTGraphic startpage.gif \width7200 \height2820
}¬}\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural
\cf0 \
\
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 This source code and all related materials are released under the BSD license, which is explained at the end of this document, along with some other legalese. I've made my best effort to make everything bug free, but please let me know of any bugs found or suggestions you have: johnp@positivespinmedia.com.\
\
\f0\b Purpose
\f1\b0 \
\
PSMTabBarControl seeks to provide developers with a high-quality, easy to use GUI to manage an NSTabView (or subclasses) in a manner similar to Safari's tabbed browsing implementation. It attempts to add a few features as well. Here's what you get:\
\
\f0\b The look:
\f1\b0 a control/cell architecture that draws the expected tab appearance below a toolbar or similar view. Included styles work consistently in Aqua, Metal, or customized metal variations by basing fills on the window's background color. Includes drawing of a close button, and rollover states for the close button and tab cell. Also provides pop-up button and menu when tabs overflow available space, and support for individual tab progress indicators, icons, and object counters. Tabs can be drawn sized to fit the string content of the label, or uniformly sized.\
\
\f0\b The functionality:
\f1\b0 Close button removes tabs, click on a tab cell selects. Indicators start, stop, and hide if things are hooked up correctly.\
\
\f0\b Extras:
\f1\b0 Supports multi-window drag-and-drop reordering of the tabs with aqua-licious animation.\
\
\f0\b Files
\f1\b0 \
\
Your project will need the files in the "Framework" folder of the project. The actual framework packages these (and some images) up nicely for you, if desired. Please look over the "TabBarControlDemo" target of the source code project to see exactly what is needed to get everything to build. Building and playing with the demo is also a good way to get a feel for the features provided by these classes.\
\
\f0\b Usage
\f1\b0 \
\
Simply drag a custom view object from the views palette in IB, read the PSMTabBarControl class into IB, and set the view's custom class to PSMTabBarControl. Then connect the control's tabview outlet to the tab view being controlled, and make the control the delegate of the tab view. You can also connect the control's "partner view" outlet to another view that will resize in response to the hide/show behavior of the control.\
\
Alternately, you can build the Palette subproject and add the built IB palette to Interface Builder. In this case, creating and configuring an instance is as easy and drag, drop, and a few clicks. A demo movie and the built palette are available in a separate download from my website: http://www.positivespinmedia.com/dev/PSMTabBarControl.html\
\
\f2\i Please read the PSMTabBarControlDoc.html file in the documentation folder of this project. It provides an Apple-ish page describing the interface and usage of this object.
\f1\i0 \
\
\f0\b Patterns of Use
\f1\b0 \
\
There are a few random notes I can think of for usage guidelines...\
\
- You may see a line between the toolbar and the control in your app; it is part of the toolbar. In Tiger, you can eliminate the appearance of this line:\
\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\f3\fs20 \cf0 \CocoaLigature0 SInt32 MacVersion;\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\cf2 if\cf0 (Gestalt(gestaltSystemVersion, &MacVersion) == noErr)\{\
\cf2 if\cf0 (MacVersion >= \cf3 0x1040\cf0 )\{\
\cf4 // this call is Tiger only\cf0 \
[toolbar setShowsBaselineSeparator:\cf2 NO\cf0 ];\
\}\
\}\
\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\f1\fs24 \cf0 - In general, there is no reason for your app objects to communicate (outside of configuration) with the PSMTabBarControl at all. Changes made to the NSTabView instance programmatically should be directed at the NSTabView instance itself, and the control will update to reflect the changes made.\
\
- Your app might want to receive tab view delegate notifications in order to perform some actions. No problem, simply make the desired object the delegate of the PSMTabBarControl instance... it passes along all tab view notifications. Note that it uses these notifications to make changes itself - read the source code to make sure you aren't tripping over something.\
\
- The control creates bindings between each cell's progress indicator and the represented NSTabViewItem's identifier object, if it can. In my app design, I set an instance of NSObjectController as the NSTabViewItem's identifier, and then bind to the "isProcessing" key of the controller's content object. All of this can be seen in the source of the demo app...\
\
- The control can be set to hide itself when there is only a single tab, and can also be told to hide/show on demand. It can animate to appear and disappear, and will resize something to compensate for the missing window real estate. By default, it will resize the window, but you can also connect the "partnerView" outlet in IB to specify another view to resize to take up the missing space. Note that this takes some attention to sizing springs and wires to get right, and complex views may need a container view to achieve the desired effect.\
\
- The control can be configured to draw an attractive "Add Tab" button at the end of the tab cells. Unfortunately, the button is all looks and no brains - it has no idea what your app wants to do when adding a tab. If you configure your app to show the add tab button, you need to hook up the add tab button to the proper target with the proper selector. Something like this will do nicely in your app controller's awakeFromNib:\
\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\f3\fs20 \cf4 // hook up add tab button\cf0 \
[[tabBar addTabButton] setTarget:\cf2 self\cf0 ];\
[[tabBar addTabButton] setAction:\cf2 @selector\cf0 (addNewTab:)];
\f1\fs24 \
\
- The tabs have some sizing options: You can specify the minimum width, maximum width, and optimum width, as well as spcifying if the tabs should size to fit their label or not. The sizing bahavior of the tabs is as follows: If "size to fit" is specified, then tabs will be generated to fit the label, but will never exceed the specified max or min widths. Once the end of the control is reached, the overflow menu will appear as tabs are added; the last tab will squeeze in if it can, or the remaining tabs will stretch to occupy the full control. If "size to fit" is not specified, then all successive tabs will appear at the optimum width. Once the end of the control is reached, adding new tabs will cause all tabs to shrink to accomodate, until the minumum width is reached, and then the overflow menu will be used; max width is ignored in this case. Hopefully that all makes sense :-)\
\
- PSMTabBarControl will load the existing tabs from the tabView outlet at startup. However, many of the advanced features (icon display, progress indicator, object count) rely on binding to a controller that is likely not set up in IB. Solution? Nuke the existing tabs in the NSTabView and add new ones, configured the way you like. The demo app does this in the awakeFromNib: method of the app controller.\
\
- As a design choice, I elected to keep a cell object around until its tab was closed, instead of "churning" cell objects in each update cycle. Each cell keeps its NSTabViewItem as its representedObject and maintains reference that way, rather than by any index. As a result of this, drag-and-drop reordering of tabs does not change the underlying NSTabView instance at all. All that to say: don't rely on numerical indices if communicating with both the control and the tab view - the indices may not correlate if the user moved some tabs around (and remember - you shouldn't need to communicate with the control anyway :-). The Shiira Project, from which I gained much insight and inspiration from for this UI element, elected to scrap and rebuild the array of cells each time through the update cycle, and rely on indices to correlate between cells and NSTabViewItems. I felt the representedObject route was cleaner, and preferred not to churn objects.\
\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\f0\b \cf0 Improvements?
\f1\b0 \
\
Pipe up if you think of something you'd like to see; here's my current list:\
\
- "Pop-up" tabs - like pop-up folders in the finder, in case you want to drag to a destination in another tab.\
- Support for the
\f3\fs22 \CocoaLigature1 NSUnifiedTitleAndToolbarWindowMask
\f1\fs24 \CocoaLigature0 "unified" window appearance. (Help! I really searched around to try to make this work... the color pattern of the title and toolbar seem to be top secret! The new "unified" style is an excellent replication of a unified look, but isn't "built from" the unified appearance like the metal is.)\
- During multi-window drag, having a "drag window/image" that shows the represented view getting moved to the other window.\
- During multi-window drag, support for dragging out solo tabs to consolidate in another window, removing the source window in the process.\
- Support vertical as well as horizontal alignment.\
\
\f0\b Version History
\f1\b0 \
\
Version 1.3 (May 29, 2006)\
- new feature: Unified tab style, compliments of Keith Blount\
- new feature: allow multi-window drag config option (again from Keith).\
- fixed bug: Palette installation/usage instructions were wrong.\
- enhancement: exposed the
\f3\fs20 representedTabViewItems
\f1\fs24 method, which can be used to retrieve the order of the tabs as displayed in the control, since the underlying NSTabView does not get reordered during drag and drop rearrangement.\
\
Version 1.2 (April 20, 2006)\
- new feature: multi-window drag and drop support.\
- bug fixed: zombie issue with tabView:didCloseTabViewItem\
- bugs fixed: some drawing issues around the progress indicators in tabs, and the add tab button.\
- enhancement: the hide/show animation has been improved with less "flickering" of progress indicators during the hide and show.\
\
Version 1.1.2 (April 5, 2006)\
- fixed bug: tabs of non-integer width resulted in occasional anti-aliased drawing issues of dividers between tabs in the Metal style (Thanks, Kent).\
- added feature: delegate can now respond to -tabView:shouldCloseTabViewItem: and -tabView:willCloseTabViewItem:, and -tabView:didCloseTabViewItem: messages, so your app can take care of any needed setup/cleanup for these actions.\
- fixed bug: tab close buttons now show down state when pressed down.\
\
Version 1.1.1 (March 16, 2006)\
- fixed bug: Palette inspector would not reflect state of previously instantiated control. This has been fixed (Thanks, Guillaume).\
- enhancement: Overflow button now highlights when mouse down (Thanks, Kent).\
- fixed bug: when set to not close a solo tab, the close button would be hidden for the tab, but could still be closed if you clicked the tab in the right location. This has been fixed (Thanks, malcom).\
\
Version 1.1 (March 10, 2006)\
- Bound the "title" of the cell to the "label" of the source tabview item. Just in case you wanted to change the label on the tab during the running of your application.\
- PSMTabBarCell factored to support new tab "styles", or appearances in drawing. Now supported are the existing "Metal" style and a new "Aqua" style. Many thanks to David Smith, Seth Willits, and Chris Forsythe for their contributions!\
- Control can be configured to "Hide for single tab", so it doesn't appear unless there are more than a single tab view present. Features animated show/hide behavior (that can be called anytime, and is called automatically in the case that a single tab exists). The show/hide behavior can also be set up to resize either the window (default) or a selected "partner view" to compensate for the lost height of the tab bar.\
- Control can be configured for "Can close only tab" behavior. If set to NO, no close button will appear on a lone tab.\
- Cells can be set to "size to fit", or given uniform min/max/optimum sizes.\
- Added support for display of an icon and an object count, if the proper app design pattern is followed.\
- Sweet animated drag-and-drop drawing!\
- A few drawing bugs surrounding the progress indicators in cells were squished.\
- New documentation, in case you found this read me a little pithy.\
\
Version 1.0 (December 2005)\
Initial release of safari-like tab implementation.\
\
\f0\b The standard disavowal of this beautiful mess
\f1\b0 \
\
I should note that portions of this source code were inspired by the Shiira project's implementation of Safari-style tabs. While I made some different design decisions, the drawing and some other aspects are only slight modifications of their excellent work. As such, I note their copyright under their BSD licence:\
\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\f3\fs20 \cf4 Portions of this software Copyright 2004 The Shiira Project. All rights reserved.\
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural
\f1\fs24 \cf0 Check them out at: http://hmdt-web.net/shiira/\
\
This source code is provided under BSD license, the conditions of which are listed below. I hope you'll make note somewhere in your about window or ReadMe stating the sweet coding goodness of Positive Spin Media and link to the fascinating and informative website at www.positivespinmedia.com\
\
\pard\pardeftab720\sa320\ql\qnatural
\cf0 \CocoaLigature1 Copyright (c) 2005, Positive Spin Media\uc0\u8232 All rights reserved.\
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\
\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural
\ls1\ilvl0\cf0 {\listtext \'a5 }Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\
{\listtext \'a5 }Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\
{\listtext \'a5 }Neither the name of Positive Spin Media nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\
\
\pard\pardeftab720\sa320\ql\qnatural
\cf0 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\CocoaLigature0 \
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.positivespinmedia.TabBarControlDemo</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.1</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
@@ -1,301 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>PSMTabBarControl - Safari-style Tabs (Objective-C)</TITLE>
<LINK REL="stylesheet" TYPE="text/css" HREF="frameset_styles.css">
</head>
<BODY bgcolor="#ffffff">
<h1>PSMTabBarControl</h1><div class="spec_sheet_info_box"><table cellspacing="0" class="specbox">
<tr><td scope="row"><b><span style="white-space: nowrap;">Inherits from</span></b></td><td><div style="margin-bottom:1px"><a href="file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSControl.html#//apple_ref/occ/cl/NSControl" target="_top">NSControl</a> : <a href="file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSView.html#//apple_ref/occ/cl/NSView" target="_top">NSView</a> : <a href="file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSResponder.html#//apple_ref/occ/cl/NSResponder" target="_top">NSResponder</a> : <a href="file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSObject.html#//apple_ref/occ/cl/NSObject" target="_top">NSObject</a></div></td></tr>
<tr><td scope="row"><b><span style="white-space: nowrap;">Conforms to</span></b></td><td><div style="margin-bottom:1px">
<span class="content_text"><a href="file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/Foundation/ObjC_classic/Protocols/NSCoding.html#//apple_ref/occ/intf/NSCoding" target="_top">NSCoding (NSResponder)</a></span><br>
<span class="content_text"><a href="file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Reference/Foundation/ObjC_classic/Protocols/NSObjectProtocol.html#//apple_ref/occ/intf/NSObject" target="_top">NSObject (NSObject)</a></span><br>
</div></td></tr>
<tr><td scope="row"><b><span style="white-space: nowrap;">Declared in</span></b></td><td><div style="margin-bottom:1px"><span class="content_text">PSMTabBarControl.h</span><br>
</div></td></tr>
</table></div><br><a name="//apple_ref/doc/uid/20000092-50187" title="Class Description"></a><a name="50187" title="Class Description"></a><h2>Class Description</h2>
<p class="spaceabove">PSMTabBarControl provides a user interface for the management of tabbed views that has an appearance similar to Apple's Safari web browser.<p>
<p>Internally, PSMTabBarControl uses a custom cell class and supporting style objects to implement its user interface.</p>
<p>Currently, this object supports "Aqua" and "Metal" tab styles to present an appearance consistent with the rest of your application. Numerous configuration options exist to customize behavior, as outlined below. PSMTabBarControl instances require a few specific connections with other application objects to perform properly at runtime:</p>
<ul>
<li><b>The control's "tabView" outlet must be connected to the desired NSTabView instance in Interface Builder, or set programmatically with the setTabView: method.</b></li>
<li><b>The "delegate" outlet of the NSTabView being controlled must be connected to the instance of PSMTabBarControl, either programmatically or in IB.</b></li>
<li>Optionally, you may connect the control's "partnerView" outlet to a view that will be resized to compensate when PSMTabBarControl changes size due to hide/show behavior. If no connection is made, PSMTabBarControl will resize the window in response to hide/show messages.</li>
</ul>
<p>A PSMTabBarControl instance should occupy the width of the window, and should be precisely 22 pixels in height. It should be resizable in width, but not height. It can be placed at the top or botton of the window (or anywhere in between, if desired).</p>
<p>Outside of configuring it, your application should have little interaction with this class. The presented tabs will change in conjunction with changes your application makes in the NSTabView being controlled.</p>
<h2>A Usage Pattern</h2>
<p class="spaceabove">PSMTabBarControl becomes even more powerful if your application design matches an expected pattern: the control attempts to bind a number of tab attributes to the NSTabViewItem's identifier object if possible. These visible attributes include a progress indicator, an icon, and an object counter. Additionally, the control binds each tab's title to the label of the represented NSTabViewItem.<p>
<p>Taking advantage of these features requires no glue code on your part, but it does require providing a particular object graph. Here's the basics...</p>
<ul><li>For each tab that is created, your application should have a model object that keeps the state of model attributes: isProcessing (a BOOL), objectCount (an int), and icon (an NSImage). You can pick and choose any number of these to support, or none, at your option.
<li>Your application should create an NSObjectController to control your model (the model object is the "content" of the NSObjectController instance).
<li>When you create new tabs (via the NSTabView interface), you should set the object controller instance to be the identifier object of the newly created NSTabViewItem object.</ul>
<p>The demo application included with this project illustrates a very quick way to accomplish these goals. If this pattern is followed, PSMTabBarControl will take care of the rest.</p>
<h2>Methods by Task</h2>
<h3 class="tight">Setting needed connections</h3>
<dl class="termdef"> <dt><code><a href="#addTabButton">&#8211;&#xA0;setTabView:</a></code></dt><dd><p>Specifies the instance of NSTabView to be controlled.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#tabView">&#8211;&#xA0;tabView</a></code></dt><dd><p>Returns the instance of NSTabView being controlled.</p></dd></dl>
<h3 class="tight">Setting optional connections</h3>
<dl class="termdef"> <dt><code><a href="#setPartnerView">&#8211;&#xA0;setPartnerView:</a></code></dt><dd><p>Specifies a view that will resize to compensate for control size changes in response to hide and show messages.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#partnerView">&#8211;&#xA0;partnerView</a></code></dt><dd><p>Returns the instance of a view that will resize to compensate for control size changes in response to hide and show messages.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setDelegate">&#8211;&#xA0;setDelegate:</a></code></dt><dd><p>Specifies an object that will receive delegate messages as passed through from the NSTabView instance.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#delegate">&#8211;&#xA0;delegate:</a></code></dt><dd><p>Returns the specified delegate object.</p></dd></dl>
<h3 class="tight">Control configuration</h3>
<dl class="termdef"> <dt><code><a href="#canCloseOnlyTab">&#8211;&#xA0;canCloseOnlyTab</a></code></dt><dd><p>Returns YES if the user is allowed to close a tab when it is the only tab left, NO otherwise.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setCanCloseOnlyTab">&#8211;&#xA0;setCanCloseOnlyTab:</a></code></dt><dd><p>Controls whether the receiver will present a close button for a single tab in a tab bar. </p></dd></dl>
<dl class="termdef"> <dt><code><a href="#styleName">&#8211;&#xA0;styleName</a></code></dt><dd><p>Returns the name of the current drawing style. "Aqua", "Metal", and "Unified" are the currently supported options.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setStyleNamed">&#8211;&#xA0;setStyleNamed:</a></code></dt><dd><p>Specifies the style in which the tabs and control are drawn. "Aqua", "Metal", and "Unified" are the currently supported options. </p></dd></dl>
<dl class="termdef"> <dt><code><a href="#hideForSingleTab">&#8211;&#xA0;hideForSingleTab</a></code></dt><dd><p>Returns YES if the control will hide if there is only one tab left, NO otherwise.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setHideForSingleTab">&#8211;&#xA0;setHideForSingleTab:</a></code></dt><dd><p>Controls whether the receiver will hide when the user closes all but a single tab in a tab bar. </p></dd></dl>
<dl class="termdef"> <dt><code><a href="#showAddTabButton">&#8211;&#xA0;showAddTabButton</a></code></dt><dd><p>Returns YES if the control will display a small "add tab" button at the rightmost end of the tabs, NO otherwise.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setShowAddTabButton">&#8211;&#xA0;setShowAddTabButton:</a></code></dt><dd><p>Controls whether the receiver will will display a small "add tab" button at the rightmost end of the tabs. </p></dd></dl>
<dl class="termdef"> <dt><code><a href="#cellMinWidth">&#8211;&#xA0;cellMinWidth</a></code></dt><dd><p>Returns the minimum width (in pixels) that a tab will be allowed to occupy.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setCellMinWidth">&#8211;&#xA0;setCellMinWidth:</a></code></dt><dd><p>Specifies the maximum width (in pixels) that a tab will be allowed to occupy.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#cellMaxWidth">&#8211;&#xA0;cellMaxWidth</a></code></dt><dd><p>Returns the maximum width (in pixels) that a tab will be allowed to occupy.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setCellMaxWidth">&#8211;&#xA0;setCellMaxWidth:</a></code></dt><dd><p>Specifies the maximum width (in pixels) that a tab will be allowed to occupy.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#cellOptimumWidth">&#8211;&#xA0;cellOptimumWidth</a></code></dt><dd><p>Returns the default width (in pixels) that a tab will be allowed to occupy when tabs are drawn with uniform size.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setCellMaxWidth">&#8211;&#xA0;setCellMaxWidth:</a></code></dt><dd><p>Specifies the default width (in pixels) that a tab will be allowed to occupy when tabs are drawn with uniform size.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#sizeCellsToFit">&#8211;&#xA0;sizeCellsToFit</a></code></dt><dd><p>Returns YES if the control will make the tabs sized to fit the content of the tab, NO otherwise.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setSizeCellsToFit">&#8211;&#xA0;setSizeCellsToFit:</a></code></dt><dd><p>Controls whether the receiver will make the tabs sized to fit the content of the tab.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#allowsDragBetweenWindows">&#8211;&#xA0;allowsDragBetweenWindows</a></code></dt><dd><p>Returns YES if the control allows a user to drag a tab to another instance of this control, NO otherwise.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#setAllowsDragBetweenWindows">&#8211;&#xA0;setAllowsDragBetweenWindows:</a></code></dt><dd><p>Controls whether the receiver will allow a user to drag a tab to another instance of this control.</p></dd></dl>
<h3 class="tight">Internal UI components</h3>
<dl class="termdef"> <dt><code><a href="#addTabButton">&#8211;&#xA0;addTabButton</a></code></dt><dd><p>Returns an instance of an NSButton subclass that is used to present the "add tab" button. If "showAddTabButton" is YES, developers must use this method to access the button and specify a target and action for the button.</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#overflowPopUpButton">&#8211;&#xA0;overflowPopUpButton</a></code></dt><dd><p>Returns an instance of an NSPopUpButton subclass that is used to present the overflow menu (which shows when there are more tabs than can fit across the control).</p></dd></dl>
<dl class="termdef"> <dt><code><a href="#representedTabViewItems">&#8211;&#xA0;representedTabViewItems</a></code></dt><dd><p>Returns an array of the NSTabViewItems represented by the tabs in the control. Useful if you want to archive the order of the tabs between runs of your program.</p></dd></dl>
<h3 class="tight">Visibility</h3>
<dl class="termdef"> <dt><code><a href="#hideTabBar">&#8211;&#xA0;hideTabBar:animate:</a></code></dt><dd><p>If desired, obejcts can tell the tab bar to hide (reduce in size to a single pixel line spanning the window) or show, and optionally whether to animate this effect or not.</p></dd></dl>
<h2>Instance Methods</h2>
<a name="addTabButton"></a><h3 class="tight">addTabButton</h3>
<p class="spaceabove">Returns an instance of an NSButton subclass that is used to present the "add tab" button. If "showAddTabButton" is YES, developers must use this method to access the button and specify a target and action for the button.</p><p class="spaceabovemethod">- (PSMRolloverButton *)addTabButton;</p>
<h5 class="tight">Discussion</h5><p> If you have configured the control to show the add tab button, you must use this method to access the button and set the target and action for it. Example:</p> <code>[[tabBar addTabButton] setTarget:self];<br>
[[tabBar addTabButton] setAction:@selector(addNewTab:)];</code> </p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setShowAddTabButton">&#8211;&#xA0;setShowAddTabButton:</a></code><li><li class="availability"> <code><a href="#showAddTabButton">&#8211;&#xA0;showAddTabButton</a></code><li></ul>
<a name="allowsDragBetweenWindows"></a><h3 class="tight">allowsDragBetweenWindows</h3>
<p class="spaceabove">Returns <code>YES</code> if the control allows a user to drag a tab to another instance of this control, NO otherwise.</p><p class="spaceabovemethod">- (BOOL)allowsDragBetweenWindows</p>
<h5 class="tight">Discussion</h5><p>The default is <code>YES</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setAllowsDragBetweenWindows">&#8211;&#xA0;setAllowsDragBetweenWindows:</a></code><li></ul>
<a name="canCloseOnlyTab"></a><h3 class="tight">canCloseOnlyTab</h3>
<p class="spaceabove">Returns <code>YES</code> if the receiver has been configured to allow users to close a single remaining tab.</p><p class="spaceabovemethod">- (BOOL)canCloseOnlyTab</p>
<h5 class="tight">Discussion</h5><p>The default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setCanCloseOnlyTab">&#8211;&#xA0;setCanCloseOnlyTab:</a></code><li></ul>
<a name="cellMaxWidth"></a><h3 class="tight">cellMaxWidth</h3>
<p class="spaceabove">Returns the maximum width (in pixels) that a tab will be allowed to occupy.</p><p class="spaceabovemethod">- (int)cellMaxWidth</p>
<h5 class="tight">Discussion</h5><p>The cellMaxWidth value applies to both uniformly sized tabs, and tabs that are sized to fit. No tab will be drawn wider than the specified value.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setCellMaxWidth">&#8211;&#xA0;setCellMaxWidth:</a></code><li><li class="availability"> <code><a href="#cellMinWidth">&#8211;&#xA0;cellMinWidth</a></code><li class="availability"> <code><a href="#cellOptimumWidth">&#8211;&#xA0;cellOptimumWidth</a></code><li></ul>
<a name="cellMinWidth"></a><h3 class="tight">cellMinWidth</h3>
<p class="spaceabove">Returns the minimum width (in pixels) that a tab will be allowed to occupy.</p><p class="spaceabovemethod">- (int)cellMinWidth</p>
<h5 class="tight">Discussion</h5><p>The cellMinWidth value applies only to uniformly sized tabs. No tab will be drawn smaller than the specified value. Size-to-fit tabs ignore this value, and are made just small enough to fit their content.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setCellMinWidth">&#8211;&#xA0;setCellMinWidth:</a></code><li><li class="availability"> <code><a href="#cellMaxWidth">&#8211;&#xA0;cellMaxWidth</a></code><li class="availability"> <code><a href="#cellOptimumWidth">&#8211;&#xA0;cellOptimumWidth</a></code><li></ul>
<a name="cellOptimumWidth"></a><h3 class="tight">cellOptimumWidth</h3>
<p class="spaceabove">Returns the width (in pixels) that a tab will be made to occupy if the tabs are uniformly sized.</p><p class="spaceabovemethod">- (int)cellOptimumWidth</p>
<h5 class="tight">Discussion</h5><p>The cellOptimumWidth value applies only to uniformly sized tabs. All tabs will be drawn at the specified value. Size-to-fit tabs ignore this value, and are made just small enough to fit their content.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setCellOptimumWidth">&#8211;&#xA0;setCellOptimumWidth:</a></code><li><li class="availability"> <code><a href="#cellMaxWidth">&#8211;&#xA0;cellMaxWidth</a></code><li class="availability"> <code><a href="#cellMinWidth">&#8211;&#xA0;cellMinWidth</a></code><li></ul>
<a name="delegate"></a><h3 class="tight">delegate</h3>
<p class="spaceabove">Returns the object that will be sent passed-through NSTabView delegate messages.</p><p class="spaceabovemethod">- (id)delegate</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setDelegate">&#8211;&#xA0;setDelegate:</a></code><li></ul>
<a name="hideForSingleTab"></a><h3 class="tight">hideForSingleTab</h3>
<p class="spaceabove">Returns <code>YES</code> if the receiver has been configured to hide if there is a single remaining tab.</p><p class="spaceabovemethod">- (BOOL)hideForSingleTab</p>
<h5 class="tight">Discussion</h5><p>The default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setHideForSingleTab">&#8211;&#xA0;setHideForSingleTab:</a></code><li></ul>
<a name="hideTabBar"></a><h3 class="tight">hideTabBar:animate:</h3>
<p class="spaceabove"><p>If desired, obejcts can tell the tab bar to hide (reduce in size to a single pixel line spanning the window) or show, and optionally whether to animate this effect or not.</p></p><p class="spaceabovemethod">- (void)hideTabBar:(BOOL)hide animate:(BOOL)animate</p>
<h5 class="tight">Discussion</h5><p> If <i>hide</i> is <code>YES</code> the control will shrink to a single pixel line spanning the window; otherwise the control will expand to its normal appearance. If <i>animate</i> is <code>YES</code>, the shrinking and expanding will happen in a visible animation; otherwise the transition will be instant. There is no effect if the control is already in the specified state.</p>
<a name="overflowPopUpButton"></a><h3 class="tight">overflowPopUpButton</h3>
<p class="spaceabove">Returns an instance of an NSPopUpButton subclass that is used to present the overflow menu. </p><p class="spaceabovemethod">- (PSMOverflowPopUpButton *)overflowPopUpButton;</p>
<h5 class="tight">Discussion</h5><p> This method could be used to modify the button or menu if desired.</p>
<a name="partnerView"></a><h3 class="tight">partnerView</h3>
<p class="spaceabove">Returns the object that will be resized to compensate for the changing size of the control during hide/show behavior.</p><p class="spaceabovemethod">- (id)partnerView</p>
<h5 class="tight">Discussion</h5><p> If a partnerView has not been specified, the window will be resized during hide/show.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setPartnerView">&#8211;&#xA0;setPartnerView:</a></code><li></ul>
<a name="representedTabViewItems"></a><h3 class="tight">representedTabViewItems</h3>
<p class="spaceabove">Returns an array of NSTabViewItems, ordered according to the display order of the tabs in the control. </p><p class="spaceabovemethod">- (NSMutableArray *)representedTabViewItems;</p>
<h5 class="tight">Discussion</h5><p> This method could be used archive the order of the tabs between application runs. When the user reorders tabs via drag and drop, the represented NSTabView does <i>not</i> change order.</p>
<a name="setAllowsDragBetweenWindows"></a><h3 class="tight">setAllowsDragBetweenWindows</h3>
<p class="spaceabove">If set to <code>YES</code>, the receiver is configured to allow users to drag a tab to an instance of PSMTabBarControl in another window.</p><p class="spaceabovemethod">- (void)setAllowsDragBetweenWindows:(BOOL)value</p>
<h5 class="tight">Discussion</h5><p>The default is <code>YES</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#allowsDragBetweenWindows">&#8211;&#xA0;allowsDragBetweenWindows:</a></code><li></ul>
<a name="setCanCloseOnlyTab"></a><h3 class="tight">setCanCloseOnlyTab:</h3>
<p class="spaceabove">If set to <code>YES</code>, the receiver is configured to allow users to close a single remaining tab.</p><p class="spaceabovemethod">- (void)setCanCloseOnlyTab:(BOOL)value</p>
<h5 class="tight">Discussion</h5><p>The default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#canCloseOnlyTab">&#8211;&#xA0;canCloseOnlyTab:</a></code><li></ul>
<a name="setCellMaxWidth"></a><h3 class="tight">setCellMaxWidth:</h3>
<p class="spaceabove">Specifies the maximum width (in pixels) that a tab will be allowed to occupy.</p><p class="spaceabovemethod">- (void)setCellMaxWidth:(int)value</p>
<h5 class="tight">Discussion</h5><p> No tab will be drawn any wider than the specified value.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#cellMaxWidth">&#8211;&#xA0;cellMaxWidth</a></code><li></ul>
<a name="setCellMinWidth"></a><h3 class="tight">setCellMinWidth:</h3>
<p class="spaceabove">Specifies the minimum width (in pixels) that a tab will be allowed to occupy.</p><p class="spaceabovemethod">- (void)setCellMinWidth:(int)value</p>
<h5 class="tight">Discussion</h5><p> No tab will be drawn any smaller than the specified value. This value is ignored when drawing in size-to-fit; tabs are made just small enough to fit their content.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#cellMinWidth">&#8211;&#xA0;cellMinWidth</a></code><li></ul>
<a name="setCellOptimumWidth"></a><h3 class="tight">setCellOptimumWidth:</h3>
<p class="spaceabove">Specifies the width (in pixels) that a tab will occupy when tabs are uniformly sized.</p><p class="spaceabovemethod">- (void)setCellOptimumWidth:(int)value</p>
<h5 class="tight">Discussion</h5><p> This value is ignored when drawing in size-to-fit; tabs are made just small enough to fit their content.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#cellOptimumWidth">&#8211;&#xA0;cellOptimumWidth</a></code><li></ul>
<a name="setDelegate"></a><h3 class="tight">setDelegate:</h3>
<p class="spaceabove">Specifies an object that will receive delegate messages as passed through from the NSTabView instance.</p><p class="spaceabovemethod">- (void)setDelegate:(id)object</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#delegate">&#8211;&#xA0;delegate:</a></code><li></ul>
<a name="setHideForSingleTab"></a><h3 class="tight">setHideForSingleTab:</h3>
<p class="spaceabove">If set to <code>YES</code>, the receiver is configured to hide when there is a single remaining tab.</p><p class="spaceabovemethod">- (void)setHideForSingleTab:(BOOL)value</p>
<h5 class="tight">Discussion</h5><p>The default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#hideForSingleTab">&#8211;&#xA0;hideForSingleTab</a></code><li></ul>
<a name="setPartnerView"></a><h3 class="tight">setPartnerView:</h3>
<p class="spaceabove">Specifies a view that will resize to compensate for control size changes in response to hide and show messages.</p><p class="spaceabovemethod">- (void)setPartnerView:(id)view</p>
<h5 class="tight">Discussion</h5><p>if <i>nil</i>, the control will resize the window in response to hide/show messages.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#partnerView">&#8211;&#xA0;partnerView</a></code><li></ul>
<a name="setStyleNamed"></a><h3 class="tight">setStyleNamed:</h3>
<p class="spaceabove">Specifies the style in which the tabs and control are drawn. </p><p class="spaceabovemethod">- (void)setStyleNamed:(NSString *)name</p>
<h5 class="tight">Discussion</h5><p>"Aqua" and "Metal" are the currently supported options.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#styleName">&#8211;&#xA0;styleName</a></code><li></ul>
<a name="setShowAddTabButton"></a><h3 class="tight">setShowAddTabButton:</h3>
<p class="spaceabove">Controls whether the receiver will will display a small "add tab" button at the rightmost end of the tabs. </p><p class="spaceabovemethod">- (void)setShowAddTabButton:(BOOL)value</p>
<h5 class="tight">Discussion</h5><p>Default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#showAddTabButton">&#8211;&#xA0;showAddTabButton</a></code><li></ul>
<a name="setSizeCellsToFit"></a><h3 class="tight">setSizeCellsToFit:</h3>
<p class="spaceabove">Controls whether the receiver will make the tabs sized to fit the content of the tab. </p><p class="spaceabovemethod">- (void)setSizeCellsToFit:(BOOL)value</p>
<h5 class="tight">Discussion</h5><p>Default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#sizeCellsToFit">&#8211;&#xA0;sizeCellsToFit</a></code><li></ul>
<a name="setTabView"></a><h3 class="tight">setTabView:</h3>
<p class="spaceabove">Specifies the instance of NSTabView to be controlled. </p><p class="spaceabovemethod">- (void)setTabView:(NSTabView *)view</p>
<h5 class="tight">Discussion</h5><p>This class will not function properly without this outlet being set.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#tabView">&#8211;&#xA0;tabView</a></code><li></ul>
<a name="sizeCellsToFit"></a><h3 class="tight">sizeCellsToFit</h3>
<p class="spaceabove">Returns YES if the control will make the tabs sized to fit the content of the tab, NO otherwise.</p><p class="spaceabovemethod"- (BOOL)sizeCellsToFit</p>
<h5 class="tight">Discussion</h5><p>The default is <code>NO</code>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setSizeCellsToFit">&#8211;&#xA0;setSizeCellsToFit:</a></code><li></ul>
<a name="styleName"></a><h3 class="tight">styleName:</h3>
<p class="spaceabove">Returns the name of the current drawing style. </p><p class="spaceabovemethod">- (NSString *)styleName</p>
<h5 class="tight">Discussion</h5><p>"Aqua" and "Metal" are the currently supported options.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setStyleNamed">&#8211;&#xA0;setStyleNamed:</a></code><li></ul>
<a name="tabView"></a><h3 class="tight">tabView:</h3>
<p class="spaceabove">Returns the instance of NSTabView being controlled. </p><p class="spaceabovemethod">- (NSTabView *)tabView</p>
<h5 class="tight">Discussion</h5><p>This class will not function properly if this object is <i>nil</i>.</p>
<h5 class="tight">See Also</h5><ul class="availability">
<li class="availability"> <code><a href="#setTabView">&#8211;&#xA0;setTabView</a></code><li></ul>
<h2>Delegate Methods</h2>
<p class="spaceabove">You application controller can keep track of activity from the tab view and the user via the following delegate methods.<p>
<a name="shouldCloseTabViewItem"></a><h3 class="tight">tabView:shouldCloseTabViewItem:</h3>
<p class="spaceabove">Sent when a user clicks the close button on a tab. </p><p class="spaceabovemethod">- (BOOL)tabView:(NSTabView *)tabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem</p>
<h5 class="tight">Discussion</h5><p>If you return <code>NO</code>, the tab will not be closed. Please make sure to alert the user as to why with a sheet or dialog.</p>
<a name="willCloseTabViewItem"></a><h3 class="tight">tabView:willCloseTabViewItem:</h3>
<p class="spaceabove">Sent when tab is about to be closed. </p><p class="spaceabovemethod">- (void)tabView:(NSTabView *)tabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem</p>
<h5 class="tight">Discussion</h5><p>This presents you with an opportunity to clean up the application objects/events/sessions represented by the tab.</p>
<a name="didCloseTabViewItem"></a><h3 class="tight">tabView:didCloseTabViewItem:</h3>
<p class="spaceabove">Sent after a tab has been closed. </p><p class="spaceabovemethod">- (void)tabView:(NSTabView *)tabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem</p>
<h5 class="tight">Discussion</h5><p>This presents you with an opportunity to clean up the application objects/events/sessions represented by the tab. Don't go trying to modify the tabViewItem - it is about to be released, and has already been removed from the tabView!</p>
<h3 class="tight">tabView:didSelectTabViewItem:</h3>
<p class="spaceabove">Informs the delegate that <i>tabView</i> has selected <i>tabViewItem</i>.</p><p class="spaceabovemethod">- (void)tabView:(NSTabView *)<i>tabView</i> didSelectTabViewItem:(NSTabViewItem *)<i>tabViewItem</i></p>
<h3 class="tight">tabView:shouldSelectTabViewItem:</h3>
<p class="spaceabove">Invoked just before <i>tabViewItem</i> in <i>tabView</i> is selected.</p><p class="spaceabovemethod">- (BOOL)tabView:(NSTabView *)<i>tabView</i> shouldSelectTabViewItem:(NSTabViewItem *)<i>tabViewItem</i></p>
<h5 class="tight">Discussion</h5><p> The delegate can return <code>NO</code> to prevent selection of specific tabs.</p>
<h3 class="tight">tabView:willSelectTabViewItem:</h3>
<p class="spaceabove">Informs the delegate that <i>tabView</i> is about to select <i>tabViewItem</i>.</p><p class="spaceabovemethod">- (void)tabView:(NSTabView *)<i>tabView</i> willSelectTabViewItem:(NSTabViewItem *)<i>tabViewItem</i></p>
<h3 class="tight">tabViewDidChangeNumberOfTabViewItems:</h3>
<p class="spaceabove">Informs the delegate that the number of tab view items in <i>tabView</i> has changed.</p><p class="spaceabovemethod">- (void)tabViewDidChangeNumberOfTabViewItems:(NSTabView *)<i>tabView</i></p>
</BODY>
</html>
@@ -1,943 +0,0 @@
/* link classes */
A:link { COLOR: #0000FF; TEXT-DECORATION: none; }
A:link:hover { COLOR: #FF6600; TEXT-DECORATION: underline; }
A:active { COLOR: #FF6600; TEXT-DECORATION: underline; }
/* apple.com site does not explicitly define visited link properties, but we do here */
A:visited { COLOR: #0000AA; TEXT-DECORATION: none; }
A:visited:hover { COLOR: #FF6600; TEXT-DECORATION: underline; }
/* used to convert otherCodeCharacters to code, thus saving character space in HTML for smaller file sizes */
tt {
FONT-SIZE: 11px; FONT-FAMILY: monaco, courier, monospace; }
/* redefine preformated text and code blocks */
PRE {
FONT-SIZE: 11px; FONT-FAMILY: monaco, courier, monospace; margin-top: 5px; margin-bottom: 10px;}
CODE {
FONT-SIZE: 11px; FONT-FAMILY: monaco, courier, monospace; }
/* JavaScript toc frame */
.jtoc_closed { background-color: #e9e9e9; }
.jtoc_open { background-color: #FFFFFF; padding-bottom: 10px; }
.jtoc_open_top_line {border-top: 1px solid #CCC; background-color: #fff; padding-bottom: 10px;}
.jtoc_open_bottom_line {border-bottom: 1px solid #CCC; background-color: #fff; padding-bottom: 10px;}
.jtoc_open_both_lines {border-bottom: 1px solid #CCC; border-top: 1px solid #CCC; background-color: #fff; padding-bottom: 10px;}
/* frameset: toc frame */
.toc_contents_text {
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold; padding-top: 4px 0;
color: #0000FF;
}
.toc_contents_text_open {
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px;
background: #FFFFFF; color: #0000FF;
}
.low_level_text {
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 11px; padding: 4px 5px 4px 5px
color: #0000FF;
}
#toc_contents_title {
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 16px; color: #FFFFFF; font-weight: bold;
}
.toc_contents_heading {
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold;
}
/* Special TOC heading for Help books only */
.toc_contents_help_heading {
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 14px; color: #330099; font-weight: bold;
}
/* frameset: toc frame styles WEB AS. used for any document that uses the disclosure model for TOC like conceptural and procedural C documents*/
#toc {
padding: 0 0 0 0;
}
#toc p.download {
padding: 5px 10px;
margin: 0;
font-weight: normal; font-size: 11px;
}
#toc_PDFbottomborder {
padding-top: 5px;
border-bottom: 1px solid #CCC;
}
#toc h2 {
margin: 0;
padding: 10px;
font-size: 15px; font-weight: bold;
border-bottom: 0px solid;
}
#toc h3 {
margin: 6px 5px 0 10px;
font-size: 13px; font-weight: bold; color: black;
}
#toc h4 {
font-size: 11px; font-weight: bold; color: black;
margin: -5px 0px 0 14px;
}
#toc_staticbox {
padding: 0 0 0 0;
border: 1px solid #919699;
background: #e9e9e9;
}
#toc ul {
list-style: none outside;
margin-left: 20px; margin-bottom: -2px;
padding: 0px;
}
#toc ul ul{
list-style: none outside;
margin-left: 10px; margin-bottom: -2px;
padding: 0px;
}
#toc li a {
margin-left: 5px;
display: block;
padding: 0px 5px 0px 5px;
}
#toc li a.location {
font-weight: bold; color: #000;
text-decoration: none;
}
#toc li{
font-weight: normal; font-size: 11px;
padding: 0px 5px 0px 0px;
list-style-type: none; background: url(../Images/bullet.gif) no-repeat 0px .5em;
}
#toc li li a {
margin-left: 0px;
}
#toc ul ul li {
background: url(../Images/dash.gif) no-repeat 0px .6em;
}
#toc ul ul ul li {
background: url(../Images/sm_bullet.gif) no-repeat 0px .5em;
}
#toc li.open {
border-top: 1px solid #CCC; border-bottom: 1px solid #CCC; background-color: #fff;
}
#toc .open ul {
background-color: #fff;
}
li img {
margin-left: 0px;
}
/*#toc li.open { background: #FFF;}*/
/* frameset: toc frame styles WEB AS. used for any document that uses the static model for TOC topics documents*/
#topicstoc {
padding: 0px 0px 0px;
}
#topicstoc p.download {
border-bottom: 1px solid #CCC;
padding: 5px 10px;
margin: 0px;
font-weight: normal; font-size: 11px;
}
#topicstoc h2 {
margin: 0;
padding: 10px;
font-size: 15px; font-weight: bold;
border-bottom: 0px solid;
}
#topicstoc h3 {
margin: 6px 5px 0 10px;
font-size: 13px; font-weight: bold; color: black;
}
#topicstoc h4 {
font-size: 11px; font-weight: bold; color: black;
margin: 2px 0px 0px 14px;
}
#topicstoc ul {
list-style: none outside;
margin-left: 13px; margin-bottom: -2px;
padding: 0px;
}
#topicstoc ul ul{
list-style: none outside;
margin-left: 10px; margin-bottom: -2px;
padding: 0px;
}
#topicstoc li{
font-weight: normal; font-size: 12px;
padding: 0px 5px 2px 10px;
list-style-type: none; background: url(../Images/bullet.gif) no-repeat 0px .5em;
}
#topicstoc li.intro {
font-weight: normal;
padding: 0px 0px;
list-style-type: none; background: none;
}
#topicstoc li a {
display: block;
padding: 0px 5px 0px 0px;
}
#topicstoc li a.location {
font-weight: bold; color: #000;
text-decoration: none;
}
#topicstoc li.intro a {
margin-left: -5px;
display: block;
}
img.toplevel { float: left; }
/* frameset: content frame */
BODY {
margin-top: 0;
color: #000;
font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
/* frameset: H1,H2,H3,H4,H5,Head for code voice */
h1 {
margin-top: 1em;
margin-bottom: 25px;
font: bold 30px lucida grande, geneva, helvetica, arial, sans-serif;
color: #000;
}
h2 {
margin-top: 2.5em;
font-size: 24px;
color: #000;
padding-bottom: 2px; border-bottom: 1px solid black;
}
h3 {
margin-top: 2em;
margin-bottom: .5em;
font-size: 19px;
color: #000;
}
h3.tight {
margin-top: 3em;
margin-bottom: -.25em;
font-size: 19px;
color: #000;
}
h4 {
margin-top: 2em;
margin-bottom: .5em;
font-size: 15px;
color: #000;
}
h5 {
margin: 20 0 0 0;
padding: 0;
font-size: 13px;
color: #000;
}
.mach4{
margin-top: 40;
margin-bottom: 0;
padding-top: 0;
font: bold 16px lucida grande, geneva, helvetica, arial, sans-serif;
color: #000;
}
.mach5{
margin: 30 0 -9 0;
font: bold 13px lucida grande, geneva, helvetica, arial, sans-serif;
color: #000;
}
h5.tight{
margin: 1.5em 0 2px 0;
font: bold 13px lucida grande, geneva, helvetica, arial, sans-serif;
color: #000;
}
.code_head{
FONT-SIZE: 18px; FONT-FAMILY: monaco, courier, monospace; font-weight: bold;
}
p {
margin-top: 0px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
p.spaceabove {
margin-top: 13px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
p.spaceabovemethod {
font: 11px monaco, courier, monospace; margin-top: 13px; margin-bottom: 10px;
}
h3.tight + p {
margin-top: 13px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
h3.tight + p.spaceabovemethod {
font: 11px monaco, courier, monospace; margin-top: 13px; margin-bottom: 10px;
}
.content_text{
margin-top: 0px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
p.blockquote{
padding-left: 50pt;
padding-right: 50pt;
}
ul.availability {
list-style-type: none;
margin: 0 0 -10px 0;
}
.availability li {
margin: 2px 0 0 -6px;
}
/* frameset: content frame bold style for text*/
b{
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold;
}
/* Used for text that is sligtly larger than bold text like lables and captions*/
.content_text_label{
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px;
}
/* frameset: content frame italic style for text*/
i{
font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-style: italic;
}
/* Used for reference heads in ProcedualC and AppleScript Language*/
.content_ref_head{
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
font-size: 16px; font-weight: bold; margin-top: 50px; padding-bottom: 4px; border-bottom: 1px solid black
}
.content_ref_head_code{
font-family: monaco, courier, monospace;
font-size: 16px; font-weight: bold; margin-top: 50px; padding-bottom: 4px; border-bottom: 1px solid black
}
/* frameset: page title */
.page_title{
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
font-size: 34px;
font-weight: bold;
color: #000000;
padding-top: 10px;
}
/* frameset: Unordered List */
ul.spaceabove {
list-style: square outside;
margin: 0 0 0 30px;
padding: 7 0 12px 6px;
}
ul {
list-style: square outside;
margin: 0 0 0 30px;
padding: 0 0 12px 6px;
}
li {
margin-top: 7px;
}
li p {
margin-top: 8px;
}
ul ul {
list-style: circle outside;
margin: 6 0 0 30px;
padding: 0 0 12px 6px;
}
ul.3head {
list-style: square outside;
margin: 0 0 0 20px;
padding: 0 0 0px 0px;
}
/* alternate mappings for 2nd level bulleted list that are still in testing phase*/
.nested li {
list-style-image: url(../Images/openbullet.gif);
list-style-position: outside;
}
ul.nested {
list-style: none;
margin: 6 0 0 30px;
}
ol {
list-style-type: decimal;
list-style-position: outside;
margin: 0 0 0 30px;
padding: 0 0 12px 6px;
}
ol ol {
list-style-type: lower-alpha;
list-style-position: outside;
margin: 7 0 0 30px;
padding: 0 0 12px 10px;
}
ul.simple-spaceabove {
list-style-type: none;
margin: 5 0 0 20px;
}
.simple-spaceabove li {
margin-top: 1px;
}
ul.simple {
list-style-type: none;
margin: 0 0 0 30px;
}
.simple li {
margin-top: -1px;
}
dl.table-display {
clear: both;
width: auto;
margin: 0;
padding: 0px;
}
.table-display dt {
width: 8em;
float: left;
margin: 0 0 0 0;
padding: .1em;
}
/* commented backslash hack for mac-ie5 \*/
dt { clear: both; }
.table-display dd {
float: left;
width: 80%;
margin: 0 0 0 0;
padding: .1em;
display: block;
}
.clear {
clear: both;
}
dl.termdef {
margin-top: 0px;
margin-bottom: 10px; }
.termdef dt {
margin-top: 0px; }
.termdef dd {
margin-left: 15px;
margin-top: 1px;
margin-bottom: 6px; }
.termdef p{
margin-left: 15px;
margin-top: -1px;
margin-bottom: 6px; }
h3.tight + dl.termdef {
margin-top: 13px;
margin-bottom: 10px; }
/* frameset: list items */
/* Everything in a list item is wrapped in an element now. */
/* First para in a list item should be inline, others should be block. */
li>p { display: inline }
li>p+p { display: block }
/* frameset: Index styles for docs */
/* frameset: Index styles for alpah listing */
.index_alpa{
font-size: 18px; padding-bottom: 5px; margin: 25px 0 15px; border-bottom: 1px solid #91969C; }
/* frameset: Index styles for singal and page range entries */
.libindex{
font-size: 12px; padding: 0 3px; background-color: #FFFFFF; margin: 0 3px; }
/* frameset: mini navigation style (Hide/Show TOC & next/prev) */
.mini_nav_text {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
font-size: 9px;
font-weight: normal;
}
.breadcrumb {
font-family: lucida grande, geneva, helvetica, arial, sans-serif;
font-size: 10px;
font-weight: normal;
margin-left: 10px;
margin-top: 8px;
}
/* ADC header/footer mappings for Getting Started */
/* header */
#adcnavheader td {
font: 10px lucida grande, geneva, helvetica, arial, sans-serif;
}
#adcnavheader input {
margin: 0 3px 0 0;
padding: 0;
}
#adcnavheader .textpadding {
padding-top: 2px;
vertical-align: middle;
}
#adcnavheader .searchbutton {
border: 0;
}
#adcnavheader h6 {
margin: 0;
padding: 0;
font: normal 12px lucida grande, geneva, helvetica, arial, sans-serif;
color: #000;
}
#adcnavheader form {
margin: 0;
}
/* footer */
#footer td, #footer p {
font-size: 10px;
}
/* Getting Started styles */
/* font definitions */
/* keep ".gettingstarted pre, code" above ".gettingstarted h1" below otherwise,
the main h1 tag above will be used instead of".gettingstarted h1" */
.gettingstarted pre, code {
font: 11px Monaco, Courier, monospace;
}
/* Added this style since the ADC template was trying to do this with a graphic (Note: their h2
attached to the image tag is only used by search engines; their h2 does not function if the
graphic is missing).--DA */
.gettingstarted h2 {
margin: 0;
margin-bottom: 15px;
padding: 0px;
font: bold 32px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif;
color: #000;
}
.gettingstarted h3 {
margin: 0 0 5px 0;
padding: 0px;
font: bold 16px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif;
color: #000;
}
.gettingstarted p + .gettingstarted h3 {
margin-top: 20px;
}
.gettingstarted ol + .gettingstarted h3 {
margin-top: 20px;
}
.gettingstarted ul + .gettingstarted h3 {
margin-top: 20px;
}
.gettingstarted h4 {
margin: 0px;
padding: 0px;
font: bold 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif;
color: #000;
}
.gettingstarted h4 + .gettingstarted table {
margin-top: 10px;
}
.gettingstarted p {
margin-top: 0;
margin-bottom: 10px;
padding: 0;
font: 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif;
color: #000;
}
.gettingstarted th {
font-weight: bold;
text-align: left;
}
/* list definitions */
.gettingstarted ul {
font: 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif;
padding-left: 10px;
margin-top: 0;
margin-left: 10px;
margin-bottom: 10px;
list-style-type: none;
}
.gettingstarted li {
margin-top: 3px;
}
.gettingstarted ul li {
list-style: square outside;
margin: 0 0 0 30px;
padding: 0 0 4px 0;
}
.gettingstarted ul ul {
margin-left: 20px;
}
.gettingstarted ol {
font: 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif;
margin-top: 0;
margin-left: 1.5em;
margin-bottom: 10px;
padding-left: 1.5em;
}
.gettingstarted ul.inline, .gettingstarted ol.inline, .gettingstarted p.inline {
margin-top: -7px;
}
/* table styles */
caption.tablecaption {
margin-bottom: 5px;
text-align: left;
}
.sourcecodebox {
border: 1px solid #c7cfd5;
background: #f1f5f9;
margin: 20px 0;
}
div.tableholder {
margin-top: 20px;
margin-bottom: 20px;
}
p.tableholder {
margin-bottom: 7px;
font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
.graybox {
border-top: 1px solid #919699;
border-left: 1px solid #919699;
}
.graybox th {
padding: 4px 8px 4px 8px;
background: #E2E2E2;
font-size: 12px;
border-bottom: 1px solid #919699;
border-right: 1px solid #919699;
}
.graybox th p {
font-weight: bold;
margin-bottom: 0px;
}
.graybox td {
padding: 8px;
font-size: 12px;
text-align: left;
vertical-align: top;
border-bottom: 1px solid #919699;
border-right: 1px solid #919699;
}
.graybox td p {
margin-bottom: 0px;
}
.graybox td p + p {
margin-top: 5px;
}
.graybox td p + p + p {
margin-top: 5px;
}
/* footnote definitions */
.footnote h4, .footnote p {
color: #76797C;
font-size: 11px;
}
.gettingstarted .footnote {
font-size: 11px;
color: #76797C;
}
.notebox {
border: 1px solid #a1a5a9;
background-color: #f7f7f7;
margin: 20px 0;
padding: 0px 8px 1px 9px;
text-align: left;
}
.notebox p {
font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
margin-top: 7px;
margin-bottom: 0px;
}
.importantbox {
border: 1px solid #111;
background-color: #e8e8e8;
margin: 20px 0;
padding: 0px 8px 1px 9px;
text-align: left;
}
.importantbox p {
font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
margin-top: 7px;
margin-bottom: 0px;
}
.warningbox {
border: 1px solid #000;
background-color: #fff;
margin: 20px 0;
padding: 8px;
text-align: left;
}
.warningicon {
background-color: transparent;
padding-right: 10px;
float: left;
}
.warningbox p {
border-style: none;
font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
margin: -8px 0 -8px 30px;
}
div.codesample {
margin: 20px 0;
}
.codesample pre {
font-size: 11px;
font-family: monaco, courier, monospace;
margin: -1px 4px -3px 6px;
white-space: pre;
}
.codesample span {
margin-right: 8px;
float: right;
}
p.codesample {
margin-top: 20px; margin-bottom: -15px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif;
}
/* Controller Layer Bindings styles */
.class_binding_block {
}
.binding_category_block {
margin-left: 1em
}
.binding_category_name {
font-size: 24px; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-weight: bold; line-height: 35px; padding-bottom: 1px; border-top: 2px solid black
}
.binding_block {
margin-left: 2em
}
.binding_name {
font-size: 18px; font-family: monaco, courier, monospace; font-weight: 400; margin-top: 10px; margin-bottom: 12px; border-bottom: 1px solid #69f
}
.bindings_tablehead { font-size: 14px; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-weight: bold; position: relative; top: -5px; margin-left: -20px
}
.placeholder_options_block {
margin-left: 2em
}
.availabilityList {
border: none;
margin-top: 5px;
margin-bottom: 0px;
font-size: 12px;
text-align: left;
}
.availabilityItem {
margin-top: -15px;
margin-bottom: 15px;
padding-left: 78px;
}
.metadata_attributes_name {
font-size: 24px; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-weight: bold; padding-top: 5px; margin-bottom: -10px; border-top: 2px solid black
}
.metadata_attribute_name {
font-size: 18px; font-family: monaco, courier, monospace; font-weight: 400; margin-top: 10px; padding-bottom: 2px;
}
/* Spec Sheet Info Box */
/* Used in AppKit Obj-C, Appkit Java, Foundation Obj-C, and Foundation Java References */
.spec_sheet_info_box { margin-left: 1em }
/* This builds a table */
.specbox {
border-top: 1px solid #919699;
border-left: 1px solid #919699;
border-right: 1px solid #919699;
margin-bottom: 10px;
}
.specbox td {
padding: 8px;
font-size: 12px;
text-align: left;
vertical-align: top;
border-bottom: 1px solid #919699;
}
/* This alternates colors in up to six table rows (light blue for odd, white for even)*/
.specbox tr {
background: #F0F5F9;
}
.specbox tr + tr {
background: #FFFFFF;
}
.specbox tr + tr + tr {
background: #F0F5F9;
}
.specbox tr + tr + tr + tr {
background: #FFFFFF;
}
.specbox tr + tr + tr +tr + tr {
background: #F0F5F9;
}
.specbox tr + tr + tr + tr + tr + tr {
background: #FFFFFF;
}
/* informal protocol subtitling */
.protocol_subtitle {
margin-top: -25px;
margin-bottom: 25px;
font-size: 13px;
}
/* HeaderDoc headings */
.hd_tocAccess {
margin-left: 16px;
margin-top: 3px;
display: block;
font-weight: bold;
}
.hd_tocAccessSpace {
display: block;
font-size: 8px;
}
.hd_tocGroup {
margin-left: 8px;
margin-top: 5px;
display: block;
font-style: italic;
}
.hd_tocGroupSpace {
display: block;
font-size: 8px;
}
/* "Collection page" mappings */
.forums { margin-bottom: 5px;}
.forums b,
.forums a:link,
.forums a:visited { color: #017; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 11px; font-weight: bold; line-height: 13px;}
.forums a:hover { color: #00F; text-decoration: underline; font-weight: bold;}
.collection { margin-bottom: 5px;}
.collection h3,
.collection a:link,
.collection a:visited { font-size: 13px; color: #76797C; padding-bottom: 2px; border-bottom: 1px dotted #a1a5a9; margin-bottom: 0px; margin-right: 3px;}
.collection a:hover { color: #00F; text-decoration: underline; font-weight: bold;}
.collection_title { width: 100%;
background-color: #7E91A4;
padding: 15px;
padding-right: 15px;
padding-bottom: 2px;
padding-left: 15px;
}
.collection_title a:link,
.collection_title a:visited { color: #E8F3FD; }
h1.collections {
margin-top: 0px;
margin-bottom: 25px;
font: bold 30px lucida grande, geneva, helvetica, arial, sans-serif;
color: #ffffff;
text-align: center; }
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

-42
View File
@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
<!-- a subclass of IBPalette -->
<key>Class</key> <string>PSMTabBarControlPalette</string>
<!-- a nib file name -->
<key>NibFile</key> <string>PSMTabBarControlPalette</string>
<!-- a tiff file name for icon used for palette -->
<key>Icon</key> <string>TabIcon.tif</string>
<!-- Tool Tips string for the palette icon -->
<key>ToolTips</key> <string>PSMTabBarControl</string>
<!-- a list of class names exported from palette to IB -->
<key>ExportClasses</key>
<array>
<string>PSMTabBarControl</string>
<string>PSMTabBarCell</string>
<string>PSMAquaTabStyle</string>
<string>PSMMetalTabStyle</string>
<string>PSMRolloverButton</string>
<string>PSMProgressIndcator</string>
<string>PSMOverflowPopUpButton</string>
</array>
<!-- a list of image names exported from palette to IB -->
<key>ExportImages</key>
<array>
<string>TabControlRep.tif</string>
<string>TabIcon.tif</string>
</array>
<!-- a list of sound names exported from palette to IB -->
<key>ExportSounds</key>
<array>
</array>
</dict>
</plist>
@@ -1,17 +0,0 @@
//
// AppController.h
// PSMTabBarControl
//
// Created by John Pannell on 12/19/05.
// Copyright 2005 Positive Spin Media. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface AppController : NSObject {
}
- (IBAction)newWindow:(id)sender;
@end
@@ -1,30 +0,0 @@
//
// AppController.m
// TabBarControl
//
// Created by John Pannell on 12/19/05.
// Copyright 2005 Positive Spin Media. All rights reserved.
//
#import "AppController.h"
#import "WindowController.h"
@implementation AppController
- (void)awakeFromNib
{
[self newWindow:self];
[self newWindow:self];
NSRect frontFrame = [[NSApp keyWindow] frame];
frontFrame.origin.x += 400;
[[NSApp keyWindow] setFrame:frontFrame display:YES];
}
- (IBAction)newWindow:(id)sender
{
// put up a window
WindowController *newWindow = [[WindowController alloc] initWithWindowNibName:@"Window"];
[newWindow showWindow:self];
}
@end
@@ -1,34 +0,0 @@
//
// FakeModel.h
// TabBarControl
//
// Created by John Pannell on 12/19/05.
// Copyright 2005 Positive Spin Media. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface FakeModel : NSObject {
BOOL _isProcessing;
NSImage *_icon;
NSString *_iconName;
NSObjectController *controller;
int _objectCount;
}
// creation/destruction
- (id)init;
// accessors
- (BOOL)isProcessing;
- (void)setIsProcessing:(BOOL)value;
- (NSImage *)icon;
- (void)setIcon:(NSImage *)icon;
- (NSString *)iconName;
- (void)setIconName:(NSString *)iconName;
- (int)objectCount;
- (void)setObjectCount:(int)value;
- (NSObjectController *)controller;
@end
@@ -1,77 +0,0 @@
//
// FakeModel.m
// TabBarControl
//
// Created by John Pannell on 12/19/05.
// Copyright 2005 Positive Spin Media. All rights reserved.
//
#import "FakeModel.h"
@implementation FakeModel
- (id)init
{
if(self == [super init]){
_isProcessing = YES;
_icon = nil;
_iconName = nil;
_objectCount = 2;
controller = [[NSObjectController alloc] initWithContent:self];
}
return self;
}
// accessors
- (BOOL)isProcessing
{
return _isProcessing;
}
- (void)setIsProcessing:(BOOL)value
{
_isProcessing = value;
}
- (NSImage *)icon
{
return _icon;
}
- (void)setIcon:(NSImage *)icon
{
[icon retain];
[_icon release];
_icon = icon;
}
- (NSString *)iconName
{
return _iconName;
}
- (void)setIconName:(NSString *)iconName
{
[iconName retain];
[_iconName release];
_iconName = iconName;
}
- (int)objectCount
{
return _objectCount;
}
- (void)setObjectCount:(int)value
{
_objectCount = value;
}
- (NSObjectController *)controller
{
return controller;
}
@end
@@ -1,23 +0,0 @@
//
// NSBezierPath_AMShading.h
// ------------------------
//
// Created by Andreas on 2005-06-01.
// Copyright 2005 Andreas Mayer. All rights reserved.
//
// based on http://www.cocoadev.com/index.pl?GradientFill
#import <Cocoa/Cocoa.h>
@interface NSBezierPath (AMShading)
- (void)customHorizontalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor;
- (void)linearGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor;
- (void)bilinearGradientFillWithOuterColor:(NSColor *)outerColor innerColor:(NSColor *)innerColor;
@end

Some files were not shown because too many files have changed in this diff Show More