Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
  • 14 commits
  • 33 files changed
  • 0 commit comments
  • 1 contributor
Showing with 7,780 additions and 1,692 deletions.
  1. BIN  .DS_Store
  2. +0 −8 .gitignore
  3. +32 −0 AZTab/AZDefaultTab.h
  4. +339 −0 AZTab/AZDefaultTab.m
  5. +454 −0 AZTab/AZTabView.h
  6. +684 −0 AZTab/AZTabView.m
  7. +27 −0 AZTab/AZTabViewAppDelegate.h
  8. +86 −0 AZTab/AZTabViewAppDelegate.m
  9. 0  SFTabView-Info.plist → AZTabView-Info.plist
  10. +595 −0 AZTabView.xcodeproj/project.pbxproj
  11. +7 −0 AZTabView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  12. +24 −0 AZTabView.xcodeproj/project.xcworkspace/xcuserdata/localadmin.xcuserdatad/WorkspaceSettings.xcsettings
  13. +14 −0 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
  14. +91 −0 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcschemes/AZTabView.xcscheme
  15. +86 −0 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcschemes/SFTabView.xcscheme
  16. +32 −0 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcschemes/xcschememanagement.plist
  17. +34 −0 AZTabView/AZTabView-Info.plist
  18. +7 −0 AZTabView/AZTabView-Prefix.pch
  19. +17 −0 AZTabView/PAColorSwatchChooser.h
  20. +134 −0 AZTabView/PAColorSwatchChooser.m
  21. +29 −0 AZTabView/en.lproj/Credits.rtf
  22. +2 −0  AZTabView/en.lproj/InfoPlist.strings
  23. +3,626 −0 AZTabView/en.lproj/MainMenu.xib
  24. +14 −0 AZTabView/main.m
  25. 0  SFTabView_Prefix.pch → AZTabView_Prefix.pch
  26. +14 −5 Classes/SFDefaultTab.h
  27. +141 −56 Classes/SFDefaultTab.m
  28. +12 −15 Classes/SFTabView.h
  29. +208 −338 Classes/SFTabView.m
  30. +17 −7 Classes/SFTabViewAppDelegate.h
  31. +347 −13 Classes/SFTabViewAppDelegate.m
  32. +707 −932 Resources/MainMenu.xib
  33. +0 −318 SFTabView.xcodeproj/project.pbxproj
View
BIN  .DS_Store
Binary file not shown
View
8 .gitignore
@@ -1,8 +0,0 @@
-build
-Build
-whamoo.pbxuser
-whamoo.perpspectivev3
-whamoo.perspectivev3
-whamoo.mode1v3
-.DS_Store
-*.pyc
View
32 AZTab/AZDefaultTab.h
@@ -0,0 +1,32 @@
+//
+// SFDefaultTab.h
+// tabtest
+//
+// Created by Matteo Rattotti on 2/28/10.
+// Copyright 2010 www.shinyfrog.net. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <QuartzCore/QuartzCore.h>
+#import <AtoZ/AtoZ.h>
+
+@interface AZLabelLayer : CATextLayer {}
+@end
+
+//@interface AZTabObject : AtoZ
+//@property (nonatomic) NSColor *color;
+//@property (nonatomic) NSString *name;
+//@end
+
+
+
+@interface AZColorBar : CALayer
+@property (strong, nonatomic) id representedObject;
+@property (assign, nonatomic) BOOL selected;
+@end
+
+@interface AZDefaultTab : CALayer
+@property (strong, nonatomic) id representedObject;
+@property (assign, nonatomic) BOOL selected;
+@property (assign, nonatomic) BOOL highlighted;
+@end
View
339 AZTab/AZDefaultTab.m
@@ -0,0 +1,339 @@
+#import "AZDefaultTab.h"
+#import <Quartz/Quartz.h>
+#import <QuartzCore/QuartzCore.h>
+
+//static CGImageRef activeTab;
+//static CGImageRef inactiveTab;
+//@implementation AZTabObject
+//@synthesize color, name;
+//- (void) setWithDictionary:(NSDictionary *)dict; {
+// self.color = ([dict valueForKey:@"color"] ? [dict valueForKey:@"color"] : RANDOMCOLOR);
+// self.name = ([dict valueForKey:@"name"] ? [dict valueForKey:@"name"] : @"NO NAME");
+//// [self setValuesForKeysWithDictionary:dict];
+//}
+//@end
+@interface AZColorBar ()
+@property (strong, nonatomic) CAConstraintLayoutManager *layout;
+@property (strong, nonatomic) CAShapeLayer *barShapes;
+@end
+@implementation AZColorBar {
+ AZFile *_rep;
+}
+
+@synthesize representedObject = _rep, layout, selected, barShapes;
+//active, inactive, currentImage, ;
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ float wide = ([[NSScreen mainScreen]frame].size.width/ [NSColor fengshui].count);
+ NSRect u = NSMakeRect(0,self.superlayer.bounds.size.height-20,wide,20);
+ self.frame = u;
+ self.name = @"bar";
+ self.backgroundColor = cgRANDOMCOLOR;
+ }
+
+ return self;
+}
+- (void) setRepresentedObject:(id)representedObject {
+ _rep = representedObject;
+ [self makeShapes];
+}
+-(void) makeShapes {
+ barShapes = [CAShapeLayer layer];
+ barShapes.fillColor = _rep.color.CGColor;
+ barShapes.frame = self.bounds;
+ barShapes.anchorPoint = CGPointMake(1,1);
+ barShapes.position = CGPointMake(1,1);
+ barShapes.autoresizingMask = kCALayerWidthSizable;
+
+ barShapes.shadowOffset = CGSizeMake(2, -2);
+ barShapes.shadowRadius = 5.0;
+ barShapes.shadowColor = cgBLACK;
+ barShapes.shadowOpacity = 0.8;
+ barShapes.lineWidth = 3;
+ barShapes.strokeColor = cgWHITE;
+ NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:self.frame cornerRadius:5 inCorners:OSBottomLeftCorner | OSBottomRightCorner];
+ barShapes.path = [path quartzPath];
+ [self addSublayer: barShapes];
+}
+
+- (BOOL)containsPoint:(CGPoint)p { return FALSE; }
+@end
+
+
+
+
+@interface AZDefaultTab ()
+@property (strong, nonatomic) CATextLayerNoHit *label;
+@property (strong, nonatomic) CALayerNoHit *over;
+@property (strong, nonatomic) CAConstraintLayoutManager *layout;
+@property (strong, nonatomic) CAShapeLayer *silhouette;
+@end
+
+@implementation AZDefaultTab {
+ AZFile *_rep;
+ CAConstraint * maxX;
+ CAConstraint * maxY;
+ CAConstraint * superWide;
+ CAConstraint * superHigh;
+ NSArray* maxConstraints;
+}
+@synthesize selected, label, representedObject = _rep, layout, silhouette, highlighted, over;
+
+
+- (id)init { self = [super init]; if (self) {
+ layout = [CAConstraintLayoutManager layoutManager];
+ self.layoutManager = layout;
+ self.anchorPoint = CGPointMake(0, 1);
+ self.position = CGPointMake(0,self.superlayer.frame.size.height);
+ self.bounds = CGRectMake(0, 0 , 100, 40);
+ maxX = AZConstraint(kCAConstraintMaxX,@"superlayer");
+ maxY = AZConstraint(kCAConstraintMaxY,@"superlayer");
+ superWide = AZConstraint(kCAConstraintWidth,@"superlayer");
+ superHigh = AZConstraint(kCAConstraintHeight,@"superlayer");
+ maxConstraints =$array(maxX,maxY,superWide,superHigh);
+
+ [self addObserver:self forKeyPath:@"zPosition" options:0 context:nil];
+ [self addObserver:self forKeyPath:@"transform" options:0 context:nil];
+ }
+ return self;
+}
+
+
+-(void)didChangeValueForKey:(NSString *)key {
+//- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
+ if ([key isEqual:@"zPosition"]) {
+// NSLog(@"received notification of change to z position");
+ label.string = $(@"Spot:%i Z:%i", _rep.spot, (int)self.zPosition);
+ }
+// if ([key isEqual:@"zPosition"]) {
+// NSLog(@"received notification of change to transform");
+// [label setConstraints:maxConstraints];
+//// setConstraints:$array([CAConstraint maxX])];
+// }
+// else // Unrecognized keypath
+// [superlayer observeValueForKeyPath:key];
+// }
+}
+// [[NSNotificationCenter defaultCenter] addob
+// addObserverForName:@"zPosition" object:self queue:opQ usingBlock:^(NSNotification *note) {
+// label.string = self.zPosition;
+// }];
+
+
+// CAShapeLayer *gradientMask = [CAShapeLayer layer];
+// gradientMask.fillColor = cgCLEARCOLOR;
+// gradientMask.strokeColor = cgBLACK;
+// gradientMask.lineWidth = 4;
+// gradientMask.path = [path quartzPath];
+//-(void) makeTabs {
+// NSColor *c = (_rep ? _rep.color : RED.darker );
+// active = [[NSImage imageNamed:@"activeTab.png"] tintedWithColor: c];
+// [_rep.image setScalesWhenResized:YES];
+// [_rep.image setSize:NSMakeSize(self.frame.size.height, self.frame.size.height)];
+
+// [active lockFocus];
+// [_rep.image drawCenteredinRect:AGMakeRectFromSize(self.frame.size) operation:NSCompositeSourceOver fraction:1];
+// [active unlockFocus];
+// inactive = [[NSImage imageNamed:@"inactiveTab.png"] tintedWithColor: c.darker];
+// if (active) [self setContents:active]; else [self setContents:inactive];
+//}
+- (void) setRepresentedObject:(id)representedObject {
+ _rep = representedObject;
+ [self makeShapes];
+}
+
+// CALayer *customDrawn = [CALayer layer];
+// customDrawn.delegate = self;
+// customDrawn.backgroundColor = [UIColor greenColor].CGColor;
+// customDrawn.frame = CGRectMake(30, 250, 128, 40);
+// customDrawn.shadowOffset = CGSizeMake(0, 3);
+// customDrawn.shadowRadius = 5.0;
+// customDrawn.shadowColor = [UIColor blackColor].CGColor;
+// customDrawn.shadowOpacity = 0.8;
+// customDrawn.cornerRadius = 10.0;
+// customDrawn.borderColor = [UIColor blackColor].CGColor;
+// customDrawn.borderWidth = 2.0;
+// customDrawn.masksToBounds = YES;
+// [self.view.layer addSublayer:customDrawn];
+// [customDrawn setNeedsDisplay];
+- (void) makeShapes {
+
+ silhouette = [CAShapeLayer layer];
+ silhouette.fillColor = _rep.color.CGColor;
+// slice.strokeColor = cgBLACK;
+// slice.lineWidth = 3.0;
+ silhouette.shadowOffset = CGSizeMake(2, -2);
+ silhouette.shadowRadius = 5.0;
+ silhouette.shadowColor = cgBLACK;
+ silhouette.shadowOpacity = 0.8;
+// silhouette.anchorPoint = CGPointMake(.5, 1);
+ NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:5 inCorners:OSBottomLeftCorner | OSBottomRightCorner];
+ silhouette.path = [path quartzPath];
+// highlightLayer = [AZLassoLayer layer];
+// highlightLayer.fillColor = [NSColor colorWithDeviceRed:0.25f
+// green:0.25f
+// blue:0.25f
+// alpha:0.75].CGColor;
+// highlightLayer.frame = self.bounds;
+// highlightLayer.strokeColor = cgWHITE;
+// highlightLayer.lineDashPhase = 10;
+// highlightLayer.lineWidth = 4;
+// highlightLayer.hidden = YES;
+// [silhouette addSublayer:highlightLayer];// insertSublayer:highlightLayer below:shineLayer];
+ over = [CALayerNoHit layer];
+ NSImage *i = _rep.image;
+// i.scalesWhenResized = Y ES;
+ [i setSize: NSMakeSize(35,35)];
+ over.contents = i;//[i tintedWithColor:_rep.color];
+// over.bounds = NSMakeRect(0,0,35,35);
+ over.anchorPoint = CGPointMake(1,0);
+ over.position = CGPointMake(1,0);
+// over.position = NSMakePoint(self.bounds.size.width-17, 17);
+// over.contentsGravity = kCAGravityRight;
+ label = [CATextLayerNoHit layer];
+ // if ([_representedObject valueForKey:@"name"] != nil) { tabLabel.string = [_representedObject valueForKey:@"name"]; }
+
+ [label setFontSize:13.0f];
+ [label setShadowOpacity:.9f];
+ label.shadowOffset = CGSizeMake(0, -1);
+ label.shadowRadius = 1.0f;
+ label.shadowColor = CGColorCreateGenericRGB(1,1,1, 1);
+ label.foregroundColor = cgWHITE;// CGColorCreateGenericRGB(0.1,0.1,0.1, 1);
+ label.truncationMode = kCATruncationEnd;
+// label.alignmentMode = kCAAlignmentRight;
+// CAConstraint * horizontalConstraint;
+ [label setConstraints:maxConstraints];// $array(widthConstraint, verticalConstraint)];
+
+// [self addHighlightLayer];
+// [self makelabel];
+ [silhouette addSublayer:label];
+ [self addSublayer: over];
+ [self addSublayer:silhouette];
+// CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"path"];
+// anim.duration = 1.0;
+// // flip the path
+// anim.fromValue = (__bridge id)fromPath;
+// anim.toValue = (__bridge id)toPath;
+// anim.removedOnCompletion = NO;
+// anim.fillMode = kCAFillModeForwards;
+// [slice addAnimation:anim forKey:nil];
+}
+
+
+//-(NSImage*) active {
+// if (!active)
+// active = [[NSImage imageNamed:@"activeTab.png"] tintedWithColor: RANDOMCOLOR];
+// return active;
+//
+//// ([_representedObject valueForKey:@"color"] ? [_representedObject valueForKey:@"color"] :
+//}
+//-(NSImage*) inactive {
+//
+// if (!inactive)
+// inactive = [[NSImage imageNamed:@"activeTab.png"] tintedWithColor:GREY];
+// return inactive;
+//}
+// CAGradientLayer *gradientLayer = [CAGradientLayer layer];
+// gradientLayer.startPoint = CGPointMake(0.5,1.0);
+// gradientLayer.endPoint = CGPointMake(0.5,0.0);
+// gradientLayer.frame = self.bounds;
+// NSColor *r = RANDOMCOLOR;
+// gradientLayer.colors = $array(r.brighter, r.darker);
+//
+// [gradientLayer setMask:gradientMask];
+// [self addSublayer:gradientLayer];
+//
+
+
+// CGRect superS = [[self superlayer] bounds];
+// NSImage *anImage = [NSImage systemImages].randomElement;
+// NSImage *masked = [anImage maskedWithColor:GREEN];
+// [anImage setSize:NSMakeSize(64,64)];
+// self.frame = AGMakeRectFromSize(anImage.size);
+// self.contents = masked;
+// self.contentsGravity = kCAGravityCenter;
+// self.frame = self.bounds;// CGRectMake(0, 0 , NSMaxX(superS), NSMaxY(superS));
+// self.backgroundColor = CGColorCreateGenericRGB(1,0,1,1);
+// NSLog(@"%@",);
+
+
+// if(!activeTab) {
+// NSImage *tab = ;
+// activeTab = [self ];// [_representedObject valueForKeyPath:@"dictionary.active"];
+// NSImage *intab = [[NSImage imageNamed:@"inactiveTab.png"]tintedWithColor:RANDOMCOLOR];
+// inactiveTab = (id)intab;
+
+// CFStringRef path = (CFStringRef)[[NSBundle mainBundle] pathForResource:@"activeTab" ofType:@"png"];
+// CFURLRef imageURL = CFURLCreateWithFileSystemPath(nil, path, kCFURLPOSIXPathStyle, NO);
+// CGImageSourceRef imageSource = CGImageSourceCreateWithURL(imageURL, nil);
+// activeTab = CGImageSourceCreateImageAtIndex(imageSource, 0, nil);
+// CFRelease(imageURL); CFRelease(imageSource);
+
+// path = (CFStringRef)[[NSBundle mainBundle] pathForResource:@"inactiveTab" ofType:@"png"];
+// imageURL = CFURLCreateWithFileSystemPath(nil, path, kCFURLPOSIXPathStyle, NO);
+// imageSource = CGImageSourceCreateWithURL(imageURL, nil);
+// inactiveTab = CGImageSourceCreateImageAtIndex(imageSource, 0, nil);
+// CFRelease(imageURL); CFRelease(imageSource);
+// }
+
+// [self setContents: (id)inactiveTab];
+//-(void) makelabel {
+// [label setConstraints:maxConstraints];
+// CAConstraint *constraint = [CAConstraint constraintWithAttribute:kCAConstraintMaxX
+// relativeTo:@"superlayer"
+// attribute:kCAConstraintMaxX];
+// [label addConstraint:constraint];
+// constraint = [CAConstraint constraintWithAttribute:kCAConstraintMinY
+// relativeTo:@"superlayer"
+// attribute:kCAConstraintMinY
+// offset:2.0];
+// [label addConstraint:constraint];
+// constraint = [CAConstraint constraintWithAttribute:kCAConstraintMaxX
+// relativeTo:@"superlayer"
+// attribute:kCAConstraintMaxX
+// offset:-20.0];
+// [label addConstraint:constraint];
+// constraint = [CAConstraint constraintWithAttribute:kCAConstraintMinX
+// relativeTo:@"superlayer"
+// attribute:kCAConstraintMinX
+// offset:20.0];
+// [label addConstraint:constraint];
+// [label setFont:@"LucidaGrande"];
+// [silhouette addSublayer:label];
+// return alabel;
+//}
+
+- (void) setSelected:(BOOL)sel {
+// NSLog(@"%@", self.propertiesPlease);
+ selected = sel;
+// silhouette.anchorPoint = CGPointMake(1.0f, 1.0f);
+ [CATransaction begin];
+// [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
+ [CATransaction setAnimationDuration:.1];
+ [CATransaction setAnimationTimingFunction:
+ [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
+ CATransform3D move;
+ if (sel){
+// NSRect g = self.bounds;
+// g.size.height += 300;
+// NSPoint sd = self.position;
+// sd.y -= 300;
+// self.position = sd;
+// self.bounds = g;
+// [self setBounds:g];
+ CATransform3D transform = CATransform3DMakeScale(1.0f, 2.0f , 1.0f);
+ CATransform3D moveit = CATransform3DMakeTranslation(0, -40, 0);
+ move = CATransform3DConcat( transform, moveit);
+//// [self setContents:(selected ? self.active : self.inactive)];
+ } else {
+ move = CATransform3DIdentity;
+ } silhouette.transform = move;
+ [CATransaction commit];
+}
+//- (void)setHighlighted:(BOOL)highlight {
+// highlightLayer.hidden = highlight;
+//}
+@end
View
454 AZTab/AZTabView.h
@@ -0,0 +1,454 @@
+//
+// AZTabView.h
+// tabtest
+//
+// Created by Matteo Rattotti on 2/27/10.
+// Copyright 2010 www.shinyfrog.net. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <QuartzCore/QuartzCore.h>
+
+@protocol AZTabViewDelegate;
+
+/**
+ An AZTabView provides a convenient way to manage tabs in your application.
+ The view contains a row of tabs that can be selected one at time and reordered by dragging.
+
+ The AZTabViewAppDelegate protocol will notify the delegate during notable Tab View events,
+ like selecting, adding and deleting tabs.
+
+ The tabs are rendered using a CALayer subclass, the Tab View will know which class to use by
+ setting the defaultTabClassName property.
+
+ */
+
+@interface AZTabView : NSView {
+ IBOutlet NSObject <AZTabViewDelegate> *delegate;
+
+ CALayer *currentClickedTab;
+ CALayer *currentSelectedTab;
+
+ CALayer *tabsLayer;
+ CAScrollLayer *scrollLayer;
+
+ NSMutableArray *arrangedTabs;
+ NSPoint mouseDownPoint, mouseDownStartingPoint;
+
+ NSString *defaultTabClassName;
+
+ BOOL canDragTab;
+
+ int tabOffset;
+ int startingOffset;
+ int tabMagneticForce;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Properties
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+/**
+ @brief The AZTabView Delegate.
+
+ */
+@property id delegate;
+
+
+/**
+ @brief The CALayer subclass that will render a single tab.
+
+ This class should be conform to the AZTab protocoll.
+ */
+@property NSString *defaultTabClassName;
+
+
+/**
+ @brief The space between two tabs.
+
+ This property can hold negative values in order to make tabs overlap.
+
+ This property should be only changed when the Tab Bar contain no tabs.
+ */
+@property int tabOffset;
+
+
+/**
+ @brief The space before the first tab.
+
+ The first tab will appear shifted to "startingOffset" pixel.
+
+ This property should be only changed when the Tab Bar contain no tabs.
+
+ */
+@property int startingOffset;
+
+
+/**
+ @brief The number of pixel that the user need to drag before the tab actually move.
+
+ High value will make the tabs harder to move, a value of 0 will make the tab moving at
+ every drag tentative.
+ */
+@property int tabMagneticForce;
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Adding and Removing Tabs
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+#pragma mark - Adding and Removing Tabs
+
+/**
+ @brief Add a new tab to the tabview, using the representedObject as model.
+
+ @param representedObject An object passed to the CALayer subclass that contain all the in
+ fomation needed for rendering the tab.
+ @see addTabAtIndex:withRepresentedObject:
+
+ */
+- (void) addTabWithRepresentedObject: (id) representedObject;
+
+
+/**
+ @brief Add a new tab to the tabview at the specified index, using the representedObject as model.
+
+ @param index The index in the tabview at which to insert a new tab.
+ @param representedObject An object passed to the CALayer subclass that contain all the in
+ fomation needed for rendering the tab.
+ @see addTabWithRepresentedObject:
+
+ */
+- (void) addTabAtIndex: (int) index withRepresentedObject: (id) representedObject;
+
+
+/**
+ @brief Remove the tab from the tabview.
+
+ @param tab The tab to remove from the tabview.
+ @see removeTabAtIndex:
+
+ */
+- (void) removeTab: (CALayer *) tab;
+
+
+/**
+ @brief Remove the tab at index.
+
+ @param index The index from which to remove the object in the tabview.
+ @see removeTab:
+
+ */
+- (void) removeTabAtIndex: (int) index;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Accessing Tabs
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+#pragma mark - Accessing Tabs
+
+
+/**
+ @brief Returns the index corresponding to tab.
+
+ Tabs are considered equal if isEqual: returns YES.
+
+ @param tab A tab contained in the Tab View.
+ @return The index whose corresponding tab object is equal to tab. If none of the objects in the tabview is equal to tab, returns NSNotFound.
+ */
+- (int) indexOfTab: (CALayer *) tab;
+
+
+/**
+ @brief Returns the number of tab in the Tab View.
+ */
+- (int) numberOfTabs;
+
+
+/**
+ @brief Returns the tab located at index.
+
+ If index is beyond the end of the Tab View (that is, if index is greater than or equal to the value returned by numberOfTabs), an NSRangeException is raised.
+
+ @param index An index within the bounds of the Tab View.
+ @return The tab located at index.
+ @see numberOfTabs
+ */
+- (CALayer *) tabAtIndex: (int) index;
+
+
+/**
+ @brief Returns an array contaning all the Tab View tabs.
+ @return An array contaning all the Tab View tabs.
+ */
+- (NSArray *) arrangedTabs;
+
+
+/**
+ @brief Returns the first tab in the Tab View.
+ @return The first tab in the Tab View. If the Tab View contain no tabs, returns nil.
+ */
+- (CALayer *) firstTab;
+
+
+/**
+ @brief Returns the last tab in the Tab View.
+ @return The last tab in the Tab View. If the Tab View contain no tabs, returns nil.
+ */
+- (CALayer *) lastTab;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Selecting Tabs
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+#pragma mark - Selecting a Tab
+
+
+/**
+ @brief Select the given tab in the tabview.
+ @param tab A tab contained in the Tab View.
+ @see selectFirstTab:
+ @see selectLastTab:
+ @see selectNextTab:
+ @see selectPreviousTab:
+ */
+- (void) selectTab: (CALayer *) tab;
+
+
+/**
+ @brief Select a tab at given index.
+ @param index An index within the bounds of the Tab View.
+
+ @see selectFirstTab:
+ @see selectLastTab:
+ @see selectNextTab:
+ @see selectPreviousTab:
+ */
+- (void) selectTabAtIndex: (unsigned int) index;
+
+
+/**
+ @brief Select the first tab of the Tab View.
+ @param sender Typically the object that sent the message.
+
+ @see selectFirstTab:
+ @see selectLastTab:
+ @see selectNextTab:
+ @see selectPreviousTab:
+ */
+- (void) selectFirstTab: (id) sender;
+
+
+/**
+ @brief Select the last tab of the Tab View
+ @param sender Typically the object that sent the message.
+
+ @see selectFirstTab:
+ @see selectLastTab:
+ @see selectNextTab:
+ @see selectPreviousTab:
+ */
+- (void) selectLastTab: (id) sender;
+
+
+/**
+ @brief Select the tab on the right of the current selected tab.
+
+ If the tab is the last one, the first tab of the Tab View will be selected, and
+ the Tab View will be scrolled according.
+
+ @param sender Typically the object that sent the message.
+
+ @see selectFirstTab:
+ @see selectLastTab:
+ @see selectNextTab:
+ @see selectPreviousTab:
+ */
+- (void) selectNextTab: (id) sender;
+
+
+/**
+ @brief Select the tab on the left of the current selected tab.
+
+ If the tab is the first one, the last tab of the Tab View will be selected, and
+ the Tab View will be scrolled according.
+
+ @param sender Typically the object that sent the message.
+
+ @see selectFirstTab:
+ @see selectLastTab:
+ @see selectNextTab:
+ @see selectPreviousTab:
+ */
+- (void) selectPreviousTab: (id) sender;
+
+
+/**
+ @brief Returns the current selected tab.
+ @return The current selected tab in the Tab View. If the Tab View contain no tabs, returns nil.
+ */
+- (CALayer *) selectedTab;
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Scrolling
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+#pragma mark - Scrolling
+
+
+/**
+ @brief Scroll the Tab View until tab is fully visibile.
+ @param tab A tab contained in the Tab View.
+
+ This method will scroll the Tab View using the default animation.
+
+ @see scrollToTab:animated:
+ */
+- (void) scrollToTab: (CALayer *) tab;
+
+
+/**
+ @brief Scroll the Tab View until tab is fully visibile.
+ @param tab A tab contained in the Tab View.
+ @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.
+
+ @see scrollToTab:
+ */
+- (void) scrollToTab: (CALayer *) tab animated: (BOOL) animated;
+- (void) scrollToPoint: (CGPoint) point animated: (BOOL) animated;
+
+@end
+
+#pragma mark - Private Methods
+
+@interface AZTabView (Private)
+
+- (CALayer *) tabsLayer;
+- (CAScrollLayer *) scrollLayer;
+
+- (void) setupObservers;
+- (void) setDefaults;
+- (void) adjustTabLayerScrollAnimated: (BOOL) animated;
+- (void) rearrangeInitialTab: (CALayer *) initialTab toLandingTab:(CALayer *) landingTab withCurrentPoint: (CGPoint) currentPoint direction: (BOOL) direction;
+
+- (NSArray *) tabSequenceForStartingTabIndex: (int) startingIndex endingTabIndex: (int) endingIndex direction: (BOOL) direction;
+- (int) startingXOriginForTabAtIndex: (int) index;
+- (CABasicAnimation *) tabMovingAnimation;
+- (NSPoint) deltaFromStartingPoint:(NSPoint)startingPoint endPoint:(NSPoint) endPoint;
+
+@end
+
+
+#pragma mark - AZTabView Delegate protocol
+
+
+/**
+ The AZTabViewDelegate protocol defines the optional methods implemented by delegates of AZTabView objects.
+
+ */
+@protocol AZTabViewDelegate
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Selecting in the Tab View
+//////////////////////////////////////////////////////////////////////////////////////////
+
+@optional
+/**
+ @brief Sent to the delegate to allow or prohibit the specified tab to be selected.
+ @param tabView The Tab View that sent the message.
+ @param tab A tab contained in the Tab View.
+
+ When a tab is clicked by the user, this method will be called on the delegate.
+ Returning NO will disallow that tab from being selected. Returning YES allows it to be selected.
+
+ @return YES if the tab selection should be allowed, otherwise NO.
+
+ @see tabView:didSelectTab:
+ @see tabView:willSelectTab:
+ */
+- (BOOL)tabView:(AZTabView *)tabView shouldSelectTab:(CALayer *)tab;
+
+
+/**
+ @brief Sent at the time the user clicked a tab in the Tab View.
+ @param tabView The Tab View that sent the message.
+ @param tab A tab contained in the Tab View.
+
+ @see tabView:shouldSelectTab:
+ @see tabView:willSelectTab:
+ */
+- (void)tabView:(AZTabView *)tabView didSelectTab:(CALayer *)tab;
+
+/**
+ @brief Sent at the time the user clicked a tab in the Tab View, just before the tab will change state.
+ @param tabView The Tab View that sent the message.
+ @param tab A tab contained in the Tab View.
+
+ @see tabView:shouldSelectTab:
+ @see tabView:didSelectTab:
+ */
+- (void)tabView:(AZTabView *)tabView willSelectTab:(CALayer *)tab;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+/// @name Adding and removing tab
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+/**
+ @brief Sent after a new tab is added to the Tab View.
+ @param tabView The Tab View that sent the message.
+ @param tab The new tab added to the the Tab View.
+
+ @see tabView:didRemovedTab:
+ */
+- (void)tabView:(AZTabView *)tabView didAddTab:(CALayer *)tab;
+
+
+/**
+ @brief Sent after a tab is deleted from the Tab View.
+ @param tabView The Tab View that sent the message.
+ @param tab The tab deleted from the the Tab View.
+
+ @see tabView:didAddTab:
+ */
+- (void)tabView:(AZTabView *)tabView didRemovedTab:(CALayer *)tab;
+
+@end
+
+/**
+ The AZTab protocol defines the required methods that the CALayer subclass should implement
+ for rendering and behaving as a tab.
+
+ */
+@protocol AZTab
+
+@required
+/**
+ @brief Tabs are are created or modified using the representedObject as model.
+ @param representedObject The Object passed to the layer that contain the information for drawing it (title, size, etc...).
+
+ The implementation of this method should read the information of the representedObject and build or update the CALayer
+ according to it.
+
+ */
+- (void) setRepresentedObject: (id) representedObject;
+
+
+/**
+ @brief Toggle the selected state of a tab.
+ @param selected If YES the tag is selected.
+
+ Usually the tab will change state if selected or not, the implementation should reflect this behaviour.
+
+ */
+- (void) setSelected: (BOOL) selected;
+
+@end
+
View
684 AZTab/AZTabView.m
@@ -0,0 +1,684 @@
+//
+// AZTabView.m
+// AZTabView
+//
+
+#import "AZTabView.h"
+
+@implementation AZTabView
+{
+ NSTrackingArea *trackingArea;
+}
+@synthesize delegate, defaultTabClassName;
+@synthesize startingOffset, tabOffset, tabMagneticForce;
+
+#pragma mark - Constructors
+
+- (void) awakeFromNib {
+ [self setDefaults];
+
+}
+
+- (id)initWithFrame:(NSRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ CALayer *bgLayer = [CALayer layer];
+ bgLayer.frame = NSRectToCGRect([self bounds]);
+// bgLayer.anchorPoint = CGPointMake(0,0);
+ bgLayer.layoutManager = [CAConstraintLayoutManager layoutManager];
+// bgLayer.position = CGPointMake(.5,.5);
+ [self setLayer:bgLayer];
+ [self setWantsLayer:YES];
+
+ [self.layer addSublayer:[self scrollLayer]];
+
+ arrangedTabs = [[NSMutableArray alloc]init];
+ tabOffset = 0;
+ startingOffset = 0;
+ tabMagneticForce = 5;
+ // defaultTabClassName = @"SFDefaultTab";
+
+ [self setupObservers];
+// [self setDefaults];
+ }
+ return self;
+}
+
+#pragma mark - Defaults
+
+- (void) setDefaults {
+}
+
+#pragma mark - Obververs
+
+- (void) setupObservers {
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(frameDidChange:)
+ name:NSViewFrameDidChangeNotification
+ object:self];
+}
+
+- (void) frameDidChange: (id) sender {
+ [self adjustTabLayerScrollAnimated:NO];
+}
+
+- (void) adjustTabLayerScrollAnimated: (BOOL) animated {
+ if (currentSelectedTab == nil) {
+ return;
+ }
+
+ CGRect currentSelFrame = currentSelectedTab.frame;
+ currentSelFrame.size.width += currentSelFrame.size.width / 2.0;
+
+ // Scrolling to maintain the selected tab visible
+ if(!CGRectContainsRect(tabsLayer.visibleRect, currentSelFrame)) {
+ [self scrollToTab:currentSelectedTab animated: NO];
+ }
+
+ // eventually scrolling back if the tabview frame expanded
+ if(tabsLayer.visibleRect.size.width < ([self bounds].size.width - ([self lastTab].frame.size.width / 2.0)) && tabsLayer.visibleRect.origin.x > 0) {
+ float deltaX = ([self bounds].size.width - ([self lastTab].frame.size.width / 2.0)) - tabsLayer.visibleRect.size.width;
+
+ float newTabXPosition = tabsLayer.visibleRect.origin.x - deltaX;
+ if (newTabXPosition < 0) {
+ newTabXPosition = 0;
+ }
+
+ [self scrollToPoint:CGPointMake(newTabXPosition,0) animated:animated];
+ }
+
+}
+
+#pragma mark - Base Layers
+- (CALayer *) tabsLayer {
+ tabsLayer = [CALayer layer];
+ tabsLayer.name = @"tabsLayer";
+
+ tabsLayer.layoutManager = [CAConstraintLayoutManager layoutManager];
+
+ [tabsLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintHeight relativeTo:@"superlayer" attribute:kCAConstraintHeight]];
+ [tabsLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY]];
+ [tabsLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY]];
+
+ NSMutableDictionary *actions=[NSMutableDictionary dictionaryWithDictionary:[tabsLayer actions]];
+ [actions setObject:[NSNull null] forKey:@"onOrderIn"];
+ [actions setObject:[NSNull null] forKey:@"onOrderOut"];
+ [actions setObject:[NSNull null] forKey:@"position"];
+ [actions setObject:[NSNull null] forKey:@"bounds"];
+ [actions setObject:[NSNull null] forKey:@"contents"];
+ [actions setObject:[NSNull null] forKey:@"sublayers"];
+
+ [tabsLayer setActions:actions];
+
+ return tabsLayer;
+}
+
+- (CAScrollLayer *) scrollLayer {
+ scrollLayer = [CAScrollLayer layer];
+ scrollLayer.name = @"scrollLayer";
+
+ scrollLayer.layoutManager = [CAConstraintLayoutManager layoutManager];
+
+ [scrollLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX]];
+ [scrollLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" attribute:kCAConstraintMaxX]];
+ [scrollLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY relativeTo:@"superlayer" attribute:kCAConstraintMinY]];
+ [scrollLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY]];
+ [scrollLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintWidth relativeTo:@"superlayer" attribute:kCAConstraintWidth]];
+ [scrollLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintHeight relativeTo:@"superlayer" attribute:kCAConstraintHeight]];
+
+ NSMutableDictionary *actions=[NSMutableDictionary dictionaryWithDictionary:[scrollLayer actions]];
+ [actions setObject:[NSNull null] forKey:@"position"];
+ [actions setObject:[NSNull null] forKey:@"bounds"];
+ [actions setObject:[NSNull null] forKey:@"sublayers"];
+ [actions setObject:[NSNull null] forKey:@"contents"];
+
+ [scrollLayer setActions:actions];
+
+ [scrollLayer addSublayer:[self tabsLayer]];
+
+ return scrollLayer;
+}
+
+
+#pragma mark - Mouse Handling
+
+- (void)mouseMoved:(NSEvent *)theEvent {
+ // Getting clicked point.
+ NSPoint mousePointInView = [self convertPoint:theEvent.locationInWindow fromView:nil];
+
+ mousePointInView = [self.layer convertPoint:mousePointInView toLayer:tabsLayer];
+ mouseDownPoint = mousePointInView;
+
+ // Checking if a tab was clicked.
+ CALayer *clickedLayer = [tabsLayer hitTest:mousePointInView];
+
+ if (clickedLayer && clickedLayer != tabsLayer ) {
+ canDragTab = NO;
+ BOOL shouldSelectTab = YES;
+
+ // Asking delegate if the tab can be selected.
+ if ([delegate respondsToSelector:@selector(tabView:shouldSelectTab:)]) {
+ shouldSelectTab = [delegate tabView:self shouldSelectTab:clickedLayer];
+ }
+ if (shouldSelectTab) {
+ [self selectTab:clickedLayer];
+ mouseDownStartingPoint = currentSelectedTab.frame.origin;
+ currentClickedTab = clickedLayer;
+ }
+
+ }
+
+}
+
+
+
+- (void)scrollWheel:(NSEvent *)theEvent {
+ float a = theEvent.deltaX;
+}
+
+- (void)mouseDragged: (NSEvent *) theEvent {
+ // convert to local coordinate system
+ NSPoint mousePointInView = [self convertPoint:theEvent.locationInWindow fromView:nil];
+ mousePointInView = [self.layer convertPoint:mousePointInView toLayer:tabsLayer];
+
+ if (currentClickedTab) {
+ NSPoint deltaPoint = [self deltaFromStartingPoint:mouseDownPoint endPoint:mousePointInView];
+
+ // Getting drag direction, positive value mean right.
+ BOOL rightShift = (deltaPoint.x > 0);
+
+ // Applying magnetic force, prevent dragging tab if the drag distance is < than tabMagneticForce.
+ if (rightShift && mousePointInView.x > mouseDownPoint.x + tabMagneticForce)
+ canDragTab = YES;
+ else if (mousePointInView.x < mouseDownPoint.x - tabMagneticForce)
+ canDragTab = YES;
+
+ if (!canDragTab)
+ return;
+
+ CGPoint tabNewOrigin = CGPointMake(currentClickedTab.frame.origin.x + deltaPoint.x, currentClickedTab.frame.origin.y);
+ CGRect newFrame = currentClickedTab.frame;
+
+
+ // Checking if the dragged tab crossed another tab.
+ CGPoint proximityLayerPoint;
+
+ if(rightShift)
+ proximityLayerPoint = CGPointMake(tabNewOrigin.x + (currentClickedTab.frame.size.width), tabNewOrigin.y);
+ else {
+ proximityLayerPoint = CGPointMake(tabNewOrigin.x, tabNewOrigin.y);
+ }
+
+ CALayer *la = [tabsLayer hitTest:proximityLayerPoint];
+
+ // if the drag is outside the tabview range we'll adjust the crossed tab to be the first or the last.
+ if ((!la || la == tabsLayer) && proximityLayerPoint.x < startingOffset) {
+ la = [self firstTab];
+ }
+ else if ((!la || la == tabsLayer) && proximityLayerPoint.x > [[self lastTab] frame].size.width + [[self lastTab] frame].origin.x) {
+ la = [self lastTab];
+ }
+
+ // If the tab is different than the tab view layer and than the selected one we'll rearrange tabs.
+ if(la && la != currentClickedTab && la != tabsLayer) {
+
+
+ [self rearrangeInitialTab:currentClickedTab toLandingTab:la withCurrentPoint:proximityLayerPoint direction:rightShift];
+
+ }
+
+ // Moving the dragged tab according.
+ newFrame.origin.x = tabNewOrigin.x;
+ if (newFrame.origin.x < startingOffset)
+ newFrame.origin.x = startingOffset;
+ else if(newFrame.origin.x + newFrame.size.width > tabsLayer.frame.size.width)
+ newFrame.origin.x = tabsLayer.frame.size.width - newFrame.size.width;
+
+
+
+ if(CGRectContainsRect(/*NSRectToCGRect([self bounds])*/tabsLayer.frame, newFrame)){
+ [CATransaction begin];
+ [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
+ currentClickedTab.frame= newFrame;
+ [CATransaction commit];
+ mouseDownPoint = mousePointInView;
+ }
+ }
+
+
+}
+
+- (void)mouseUp: (NSEvent *) theEvent {
+ if (currentClickedTab) {
+
+ // On mouse up we let the dragged tab slide to the starting or changed position.
+ CGRect newFrame = currentClickedTab.frame;
+ newFrame.origin.x = mouseDownStartingPoint.x;
+
+ currentClickedTab.frame = newFrame;
+ currentClickedTab = nil;
+ }
+
+ [self scrollToTab:currentSelectedTab];
+
+}
+
+#pragma mark - Adding and Removing Tabs
+
+- (void) addTabWithRepresentedObject: (id) representedObject {
+ [self addTabAtIndex:[self numberOfTabs] withRepresentedObject:representedObject];
+}
+
+- (void) addTabAtIndex: (int) index withRepresentedObject: (id) representedObject {
+ // Loading the class that will render the tab layer.
+ Class tabLayerClass = [[NSBundle mainBundle] classNamed: defaultTabClassName];
+ id newtab = [tabLayerClass layer];
+
+ // Passing the represented object to the tab layer.
+ if ([newtab respondsToSelector:@selector(setRepresentedObject:)]) {
+ [newtab setRepresentedObject:representedObject];
+ }
+
+ // Removing animation for z-index changes.
+ NSMutableDictionary *customActions=[NSMutableDictionary dictionaryWithDictionary:[newtab actions]];
+ [customActions setObject:[NSNull null] forKey:@"zPosition"];
+ [newtab setActions:customActions];
+
+ // Setting up new tab.
+ [newtab setFrame: CGRectMake([self startingXOriginForTabAtIndex:index], 0, [newtab frame].size.width, [newtab frame].size.height)];
+ [newtab setZPosition: (float)index * -1 ];
+
+ if ([self numberOfTabs] > 0 && index <= [self numberOfTabs]-1) {
+ // Getting the right tag sequence (left-to-right).
+ NSArray *tabsSequence = [self tabSequenceForStartingTabIndex:index-1 endingTabIndex:[self numberOfTabs]-1 direction:YES];
+
+ // shifting pre-existing tabs according
+ for(NSNumber *n in tabsSequence){
+ CALayer *landingTab = [self tabAtIndex:[n intValue]];
+
+ // Updating z-index
+ if (![landingTab isEqualTo:currentSelectedTab]) {
+ landingTab.zPosition = (float)([n intValue]+1) * -1;
+ }
+
+ // Moving a tab.
+ CGRect newFrame = landingTab.frame;
+ newFrame.origin.x += [newtab frame].size.width + tabOffset;
+ landingTab.frame = newFrame;
+ }
+ }
+
+ [tabsLayer addSublayer:newtab];
+ [arrangedTabs insertObject:newtab atIndex:index];
+
+ // Selecting it if it's the only one.
+ if ([self numberOfTabs] == 1) {
+ [self selectTab:newtab];
+ }
+
+ int offset = tabOffset;
+ if ([self numberOfTabs] == 1) {
+ offset = startingOffset;
+ }
+
+ // adjusting the size of the tabsLayer
+ [tabsLayer setValue:[NSNumber numberWithInt:[newtab frame].size.width + tabsLayer.frame.size.width + offset] forKeyPath: @"frame.size.width"];
+
+ // Notifing delegate
+ if ([delegate respondsToSelector:@selector(tabView:didAddTab:)]) {
+ [delegate tabView:self didAddTab:newtab];
+ }
+}
+
+- (void) removeTab: (CALayer *) tab {
+ int tabIndex = [self indexOfTab:tab];
+ if (tabIndex != -1) {
+ [self removeTabAtIndex:tabIndex];
+ }
+}
+
+- (void) removeTabAtIndex: (int) index {
+
+ // Grabbing the tab.
+ int indexOfInitialTab = index;
+ CALayer *tab = [arrangedTabs objectAtIndex:indexOfInitialTab];
+ CGPoint startingOrigin = tab.frame.origin;
+ int indexOfLandingTab = [arrangedTabs count] -1;
+
+
+ int newIndex = indexOfInitialTab; //- 1;
+
+ if ([tab isEqualTo:[self lastTab]] && ![tab isEqualTo:[self firstTab]]) {
+ [self selectTab: [self tabAtIndex:indexOfLandingTab - 1]];
+ }
+ else if([tab isEqualTo:[self firstTab]] && [tab isEqualTo:[self lastTab]]){
+ currentSelectedTab = nil;
+ }
+
+ // Getting the right tag sequence (left-to-right).
+ NSArray *tabsSequence = [self tabSequenceForStartingTabIndex:indexOfInitialTab endingTabIndex:indexOfLandingTab direction:YES];
+
+ // Sliding all right tabs to the left.
+ for(NSNumber *n in tabsSequence){
+ CALayer *landingTab = [self tabAtIndex:[n intValue]];//[arrangedTabs objectAtIndex:[n intValue]];
+
+ // If the deleted tag was the selected one we'll switch selection on the successive.
+ if ([tab isEqualTo:currentSelectedTab]) {
+ [self selectTab:landingTab];
+ }
+ // Adjusting the zPosition of moved tab (only if it's not selected).
+ else if([landingTab isNotEqualTo:currentSelectedTab]){
+ ++newIndex;
+ landingTab.zPosition = (float)newIndex * -1;
+ }
+
+ // Moving a tab.
+ CGRect newFrame = CGRectMake(startingOrigin.x, startingOrigin.y, landingTab.frame.size.width , landingTab.frame.size.height);
+ landingTab.frame = newFrame;
+ startingOrigin.x += newFrame.size.width + tabOffset;
+ }
+
+ // Removing the frame from the view layer without animating.
+ [CATransaction begin];
+ [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
+ [tab removeFromSuperlayer];
+ [CATransaction commit];
+
+
+ int offset = tabOffset;
+ if ([self numberOfTabs] == 1) {
+ offset = startingOffset;
+ }
+
+ // adjusting the size of the tabsLayer
+ [tabsLayer setValue:[NSNumber numberWithInt: tabsLayer.frame.size.width - ([tab frame].size.width + offset)] forKeyPath: @"frame.size.width"];
+
+ if ([delegate respondsToSelector:@selector(tabView:didRemovedTab:)]) {
+ [delegate tabView:self didRemovedTab: tab];
+ }
+
+ // Removing tab from the arranged tags.
+ [arrangedTabs removeObject:tab];
+
+ [self adjustTabLayerScrollAnimated:YES];
+}
+
+#pragma mark - Accessing Tabs
+
+- (int) indexOfTab: (CALayer *) tab {
+ return [arrangedTabs indexOfObject:tab];
+}
+
+- (int) numberOfTabs {
+ return [arrangedTabs count];
+}
+
+- (CALayer *) tabAtIndex: (int) index {
+ return [arrangedTabs objectAtIndex:index];
+}
+
+- (NSArray *) arrangedTabs {
+ return arrangedTabs;
+}
+
+- (CALayer *) firstTab {
+ return [arrangedTabs objectAtIndex:0];
+}
+
+- (CALayer *) lastTab {
+ return [arrangedTabs lastObject];
+}
+
+#pragma mark - Selecting a Tab
+
+- (void) selectTab: (CALayer *) tab {
+
+ if (![arrangedTabs containsObject:tab]) {
+ return;
+ }
+
+ if ([delegate respondsToSelector:@selector(tabView:willSelectTab:)]) {
+ [delegate tabView:self willSelectTab:tab];
+ }
+
+ if(currentSelectedTab){
+
+ currentSelectedTab.zPosition = ([self indexOfTab:currentSelectedTab] * -1.0);
+ if ([currentSelectedTab respondsToSelector:@selector(setSelected:)]) {
+ [(id)currentSelectedTab setSelected: NO];
+ }
+ currentSelectedTab = nil;
+ }
+
+ currentSelectedTab = tab;
+
+ currentSelectedTab.zPosition = 1000;
+
+ if ([currentSelectedTab respondsToSelector:@selector(setSelected:)]) {
+ [(id)currentSelectedTab setSelected: YES];
+ }
+
+ if ([delegate respondsToSelector:@selector(tabView:didSelectTab:)]) {
+ [delegate tabView:self didSelectTab:tab];
+ }
+
+ [self scrollToTab:currentSelectedTab];
+
+}
+
+- (void) selectTabAtIndex: (unsigned int) index {
+ [self selectTab: [self tabAtIndex:index]];
+}
+
+- (void) selectFirstTab: (id) sender {
+ [self selectTab: [self firstTab]];
+}
+
+- (void) selectLastTab: (id) sender {
+ [self selectTab: [self lastTab]];
+}
+
+- (void) selectNextTab: (id) sender {
+ unsigned int currentTabIndex = [ self indexOfTab: [self selectedTab] ];
+ int nextIndex = currentTabIndex + 1;
+ if (currentTabIndex == [self numberOfTabs] -1 )
+ nextIndex = 0;
+
+ [self selectTabAtIndex: nextIndex];
+}
+
+- (void) selectPreviousTab: (id) sender {
+ unsigned int currentTabIndex = [ self indexOfTab: [self selectedTab] ];
+ int prevIndex = currentTabIndex - 1;
+ if (currentTabIndex == 0 )
+ prevIndex = [self numberOfTabs] -1;
+
+ [self selectTabAtIndex: prevIndex];
+}
+
+- (CALayer *) selectedTab {
+ return currentSelectedTab;
+}
+
+#pragma mark - Scrolling
+
+- (void) scrollToTab: (CALayer *) tab {
+ [self scrollToTab:tab animated:YES];
+}
+
+
+- (void) scrollToTab: (CALayer *) tab animated: (BOOL) animated{
+ NSMutableDictionary *actions=[NSMutableDictionary dictionaryWithDictionary:[scrollLayer actions]];
+ [actions removeObjectForKey:@"position"];
+ [actions removeObjectForKey:@"bounds"];
+
+ float duration = 0.0f;
+ if (animated) {
+ duration = 0.4f;
+ }
+
+ [ CATransaction begin ];
+ [ CATransaction setValue: [ NSNumber numberWithFloat:duration] forKey:@"animationDuration" ];
+
+
+ [scrollLayer setActions:actions];
+
+
+ CGRect newFrame = tab.frame;
+ if ([tab isNotEqualTo:[self firstTab]] /*&& [tab isNotEqualTo:[self lastTab]]*/) {
+ newFrame.origin.x -= newFrame.size.width / 2.0;
+ newFrame.size.width += newFrame.size.width;
+ }
+ else if([tab isEqualTo:[self firstTab]]) {
+ newFrame.origin.x -= startingOffset;
+ }
+ [tabsLayer scrollRectToVisible:newFrame];
+
+ [ CATransaction commit ];
+
+ [actions setObject:[NSNull null] forKey:@"position"];
+ [actions setObject:[NSNull null] forKey:@"bounds"];
+ [scrollLayer setActions:actions];
+
+}
+
+- (void) scrollToPoint: (CGPoint) point animated: (BOOL) animated{
+ NSMutableDictionary *actions=[NSMutableDictionary dictionaryWithDictionary:[scrollLayer actions]];
+ [actions removeObjectForKey:@"position"];
+ [actions removeObjectForKey:@"bounds"];
+
+ float duration = 0.0f;
+ if (animated) {
+ duration = 0.4f;
+ }
+
+ [ CATransaction begin ];
+ [ CATransaction setValue: [ NSNumber numberWithFloat:duration] forKey:@"animationDuration" ];
+
+
+ [scrollLayer setActions:actions];
+
+ [tabsLayer scrollPoint:point];
+
+ [ CATransaction commit ];
+
+ [actions setObject:[NSNull null] forKey:@"position"];
+ [actions setObject:[NSNull null] forKey:@"bounds"];
+ [scrollLayer setActions:actions];
+
+}
+
+
+#pragma mark - Tab Handling
+
+
+
+- (void) rearrangeInitialTab: (CALayer *) initialTab toLandingTab:(CALayer *) landingTab withCurrentPoint: (CGPoint) currentPoint direction: (BOOL) direction{
+ int indexOfInitialTab = [self indexOfTab:initialTab];
+ int indexOfLandingTab = [self indexOfTab:landingTab];
+
+
+ // Getting the right tag sequence (left-to-right or right-to-left)
+ NSArray *tabsSequence = [self tabSequenceForStartingTabIndex:indexOfInitialTab endingTabIndex:indexOfLandingTab direction:direction];
+
+ for(NSNumber *n in tabsSequence){
+ landingTab = [self tabAtIndex:[n intValue]];
+
+ int newIndex = 0;
+ int landingOriginOffset = 0;
+ int initialOriginOffset = 0;
+
+ // We are moving left to right, so the origin of the selected tab should be updated.
+ if (direction && currentPoint.x >= landingTab.position.x ) {
+ newIndex = indexOfInitialTab + 1;
+
+ landingOriginOffset = landingTab.frame.size.width - initialTab.frame.size.width;
+ [self scrollToTab:currentSelectedTab];
+ }
+
+ // Moving right to left, the origin of the moved (not selected) tab should be updated.
+ else if(!direction && currentPoint.x < landingTab.position.x ){
+ newIndex = indexOfInitialTab - 1;
+
+ initialOriginOffset = landingTab.frame.size.width - initialTab.frame.size.width;
+ [self scrollToTab:currentSelectedTab];
+
+ }
+ else {
+ continue;
+ }
+
+ // Swapping indexes of initial tab and landing tab
+ [arrangedTabs removeObjectAtIndex:indexOfInitialTab];
+ [arrangedTabs insertObject:initialTab atIndex:newIndex];
+
+ landingTab.zPosition = indexOfInitialTab * -1;
+
+ indexOfInitialTab = newIndex;
+
+
+ // If the tab are of different size we need to adjust the new origin point.
+ CGPoint landingOrigin = landingTab.frame.origin;
+ landingOrigin.x += landingOriginOffset;
+
+ CGRect newFrame = CGRectMake(mouseDownStartingPoint.x - initialOriginOffset, mouseDownStartingPoint.y, landingTab.frame.size.width , landingTab.frame.size.height);
+
+ landingTab.frame = newFrame;
+ mouseDownStartingPoint = landingOrigin;
+
+ }
+
+}
+
+#pragma mark - Utility methods
+
+/* Return a correctly ordered (depepending on direction) tab indexes array */
+- (NSArray *) tabSequenceForStartingTabIndex: (int) startingIndex endingTabIndex: (int) endingIndex direction: (BOOL) direction {
+ NSMutableArray *tagsSequence = [NSMutableArray array];
+
+ for (int i = MIN(startingIndex, endingIndex); i<=MAX(startingIndex, endingIndex); i++) {
+ if (i == startingIndex)
+ continue;
+ else if (direction)
+ [tagsSequence addObject:[NSNumber numberWithInt:i]];
+ else
+ [tagsSequence insertObject:[NSNumber numberWithInt:i] atIndex:0];
+ }
+
+ return tagsSequence;
+}
+
+
+/* Return the initial x coordinate for a new tab */
+- (int) startingXOriginForTabAtIndex: (int) index {
+ if (index == 0)
+ return startingOffset;
+ else
+ return [[self tabAtIndex: index-1] frame].origin.x + [[self tabAtIndex:index-1] frame].size.width + tabOffset;
+}
+
+- (NSPoint) deltaFromStartingPoint:(NSPoint)startingPoint endPoint:(NSPoint) endPoint {
+ return NSMakePoint(endPoint.x - startingPoint.x, endPoint.y - startingPoint.y);
+}
+
+/* basic animation for moving tabs */
+- (CABasicAnimation *) tabMovingAnimation {
+ CABasicAnimation *slideAnimation = [CABasicAnimation animation];
+ slideAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
+ return slideAnimation;
+}
+
+-(void)updateTrackingAreas {
+ if(trackingArea != nil) {
+ [self removeTrackingArea:trackingArea];
+ trackingArea = nil;
+ }
+ int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingMouseMoved );
+ trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds]
+ options:opts
+ owner:self
+ userInfo:nil];
+ [self addTrackingArea:trackingArea];
+}
+
+@end
View
27 AZTab/AZTabViewAppDelegate.h
@@ -0,0 +1,27 @@
+//
+// AZTabViewAppDelegate.h
+// AZTabView
+//
+// Created by Alex Gray on 7/6/12.
+// Copyright (c) 2012 mrgray.com, inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <Cocoa/Cocoa.h>
+#import "AZTabView.h"
+#import <AtoZ/AtoZ.h>
+
+
+@interface AZTabViewAppDelegate : NSObject
+<NSWindowDelegate, NSApplicationDelegate, AZTabViewDelegate>
+{ int number;
+
+}
+@property (nonatomic, retain) IBOutlet AZTabView *colorBar;
+@property (nonatomic, retain) IBOutlet NSWindow *window;
+@property (nonatomic, retain) IBOutlet AZTabView *tabView;
+
+- (void) removeTab: (id) sender;
+- (void) addTab: (id) sender;
+
+@end
View
86 AZTab/AZTabViewAppDelegate.m
@@ -0,0 +1,86 @@
+//
+// AZTabViewAppDelegate.m
+// AZTabView
+//
+// Created by Alex Gray on 7/6/12.
+// Copyright (c) 2012 mrgray.com, inc. All rights reserved.
+//
+
+#import "AZTabViewAppDelegate.h"
+
+@implementation AZTabViewAppDelegate {
+ NSArray *rainbow;
+}
+@synthesize window, tabView, colorBar;
+
+- (void) awakeFromNib {
+ tabView.defaultTabClassName = @"AZDefaultTab";
+ colorBar.defaultTabClassName = @"AZColorBar";
+}
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
+ tabView.delegate = self;
+ tabView.tabOffset = -15;
+ tabView.startingOffset = 20;
+// [tabView addTabWithRepresentedObject:[NSDictionary dictionaryWithObject:@"One" forKey:@"name"]];
+ number = 0;
+
+ [NSApp activateIgnoringOtherApps:YES];
+ [window setDelegate: self];
+ [window makeKeyAndOrderFront:window];
+ NSRect v, z;
+ v = z = [[NSScreen mainScreen]frame];
+ v.size.height = 169;
+ v.origin.y = z.size.height -v.size.height - 22;
+ [window setFrame:v display:YES animate:NO];
+ window.minSize = v.size;
+
+ [[AtoZ dockSorted] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
+ AZFile *t = obj;
+ [tabView addTabWithRepresentedObject:t];
+ number++;
+ }];
+ colorBar.tabOffset = -10;
+ colorBar.startingOffset = 20;
+ colorBar.defaultTabClassName = @"AZColorBar";
+ rainbow = [[NSColor fengshui].reversed arrayUsingBlock:^id(id obj) {
+ NSColor *g = obj;
+ AZFile *t = [AZFile dummy];
+ t.color = g;
+ t.spot = 22;
+ return t;
+ }];
+ [rainbow enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
+ AZFile *t = obj;
+ [colorBar addTabWithRepresentedObject:t];
+ }];
+
+}
+
+- (void) removeTab: (id) sender {
+ --number;
+ [tabView removeTab:[tabView selectedTab]];
+}
+
+- (void) addTab: (id) sender {
+// ++number;
+// [tabView addTabWithRepresentedObject:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%d", number] forKey:@"name"]];
+ [tabView selectTab:[tabView lastTab]];
+}
+
+- (void)tabView:(AZTabView *)tabView didAddTab:(CALayer *)tab {
+}
+
+- (void)tabView:(AZTabView *)tabView didRemovedTab:(CALayer *)tab {
+}
+
+- (BOOL)tabView:(AZTabView *)tabView shouldSelectTab:(CALayer *)tab {
+ return YES;
+}
+
+- (void)tabView:(AZTabView *)tabView didSelectTab:(CALayer *)tab {
+}
+
+- (void)tabView:(AZTabView *)tabView willSelectTab:(CALayer *)tab {
+}
+@end
View
0  SFTabView-Info.plist → AZTabView-Info.plist
File renamed without changes
View
595 AZTabView.xcodeproj/project.pbxproj
@@ -0,0 +1,595 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0C5CBCF611BD52BA00448ADD /* SFDefaultTab.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C5CBCF111BD52BA00448ADD /* SFDefaultTab.m */; };
+ 0C5CBCF711BD52BA00448ADD /* SFTabView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C5CBCF311BD52BA00448ADD /* SFTabView.m */; };
+ 0C5CBCF811BD52BA00448ADD /* SFTabViewAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C5CBCF511BD52BA00448ADD /* SFTabViewAppDelegate.m */; };
+ 0C5CBCFF11BD534200448ADD /* activeTab.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C5CBCFB11BD534200448ADD /* activeTab.png */; };
+ 0C5CBD0011BD534200448ADD /* inactiveTab.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C5CBCFC11BD534200448ADD /* inactiveTab.png */; };
+ 0C5CBD0111BD534200448ADD /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0C5CBCFD11BD534200448ADD /* MainMenu.xib */; };
+ 0C5CBD0211BD534200448ADD /* tabBg.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C5CBCFE11BD534200448ADD /* tabBg.png */; };
+ 0C5CBD1311BD537700448ADD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0C5CBD1111BD537700448ADD /* InfoPlist.strings */; };
+ 7B02370915E0BE640070FE12 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B02370815E0BE640070FE12 /* QuartzCore.framework */; };
+ 7B02370A15E0BE6E0070FE12 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B02370815E0BE640070FE12 /* QuartzCore.framework */; };
+ 7B02370D15E0BE7A0070FE12 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B02370C15E0BE7A0070FE12 /* Cocoa.framework */; };
+ 7B18225516222ED100C19DBB /* AtoZ.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B18225416222ED100C19DBB /* AtoZ.framework */; };
+ 7B18225616222F6A00C19DBB /* AtoZ.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B18225416222ED100C19DBB /* AtoZ.framework */; };
+ 7B92C7DB15A72FA300D9BB9B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7B92C7D915A72FA300D9BB9B /* InfoPlist.strings */; };
+ 7B92C7DD15A72FA300D9BB9B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B92C7DC15A72FA300D9BB9B /* main.m */; };
+ 7B92C7E115A72FA300D9BB9B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 7B92C7DF15A72FA300D9BB9B /* Credits.rtf */; };
+ 7B92C7E715A72FA400D9BB9B /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B92C7E515A72FA400D9BB9B /* MainMenu.xib */; };
+ 7B92C7ED15A72FFA00D9BB9B /* AZTabViewAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B92C7C915A72ED700D9BB9B /* AZTabViewAppDelegate.m */; };
+ 7B92C7EE15A72FFF00D9BB9B /* AZDefaultTab.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B92C7C415A72B4A00D9BB9B /* AZDefaultTab.m */; };
+ 7B92C7F015A7300300D9BB9B /* AZTabView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B92C7CC15A72F1500D9BB9B /* AZTabView.m */; };
+ 7B92C7F315A7304000D9BB9B /* PAColorSwatchChooser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B92C7F215A7304000D9BB9B /* PAColorSwatchChooser.m */; };
+ 7B92C7F415A7368300D9BB9B /* tabBg.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C5CBCFE11BD534200448ADD /* tabBg.png */; };
+ 7BCE78B815E25DF800B53BC6 /* PLWeakCompatibility.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7BCE78B715E25DF800B53BC6 /* PLWeakCompatibility.framework */; };
+ 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 7B02370E15E0BE8C0070FE12 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 12;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7B9595B615E1D87D0044620B /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 7BCE78B815E25DF800B53BC6 /* PLWeakCompatibility.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0C5CBCF011BD52BA00448ADD /* SFDefaultTab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFDefaultTab.h; path = Classes/SFDefaultTab.h; sourceTree = "<group>"; };
+ 0C5CBCF111BD52BA00448ADD /* SFDefaultTab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFDefaultTab.m; path = Classes/SFDefaultTab.m; sourceTree = "<group>"; };
+ 0C5CBCF211BD52BA00448ADD /* SFTabView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFTabView.h; path = Classes/SFTabView.h; sourceTree = "<group>"; };
+ 0C5CBCF311BD52BA00448ADD /* SFTabView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFTabView.m; path = Classes/SFTabView.m; sourceTree = "<group>"; };
+ 0C5CBCF411BD52BA00448ADD /* SFTabViewAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFTabViewAppDelegate.h; path = Classes/SFTabViewAppDelegate.h; sourceTree = "<group>"; };
+ 0C5CBCF511BD52BA00448ADD /* SFTabViewAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFTabViewAppDelegate.m; path = Classes/SFTabViewAppDelegate.m; sourceTree = "<group>"; };
+ 0C5CBCFB11BD534200448ADD /* activeTab.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = activeTab.png; path = Resources/activeTab.png; sourceTree = "<group>"; };
+ 0C5CBCFC11BD534200448ADD /* inactiveTab.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = inactiveTab.png; path = Resources/inactiveTab.png; sourceTree = "<group>"; };
+ 0C5CBCFD11BD534200448ADD /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = Resources/MainMenu.xib; sourceTree = "<group>"; };
+ 0C5CBCFE11BD534200448ADD /* tabBg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabBg.png; path = Resources/tabBg.png; sourceTree = "<group>"; };
+ 0C5CBD1211BD537700448ADD /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 0CB2673D11984E3100003C49 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
+ 256AC3F00F4B6AF500CF3369 /* AZTabView_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AZTabView_Prefix.pch; sourceTree = "<group>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
+ 7B02370815E0BE640070FE12 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
+ 7B02370C15E0BE7A0070FE12 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };
+ 7B18225416222ED100C19DBB /* AtoZ.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AtoZ.framework; path = ../../../../../Library/Frameworks/AtoZ.framework; sourceTree = "<group>"; };
+ 7B92C7C315A72B4A00D9BB9B /* AZDefaultTab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AZDefaultTab.h; sourceTree = "<group>"; };
+ 7B92C7C415A72B4A00D9BB9B /* AZDefaultTab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AZDefaultTab.m; sourceTree = "<group>"; };
+ 7B92C7C815A72ED700D9BB9B /* AZTabViewAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AZTabViewAppDelegate.h; path = ../AZTab/AZTabViewAppDelegate.h; sourceTree = "<group>"; };
+ 7B92C7C915A72ED700D9BB9B /* AZTabViewAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AZTabViewAppDelegate.m; path = ../AZTab/AZTabViewAppDelegate.m; sourceTree = "<group>"; };
+ 7B92C7CB15A72F1500D9BB9B /* AZTabView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AZTabView.h; sourceTree = "<group>"; };
+ 7B92C7CC15A72F1500D9BB9B /* AZTabView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AZTabView.m; sourceTree = "<group>"; };
+ 7B92C7D215A72FA300D9BB9B /* AZTabView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AZTabView.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7B92C7D415A72FA300D9BB9B /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 7B92C7D815A72FA300D9BB9B /* AZTabView-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AZTabView-Info.plist"; sourceTree = "<group>"; };
+ 7B92C7DA15A72FA300D9BB9B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 7B92C7DC15A72FA300D9BB9B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 7B92C7DE15A72FA300D9BB9B /* AZTabView-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AZTabView-Prefix.pch"; sourceTree = "<group>"; };
+ 7B92C7E015A72FA300D9BB9B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 7B92C7E615A72FA400D9BB9B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
+ 7B92C7F115A7304000D9BB9B /* PAColorSwatchChooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PAColorSwatchChooser.h; sourceTree = "<group>"; };
+ 7B92C7F215A7304000D9BB9B /* PAColorSwatchChooser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PAColorSwatchChooser.m; sourceTree = "<group>"; };
+ 7BCE78B715E25DF800B53BC6 /* PLWeakCompatibility.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PLWeakCompatibility.framework; path = "../../../../disenchanted 750/DerivedData/PLWeakCompatibility-chfkqnybfsbbfpfbkrdmefgadcvh/Build/Products/Debug/PLWeakCompatibility.framework"; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* AZTabView-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AZTabView-Info.plist"; sourceTree = "<group>"; };
+ 8D1107320486CEB800E47090 /* AZTabView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AZTabView.app; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 7B92C7CF15A72FA300D9BB9B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7B18225516222ED100C19DBB /* AtoZ.framework in Frameworks */,
+ 7B02370D15E0BE7A0070FE12 /* Cocoa.framework in Frameworks */,
+ 7B02370A15E0BE6E0070FE12 /* QuartzCore.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D11072E0486CEB800E47090 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7B18225616222F6A00C19DBB /* AtoZ.framework in Frameworks */,
+ 7B02370915E0BE640070FE12 /* QuartzCore.framework in Frameworks */,
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 7B92C7C215A72B2A00D9BB9B /* AZTabView */,
+ 0C5CBD1711BD545E00448ADD /* SFTabView */,
+ 0C5CBCF411BD52BA00448ADD /* SFTabViewAppDelegate.h */,
+ 0C5CBCF511BD52BA00448ADD /* SFTabViewAppDelegate.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 0C5CBD1711BD545E00448ADD /* SFTabView */ = {
+ isa = PBXGroup;
+ children = (
+ 0C5CBCF011BD52BA00448ADD /* SFDefaultTab.h */,
+ 0C5CBCF111BD52BA00448ADD /* SFDefaultTab.m */,
+ 0C5CBCF211BD52BA00448ADD /* SFTabView.h */,
+ 0C5CBCF311BD52BA00448ADD /* SFTabView.m */,
+ );
+ name = SFTabView;
+ sourceTree = "<group>";
+ };
+ 0CB2672111984D2800003C49 /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ 0C5CBCFB11BD534200448ADD /* activeTab.png */,
+ 0C5CBCFC11BD534200448ADD /* inactiveTab.png */,
+ 0C5CBCFE11BD534200448ADD /* tabBg.png */,
+ );
+ name = Images;
+ sourceTree = "<group>";
+ };
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "<group>";
+ };
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 0CB2673D11984E3100003C49 /* QuartzCore.framework */,
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */,
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D1107320486CEB800E47090 /* AZTabView.app */,
+ 7B92C7D215A72FA300D9BB9B /* AZTabView.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* SFTabView */ = {
+ isa = PBXGroup;
+ children = (
+ 7B18225416222ED100C19DBB /* AtoZ.framework */,
+ 7BCE78B715E25DF800B53BC6 /* PLWeakCompatibility.framework */,
+ 7B02370C15E0BE7A0070FE12 /* Cocoa.framework */,
+ 7B02370815E0BE640070FE12 /* QuartzCore.framework */,
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = SFTabView;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 256AC3F00F4B6AF500CF3369 /* AZTabView_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 0C5CBCFD11BD534200448ADD /* MainMenu.xib */,
+ 0CB2672111984D2800003C49 /* Images */,
+ 8D1107310486CEB800E47090 /* AZTabView-Info.plist */,
+ 0C5CBD1111BD537700448ADD /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
+ 7B92C7D415A72FA300D9BB9B /* Cocoa.framework */,
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 7B92C7C215A72B2A00D9BB9B /* AZTabView */ = {
+ isa = PBXGroup;
+ children = (
+ 7B92C7D615A72FA300D9BB9B /* AZTabView */,
+ 7B92C7C315A72B4A00D9BB9B /* AZDefaultTab.h */,
+ 7B92C7C415A72B4A00D9BB9B /* AZDefaultTab.m */,
+ 7B92C7CB15A72F1500D9BB9B /* AZTabView.h */,
+ 7B92C7CC15A72F1500D9BB9B /* AZTabView.m */,
+ );
+ name = AZTabView;
+ path = AZTab;
+ sourceTree = SOURCE_ROOT;
+ };
+ 7B92C7D615A72FA300D9BB9B /* AZTabView */ = {
+ isa = PBXGroup;
+ children = (
+ 7B92C7C815A72ED700D9BB9B /* AZTabViewAppDelegate.h */,
+ 7B92C7C915A72ED700D9BB9B /* AZTabViewAppDelegate.m */,
+ 7B92C7E515A72FA400D9BB9B /* MainMenu.xib */,
+ 7B92C7D715A72FA300D9BB9B /* Supporting Files */,
+ );
+ path = AZTabView;
+ sourceTree = SOURCE_ROOT;
+ };
+ 7B92C7D715A72FA300D9BB9B /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 7B92C7F115A7304000D9BB9B /* PAColorSwatchChooser.h */,
+ 7B92C7F215A7304000D9BB9B /* PAColorSwatchChooser.m */,
+ 7B92C7D815A72FA300D9BB9B /* AZTabView-Info.plist */,
+ 7B92C7D915A72FA300D9BB9B /* InfoPlist.strings */,
+ 7B92C7DC15A72FA300D9BB9B /* main.m */,
+ 7B92C7DE15A72FA300D9BB9B /* AZTabView-Prefix.pch */,
+ 7B92C7DF15A72FA300D9BB9B /* Credits.rtf */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 7B92C7D115A72FA300D9BB9B /* AZTabView */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7B92C7E815A72FA400D9BB9B /* Build configuration list for PBXNativeTarget "AZTabView" */;
+ buildPhases = (
+ 7B92C7CE15A72FA300D9BB9B /* Sources */,
+ 7B92C7CF15A72FA300D9BB9B /* Frameworks */,
+ 7B92C7D015A72FA300D9BB9B /* Resources */,
+ 7B02370E15E0BE8C0070FE12 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = AZTabView;
+ productName = AZTabView;
+ productReference = 7B92C7D215A72FA300D9BB9B /* AZTabView.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 8D1107260486CEB800E47090 /* SFTabView */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SFTabView" */;
+ buildPhases = (
+ 8D1107290486CEB800E47090 /* Resources */,
+ 8D11072C0486CEB800E47090 /* Sources */,
+ 8D11072E0486CEB800E47090 /* Frameworks */,
+ 7B9595B615E1D87D0044620B /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SFTabView;
+ productInstallPath = "$(HOME)/Applications";
+ productName = SFTabView;
+ productReference = 8D1107320486CEB800E47090 /* AZTabView.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0440;
+ };
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AZTabView" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* SFTabView */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8D1107260486CEB800E47090 /* SFTabView */,
+ 7B92C7D115A72FA300D9BB9B /* AZTabView */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 7B92C7D015A72FA300D9BB9B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7B92C7DB15A72FA300D9BB9B /* InfoPlist.strings in Resources */,
+ 7B92C7E115A72FA300D9BB9B /* Credits.rtf in Resources */,
+ 7B92C7F415A7368300D9BB9B /* tabBg.png in Resources */,
+ 7B92C7E715A72FA400D9BB9B /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D1107290486CEB800E47090 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0C5CBCFF11BD534200448ADD /* activeTab.png in Resources */,
+ 0C5CBD0011BD534200448ADD /* inactiveTab.png in Resources */,
+ 0C5CBD0111BD534200448ADD /* MainMenu.xib in Resources */,
+ 0C5CBD0211BD534200448ADD /* tabBg.png in Resources */,
+ 0C5CBD1311BD537700448ADD /* InfoPlist.strings in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 7B92C7CE15A72FA300D9BB9B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7B92C7DD15A72FA300D9BB9B /* main.m in Sources */,
+ 7B92C7ED15A72FFA00D9BB9B /* AZTabViewAppDelegate.m in Sources */,
+ 7B92C7EE15A72FFF00D9BB9B /* AZDefaultTab.m in Sources */,
+ 7B92C7F015A7300300D9BB9B /* AZTabView.m in Sources */,
+ 7B92C7F315A7304000D9BB9B /* PAColorSwatchChooser.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D11072C0486CEB800E47090 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072D0486CEB800E47090 /* main.m in Sources */,
+ 0C5CBCF611BD52BA00448ADD /* SFDefaultTab.m in Sources */,
+ 0C5CBCF711BD52BA00448ADD /* SFTabView.m in Sources */,
+ 0C5CBCF811BD52BA00448ADD /* SFTabViewAppDelegate.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 0C5CBD1111BD537700448ADD /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0C5CBD1211BD537700448ADD /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 7B92C7D915A72FA300D9BB9B /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7B92C7DA15A72FA300D9BB9B /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 7B92C7DF15A72FA300D9BB9B /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7B92C7E015A72FA300D9BB9B /* en */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 7B92C7E515A72FA400D9BB9B /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7B92C7E615A72FA400D9BB9B /* en */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 7B92C7E915A72FA400D9BB9B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../disenchanted 750/DerivedData/AtoZ-hfqteqfcvjfinlajqwkydsqyzpiz/Build/Products/Debug\"",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AZTabView/AZTabView-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ INFOPLIST_FILE = "AZTabView/AZTabView-Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @executable_path/../Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = "";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ 7B92C7EA15A72FA400D9BB9B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../disenchanted 750/DerivedData/AtoZ-hfqteqfcvjfinlajqwkydsqyzpiz/Build/Products/Debug\"",
+ );
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AZTabView/AZTabView-Prefix.pch";
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ INFOPLIST_FILE = "AZTabView/AZTabView-Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @executable_path/../Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = "";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C01FCF4B08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)\"",
+ );
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_PREFIX_HEADER = AZTabView_Prefix.pch;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ INFOPLIST_FILE = "AZTabView-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks @loader_path/../Frameworks";
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ PRODUCT_NAME = AZTabView;
+ SDKROOT = "";
+ };
+ name = Debug;
+ };
+ C01FCF4C08A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)\"",
+ );
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_PREFIX_HEADER = AZTabView_Prefix.pch;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ INFOPLIST_FILE = "AZTabView-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks @loader_path/../Frameworks";
+ PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ PRODUCT_NAME = AZTabView;
+ SDKROOT = "";
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ GCC_C_LANGUAGE_STANDARD = "compiler-default";
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = "";
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ GCC_C_LANGUAGE_STANDARD = "compiler-default";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ SDKROOT = "";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 7B92C7E815A72FA400D9BB9B /* Build configuration list for PBXNativeTarget "AZTabView" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7B92C7E915A72FA400D9BB9B /* Debug */,
+ 7B92C7EA15A72FA400D9BB9B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SFTabView" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4B08A954540054247B /* Debug */,
+ C01FCF4C08A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AZTabView" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
View
7 AZTabView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:AZTabView.xcodeproj">
+ </FileRef>
+</Workspace>
View
24 ...deproj/project.xcworkspace/xcuserdata/localadmin.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,24 @@
+<?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>BuildLocationStyle</key>
+ <string>UseAppPreferences</string>
+ <key>CustomBuildLocationType</key>
+ <string>RelativeToDerivedData</string>
+ <key>DerivedDataLocationStyle</key>
+ <string>Default</string>
+ <key>HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
+ <true/>
+ <key>IssueFilterStyle</key>
+ <string>ShowActiveSchemeOnly</string>
+ <key>LiveSourceIssuesEnabled</key>
+ <true/>
+ <key>SharedBuildFolderName</key>
+ <string>Build</string>
+ <key>SnapshotAutomaticallyBeforeSignificantChanges</key>
+ <true/>
+ <key>SnapshotLocationStyle</key>
+ <string>Default</string>
+</dict>
+</plist>
View
14 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ type = "1"
+ version = "1.0">
+ <ExceptionBreakpoints>
+ <ExceptionBreakpoint
+ shouldBeEnabled = "Yes"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ scope = "0"
+ stopOnStyle = "0">
+ </ExceptionBreakpoint>
+ </ExceptionBreakpoints>
+</Bucket>
View
91 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcschemes/AZTabView.xcscheme
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0440"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "7B92C7D115A72FA300D9BB9B"
+ BuildableName = "AZTabView.app"
+ BlueprintName = "AZTabView"
+ ReferencedContainer = "container:AZTabView.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "7B92C7D115A72FA300D9BB9B"
+ BuildableName = "AZTabView.app"
+ BlueprintName = "AZTabView"
+ ReferencedContainer = "container:AZTabView.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "YES"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "7B92C7D115A72FA300D9BB9B"
+ BuildableName = "AZTabView.app"
+ BlueprintName = "AZTabView"
+ ReferencedContainer = "container:AZTabView.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ <AdditionalOption
+ key = "NSZombieEnabled"
+ value = "YES"
+ isEnabled = "YES">
+ </AdditionalOption>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "7B92C7D115A72FA300D9BB9B"
+ BuildableName = "AZTabView.app"
+ BlueprintName = "AZTabView"
+ ReferencedContainer = "container:AZTabView.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
View
86 AZTabView.xcodeproj/xcuserdata/localadmin.xcuserdatad/xcschemes/SFTabView.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0440"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8D1107260486CEB800E47090"