From bbd402fcffcaafbfff4629fc155aacc1566f1143 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 20 Apr 2010 23:51:18 -0700 Subject: [PATCH 001/175] Partial fix for HTML5 drag and drop with collection views. Reviewed by me. --- AppKit/CPCollectionView.j | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index cf91c32cd..10c017f23 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -590,6 +590,14 @@ - (void)mouseDragged:(CPEvent)anEvent { + var locationInWindow = [anEvent locationInWindow], + mouseDownLocationInWindow = [_mouseDownEvent locationInWindow]; + + // FIXME: This is because Safari's drag hysteresis is 3px x 3px + if ((ABS(locationInWindow.x - mouseDownLocationInWindow.x) < 3) && + (ABS(locationInWindow.y - mouseDownLocationInWindow.y) < 3)) + return; + if (![_delegate respondsToSelector:@selector(collectionView:dragTypesForItemsAtIndexes:)]) return; From b1282b43629c09be362b66c4f4f326b321f2a602 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Wed, 21 Apr 2010 12:58:31 -0700 Subject: [PATCH 002/175] Fix an infinite recursion bug in CPBrowser, and add support for looking up a column/row by location. --- AppKit/CPBrowser.j | 93 ++++++++++++++++++++++++++++++++++---------- AppKit/CPTableView.j | 2 +- 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/AppKit/CPBrowser.j b/AppKit/CPBrowser.j index 8d524b4ed..e92a547af 100644 --- a/AppKit/CPBrowser.j +++ b/AppKit/CPBrowser.j @@ -64,14 +64,14 @@ + (CPImage)branchImage { - return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[self class]] + return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPBrowser class]] pathForResource:"browser-leaf.png"] size:CGSizeMake(9,9)]; } + (CPImage)highlightedBranchImage { - return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[self class]] + return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPBrowser class]] pathForResource:"browser-leaf-highlighted.png"] size:CGSizeMake(9,9)]; } @@ -213,8 +213,6 @@ [table setAllowsEmptySelection:_allowsEmptySelection]; [table registerForDraggedTypes:[self registeredDraggedTypes]]; - [self setNextResponder:table]; - [self _addTableColumnsToTableView:table forColumnIndex:index]; var delegate = [[_CPBrowserTableDelegate alloc] init]; @@ -314,6 +312,37 @@ [_contentView setFrameSize:CGSizeMake(xOrigin, height)]; } +- (unsigned)rowAtPoint:(CGPoint)aPoint +{ + var column = [self columnAtPoint:aPoint]; + if (column === -1) + return -1; + + var tableView = _tableViews[column]; + return [tableView rowAtPoint:[tableView convertPoint:aPoint fromView:self]]; +} + +- (unsigned)columnAtPoint:(CGPoint)aPoint +{ + for (var i = 0, count = _tableViews.length; i < count; i++) + { + var frame = [[_tableViews[i] enclosingScrollView] frame]; + if (CGRectContainsPoint(frame, aPoint)) + return i; + } + + return -1; +} + +- (CGRect)rectOfRow:(unsigned)aRow inColumn:(unsigned)aColumn +{ + var tableView = _tableViews[aColumn], + rect = [tableView rectOfRow:aRow]; + + rect.origin = [self convertPoint:rect.origin fromView:tableView]; + return rect; +} + // ITEMS - (id)itemAtRow:(int)row inColumn:(int)column @@ -357,6 +386,10 @@ // CLICK EVENTS +- (void)trackMouse:(CPEvent)anEvent +{ +} + - (void)_column:(unsigned)columnIndex clickedRow:(unsigned)rowIndex { [self setLastColumn:columnIndex]; @@ -382,6 +415,15 @@ [self sendAction:_doubleAction to:_target]; } +- (void)keyDown:(CPEvent)anEvent +{ + var column = [self selectedColumn]; + if (column === -1) + return; + + [_tableViews[column] keyDown:anEvent]; +} + // SIZING - (float)columnContentWidthForColumnWidth:(float)aWidth @@ -551,8 +593,6 @@ [[self tableViewInColumn:column] selectRowIndexes:indexSet byExtendingSelection:NO]; - [self setNextResponder:[self tableViewInColumn:[self lastColumn]]]; - [self scrollColumnToVisible:column]; if ([_delegate respondsToSelector:@selector(browserSelectionDidChange:)]) @@ -604,6 +644,8 @@ @end +var _CPBrowserResizeControlBackgroundImage = nil; + @implementation _CPBrowserResizeControl : CPView { CGPoint _mouseDownX; @@ -612,6 +654,26 @@ unsigned _width; } ++ (CPImage)backgroundImage +{ + if (!_CPBrowserResizeControlBackgroundImage) + { + var path = [[CPBundle bundleForClass:[self class]] pathForResource:"browser-resize-control.png"]; + _CPBrowserResizeControlBackgroundImage = [[CPImage alloc] initWithContentsOfFile:path + size:CGSizeMake(15, 14)]; + } + + return _CPBrowserResizeControlBackgroundImage; +} + +- (id)initWithFrame:(CGRect)aFrame +{ + if (self = [super initWithFrame:aFrame]) + [self setBackgroundColor:[CPColor colorWithPatternImage:[[self class] backgroundImage]]]; + + return self; +} + - (void)mouseDown:(CPEvent)anEvent { _mouseDownX = [anEvent locationInWindow].x; @@ -626,9 +688,11 @@ [_browser setWidth:_width + deltaX ofColumn:_index]; } -@end +- (void)mouseUp:(CPEvent)anEvent +{ +} -var _CPBrowserResizeControlBackgroundImage = nil; +@end @implementation _CPBrowserScrollView : CPScrollView { @@ -636,24 +700,11 @@ var _CPBrowserResizeControlBackgroundImage = nil; CPBrowser _browser @accessors; } -+ (CPImage)backgroundImage -{ - if (!_CPBrowserResizeControlBackgroundImage) - { - var path = [[CPBundle bundleForClass:[self class]] pathForResource:"browser-resize-control.png"]; - _CPBrowserResizeControlBackgroundImage = [[CPImage alloc] initWithContentsOfFile:path - size:CGSizeMake(15, 14)]; - } - - return _CPBrowserResizeControlBackgroundImage; -} - - (void)initWithFrame:(CGRect)aFrame { if (self = [super initWithFrame:aFrame]) { _resizeControl = [[_CPBrowserResizeControl alloc] initWithFrame:CGRectMakeZero()]; - [_resizeControl setBackgroundColor:[CPColor colorWithPatternImage:[[self class] backgroundImage]]]; [self addSubview:_resizeControl]; } diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 8dd282e4e..cbc4894a4 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -3049,7 +3049,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; - (void)keyDown:(CPEvent)anEvent { - [self interpretKeyEvents:[CPArray arrayWithObject:anEvent]]; + [self interpretKeyEvents:[anEvent]]; } - (void)moveDown:(id)sender From d2399b6157c6304167245638de00bdc5ff42bad2 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Tue, 13 Apr 2010 14:35:14 -0700 Subject: [PATCH 003/175] Add support for not clipping to bounds in cpview. --- AppKit/CPView.j | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index c3b2499b8..f2e4f3ab5 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -139,6 +139,7 @@ var CPViewFlags = { }, BOOL _isHidden; BOOL _hitTests; + BOOL _clipsToBounds; BOOL _postsFrameChangedNotifications; BOOL _postsBoundsChangedNotifications; @@ -277,6 +278,7 @@ var CPViewFlags = { }, _autoresizingMask = CPViewNotSizable; _autoresizesSubviews = YES; + _clipsToBounds = YES; _opacity = 1.0; _isHidden = NO; @@ -1188,6 +1190,23 @@ var CPViewFlags = { }, return _isHidden; } +- (void)setClipsToBounds:(BOOL)shouldClip +{ + if (_clipsToBounds === shouldClip) + return; + + _clipsToBounds = shouldClip; + +#if PLATFORM(DOM) + _DOMElement.style.overflow = _clipsToBounds ? "hidden" : "visible"; +#endif +} + +- (BOOL)clipsToBounds +{ + return _clipsToBounds; +} + /*! Sets the opacity of the receiver. The value must be in the range of 0.0 to 1.0, where 0.0 is completely transparent and 1.0 is completely opaque. From 5838f1aec84bfff93ddf00e7e8f44171d6a372b5 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sat, 17 Apr 2010 18:27:00 -0400 Subject: [PATCH 004/175] Implemented CPCoding for CPNull. --- Foundation/CPNull.j | 25 ++++++++++++++++++++++--- Tests/Foundation/CPNullTest.j | 12 ++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 Tests/Foundation/CPNullTest.j diff --git a/Foundation/CPNull.j b/Foundation/CPNull.j index 43ba1cbc9..0eaca5773 100644 --- a/Foundation/CPNull.j +++ b/Foundation/CPNull.j @@ -25,7 +25,7 @@ var CPNullSharedNull = nil; -/*! +/*! @class CPNull @ingroup foundation @brief An object representation of \c nil. @@ -41,7 +41,7 @@ var CPNullSharedNull = nil; { if (CPNullSharedNull) return CPNullSharedNull; - + return [super alloc]; }*/ /*! @@ -53,8 +53,27 @@ var CPNullSharedNull = nil; { if (!CPNullSharedNull) CPNullSharedNull = [[CPNull alloc] init]; - + return CPNullSharedNull; } +/*! + Returns CPNull null. + @param aCoder the coder from which to do nothing + @return [CPNull null] +*/ +- (id)initWithCoder:(CPCoder)aCoder +{ + return [CPNull null]; +} + +/*! + Writes out nothing to the specified coder. + @param aCoder the coder to which nothing will + be written +*/ +- (void)encodeWithCoder:(CPCoder)aCoder +{ +} + @end diff --git a/Tests/Foundation/CPNullTest.j b/Tests/Foundation/CPNullTest.j new file mode 100644 index 000000000..7b99a14a2 --- /dev/null +++ b/Tests/Foundation/CPNullTest.j @@ -0,0 +1,12 @@ +@import +@import +@import + +@implementation CPNullTest : OJTestCase + +- (void)testArchiving +{ + [self assert:[CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:[CPNull null]]] equals:[CPNull null]]; +} + +@end \ No newline at end of file From 639a32ea7ecfdb3a098e8e116a72301029506b5c Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Thu, 15 Apr 2010 17:03:33 -0400 Subject: [PATCH 005/175] CPWindow alpha value support. --- AppKit/CPWindow/CPWindow.j | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 7a916d9eb..219963545 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -883,6 +883,23 @@ CPTexturedBackgroundWindowMask return _contentView; } +/*! + Applies an alpha value to the window. + @param aValue the alpha value to apply +*/ +- (void)setAlphaValue:(float)aValue +{ + [_windowView setAlphaValue:aValue]; +} + +/*! + Returns the alpha value of the window. +*/ +- (float)alphaValue +{ + return [_windowView alphaValue]; +} + /*! Sets the window's background color. @param aColor the new color for the background From 388f008189c58a046057b6a67b92edf37065999d Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Thu, 15 Apr 2010 23:48:30 -0400 Subject: [PATCH 006/175] Fixed: CPCollectionView frameForItemsAtIndexes used the deprecated method rectForItemAtIndex causing warnings. --- AppKit/CPCollectionView.j | 150 +++++++++++++++++++------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index 10c017f23..1f71f5876 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -30,16 +30,16 @@ @import "CPCollectionViewItem.j" -/*! +/*! @ingroup appkit @class CPCollectionView - This class displays an array as a grid of objects, where each object is represented by a view. - The view is controlled by creating a CPCollectionViewItem and specifying its view, then + This class displays an array as a grid of objects, where each object is represented by a view. + The view is controlled by creating a CPCollectionViewItem and specifying its view, then setting that item as the collection view prototype. - + @par Delegate Methods - + @delegate -(void)collectionViewDidChangeSelection:(CPCollectionView)collectionView; Called when the selection in the collection view has changed. @param collectionView the collection view who's selection changed @@ -67,35 +67,35 @@ { CPArray _content; CPArray _items; - + CPData _itemData; CPCollectionViewItem _itemPrototype; CPCollectionViewItem _itemForDragging; CPMutableArray _cachedItems; - + unsigned _maxNumberOfRows; unsigned _maxNumberOfColumns; - + CGSize _minItemSize; CGSize _maxItemSize; CPArray _backgroundColors; float _tileWidth; - + BOOL _isSelectable; BOOL _allowsMultipleSelection; BOOL _allowsEmptySelection; CPIndexSet _selectionIndexes; - + CGSize _itemSize; - + float _horizontalMargin; float _verticalMargin; - + unsigned _numberOfRows; unsigned _numberOfColumns; - + id _delegate; CPEvent _mouseDownEvent; @@ -104,14 +104,14 @@ - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; - + if (self) { _items = []; _content = []; - + _cachedItems = []; - + _itemSize = CGSizeMakeZero(); _minItemSize = CGSizeMakeZero(); _maxItemSize = CGSizeMakeZero(); @@ -120,12 +120,12 @@ _verticalMargin = 5.0; _tileWidth = -1.0; - + _selectionIndexes = [CPIndexSet indexSet]; _allowsEmptySelection = YES; _isSelectable = YES; } - + return self; } @@ -196,8 +196,8 @@ // Setting the Content /*! - Sets the content of the collection view to the content in \c anArray. - This array can be of any type, and each element will be passed to the \c -setRepresentedObject: method. + Sets the content of the collection view to the content in \c anArray. + This array can be of any type, and each element will be passed to the \c -setRepresentedObject: method. It's the responsibility of your custom collection view item to interpret the object. @param anArray the content array */ @@ -205,9 +205,9 @@ { if (_content == anArray) return; - + _content = anArray; - + [self reloadContent]; } @@ -236,13 +236,13 @@ { if (_isSelectable == isSelectable) return; - + _isSelectable = isSelectable; - + if (!_isSelectable) { var index = CPNotFound; - + while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound) [_items[index] setSelected:NO]; } @@ -299,19 +299,19 @@ { if (_selectionIndexes == anIndexSet || !_isSelectable) return; - + var index = CPNotFound; - + while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound) [_items[index] setSelected:NO]; - + _selectionIndexes = anIndexSet; - + var index = CPNotFound; - + while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound) [_items[index] setSelected:YES]; - + if ([_delegate respondsToSelector:@selector(collectionViewDidChangeSelection:)]) [_delegate collectionViewDidChangeSelection:self] } @@ -326,10 +326,10 @@ /* @ignore */ - (void)reloadContent -{ +{ // Remove current views var count = _items.length; - + while (count--) { [[_items[count] view] removeFromSuperview]; @@ -337,7 +337,7 @@ _cachedItems.push(_items[count]); } - + _items = []; if (!_itemPrototype || !_content) @@ -350,7 +350,7 @@ for (; index < count; ++index) { _items.push([self newItemForRepresentedObject:_content[index]]); - + [self addSubview:[_items[index] view]]; } @@ -365,49 +365,49 @@ - (void)tile { var width = CGRectGetWidth([self bounds]); - + if (![_content count] || width == _tileWidth) return; - - // We try to fit as many views per row as possible. Any remaining space is then + + // We try to fit as many views per row as possible. Any remaining space is then // either proportioned out to the views (if their minSize != maxSize) or used as // margin var itemSize = CGSizeMakeCopy(_minItemSize); - + _numberOfColumns = MAX(1.0, FLOOR(width / itemSize.width)); - + if (_maxNumberOfColumns > 0) _numberOfColumns = MIN(_maxNumberOfColumns, _numberOfColumns); - + var remaining = width - _numberOfColumns * itemSize.width, itemsNeedSizeUpdate = NO; - + if (remaining > 0 && itemSize.width < _maxItemSize.width) itemSize.width = MIN(_maxItemSize.width, itemSize.width + FLOOR(remaining / _numberOfColumns)); - + // When we ONE column and a non-integral width, the FLOORing above can cause the item width to be smaller than the total width. if (_maxNumberOfColumns == 1 && itemSize.width < _maxItemSize.width && itemSize.width < width) itemSize.width = MIN(_maxItemSize.width, width); - + if (!CGSizeEqualToSize(_itemSize, itemSize)) { _itemSize = itemSize; itemsNeedSizeUpdate = YES; } - + var index = 0, count = _items.length; - + if (_maxNumberOfColumns > 0 && _maxNumberOfRows > 0) count = MIN(count, _maxNumberOfColumns * _maxNumberOfRows); - + _numberOfRows = CEIL(count / _numberOfColumns); _horizontalMargin = FLOOR((width - _numberOfColumns * itemSize.width) / (_numberOfColumns + 1)); - + var x = _horizontalMargin, y = -itemSize.height; - + for (; index < count; ++index) { if (index % _numberOfColumns == 0) @@ -415,17 +415,17 @@ x = _horizontalMargin; y += _verticalMargin + itemSize.height; } - + var view = [_items[index] view]; - + [view setFrameOrigin:CGPointMake(x, y)]; - + if (itemsNeedSizeUpdate) [view setFrameSize:_itemSize]; - + x += itemSize.width + _horizontalMargin; } - + _tileWidth = width; [self setFrameSize:CGSizeMake(width, y + itemSize.height + _verticalMargin)]; _tileWidth = -1.0; @@ -445,9 +445,9 @@ { if (_maxNumberOfRows == aMaxNumberOfRows) return; - + _maxNumberOfRows = aMaxNumberOfRows; - + [self tile]; } @@ -467,9 +467,9 @@ { if (_maxNumberOfColumns == aMaxNumberOfColumns) return; - + _maxNumberOfColumns = aMaxNumberOfColumns; - + [self tile]; } @@ -506,9 +506,9 @@ { if (CGSizeEqualToSize(_minItemSize, aSize)) return; - + _minItemSize = CGSizeMakeCopy(aSize); - + [self tile]; } @@ -528,9 +528,9 @@ { if (CGSizeEqualToSize(_maxItemSize, aSize)) return; - + _maxItemSize = CGSizeMakeCopy(aSize); - + [self tile]; } @@ -656,9 +656,9 @@ { if (_verticalMargin == aVerticalMargin) return; - + _verticalMargin = aVerticalMargin; - + [self tile]; } @@ -709,7 +709,7 @@ count = [indexArray count]; for (; index < count; ++index) - frame = CGRectUnion(frame, [self rectForItemAtIndex:indexArray[index]]); + frame = CGRectUnion(frame, [self frameForItemAtIndex:indexArray[index]]); return frame; } @@ -729,7 +729,7 @@ - (void)moveLeft:(id)sender { var index = [[self selectionIndexes] firstIndex]; - if (index === CPNotFound) + if (index === CPNotFound) index = [[self items] count]; index = MAX(index - 1, 0); @@ -757,7 +757,7 @@ - (void)moveUp:(id)sender { var index = [[self selectionIndexes] firstIndex]; - if (index == CPNotFound) + if (index == CPNotFound) index = [[self items] count]; index = MAX(0, index - [self numberOfColumns]); @@ -829,20 +829,20 @@ var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeKey", _cachedItems = []; _itemSize = CGSizeMakeZero(); - + _minItemSize = [aCoder decodeSizeForKey:CPCollectionViewMinItemSizeKey] || CGSizeMakeZero(); _maxItemSize = [aCoder decodeSizeForKey:CPCollectionViewMaxItemSizeKey] || CGSizeMakeZero(); - + _verticalMargin = [aCoder decodeFloatForKey:CPCollectionViewVerticalMarginKey]; - + _isSelectable = [aCoder decodeBoolForKey:CPCollectionViewSelectableKey]; [self setBackgroundColors:[aCoder decodeObjectForKey:CPCollectionViewBackgroundColorsKey]]; - + _tileWidth = -1.0; _selectionIndexes = [CPIndexSet indexSet]; - + _allowsEmptySelection = YES; } @@ -855,12 +855,12 @@ var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeKey", if (!CGSizeEqualToSize(_minItemSize, CGSizeMakeZero())) [aCoder encodeSize:_minItemSize forKey:CPCollectionViewMinItemSizeKey]; - + if (!CGSizeEqualToSize(_maxItemSize, CGSizeMakeZero())) [aCoder encodeSize:_maxItemSize forKey:CPCollectionViewMaxItemSizeKey]; - + [aCoder encodeBool:_isSelectable forKey:CPCollectionViewSelectableKey]; - + [aCoder encodeFloat:_verticalMargin forKey:CPCollectionViewVerticalMarginKey]; [aCoder encodeObject:_backgroundColors forKey:CPCollectionViewBackgroundColorsKey]; From 0f5dd9d4694db4a62e0ab0599ee60e215681313e Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 16 Apr 2010 00:55:48 -0400 Subject: [PATCH 007/175] [CPSet description] with unit test. --- Foundation/CPSet.j | 43 ++++++++++++++++++++---------------- Tests/Foundation/CPSetTest.j | 13 +++++++++++ 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Foundation/CPSet.j b/Foundation/CPSet.j index 7026a376e..ad596c0fd 100644 --- a/Foundation/CPSet.j +++ b/Foundation/CPSet.j @@ -23,7 +23,7 @@ * * TODO: Needs to implement CPCoding, CPCopying. */ - + @import "CPObject.j" @import "CPArray.j" @import "CPNumber.j" @@ -79,7 +79,7 @@ /* Creates and returns a set containing the objects in a given argument list. @param anObject The first object to add to the new set. - @param ... A comma-separated list of objects, ending with nil, to add to the new set. If the same object appears more than once objects, it is added only once to the returned set. + @param ... A comma-separated list of objects, ending with nil, to add to the new set. If the same object appears more than once objects, it is added only once to the returned set. */ + (id)setWithObjects:(id)anObject, ... { @@ -89,7 +89,7 @@ for(; i < argLength && ((argument = arguments[i]) !== nil); ++i) [set addObject:argument]; - + return set; } @@ -112,7 +112,7 @@ _count = 0; _contents = {}; } - + return self; } @@ -121,21 +121,21 @@ @param array An array of objects to add to the new set. If the same object appears more than once in array, it is represented only once in the returned set. */ - (id)initWithArray:(CPArray)anArray -{ +{ if (self = [self init]) { var count = anArray.length; - + while (count--) [self addObject:anArray[count]]; } - + return self; } /* Initializes a newly allocated set with members taken from the specified list of objects. - @param objects A array of objects to add to the new set. If the same object appears more than once objects, it is added only once to the returned set. + @param objects A array of objects to add to the new set. If the same object appears more than once objects, it is added only once to the returned set. @param count The number of objects from objects to add to the new set. */ - (id)initWithObjects:(id)objects count:(unsigned)count @@ -158,7 +158,7 @@ for(; i < argLength && (argument = arguments[i]) != nil; ++i) [self addObject:argument]; } - + return self; } @@ -179,9 +179,9 @@ if (!aSet) return self; - + var contents = aSet._contents; - + for (var property in contents) { if (contents.hasOwnProperty(property)) @@ -192,7 +192,7 @@ [self addObject:contents[property]]; } } - + return self; } @@ -202,13 +202,13 @@ - (CPArray)allObjects { var array = []; - + for (var property in _contents) { if (_contents.hasOwnProperty(property)) array.push(_contents[property]); } - + return array; } @@ -222,7 +222,7 @@ if (_contents.hasOwnProperty(property)) return _contents[property]; } - + return nil; } @@ -236,7 +236,7 @@ if (obj !== undefined && [obj isEqual:anObject]) return YES; - + return NO; } @@ -277,7 +277,7 @@ @param set The set with which to compare the receiver. */ - (BOOL)isEqualToSet:(CPSet)set -{ +{ // If both are subsets of each other, they are equal return self === set || ([self count] === [set count] && [set isSubsetOfSet:self]); } @@ -295,7 +295,7 @@ if (![set containsObject:items[i]]) return NO; } - + return YES; } @@ -330,7 +330,7 @@ { if ([self containsObject:object]) return object; - + return nil; } @@ -467,6 +467,11 @@ } } +- (CPString)description +{ + return @"{(" + [self allObjects].join(", ") + ")}"; +} + @end @implementation CPSet (CPCopying) diff --git a/Tests/Foundation/CPSetTest.j b/Tests/Foundation/CPSetTest.j index 905d8fdb8..e8f4fd162 100644 --- a/Tests/Foundation/CPSetTest.j +++ b/Tests/Foundation/CPSetTest.j @@ -56,4 +56,17 @@ [self assertFalse:[set containsObject:nil]]; } +- (void)testDescription +{ + [self assert:@"{()}" equals:[set description]]; + [set addObject:"horizon"]; + [set addObject:"surfer"]; + [set addObject:"7"]; + var desc = [set description]; + // Ordering may not be guaranteed. + [self assertTrue:desc.match(new RegExp("{\(.*horizon.*\)}"))]; + [self assertTrue:desc.match(new RegExp("{\(.*surfer.*\)}"))]; + [self assertTrue:desc.match(new RegExp("{\(.*7.*\)}"))]; +} + @end From a7021e6b664d992231eccfe257b772bee5845f9e Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sat, 17 Apr 2010 15:28:33 -0400 Subject: [PATCH 008/175] Fixed a parameter type typo. --- AppKit/CPTextField.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 7459fa772..acaf4139b 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -997,7 +997,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); return bounds; } -- (CGRect)bezelRectForBounds:(CFRect)bounds +- (CGRect)bezelRectForBounds:(CGRect)bounds { var bezelInset = [self currentValueForThemeAttribute:@"bezel-inset"]; From 4479233beaa4ebc268e2550ef8f5211ab91fc444 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Wed, 21 Apr 2010 20:57:53 -0700 Subject: [PATCH 009/175] Return nil fonts if they are the aristo default, so that the theme default is used instead of the arist default (for custom themes). --- Tools/nib2cib/NSFont.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/nib2cib/NSFont.j b/Tools/nib2cib/NSFont.j index 35508f4e9..41643eb22 100644 --- a/Tools/nib2cib/NSFont.j +++ b/Tools/nib2cib/NSFont.j @@ -33,8 +33,8 @@ if ((fontName === "LucidaGrande" || fontName === "LucidaGrande-Bold") && size === 13) { - CPLog.debug("Converting default IB font: <"+fontName+", "+size+"> to default Aristo font: "); - return [CPFont boldSystemFontOfSize:12.0]; + CPLog.debug("Removing default IB font: <"+fontName+", "+size+"> for theme default font."); + return nil; } // FIXME: Is this alwasy true? From 72a3888062e8e9dc26f6b016db4ba25b4097b632 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Wed, 21 Apr 2010 22:55:46 -0700 Subject: [PATCH 010/175] Add ObjectiveJ global to CommonJS so that references to it aren't broken in Cappuccino. Reviewed by me. --- Objective-J/CommonJS/lib/objective-j.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Objective-J/CommonJS/lib/objective-j.js b/Objective-J/CommonJS/lib/objective-j.js index 1134dc857..444c47806 100644 --- a/Objective-J/CommonJS/lib/objective-j.js +++ b/Objective-J/CommonJS/lib/objective-j.js @@ -182,5 +182,11 @@ exports.fullVersionString = function() { ); } +global.ObjectiveJ = {}; + +for (key in exports) + if (Object.prototype.hasOwnProperty.call(exports, key)) + global.ObjectiveJ[key] = exports[key]; + if (require.main == module.id) exports.run(system.args); From 6b3600d67b05b4af61451435b4871d63be3a8c9a Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Thu, 22 Apr 2010 11:50:06 -0700 Subject: [PATCH 011/175] Slight update to button bar theme values. --- AppKit/CPButtonBar.j | 41 ++++++++++++------------- AppKit/Themes/Aristo/ThemeDescriptors.j | 1 + 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j index daf2e9518..1f63473de 100644 --- a/AppKit/CPButtonBar.j +++ b/AppKit/CPButtonBar.j @@ -16,6 +16,7 @@ var button = [[CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)], image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"plus_button.png"] size:CGSizeMake(11, 12)]; + [button setBordered:NO]; [button setImage:image]; [button setImagePosition:CPImageOnly]; @@ -27,6 +28,7 @@ var button = [[CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)], image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"minus_button.png"] size:CGSizeMake(11, 4)]; + [button setBordered:NO]; [button setImage:image]; [button setImagePosition:CPImageOnly]; @@ -40,8 +42,8 @@ + (id)themeAttributes { - return [CPDictionary dictionaryWithObjects:[CGInsetMake(0.0, 0.0, 0.0, 0.0), CGSizeMakeZero(), [CPNull null], [CPNull null], [CPNull null]] - forKeys:[@"resize-control-inset", @"resize-control-size", @"resize-control-color", @"bezel-color", @"button-bezel-color"]]; + return [CPDictionary dictionaryWithObjects:[CGInsetMake(0.0, 0.0, 0.0, 0.0), CGSizeMakeZero(), [CPNull null], [CPNull null], [CPNull null], [CPNull null]] + forKeys:[@"resize-control-inset", @"resize-control-size", @"resize-control-color", @"bezel-color", @"button-bezel-color", @"button-text-color"]]; } - (id)initWithFrame:(CGRect)aFrame @@ -82,25 +84,8 @@ _buttons = [CPArray arrayWithArray:buttons]; for (var i = 0, count = [_buttons count]; i < count; i++) - { - var button = _buttons[i]; + [_buttons[i] setBordered:YES]; - var normalColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateNormal], - highlightedColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateHighlighted], - disabledColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateDisabled]; - - [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal|CPThemeStateBordered]; - [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted|CPThemeStateBordered]; - [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled|CPThemeStateBordered]; - - // FIXME shouldn't need this - [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal|CPThemeStateBordered|CPPopUpButtonStatePullsDown]; - [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted|CPThemeStateBordered|CPPopUpButtonStatePullsDown]; - [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled|CPThemeStateBordered|CPPopUpButtonStatePullsDown]; - - [button setBordered:YES]; - } - [self setNeedsLayout]; } @@ -176,6 +161,11 @@ { [self setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; + var normalColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateNormal], + highlightedColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateHighlighted], + disabledColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateDisabled], + textColor = [self valueForThemeAttribute:@"button-text-color" inState:CPThemeStateNormal]; + var buttonsNotHidden = [CPArray arrayWithArray:_buttons], count = [buttonsNotHidden count]; @@ -202,6 +192,16 @@ currentButtonOffset += width - 1; } + [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal|CPThemeStateBordered]; + [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted|CPThemeStateBordered]; + [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled|CPThemeStateBordered]; + [button setValue:textColor forThemeAttribute:@"text-color" inState:CPThemeStateBordered]; + + // FIXME shouldn't need this + [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal|CPThemeStateBordered|CPPopUpButtonStatePullsDown]; + [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted|CPThemeStateBordered|CPPopUpButtonStatePullsDown]; + [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled|CPThemeStateBordered|CPPopUpButtonStatePullsDown]; + [self addSubview:button]; } @@ -246,4 +246,3 @@ var CPButtonBarHasResizeControlKey = @"CPButtonBarHasResizeControlKey", } @end - diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index eb7e8f50e..c4b67cb67 100644 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -761,6 +761,7 @@ [buttonBar setValue:buttonBezelColor forThemeAttribute:@"button-bezel-color"]; [buttonBar setValue:buttonBezelHighlightedColor forThemeAttribute:@"button-bezel-color" inState:CPThemeStateHighlighted]; [buttonBar setValue:buttonBezelDisabledColor forThemeAttribute:@"button-bezel-color" inState:CPThemeStateDisabled]; + [buttonBar setValue:[CPColor blackColor] forThemeAttribute:@"button-text-color"]; [buttonBar setButtons:[[CPButtonBar plusButton], [CPButtonBar minusButton], [self themedPullDownMenu]]]; From ab6d5d6a90e5fde6a805cfea2dccf703f0de5b67 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Fri, 23 Apr 2010 01:21:44 -0400 Subject: [PATCH 012/175] Added connectionDidFinsihLoading delegate to CPJSONPConnection --- Foundation/CPJSONPConnection.j | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Foundation/CPJSONPConnection.j b/Foundation/CPJSONPConnection.j index 8ec76e0e7..a29ab4032 100644 --- a/Foundation/CPJSONPConnection.j +++ b/Foundation/CPJSONPConnection.j @@ -88,7 +88,12 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; { CPJSONPConnectionCallbacks["callback"+[self UID]] = function(data) { - [_delegate connection:self didReceiveData:data]; + if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) + [_delegate connection:self didReceiveData:data]; + + if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)]) + [_delegate connectionDidFinishLoading:self]; + [self removeScriptTag]; [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; @@ -118,7 +123,9 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; } catch (exception) { - [_delegate connection: self didFailWithError: exception]; + if ([_delegate respondsToSelector:@selector(connection:didFailWithError:)]) + [_delegate connection: self didFailWithError: exception]; + [self removeScriptTag]; } } From 39bb8e341896050afa7b5d8d6489493898c3571f Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Fri, 23 Apr 2010 16:34:40 +0200 Subject: [PATCH 013/175] added enumerateWithBlock: to CPArray --- Foundation/CPArray.j | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j index 949b900ac..6d474a361 100755 --- a/Foundation/CPArray.j +++ b/Foundation/CPArray.j @@ -1235,6 +1235,18 @@ sort(function(lhs, rhs) { return objj_msgSend(lhs, aSelector, rhs); }); } +- (void)enumerateObjectsUsingBlock:(Function)aBlock +{ + for (var i = 0; i < self.length; i++) + { + var shouldStop = NO; + aBlock(self[i], i, shouldStop); + + if (shouldStop) + break; + } +} + @end @implementation CPArray (CPCoding) From 31f408478a91ab665e0d45b80dfa095d8064de4e Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Fri, 23 Apr 2010 12:02:25 -0700 Subject: [PATCH 014/175] Update to scrolling behavior. --- AppKit/CPBrowser.j | 4 +++- AppKit/CPClipView.j | 34 ++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/AppKit/CPBrowser.j b/AppKit/CPBrowser.j index e92a547af..3f0d6b09b 100644 --- a/AppKit/CPBrowser.j +++ b/AppKit/CPBrowser.j @@ -324,10 +324,12 @@ - (unsigned)columnAtPoint:(CGPoint)aPoint { + var adjustedPoint = [_contentView convertPoint:aPoint fromView:self]; + for (var i = 0, count = _tableViews.length; i < count; i++) { var frame = [[_tableViews[i] enclosingScrollView] frame]; - if (CGRectContainsPoint(frame, aPoint)) + if (CGRectContainsPoint(frame, adjustedPoint)) return i; } diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index f1dc67e10..2fa6ce1ad 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -190,17 +190,39 @@ - (BOOL)autoscroll:(CPEvent)anEvent { var bounds = [self bounds], - eventLocation = [self convertPoint:[anEvent locationInWindow] fromView:nil]; + location = [self convertPoint:[event locationInWindow] fromView:nil], + superview = [self superview], + deltaX = 0, + deltaY = 0; - if (CPRectContainsPoint(bounds, eventLocation)) + if (CGRectContainsPoint(bounds, location)) return NO; - var newRect = CGRectMakeZero(); + if (![superview isKindOfClass:[CPScrollView class]] || [superview hasVerticalScroller]) + { + if (location.y < CGRectGetMinY(bounds)) + deltaY = CGRectGetMinY(bounds) - location.y; + else if (location.y > CGRectGetMaxY(bounds)) + deltaY = CGRectGetMaxY(bounds) - location.y; + if (deltaY < -bounds.size.height) + deltaY = -bounds.size.height; + if (deltaY > bounds.size.height) + deltaY = bounds.size.height; + } - newRect.origin = eventLocation; - newRect.size = CPSizeMake(10, 10); + if (![superview isKindOfClass:[CPScrollView class]] || [superview hasHorizontalScroller]) + { + if (location.x < CGRectGetMinX(bounds)) + deltaX = CGRectGetMinX(bounds) - location.x; + else if (location.x > CGRectGetMaxX(bounds)) + deltaX = CGRectGetMaxX(bounds) - location.x; + if (deltaX < -bounds.size.width) + deltaX = -bounds.size.width; + if (deltaX > bounds.size.width) + deltaX = bounds.size.width; + } - return [_documentView scrollRectToVisible:newRect]; + return [self scrollToPoint:CGPointMake(bounds.origin.x - deltaX, bounds.origin.y - deltaY)]; } @end From f67580e2b2b34b6f816fc2bf1d74ba2524b5cc73 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Fri, 23 Apr 2010 14:00:47 -0700 Subject: [PATCH 015/175] Add support for automatically scrolling during drag and drop operations. --- AppKit/CPClipView.j | 20 +++---- AppKit/CPDragServer.j | 121 ++++++++++++++++++++++++++++++++---------- 2 files changed, 102 insertions(+), 39 deletions(-) diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index 2fa6ce1ad..654cec576 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -190,20 +190,20 @@ - (BOOL)autoscroll:(CPEvent)anEvent { var bounds = [self bounds], - location = [self convertPoint:[event locationInWindow] fromView:nil], + eventLocation = [self convertPoint:[event locationInWindow] fromView:nil], superview = [self superview], deltaX = 0, deltaY = 0; - if (CGRectContainsPoint(bounds, location)) + if (CGRectContainsPoint(bounds, eventLocation)) return NO; if (![superview isKindOfClass:[CPScrollView class]] || [superview hasVerticalScroller]) { - if (location.y < CGRectGetMinY(bounds)) - deltaY = CGRectGetMinY(bounds) - location.y; - else if (location.y > CGRectGetMaxY(bounds)) - deltaY = CGRectGetMaxY(bounds) - location.y; + if (eventLocation.y < CGRectGetMinY(bounds)) + deltaY = CGRectGetMinY(bounds) - eventLocation.y; + else if (eventLocation.y > CGRectGetMaxY(bounds)) + deltaY = CGRectGetMaxY(bounds) - eventLocation.y; if (deltaY < -bounds.size.height) deltaY = -bounds.size.height; if (deltaY > bounds.size.height) @@ -212,10 +212,10 @@ if (![superview isKindOfClass:[CPScrollView class]] || [superview hasHorizontalScroller]) { - if (location.x < CGRectGetMinX(bounds)) - deltaX = CGRectGetMinX(bounds) - location.x; - else if (location.x > CGRectGetMaxX(bounds)) - deltaX = CGRectGetMaxX(bounds) - location.x; + if (eventLocation.x < CGRectGetMinX(bounds)) + deltaX = CGRectGetMinX(bounds) - eventLocation.x; + else if (eventLocation.x > CGRectGetMaxX(bounds)) + deltaX = CGRectGetMaxX(bounds) - eventLocation.x; if (deltaX < -bounds.size.width) deltaX = -bounds.size.width; if (deltaX > bounds.size.width) diff --git a/AppKit/CPDragServer.j b/AppKit/CPDragServer.j index 06f8d2435..42e03893e 100644 --- a/AppKit/CPDragServer.j +++ b/AppKit/CPDragServer.j @@ -40,29 +40,10 @@ CPDragOperationEvery = -1; #define DRAGGING_WINDOW(anObject) ([anObject isKindOfClass:[CPWindow class]] ? anObject : [anObject window]) -var CPDragServerPreviousEvent = nil, -CPDragServerAutoscrollInterval = nil; -/* -var CPDragServerAutoscroll = function() -{ - [CPDragServerSource autoscroll:CPDragServerPreviousEvent]; -} +var CPDragServerPreviousEvent = nil, + CPDragServerPeriodicUpdateInterval = 0.05; - if (CPDragServerAutoscrollInterval === nil) - { - if ([CPDragServerSource respondsToSelector:@selector(autoscroll:)]) - CPDragServerAutoscrollInterval = setInterval(CPDragServerAutoscroll, 100); - } - - CPDragServerPreviousEvent = anEvent; - - if (CPDragServerAutoscrollInterval !== nil) - clearInterval(CPDragServerAutoscrollInterval); - - CPDragServerAutoscrollInterval = nil; -*/ - -var CPSharedDragServer = nil; +var CPSharedDragServer = nil; var CPDragServerSource = nil; var CPDragServerDraggingInfo = nil; @@ -150,10 +131,13 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0, CGPoint _draggingLocation; id _draggingDestination; + BOOL _draggingDestinationWantsPeriodicUpdates; CGPoint _startDragLocation; BOOL _shouldSlideBack; unsigned _dragOperation; + + CPTimer _draggingUpdateTimer; } /* @@ -234,6 +218,9 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0, - (CPDragOperation)draggingUpdatedInPlatformWindow:(CPPlatformWindow)aPlatformWindow location:(CGPoint)aLocation { + [_draggingUpdateTimer invalidate]; + _draggingUpdateTimer = nil; + var dragOperation = CPDragOperationCopy; // We have to convert base to bridge since the drag event comes from the source window, not the drag window. var draggingDestination = [aPlatformWindow _dragHitTest:aLocation pasteboard:[CPDragServerDraggingInfo draggingPasteboard]]; @@ -243,25 +230,89 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0, if(draggingDestination !== _draggingDestination) { - if (_draggingDestination && [_draggingDestination respondsToSelector:@selector(draggingExited:)]) + if ([_draggingDestination respondsToSelector:@selector(draggingExited:)]) [_draggingDestination draggingExited:CPDragServerDraggingInfo]; _draggingDestination = draggingDestination; - if (_draggingDestination && [_draggingDestination respondsToSelector:@selector(draggingEntered:)]) + if ([_draggingDestination respondsToSelector:@selector(wantsPeriodicDraggingUpdates)]) + _draggingDestinationWantsPeriodicUpdates = [_draggingDestination wantsPeriodicDraggingUpdates]; + else + _draggingDestinationWantsPeriodicUpdates = YES; + + if ([_draggingDestination respondsToSelector:@selector(draggingEntered:)]) dragOperation = [_draggingDestination draggingEntered:CPDragServerDraggingInfo]; } - else if (_draggingDestination && [_draggingDestination respondsToSelector:@selector(draggingUpdated:)]) + else if ([_draggingDestination respondsToSelector:@selector(draggingUpdated:)]) dragOperation = [_draggingDestination draggingUpdated:CPDragServerDraggingInfo]; if (!_draggingDestination) dragOperation = CPDragOperationNone; + else + { + if (_draggingDestinationWantsPeriodicUpdates) + _draggingUpdateTimer = [CPTimer scheduledTimerWithTimeInterval:CPDragServerPeriodicUpdateInterval + target:self + selector:@selector(_sendPeriodicDraggingUpdate:) + userInfo:[CPDictionary dictionaryWithJSObject:{platformWindow:aPlatformWindow, location:aLocation}] + repeats:NO]; + + var scrollView = [_draggingDestination enclosingScrollView]; + if (scrollView) + { + var contentView = [scrollView contentView], + bounds = [contentView bounds], + insetBounds = CGRectInset(bounds, 10, 10) + eventLocation = [contentView convertPoint:_draggingLocation fromView:nil], + deltaX = 0, + deltaY = 0; + + if (!CGRectContainsPoint(insetBounds, eventLocation)) + { + if ([scrollView hasVerticalScroller]) + { + if (eventLocation.y < CGRectGetMinY(insetBounds)) + deltaY = CGRectGetMinY(insetBounds) - eventLocation.y; + else if (eventLocation.y > CGRectGetMaxY(insetBounds)) + deltaY = CGRectGetMaxY(insetBounds) - eventLocation.y; + if (deltaY < -insetBounds.size.height) + deltaY = -insetBounds.size.height; + if (deltaY > insetBounds.size.height) + deltaY = insetBounds.size.height; + } + + if ([scrollView hasHorizontalScroller]) + { + if (eventLocation.x < CGRectGetMinX(insetBounds)) + deltaX = CGRectGetMinX(insetBounds) - eventLocation.x; + else if (eventLocation.x > CGRectGetMaxX(insetBounds)) + deltaX = CGRectGetMaxX(insetBounds) - eventLocation.x; + if (deltaX < -insetBounds.size.width) + deltaX = -insetBounds.size.width; + if (deltaX > insetBounds.size.width) + deltaX = insetBounds.size.width; + } + + [contentView scrollToPoint:CGPointMake(bounds.origin.x - deltaX, bounds.origin.y - deltaY)]; + } + } + } return dragOperation; } +- (void)_sendPeriodicDraggingUpdate:(CPTimer)aTimer +{ + var userInfo = [aTimer userInfo]; + _dragOperation = [self draggingUpdatedInPlatformWindow:[userInfo objectForKey:@"platformWindow"] + location:[userInfo objectForKey:@"location"]]; +} + - (void)draggingEndedInPlatformWindow:(CPPlatformWindow)aPlatformWindow globalLocation:(CGPoint)aLocation operation:(CPDragOperation)anOperation { + [_draggingUpdateTimer invalidate]; + _draggingUpdateTimer = nil; + [_draggedView removeFromSuperview]; if (![CPPlatform supportsDragAndDrop]) @@ -404,13 +455,25 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0, // Stop tracking events. return; } - - [self draggingSourceUpdatedWithGlobalLocation:platformWindowLocation]; - _dragOperation = [self draggingUpdatedInPlatformWindow:platformWindow location:platformWindowLocation]; + else if (type === CPKeyDown) + { + var keyCode = [anEvent keyCode]; + if (keyCode === CPEscapeKeyCode) + { + _dragOperation = CPDragOperationNone; + [self draggingEndedInPlatformWindow:platformWindow globalLocation:CGPointMakeZero() operation:_dragOperation]; + return; + } + } + else + { + [self draggingSourceUpdatedWithGlobalLocation:platformWindowLocation]; + _dragOperation = [self draggingUpdatedInPlatformWindow:platformWindow location:platformWindowLocation]; + } // If we're not a mouse up, then we're going to want to grab the next event. [CPApp setTarget:self selector:@selector(trackDragging:) - forNextEventMatchingMask:CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask + forNextEventMatchingMask:CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPKeyDownMask untilDate:nil inMode:0 dequeue:NO]; } From e1ad4a2fceac2624187983762aea87cf2d4b09bc Mon Sep 17 00:00:00 2001 From: cacaodev Date: Fri, 23 Apr 2010 23:28:14 +0200 Subject: [PATCH 016/175] CPTableView: remove custom scrolling now that it's handled in the CPDragServer + CPClipView --- AppKit/CPTableView.j | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index cbc4894a4..456ee086f 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -2874,14 +2874,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; [_dropOperationFeedbackView setFrame:rect]; [_dropOperationFeedbackView setCurrentRow:row]; [self addSubview:_dropOperationFeedbackView]; - - // FIXME : Maybe we should do this in a timer outside this method. - // Problem: we don't know when the scroll ends or when the next -draggingUpdated is called. - if (row > 0 && location.y - CGRectGetMinY(exposedClipRect) < _rowHeight) - [self scrollRowToVisible:row - 1]; - else if (row < numberOfRows && CGRectGetMaxY(exposedClipRect) - location.y < _rowHeight) - [self scrollRowToVisible:row + 1]; - + return dragOperation; } From 14f0d16fae939a113ad2871e78853e180a99e11c Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Fri, 23 Apr 2010 16:16:46 -0700 Subject: [PATCH 017/175] Update scrollWheel: to propagate unused scroll deltas to parent scroll views. --- AppKit/CPScrollView.j | 29 +++++++++++++++++----- Tests/Manual/CPBrowserTest/AppController.j | 10 ++++++++ Tests/Manual/CPBrowserTest/CPBrowser.j | 1 - 3 files changed, 33 insertions(+), 7 deletions(-) delete mode 120000 Tests/Manual/CPBrowserTest/CPBrowser.j diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index 82badfea4..b55931abf 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -670,15 +670,32 @@ */ - (void)scrollWheel:(CPEvent)anEvent { - var documentFrame = [[self documentView] frame], - contentBounds = [_contentView bounds]; + [self _respondToScrollWheelEventWithDeltaX:[anEvent deltaX] * _horizontalLineScroll + deltaY:[anEvent deltaY] * _verticalLineScroll]; +} + +- (void)_respondToScrollWheelEventWithDeltaX:(float)deltaX deltaY:(float)deltaY +{ + var documentFrame = [[self documentView] frame], + contentBounds = [_contentView bounds], + contentFrame = [_contentView frame], + enclosingScrollView = [self enclosingScrollView], + extraX = 0, + extraY = 0; // We want integral bounds! - contentBounds.origin.x = ROUND(contentBounds.origin.x + [anEvent deltaX] * _horizontalLineScroll); - contentBounds.origin.y = ROUND(contentBounds.origin.y + [anEvent deltaY] * _verticalLineScroll); + contentBounds.origin.x = ROUND(contentBounds.origin.x + deltaX); + contentBounds.origin.y = ROUND(contentBounds.origin.y + deltaY); - [_contentView scrollToPoint:contentBounds.origin]; - [_headerClipView scrollToPoint:CGPointMake(contentBounds.origin.x, 0.0)]; + var constrainedOrigin = [_contentView constrainScrollPoint:CGPointCreateCopy(contentBounds.origin)]; + extraX = ((contentBounds.origin.x - constrainedOrigin.x) / _horizontalLineScroll) * [enclosingScrollView horizontalLineScroll]; + extraY = ((contentBounds.origin.y - constrainedOrigin.y) / _verticalLineScroll) * [enclosingScrollView verticalLineScroll]; + + [_contentView scrollToPoint:constrainedOrigin]; + [_headerClipView scrollToPoint:CGPointMake(constrainedOrigin.x, 0.0)]; + + if (extraX || extraY) + [enclosingScrollView _respondToScrollWheelEventWithDeltaX:extraX deltaY:extraY]; } - (void)keyDown:(CPEvent)anEvent diff --git a/Tests/Manual/CPBrowserTest/AppController.j b/Tests/Manual/CPBrowserTest/AppController.j index d70984352..9a002c9b2 100644 --- a/Tests/Manual/CPBrowserTest/AppController.j +++ b/Tests/Manual/CPBrowserTest/AppController.j @@ -29,6 +29,16 @@ - (CPArray)children { return [[Node withValue:1], + [Node withValue:2], + [Node withValue:3], + [Node withValue:2], + [Node withValue:3], + [Node withValue:2], + [Node withValue:3], + [Node withValue:2], + [Node withValue:3], + [Node withValue:2], + [Node withValue:3], [Node withValue:2], [Node withValue:3], [Node withValue:4]]; diff --git a/Tests/Manual/CPBrowserTest/CPBrowser.j b/Tests/Manual/CPBrowserTest/CPBrowser.j deleted file mode 120000 index 00538b439..000000000 --- a/Tests/Manual/CPBrowserTest/CPBrowser.j +++ /dev/null @@ -1 +0,0 @@ -../../../AppKit/CPBrowser.j \ No newline at end of file From 8340791824ad52b4aacb19533e5d004373897a86 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Fri, 23 Apr 2010 16:34:47 -0700 Subject: [PATCH 018/175] Don't let color wells work if they are disabled. Closes #626. --- AppKit/CPColorWell.j | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/AppKit/CPColorWell.j b/AppKit/CPColorWell.j index 2c2586821..040e5c548 100644 --- a/AppKit/CPColorWell.j +++ b/AppKit/CPColorWell.j @@ -231,11 +231,17 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv - (void)mouseDown:(CPEvent)anEvent { + if (![self isEnabled]) + return; + [self drawBezelWithHighlight:YES]; } - (void)mouseDragged:(CPEvent)anEvent { + if (![self isEnabled]) + return; + [self drawBezelWithHighlight:CGRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])]; } @@ -243,7 +249,7 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv { [self drawBezelWithHighlight:NO]; - if (!CGRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])) + if (!CGRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil]) || ![self isEnabled]) return; [self activate:YES]; From 7577cf8645a7b522feae1d5b461e25950f44e8e2 Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Mon, 12 Apr 2010 22:38:45 +0300 Subject: [PATCH 019/175] Fix error in initWithArray:copyItems: --- Foundation/CPArray.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j index 949b900ac..14e387f3f 100755 --- a/Foundation/CPArray.j +++ b/Foundation/CPArray.j @@ -215,7 +215,7 @@ self[index] = [anArray[index] copy]; // Do a deep/shallow copy? else - self[index] = anArray; + self[index] = anArray[index]; } } From 6662fabcb81b182cec16bbc844bfb23e2fe54fa2 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Fri, 23 Apr 2010 16:43:22 -0700 Subject: [PATCH 020/175] Tests for the bug exposed in the previous cparray commit. --- Tests/Foundation/CPArrayTest.j | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j index c9894fc10..f99ec7b78 100644 --- a/Tests/Foundation/CPArrayTest.j +++ b/Tests/Foundation/CPArrayTest.j @@ -212,10 +212,15 @@ - (void)testInitWithArrayCopyItems { - var a = [[CopyableObject new], 2, 3]; + var a = [[CopyableObject new], 2, 3, {empty:true}]; var b = [[CPArray alloc] initWithArray:a copyItems:YES]; [self assert:a notEqual:b]; + + [self assert:a[0] notEqual:b[0]]; + [self assert:a[1] equals:b[1]]; + [self assert:a[2] equals:b[2]]; + [self assertTrue:a[3] === b[3]]; } - (void)testIsEqualToArray From 5f6f997095ab31dc57c7f8aed4a7263552eb6953 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Sat, 24 Apr 2010 11:10:36 -0700 Subject: [PATCH 021/175] Only attempt to scroll views, not windows. --- AppKit/CPDragServer.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPDragServer.j b/AppKit/CPDragServer.j index 42e03893e..9469f331f 100644 --- a/AppKit/CPDragServer.j +++ b/AppKit/CPDragServer.j @@ -257,7 +257,7 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0, userInfo:[CPDictionary dictionaryWithJSObject:{platformWindow:aPlatformWindow, location:aLocation}] repeats:NO]; - var scrollView = [_draggingDestination enclosingScrollView]; + var scrollView = [_draggingDestination isKindOfClass:[CPView class]] ? [_draggingDestination enclosingScrollView] : nil; if (scrollView) { var contentView = [scrollView contentView], From 6d595c13449dbe9db644cd15531da37f8cb2d8c1 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Sat, 24 Apr 2010 11:10:58 -0700 Subject: [PATCH 022/175] Collection view should tile itself to be the height of its superview if inside a clip view. --- AppKit/CPCollectionView.j | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index 1f71f5876..77c4ca4d6 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -426,8 +426,17 @@ x += itemSize.width + _horizontalMargin; } + var superview = [self superview], + proposedHeight = y + itemSize.height + _verticalMargin; + + if ([superview isKindOfClass:[CPClipView class]]) + { + var superviewSize = [superview bounds].size; + proposedHeight = MAX(superviewSize.height, proposedHeight); + } + _tileWidth = width; - [self setFrameSize:CGSizeMake(width, y + itemSize.height + _verticalMargin)]; + [self setFrameSize:CGSizeMake(width, proposedHeight)]; _tileWidth = -1.0; } From 0e98f44a939cd5c130c73f2301bea3db40839895 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Sat, 24 Apr 2010 14:51:10 -0700 Subject: [PATCH 023/175] Fix for IE transparent backgrounds not being resized. Closes #604. --- AppKit/CPView.j | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index f2e4f3ab5..3085a06fe 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -94,7 +94,8 @@ var DOMElementPrototype = nil, BackgroundTrivialColor = 0, BackgroundVerticalThreePartImage = 1, BackgroundHorizontalThreePartImage = 2, - BackgroundNinePartImage = 3; + BackgroundNinePartImage = 3, + BackgroundTransparentColor = 4; #endif var CPViewFlags = { }, @@ -837,28 +838,33 @@ var CPViewFlags = { }, if (_backgroundType !== BackgroundTrivialColor) { - var images = [[_backgroundColor patternImage] imageSlices]; - - if (_backgroundType === BackgroundVerticalThreePartImage) + if (_backgroundType === BackgroundTransparentColor) { - CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], size.width, size.height - _DOMImageSizes[0].height - _DOMImageSizes[2].height); + CPDOMDisplayServerSetStyleSize(_DOMImageParts[0], size.width, size.height); } - - else if (_backgroundType === BackgroundHorizontalThreePartImage) + else { - CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], size.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, size.height); - } + var images = [[_backgroundColor patternImage] imageSlices]; - else if (_backgroundType === BackgroundNinePartImage) - { - var width = size.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, - height = size.height - _DOMImageSizes[0].height - _DOMImageSizes[6].height; + if (_backgroundType === BackgroundVerticalThreePartImage) + { + CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], size.width, size.height - _DOMImageSizes[0].height - _DOMImageSizes[2].height); + } + else if (_backgroundType === BackgroundHorizontalThreePartImage) + { + CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], size.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, size.height); + } + else if (_backgroundType === BackgroundNinePartImage) + { + var width = size.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, + height = size.height - _DOMImageSizes[0].height - _DOMImageSizes[6].height; - CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], width, _DOMImageSizes[0].height); - CPDOMDisplayServerSetStyleSize(_DOMImageParts[3], _DOMImageSizes[3].width, height); - CPDOMDisplayServerSetStyleSize(_DOMImageParts[4], width, height); - CPDOMDisplayServerSetStyleSize(_DOMImageParts[5], _DOMImageSizes[5].width, height); - CPDOMDisplayServerSetStyleSize(_DOMImageParts[7], width, _DOMImageSizes[7].height); + CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], width, _DOMImageSizes[0].height); + CPDOMDisplayServerSetStyleSize(_DOMImageParts[3], _DOMImageSizes[3].width, height); + CPDOMDisplayServerSetStyleSize(_DOMImageParts[4], width, height); + CPDOMDisplayServerSetStyleSize(_DOMImageParts[5], _DOMImageSizes[5].width, height); + CPDOMDisplayServerSetStyleSize(_DOMImageParts[7], width, _DOMImageSizes[7].height); + } } } #endif @@ -1380,7 +1386,7 @@ var CPViewFlags = { }, } else { - _backgroundType = BackgroundTrivialColor; + _backgroundType = colorNeedsDOMElement ? BackgroundTransparentColor : BackgroundTrivialColor; amount = (colorNeedsDOMElement ? 1 : 0) - _DOMImageParts.length; } @@ -1403,7 +1409,7 @@ var CPViewFlags = { }, _DOMElement.removeChild(_DOMImageParts.pop()); } - if (_backgroundType === BackgroundTrivialColor) + if (_backgroundType === BackgroundTrivialColor || _backgroundType === BackgroundTransparentColor) { var colorCSS = colorExists ? [_backgroundColor cssString] : ""; From 09e52d82bfc87ad1a5bf55b95a7f928a1607b126 Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Sun, 25 Apr 2010 00:31:18 +0300 Subject: [PATCH 024/175] Code style clean up, as per style guide --- Foundation/CPArray.j | 255 ++++++++++++++++++++++--------------------- 1 file changed, 130 insertions(+), 125 deletions(-) diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j index 14e387f3f..ab149a6fb 100755 --- a/Foundation/CPArray.j +++ b/Foundation/CPArray.j @@ -37,7 +37,7 @@ - (id)initWithArray:(CPArray)anArray { self = [super init]; - + if (self) { _array = anArray; @@ -67,13 +67,13 @@ - (id)initWithArray:(CPArray)anArray { self = [super init]; - + if (self) { _array = anArray; _index = [_array count]; } - + return self; } @@ -87,7 +87,7 @@ @end -/*! +/*! @class CPArray @brief A mutable array backed by a JavaScript Array. @ingroup foundation @@ -147,7 +147,7 @@ array = [[self alloc] init], argument; - for(; i < arguments.length && (argument = arguments[i]) != nil; ++i) + for (; i < arguments.length && (argument = arguments[i]) != nil; ++i) array.push(argument); return array; @@ -182,10 +182,10 @@ - (id)initWithArray:(CPArray)anArray { self = [super init]; - + if (self) [self setArray:anArray]; - + return self; } @@ -203,13 +203,13 @@ return [self initWithArray:anArray]; self = [super init]; - + if (self) { var index = 0, count = [anArray count]; - - for(; index < count; ++index) + + for (; index < count; ++index) { if (anArray[index].isa) self[index] = [anArray[index] copy]; @@ -218,7 +218,7 @@ self[index] = anArray[index]; } } - + return self; } @@ -230,11 +230,11 @@ // The arguments array contains self and _cmd, so the first object is at position 2. var i = 2, argument; - - for(; i < arguments.length && (argument = arguments[i]) != nil; ++i) + + for (; i < arguments.length && (argument = arguments[i]) != nil; ++i) push(argument); - return self; + return self; } /*! @@ -246,12 +246,12 @@ - (id)initWithObjects:(id)objects count:(unsigned)aCount { self = [super init]; - + if (self) { var index = 0; - - for(; index < aCount; ++index) + + for (; index < aCount; ++index) push(objects[index]); } @@ -287,27 +287,27 @@ { if (anObject === nil) return CPNotFound; - - var i = 0, + + var i = 0, count = length; // Only use -isEqual: if our object is a CPObject. if (anObject.isa) { - for(; i < count; ++i) - if([self[i] isEqual:anObject]) + for (; i < count; ++i) + if ([self[i] isEqual:anObject]) return i; } - // If indexOf exists, use it since it's probably + // If indexOf exists, use it since it's probably // faster than anything we can implement. else if (self.indexOf) return indexOf(anObject); // Last resort, do a straight forward linear O(N) search. else - for(; i < count; ++i) - if(self[i] == anObject) + for (; i < count; ++i) + if (self[i] == anObject) return i; - + return CPNotFound; } @@ -323,23 +323,23 @@ { if (anObject === nil) return CPNotFound; - - var i = aRange.location, + + var i = aRange.location, count = MIN(CPMaxRange(aRange), length); - + // Only use isEqual: if our object is a CPObject. if (anObject.isa) { - for(; i < count; ++i) - if([self[i] isEqual:anObject]) + for (; i < count; ++i) + if ([self[i] isEqual:anObject]) return i; } // Last resort, do a straight forward linear O(N) search. else - for(; i < count; ++i) - if(self[i] == anObject) + for (; i < count; ++i) + if (self[i] == anObject) return i; - + return CPNotFound; } @@ -352,23 +352,23 @@ { if (anObject === nil) return CPNotFound; - - // If indexOf exists, use it since it's probably + + // If indexOf exists, use it since it's probably // faster than anything we can implement. if (self.indexOf) return indexOf(anObject); - + // Last resort, do a straight forward linear O(N) search. else { - var index = 0, + var index = 0, count = length; - - for(; index < count; ++index) - if(self[index] === anObject) + + for (; index < count; ++index) + if (self[index] === anObject) return index; } - + return CPNotFound; } @@ -384,34 +384,34 @@ { if (anObject === nil) return CPNotFound; - - // If indexOf exists, use it since it's probably + + // If indexOf exists, use it since it's probably // faster than anything we can implement. if (self.indexOf) { var index = indexOf(anObject, aRange.location); - + if (CPLocationInRange(index, aRange)) return index; } - + // Last resort, do a straight forward linear O(N) search. else { - var index = aRange.location, + var index = aRange.location, count = MIN(CPMaxRange(aRange), length); - - for(; index < count; ++index) - if(self[index] == anObject) + + for (; index < count; ++index) + if (self[index] == anObject) return index; } - + return CPNotFound; } /*! Returns the index of \c anObject in the array, which must be sorted in the same order as - calling sortUsingSelector: with the selector passed to this method would result in. + calling sortUsingSelector: with the selector passed to this method would result in. @param anObject the object to search for @param aSelector the comparison selector to call on each item in the list, the same selector should have been used to sort the array (or to maintain its sorted order). @@ -419,12 +419,12 @@ */ - (unsigned)indexOfObject:(id)anObject sortedBySelector:(SEL)aSelector { - return [self indexOfObject:anObject sortedByFunction: function(lhs, rhs) { objj_msgSend(lhs, aSelector, rhs); }]; + return [self indexOfObject:anObject sortedByFunction:function(lhs, rhs) { objj_msgSend(lhs, aSelector, rhs); }]; } /*! Returns the index of \c anObject in the array, which must be sorted in the same order as - calling sortUsingFunction: with the selector passed to this method would result in. + calling sortUsingFunction: with the selector passed to this method would result in. The function will be called like so:
     aFunction(anObject, currentObjectInArrayForComparison)
@@ -441,7 +441,7 @@
 
 /*!
     Returns the index of \c anObject in the array, which must be sorted in the same order as
-    calling sortUsingFunction: with the selector passed to this method would result in. 
+    calling sortUsingFunction: with the selector passed to this method would result in.
     The function will be called like so:
     
     aFunction(anObject, currentObjectInArrayForComparison, context)
@@ -466,7 +466,11 @@
     if (length === 0)
         return -1;
 
-    var mid, c, first = 0, last = length - 1;
+    var mid,
+        c,
+        first = 0,
+        last = length - 1;
+
     while (first <= last)
     {
         mid = FLOOR((first + last) / 2);
@@ -485,12 +489,12 @@
         }
     }
 
-    return -first-1;
+    return -first - 1;
 }
 
 /*!
     Returns the index of \c anObject in the array, which must be sorted in the same order as
-    calling sortUsingDescriptors: with the descriptors passed to this method would result in. 
+    calling sortUsingDescriptors: with the descriptors passed to this method would result in.
     @param anObject the object to search for
     @param descriptors the array of descriptors to use to compare each item in the array that we search. the same
     descriptors should have been used to sort the array (or to maintain its sorted order).
@@ -505,7 +509,7 @@
             result = CPOrderedSame;
 
         while (i < count)
-            if((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
+            if ((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
                 return result;
 
         return result;
@@ -518,9 +522,9 @@
 - (id)lastObject
 {
     var count = [self count];
-    
+
     if (!count) return nil;
-    
+
     return self[count - 1];
 }
 
@@ -546,7 +550,7 @@
     var index = CPNotFound,
         objects = [];
 
-    while((index = [indexes indexGreaterThanIndex:index]) !== CPNotFound)
+    while ((index = [indexes indexGreaterThanIndex:index]) !== CPNotFound)
         [objects addObject:[self objectAtIndex:index]];
 
     return objects;
@@ -582,11 +586,11 @@
 {
     if (!aSelector)
         [CPException raise:CPInvalidArgumentException reason:"makeObjectsPerformSelector: 'aSelector' can't be nil"];
-    
-    var index = 0, 
+
+    var index = 0,
         count = length;
-        
-    for(; index < count; ++index)
+
+    for (; index < count; ++index)
         objj_msgSend(self[index], aSelector);
 }
 
@@ -601,10 +605,10 @@
     if (!aSelector)
         [CPException raise:CPInvalidArgumentException reason:"makeObjectsPerformSelector:withObject 'aSelector' can't be nil"];
 
-    var index = 0, 
+    var index = 0,
         count = length;
-        
-    for(; index < count; ++index) 
+
+    for (; index < count; ++index)
         objj_msgSend(self[index], aSelector, anObject);
 }
 
@@ -617,7 +621,7 @@
         count = length,
         argumentsArray = [nil, aSelector].concat(objects || []);
 
-    for(; index < count; ++index)
+    for (; index < count; ++index)
     {
         argumentsArray[0] = self[index];
         objj_msgSend.apply(this, argumentsArray);
@@ -635,12 +639,12 @@
 {
     if (![anArray count] || ![self count])
         return nil;
-    
+
     var i = 0,
         count = [self count];
 
-    for(; i < count; ++i)
-        if([anArray containsObject:self[i]])
+    for (; i < count; ++i)
+        if ([anArray containsObject:self[i]])
             return self[i];
 
     return nil;
@@ -656,20 +660,20 @@
 
     if (anArray === nil || length !== anArray.length)
         return NO;
-    
+
     var index = 0,
         count = [self count];
-    
-    for(; index < count; ++index)
+
+    for (; index < count; ++index)
     {
         var lhs = self[index],
             rhs = anArray[index];
-        
+
         // If they're not equal, and either doesn't have an isa, or they're !isEqual (not isEqual)
         if (lhs !== rhs && (lhs && !lhs.isa || rhs && !rhs.isa || ![lhs isEqual:rhs]))
             return NO;
     }
-        
+
     return YES;
 }
 
@@ -677,8 +681,8 @@
 {
     if (self === anObject)
         return YES;
-    
-    if(![anObject isKindOfClass:[CPArray class]])
+
+    if (![anObject isKindOfClass:[CPArray class]])
         return NO;
 
     return [self isEqualToArray:anObject];
@@ -698,9 +702,9 @@
                     reason:"arrayByAddingObject: object can't be nil"];
 
     var array = [self copy];
-    
+
     array.push(anObject);
-    
+
     return array;
 }
 
@@ -713,17 +717,17 @@
     return slice(0).concat(anArray);
 }
 
-/*  
+/*
 - (CPArray)filteredArrayUsingPredicate:(CPPredicate)aPredicate
 {
-    var i= 0, 
+    var i= 0,
         count = [self count],
         array = [CPArray array];
-    
-    for(; i= [self count] + indexesCount)
-        [CPException raise:CPRangeException reason:"the last index (" + lastIndex + ") must be less than the sum of the original count (" + [self count] + ") and the insertion count (" + indexesCount + ")."];    
-    
+
+    if (lastIndex >= [self count] + indexesCount)
+        [CPException raise:CPRangeException reason:"the last index (" + lastIndex + ") must be less than the sum of the original count (" + [self count] + ") and the insertion count (" + indexesCount + ")."];
+
     var index = 0,
         currentIndex = [indexes firstIndex];
- 
+
     for (; index < objectsCount; ++index, currentIndex = [indexes indexGreaterThanIndex:currentIndex])
         [self insertObject:objects[index] atIndex:currentIndex];
 }
@@ -990,14 +994,14 @@
             result = CPOrderedSame;
 
         while (i < count)
-            if((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
+            if ((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
                 return result;
 
         return result;
     } context:nil];
 
     if (index < 0)
-        index = -index-1;
+        index = -index - 1;
 
     [self insertObject:anObject atIndex:index];
     return index;
@@ -1021,10 +1025,10 @@
 */
 - (void)replaceObjectsAtIndexes:(CPIndexSet)anIndexSet withObjects:(CPArray)objects
 {
-    var i = 0, 
+    var i = 0,
         index = [anIndexSet firstIndex];
-   
-    while(index != CPNotFound)
+
+    while (index != CPNotFound)
     {
         [self replaceObjectAtIndex:index withObject:objects[i++]];
         index = [anIndexSet indexGreaterThanIndex:index];
@@ -1065,8 +1069,9 @@
 */
 - (void)setArray:(CPArray)anArray
 {
-    if(self == anArray) return;
-    
+    if (self == anArray)
+        return;
+
     splice.apply(self, [0, length].concat(anArray));
 }
 
@@ -1104,7 +1109,7 @@
 - (void)removeObject:(id)anObject inRange:(CPRange)aRange
 {
     var index;
-    
+
     while ((index = [self indexOfObject:anObject inRange:aRange]) != CPNotFound)
     {
         [self removeObjectAtIndex:index];
@@ -1128,7 +1133,7 @@
 - (void)removeObjectsAtIndexes:(CPIndexSet)anIndexSet
 {
     var index = [anIndexSet lastIndex];
-   
+
     while (index != CPNotFound)
     {
         [self removeObjectAtIndex:index];
@@ -1157,7 +1162,7 @@
 {
     var index,
         count = [self count];
-    
+
     while ((index = [self indexOfObjectIdenticalTo:anObject inRange:aRange]) !== CPNotFound)
     {
         [self removeObjectAtIndex:index];
@@ -1173,7 +1178,7 @@
 {
     var index = 0,
         count = [anArray count];
-        
+
     for (; index < count; ++index)
         [self removeObject:anArray[index]];
 }
@@ -1207,11 +1212,11 @@
         var i = 0,
             count = [descriptors count],
             result = CPOrderedSame;
-        
-        while(i < count)
-            if((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
+
+        while (i < count)
+            if ((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
                 return result;
-        
+
         return result;
     });
 }

From f6000468db0881eb27f41b2370ce4877eaf2564d Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Sun, 25 Apr 2010 14:58:27 -0700
Subject: [PATCH 025/175] Missing printResults function in ThemeDescriptor
 Jakefile.

---
 Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile b/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
index 7a0a7a965..280361f54 100644
--- a/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
+++ b/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
@@ -42,3 +42,10 @@ task ("release", function()
     ENV["CONFIGURATION"] = "Release";
     JAKE.subjake(["."], "build", ENV);
 });
+
+function printResults(configuration)
+{
+    print("----------------------------");
+    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
+    print("----------------------------");
+}

From 7395d13c3e44102012e02483b9e104112f6e3665 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sun, 25 Apr 2010 15:42:10 -0700
Subject: [PATCH 026/175] Typo in CPJSONPConnection.

---
 Foundation/CPJSONPConnection.j | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Foundation/CPJSONPConnection.j b/Foundation/CPJSONPConnection.j
index a29ab4032..031ef7eb2 100644
--- a/Foundation/CPJSONPConnection.j
+++ b/Foundation/CPJSONPConnection.j
@@ -56,7 +56,7 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}";
 
 + (CPJSONPConnection)connectionWithRequest:(CPURLRequest)aRequest callback:(CPString)callbackParameter delegate:(id)aDelegate
 {
-    return [[[self class] alloc] initWithRequest:aRequest callback:callbackParameter delegate:aDelegate startImmediately:YES];;
+    return [[[self class] alloc] initWithRequest:aRequest callback:callbackParameter delegate:aDelegate startImmediately:YES];
 }
 
 - (id)initWithRequest:(CPURLRequest)aRequest callback:(CPString)aString delegate:(id)aDelegate 

From 5e43a02ffacb86df137e6ec1a910815f563fbc39 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sun, 25 Apr 2010 15:42:38 -0700
Subject: [PATCH 027/175] Fix some faulty validation logic.

---
 AppKit/CPToolbarItem.j | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/AppKit/CPToolbarItem.j b/AppKit/CPToolbarItem.j
index 57e33cdfc..e5148576e 100644
--- a/AppKit/CPToolbarItem.j
+++ b/AppKit/CPToolbarItem.j
@@ -449,6 +449,9 @@ CPToolbarItemVisibilityPriorityUser
 
 - (void)validate
 {
+    var action = [self action],
+        target = [self target];
+
     // View items do not do any target-action analysis.
     if (_view)
     {
@@ -458,13 +461,9 @@ CPToolbarItemVisibilityPriorityUser
         return;
     }
 
-    var action = [self action];
-
     if (!action)
         return [self setEnabled:NO];
 
-    var target = [self target];
-
     if (target && ![target respondsToSelector:action])
         return [self setEnabled:NO];
 

From cdb089778c92d27f0321593deb2d4266cf15a473 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sun, 25 Apr 2010 15:42:55 -0700
Subject: [PATCH 028/175] autoscroll when drag selecting.

---
 AppKit/CPTableView.j | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 456ee086f..1a3e727c4 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -2561,7 +2561,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 {
     // Prevent CPControl from eating the mouse events when we are in a drag session
     if (![_draggedRowIndexes count])
+    {
+        [self autoscroll:anEvent];
         [super trackMouse:anEvent];
+    }
     else
         [CPApp sendEvent:anEvent];
 }

From 67bcc29baf52ac56ce08a5630fad77b87ebd6b70 Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Sun, 25 Apr 2010 22:33:13 -0700
Subject: [PATCH 029/175] NativeHost.

---
 CommonJS/lib/cappuccino/nativehost.js         |   28 +
 Objective-J/CFPropertyList.js                 |   10 +
 Tools/Jakefile                                |    2 +-
 Tools/NativeHost/.gitignore                   |    5 +
 Tools/NativeHost/AppController+MainMenu.m     |   33 +
 .../AppController+WebFrameLoadDelegate.m      |   26 +
 .../AppController+WebResourceLoadDelegate.m   |   32 +
 .../NativeHost/AppController+WebUIDelegate.m  |   71 +
 Tools/NativeHost/AppController.h              |   49 +
 Tools/NativeHost/AppController.m              |  194 +++
 Tools/NativeHost/Application.h                |   18 +
 Tools/NativeHost/Application.m                |   47 +
 Tools/NativeHost/BridgedMethods.h             |   65 +
 Tools/NativeHost/BridgedMethods.m             |  345 +++++
 Tools/NativeHost/Console.h                    |   21 +
 Tools/NativeHost/Console.m                    |   69 +
 .../English.lproj/InfoPlist.strings           |  Bin 0 -> 92 bytes
 Tools/NativeHost/English.lproj/MainMenu.xib   |  548 ++++++++
 Tools/NativeHost/Info.plist                   |   30 +
 Tools/NativeHost/Jakefile                     |   36 +
 Tools/NativeHost/MenuBridge.h                 |   22 +
 Tools/NativeHost/MenuBridge.m                 |   63 +
 Tools/NativeHost/MenuItemBridge.h             |   24 +
 Tools/NativeHost/MenuItemBridge.m             |   77 ++
 Tools/NativeHost/NSObject+WebAdditions.h      |   16 +
 Tools/NativeHost/NSObject+WebAdditions.m      |   19 +
 Tools/NativeHost/NSURL+Additions.h            |   17 +
 Tools/NativeHost/NSURL+Additions.m            |   36 +
 .../NativeHost.xcodeproj/TemplateIcon.icns    |  Bin 0 -> 52318 bytes
 .../NativeHost.xcodeproj/project.pbxproj      |  412 ++++++
 Tools/NativeHost/NativeHost_Prefix.pch        |    8 +
 Tools/NativeHost/SSCrypto.h                   |  116 ++
 Tools/NativeHost/SSCrypto.m                   | 1214 +++++++++++++++++
 Tools/NativeHost/Server.h                     |   21 +
 Tools/NativeHost/Server.m                     |  193 +++
 Tools/NativeHost/WebPasteboardProxy.h         |   19 +
 Tools/NativeHost/WebPasteboardProxy.m         |   95 ++
 Tools/NativeHost/WebScripObject+Objective-J.h |   22 +
 Tools/NativeHost/WebScripObject+Objective-J.m |   46 +
 Tools/NativeHost/WebWindow.h                  |   44 +
 Tools/NativeHost/WebWindow.m                  |  509 +++++++
 Tools/NativeHost/icon.icns                    |  Bin 0 -> 81151 bytes
 Tools/NativeHost/main.m                       |   23 +
 .../Resources/Templates/Application/Jakefile  |   26 +-
 .../Templates/NibApplication/Jakefile         |   26 +-
 .../Templates/ThemeDescriptor/Jakefile        |   15 +-
 46 files changed, 4672 insertions(+), 20 deletions(-)
 create mode 100644 CommonJS/lib/cappuccino/nativehost.js
 create mode 100644 Tools/NativeHost/.gitignore
 create mode 100644 Tools/NativeHost/AppController+MainMenu.m
 create mode 100644 Tools/NativeHost/AppController+WebFrameLoadDelegate.m
 create mode 100644 Tools/NativeHost/AppController+WebResourceLoadDelegate.m
 create mode 100644 Tools/NativeHost/AppController+WebUIDelegate.m
 create mode 100644 Tools/NativeHost/AppController.h
 create mode 100644 Tools/NativeHost/AppController.m
 create mode 100644 Tools/NativeHost/Application.h
 create mode 100644 Tools/NativeHost/Application.m
 create mode 100644 Tools/NativeHost/BridgedMethods.h
 create mode 100644 Tools/NativeHost/BridgedMethods.m
 create mode 100644 Tools/NativeHost/Console.h
 create mode 100644 Tools/NativeHost/Console.m
 create mode 100644 Tools/NativeHost/English.lproj/InfoPlist.strings
 create mode 100644 Tools/NativeHost/English.lproj/MainMenu.xib
 create mode 100644 Tools/NativeHost/Info.plist
 create mode 100644 Tools/NativeHost/Jakefile
 create mode 100644 Tools/NativeHost/MenuBridge.h
 create mode 100644 Tools/NativeHost/MenuBridge.m
 create mode 100644 Tools/NativeHost/MenuItemBridge.h
 create mode 100644 Tools/NativeHost/MenuItemBridge.m
 create mode 100644 Tools/NativeHost/NSObject+WebAdditions.h
 create mode 100644 Tools/NativeHost/NSObject+WebAdditions.m
 create mode 100644 Tools/NativeHost/NSURL+Additions.h
 create mode 100644 Tools/NativeHost/NSURL+Additions.m
 create mode 100644 Tools/NativeHost/NativeHost.xcodeproj/TemplateIcon.icns
 create mode 100644 Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj
 create mode 100644 Tools/NativeHost/NativeHost_Prefix.pch
 create mode 100644 Tools/NativeHost/SSCrypto.h
 create mode 100644 Tools/NativeHost/SSCrypto.m
 create mode 100644 Tools/NativeHost/Server.h
 create mode 100644 Tools/NativeHost/Server.m
 create mode 100644 Tools/NativeHost/WebPasteboardProxy.h
 create mode 100644 Tools/NativeHost/WebPasteboardProxy.m
 create mode 100644 Tools/NativeHost/WebScripObject+Objective-J.h
 create mode 100644 Tools/NativeHost/WebScripObject+Objective-J.m
 create mode 100644 Tools/NativeHost/WebWindow.h
 create mode 100644 Tools/NativeHost/WebWindow.m
 create mode 100644 Tools/NativeHost/icon.icns
 create mode 100644 Tools/NativeHost/main.m

diff --git a/CommonJS/lib/cappuccino/nativehost.js b/CommonJS/lib/cappuccino/nativehost.js
new file mode 100644
index 000000000..c56119aa6
--- /dev/null
+++ b/CommonJS/lib/cappuccino/nativehost.js
@@ -0,0 +1,28 @@
+var FILE = require("file");
+var OS = require("os");
+
+var NATIVEHOST_SOURCE = FILE.path(module.path).dirname().dirname().dirname().join("support", "NativeHost.app");
+
+exports.buildNativeHost = function(rootPath, buildNative, options) {
+
+    if (FILE.exists(buildNative))
+        FILE.rmtree(buildNative);
+
+    // If not we lose all of our permissions.
+    FILE.mkdirs(FILE.dirname(buildNative));
+    OS.system(["cp", "-r", NATIVEHOST_SOURCE, buildNative]);
+
+    // Do this again anyways?
+    FILE.chmod(FILE.join(buildNative, "Contents", "MacOS", "NativeHost"), 0755);
+
+    var buildClientDirectory = FILE.join(buildNative, "Contents", "Resources", "Application");
+
+    FILE.mkdirs(FILE.dirname(buildClientDirectory));
+    OS.system(["cp", "-r", rootPath, buildClientDirectory]);
+    // FILE.copyTree(rootPath, buildClientDirectory);
+
+    CFPropertyList.modifyPlist(FILE.join(buildNative, "Contents", "Info.plist"), function(plist) {
+        plist.setValueForKey("CFBundleName", "Project");
+        plist.setValueForKey("NHInitialResource", "Application/index.html");
+    });
+}
\ No newline at end of file
diff --git a/Objective-J/CFPropertyList.js b/Objective-J/CFPropertyList.js
index 1533f4863..39ba97e13 100644
--- a/Objective-J/CFPropertyList.js
+++ b/Objective-J/CFPropertyList.js
@@ -91,6 +91,16 @@ CFPropertyList.writePropertyListToFile = function(/*CFPropertyList*/ aPropertyLi
 {
     return FILE.write(aFilePath, CFPropertyList.stringFromPropertyList(aPropertyList, aFormat), { charset:"UTF-8" });
 }
+CFPropertyList.modifyPlist = function(/*String*/ aFilePath, /*Function*/ aCallback, /*String*/ aFormat)
+{
+    var string = FILE.read(aFilePath, { charset:"UTF-8" });
+    var format = CFPropertyList.sniffedFormatOfString(string);
+    var plist = CFPropertyList.propertyListFromString(string, format);
+
+    aCallback(plist);
+
+    CFPropertyList.writePropertyListToFile(plist, aFilePath, aFormat || format);
+}
 #endif
 
 function serializePropertyList(/*CFPropertyList*/ aPropertyList, /*Object*/ serializers)
diff --git a/Tools/Jakefile b/Tools/Jakefile
index fe675b736..e9e0f5fc9 100644
--- a/Tools/Jakefile
+++ b/Tools/Jakefile
@@ -2,4 +2,4 @@
 require("../common.jake");
 
 // nib2cib has to come before capp since capp uses nib2cib
-subtasks(["nib2cib", "capp"], ["build"/*, "clean", "clobber"*/]);
+subtasks(["nib2cib", "capp", "NativeHost"], ["build"/*, "clean", "clobber"*/]);
diff --git a/Tools/NativeHost/.gitignore b/Tools/NativeHost/.gitignore
new file mode 100644
index 000000000..f921bd442
--- /dev/null
+++ b/Tools/NativeHost/.gitignore
@@ -0,0 +1,5 @@
+.DS_Store
+*.mode1v3
+*.pbxuser
+*.perspectivev3
+build
diff --git a/Tools/NativeHost/AppController+MainMenu.m b/Tools/NativeHost/AppController+MainMenu.m
new file mode 100644
index 000000000..dbc98e63e
--- /dev/null
+++ b/Tools/NativeHost/AppController+MainMenu.m
@@ -0,0 +1,33 @@
+//
+//  AppController+MainMenu.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/2/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+#import "MenuBridge.h"
+#import "AppController.h"
+
+
+@interface NSApplication (MenuMethods)
+
+- (void)setAppleMenu:(NSMenu *)aMenu;
+
+@end
+
+@implementation AppController (MainMenu)
+
+- (void)setMainMenuObject:(WebScriptObject *)aMenuObject
+{
+    NSMenu * mainMenu = [[MenuBridge alloc] initWithMenuObject:aMenuObject];
+
+    [NSApp setAppleMenu:[[mainMenu itemArray] objectAtIndex:0]];
+    [NSApp setMainMenu:mainMenu];
+
+    [mainMenu release];
+}
+
+@end
diff --git a/Tools/NativeHost/AppController+WebFrameLoadDelegate.m b/Tools/NativeHost/AppController+WebFrameLoadDelegate.m
new file mode 100644
index 000000000..fdce4d601
--- /dev/null
+++ b/Tools/NativeHost/AppController+WebFrameLoadDelegate.m
@@ -0,0 +1,26 @@
+
+
+//
+//  AppController+WebFrameLoadDelegate.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 7/28/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "AppController.h"
+
+#import "BridgedMethods.h"
+
+
+@implementation AppController (WebFrameLoadDelegate)
+
+- (void)webView:(WebView *)aWebView didClearWindowObject:(WebScriptObject *)aWindowObject forFrame:(WebFrame *)aFrame
+{
+    if (aWebView == webView)
+        [GlobalMethods enhanceWindowObject:aWindowObject ofWebView:aWebView];
+    else
+        [WindowMethods enhanceWindowObject:aWindowObject ofWebView:aWebView];
+}
+
+@end
diff --git a/Tools/NativeHost/AppController+WebResourceLoadDelegate.m b/Tools/NativeHost/AppController+WebResourceLoadDelegate.m
new file mode 100644
index 000000000..a60540b75
--- /dev/null
+++ b/Tools/NativeHost/AppController+WebResourceLoadDelegate.m
@@ -0,0 +1,32 @@
+//
+//  AppController+WebResourceLoadDelegate.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 7/28/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "AppController.h"
+#import "SSCrypto.h"
+
+NSString *authHeader = nil;
+
+@implementation AppController (WebResourceLoadDelegate)
+
+- (NSURLRequest *)webView:(WebView *)aSender resource:(id)anIdentifier willSendRequest:(NSURLRequest *)aRequest redirectResponse:(NSURLResponse *)aRedirectResponse fromDataSource:(WebDataSource *)aDataSource
+{
+    aRequest = [[aRequest mutableCopy] autorelease];
+
+    if (!authHeader)
+    {
+        NSString *plaintext = [NSString stringWithFormat:@"%@:%@", SERVER_USER, SERVER_PASSWORD];
+        NSData *data = [plaintext dataUsingEncoding:NSASCIIStringEncoding];
+        authHeader = [[NSString alloc] initWithFormat:@"Basic %@", [data encodeBase64WithNewlines:NO]];
+    }
+
+    [(NSMutableURLRequest *)aRequest setValue:authHeader forHTTPHeaderField:@"Authorization"];
+
+    return aRequest;
+}
+
+@end
diff --git a/Tools/NativeHost/AppController+WebUIDelegate.m b/Tools/NativeHost/AppController+WebUIDelegate.m
new file mode 100644
index 000000000..a75f9d6a9
--- /dev/null
+++ b/Tools/NativeHost/AppController+WebUIDelegate.m
@@ -0,0 +1,71 @@
+//
+//  AppController+WebUIDelegate.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 7/28/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "AppController.h"
+#import "WebWindow.h"
+
+
+@implementation AppController (WebUIDelegate)
+
+- (void)webView:(WebView *)aWebView setFrame:(NSRect)aFrame
+{
+    [[aWebView window] setFrame:aFrame display:YES];
+}
+
+- (NSRect)webViewFrame:(WebView *)aWebView
+{
+    return [[aWebView window] frame];
+}
+
+- (WebView *)webView:(WebView *)aWebView createWebViewWithRequest:(NSURLRequest *)aRequest
+{
+    return [[WebWindow webWindow] webView];
+}
+
+- (void)webViewClose:(WebView *)aWebView
+{
+    // Important to call close and not:
+    // -performClose:, which beeps without the presence of a close button.
+    // -orderOut:, which doesn't release the window.
+    [[aWebView window] close];
+    //[[aWebView window] orderOut:self];
+}
+
+- (void)webViewShow:(WebView *)aWebView
+{
+    [[aWebView window] makeKeyAndOrderFront:self];
+}
+
+- (NSAttributedString *)loggedOutput;
+{
+    return loggedOutput;
+}
+
+- (void)webView:(WebView *)aWebView addMessageToConsole:(NSDictionary *)aDictionary
+{
+    NSString * message = [aDictionary objectForKey:@"message"];
+    NSAttributedString * attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n", message, nil]];
+    
+    [loggedOutput appendAttributedString:attributedString];
+
+    [attributedString release];
+    NHLog(@"CONSOLE", message);
+}
+
+- (void)webView:(WebView *)aSender runJavaScriptAlertPanelWithMessage:(NSString *)aMessage initiatedByFrame:(WebFrame *)aFrame
+{
+    WebDataSource * dataSource = [aFrame dataSource];
+    NSString * title = [dataSource pageTitle];
+    
+    if (![title length])
+        title = [[[dataSource request] URL] absoluteString];
+    
+    [[NSAlert alertWithMessageText:title defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", aMessage, nil] runModal];
+}
+
+@end
diff --git a/Tools/NativeHost/AppController.h b/Tools/NativeHost/AppController.h
new file mode 100644
index 000000000..ee59c24fe
--- /dev/null
+++ b/Tools/NativeHost/AppController.h
@@ -0,0 +1,49 @@
+//
+//  AppController.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 6/4/09.
+//  Copyright 2009 280 North, Inc. All rights reserved.
+//
+
+#import 
+
+extern int SERVER_PORT;
+extern NSString *SERVER_PASSWORD;
+extern NSString *SERVER_USER;
+
+@class Server;
+@class WebScriptObject;
+
+@interface AppController : NSObject
+{
+    NSWindow                        * webViewWindow;
+    WebView                         * webView;
+
+    NSMutableArray                  * openingFilenames;
+    NSMutableArray                  * openingURLStrings;
+
+    Server                          * server;
+    NSFileHandle                    * stdinFileHandle;
+
+    NSMutableAttributedString       * loggedOutput;
+}
+
+- (void)startServer;
+- (void)startCappuccinoApplication;
+
+- (NSArray *)openingURLStrings;
+
+- (NSView *)keyView;
+- (WebView *)webView;
+- (WebScriptObject *)windowScriptObject;
+
+@end
+
+@interface AppController (MainMenu)
+
+- (void)setMainMenuObject:(WebScriptObject *)aMenuObject;
+
+@end
+
+void NHLog(NSString *type, NSString *message);
\ No newline at end of file
diff --git a/Tools/NativeHost/AppController.m b/Tools/NativeHost/AppController.m
new file mode 100644
index 000000000..b751d0135
--- /dev/null
+++ b/Tools/NativeHost/AppController.m
@@ -0,0 +1,194 @@
+//
+//  AppController.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 6/4/09.
+//  Copyright 2009 280 North, Inc. All rights reserved.
+//
+
+#import "Console.h"
+#import "Server.h"
+#import "AppController.h"
+#import "NSURL+Additions.h"
+#import "BridgedMethods.h"
+#import "WebWindow.h"
+#import "WebScripObject+Objective-J.h"
+
+extern int interactive;
+
+int SERVER_PORT = 9191;
+NSString *SERVER_PASSWORD = nil;
+NSString *SERVER_USER = nil;
+
+@implementation AppController
+
+- (id)init
+{
+    self = [super init];
+
+    if (self)
+        openingURLStrings = [NSMutableArray new];
+
+    return self;
+}
+
+- (void)dealloc
+{
+    [webView release];
+    [webViewWindow release];
+
+    [openingURLStrings release];
+
+    [super dealloc];
+}
+
+- (BOOL)application:(NSApplication *)anApplication openFile:(NSString *)aFilename
+{
+    id canOpenFilesImmediately = [[webView windowScriptObject] evaluateWebScript:@"CPApp && CPApp._finishedLaunching"];
+
+    NSString *path = [[[NSURL fileURLWithPath:aFilename] HTTPFileSystemURL] absoluteString];
+    if ([canOpenFilesImmediately isKindOfClass:[NSNumber class]] && [canOpenFilesImmediately boolValue])
+        [[webView windowScriptObject] evaluateObjectiveJ:[NSString stringWithFormat:@"[CPApp _openURL:[CPURL URLWithString:\"%@\"]]", path]];
+    else
+        [openingURLStrings addObject:path];
+
+    return NO;
+}
+
+- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
+{
+    NSUserDefaults  * defaults = [NSUserDefaults standardUserDefaults];
+
+    [defaults registerDefaults:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"WebKitDeveloperExtras"]];
+
+    [self startServer];
+}
+
+- (void)applicationDidFinishLaunching:(NSNotification *)notification
+{
+    [self startCappuccinoApplication];
+}
+
+- (void)applicationDidResignActive:(NSNotification *)aNotification
+{
+    // FIXME: handle this better.
+    [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _willResignActive];"];
+    [[self windowScriptObject] evaluateObjectiveJ:@"CPApp._isActive = NO;"];
+    [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _didResignActive];"];
+}
+
+- (void)applicationDidBecomeActive:(NSNotification *)aNotification
+{
+    // FIXME: handle this better.
+    [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _willBecomeActive];"];
+    [[self windowScriptObject] evaluateObjectiveJ:@"CPApp._isActive = YES;"];
+    [[self windowScriptObject] evaluateObjectiveJ:@"[CPApp _didBecomeActive];"];
+}
+
+- (NSArray *)openingURLStrings
+{
+    return openingURLStrings;
+}
+
+- (NSView *)keyView
+{
+    return [[[webView mainFrame] frameView] documentView];
+}
+
+- (WebView *)webView
+{
+    return webView;
+}
+
+- (WebScriptObject *)windowScriptObject
+{
+    return [webView windowScriptObject];
+}
+
+- (void)startServer
+{
+    server = [[Server alloc] init];
+
+    if (![server start])
+        exit(0);
+
+	if (interactive)
+	{
+        stdinFileHandle = [[NSFileHandle fileHandleWithStandardInput] retain];
+        [[NSNotificationCenter defaultCenter]
+         addObserver:self
+         selector:@selector(didReadStdin:)
+         name:NSFileHandleReadCompletionNotification
+         object:stdinFileHandle];
+
+        fprintf(stdout, "objj> ");
+        fflush(stdout);
+        [stdinFileHandle readInBackgroundAndNotify];
+    }
+}
+
+- (void)didReadStdin:(NSNotification *)aNotification
+{
+    NSString *string = [[NSString alloc] initWithData:[[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem] encoding:NSASCIIStringEncoding];
+    NSString *result = [[self windowScriptObject] evaluateObjectiveJReturningString:string];
+    [string release];
+    if ([result respondsToSelector:@selector(UTF8String)])
+        fprintf(stdout, "%s\n", [result UTF8String]);
+    fprintf(stdout, "objj> ");
+    fflush(stdout);
+    [stdinFileHandle readInBackgroundAndNotify];
+}
+
+- (void)startCappuccinoApplication
+{
+    NSString *initialURL = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialURL"];
+    BOOL prependServer = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialURLPrependServer"] boolValue];
+
+    if (!initialURL)
+    {
+        NSString *initialResource = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialResource"];
+        
+        if (!initialResource)
+            initialResource = @"Application/index.html";
+
+        initialURL = [[NSString stringWithFormat:@"file://%@/%@", [[NSBundle mainBundle] resourcePath], initialResource] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+    }
+    else if (prependServer)
+    {
+        initialURL = [NSString stringWithFormat:@"http://localhost:%d/%@", SERVER_PORT, initialURL];
+    }
+
+	NHLog(@"STARTUP", [initialURL description]);
+	
+    [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:initialURL]]];
+}
+
+- (void)applicationWillTerminate:(NSNotification *)aNotification
+{
+    [server stop];
+}
+
+- (void)awakeFromNib
+{
+    webView = [[WebView alloc] init];
+
+    [webView setUIDelegate:self];
+    [webView setFrameLoadDelegate:self];
+    [webView setResourceLoadDelegate:self];
+
+    webViewWindow = [[NSWindow alloc] init];
+
+    [webViewWindow setContentView:webView];
+}
+
+@end
+
+void NHLog(NSString *type, NSString *message)
+{
+    NSArray *lines = [message componentsSeparatedByString:@"\n"];
+    for (NSString *line in lines)
+    {
+        if ([line length] > 0)
+            NSLog(@"%10@: %@", type, line);
+    }
+}
diff --git a/Tools/NativeHost/Application.h b/Tools/NativeHost/Application.h
new file mode 100644
index 000000000..d09086a9f
--- /dev/null
+++ b/Tools/NativeHost/Application.h
@@ -0,0 +1,18 @@
+//
+//  Application.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 10/8/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+@interface Application : NSApplication
+{
+}
+
+- (void)_reallyTerminate:(id)sender;
+
+@end
diff --git a/Tools/NativeHost/Application.m b/Tools/NativeHost/Application.m
new file mode 100644
index 000000000..4dbb8a397
--- /dev/null
+++ b/Tools/NativeHost/Application.m
@@ -0,0 +1,47 @@
+//
+//  Application.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 10/8/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "Application.h"
+#import "AppController.h"
+#import "WebScripObject+Objective-J.h"
+#import "WebWindow.h"
+
+@implementation Application
+
+- (void)sendEvent:(NSEvent *)anEvent
+{
+    NSWindow * window = [anEvent window];
+
+    if (!window || [window isKindOfClass:[WebWindow class]])
+    {
+        NSResponder * firstResponder = window ? [window firstResponder] : [(AppController *)[self delegate] keyView];
+
+        switch ([anEvent type])
+        {
+            case NSKeyDown: return [firstResponder keyDown:anEvent];
+            case NSKeyUp:   return [firstResponder keyUp:anEvent];
+        }
+    }
+
+    [super sendEvent:anEvent];
+}
+
+- (void)terminate:(id)sender
+{
+    if ([[[self delegate] windowScriptObject] evaluateObjectiveJ:@"(CPApp)"] == [WebUndefined undefined])
+        [self _reallyTerminate:sender];
+    else
+        [[(AppController *)[self delegate] windowScriptObject] evaluateObjectiveJ:@"[CPApp terminate:nil]"];
+}
+
+- (void)_reallyTerminate:(id)sender
+{
+    [super terminate:sender];
+}
+
+@end
diff --git a/Tools/NativeHost/BridgedMethods.h b/Tools/NativeHost/BridgedMethods.h
new file mode 100644
index 000000000..a9af18f1f
--- /dev/null
+++ b/Tools/NativeHost/BridgedMethods.h
@@ -0,0 +1,65 @@
+//
+//  BridgedMethods.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 10/16/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+@interface BridgedMethods : NSObject
+{
+    WebView * webView;
+}
++ (NSMutableArray *)arrayFromWebScriptObject:(WebScriptObject *)incomingObject;
++ (void)enhanceWindowObject:(WebScriptObject *)aWindowObject ofWebView:(WebView *)aWebView;
+@end
+
+@interface GlobalMethods : BridgedMethods
+{
+}
+- (id)isDesktop;
+
+- (id)openingURLStrings;
+
+- (id)setMainMenu:(id)arguments;
+
+- (id)terminate;
+- (id)activateIgnoringOtherApps:(NSArray *)arguments;
+- (id)deactivate;
+- (id)hide;
+- (id)hideOtherApplications;
+
+- (id)savePanel:(NSArray *)arguments; // FIXME: This should be implemented in Cappuccino.
+- (id)openPanel; // FIXME: This should be implemented in Cappuccino.
+
+- (id)clearRecentDocuments;
+- (id)noteNewRecentDocumentPath:(NSArray *)aURL;
+- (id)recentDocumentURLs;
+
+- (id)pasteboardWithName:(NSArray *)arguments;
+
+@end
+
+@interface WindowMethods : BridgedMethods
+{
+}
+- (id)miniaturize;
+- (id)deminiaturize;
+
+- (id)level;
+- (id)setLevel:(NSArray *)arguments;
+
+- (id)hasShadow;
+- (id)setHasShadow:(NSArray *)arguments;
+
+- (id)shadowStyle;
+- (id)setShadowStyle:(NSArray *)arguments;
+
+- (id)frame;
+- (id)setFrame:(NSArray *)arguments;
+
+@end
+
diff --git a/Tools/NativeHost/BridgedMethods.m b/Tools/NativeHost/BridgedMethods.m
new file mode 100644
index 000000000..7e637692a
--- /dev/null
+++ b/Tools/NativeHost/BridgedMethods.m
@@ -0,0 +1,345 @@
+//
+//  BridgedMethods.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 10/16/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+
+#import 
+#import "Application.h"
+#import "AppController.h"
+#import "BridgedMethods.h"
+#import "NSObject+WebAdditions.h"
+#import "NSURL+Additions.h"
+#import "WebWindow.h"
+#import "WebPasteboardProxy.h"
+
+static NSMutableDictionary * MethodClasses;
+
+@implementation GlobalMethods
+
+- (id)isDesktop
+{
+    return [NSNumber numberWithBool:YES];
+}
+
+- (id)openingURLStrings
+{
+    return [(AppController *)[NSApp delegate] openingURLStrings];
+}
+
+- (id)setMainMenu:(id)arguments
+{
+    [[NSApp delegate] setMainMenuObject:[arguments objectAtIndex:0]];
+
+    return [WebUndefined undefined];
+}
+
+- (id)terminate
+{
+    [(Application *)NSApp _reallyTerminate:self];
+
+    return [WebUndefined undefined];
+}
+
+- (id)activateIgnoringOtherApps:(NSArray *)arguments
+{
+    id argument = [arguments objectAtIndex:0];
+
+    [(NSApplication *)NSApp activateIgnoringOtherApps:[argument isKindOfClass:[NSNumber class]] && [(NSNumber *)argument boolValue]];
+
+    return [WebUndefined undefined];
+}
+
+- (id)deactivate
+{
+    [(NSApplication *)NSApp deactivate];
+    return [WebUndefined undefined];
+}
+
+- (id)hide
+{
+    [NSApp hide:self];
+    return [WebUndefined undefined];
+}
+
+- (id)hideOtherApplications
+{
+    [NSApp hideOtherApplications:self];
+    return [WebUndefined undefined];
+}
+
+- (id)openPanel
+{
+    NSOpenPanel * openPanel = [NSOpenPanel openPanel];
+
+    NSInteger result = [openPanel runModal];
+
+    NSMutableString * resultObject = [NSMutableString stringWithFormat:@"({ button:%d, URLs:", result];
+
+    NSMutableArray * fileSystemURLs = [NSMutableArray array];
+
+    for (NSURL * URL in [openPanel URLs])
+        [fileSystemURLs addObject:[URL HTTPFileSystemURL]];
+
+    if (result == NSFileHandlingPanelOKButton)
+        [resultObject appendString:[NSString stringWithFormat:@"[\"%@\"] })", [fileSystemURLs componentsJoinedByString:@"\", \""]]];
+
+    else
+        [resultObject appendString:@"[] })"];
+
+    return [[webView windowScriptObject] evaluateWebScript:resultObject];
+}
+
+- (id)savePanel:(NSArray *)arguments
+{
+    NSSavePanel * savePanel = [NSSavePanel savePanel];
+    WebScriptObject *args = [arguments objectAtIndex:0];
+
+    [savePanel setAllowedFileTypes:[BridgedMethods arrayFromWebScriptObject:[args valueForKey:@"allowedFileTypes"]]];
+
+    id allowsOtherFileTypes = [args valueForKey:@"allowsOtherFileTypes"];
+
+    [savePanel setAllowsOtherFileTypes:allowsOtherFileTypes && [allowsOtherFileTypes webBoolValue]];
+
+    id isExtensionHidden = [args valueForKey:@"isExtensionHidden"];
+
+    [savePanel setExtensionHidden:isExtensionHidden && [isExtensionHidden webBoolValue]];
+
+    id canSelectHiddenExtension = [args valueForKey:@"canSelectHiddenExtension"];
+
+    [savePanel setCanSelectHiddenExtension:canSelectHiddenExtension && canSelectHiddenExtension];
+
+    id canCreateDirectories = [args valueForKey:@"canCreateDirectories"];
+
+    [savePanel setCanCreateDirectories:canCreateDirectories && [canCreateDirectories webBoolValue]];
+
+    NSInteger result = [savePanel runModal];
+
+    return [[webView windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"({ button:%d, URL:\"%@\" })", result, [[[savePanel URL] HTTPFileSystemURL] absoluteString]]];
+}
+
+- (id)clearRecentDocuments
+{
+    [[NSDocumentController sharedDocumentController] clearRecentDocuments:self];
+    return [WebUndefined undefined];
+}
+
+- (id)noteNewRecentDocumentPath:(NSArray *)arguments
+{
+    if (![arguments count])
+        return [WebUndefined undefined];
+
+    NSString *aURL = [arguments objectAtIndex:0];
+    NSURL *fileURL = [NSURL fileSystemURLFromHTTPFileSystemString:aURL];
+
+    [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:fileURL];
+
+    return [WebUndefined undefined];
+}
+
+- (id)recentDocumentURLs
+{
+    NSArray *existingURLs = [[NSDocumentController sharedDocumentController] recentDocumentURLs];
+    NSMutableArray *urlsAsStrings = [NSMutableArray array];
+
+    for (int i=0, count = [existingURLs count]; i < count; i++)
+        [urlsAsStrings addObject:[[existingURLs objectAtIndex:i] absoluteString]];
+
+    return urlsAsStrings;
+}
+
+- (id)pasteboardWithName:(NSArray *)arguments
+{
+    if (![arguments count])
+        return [WebUndefined undefined];
+
+    return [WebPasteboardProxy pasteboardWithName:[arguments objectAtIndex:0]];
+}
+
+@end
+
+@implementation WindowMethods
+
+- (id)miniaturize
+{
+    [[webView window] miniaturize:nil];
+	return [WebUndefined undefined];
+}
+
+- (id)deminiaturize
+{
+    [[webView window] deminiaturize:nil];
+	return [WebUndefined undefined];
+}
+
+- (id)level
+{
+    return [NSNumber numberWithInt:[[webView window] level]];
+}
+
+- (id)setLevel:(NSArray *)arguments
+{
+    [[webView window] setLevel:[[arguments objectAtIndex:0] intValue]];
+
+    return [WebUndefined undefined];
+}
+
+- (id)hasShadow
+{
+    return [NSNumber numberWithBool:[[webView window] hasShadow]];
+}
+
+- (id)setHasShadow:(NSArray *)arguments
+{
+    [[webView window] setHasShadow:[[arguments objectAtIndex:0] boolValue]];
+
+    return [WebUndefined undefined];
+}
+
+- (id)frame
+{
+    NSRect frame = [[webView window] frame];
+
+    return [[webView windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"({ origin:{%f, %f}, size:{%f, %f}})", NSMinX(frame), NSMinY(frame), NSWidth(frame), NSHeight(frame)]];
+}
+
+- (id)setFrame:(NSArray *)arguments
+{
+    id  origin = [[arguments objectAtIndex:0] valueForKey:@"origin"],
+    size = [[arguments objectAtIndex:0] valueForKey:@"size"];
+
+    NSWindow * window = [webView window];
+    NSScreen * screen = [window screen];
+
+    if (!screen)
+    screen = [NSScreen mainScreen]; // Is this correct?
+
+    float height = [[size valueForKey:@"height"] floatValue];
+
+    [[webView window] setFrame:NSMakeRect([[origin valueForKey:@"x"] floatValue], NSMaxY([screen frame]) - [[origin valueForKey:@"y"] floatValue] - height, [[size valueForKey:@"width"] floatValue], height) display:YES];
+    /*
+     NSLog([webView description]);
+     NSLog(@"%@ %@", [window screen], NSStringFromRect([window frame]));
+     NSLog(@"%f - %f - %f = %f", NSMaxY([[window screen] frame]), [[origin valueForKey:@"y"] floatValue], height, NSMaxY([[window screen] frame]) - [[origin valueForKey:@"y"] floatValue] - height);
+     NSLog(@"FROM: %@", NSStringFromRect(NSMakeRect([[origin valueForKey:@"x"] floatValue], [[origin valueForKey:@"y"] floatValue], [[size valueForKey:@"width"] floatValue], height)));
+     NSLog(@"  TO: %@", NSStringFromRect([[webView window] frame]));
+     */
+
+    return [WebUndefined undefined];
+}
+
+- (id)shadowStyle
+{
+    WebWindow * window = (WebWindow *)[webView window];
+
+    return [NSNumber numberWithInt:[window shadowStyle]];
+}
+
+- (id)setShadowStyle:(id)arguments
+{
+    int type = [[arguments objectAtIndex:0] intValue];
+
+    WebWindow * window = (WebWindow *)[webView window];
+
+    [window setShadowStyle:type];
+
+    return [WebUndefined undefined];
+}
+
+@end
+
+
+@interface WindowScriptObjectMethod : NSObject
+{
+    WebView * webView;
+}
+
+- (id)initWithWebView:(WebView *)aWebView;
+
+@end
+
+@implementation WindowScriptObjectMethod
+
+- (id)initWithWebView:(WebView *)aWebView
+{
+    self = [super init];
+
+	if (self)
+        webView = aWebView;
+
+    return self;
+}
+
+@end
+
+@implementation BridgedMethods
+
++ (NSMutableArray *)arrayFromWebScriptObject:(WebScriptObject *)incomingObject
+{
+    if (!incomingObject)
+        return nil;
+
+    NSMutableArray * newItems = [[NSMutableArray alloc] init];
+
+    for (int i=0; [incomingObject webScriptValueAtIndex:i]!=[WebUndefined undefined]; i++)
+    {
+        id oneItem =[incomingObject webScriptValueAtIndex:i];
+        [newItems addObject:oneItem];
+    }
+
+    return [newItems autorelease];
+}
+
++ (void)enhanceWindowObject:(WebScriptObject *)aWindowObject ofWebView:(WebView *)aWebView
+{
+    NSDictionary * classMethods = [MethodClasses objectForKey:[self className]];
+    NSString * key = nil;
+    NSEnumerator * keyEnumerator = [classMethods keyEnumerator];
+
+    while (key = [keyEnumerator nextObject])
+        [aWindowObject setValue:[(WindowScriptObjectMethod *)[[[classMethods objectForKey:key] alloc] initWithWebView:aWebView] autorelease] forKey:key];
+}
+
++ (void)bridgeMethod:(Method)aMethod dictionary:(NSMutableDictionary *)aDictionary
+{
+    NSString    * methodName = NSStringFromSelector(method_getName(aMethod)),
+                * publicMethodName = [NSString stringWithFormat:@"cp%@", [[NSString stringWithFormat:@"%@%@", [[methodName substringToIndex:1] uppercaseString], [methodName substringFromIndex:1]] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":"]]];
+
+    Class methodClass = objc_allocateClassPair([WindowScriptObjectMethod class], [[NSString stringWithFormat:@"WebScriptObjectMethod_%@", publicMethodName] cString], 0);
+
+    class_addMethod(methodClass, @selector(invokeDefaultMethodWithArguments:), method_getImplementation(aMethod), "@@:@");
+
+    objc_registerClassPair(methodClass);
+
+    [aDictionary setObject:methodClass forKey:publicMethodName];
+}
+
++ (void)initialize
+{
+    if (!MethodClasses)
+        MethodClasses = [[NSMutableDictionary alloc] init];
+
+    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
+
+    [MethodClasses setObject:dictionary forKey:[self className]];
+    [dictionary release];
+
+    unsigned int methodCount = 0;
+    Method * methods = class_copyMethodList(self, &methodCount);
+
+    if (!methods)
+        return;
+
+    int index = 0;
+
+    for (; index < methodCount; ++index)
+        [self bridgeMethod:methods[index] dictionary:dictionary];
+
+    free(methods);
+    methods = NULL;
+}
+
+@end
diff --git a/Tools/NativeHost/Console.h b/Tools/NativeHost/Console.h
new file mode 100644
index 000000000..a4d9b6c42
--- /dev/null
+++ b/Tools/NativeHost/Console.h
@@ -0,0 +1,21 @@
+//
+//  Console.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 6/16/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+@interface Console : NSObject
+{
+    NSMutableAttributedString * contents;
+}
+
++ (id)sharedConsole;
+
+- (NSAttributedString *)contents;
+
+@end
diff --git a/Tools/NativeHost/Console.m b/Tools/NativeHost/Console.m
new file mode 100644
index 000000000..2118f999b
--- /dev/null
+++ b/Tools/NativeHost/Console.m
@@ -0,0 +1,69 @@
+//
+//  Console.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 6/16/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "Console.h"
+
+#import "AppController.h"
+
+
+@implementation Console
+
++ (id)sharedConsole
+{
+    static Console * console = nil;
+
+    if (!console)
+        console = [[Console alloc] init];
+
+    return console;
+}
+
+- (id)init
+{
+    self = [super init];
+
+    if (self)
+        contents = [[NSMutableAttributedString alloc] init];
+
+    return self;
+}
+
+- (void)dealloc
+{
+    [contents release];
+    [super dealloc];
+}
+
+- (NSAttributedString *)contents
+{
+    return contents;
+}
+
+- (void)webView:(WebView *)aWebView addMessageToConsole:(NSDictionary *)aDictionary
+{
+    NSString * message = [aDictionary objectForKey:@"message"];
+
+    NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n", message, nil]];
+    [contents appendAttributedString:attrString];
+    [attrString release];
+
+    NHLog(@"CONSOLE", message);
+}
+
+- (void)webView:(WebView *)aSender runJavaScriptAlertPanelWithMessage:(NSString *)aMessage initiatedByFrame:(WebFrame *)aFrame
+{
+    WebDataSource * dataSource = [aFrame dataSource];
+    NSString * title = [dataSource pageTitle];
+
+    if (![title length])
+        title = [[[dataSource request] URL] absoluteString];
+
+    [[NSAlert alertWithMessageText:title defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:aMessage, nil] runModal];
+}
+
+@end
diff --git a/Tools/NativeHost/English.lproj/InfoPlist.strings b/Tools/NativeHost/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000000000000000000000000000000000000..5e45963c382ba690b781b953a00585212b898ac5
GIT binary patch
literal 92
zcmW-XQ3`+{5C!MkQ~2$No+IcIkqMDxWCV8j>LCj|yTg2Mz+o9F%uHlf9u}h9EuK`F
a!Y*1dX%G66ZqL#C$|bw0ZoP5@jOGW1ArT7z

literal 0
HcmV?d00001

diff --git a/Tools/NativeHost/English.lproj/MainMenu.xib b/Tools/NativeHost/English.lproj/MainMenu.xib
new file mode 100644
index 000000000..2bce8a810
--- /dev/null
+++ b/Tools/NativeHost/English.lproj/MainMenu.xib
@@ -0,0 +1,548 @@
+
+
+	
+		1050
+		10C540
+		732
+		1038.25
+		458.00
+		
+			com.apple.InterfaceBuilder.CocoaPlugin
+			732
+		
+		
+			YES
+		
+		
+			YES
+			com.apple.InterfaceBuilder.CocoaPlugin
+		
+		
+			YES
+			
+				YES
+			
+			
+				YES
+			
+		
+		
+			YES
+			
+				NSApplication
+			
+			
+				FirstResponder
+			
+			
+				NSApplication
+			
+			
+				NSFontManager
+			
+			
+				AppController
+			
+		
+		
+			
+				YES
+				
+					
+						delegate
+						
+						
+					
+					519
+				
+			
+			
+				
+					YES
+					
+						0
+						
+						
+						
+					
+					
+						-2
+						
+						
+						File's Owner
+					
+					
+						-1
+						
+						
+						First Responder
+					
+					
+						-3
+						
+						
+						Application
+					
+					
+						420
+						
+						
+					
+					
+						487
+						
+						
+					
+				
+			
+			
+				-3.IBPluginDependency
+				com.apple.InterfaceBuilder.CocoaPlugin
+			
+			
+				YES
+				
+				
+					YES
+				
+			
+			
+			
+				YES
+				
+				
+					YES
+				
+			
+			
+			677
+		
+		
+			
+				YES
+				
+					AppController
+					NSObject
+					
+						IBProjectSource
+						AppController.h
+					
+				
+				
+					NSObject
+					
+						IBProjectSource
+						NSObject+WebAdditions.h
+					
+				
+			
+			
+				YES
+				
+					NSApplication
+					NSResponder
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSApplication.h
+					
+				
+				
+					NSApplication
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSApplicationScripting.h
+					
+				
+				
+					NSApplication
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSColorPanel.h
+					
+				
+				
+					NSApplication
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSHelpManager.h
+					
+				
+				
+					NSApplication
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSPageLayout.h
+					
+				
+				
+					NSApplication
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSUserInterfaceItemSearching.h
+					
+				
+				
+					NSFontManager
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSFontManager.h
+					
+				
+				
+					NSMenu
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSMenu.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSAccessibility.h
+					
+				
+				
+					NSObject
+					
+				
+				
+					NSObject
+					
+				
+				
+					NSObject
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSControl.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSDictionaryController.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSDragging.h
+					
+				
+				
+					NSObject
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSFontPanel.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSKeyValueBinding.h
+					
+				
+				
+					NSObject
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSNibLoading.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSOutlineView.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSPasteboard.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSSavePanel.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSTableView.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSToolbarItem.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSView.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSArchiver.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSClassDescription.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSError.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSFileManager.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSKeyValueCoding.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSKeyValueObserving.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSKeyedArchiver.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSObject.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSObjectScripting.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSPortCoder.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSRunLoop.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSScriptClassDescription.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSScriptKeyValueCoding.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSScriptObjectSpecifiers.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSScriptWhoseTests.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSThread.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSURL.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSURLConnection.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						Foundation.framework/Headers/NSURLDownload.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebDownload.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebEditingDelegate.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebFrameLoadDelegate.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebJavaPlugIn.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebPlugin.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebPluginContainer.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebPolicyDelegate.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebResourceLoadDelegate.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebScriptObject.h
+					
+				
+				
+					NSObject
+					
+						IBFrameworkSource
+						WebKit.framework/Headers/WebUIDelegate.h
+					
+				
+				
+					NSResponder
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSInterfaceStyle.h
+					
+				
+				
+					NSResponder
+					NSObject
+					
+						IBFrameworkSource
+						AppKit.framework/Headers/NSResponder.h
+					
+				
+			
+		
+		0
+		
+			com.apple.InterfaceBuilder.CocoaPlugin.macosx
+			
+		
+		
+			com.apple.InterfaceBuilder.CocoaPlugin.macosx
+			
+		
+		
+			com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3
+			
+		
+		YES
+		../NativeHost.xcodeproj
+		3
+	
+
diff --git a/Tools/NativeHost/Info.plist b/Tools/NativeHost/Info.plist
new file mode 100644
index 000000000..2f8dbca99
--- /dev/null
+++ b/Tools/NativeHost/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+	CFBundleDevelopmentRegion
+	English
+	CFBundleExecutable
+	${EXECUTABLE_NAME}
+	CFBundleIconFile
+	icon
+    CFBundleShortVersionString
+    0.9
+	CFBundleIdentifier
+	com.280north.${PRODUCT_NAME:identifier}
+	CFBundleInfoDictionaryVersion
+	6.0
+	CFBundleName
+	NativeHost
+	CFBundlePackageType
+	APPL
+	CFBundleSignature
+	????
+	CFBundleVersion
+	1.0
+	NSMainNibFile
+	MainMenu
+	NSPrincipalClass
+	NSApplication
+
+
diff --git a/Tools/NativeHost/Jakefile b/Tools/NativeHost/Jakefile
new file mode 100644
index 000000000..f6151df83
--- /dev/null
+++ b/Tools/NativeHost/Jakefile
@@ -0,0 +1,36 @@
+
+require("../../common.jake");
+
+var OS = require("os");
+var task = require("jake").task
+
+task ("build", function()
+{
+    if (executableExists("xcodebuild"))
+    {
+        if (OS.system("xcodebuild -alltargets -configuration Release"))
+            OS.exit(1);
+        
+        rm_rf(FILE.join($BUILD_CJS_CAPPUCCINO, "support", "NativeHost.app"));
+        FILE.mkdirs(FILE.join($BUILD_CJS_CAPPUCCINO, "support"))
+        cp_r(FILE.join("build", "Release", "NativeHost.app"), FILE.join($BUILD_CJS_CAPPUCCINO, "support", "NativeHost.app"));
+    }
+    else
+    {
+        print("Building NativeHost requires Xcode.");
+    }
+});
+
+task ("clean", function()
+{
+    if (OS.system("xcodebuild clean"))
+        OS.exit(1);
+});
+
+task ("clobber", function()
+{
+    if (OS.system("xcodebuild clean"))
+        OS.exit(1);
+});
+
+task ("default", ["build"]);
diff --git a/Tools/NativeHost/MenuBridge.h b/Tools/NativeHost/MenuBridge.h
new file mode 100644
index 000000000..847237409
--- /dev/null
+++ b/Tools/NativeHost/MenuBridge.h
@@ -0,0 +1,22 @@
+//
+//  MenuBridge.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/2/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+@class WebScriptObject;
+
+@interface MenuBridge : NSMenu
+{
+    WebScriptObject * menuObject;
+}
+
++ (id)menuBridgeWithMenuObject:(WebScriptObject *)aMenuObject;
+- (id)initWithMenuObject:(WebScriptObject *)aMenuObject;
+
+@end
diff --git a/Tools/NativeHost/MenuBridge.m b/Tools/NativeHost/MenuBridge.m
new file mode 100644
index 000000000..ad14a7191
--- /dev/null
+++ b/Tools/NativeHost/MenuBridge.m
@@ -0,0 +1,63 @@
+//
+//  MenuBridge.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/2/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "WebScripObject+Objective-J.h"
+#import "MenuItemBridge.h"
+#import "MenuBridge.h"
+
+
+@implementation MenuBridge
+
++ (id)menuBridgeWithMenuObject:(WebScriptObject *)aMenuObject
+{
+    if (!aMenuObject)
+        return nil;
+
+    static NSMapTable * cache = nil;
+
+    if (!cache)
+        cache = [[NSMapTable mapTableWithStrongToStrongObjects] retain];
+
+    MenuBridge * menuBridge = [cache objectForKey:aMenuObject];
+
+    if (!menuBridge)
+    {
+        menuBridge = [MenuBridge alloc];
+
+        [cache setObject:menuBridge forKey:aMenuObject];
+
+        [[menuBridge initWithMenuObject:aMenuObject] autorelease];
+    }
+
+    return menuBridge;
+}
+
+- (id)initWithMenuObject:(WebScriptObject *)aMenuObject
+{
+    self = [super initWithTitle:[aMenuObject bridgeSelector:@selector(title)]];
+
+    if (self)
+    {
+        menuObject = aMenuObject;
+
+        NSInteger   index = 0,
+                    count = [[aMenuObject bridgeSelector:@selector(numberOfItems)] intValue];
+
+        for (; index < count; ++index)
+            [self addItem:[[[MenuItemBridge alloc] initWithMenuItemObject:[aMenuObject bridgeSelector:@selector(itemAtIndex:) withObject:[NSNumber numberWithInt:index]]] autorelease]];
+    }
+
+    return self;
+}
+
+- (void)performActionForItemAtIndex:(NSInteger)anIndex
+{
+    [menuObject bridgeSelector:@selector(performActionForItemAtIndex:) withObject:[NSNumber numberWithInt:anIndex]];
+}
+
+@end
diff --git a/Tools/NativeHost/MenuItemBridge.h b/Tools/NativeHost/MenuItemBridge.h
new file mode 100644
index 000000000..86e70d6f2
--- /dev/null
+++ b/Tools/NativeHost/MenuItemBridge.h
@@ -0,0 +1,24 @@
+//
+//  ReflectMenuItem.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/2/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+@class WebScriptObject;
+
+@interface MenuItemBridge : NSMenuItem
+{
+    WebScriptObject * menuItemObject;
+}
+
++ (id)menuItemBridgeWithMenuItemObject:(WebScriptObject *)aMenuItemObject;
+- (id)initWithMenuItemObject:(WebScriptObject *)aMenuItemObject;
+
+- (void)updateFromMenuItemObject;
+
+@end
diff --git a/Tools/NativeHost/MenuItemBridge.m b/Tools/NativeHost/MenuItemBridge.m
new file mode 100644
index 000000000..b661f35e8
--- /dev/null
+++ b/Tools/NativeHost/MenuItemBridge.m
@@ -0,0 +1,77 @@
+//
+//  ReflectMenuItem.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/2/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "WebScripObject+Objective-J.h"
+#import "MenuBridge.h"
+#import "MenuItemBridge.h"
+
+
+@implementation MenuItemBridge
+
++ (id)menuItemBridgeWithMenuItemObject:(WebScriptObject *)aMenuItemObject
+{
+    if (!aMenuItemObject)
+        return nil;
+    
+    static NSMapTable * cache = nil;
+    
+    if (!cache)
+        cache = [[NSMapTable mapTableWithStrongToStrongObjects] retain];
+    
+    MenuItemBridge * menuItemBridge = [cache objectForKey:aMenuItemObject];
+    
+    if (!menuItemBridge)
+    {
+        menuItemBridge = [MenuBridge alloc];
+
+        [cache setObject:menuItemBridge forKey:aMenuItemObject];
+
+        [[menuItemBridge initWithMenuItemObject:aMenuItemObject] autorelease];
+    }
+    
+    return menuItemBridge;
+}
+
+- (id)initWithMenuItemObject:(WebScriptObject *)aMenuItemObject
+{
+    if ([[aMenuItemObject bridgeSelector:@selector(isSeparatorItem)] boolValue])
+        return [[NSMenuItem separatorItem] retain];
+
+    self = [super init];
+
+    if (self)
+    {
+        menuItemObject = aMenuItemObject;
+
+        [self updateFromMenuItemObject];
+    }
+
+    return self;
+}
+/*
+- (BOOL)isSeparatorItem
+{
+    return [[menuItemObject bridgeSelector:@selector(isSeparatorItem)] boolValue];
+}
+*/
+- (void)updateFromMenuItemObject
+{
+    [self setTitle:[menuItemObject bridgeSelector:@selector(title)]];
+    [self setSubmenu:[MenuBridge menuBridgeWithMenuObject:[menuItemObject bridgeSelector:@selector(submenu)]]];
+    [self setKeyEquivalent:[menuItemObject bridgeSelector:@selector(keyEquivalent)]];
+    [self setKeyEquivalentModifierMask:[[menuItemObject evaluateObjectiveJ:[NSString stringWithFormat:@"(function() { var mask = %u; return (((mask & CPAlphaShiftKeyMask) ? %u : 0) | ((mask & CPShiftKeyMask) ? %u : 0) | ((mask & CPControlKeyMask) ? %u : 0) | ((mask & CPAlternateKeyMask) ? %u : 0) | ((mask & CPCommandKeyMask) ? %u : 0) | ((mask & CPNumericPadKeyMask) ? %u : 0) | ((mask & CPHelpKeyMask) ? %u : 0) | ((mask & CPFunctionKeyMask) ? %u : 0)) }())", [[menuItemObject bridgeSelector:@selector(keyEquivalentModifierMask)] unsignedIntegerValue], NSAlphaShiftKeyMask, NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, NSCommandKeyMask, NSNumericPadKeyMask, NSHelpKeyMask, NSFunctionKeyMask, NSDeviceIndependentModifierFlagsMask]] unsignedIntegerValue]];[self setAction:@selector(bridgeAction:)];
+    [self setTarget:self];
+    [self setAction:@selector(bridgeAction:)];
+}
+
+// This exists so that the menu items are enabled.
+- (void)bridgeAction:(id)aSender
+{
+}
+
+@end
diff --git a/Tools/NativeHost/NSObject+WebAdditions.h b/Tools/NativeHost/NSObject+WebAdditions.h
new file mode 100644
index 000000000..b4ab41035
--- /dev/null
+++ b/Tools/NativeHost/NSObject+WebAdditions.h
@@ -0,0 +1,16 @@
+//
+//  NSObject+WebAdditions.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 11/16/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+@interface NSObject (WebAdditions)
+
+- (BOOL)webBoolValue;
+
+@end
diff --git a/Tools/NativeHost/NSObject+WebAdditions.m b/Tools/NativeHost/NSObject+WebAdditions.m
new file mode 100644
index 000000000..1ffd942a1
--- /dev/null
+++ b/Tools/NativeHost/NSObject+WebAdditions.m
@@ -0,0 +1,19 @@
+//
+//  NSObject+WebAdditions.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 11/16/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "NSObject+WebAdditions.h"
+
+
+@implementation NSObject (WebAdditions)
+
+- (BOOL)webBoolValue
+{
+    return [self isKindOfClass:[NSNumber class]] && [(NSNumber *)self boolValue];
+}
+
+@end
diff --git a/Tools/NativeHost/NSURL+Additions.h b/Tools/NativeHost/NSURL+Additions.h
new file mode 100644
index 000000000..32cee28f6
--- /dev/null
+++ b/Tools/NativeHost/NSURL+Additions.h
@@ -0,0 +1,17 @@
+//
+//  NSURL+Additions.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 6/3/09.
+//  Copyright 2009 280 North, Inc. All rights reserved.
+//
+
+#import 
+
+
+@interface NSURL (Additions)
+
+- (NSURL *)HTTPFileSystemURL;
++ (NSURL *)fileSystemURLFromHTTPFileSystemString:(NSString *)aString;
+
+@end
diff --git a/Tools/NativeHost/NSURL+Additions.m b/Tools/NativeHost/NSURL+Additions.m
new file mode 100644
index 000000000..8597da97a
--- /dev/null
+++ b/Tools/NativeHost/NSURL+Additions.m
@@ -0,0 +1,36 @@
+//
+//  NSURL+Additions.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 6/3/09.
+//  Copyright 2009 280 North, Inc. All rights reserved.
+//
+
+#import "NSURL+Additions.h"
+#import "AppController.h"
+
+@implementation NSURL (Additions)
+
+- (NSURL *)HTTPFileSystemURL
+{
+    if ([[self scheme] caseInsensitiveCompare:@"file"] == NSOrderedSame)
+        return [[[NSURL alloc] initWithScheme:@"http"
+										 host:[NSString stringWithFormat:@"localhost:%d", SERVER_PORT] 
+										 path:[@"/filesystem/" stringByAppendingString:[self path]]] autorelease];
+
+    return [[self copy] autorelease];
+}
+
++ (NSURL *)fileSystemURLFromHTTPFileSystemString:(NSString *)aString
+{
+    NSURL *httpURL = [NSURL URLWithString:aString];
+    NSString *path = [httpURL path];
+    NSRange range = [path rangeOfString:@"/filesystem"];
+
+    if (range.location == 0 && NSMaxRange(range) < [path length])
+        path = [path substringFromIndex:[@"/filesystem" length]];
+
+    return [[[NSURL alloc] initFileURLWithPath:path] autorelease];
+}
+
+@end
diff --git a/Tools/NativeHost/NativeHost.xcodeproj/TemplateIcon.icns b/Tools/NativeHost/NativeHost.xcodeproj/TemplateIcon.icns
new file mode 100644
index 0000000000000000000000000000000000000000..62cb7015e09d6ea3e65d7f7949c4c07f9246a908
GIT binary patch
literal 52318
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
WhsmLR^b3`
+    #import 
+#endif
diff --git a/Tools/NativeHost/SSCrypto.h b/Tools/NativeHost/SSCrypto.h
new file mode 100644
index 000000000..89ff70a9e
--- /dev/null
+++ b/Tools/NativeHost/SSCrypto.h
@@ -0,0 +1,116 @@
+/*
+ Copyright (c) 2003-2006, Septicus Software All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ 
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer. 
+ * 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. 
+ * Neither the name of Septicus Software nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+ 
+ 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.
+*/
+//
+//  SSCrypto.h
+//
+//  Created by Ed Silva on Sat May 31 2003.
+//  Copyright (c) 2003-2006 Septicus Software. All rights reserved.
+//
+
+
+#import 
+#import 
+#import 
+#import 
+#import 
+#import 
+#import 
+#import 
+#import 
+#import 
+#import 
+
+@interface NSData (HexDump)
+- (NSString *)encodeBase64;
+- (NSString *)encodeBase64WithNewlines:(BOOL)encodeWithNewlines;
+- (NSData *)decodeBase64;
+- (NSData *)decodeBase64WithNewLines:(BOOL)decodeWithNewLines;
+- (NSString *)hexval;
+- (NSString *)hexdump;
+@end
+
+@interface SSCrypto : NSObject
+{
+    NSData *symmetricKey;
+    NSData *cipherText;
+    NSData *clearText;
+	NSData *publicKey;
+	NSData *privateKey;
+	
+	BOOL isSymmetric;
+}
+
+- (id)init;
+- (id)initWithSymmetricKey:(NSData *)k;
+- (id)initWithPublicKey:(NSData *)pub;
+- (id)initWithPrivateKey:(NSData *)priv;
+- (id)initWithPublicKey:(NSData *)pub privateKey:(NSData *)priv;
+
+- (BOOL)isSymmetric;
+- (void)setIsSymmetric:(BOOL)flag;
+
+- (NSData *)symmetricKey;
+- (void)setSymmetricKey:(NSData *)k;
+
+- (NSData *)publicKey;
+- (void)setPublicKey:(NSData *)k;
+
+- (NSData *)privateKey;
+- (void)setPrivateKey:(NSData *)k;
+
+- (NSData *)clearTextAsData;
+- (NSString *)clearTextAsString;
+- (void)setClearTextWithData:(NSData *)c;
+- (void)setClearTextWithString:(NSString *)c;
+
+- (NSData *)cipherTextAsData;
+- (NSString *)cipherTextAsString;
+- (void)setCipherText:(NSData *)c;
+
+- (NSData *)decrypt;
+- (NSData *)decrypt:(NSString *)cipherName;
+
+- (NSData *)verify;
+
+- (NSData *)encrypt;
+- (NSData *)encrypt:(NSString *)cipherName;
+
+- (NSData *)sign;
+
+- (NSData *)digest:(NSString *)digestName;
+
++ (NSData *)generateRSAPrivateKeyWithLength:(int)length;
++ (NSData *)generateRSAPublicKeyFromPrivateKey:(NSData *)privateKey;
++ (NSData *)getKeyDataWithLength:(int)length;
++ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt;
++ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt withIterations:(int)count;
++ (NSData *)getSHA1ForData:(NSData *)d;
++ (NSData *)getMD5ForData:(NSData *)d;
+
+@end
diff --git a/Tools/NativeHost/SSCrypto.m b/Tools/NativeHost/SSCrypto.m
new file mode 100644
index 000000000..09c557531
--- /dev/null
+++ b/Tools/NativeHost/SSCrypto.m
@@ -0,0 +1,1214 @@
+/*
+ Copyright (c) 2003-2006, Septicus Software All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ 
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer. 
+ * 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. 
+ * Neither the name of Septicus Software nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+ 
+ 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.
+ */
+//
+//  SSCrypto.m
+//  SimpleWebCam
+//
+//  Created by Ed Silva on Sat May 31 2003.
+//  Copyright (c) 2003-2006 Septicus Software. All rights reserved.
+//
+
+#import "SSCrypto.h"
+
+@implementation NSData (HexDump)
+
+/**
+ * Encodes the current data in base64, and creates and returns an NSString from the result.
+ * This is the same as piping data through "... | openssl enc -base64" on the command line.
+ *
+ * Code courtesy of DaveDribin (http://www.dribin.org/dave/)
+ * Taken from http://www.cocoadev.com/index.pl?BaseSixtyFour
+**/
+- (NSString *)encodeBase64
+{
+    return [self encodeBase64WithNewlines: YES];
+}
+
+/**
+ * Encodes the current data in base64, and creates and returns an NSString from the result.
+ * This is the same as piping data through "... | openssl enc -base64" on the command line.
+ *
+ * Code courtesy of DaveDribin (http://www.dribin.org/dave/)
+ * Taken from http://www.cocoadev.com/index.pl?BaseSixtyFour
+**/
+- (NSString *)encodeBase64WithNewlines:(BOOL)encodeWithNewlines
+{
+    // Create a memory buffer which will contain the Base64 encoded string
+    BIO * mem = BIO_new(BIO_s_mem());
+    
+    // Push on a Base64 filter so that writing to the buffer encodes the data
+    BIO * b64 = BIO_new(BIO_f_base64());
+    if (!encodeWithNewlines)
+        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+    mem = BIO_push(b64, mem);
+    
+    // Encode all the data
+    BIO_write(mem, [self bytes], [self length]);
+    BIO_flush(mem);
+    
+    // Create a new string from the data in the memory buffer
+    char * base64Pointer;
+    long base64Length = BIO_get_mem_data(mem, &base64Pointer);
+    // we use an NSData here since the base64pointer is not null terminated
+    // the byte array the NSData return should be
+    // so making an NSString from that will be okay
+    NSData * base64data = [NSData dataWithBytes:base64Pointer length:base64Length];
+    NSString * base64String = [NSString stringWithUTF8String:[base64data bytes]];
+
+    // Clean up and go home
+    BIO_free_all(mem);
+	
+	if (!encodeWithNewlines)
+		base64String = [[base64String componentsSeparatedByString:@"\n"] componentsJoinedByString:@""];
+	
+    return base64String;
+}
+
+- (NSData *)decodeBase64
+{
+    return [self decodeBase64WithNewLines:YES];
+}
+
+- (NSData *)decodeBase64WithNewLines:(BOOL)encodedWithNewlines
+{
+    // Create a memory buffer containing Base64 encoded string data
+    BIO * mem = BIO_new_mem_buf((void *) [self bytes], [self length]);
+
+    // Push a Base64 filter so that reading from the buffer decodes it
+    BIO * b64 = BIO_new(BIO_f_base64());
+    if (!encodedWithNewlines)
+        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+    mem = BIO_push(b64, mem);
+
+    // Decode into an NSMutableData
+    NSMutableData * data = [NSMutableData data];
+    char inbuf[512];
+    int inlen;
+    while ((inlen = BIO_read(mem, inbuf, sizeof(inbuf))) > 0)
+        [data appendBytes: inbuf length: inlen];
+
+    // Clean up and go home
+    BIO_free_all(mem);
+    return data;
+}
+
+- (NSString *)hexval
+{
+    NSMutableString *hex = [NSMutableString string];
+    unsigned char *bytes = (unsigned char *)[self bytes];
+    char temp[3];
+    int i = 0;
+
+    for (i = 0; i < [self length]; i++) {
+        temp[0] = temp[1] = temp[2] = 0;
+        (void)sprintf(temp, "%02x", bytes[i]);
+        [hex appendString:[NSString stringWithUTF8String:temp]];
+    }
+
+    return hex;
+}
+
+- (NSString *)hexdump
+{
+    NSMutableString *ret=[NSMutableString stringWithCapacity:[self length]*2];
+    /* dumps size bytes of *data to string. Looks like:
+    * [0000] 75 6E 6B 6E 6F 77 6E 20
+    *                  30 FF 00 00 00 00 39 00 unknown 0.....9.
+    * (in a single line of course)
+    */
+    unsigned int size= [self length];
+    const unsigned char *p = [self bytes];
+    unsigned char c;
+    int n;
+    char bytestr[4] = {0};
+    char addrstr[10] = {0};
+    char hexstr[ 16*3 + 5] = {0};
+    char charstr[16*1 + 5] = {0};
+    for(n=1;n<=size;n++) {
+        if (n%16 == 1) {
+            /* store address for this line */
+            snprintf(addrstr, sizeof(addrstr), "%.4x",
+                     (unsigned int)((long)p-(long)self) );
+        }
+        
+        c = *p;
+        if (isalnum(c) == 0) {
+            c = '.';
+        }
+        
+        /* store hex str (for left side) */
+        snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
+        strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
+        
+        /* store char str (for right side) */
+        snprintf(bytestr, sizeof(bytestr), "%c", c);
+        strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
+        
+        if(n%16 == 0) {
+            /* line completed */
+            //printf("[%4.4s]   %-50.50s  %s\n", addrstr, hexstr, charstr);
+            [ret appendString:[NSString stringWithFormat:@"[%4.4s]   %-50.50s  %s\n",
+                addrstr, hexstr, charstr]];
+            hexstr[0] = 0;
+            charstr[0] = 0;
+        } else if(n%8 == 0) {
+            /* half line: add whitespaces */
+            strncat(hexstr, "  ", sizeof(hexstr)-strlen(hexstr)-1);
+            strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1);
+        }
+        p++; /* next byte */
+    }
+    
+    if (strlen(hexstr) > 0) {
+        /* print rest of buffer if not empty */
+        //printf("[%4.4s]   %-50.50s  %s\n", addrstr, hexstr, charstr);
+        [ret appendString:[NSString stringWithFormat:@"[%4.4s]   %-50.50s  %s\n",
+            addrstr, hexstr, charstr]];
+    }
+    return ret;
+}
+
+@end
+
+@interface SSCrypto (PrivateAPI)
+- (void)setupOpenSSL;
+- (void)cleanupOpenSSL;
+@end
+
+// SSCrypto object
+@implementation SSCrypto
+
+/**
+ * Generic constructor.
+ * Simply configures internal OpenSSL setup.
+**/
+- (id)init
+{
+    if(self = [super init])
+	{
+        // Call private method to handle the setup for internal OpenSSL stuff
+		[self setupOpenSSL];
+    }
+    return self;
+}
+
+/**
+ * Symmetric key constructor.
+ * Configures the instance to use symmetric encryption/decryption using the given symmetric key.
+**/
+- (id)initWithSymmetricKey:(NSData *)k
+{
+    if(self = [super init])
+	{
+        // Call private method to handle the setup for internal OpenSSL stuff
+		[self setupOpenSSL];
+		
+        [self setSymmetricKey:k];
+        [self setIsSymmetric:YES];
+    }
+    return self;
+}
+
+/**
+ * Public key only constructor.
+ * Configures the instance to use non-symmetric encryption/decryption, and to use the given public key.
+**/
+- (id)initWithPublicKey:(NSData *)pub
+{
+    return [self initWithPublicKey:pub privateKey:nil];
+}
+
+/**
+ * Private key only constructor.
+ * Configures the instance to use non-symmetric encryption/decryption, and to use the given private key.
+**/
+- (id)initWithPrivateKey:(NSData *)priv
+{
+    return [self initWithPublicKey:nil privateKey:priv];
+}
+
+/**
+ * Public and Private key constructor.
+ * Configures the instance to use non-symmetric encryption/decryption, and to use the given public and private keys.
+**/
+- (id)initWithPublicKey:(NSData *)pub privateKey:(NSData *)priv;
+{
+    if(self = [super init])
+	{
+		// Call private method to handle the setup for internal OpenSSL stuff
+		[self setupOpenSSL];
+		
+		// Store the publicKey variable (if not nil)
+		if(pub != nil)
+			[self setPublicKey:pub];
+		
+		// Store the privateKey variable (if not nil)
+		if(priv != nil)
+			[self setPrivateKey:priv];
+		
+		// Since we're using public and private keys, we can assume we're not using symmetric encryption
+		[self setIsSymmetric:NO];
+    }
+    return self;
+}
+
+/**
+ * This method sets up everything needed to use the OpenSSL libraries later within the code.
+ * This method should be called by every constructor.
+**/
+- (void)setupOpenSSL
+{
+	// OpenSSL keeps an internal table of digest algorithms and ciphers.
+	// It uses this table to lookup ciphers via functions such as EVP_get_cipher_byname().
+	// OpenSSL_add_all_digests() adds all digest algorithms to the table.
+	// OpenSSL_add_all_ciphers() adds all cipher algorithms to the table.
+	// OpenSSL_add_all_algorithms() adds all algorithms to the table (digests and ciphers).
+	// EVP_cleanup() removes all ciphers and digests from the table.
+	// 
+	// A typical application will call OpenSSL_add_all_algorithms() initially and EVP_cleanup() before exiting.
+	
+	OpenSSL_add_all_algorithms();
+	
+	// ERR_load_crypto_strings() registers the error strings for all libcrypto functions.
+	// SSL_load_error_strings() does the same, but also registers the libssl error strings.
+	// ERR_free_strings() frees all previously loaded error strings.
+	//
+	// One of these functions should be called before generating textual error messages.
+	// However, this is not required when memory usage is an issue.
+	
+	ERR_load_crypto_strings();
+}
+
+/**
+ * Standard deallocation method.
+**/
+- (void)dealloc
+{
+    // Cleanup all OpenSSL stuff
+	[self cleanupOpenSSL];
+	
+	// Release all instance variables
+	[symmetricKey release];
+	[cipherText release];
+	[clearText release];
+	[publicKey release];
+	[privateKey release];
+	
+	// Move up the inheritance chain
+    [super dealloc];
+}
+
+- (void)cleanupOpenSSL
+{
+	// EVP_cleanup() removes all ciphers and digests from the table.
+	EVP_cleanup();
+	
+	// ERR_free_strings() frees all previously loaded error strings.
+    ERR_free_strings();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Getter, Setter Methods:
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Returns whether or not symmetric encryption is to be used.
+ * If symmetric encryption is in use, then calls to encrypt or decrypt operate using symmetric encryption/decryption.
+ * Otherwise, it is assumed that asymmetric encryption/decryption is to be used.
+**/
+- (BOOL)isSymmetric
+{
+    return isSymmetric;
+}
+
+- (void)setIsSymmetric:(BOOL)flag
+{
+    isSymmetric = flag;
+}
+
+- (NSData *)symmetricKey
+{
+    return symmetricKey;
+}
+
+- (void)setSymmetricKey:(NSData *)k
+{
+    [k retain];
+    [symmetricKey release];
+    symmetricKey = k;
+}
+
+/**
+ * Returns the public key currently in use.
+**/
+- (NSData *)publicKey
+{
+    return publicKey;
+}
+
+/**
+ * Sets the public key to use.
+ * Public keys are used to verify signed data, or to encrypt data. (ToDo)
+**/
+- (void)setPublicKey:(NSData *)k
+{
+    [k retain];
+    [publicKey release];
+    publicKey = k;
+}
+
+/**
+ * Returns the private key currently in use.
+**/
+- (NSData *)privateKey
+{
+    return privateKey;
+}
+
+/**
+ * Sets the private key to use.
+ * Private keys are used to sign data, or to decrypt data. (ToDo)
+ * 
+ * The data that is provided should from a file (such as private.pem) that was generated by openssl.
+**/
+- (void)setPrivateKey:(NSData *)k
+{
+    [k retain];
+    [privateKey release];
+    privateKey = k;
+}
+
+/**
+ * Returns the clear text as plain NSData.
+ * The plain text contains the text that was previously set.
+ * It's the known text, which is to be encrypted, decrypted, etc.
+**/
+- (NSData *)clearTextAsData
+{
+    return clearText;
+}
+
+/**
+ * Returns the clear text formatted as an NSString.
+ * The plain text contains the text that was previously set.
+ * It's the known text, which is to be encrypted, decrypted, etc.
+**/
+- (NSString *)clearTextAsString
+{
+    return [[[NSString alloc] initWithData:[self clearTextAsData] encoding:NSUTF8StringEncoding] autorelease];
+}
+
+/**
+ * Sets the clear text using the given data.
+ * The clear text will be used for encryption, decryption, etc.
+ *
+ * Note that the given data reference is retained and later used, so it shouldn't be externally modified.
+**/
+- (void)setClearTextWithData:(NSData *)c
+{
+    [c retain];
+    [clearText release];
+    clearText = c;
+}
+
+/**
+ * Sets the clear text using the given string.
+ * The clear text will be used for encryption, signing, and digests.
+ **/
+- (void)setClearTextWithString:(NSString *)c
+{
+	[clearText release];
+    
+	// BUG FIX : PLL (2009/02/21)
+	//
+	// [c length] : Returns the number of Unicode characters in the receiver.
+	// For example "éàç test" in UTF8 is 11 bytes (c3 a9 c3 a0 c3 a7 20 74 65 73 74)
+	// but only 8 Unicode characters.
+	// So this will truncate the text and result in one error.
+	//
+	// clearText = [[NSData alloc] initWithBytes:[c UTF8String] length:[c length]];
+	
+	// The number of bytes required to store the receiver in the encoding enc in a non-external representation. The length does not include space for a terminating NULL character.
+	unsigned int length = [c lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+	clearText = [[NSData alloc] initWithBytes:[c UTF8String] length:length];
+}
+
+/**
+ * Returns the cipher text as plain NSData.
+ * The cipher text contains the most recent encrypted data.  (Result of call to encrypt)
+**/
+- (NSData *)cipherTextAsData
+{
+    return cipherText;
+}
+
+/**
+ * Returns the ciper text formatted as an NSString.
+ * The ciper text contains the most recent encrypted data.  (Result of call to encrypt)
+**/
+- (NSString *)cipherTextAsString
+{
+    return [[[NSString alloc] initWithData:[self cipherTextAsData] encoding:NSUTF8StringEncoding] autorelease];
+}
+
+/**
+ * Sets the cipher text using the given data.
+ * The cipher text will be used for decryption and verifying.
+**/
+- (void)setCipherText:(NSData *)c
+{
+    [c retain];
+    [cipherText release];
+    cipherText = c;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Decryption methods:
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Peforms decryption, and returns resulting clear text data.
+ * If symmetric decryption is being used, performs symmetric decryption using aes128.
+ * Otherwise, performs decryption using the private key.
+**/
+- (NSData *)decrypt
+{
+    if([self isSymmetric] && [self symmetricKey])
+	{
+        return [self decrypt:@"aes128"];
+    }
+	else if([self privateKey])
+	{
+        return [self decrypt:nil];
+    }
+	else
+	{
+        NSLog(@"No symmetric key or private key is set!");
+        return nil;
+    }
+}
+
+/**
+ * Decrypts the cipher text data.
+ * If symmetric decryption is being used, then the decryption is done using the given cipher.
+ * Otherwise, asymmetric decryptions is used, and the data is encrypted using the private key.
+ *
+ * Returns the clear text data that is the result of the decryption.
+ * The resulting clear text data may also be later retrieved with the clearTextAsData or clearTextAsString methods.
+**/
+- (NSData *)decrypt:(NSString *)cipherName
+{
+	// If there is no cipher text set, or the cipher text is an empty string (zero length data)
+	// then there is nothing to decrypt, and we may as well return nil
+    if(cipherText == nil || [cipherText length] == 0)
+	{
+        return nil;
+    }
+    
+    unsigned char *outbuf, iv[EVP_MAX_IV_LENGTH];
+    int outlen, templen, inlen;
+    inlen = [cipherText length];
+    unsigned char *input = (unsigned char *)[cipherText bytes];
+    
+    if([self isSymmetric])
+	{
+		// Use symmetric decryption...
+		
+        unsigned char evp_key[EVP_MAX_KEY_LENGTH] = {"\0"};
+        EVP_CIPHER_CTX cCtx;
+        const EVP_CIPHER *cipher;
+
+        if(cipherName)
+		{
+            cipher = EVP_get_cipherbyname((const char *)[cipherName UTF8String]);
+            if(!cipher)
+			{
+				NSLog(@"cannot get cipher with name %@", cipherName);
+				return nil;
+			}
+        }
+		else
+		{
+            cipher = EVP_bf_cbc();
+            if(!cipher)
+			{
+                NSLog(@"cannot get cipher with name %@", @"EVP_bf_cbc");
+                return nil;
+            }
+        }
+		
+		// Sometimes OpenSSL encrypted data contains an 8 byte salt.
+		// This is indicated by the "Salted__" prefix in the encrypted data.
+		
+		NSData *salt = nil;
+		
+		if([cipherText length] > 8+8)
+		{
+			if(strncmp((const char *)[cipherText bytes], "Salted__", 8) == 0)
+			{
+				salt = [cipherText subdataWithRange:NSMakeRange(8, 8)];
+				
+				input += 16;
+				inlen -= 16;
+			}
+		}
+        
+        EVP_BytesToKey(cipher, EVP_md5(), [salt bytes],
+					   [symmetricKey bytes], [symmetricKey length], 1, evp_key, iv);
+		
+        EVP_CIPHER_CTX_init(&cCtx);
+
+        if (!EVP_DecryptInit(&cCtx, cipher, evp_key, iv))
+		{
+            NSLog(@"EVP_DecryptInit() failed!");
+            EVP_CIPHER_CTX_cleanup(&cCtx);
+            return nil;
+        }
+        EVP_CIPHER_CTX_set_key_length(&cCtx, EVP_MAX_KEY_LENGTH);
+		
+        // The data buffer passed to EVP_DecryptUpdate() should have sufficient room for
+		// (input_length + cipher_block_size) bytes unless the cipher block size is 1 in which
+		// case input_length bytes is sufficient.
+		
+		if(EVP_CIPHER_CTX_block_size(&cCtx) > 1)
+			outbuf = (unsigned char *)calloc(inlen + EVP_CIPHER_CTX_block_size(&cCtx), sizeof(unsigned char));
+		else
+			outbuf = (unsigned char *)calloc(inlen, sizeof(unsigned char));
+			
+        NSAssert(outbuf, @"Cannot allocate memory for buffer!");
+        
+        if (!EVP_DecryptUpdate(&cCtx, outbuf, &outlen, input, inlen))
+		{
+			NSLog(@"EVP_DecryptUpdate() failed!");
+			EVP_CIPHER_CTX_cleanup(&cCtx);
+			return nil;
+        }
+        
+        if (!EVP_DecryptFinal(&cCtx, outbuf + outlen, &templen))
+		{
+			NSLog(@"EVP_DecryptFinal() failed!");
+			EVP_CIPHER_CTX_cleanup(&cCtx);
+			return nil;
+        }
+        
+        outlen += templen;
+        EVP_CIPHER_CTX_cleanup(&cCtx);
+    }
+	else
+	{
+		// Use asymmetric decryption...
+		
+        if([self privateKey] == nil)
+		{
+            NSLog(@"Cannot decrypt without the private key, which is currently nil");
+            return nil;
+        }
+        
+        BIO *privateBIO = NULL;
+		RSA *privateRSA = NULL;
+		
+		if(!(privateBIO = BIO_new_mem_buf((unsigned char*)[[self privateKey] bytes], [[self privateKey] length])))
+		{
+			NSLog(@"BIO_new_mem_buf() failed!");
+			return nil;
+		}
+		
+		if(!PEM_read_bio_RSAPrivateKey(privateBIO, &privateRSA, NULL, NULL))
+		{
+			NSLog(@"PEM_read_bio_RSAPrivateKey() failed!");
+			return nil;
+		}
+		
+		// RSA_check_key() returns 1 if rsa is a valid RSA key, and 0 otherwise.
+		
+		unsigned long check = RSA_check_key(privateRSA);
+		if(check != 1)
+		{
+			NSLog(@"RSA_check_key() failed with result %d!", check);
+			return nil;
+		}			
+		
+		// RSA_size() returns the RSA modulus size in bytes.
+		// It can be used to determine how much memory must be allocated for an RSA encrypted value.
+		
+		outbuf = (unsigned char *)malloc(RSA_size(privateRSA));
+        
+        if(!(outlen = RSA_private_decrypt(inlen, input, outbuf, privateRSA, RSA_PKCS1_PADDING)))
+		{
+            NSLog(@"RSA_private_decrypt() failed!");
+            return nil;
+        }
+        
+        if(outlen == -1)
+		{
+            NSLog(@"Decrypt error: %s (%s)",
+                  ERR_error_string(ERR_get_error(), NULL),
+                  ERR_reason_error_string(ERR_get_error()));
+            return nil;
+        }
+		
+		if (privateBIO) BIO_free(privateBIO);
+		if (privateRSA) RSA_free(privateRSA);
+    }
+	
+	// Store the decrypted data as the clear text
+    [self setClearTextWithData:[NSData dataWithBytes:outbuf length:outlen]];
+    
+	// Release the outbuf, since it was malloc'd
+    if (outbuf) {
+        free(outbuf);
+    }
+    
+    return [self clearTextAsData];
+}
+
+/**
+ * Verifies (decrypts) the cipher text data using the public key.
+ * The resulting clear text data is returned.
+ *
+ * The resulting clear text data may also be later retrieved with the clearTextAsData or clearTextAsString methods.
+ **/
+- (NSData *)verify
+{
+	// If there is no cipher text set, or the cipher text is an empty string (zero length data)
+	// then there is nothing to decrypt, and we may as well return nil
+	if(cipherText == nil || [cipherText length] == 0)
+	{
+		return nil;
+	}
+	
+	unsigned char *outbuf;
+	int outlen, inlen;
+	inlen = [cipherText length];
+	unsigned char *input = (unsigned char *)[cipherText bytes];
+	
+	if([self publicKey] == nil)
+	{
+		NSLog(@"Cannot verify (decrypt) without the public key, which is currently nil");
+		return nil;
+	}
+	
+	BIO *publicBIO = NULL;
+	RSA *publicRSA = NULL;
+	
+	if(!(publicBIO = BIO_new_mem_buf((unsigned char *)[[self publicKey] bytes], [[self publicKey] length])))
+	{
+		NSLog(@"BIO_new_mem_buf() failed!");
+		return nil;
+	}
+	
+	if(!PEM_read_bio_RSA_PUBKEY(publicBIO, &publicRSA, NULL, NULL))
+	{
+		NSLog(@"PEM_read_bio_RSA_PUBKEY() failed!");
+		return nil;
+	}
+	
+	// RSA_size() returns the RSA modulus size in bytes.
+	// It can be used to determine how much memory must be allocated for an RSA encrypted value.
+	
+	outbuf = (unsigned char *)malloc(RSA_size(publicRSA));
+	
+	if(!(outlen = RSA_public_decrypt(inlen, input, outbuf, publicRSA, RSA_PKCS1_PADDING)))
+	{
+		NSLog(@"RSA_public_decrypt() failed!");
+		return nil;
+	}
+	
+	if(outlen == -1)
+	{
+		NSLog(@"Decrypt error: %s (%s)",
+			  ERR_error_string(ERR_get_error(), NULL),
+			  ERR_reason_error_string(ERR_get_error()));
+		return nil;
+	}
+	
+	if (publicBIO) BIO_free(publicBIO);
+	if (publicRSA) RSA_free(publicRSA);
+	
+	// Store the decrypted data as the clear text
+    [self setClearTextWithData:[NSData dataWithBytes:outbuf length:outlen]];
+    
+	// Release the outbuf, since it was malloc'd
+    if (outbuf) {
+        free(outbuf);
+    }
+    
+    return [self clearTextAsData];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Encryption methods:
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Peforms encryption, and returns resulting ciper text data.
+ * If symmetric encryption is being used, performs symmetric encryption using aes128.
+ * Otherwise, performs encryption using the public key.
+**/
+- (NSData *)encrypt
+{
+    if([self isSymmetric] && [self symmetricKey])
+	{
+        return [self encrypt:@"aes128"];
+    }
+	else if([self publicKey])
+	{
+        return [self encrypt:nil];
+    }
+	else
+	{
+        NSLog(@"No symmetric key or public key is set!");
+        return nil;
+    }
+}
+
+/**
+ * Encrypts the clear text data.
+ * If symmetric encryption is being used, then the encryption is done using the given cipher.
+ * Otherwise, asymmetric encryption is used, and the data is encrypted using the public key.
+ *
+ * Returns the cipher text data that is the result of the encryption.
+ * The resulting cipher text data may also be later retrieved with the cipherTextAsData or cipherTextAsString methods.
+**/
+- (NSData *)encrypt:(NSString *)cipherName
+{
+	// If there is no clear text set, or the clear text is an empty string (zero length data)
+	// then there is nothing to encrypt, and we may as well return nil
+    if(clearText == nil || [clearText length] == 0)
+	{
+		return nil;
+    }
+
+    unsigned char *input = (unsigned char *)[clearText bytes];
+    unsigned char *outbuf, iv[EVP_MAX_IV_LENGTH];
+    int outlen, templen, inlen;
+    inlen = [clearText length];
+    
+    if([self isSymmetric])
+	{
+		// Perform symmetric encryption...
+		
+        unsigned char evp_key[EVP_MAX_KEY_LENGTH] = {"\0"};
+        EVP_CIPHER_CTX cCtx;
+        const EVP_CIPHER *cipher;
+        
+        if (cipherName){
+            cipher = EVP_get_cipherbyname((const char *)[cipherName UTF8String]);
+            if (!cipher){
+                NSLog(@"cannot get cipher with name %@", cipherName);
+                return nil;
+            }
+        } else {
+            cipher = EVP_bf_cbc();
+            if (!cipher){
+                NSLog(@"cannot get cipher with name %@", @"EVP_bf_cbc");
+                return nil;
+            }
+        }
+
+        EVP_BytesToKey(cipher, EVP_md5(), NULL,
+                       [[self symmetricKey] bytes], [[self symmetricKey] length], 1, evp_key, iv);
+        EVP_CIPHER_CTX_init(&cCtx);
+
+        if (!EVP_EncryptInit(&cCtx, cipher, evp_key, iv)) {
+            NSLog(@"EVP_EncryptInit() failed!");
+            EVP_CIPHER_CTX_cleanup(&cCtx);
+            return nil;
+        }
+        EVP_CIPHER_CTX_set_key_length(&cCtx, EVP_MAX_KEY_LENGTH);
+		
+		// The data buffer passed to EVP_EncryptUpdate() should have sufficient room for
+		// (input_length + cipher_block_size - 1)
+		
+        outbuf = (unsigned char *)calloc(inlen + EVP_CIPHER_CTX_block_size(&cCtx) - 1, sizeof(unsigned char));
+        NSAssert(outbuf, @"Cannot allocate memory for buffer!");
+        
+        if (!EVP_EncryptUpdate(&cCtx, outbuf, &outlen, input, inlen))
+		{
+			NSLog(@"EVP_EncryptUpdate() failed!");
+			EVP_CIPHER_CTX_cleanup(&cCtx);
+			return nil;
+        }
+        if (!EVP_EncryptFinal(&cCtx, outbuf + outlen, &templen))
+		{
+			NSLog(@"EVP_EncryptFinal() failed!");
+			EVP_CIPHER_CTX_cleanup(&cCtx);
+			return nil;
+        }
+        outlen += templen;
+        EVP_CIPHER_CTX_cleanup(&cCtx);
+        
+    }
+	else
+	{
+		// Perform asymmetric encryption...
+		
+        if([self publicKey] == nil)
+		{
+            NSLog(@"Cannot encrypt without the public key, which is currently nil");
+            return nil;
+        }
+        
+        BIO *publicBIO = NULL;
+        RSA *publicRSA = NULL;
+        
+        if(!(publicBIO = BIO_new_mem_buf((unsigned char*)[[self publicKey] bytes], [[self publicKey] length])))
+		{
+            NSLog(@"BIO_new_mem_buf() failed!");
+            return nil;
+        }
+        
+        if(!PEM_read_bio_RSA_PUBKEY(publicBIO, &publicRSA, NULL, NULL))
+		{
+            NSLog(@"PEM_read_bio_RSA_PUBKEY() failed!");
+            return nil;
+        }
+        
+		// RSA_size() returns the RSA modulus size in bytes.
+		// It can be used to determine how much memory must be allocated for an RSA encrypted value.
+		
+        outbuf = (unsigned char *)malloc(RSA_size(publicRSA));
+        
+        if(!(outlen = RSA_public_encrypt(inlen, input, (unsigned char*)outbuf, publicRSA, RSA_PKCS1_PADDING)))
+		{
+            NSLog(@"RSA_public_encrypt failed!");
+            return nil;
+        }
+        
+        if(outlen == -1)
+		{
+            NSLog(@"Encrypt error: %s (%s)",
+				  ERR_error_string(ERR_get_error(), NULL),
+				  ERR_reason_error_string(ERR_get_error()));
+            return nil;
+        }
+		
+		if (publicBIO) BIO_free(publicBIO);
+		if (publicRSA) RSA_free(publicRSA);
+    }
+	
+	// Store the encrypted data as the cipher text
+    [self setCipherText:[NSData dataWithBytes:outbuf length:outlen]];
+    
+	// Release the outbuf, since it was malloc'd
+    if(outbuf) {
+        free(outbuf);
+    }
+    
+    return [self cipherTextAsData];
+}
+
+/**
+ * Signs (encrypts) the clear text data using the private key.
+ * The resulting cipher text data is returned, and may later be verified (decrypted) using the public key.
+ *
+ * The resulting cipher text data may also be later retrieved with the cipherTextAsData or cipherTextAsString methods.
+**/
+- (NSData *)sign
+{
+	// If there is no clear text set, or the clear text is an empty string (zero length data)
+	// then there is nothing to encrypt, and we may as well return nil
+    if(clearText == nil || [clearText length] == 0)
+	{
+		return nil;
+    }
+	
+    unsigned char *input = (unsigned char *)[clearText bytes];
+    unsigned char *outbuf;
+    int outlen, inlen;
+    inlen = [clearText length];
+	
+	if([self privateKey] == nil)
+	{
+		NSLog(@"Cannot sign (encrypt) without the private key, which is currently nil");
+		return nil;
+	}
+	
+	BIO *privateBIO = NULL;
+	RSA *privateRSA = NULL;
+	
+	if(!(privateBIO = BIO_new_mem_buf((unsigned char*)[[self privateKey] bytes], [[self privateKey] length])))
+	{
+		NSLog(@"BIO_new_mem_buf() failed!");
+		return nil;
+	}
+	
+	if(!PEM_read_bio_RSAPrivateKey(privateBIO, &privateRSA, NULL, NULL))
+	{
+		NSLog(@"PEM_read_bio_RSAPrivateKey() failed!");
+		return nil;
+	}
+	
+	// RSA_check_key() returns 1 if rsa is a valid RSA key, and 0 otherwise.
+	
+	unsigned long check = RSA_check_key(privateRSA);
+	if(check != 1)
+	{
+		NSLog(@"RSA_check_key() failed with result %d!", check);
+		return nil;
+	}			
+	
+	// RSA_size() returns the RSA modulus size in bytes.
+	// It can be used to determine how much memory must be allocated for an RSA encrypted value.
+	
+	outbuf = (unsigned char *)malloc(RSA_size(privateRSA));
+	
+	if(!(outlen = RSA_private_encrypt(inlen, input, (unsigned char*)outbuf, privateRSA, RSA_PKCS1_PADDING)))
+	{
+		NSLog(@"RSA_private_encrypt failed!");
+		return nil;
+	}
+	
+	if(outlen == -1)
+	{
+		NSLog(@"Encrypt error: %s (%s)",
+			  ERR_error_string(ERR_get_error(), NULL),
+			  ERR_reason_error_string(ERR_get_error()));
+		return nil;
+	}
+	
+	if (privateBIO) BIO_free(privateBIO);
+	if (privateRSA) RSA_free(privateRSA);
+	
+	// Store the encrypted data as the cipher text
+    [self setCipherText:[NSData dataWithBytes:outbuf length:outlen]];
+    
+	// Release the outbuf, since it was malloc'd
+    if(outbuf) {
+        free(outbuf);
+    }
+    
+    return [self cipherTextAsData];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Other methods:
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Description forthcoming...
+**/
+- (NSData *)digest:(NSString *)digestName
+{
+    if(clearText == nil) {
+        return nil;
+    }
+
+    unsigned char outbuf[EVP_MAX_MD_SIZE];
+    unsigned int templen, inlen;
+    unsigned char *input=(unsigned char*)[clearText bytes];
+    EVP_MD_CTX ctx;
+    const EVP_MD *digest = NULL;
+    
+    inlen = [clearText length];
+    
+    if(inlen==0)
+        return nil;
+    if(digestName) {
+        digest = EVP_get_digestbyname((const char*)[digestName UTF8String]);        
+        if (!digest) {
+            NSLog(@"cannot get digest with name %@",digestName);
+            return nil;
+        }
+    } else {
+        digest=EVP_md5();
+        if(!digest) {
+            NSLog(@"cannot get digest with name %@",@"MD5");
+            return nil;
+        }
+    }
+
+    EVP_MD_CTX_init(&ctx);
+    EVP_DigestInit(&ctx,digest);
+    if(!EVP_DigestUpdate(&ctx,input,inlen)) {
+        NSLog(@"EVP_DigestUpdate() failed!");
+        EVP_MD_CTX_cleanup(&ctx);
+        return nil;			
+    }
+    if (!EVP_DigestFinal(&ctx, outbuf, &templen)) {
+        NSLog(@"EVP_DigesttFinal() failed!");
+        EVP_MD_CTX_cleanup(&ctx);
+        return nil;
+    }
+    EVP_MD_CTX_cleanup(&ctx);
+    
+    return [NSData dataWithBytes:outbuf length:templen];
+}
+
+- (NSString *)description
+{
+    NSString *format = @"clearText: %@, cipherText: %@, symmetricKey: %@, publicKey: %@, privateKey: %@";
+    NSString *desc = [NSString stringWithFormat:format, [clearText hexdump], [cipherText hexdump],
+        [symmetricKey hexdump], [publicKey hexdump], [privateKey hexdump]];
+    return desc;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Class methods:
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
++ (NSData *)generateRSAPrivateKeyWithLength:(int)length
+{
+    RSA *key = NULL;
+    do {
+        key = RSA_generate_key(length, RSA_F4, NULL, NULL);
+    } while (1 != RSA_check_key(key));
+
+    BIO *bio = BIO_new(BIO_s_mem());
+
+    if (!PEM_write_bio_RSAPrivateKey(bio, key, NULL, NULL, 0, NULL, NULL))
+    {
+        NSLog(@"cannot write private key to memory");
+        return nil;
+    }
+    if (key) RSA_free(key);
+
+    char *pbio_data = NULL;
+    int data_len = BIO_get_mem_data(bio, &pbio_data);
+    NSData *result = [NSData dataWithBytes:pbio_data length:data_len];
+    
+    if (bio)
+        BIO_free(bio);
+
+    return result;
+}
+
++ (NSData *)generateRSAPublicKeyFromPrivateKey:(NSData *)privateKey
+{
+    BIO *privateBIO = NULL;
+	RSA *privateRSA = NULL;
+	
+	if (!(privateBIO = BIO_new_mem_buf((unsigned char*)[privateKey bytes], [privateKey length])))
+	{
+		NSLog(@"BIO_new_mem_buf() failed!");
+		return nil;
+	}
+	
+	if (!PEM_read_bio_RSAPrivateKey(privateBIO, &privateRSA, NULL, NULL))
+	{
+		NSLog(@"PEM_read_bio_RSAPrivateKey() failed!");
+		return nil;
+	}
+	
+	// RSA_check_key() returns 1 if rsa is a valid RSA key, and 0 otherwise.
+	
+	unsigned long check = RSA_check_key(privateRSA);
+	if (check != 1)
+	{
+		NSLog(@"RSA_check_key() failed with result %d!", check);
+		return nil;
+	}			
+
+    BIO *bio = BIO_new(BIO_s_mem());
+
+    if (!PEM_write_bio_RSA_PUBKEY(bio, privateRSA))
+    {
+        NSLog(@"cannot write public key to memory");
+        return nil;
+    }
+    if (privateRSA) RSA_free(privateRSA);
+
+    char *pbio_data = NULL;
+    int data_len = BIO_get_mem_data(bio, &pbio_data);
+    NSData *result = [NSData dataWithBytes:pbio_data length:data_len];
+    
+    if (bio)
+        BIO_free(bio);
+
+    return result;
+}
+
++ (NSData *)getKeyDataWithLength:(int)length
+{
+    NSData *randData = nil;
+    unsigned char *buffer;
+    
+    buffer = (unsigned char *)calloc(length*4, sizeof(unsigned char));
+    NSAssert((buffer != NULL), @"Cannot calloc memory for buffer.");
+    
+    if (!RAND_bytes(buffer, length)){
+        free(buffer);
+    }
+
+    randData = [NSData dataWithBytes:buffer length:length];
+    free(buffer);
+    
+    return randData;
+}
+
+// PBKDF2 support functions
+// Thanks to Chris Benedict (chrisbdaemon@gmail.com) for the code
++ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt
+{
+	return [SSCrypto getKeyDataWithLength:length fromPassword:pass withSalt:salt withIterations:1000];
+}
+
++ (NSData *)getKeyDataWithLength:(int)length fromPassword:(NSString *)pass withSalt:(NSString *)salt withIterations:(int)count
+{
+	NSData *key = nil;
+	unsigned char *buffer = (unsigned char *)calloc(length, sizeof(unsigned char));
+    NSAssert((buffer != NULL), @"Cannot calloc memory for buffer.");
+	const char *password = [pass UTF8String];
+    const char *saltVal = [salt UTF8String];
+
+	if(!PKCS5_PBKDF2_HMAC_SHA1(password, [pass length], (unsigned char *)saltVal, [salt length], count, length, buffer)) {
+		return nil;
+	}
+
+	key = [NSData dataWithBytes:buffer length:length];
+	free(buffer);
+	
+	return key;
+}
+
++ (NSData *)getSHA1ForData:(NSData *)d
+{
+    unsigned length = [d length];
+    const void *buffer = [d bytes];
+    unsigned char *md = (unsigned char *)calloc(SHA_DIGEST_LENGTH, sizeof(unsigned char));
+    NSAssert((md != NULL), @"Cannot calloc memory for buffer.");
+
+    (void)SHA1(buffer, length, md);
+
+    return [NSData dataWithBytesNoCopy:md length:SHA_DIGEST_LENGTH freeWhenDone:YES];
+}
+
++ (NSData *)getMD5ForData:(NSData *)d
+{
+	unsigned length = [d length];
+    const void *buffer = [d bytes];
+    unsigned char *md = (unsigned char *)calloc(MD5_DIGEST_LENGTH, sizeof(unsigned char));
+    NSAssert((md != NULL), @"Cannot calloc memory for buffer.");
+	
+	(void)MD5(buffer, length, md);
+	
+    return [NSData dataWithBytesNoCopy:md length:MD5_DIGEST_LENGTH freeWhenDone:YES];
+}
+
+@end
diff --git a/Tools/NativeHost/Server.h b/Tools/NativeHost/Server.h
new file mode 100644
index 000000000..a11e9d701
--- /dev/null
+++ b/Tools/NativeHost/Server.h
@@ -0,0 +1,21 @@
+//
+//  Server.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 8/18/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+@interface Server : NSObject
+{
+    NSFileHandle    * outputFile;
+    NSFileHandle    * errorFile;
+    NSTask          * process;
+}
+
+- (BOOL)start;
+- (void)stop;
+
+@end
diff --git a/Tools/NativeHost/Server.m b/Tools/NativeHost/Server.m
new file mode 100644
index 000000000..5439bc967
--- /dev/null
+++ b/Tools/NativeHost/Server.m
@@ -0,0 +1,193 @@
+//
+//  Server.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 8/18/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "Server.h"
+#import "AppController.h"
+
+#import 
+#import 
+
+@implementation Server
+
+- (BOOL)start
+{
+    NSBundle *mainBundle = [NSBundle mainBundle];
+    NSString *serverPath = [mainBundle pathForResource:@"NativeHostServer" ofType:@"" inDirectory:@"Server"];
+
+    if (!serverPath)
+    {
+        return YES;
+    }
+
+    // find an available port
+    struct sockaddr_in addr;
+    int sockfd;
+	int attempts = 0;
+
+	while (SERVER_PORT == 9191 && attempts++ < 5)
+	{
+		// Create a socket
+		sockfd = socket( AF_INET, SOCK_STREAM, 0 );
+
+		// Setup its address structure
+		bzero( &addr, sizeof(struct sockaddr_in));
+		addr.sin_family = AF_INET;
+		addr.sin_addr.s_addr = htonl( INADDR_ANY );
+		addr.sin_port = htons( 0 );
+
+		// Bind it to an address and port
+		bind( sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));
+
+		// Set it listening for connections
+		listen( sockfd, 5 );
+
+		// Find out what port the socket was bound to
+		socklen_t namelen = sizeof(struct sockaddr_in);
+		getsockname( sockfd, (struct sockaddr *)&addr, &namelen );
+
+		if (addr.sin_port <= 1024)
+			addr.sin_port = 9191;
+		else
+		    SERVER_PORT = addr.sin_port;
+
+		shutdown(sockfd, 2);
+	}
+    
+    if (SERVER_PASSWORD == nil)
+    {
+        CFUUIDRef uuidObj = CFUUIDCreate(nil);
+        SERVER_PASSWORD = (NSString*)CFUUIDCreateString(nil, uuidObj);
+        CFRelease(uuidObj);
+    }
+
+    if (SERVER_USER == nil)
+    {
+        CFUUIDRef uuidObj = CFUUIDCreate(nil);
+        SERVER_USER = (NSString*)CFUUIDCreateString(nil, uuidObj);
+        CFRelease(uuidObj);
+        // usernames can't have "-" in them
+        SERVER_USER = [[SERVER_USER autorelease] stringByReplacingOccurrencesOfString:@"-" withString:@""];
+    }
+
+    // setup environment variables
+    NSDictionary *env = [[[NSProcessInfo processInfo] environment] mutableCopy];
+    [env setValue:[mainBundle resourcePath] forKey:@"NATIVEHOST_RESOURCES"];
+    [env setValue:[[NSNumber numberWithInt:SERVER_PORT] stringValue] forKey:@"NATIVEHOST_SERVER_PORT"];
+    [env setValue:SERVER_USER forKey:@"NATIVEHOST_SERVER_USER"];
+    [env setValue:SERVER_PASSWORD forKey:@"NATIVEHOST_SERVER_PASSWORD"];
+
+    // create pipes for stdout and stderr
+    NSPipe  * outputPipe = [NSPipe pipe];
+    outputFile = [outputPipe fileHandleForReading];
+    NSPipe  * errorPipe = [NSPipe pipe];
+    errorFile = [errorPipe fileHandleForReading];
+
+    // setup the process
+    process = [[NSTask alloc] init];
+    [process setLaunchPath:serverPath];
+    [process setStandardOutput:outputPipe];
+    [process setStandardError:errorPipe];
+    [process setEnvironment:env];
+    [env release];
+
+    [[NSNotificationCenter defaultCenter] addObserver:self 
+                                             selector:@selector(serverDidTerminate:) 
+                                                 name:NSTaskDidTerminateNotification 
+                                               object:process];
+
+    [process launch];
+
+    BOOL didStartup = NO;
+    NSData * data = nil;
+
+    while (!didStartup && (data = [outputFile availableData]) && [data length])
+    {
+        NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+        if (string)
+        {
+            NHLog(@"SERVER-OUT", string);
+
+            didStartup = [string rangeOfString:@"Jack is starting up"].location != NSNotFound;
+
+            [string release];
+        }
+    }
+    NSLog(@"Server has started.");
+
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+          selector:@selector(didReadStdOut:)
+              name:NSFileHandleReadCompletionNotification
+            object:outputFile];
+
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+          selector:@selector(didReadStdErr:)
+              name:NSFileHandleReadCompletionNotification
+            object:errorFile];
+
+    [outputFile readInBackgroundAndNotify];
+    [errorFile readInBackgroundAndNotify];
+
+    return didStartup;
+}
+
+- (void)stop
+{
+    [process terminate];
+}
+
+- (void)didReadStdOut:(NSNotification *)aNotification
+{
+    NSString * string = [[NSString alloc] initWithData:[[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem]
+                                              encoding:NSASCIIStringEncoding];
+    NHLog(@"SERVER-OUT", string);
+    [string release];
+    [outputFile readInBackgroundAndNotify];
+}
+
+- (void)didReadStdErr:(NSNotification *)aNotification
+{
+    NSString * string = [[NSString alloc] initWithData:[[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem]
+                                              encoding:NSASCIIStringEncoding];
+    NHLog(@"SERVER-ERR", string);
+    [string release];
+    [errorFile readInBackgroundAndNotify];
+}
+
+- (void)serverDidTerminate:(NSNotification *)note
+{
+    if ([process terminationStatus] != 0)
+    {
+        NSString *appName = [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"];
+        if (appName == nil)
+            appName = [[NSProcessInfo processInfo] processName];
+
+        if (SERVER_PORT != 9191 && [self start])
+        {
+            NSRunAlertPanel(@"Unexpected Error",
+                [NSString stringWithFormat:@"%@ was not able to complete the last action you performed. Try again, and report the problem if it continues to occur.", appName],
+                @"OK", nil, nil);
+        }
+        else
+        {
+            NSRunAlertPanel(@"Unexpected Error",
+                [NSString stringWithFormat:@"A fatal error occurred. %@ could not recover and must terminate.", appName],
+                @"Terminate", nil, nil);
+            exit(1);
+        }
+    }
+}
+
+- (void)dealloc
+{
+    [process release];
+    [super dealloc];
+}
+
+@end
diff --git a/Tools/NativeHost/WebPasteboardProxy.h b/Tools/NativeHost/WebPasteboardProxy.h
new file mode 100644
index 000000000..887b95f4c
--- /dev/null
+++ b/Tools/NativeHost/WebPasteboardProxy.h
@@ -0,0 +1,19 @@
+//
+//  WebPasteboardProxy.h
+//  NativeHost
+//
+//  Created by Ross Boucher on 12/12/09.
+//  Copyright 2009 280 North. All rights reserved.
+//
+
+#import 
+
+
+@interface WebPasteboardProxy : NSObject 
+{
+    NSPasteboard *pasteboard;
+}
+
++ (id)pasteboardWithName:(NSString *)aName;
+
+@end
diff --git a/Tools/NativeHost/WebPasteboardProxy.m b/Tools/NativeHost/WebPasteboardProxy.m
new file mode 100644
index 000000000..6eba5c038
--- /dev/null
+++ b/Tools/NativeHost/WebPasteboardProxy.m
@@ -0,0 +1,95 @@
+//
+//  WebPasteboardProxy.m
+//  NativeHost
+//
+//  Created by Ross Boucher on 12/12/09.
+//  Copyright 2009 280 North. All rights reserved.
+//
+
+#import "WebPasteboardProxy.h"
+#import "WebScripObject+Objective-J.h"
+#import "BridgedMethods.h"
+
+NSMutableDictionary *WebPasteboardDictionary = nil;
+
+@implementation WebPasteboardProxy
+
++ (void)initialize
+{
+    WebPasteboardDictionary = [[NSMutableDictionary dictionary] retain];
+}
+
++ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
+{
+    return NO;
+}
+
++ (id)pasteboardWithName:(NSString *)aName
+{
+    if ([aName isEqual:@"CPGeneralPboard"])
+        return [self pasteboardWithName:NSGeneralPboard];
+
+    id proxy = [WebPasteboardDictionary objectForKey:aName];
+    if (!proxy)
+    {
+        proxy = [[self alloc] initWithPasteboard:[NSPasteboard pasteboardWithName:aName]];
+        [WebPasteboardDictionary setObject:proxy forKey:aName];
+        [proxy release];
+    }
+
+    return proxy;
+}
+
+- (id)initWithPasteboard:(NSPasteboard *)aPasteboard
+{
+    if (self = [super init])
+    {
+        pasteboard = [aPasteboard retain];
+    }
+
+    return self;
+}
+
+- (void)dealloc
+{
+    [pasteboard release];
+    [super dealloc];
+}
+
+- (int)changeCount
+{
+    return [pasteboard changeCount];
+}
+
+- (void)declareTypes:(WebScriptObject *)args
+{
+    [pasteboard declareTypes:[BridgedMethods arrayFromWebScriptObject:args] owner:self];
+}
+
+- (void)addTypes:(WebScriptObject *)args
+{
+    [pasteboard addTypes:[BridgedMethods arrayFromWebScriptObject:args ] owner:self];
+}
+
+- (NSArray *)types
+{
+    return [pasteboard types];
+}
+
+- (NSString *)stringForType:(NSString *)aType
+{
+    return [pasteboard stringForType:aType];
+}
+
+- (void)pasteboard:(NSPasteboard *)aPasteboard provideDataForType:(NSString *)aType
+{
+    NSString *name = aPasteboard == [NSPasteboard generalPasteboard] ? @"CPGeneralPboard" : [aPasteboard name];
+
+    NSString *data = [[[NSApp delegate] windowScriptObject] evaluateObjectiveJReturningString:
+     [NSString stringWithFormat:@"[[CPPasteboard pasteboardWithName:'%@'] stringForType:'%@']", name, aType]
+    ];
+
+    [aPasteboard setString:data forType:aType];
+}
+
+@end
diff --git a/Tools/NativeHost/WebScripObject+Objective-J.h b/Tools/NativeHost/WebScripObject+Objective-J.h
new file mode 100644
index 000000000..4b448574d
--- /dev/null
+++ b/Tools/NativeHost/WebScripObject+Objective-J.h
@@ -0,0 +1,22 @@
+//
+//  WebScripObject+Objective-J.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/1/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+#import 
+
+
+@interface WebScriptObject (ObjectiveJ)
+
+- (id)evaluateObjectiveJ:(NSString *)aString;
+- (NSString *)evaluateObjectiveJReturningString:(NSString *)aString;
+
+- (id)bridgeSelector:(SEL)aSelector;
+- (id)bridgeSelector:(SEL)aSelector withObject:(id)anObject;
+- (id)bridgeSelector:(SEL)aSelector withObjects:(NSArray *)array;
+
+@end
diff --git a/Tools/NativeHost/WebScripObject+Objective-J.m b/Tools/NativeHost/WebScripObject+Objective-J.m
new file mode 100644
index 000000000..d1be2df47
--- /dev/null
+++ b/Tools/NativeHost/WebScripObject+Objective-J.m
@@ -0,0 +1,46 @@
+//
+//  WebScripObject+Objective-J.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 9/1/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "WebScripObject+Objective-J.h"
+
+
+@implementation WebScriptObject (ObjectiveJ)
+
+- (id)evaluateObjectiveJ:(NSString *)aString
+{
+    return [self evaluateWebScript:[NSString stringWithFormat:@"(ObjectiveJ.eval(decodeURIComponent(\"%@\")))", [aString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], nil]];
+}
+
+- (NSString *)evaluateObjectiveJReturningString:(NSString *)aString
+{
+    return [self evaluateWebScript:[NSString stringWithFormat:@"String(ObjectiveJ.eval(decodeURIComponent(\"%@\")))", [aString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], nil]];
+}
+
+- (id)bridgeSelector:(SEL)aSelector
+{
+    return [self bridgeSelector:aSelector withObjects:nil];
+}
+
+- (id)bridgeSelector:(SEL)aSelector withObject:(id)anObject
+{
+    return [self bridgeSelector:aSelector withObjects:[NSArray arrayWithObject:anObject]];
+}
+
+- (id)bridgeSelector:(SEL)aSelector withObjects:(NSArray *)objects
+{
+    [self evaluateWebScript:@"objj_object.prototype.__objj_msgSend = function() { return objj_msgSend.apply(null, arguments); }"];
+
+    NSArray * arguments = [NSArray arrayWithObjects:self, NSStringFromSelector(aSelector), nil];
+
+    if (objects)
+        arguments = [arguments arrayByAddingObjectsFromArray:objects];
+
+    return [self callWebScriptMethod:@"__objj_msgSend" withArguments:arguments];
+}
+
+@end
diff --git a/Tools/NativeHost/WebWindow.h b/Tools/NativeHost/WebWindow.h
new file mode 100644
index 000000000..a7feb9fac
--- /dev/null
+++ b/Tools/NativeHost/WebWindow.h
@@ -0,0 +1,44 @@
+//
+//  WebWindow.h
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 10/18/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import 
+
+
+typedef enum _CPWindowShadowStyle
+{
+    CPStandardWindowShadowStyle = 0,
+    CPMenuWindowShadowStyle     = 1,
+    CPPanelWindowShadowStyle    = 2,
+    CPCustomWindowShadowStyle   = 3
+} CPWindowShadowStyle;
+
+@interface WebWindow : NSWindow
+{
+    NSView              * leftMouseDownView;
+    NSView              * rightMouseDownView;
+
+    WebView             * webView;
+    NSView              * shadowView;
+
+    BOOL                hasShadow;
+    CPWindowShadowStyle shadowStyle;
+}
+
++ (WebWindow *)webWindow;
+
+- (WebView *)webView;
+
+- (BOOL)hitTest:(NSPoint)aPoint;
+
+- (BOOL)hasShadow;
+- (void)setHasShadow:(BOOL)shouldHaveShadow;
+
+- (void)setShadowStyle:(CPWindowShadowStyle)aStyle;
+- (CPWindowShadowStyle)shadowStyle;
+
+@end
diff --git a/Tools/NativeHost/WebWindow.m b/Tools/NativeHost/WebWindow.m
new file mode 100644
index 000000000..e49121417
--- /dev/null
+++ b/Tools/NativeHost/WebWindow.m
@@ -0,0 +1,509 @@
+//
+//  WebWindow.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 10/18/09.
+//  Copyright 2009 280 North, Inc.. All rights reserved.
+//
+
+#import "WebWindow.h"
+
+
+static NSMutableArray * DisabledWindows;
+
+CFMachPortRef tap_port;
+
+CGEventRef headTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
+{
+    // It's dangerous to fail in this code: could disable mousedown system-wide. So just try catch it all.
+    @try
+    {
+        [DisabledWindows makeObjectsPerformSelector:@selector(stopIgnoringMouseEvents)];
+        [DisabledWindows removeAllObjects];
+
+        if (type == kCGEventLeftMouseDown)
+        {
+            CGPoint location = CGEventGetLocation(event);
+            NSPoint NSLocation = NSMakePoint(location.x, location.y);
+
+            for (NSWindow * window in [NSApp windows])
+            {
+                if ([window isKindOfClass:[WebWindow class]] && ![(WebWindow *)window hitTest:NSLocation])
+                {
+                    [window setIgnoresMouseEvents:YES];
+
+                    [DisabledWindows addObject:window];
+                }
+            }
+        }
+        else if (type == kCGEventTapDisabledByTimeout)
+            CGEventTapEnable(tap_port, YES);
+
+    }
+    @catch (NSException * anException)
+    {
+    }
+
+    return event;
+}
+
+
+@interface WebWindowContentView : NSView
+{
+}
+@end
+
+@implementation WebWindow
+
++ (void)initialize
+{
+    if (self != [WebWindow class])
+        return;
+
+    DisabledWindows = [[NSMutableArray alloc] init];
+
+    //| CGEventMaskBit(kCGEventTapDisabledByTimeout)
+    tap_port = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
+                                kCGEventTapOptionDefault,
+                                CGEventMaskBit(kCGEventLeftMouseDown),
+                                headTapCallback, NULL);
+
+    if (NULL == tap_port)
+    {
+        fprintf(stderr, "Error creating event tap\n");
+        return;
+    }
+
+    /* Create a run loop source from the tap port, add it to my run loop
+     * and start executing the loop
+     */
+    CFRunLoopSourceRef tap_source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap_port, 0);
+
+    if (NULL == tap_source)
+    {
+        fprintf(stderr, "Error converting port to run loop source\n");
+
+        if (tap_port != NULL)
+            CFRelease(tap_port);
+
+        return;
+    }
+
+    CFRunLoopAddSource(CFRunLoopGetCurrent(), tap_source, kCFRunLoopCommonModes);
+}
+
+- (id)initWithContentRect:(NSRect)aContentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)aBufferingType defer:(BOOL)shouldDeferCreation
+{
+    self = [super initWithContentRect:aContentRect styleMask:NSBorderlessWindowMask backing:aBufferingType defer:shouldDeferCreation];
+
+    if (self)
+    {
+        id delegate = [NSApp delegate];
+
+        shadowView = [[WebWindowContentView alloc] init];
+
+        [self setContentView:shadowView];
+
+        webView = [[WebView alloc] initWithFrame:NSZeroRect];
+
+        [webView setDrawsBackground:NO];
+        [webView setUIDelegate:delegate];
+        [webView setFrameLoadDelegate:delegate];
+        [webView setResourceLoadDelegate:delegate];
+        [webView setShouldCloseWithWindow:YES];
+
+        [shadowView addSubview:webView];
+
+        [self setBackgroundColor:[NSColor clearColor]];
+        [self setOpaque:NO];
+        [self setReleasedWhenClosed:YES];
+		[super setHasShadow:NO];
+    }
+
+    return self;
+}
+
+- (void)setFrame:(NSRect)aFrame display:(BOOL)shouldDisplay
+{
+    [webView setFrame:NSMakeRect(33.0, 33.0, NSWidth(aFrame), NSHeight(aFrame))];
+    [super setFrame:NSInsetRect(aFrame, -33.0, -33.0) display:YES];
+}
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResizeNotification object:self];
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeKeyNotification object:self];
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResignKeyNotification object:self];
+
+    [shadowView release];
+    [webView release];
+    [super dealloc];
+}
+
+- (BOOL)canBecomeKeyWindow
+{
+    // Necessary since this apparently returns NO for borderless windows.
+    return YES;
+}
+
+- (NSView *)webHitTest:(NSPoint)aPoint
+{
+    NSPoint locationInWebView = [[self contentView] convertPoint:aPoint fromView:nil];
+
+    return [(NSView *)[self contentView] hitTest:locationInWebView];
+}
+
+- (void)sendEvent:(NSEvent *)anEvent
+{
+    NSInteger type = [anEvent type];
+
+    if (type == NSLeftMouseDown)
+    {
+        NSView * view = [self webHitTest:[anEvent locationInWindow]];
+
+        leftMouseDownView = view;
+
+        [view mouseDown:anEvent];
+    }
+
+    else if (type == NSLeftMouseDragged)
+        [leftMouseDownView mouseDragged:anEvent];
+
+    else if (type == NSLeftMouseUp)
+        [leftMouseDownView mouseUp:anEvent];
+
+    else if (type == NSRightMouseDown)
+    {
+        NSView * view = [self webHitTest:[anEvent locationInWindow]];
+
+        rightMouseDownView = view;
+
+        [view rightMouseDown:anEvent];
+    }
+    else if (type == NSRightMouseDragged)
+        [rightMouseDownView rightMouseDragged:anEvent];
+
+    else if (type == NSRightMouseUp)
+        [rightMouseDownView rightMouseUp:anEvent];
+
+    else
+        [super sendEvent:anEvent];
+
+    // FIXME: other
+}
+
+// Override this to avoid the beep from unhandled events.
+- (void)keyDown:(NSEvent *)anEvent
+{
+}
+
++ (WebWindow *)webWindow
+{
+    return [[WebWindow alloc] initWithContentRect:NSZeroRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES];
+}
+
+- (WebView *)webView
+{
+    return webView;
+}
+
+- (void)updateShadow
+{
+    [super setHasShadow:hasShadow && shadowStyle == CPCustomWindowShadowStyle];
+    [shadowView setNeedsDisplay:YES];
+}
+
+- (BOOL)hasShadow
+{
+    return hasShadow;
+}
+
+- (void)setHasShadow:(BOOL)shouldHaveShadow
+{
+    if (hasShadow == shouldHaveShadow)
+        return;
+
+    hasShadow = shouldHaveShadow;
+
+    [self updateShadow];
+}
+
+- (CPWindowShadowStyle)shadowStyle
+{
+    return shadowStyle;
+}
+
+- (void)setShadowStyle:(CPWindowShadowStyle)aStyle
+{
+    if (shadowStyle == aStyle)
+        return;
+
+    shadowStyle = aStyle;
+
+    [self updateShadow];
+}
+
+- (BOOL)hitTest:(NSPoint)aPoint
+{
+    NSInteger windowNumber = [[[webView windowScriptObject] valueForKey:@"cpWindowNumber"] intValue];
+
+#if LOGGING
+    WebScriptObject * frame = [[[NSApp delegate] windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"(objj_msgSend(objj_msgSend(CPApp, \"windowWithWindowNumber:\", %d), \"frame\"))", windowNumber]],
+                    * origin = [frame valueForKey:@"origin"],
+                    * size = [frame valueForKey:@"size"];
+
+    NSLog(@"(%f, %f) in { %f, %f, %f, %f }", aPoint.x, aPoint.y, [[origin valueForKey:@"x"] floatValue], [[origin valueForKey:@"y"] floatValue], [[size valueForKey:@"width"] floatValue], [[size valueForKey:@"height"] floatValue]);
+#endif
+
+    return [[[[NSApp delegate] windowScriptObject] evaluateWebScript:[NSString stringWithFormat:@"(CGRectContainsPoint(objj_msgSend(objj_msgSend(CPApp, \"windowWithWindowNumber:\", %d), \"frame\"), CGPointMake(%f, %f)))", windowNumber, aPoint.x, aPoint.y]] boolValue];
+}
+
+- (void)stopIgnoringMouseEvents
+{
+    [self setIgnoresMouseEvents:NO];
+}
+
+- (void)becomeKeyWindow
+{
+    [super becomeKeyWindow];
+
+    [self updateShadow];
+}
+
+- (void)resignKeyWindow
+{
+    [super resignKeyWindow];
+
+    [self updateShadow];
+}
+
+@end
+
+@interface NSImage (Additions)
+
+- (void)drawInRect:(NSRect)aRect slices:(CGFloat [])slices;
+
+@end
+
+@implementation NSImage (Additions)
+
+- (void)drawInRect:(NSRect)aRect slices:(CGFloat [])slices
+{
+    NSRect imageBounds = NSMakeRect(0.0, 0.0, [self size].width, [self size].height);
+
+    [self drawInRect:NSMakeRect(0.0, 0.0, slices[0], slices[1])
+            fromRect:NSMakeRect(0.0, 0.0, slices[0], slices[1])
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(NSMaxX(aRect) - slices[2], 0.0, slices[2], slices[1])
+            fromRect:NSMakeRect(NSMaxX(imageBounds) - slices[2], 0.0, slices[2], slices[1])
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(0.0, NSMaxY(aRect) - slices[3], slices[0], slices[3])
+            fromRect:NSMakeRect(0.0, NSMaxY(imageBounds) - slices[3], slices[0], slices[3])
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(NSMaxX(aRect) - slices[2], NSMaxY(aRect) - slices[3], slices[2], slices[3])
+            fromRect:NSMakeRect(NSMaxX(imageBounds) - slices[2], NSMaxY(imageBounds) - slices[3], slices[2], slices[3])
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(slices[0], 0.0, NSWidth(aRect) - slices[0] - slices[2], slices[1])
+            fromRect:NSMakeRect(slices[0], 0.0, 1.0, slices[1])
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(0.0, slices[1], slices[0], NSHeight(aRect) - slices[1] - slices[3])
+            fromRect:NSMakeRect(0.0, slices[1], slices[0], 1.0)
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(NSMaxX(aRect) - slices[2], slices[1], slices[2], NSHeight(aRect) - slices[1] - slices[3])
+            fromRect:NSMakeRect(NSMaxX(imageBounds) - slices[2], slices[1], slices[2], 1.0)
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+
+    [self drawInRect:NSMakeRect(slices[0], NSMaxY(aRect) - slices[3], NSWidth(aRect) - slices[0] - slices[2], slices[3])
+            fromRect:NSMakeRect(slices[0], NSMaxY(imageBounds) - slices[3], 1.0, slices[3])
+           operation:NSCompositeSourceOver
+            fraction:1.0];
+}
+
+@end
+
+@implementation WebWindowContentView : NSView
+{
+}
+
+static float OUTlINE_HORIZONTAL_INSET   = 33.0;
+static float OUTlINE_VERTICAL_INSET     = 33.0;
+
+- (void)drawStandardActiveShadowInRect:(NSRect)aRect
+{
+    CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
+
+    CGRect bounds = CGRectInset(*(CGRect *)&aRect, OUTlINE_HORIZONTAL_INSET - 0.5, OUTlINE_VERTICAL_INSET - 0.5);
+
+    CGColorRef shadowColor = CGColorCreateGenericGray(0.0, 0.8);
+    CGContextSetShadowWithColor (context, CGSizeMake(0.0, -10.0), 100.0, shadowColor);
+    CGColorRelease(shadowColor);
+
+    CGColorRef fillColor = CGColorCreateGenericGray(1.0, 1.0);
+    CGColorRef strokeColor = CGColorCreateGenericGray(0.0, 0.2);
+
+    CGContextSetFillColorWithColor(context, fillColor);
+    CGContextSetStrokeColorWithColor(context, strokeColor);
+
+    CGColorRelease(fillColor);
+    CGColorRelease(strokeColor);
+
+    CGContextBeginPath(context);
+
+    CGContextAddArc(context, CGRectGetMinX(bounds) + 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI, M_PI_2, YES);
+    CGContextAddArc(context, CGRectGetMaxX(bounds) - 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI_2, 0, YES);
+    CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
+    CGContextAddLineToPoint(context, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
+
+    CGContextClosePath(context);
+
+    CGContextDrawPath(context, kCGPathFillStroke);
+}
+
+- (void)drawStandardInactiveShadowInRect:(NSRect)aRect
+{
+    CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
+
+    CGRect bounds = CGRectInset(*(CGRect *)&aRect, OUTlINE_HORIZONTAL_INSET - 0.5, OUTlINE_VERTICAL_INSET - 0.5);
+
+    CGColorRef shadowColor = CGColorCreateGenericGray(0.0, 0.5);
+    CGContextSetShadowWithColor (context, CGSizeMake(0.0, -10.0), 40.0, shadowColor);
+    CGColorRelease(shadowColor);
+
+    CGColorRef fillColor = CGColorCreateGenericGray(1.0, 1.0);
+    CGColorRef strokeColor = CGColorCreateGenericGray(0.0, 0.2);
+
+    CGContextSetFillColorWithColor(context, fillColor);
+    CGContextSetStrokeColorWithColor(context, strokeColor);
+
+    CGColorRelease(fillColor);
+    CGColorRelease(strokeColor);
+
+    CGContextBeginPath(context);
+
+    CGContextAddArc(context, CGRectGetMinX(bounds) + 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI, M_PI_2, YES);
+    CGContextAddArc(context, CGRectGetMaxX(bounds) - 5.0, CGRectGetMaxY(bounds) - 5.0, 5.0, M_PI_2, 0, YES);
+    CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
+    CGContextAddLineToPoint(context, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
+
+    CGContextClosePath(context);
+
+    CGContextDrawPath(context, kCGPathFillStroke);
+}
+
+- (void)drawMenuShadowInRect:(NSRect)aRect
+{
+    CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
+
+    CGRect bounds = CGRectInset(*(CGRect *)&aRect, OUTlINE_HORIZONTAL_INSET - 0.5, OUTlINE_VERTICAL_INSET - 0.5);
+
+    CGColorRef shadowColor = CGColorCreateGenericGray(0.0, 0.5);
+    CGContextSetShadowWithColor (context, CGSizeMake(0.0, -10.0), 30.0, shadowColor);
+    CGColorRelease(shadowColor);
+
+    CGColorRef fillColor = CGColorCreateGenericGray(1.0, 1.0);
+    CGColorRef strokeColor = CGColorCreateGenericGray(0.0, 0.2);
+
+    CGContextSetFillColorWithColor(context, fillColor);
+    CGContextSetStrokeColorWithColor(context, strokeColor);
+
+    CGColorRelease(fillColor);
+    CGColorRelease(strokeColor);
+
+    CGContextBeginPath(context);
+
+    CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI, M_PI_2, YES);
+    CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI_2, 0, YES);
+    CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 0, 3 * M_PI_2, YES);
+    CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 3 * M_PI_2, M_PI, YES);
+
+    CGContextClosePath(context);
+
+    CGContextDrawPath(context, kCGPathFill);//Stroke);
+
+/*
+    CGContextBeginPath(context);
+
+    CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI, M_PI_2, YES);
+    CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMaxY(bounds) - 3.0, 2.0, M_PI_2, 0, YES);
+    CGContextAddArc(context, CGRectGetMaxX(bounds) - 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 0, 3 * M_PI_2, YES);
+    CGContextAddArc(context, CGRectGetMinX(bounds) + 3.0, CGRectGetMinY(bounds) + 3.0, 2.0, 3 * M_PI_2, M_PI, YES);
+
+    CGContextClosePath(context);
+
+    CGContextSetFillColorWithColor(context, CGColorGetConstantColor(kCGColorClear));
+
+    CGContextSetBlendMode(context, kCGBlendModeCopy);
+    CGContextDrawPath(context, kCGPathFill);
+*/
+}
+
+- (NSImage *)shadowImageWithSelector:(SEL)aSelector
+{
+    static NSMutableDictionary * images = nil;
+
+    if (!images)
+        images = [[NSMutableDictionary alloc] init];
+
+    NSString * name = NSStringFromSelector(aSelector);
+    NSImage * image = [images objectForKey:name];
+
+    if (!image)
+    {
+        image = [[NSImage alloc] initWithSize:NSMakeSize(100.0, 100.0)];
+
+        [image lockFocus];
+        objc_msgSend(self, aSelector, NSMakeRect(0.0, 0.0, 100.0, 100.0));
+        [image unlockFocus];
+
+        [images setObject:image forKey:name];
+
+        [image release];
+    }
+
+    return image;
+}
+
+- (void)drawShadowWithSelector:(SEL)aSelector inRect:(NSRect)aRect
+{
+    CGFloat slices[] = { 40.0, 49.0, 40.0, 49.0 };
+
+    if (NSWidth(aRect) > 100.0 || NSHeight(aRect) > 100.0)
+        [[self shadowImageWithSelector:aSelector] drawInRect:aRect slices:slices];
+    else
+        objc_msgSend(self, aSelector, aRect);
+}
+
+- (void)drawRect:(NSRect)aRect
+{
+    WebWindow * window = (WebWindow *)[self window];
+    NSRect bounds = [self bounds];
+
+    if (![window hasShadow])
+        return;
+
+    if ([window shadowStyle] == CPStandardWindowShadowStyle)
+        if ([window isKeyWindow])
+            return [self drawShadowWithSelector:@selector(drawStandardActiveShadowInRect:) inRect:bounds];
+        else
+            return [self drawShadowWithSelector:@selector(drawStandardInactiveShadowInRect:) inRect:bounds];
+
+
+    if ([window shadowStyle] == CPMenuWindowShadowStyle)
+        return [self drawShadowWithSelector:@selector(drawMenuShadowInRect:) inRect:bounds];
+}
+
+@end
+
diff --git a/Tools/NativeHost/icon.icns b/Tools/NativeHost/icon.icns
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ecb6bb8810528ef1b89898a30fd6f8c89e963
GIT binary patch
literal 81151
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
F{uh$X`~(01

literal 0
HcmV?d00001

diff --git a/Tools/NativeHost/main.m b/Tools/NativeHost/main.m
new file mode 100644
index 000000000..2a040439e
--- /dev/null
+++ b/Tools/NativeHost/main.m
@@ -0,0 +1,23 @@
+//
+//  main.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 5/24/09.
+//  Copyright 280 North, Inc. 2009. All rights reserved.
+//
+
+#import 
+#import "Application.h"
+
+int interactive = 0;
+
+int main(int argc, char *argv[])
+{
+    if (argc > 1 && strcmp(argv[1], "-i") == 0) {
+        interactive = 1;
+    }
+
+    [Application sharedApplication];
+
+    return NSApplicationMain(argc,  (const char **) argv);
+}
diff --git a/Tools/capp/Resources/Templates/Application/Jakefile b/Tools/capp/Resources/Templates/Application/Jakefile
index d27bba79f..81068711d 100644
--- a/Tools/capp/Resources/Templates/Application/Jakefile
+++ b/Tools/capp/Resources/Templates/Application/Jakefile
@@ -37,13 +37,6 @@ app ("__project.nameasidentifier__", function(task)
         task.setCompilerFlags("-O");
 });
 
-function printResults(configuration)
-{
-    print("----------------------------");
-    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
-    print("----------------------------");
-}
-
 task ("default", ["__project.nameasidentifier__"], function()
 {
     printResults(configuration);
@@ -79,3 +72,22 @@ task ("deploy", ["release"], function()
     OS.system(["press", "-f", FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Deployment", "__project.nameasidentifier__")]);
     printResults("Deployment")
 });
+
+task ("desktop", ["release"], function()
+{
+    FILE.mkdirs(FILE.join("Build", "Desktop", "__project.nameasidentifier__"));
+    require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app"));
+    printResults("Desktop")
+});
+
+task ("run-desktop", ["desktop"], function()
+{
+    OS.system([FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]);
+});
+
+function printResults(configuration)
+{
+    print("----------------------------");
+    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
+    print("----------------------------");
+}
diff --git a/Tools/capp/Resources/Templates/NibApplication/Jakefile b/Tools/capp/Resources/Templates/NibApplication/Jakefile
index 5b44b5db3..9e688f19f 100644
--- a/Tools/capp/Resources/Templates/NibApplication/Jakefile
+++ b/Tools/capp/Resources/Templates/NibApplication/Jakefile
@@ -38,13 +38,6 @@ app ("__project.nameasidentifier__", function(task)
         task.setCompilerFlags("-O");
 });
 
-function printResults(configuration)
-{
-    print("----------------------------");
-    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
-    print("----------------------------");
-}
-
 task ("default", ["__project.nameasidentifier__"], function()
 {
     printResults(configuration);
@@ -80,3 +73,22 @@ task ("deploy", ["release"], function()
     OS.system(["press", "-f", FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Deployment", "__project.nameasidentifier__")]);
     printResults("Deployment")
 });
+
+task ("desktop", ["release"], function()
+{
+    FILE.mkdirs(FILE.join("Build", "Desktop", "__project.nameasidentifier__"));
+    require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app"));
+    printResults("Desktop")
+});
+
+task ("run-desktop", ["desktop"], function()
+{
+    OS.system([FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]);
+});
+
+function printResults(configuration)
+{
+    print("----------------------------");
+    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
+    print("----------------------------");
+}
diff --git a/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile b/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
index 280361f54..b7efa85f5 100644
--- a/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
+++ b/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
@@ -43,9 +43,14 @@ task ("release", function()
     JAKE.subjake(["."], "build", ENV);
 });
 
-function printResults(configuration)
+task ("desktop", ["release"], function()
 {
-    print("----------------------------");
-    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
-    print("----------------------------");
-}
+    FILE.mkdirs(FILE.join("Build", "Desktop", "__project.nameasidentifier__"));
+    require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", "__project.nameasidentifier__"), FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app"));
+    printResults("Desktop")
+});
+
+task ("run-desktop", ["desktop"], function()
+{
+    OS.system([FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]);
+});

From dae1e44a8fa7779a59b7b8822e8458e457e290c4 Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Sun, 25 Apr 2010 23:22:16 -0700
Subject: [PATCH 030/175] Merge Cappuccino Info.plist into NativeHost's
 Info.plist.

---
 CommonJS/lib/cappuccino/nativehost.js | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/CommonJS/lib/cappuccino/nativehost.js b/CommonJS/lib/cappuccino/nativehost.js
index c56119aa6..96b97daa8 100644
--- a/CommonJS/lib/cappuccino/nativehost.js
+++ b/CommonJS/lib/cappuccino/nativehost.js
@@ -21,8 +21,20 @@ exports.buildNativeHost = function(rootPath, buildNative, options) {
     OS.system(["cp", "-r", rootPath, buildClientDirectory]);
     // FILE.copyTree(rootPath, buildClientDirectory);
 
+    var defaultBundleName = FILE.basename(buildNative).match(/^(.*)(\.app)?$/)[1];
+
     CFPropertyList.modifyPlist(FILE.join(buildNative, "Contents", "Info.plist"), function(plist) {
-        plist.setValueForKey("CFBundleName", "Project");
+        plist.setValueForKey("CFBundleName", defaultBundleName);
         plist.setValueForKey("NHInitialResource", "Application/index.html");
+
+        // merge Cappuccino plist
+        var cappPlist = CFPropertyList.readPropertyListFromFile(FILE.join(rootPath, "Info.plist"));
+        cappPlist.keys().forEach(function(key) {
+            var value = cappPlist.valueForKey(key);
+            plist.setValueForKey(key, value);
+
+            if (key === "CPBundleName")
+                plist.setValueForKey("CFBundleName", value);
+        });
     });
 }
\ No newline at end of file

From 243f56439699d1772f5821bac2f3e84da46ef50e Mon Sep 17 00:00:00 2001
From: Nicholas Small 
Date: Mon, 26 Apr 2010 11:11:42 -0400
Subject: [PATCH 031/175] Fix typo in new autoscroll stuff.

---
 AppKit/CPClipView.j | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j
index 654cec576..16eabd711 100644
--- a/AppKit/CPClipView.j
+++ b/AppKit/CPClipView.j
@@ -190,7 +190,7 @@
 - (BOOL)autoscroll:(CPEvent)anEvent 
 {
     var bounds = [self bounds],
-        eventLocation = [self convertPoint:[event locationInWindow] fromView:nil],
+        eventLocation = [self convertPoint:[anEvent locationInWindow] fromView:nil],
         superview = [self superview],
         deltaX = 0,
         deltaY = 0;

From 1e7a3bef0dcc0f12ccc4b1eac73f22a94f4f4c20 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Mon, 26 Apr 2010 12:56:52 -0700
Subject: [PATCH 032/175] Fix a potential infinite loop in CPBrowser.

---
 AppKit/CPBrowser.j | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/AppKit/CPBrowser.j b/AppKit/CPBrowser.j
index 3f0d6b09b..77e3700f8 100644
--- a/AppKit/CPBrowser.j
+++ b/AppKit/CPBrowser.j
@@ -570,6 +570,9 @@
 
 - (CPIndexSet)selectedRowIndexesInColumn:(unsigned)column
 {
+    if (column < 0 || column > [self lastColumn] +1)
+        return [CPIndexSet indexSet];
+
     return [[self tableViewInColumn:column] selectedRowIndexes];
 }
 

From c41ffc14c780329479c7bb785d2c7e8a0a8aecef Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Mon, 26 Apr 2010 21:36:45 -0700
Subject: [PATCH 033/175] checkboxes and radio buttons shouldn't be bold.

---
 AppKit/Themes/Aristo/ThemeDescriptors.j | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j
index c4b67cb67..c091aa8d8 100644
--- a/AppKit/Themes/Aristo/ThemeDescriptors.j
+++ b/AppKit/Themes/Aristo/ThemeDescriptors.j
@@ -439,7 +439,7 @@
         isVertical:NO]);
 
     [button setValue:CPLeftTextAlignment forThemeAttribute:@"alignment" inState:CPThemeStateBordered];
-    [button setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateBordered];
+    [button setValue:[CPFont systemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateBordered];
     [button setValue:CGInsetMake(0.0, 0.0, 0.0, 20.0) forThemeAttribute:@"content-inset" inState:CPThemeStateBordered];
     [button setValue:bezelColor forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered];    
     [button setValue:bezelColorSelected forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered | CPThemeStateSelected];
@@ -493,7 +493,7 @@
         isVertical:NO]);
     
     [button setValue:CPLeftTextAlignment forThemeAttribute:@"alignment" inState:CPThemeStateBordered];
-    [button setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateBordered];
+    [button setValue:[CPFont systemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateBordered];
     [button setValue:CGInsetMake(0.0, 0.0, 0.0, 20.0) forThemeAttribute:@"content-inset" inState:CPThemeStateBordered];
     [button setValue:bezelColor forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered];    
     [button setValue:bezelColorSelected forThemeAttribute:@"bezel-color" inState:CPThemeStateBordered | CPThemeStateSelected];

From 5ff798306f5634182e121ccf1d44c3a808796c80 Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Mon, 26 Apr 2010 23:17:37 -0700
Subject: [PATCH 034/175] Copy CFBundleIconFile in NativeHost building.

---
 CommonJS/lib/cappuccino/nativehost.js | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/CommonJS/lib/cappuccino/nativehost.js b/CommonJS/lib/cappuccino/nativehost.js
index 96b97daa8..cbba550c3 100644
--- a/CommonJS/lib/cappuccino/nativehost.js
+++ b/CommonJS/lib/cappuccino/nativehost.js
@@ -4,26 +4,28 @@ var OS = require("os");
 var NATIVEHOST_SOURCE = FILE.path(module.path).dirname().dirname().dirname().join("support", "NativeHost.app");
 
 exports.buildNativeHost = function(rootPath, buildNative, options) {
+    rootPath = FILE.path(rootPath);
+    buildNative = FILE.path(buildNative);
 
-    if (FILE.exists(buildNative))
-        FILE.rmtree(buildNative);
+    if (buildNative.exists())
+        buildNative.rmtree();
 
     // If not we lose all of our permissions.
-    FILE.mkdirs(FILE.dirname(buildNative));
+    buildNative.dirname().mkdirs();
     OS.system(["cp", "-r", NATIVEHOST_SOURCE, buildNative]);
 
     // Do this again anyways?
-    FILE.chmod(FILE.join(buildNative, "Contents", "MacOS", "NativeHost"), 0755);
+    FILE.chmod(buildNative.join("Contents", "MacOS", "NativeHost"), 0755);
 
-    var buildClientDirectory = FILE.join(buildNative, "Contents", "Resources", "Application");
+    var buildClientDirectory = buildNative.join("Contents", "Resources", "Application");
 
     FILE.mkdirs(FILE.dirname(buildClientDirectory));
     OS.system(["cp", "-r", rootPath, buildClientDirectory]);
     // FILE.copyTree(rootPath, buildClientDirectory);
 
-    var defaultBundleName = FILE.basename(buildNative).match(/^(.*)(\.app)?$/)[1];
+    var defaultBundleName = buildNative.basename().match(/^(.*)(\.app)?$/)[1];
 
-    CFPropertyList.modifyPlist(FILE.join(buildNative, "Contents", "Info.plist"), function(plist) {
+    CFPropertyList.modifyPlist(buildNative.join("Contents", "Info.plist"), function(plist) {
         plist.setValueForKey("CFBundleName", defaultBundleName);
         plist.setValueForKey("NHInitialResource", "Application/index.html");
 
@@ -35,6 +37,14 @@ exports.buildNativeHost = function(rootPath, buildNative, options) {
 
             if (key === "CPBundleName")
                 plist.setValueForKey("CFBundleName", value);
+
+            if (key === "CFBundleIconFile") {
+                var iconPath = rootPath.join("Resources", value);
+                if (iconPath.isFile())
+                    iconPath.copy(buildNative.join("Contents", "Resources", value));
+                else
+                    print("Warning: CFBundleIconFile references " + value + " but does not exist in the resources directory.");
+            }
         });
     });
 }
\ No newline at end of file

From ae47509aa74ba8b7ad1e4b5b1ff22be2037a6917 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Tue, 27 Apr 2010 01:04:46 -0700
Subject: [PATCH 035/175] Add convinience methods for dealing with multiple
 objects and controls.

Reviewed by me.
---
 AppKit/CPCheckBox.j    | 23 +++++++++++++++++++++++
 AppKit/CPPopUpButton.j | 17 +++++++++++++++++
 AppKit/CPSlider.j      | 12 ++++++++++++
 AppKit/CPTextField.j   | 16 ++++++++++++++++
 4 files changed, 68 insertions(+)

diff --git a/AppKit/CPCheckBox.j b/AppKit/CPCheckBox.j
index 2c2852883..eec4de33b 100644
--- a/AppKit/CPCheckBox.j
+++ b/AppKit/CPCheckBox.j
@@ -61,4 +61,27 @@
     return self;
 }
 
+- (void)takeStateFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
+{
+    var count = objects.length,
+        value = [objects[0] valueForKeyPath:aKeyPath] ? CPOnState : CPOffState;
+
+    [self setAllowsMixedState:NO];
+    [self setState:value];
+
+    while (count-- > 1)
+    {
+        if (value !== ([objects[count] valueForKeyPath:aKeyPath] ? CPOnState : CPOffState))
+        {
+            [self setAllowsMixedState:YES];
+            [self setState:CPMixedState];
+        }
+    }
+}
+
+- (void)takeValueFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
+{
+    [self takeStateFromKeyPath:aKeyPath ofObjects:objects];
+}
+
 @end
diff --git a/AppKit/CPPopUpButton.j b/AppKit/CPPopUpButton.j
index 08a340626..9913e8023 100644
--- a/AppKit/CPPopUpButton.j
+++ b/AppKit/CPPopUpButton.j
@@ -703,6 +703,23 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
     [self sendAction:[self action] to:[self target]];
 }
 
+- (void)takeValueFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
+{
+    var count = objects.length,
+        value = [objects[0] valueForKeyPath:aKeyPath];
+
+    [self selectItemWithTag:value];
+    [self setEnabled:YES];
+
+    while (count-- > 1)
+    {
+        if (value !== [objects[count] valueForKeyPath:aKeyPath])
+        {
+            [[self selectedItem] setState:CPOffState];
+        }
+    }
+}
+
 @end
 
 var CPPopUpButtonMenuKey            = @"CPPopUpButtonMenuKey",
diff --git a/AppKit/CPSlider.j b/AppKit/CPSlider.j
index 1e96e75ee..bc46a56cf 100644
--- a/AppKit/CPSlider.j
+++ b/AppKit/CPSlider.j
@@ -396,6 +396,18 @@ CPCircularSlider    = 1;
         _sendActionOn &= ~CPLeftMouseDraggedMask;
 }
 
+- (void)takeValueFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
+{
+    var count = objects.length,
+        value = [objects[0] valueForKeyPath:aKeyPath];
+
+    [self setObjectValue:value];
+
+    while (count-- > 1)
+        if (value !== ([objects[count] valueForKeyPath:aKeyPath]))
+            return [self setFloatValue:1.0];
+}
+
 @end
 
 var CPSliderMinValueKey             = "CPSliderMinValueKey",
diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j
index acaf4139b..346301121 100644
--- a/AppKit/CPTextField.j
+++ b/AppKit/CPTextField.j
@@ -1087,6 +1087,22 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
     }
 }
 
+- (void)takeValueFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
+{
+    var count = objects.length,
+        value = [objects[0] valueForKeyPath:aKeyPath];
+
+    [self setStringValue:value];
+    [self setPlaceholderString:@""];
+
+    while (count-- > 1)
+        if (value !== [objects[count] valueForKeyPath:aKeyPath])
+        {
+            [self setPlaceholderString:@"Multiple Values"];
+            [self setStringValue:@""];
+        }
+}
+
 @end
 
 var secureStringForString = function(aString)

From 1d5c21fa7213e4cb3fff2d1f46865752d84b5ae2 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 27 Apr 2010 10:48:34 -0700
Subject: [PATCH 036/175] If we decode a scroll view without a header clip
 view, create one.

---
 AppKit/CPScrollView.j | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j
index b55931abf..26b837414 100644
--- a/AppKit/CPScrollView.j
+++ b/AppKit/CPScrollView.j
@@ -445,9 +445,7 @@
 
 - (CPView)_headerView
 {
-    var headerClipViewSubviews = [_headerClipView subviews];
-
-    return [headerClipViewSubviews count] ? headerClipViewSubviews[0] : nil;
+    return [_headerClipView documentView];
 }
 
 - (CGRect)_cornerViewFrame
@@ -776,7 +774,13 @@ var CPScrollViewContentViewKey       = "CPScrollViewContentView",
         
         _contentView            = [aCoder decodeObjectForKey:CPScrollViewContentViewKey];
         _headerClipView         = [aCoder decodeObjectForKey:CPScrollViewHeaderClipViewKey];
-        
+
+        if (!_headerClipView)
+        {
+            _headerClipView = [[CPClipView alloc] init];
+            [self addSubview:_headerClipView];
+        }
+
         _verticalScroller       = [aCoder decodeObjectForKey:CPScrollViewVScrollerKey];
         _horizontalScroller     = [aCoder decodeObjectForKey:CPScrollViewHScrollerKey];
 

From f5b360f66c40b23789afc5268a4756997aa296bb Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 27 Apr 2010 10:48:54 -0700
Subject: [PATCH 037/175] Move a lot of common initialization code into the
 _init method.

---
 AppKit/CPTableView.j | 89 +++++++++++++++++++-------------------------
 1 file changed, 39 insertions(+), 50 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 1a3e727c4..1032d9cc8 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -232,7 +232,6 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         _allowsEmptySelection = YES;
         _allowsColumnSelection = NO;
         _disableAutomaticResizing = NO;
-        _tableViewFlags = 0;
 
         //Setting Display Attributes
         _selectionHighlightStyle = CPTableViewSelectionHighlightStyleRegular;
@@ -245,28 +244,13 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         _dirtyTableColumnRangeIndex = CPNotFound;
         _numberOfHiddenColumns = 0;
 
-        _objectValues = { };
-        _dataViewsForTableColumns = { };
-        _dataViews=  [];
-        _numberOfRows = 0;
-        _exposedRows = [CPIndexSet indexSet];
-        _exposedColumns = [CPIndexSet indexSet];
-        _cachedDataViews = { };
         _intercellSpacing = _CGSizeMake(0.0, 0.0);
         _rowHeight = 23.0;
 
         [self setGridColor:[CPColor colorWithHexString:@"dce0e2"]];
         [self setGridStyleMask:CPTableViewGridNone];
 
-        _headerView = [[CPTableHeaderView alloc] initWithFrame:CGRectMake(0, 0, [self bounds].size.width, _rowHeight)];
-
-        [_headerView setTableView:self];
-
-        _cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))];
-
         _lastSelectedRow = -1;
-        _selectedColumnIndexes = [CPIndexSet indexSet];
-        _selectedRowIndexes = [CPIndexSet indexSet];
         _currentHighlightedTableColumn = nil;
 
         _sortDescriptors = [CPArray array];
@@ -279,10 +263,6 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         _dragOperationDefaultMask = nil;
         _destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleRegular;
 
-        _tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self];
-        [_tableDrawView setBackgroundColor:[CPColor clearColor]];
-        [self addSubview:_tableDrawView];
-
         [self setBackgroundColor:[CPColor whiteColor]];
         [self _init];
     }
@@ -293,11 +273,43 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 // FIX ME: we have a lot of redundent init stuff in initWithFrame: and initWithCoder: we should move it all into here.
 - (void)_init
 {
+        _tableViewFlags = 0;
+
+        _selectedColumnIndexes = [CPIndexSet indexSet];
+        _selectedRowIndexes = [CPIndexSet indexSet];
+
         _dropOperationFeedbackView = [[_CPDropOperationDrawingView alloc] initWithFrame:_CGRectMakeZero()];
         [_dropOperationFeedbackView setTableView:self];
 
         _lastColumnShouldSnap = NO;
 
+        if (!_alternatingRowBackgroundColors)
+            _alternatingRowBackgroundColors = [[CPColor whiteColor], [CPColor colorWithHexString:@"e4e7ff"]];
+
+        _tableColumnRanges = [];
+        _dirtyTableColumnRangeIndex = 0;
+        _numberOfHiddenColumns = 0;
+
+        _objectValues = { };
+        _dataViewsForTableColumns = { };
+        _dataViews=  [];
+        _numberOfRows = 0;
+        _exposedRows = [CPIndexSet indexSet];
+        _exposedColumns = [CPIndexSet indexSet];
+        _cachedDataViews = { };
+
+        _tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self];
+        [_tableDrawView setBackgroundColor:[CPColor clearColor]];
+        [self addSubview:_tableDrawView];
+
+        if (!_headerView)
+            _headerView = [[CPTableHeaderView alloc] initWithFrame:CGRectMake(0, 0, [self bounds].size.width, _rowHeight)];
+
+        [_headerView setTableView:self];
+
+        if (!_cornerView)
+            _cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))];
+
         // Gradients for the source list
         _sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [89.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2);
         _sourceListActiveTopLineColor = [CPColor colorWithCalibratedRed:(61.0/255.0) green:(123.0/255.0) blue:(218.0/255.0) alpha:1.0];
@@ -2434,10 +2446,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
             
             for(var c = firstExposedColumn; c < exposedColumnCount; c++)
             {
-                //console.log(columnIndexes);
                 var colRect = [self rectOfColumn:exposedColumnIndexes[c]],
                     colX = CGRectGetMaxX(colRect) + 0.5;
-                //console.log(colX);
+
                 CGContextMoveToPoint(context, colX, minY);
                 CGContextAddLineToPoint(context, colX, maxY);
             }
@@ -3183,34 +3194,18 @@ var CPTableViewDataSourceKey                = @"CPTableViewDataSourceKey",
         _allowsEmptySelection = [aCoder decodeBoolForKey:CPTableViewEmptySelectionKey];
         _allowsColumnSelection = [aCoder decodeBoolForKey:CPTableViewColumnSelectionKey];
 
-        _tableViewFlags = 0;
-
         //Setting Display Attributes
         _selectionHighlightStyle = CPTableViewSelectionHighlightStyleRegular;
 
-        _usesAlternatingRowBackgroundColors = [aCoder decodeBoolForKey:CPTableViewUsesAlternatingBackgroundKey];
-        [self setAlternatingRowBackgroundColors:[[CPColor whiteColor], [CPColor colorWithHexString:@"e4e7ff"]]];
-
-        _tableColumns = [aCoder decodeObjectForKey:CPTableViewTableColumnsKey];
+        _tableColumns = [aCoder decodeObjectForKey:CPTableViewTableColumnsKey] || [];
         [_tableColumns makeObjectsPerformSelector:@selector(setTableView:) withObject:self];
 
-        _tableColumnRanges = [];
-        _dirtyTableColumnRangeIndex = 0;
-        _numberOfHiddenColumns = 0;
-
-        _objectValues = { };
-        _dataViewsForTableColumns = { };
-        _dataViews=  [];
-        _numberOfRows = 0;
-        _exposedRows = [CPIndexSet indexSet];
-        _exposedColumns = [CPIndexSet indexSet];
-        _cachedDataViews = { };
-        _rowHeight = [aCoder decodeFloatForKey:CPTableViewRowHeightKey];
-        
-        if ([aCoder containsValueForKey:CPTableViewIntercellSpacingKey])
-            _intercellSpacing = [aCoder decodeSizeForKey:CPTableViewIntercellSpacingKey];
+        if ([aCoder containsValueForKey:CPTableViewRowHeightKey])
+            _rowHeight = [aCoder decodeFloatForKey:CPTableViewRowHeightKey];
         else
-            _intercellSpacing = _CGSizeMake(0.0, 0.0);
+            _rowHeight = 23.0;
+        
+        _intercellSpacing = [aCoder decodeSizeForKey:CPTableViewIntercellSpacingKey] || _CGSizeMake(0.0, 0.0);
         
         _gridColor = [aCoder decodeObjectForKey:CPTableViewGridColorKey] || [CPColor grayColor];
         _gridStyleMask = [aCoder decodeIntForKey:CPTableViewGridStyleMaskKey] || CPTableViewGridNone;
@@ -3221,15 +3216,9 @@ var CPTableViewDataSourceKey                = @"CPTableViewDataSourceKey",
         _headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey];
         _cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey];
 
-        _selectedColumnIndexes = [CPIndexSet indexSet];
-        _selectedRowIndexes = [CPIndexSet indexSet];
-
         _dataSource = [aCoder decodeObjectForKey:CPTableViewDataSourceKey];
         _delegate = [aCoder decodeObjectForKey:CPTableViewDelegateKey];
 
-        _tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self];
-        [_tableDrawView setBackgroundColor:[CPColor clearColor]];
-        [self addSubview:_tableDrawView];
         [self _init];
 
         [self viewWillMoveToSuperview:[self superview]];

From 6ac019145139066ade65979ba373009c15722beb Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Tue, 27 Apr 2010 11:33:00 -0700
Subject: [PATCH 038/175] Show main menu in cibless apps.

Remaining: Make a main menu with quit for desktop version, without for web version.

Reviewed by me.
---
 AppKit/CPApplication.j | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j
index 56964473d..9e1b7844b 100644
--- a/AppKit/CPApplication.j
+++ b/AppKit/CPApplication.j
@@ -131,7 +131,9 @@ CPRunContinuesResponse  = -1002;
 - (id)init
 {
     self = [super init];
-    
+
+    CPApp = self;
+
     if (self)
     {
         _eventListeners = [];
@@ -141,10 +143,10 @@ CPRunContinuesResponse  = -1002;
         [_windows addObject:nil];
     
         // FIXME: This should be read from the cib.
-        _mainMenu = [[CPMenu alloc] initWithTitle:@"MainMenu"];
+        var mainMenu = [[CPMenu alloc] initWithTitle:@"MainMenu"];
         
         // FIXME: We should implement autoenabling.
-        [_mainMenu setAutoenablesItems:NO];
+        [mainMenu setAutoenablesItems:NO];
 
         var bundle = [CPBundle bundleForClass:[CPApplication class]],
             newMenuItem = [[CPMenuItem alloc] initWithTitle:@"New" action:@selector(newDocument:) keyEquivalent:@"n"];
@@ -152,14 +154,14 @@ CPRunContinuesResponse  = -1002;
         [newMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/New.png"] size:CGSizeMake(16.0, 16.0)]];
         [newMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/NewHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
 
-        [_mainMenu addItem:newMenuItem];
+        [mainMenu addItem:newMenuItem];
         
         var openMenuItem = [[CPMenuItem alloc] initWithTitle:@"Open" action:@selector(openDocument:) keyEquivalent:@"o"];
         
         [openMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Open.png"] size:CGSizeMake(16.0, 16.0)]];
         [openMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/OpenHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
         
-        [_mainMenu addItem:openMenuItem];
+        [mainMenu addItem:openMenuItem];
         
         var saveMenu = [[CPMenu alloc] initWithTitle:@"Save"],
             saveMenuItem = [[CPMenuItem alloc] initWithTitle:@"Save" action:@selector(saveDocument:) keyEquivalent:nil];
@@ -172,7 +174,7 @@ CPRunContinuesResponse  = -1002;
         
         [saveMenuItem setSubmenu:saveMenu];
         
-        [_mainMenu addItem:saveMenuItem];
+        [mainMenu addItem:saveMenuItem];
         
         var editMenuItem = [[CPMenuItem alloc] initWithTitle:@"Edit" action:nil keyEquivalent:nil],
             editMenu = [[CPMenu alloc] initWithTitle:@"Edit"],
@@ -193,9 +195,11 @@ CPRunContinuesResponse  = -1002;
         [editMenuItem setSubmenu:editMenu];
         [editMenuItem setHidden:YES];
         
-        [_mainMenu addItem:editMenuItem];
+        [mainMenu addItem:editMenuItem];
         
-        [_mainMenu addItem:[CPMenuItem separatorItem]];
+        [mainMenu addItem:[CPMenuItem separatorItem]];
+
+        [self setMainMenu:mainMenu];
     }
     
     return self;

From 0d97dfacd6802b0c61834ceb430450af3285d18f Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Tue, 27 Apr 2010 12:56:24 -0700
Subject: [PATCH 039/175] give zero sized borderless bridge windows a default
 size if we're not in the browser so they show up in NativeHost.

---
 AppKit/CPWindow/CPWindow.j | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j
index 219963545..209f6e769 100644
--- a/AppKit/CPWindow/CPWindow.j
+++ b/AppKit/CPWindow/CPWindow.j
@@ -372,6 +372,15 @@ CPTexturedBackgroundWindowMask
             [self setPlatformWindow:[CPPlatformWindow primaryPlatformWindow]];
         else
         {
+            // give zero sized borderless bridge windows a default size if we're not in the browser so they show up in NativeHost.
+            if ((aStyleMask & CPBorderlessBridgeWindowMask) && aContentRect.size.width === 0 && aContentRect.size.height === 0)
+            {
+                var visibleFrame = [[[CPScreen alloc] init] visibleFrame];
+                _frame.size.height = MIN(768.0, visibleFrame.size.height);
+                _frame.size.width = MIN(1024.0, visibleFrame.size.width);
+                _frame.origin.x = (visibleFrame.size.width - _frame.size.width) / 2;
+                _frame.origin.y = (visibleFrame.size.height - _frame.size.height) / 2;
+            }
             [self setPlatformWindow:[[CPPlatformWindow alloc] initWithContentRect:_frame]];
             [self platformWindow]._only = self;
         }

From e03cfe8287645e484c8c6181e137c4e1bc5b0d23 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 27 Apr 2010 13:16:17 -0700
Subject: [PATCH 040/175] Missing printResults() in Jakefile for
 ThemeDescriptor template

Conflicts:

	Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
---
 Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile b/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
index b7efa85f5..b458f36ea 100644
--- a/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
+++ b/Tools/capp/Resources/Templates/ThemeDescriptor/Jakefile
@@ -54,3 +54,10 @@ task ("run-desktop", ["desktop"], function()
 {
     OS.system([FILE.join("Build", "Desktop", "__project.nameasidentifier__", "__project.nameasidentifier__.app", "Contents", "MacOS", "NativeHost"), "-i"]);
 });
+
+function printResults(configuration)
+{
+    print("----------------------------");
+    print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
+    print("----------------------------");
+}

From 2f9cf6bc9b4ab00e1a6b0473ddfb2fbd2ddf6c8d Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 27 Apr 2010 22:11:17 -0700
Subject: [PATCH 041/175] Add action buttons to button bars.

---
 AppKit/CPButtonBar.j                    |  37 ++++++++++++++++++++++--
 AppKit/Resources/action_button.png      | Bin 0 -> 506 bytes
 AppKit/Themes/Aristo/ThemeDescriptors.j |   8 +++--
 3 files changed, 40 insertions(+), 5 deletions(-)
 create mode 100644 AppKit/Resources/action_button.png

diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j
index 1f63473de..01aa1d833 100644
--- a/AppKit/CPButtonBar.j
+++ b/AppKit/CPButtonBar.j
@@ -14,7 +14,7 @@
 + (id)plusButton
 {
     var button = [[CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
-        image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"plus_button.png"] size:CGSizeMake(11, 12)];
+        image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPButtonBar class]] pathForResource:@"plus_button.png"] size:CGSizeMake(11, 12)];
 
     [button setBordered:NO];
     [button setImage:image];
@@ -26,7 +26,7 @@
 + (id)minusButton
 {
     var button = [[CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
-        image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"minus_button.png"] size:CGSizeMake(11, 4)];
+        image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPButtonBar class]] pathForResource:@"minus_button.png"] size:CGSizeMake(11, 4)];
 
     [button setBordered:NO];
     [button setImage:image];
@@ -35,6 +35,21 @@
     return button;
 }
 
++ (id)actionPopupButton
+{
+    var button = [[CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
+        image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPButtonBar class]] pathForResource:@"action_button.png"] size:CGSizeMake(22, 14)];
+
+    [button addItemWithTitle:nil];
+    [[button lastItem] setImage:image];
+    [button setImagePosition:CPImageOnly];
+    [button setValue:CGInsetMake(0, 0, 0, 0) forThemeAttribute:"content-inset"];
+
+    [button setPullsDown:YES];
+
+    return button;
+}
+
 + (CPString)themeClass
 {
     return @"button-bar";
@@ -174,13 +189,23 @@
             [buttonsNotHidden removeObject:buttonsNotHidden[count]];
 
     var currentButtonOffset = _resizeControlIsLeftAligned ? CGRectGetMaxX([self bounds]) + 1 : -1,
-        height = CGRectGetHeight([self bounds]) - 1;
+        bounds = [self bounds],
+        height = CGRectGetHeight(bounds) - 1,
+        frameWidth = CGRectGetWidth(bounds),
+        resizeRect = _hasResizeControl ? [self rectForEphemeralSubviewNamed:"resize-control-view"] : CGRectMakeZero(),
+        resizeWidth = CGRectGetWidth(resizeRect),
+        availableWidth = frameWidth - resizeWidth - 1;
 
     for (var i = 0, count = [buttonsNotHidden count]; i < count; i++)
     {   
         var button = buttonsNotHidden[i],
             width = CGRectGetWidth([button frame]);
 
+        if (availableWidth > width)
+            availableWidth -=width;
+        else
+            break;
+
         if (_resizeControlIsLeftAligned)
         {
             [button setFrame:CGRectMake(currentButtonOffset - width, 1, width, height)];
@@ -216,6 +241,12 @@
     }
 }
 
+- (void)setFrameSize:(CGSize)aSize
+{
+    [super setFrameSize:aSize];
+    [self setNeedsLayout];
+}
+
 @end
 
 var CPButtonBarHasResizeControlKey = @"CPButtonBarHasResizeControlKey",
diff --git a/AppKit/Resources/action_button.png b/AppKit/Resources/action_button.png
new file mode 100644
index 0000000000000000000000000000000000000000..2af0dfc48ffaae68415fea7a5d2e6653786424ec
GIT binary patch
literal 506
zcmV3ZN0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzoJmAMRCwBA`2YVu12P5zW+>ec#2`jL
zl+TT>79U17P!fn67#SH40BKgJp)kzH&d%Noq}P#bFb4<6E|@`3!{G+Au&``K;_o5J
z;L_64t!S>qz(C9Y7#SJeCCOkQ_N=X~y$v!zM@Q#lUtiz#w{PDbo;Y#hH4qGE?E-N;l>gt@*!caAA3qL2)x$0R_U&6>
zLPEkLAlm|4Iz9$WW`Ci{?H{g`0hGImC9;@+I16j4FflQ?2h$uJ9Q+K~Fj#8g
Date: Wed, 28 Apr 2010 01:45:04 -0700
Subject: [PATCH 042/175] Some more NativeHost building enhancements.

---
 CommonJS/lib/cappuccino/nativehost.js | 46 +++++++++++++++++++--------
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/CommonJS/lib/cappuccino/nativehost.js b/CommonJS/lib/cappuccino/nativehost.js
index cbba550c3..8def87642 100644
--- a/CommonJS/lib/cappuccino/nativehost.js
+++ b/CommonJS/lib/cappuccino/nativehost.js
@@ -4,35 +4,35 @@ var OS = require("os");
 var NATIVEHOST_SOURCE = FILE.path(module.path).dirname().dirname().dirname().join("support", "NativeHost.app");
 
 exports.buildNativeHost = function(rootPath, buildNative, options) {
+    options = options || {};
+    options.index = options.index || "index.html";
+
     rootPath = FILE.path(rootPath);
     buildNative = FILE.path(buildNative);
 
     if (buildNative.exists())
         buildNative.rmtree();
 
-    // If not we lose all of our permissions.
     buildNative.dirname().mkdirs();
+    // FIXME: Narwhal doesn't preserve permissions
+    // FILE.copyTree(NATIVEHOST_SOURCE, buildNative);
     OS.system(["cp", "-r", NATIVEHOST_SOURCE, buildNative]);
-
-    // Do this again anyways?
     FILE.chmod(buildNative.join("Contents", "MacOS", "NativeHost"), 0755);
 
-    var buildClientDirectory = buildNative.join("Contents", "Resources", "Application");
+    var rootBaseName = rootPath.basename();
+    var buildClientDirectory = buildNative.join("Contents", "Resources", rootBaseName);
 
     FILE.mkdirs(FILE.dirname(buildClientDirectory));
-    OS.system(["cp", "-r", rootPath, buildClientDirectory]);
     // FILE.copyTree(rootPath, buildClientDirectory);
+    OS.system(["cp", "-r", rootPath, buildClientDirectory]);
 
     var defaultBundleName = buildNative.basename().match(/^(.*)(\.app)?$/)[1];
 
-    CFPropertyList.modifyPlist(buildNative.join("Contents", "Info.plist"), function(plist) {
-        plist.setValueForKey("CFBundleName", defaultBundleName);
-        plist.setValueForKey("NHInitialResource", "Application/index.html");
+    function mergePlist(plist, path) {
+        var otherPlist = CFPropertyList.readPropertyListFromFile(String(path));
 
-        // merge Cappuccino plist
-        var cappPlist = CFPropertyList.readPropertyListFromFile(FILE.join(rootPath, "Info.plist"));
-        cappPlist.keys().forEach(function(key) {
-            var value = cappPlist.valueForKey(key);
+        otherPlist.keys().forEach(function(key) {
+            var value = otherPlist.valueForKey(key);
             plist.setValueForKey(key, value);
 
             if (key === "CPBundleName")
@@ -45,6 +45,26 @@ exports.buildNativeHost = function(rootPath, buildNative, options) {
                 else
                     print("Warning: CFBundleIconFile references " + value + " but does not exist in the resources directory.");
             }
+
+            if (key === "CFBundleExecutable") {
+                buildNative.join("Contents", "MacOS", "NativeHost").rename(value);
+                // FIXME:
+                FILE.chmod(buildNative.join("Contents", "MacOS", value), 0755);
+            }
         });
+    }
+
+    CFPropertyList.modifyPlist(buildNative.join("Contents", "Info.plist"), function(plist) {
+
+        plist.setValueForKey("CFBundleName", defaultBundleName);
+        plist.setValueForKey("NHInitialResource", FILE.join(rootBaseName, options.index));
+
+        // merge Cappuccino plist
+        var cappPlistPath = rootPath.join("Info.plist");
+        if (cappPlistPath.isFile())
+            mergePlist(plist, cappPlistPath);
+
+        if (options.extraPlistPath)
+            mergePlist(plist, options.extraPlistPath);
     });
-}
\ No newline at end of file
+}

From 0f2ee1966e63afd6ccf237d7b25f90ba26104ff2 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Wed, 28 Apr 2010 02:06:01 -0700
Subject: [PATCH 043/175] Only create main menu in code if no cib is loaded.

Reviewed by me.
---
 AppKit/CPApplication.j | 270 +++++++++++++++++++++--------------------
 1 file changed, 137 insertions(+), 133 deletions(-)

diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j
index 9e1b7844b..e23aab878 100644
--- a/AppKit/CPApplication.j
+++ b/AppKit/CPApplication.j
@@ -54,7 +54,7 @@ CPRunStoppedResponse    = -1000;
 CPRunAbortedResponse    = -1001;
 CPRunContinuesResponse  = -1002;
 
-/*! 
+/*!
     @ingroup appkit
     @class CPApplication
 
@@ -62,7 +62,7 @@ CPRunContinuesResponse  = -1002;
     Every GUI application has exactly one instance of CPApplication (or of a custom subclass of
     CPApplication). Your program's main() function can create that instance by calling the
     \c CPApplicationMain function. A simple example looks like this:
-    
+
     
     function main(args, namedArgs)
     {
@@ -82,25 +82,25 @@ CPRunContinuesResponse  = -1002;
 @implementation CPApplication : CPResponder
 {
     CPArray                 _eventListeners;
-    
+
     CPEvent                 _currentEvent;
-    
+
     CPArray                 _windows;
     CPWindow                _keyWindow;
     CPWindow                _mainWindow;
     CPWindow                _previousKeyWindow;
     CPWindow                _previousMainWindow;
-    
+
     CPMenu                  _mainMenu;
     CPDocumentController    _documentController;
-    
+
     CPModalSession          _currentSession;
-    
+
     //
     id                      _delegate;
     BOOL                    _finishedLaunching;
     BOOL                    _isActive;
-    
+
     CPDictionary            _namedArgs;
     CPArray                 _args;
     CPString                _fullArgsString;
@@ -119,7 +119,7 @@ CPRunContinuesResponse  = -1002;
 {
     if (!CPApp)
         CPApp = [[CPApplication alloc] init];
-    
+
     return CPApp;
 }
 
@@ -137,71 +137,12 @@ CPRunContinuesResponse  = -1002;
     if (self)
     {
         _eventListeners = [];
-        
+
         _windows = [];
-        
+
         [_windows addObject:nil];
-    
-        // FIXME: This should be read from the cib.
-        var mainMenu = [[CPMenu alloc] initWithTitle:@"MainMenu"];
-        
-        // FIXME: We should implement autoenabling.
-        [mainMenu setAutoenablesItems:NO];
-
-        var bundle = [CPBundle bundleForClass:[CPApplication class]],
-            newMenuItem = [[CPMenuItem alloc] initWithTitle:@"New" action:@selector(newDocument:) keyEquivalent:@"n"];
-
-        [newMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/New.png"] size:CGSizeMake(16.0, 16.0)]];
-        [newMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/NewHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
-
-        [mainMenu addItem:newMenuItem];
-        
-        var openMenuItem = [[CPMenuItem alloc] initWithTitle:@"Open" action:@selector(openDocument:) keyEquivalent:@"o"];
-        
-        [openMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Open.png"] size:CGSizeMake(16.0, 16.0)]];
-        [openMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/OpenHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
-        
-        [mainMenu addItem:openMenuItem];
-        
-        var saveMenu = [[CPMenu alloc] initWithTitle:@"Save"],
-            saveMenuItem = [[CPMenuItem alloc] initWithTitle:@"Save" action:@selector(saveDocument:) keyEquivalent:nil];
-        
-        [saveMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Save.png"] size:CGSizeMake(16.0, 16.0)]];
-        [saveMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/SaveHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];        
-        
-        [saveMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Save" action:@selector(saveDocument:) keyEquivalent:@"s"]];
-        [saveMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Save As" action:@selector(saveDocumentAs:) keyEquivalent:nil]];
-        
-        [saveMenuItem setSubmenu:saveMenu];
-        
-        [mainMenu addItem:saveMenuItem];
-        
-        var editMenuItem = [[CPMenuItem alloc] initWithTitle:@"Edit" action:nil keyEquivalent:nil],
-            editMenu = [[CPMenu alloc] initWithTitle:@"Edit"],
-            
-            undoMenuItem = [[CPMenuItem alloc] initWithTitle:@"Undo" action:@selector(undo:) keyEquivalent:CPUndoKeyEquivalent],
-            redoMenuItem = [[CPMenuItem alloc] initWithTitle:@"Redo" action:@selector(redo:) keyEquivalent:CPRedoKeyEquivalent];
-
-        [undoMenuItem setKeyEquivalentModifierMask:CPUndoKeyEquivalentModifierMask];        
-        [redoMenuItem setKeyEquivalentModifierMask:CPRedoKeyEquivalentModifierMask];
-        
-        [editMenu addItem:undoMenuItem];
-        [editMenu addItem:redoMenuItem];
-        
-        [editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Cut" action:@selector(cut:) keyEquivalent:@"x"]],
-        [editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Copy" action:@selector(copy:) keyEquivalent:@"c"]],
-        [editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Paste" action:@selector(paste:) keyEquivalent:@"v"]];
-    
-        [editMenuItem setSubmenu:editMenu];
-        [editMenuItem setHidden:YES];
-        
-        [mainMenu addItem:editMenuItem];
-        
-        [mainMenu addItem:[CPMenuItem separatorItem]];
-
-        [self setMainMenu:mainMenu];
     }
-    
+
     return self;
 }
 
@@ -282,28 +223,28 @@ CPRunContinuesResponse  = -1002;
 
     // We also want to set the default cursor on the body, so that buttons and things don't have an iBeam
     [[CPCursor arrowCursor] set];
-    
+
     var bundle = [CPBundle mainBundle],
         types = [bundle objectForInfoDictionaryKey:@"CPBundleDocumentTypes"];
-        
+
     if ([types count] > 0)
         _documentController = [CPDocumentController sharedDocumentController];
-        
+
     var delegateClassName = [bundle objectForInfoDictionaryKey:@"CPApplicationDelegateClass"];
-    
+
     if (delegateClassName)
     {
         var delegateClass = objj_getClass(delegateClassName);
-        
+
         if (delegateClass)
             if ([_documentController class] == delegateClass)
                 [self setDelegate:_documentController];
             else
                 [self setDelegate:[[delegateClass alloc] init]];
     }
-    
+
     var defaultCenter = [CPNotificationCenter defaultCenter];
-    
+
     [defaultCenter
         postNotificationName:CPApplicationWillFinishLaunchingNotification
         object:self];
@@ -392,14 +333,14 @@ CPRunContinuesResponse  = -1002;
             versionLabel = [contentView viewWithTag:3],
             copyrightLabel = [contentView viewWithTag:4],
             standardPath = [[CPBundle bundleForClass:[self class]] pathForResource:@"standardApplicationIcon.png"];
-    
+
         // FIXME move this into the CIB eventually
         [applicationLabel setFont:[CPFont boldSystemFontOfSize:14.0]];
         [applicationLabel setAlignment:CPCenterTextAlignment];
         [versionLabel setAlignment:CPCenterTextAlignment];
         [copyrightLabel setAlignment:CPCenterTextAlignment];
 
-        [imageView setImage:applicationIcon || [[CPImage alloc] initWithContentsOfFile:standardPath 
+        [imageView setImage:applicationIcon || [[CPImage alloc] initWithContentsOfFile:standardPath
                                                                                   size:CGSizeMake(256, 256)]];
 
         [applicationLabel setStringValue:applicationTitle || ""];
@@ -503,10 +444,10 @@ CPRunContinuesResponse  = -1002;
         return;
         // raise exception;
     }
-    
+
     _currentSession._state = aCode;
     _currentSession = _currentSession._previous;
-    
+
 //    if (aCode == CPRunAbortedResponse)
         [self _removeRunModalLoop];
 }
@@ -515,12 +456,12 @@ CPRunContinuesResponse  = -1002;
 - (void)_removeRunModalLoop
 {
     var count = _eventListeners.length;
-    
+
     while (count--)
         if (_eventListeners[count]._callback === _CPRunModalLoop)
         {
             _eventListeners.splice(count, 1);
-            
+
             return;
         }
 }
@@ -558,12 +499,12 @@ CPRunContinuesResponse  = -1002;
 {
     aModalSession._previous = _currentSession;
     _currentSession = aModalSession;
-    
+
     var theWindow = aModalSession._window;
 
     [theWindow center];
     [theWindow makeKeyAndOrderFront:self];
-    
+
 //    [theWindow._bridge _obscureWindowsBelowModalWindow];
 
     [CPApp setCallback:_CPRunModalLoop forNextEventMatchingMask:CPAnyEventMask untilDate:nil inMode:0 dequeue:NO];
@@ -577,7 +518,7 @@ CPRunContinuesResponse  = -1002;
 {
     if (!_currentSession)
         return nil;
-    
+
     return _currentSession._window;
 }
 
@@ -622,7 +563,7 @@ CPRunContinuesResponse  = -1002;
     {
         if (_eventListeners[_eventListeners.length - 1]._mask & (1 << [anEvent type]))
             _eventListeners.pop()._callback(anEvent);
-        
+
         return;
     }
 
@@ -733,11 +674,11 @@ CPRunContinuesResponse  = -1002;
 
     if ([super tryToPerform:anAction with:anObject])
         return YES;
-    
+
     if([_delegate respondsToSelector:anAction])
     {
         [_delegate performSelector:anAction withObject:anObject];
-        
+
         return YES;
     }
 
@@ -757,9 +698,9 @@ CPRunContinuesResponse  = -1002;
 
     if (!target)
         return NO;
-    
+
     [target performSelector:anAction withObject:aSender];
-    
+
     return YES;
 }
 
@@ -778,10 +719,10 @@ CPRunContinuesResponse  = -1002;
 {
     if (!anAction)
         return nil;
-        
+
     if (aTarget)
         return aTarget;
-        
+
     return [self targetForAction:anAction];
 }
 
@@ -806,28 +747,28 @@ CPRunContinuesResponse  = -1002;
 {
     var responder = [aWindow firstResponder],
         checkWindow = YES;
-    
+
     while (responder)
     {
         if ([responder respondsToSelector:anAction])
             return responder;
-        
+
         if (responder == aWindow)
             checkWindow = NO;
-        
+
         responder = [responder nextResponder];
     }
-    
+
     if (checkWindow && [aWindow respondsToSelector:anAction])
         return aWindow;
-    
+
     var delegate = [aWindow delegate];
-    
+
     if ([delegate respondsToSelector:anAction])
         return delegate;
 
     var windowController = [aWindow windowController];
-    
+
     if ([windowController respondsToSelector:anAction])
         return windowController;
 
@@ -856,26 +797,26 @@ CPRunContinuesResponse  = -1002;
 {
     if (!anAction)
         return nil;
-    
+
     var target = [self _targetForWindow:[self keyWindow] action:anAction];
-    
+
     if (target)
         return target;
-        
+
     target = [self _targetForWindow:[self mainWindow] action:anAction];
-    
+
     if (target)
         return target;
-    
+
     if ([self respondsToSelector:anAction])
         return self;
-    
+
     if ([_delegate respondsToSelector:anAction])
         return _delegate;
-        
+
     if ([_documentController respondsToSelector:anAction])
         return _documentController;
-    
+
     return nil;
 }
 
@@ -905,14 +846,14 @@ CPRunContinuesResponse  = -1002;
     @param aContextInfo
 */
 - (void)beginSheet:(CPWindow)aSheet modalForWindow:(CPWindow)aWindow modalDelegate:(id)aModalDelegate didEndSelector:(SEL)aDidEndSelector contextInfo:(id)aContextInfo
-{    
+{
     var styleMask = [aSheet styleMask];
     if (!(styleMask & CPDocModalWindowMask))
     {
         [CPException raise:CPInternalInconsistencyException reason:@"Currently only CPDocModalWindowMask style mask is supported for attached sheets"];
         return;
     }
-    
+
     [aWindow orderFront:self];
     [aWindow _attachSheet:aSheet modalDelegate:aModalDelegate didEndSelector:aDidEndSelector contextInfo:aContextInfo];
 }
@@ -920,15 +861,15 @@ CPRunContinuesResponse  = -1002;
 - (void)endSheet:(CPWindow)sheet returnCode:(int)returnCode
 {
     var count = [_windows count];
-    
+
     while (--count >= 0)
     {
         var aWindow = [_windows objectAtIndex:count];
         var context = aWindow._sheetContext;
-    
+
         if (context != nil && context["sheet"] === sheet)
         {
-            context["returnCode"] = returnCode; 
+            context["returnCode"] = returnCode;
             [aWindow _detachSheetWindow];
             return;
         }
@@ -944,7 +885,7 @@ CPRunContinuesResponse  = -1002;
 {
     if(_fullArgsString !== window.location.hash)
         [self _reloadArguments];
-    
+
     return _args;
 }
 
@@ -954,28 +895,28 @@ CPRunContinuesResponse  = -1002;
     {
         _args = [];
         window.location.hash = @"#";
-        
+
         return;
     }
-    
+
     if([args class] != CPArray)
         args = [CPArray arrayWithObject:args];
-    
+
     _args = args;
-    
+
     var toEncode = [_args copy];
     for(var i=0, count = toEncode.length; i
Date: Wed, 28 Apr 2010 02:22:43 -0700
Subject: [PATCH 044/175] Use 127.0.0.1 instead of localhost in case localhost
 != loopback.

---
 Tools/NativeHost/AppController.m   | 2 +-
 Tools/NativeHost/NSURL+Additions.m | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Tools/NativeHost/AppController.m b/Tools/NativeHost/AppController.m
index b751d0135..aeb2362d3 100644
--- a/Tools/NativeHost/AppController.m
+++ b/Tools/NativeHost/AppController.m
@@ -155,7 +155,7 @@ NSString *SERVER_USER = nil;
     }
     else if (prependServer)
     {
-        initialURL = [NSString stringWithFormat:@"http://localhost:%d/%@", SERVER_PORT, initialURL];
+        initialURL = [NSString stringWithFormat:@"http://127.0.0.1:%d/%@", SERVER_PORT, initialURL];
     }
 
 	NHLog(@"STARTUP", [initialURL description]);
diff --git a/Tools/NativeHost/NSURL+Additions.m b/Tools/NativeHost/NSURL+Additions.m
index 8597da97a..39cabb1a3 100644
--- a/Tools/NativeHost/NSURL+Additions.m
+++ b/Tools/NativeHost/NSURL+Additions.m
@@ -15,7 +15,7 @@
 {
     if ([[self scheme] caseInsensitiveCompare:@"file"] == NSOrderedSame)
         return [[[NSURL alloc] initWithScheme:@"http"
-										 host:[NSString stringWithFormat:@"localhost:%d", SERVER_PORT] 
+										 host:[NSString stringWithFormat:@"127.0.0.1:%d", SERVER_PORT] 
 										 path:[@"/filesystem/" stringByAppendingString:[self path]]] autorelease];
 
     return [[self copy] autorelease];

From 4ef9202e920fee277f9231ccef9700e17207e133 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Thu, 29 Apr 2010 14:22:46 +0200
Subject: [PATCH 045/175] made the tableview handle hiding and showing of
 columns properly

---
 AppKit/CPTableColumn.j     |  7 +++++++
 AppKit/CPTableHeaderView.j | 18 +++++------------
 AppKit/CPTableView.j       | 40 ++++++++++++++++++++++++++++++++++----
 3 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j
index ccd24e9f8..5c6b91cea 100644
--- a/AppKit/CPTableColumn.j
+++ b/AppKit/CPTableColumn.j
@@ -348,7 +348,14 @@ CPTableColumnUserResizingMask   = 1 << 1;
 
 - (void)setHidden:(BOOL)shouldBeHidden
 {
+    shouldBeHidden = !!shouldBeHidden
+    if (_isHidden === shouldBeHidden)
+        return;
+    
     _isHidden = shouldBeHidden;
+    
+    [[self headerView] setHidden:shouldBeHidden];
+    [[self tableView] _tableColumnVisibilityDidChange:self];
 }
 
 - (BOOL)isHidden
diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 8d8d3b9ec..534b24da1 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -187,21 +187,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (CGRect)headerRectOfColumn:(int)aColumnIndex
 {
-    var tableColumns = [_tableView tableColumns];
-
-    if (aColumnIndex < 0 || aColumnIndex > [tableColumns count])
-        [CPException raise:"invalid" reason:"tried to get headerRectOfColumn: on invalid column"];
-
-    // UPDATE COLUMN RANGES ?
+    var headerRect = [self bounds],
+        columnRect = [[self tableView] rectOfColumn:aColumnIndex];
         
-    var tableRange = _tableView._tableColumnRanges[aColumnIndex],
-        bounds = [self bounds];
-
-    var rMinX = ROUND(tableRange.location);
-    bounds.origin.x = rMinX;
-    bounds.size.width = FLOOR(tableRange.length + tableRange.location - rMinX);
+    headerRect.origin.x = CPRectGetMinX(columnRect);
+    headerRect.size.width = CPRectGetWidth(columnRect);
     
-    return bounds;
+    return headerRect;
 }
 
 - (CGRect)_cursorRectForColumn:(int)column
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 1a3e727c4..75041a838 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -690,6 +690,24 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     [self setNeedsLayout];
 }
 
+/*!
+    @ignore
+*/
+- (void)_tableColumnVisibilityDidChange:(CPTableColumn)aColumn
+{
+    var columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:aColumn];
+    
+    if (_dirtyTableColumnRangeIndex < 0)
+        _dirtyTableColumnRangeIndex = columnIndex;
+    else
+        _dirtyTableColumnRangeIndex = MIN(columnIndex, _dirtyTableColumnRangeIndex);
+    
+    [[self headerView] setNeedsLayout];
+    [[self headerView] setNeedsDisplay:YES];
+    
+    [self reloadData];
+}
+
 - (CPArray)tableColumns
 {
     return _tableColumns;
@@ -1044,6 +1062,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     if (_dirtyTableColumnRangeIndex < 0)
         return;
 
+    _numberOfHiddenColumns = 0;
+
     var index = _dirtyTableColumnRangeIndex,
         count = NUMBER_OF_COLUMNS(),
         x = index === 0 ? 0.0 : CPMaxRange(_tableColumnRanges[index - 1]);
@@ -1053,7 +1073,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         var tableColumn = _tableColumns[index];
 
         if ([tableColumn isHidden])
+        {
+            _numberOfHiddenColumns += 1;
             _tableColumnRanges[index] = CPMakeRange(x, 0.0);
+        }
 
         else
         {
@@ -1074,8 +1097,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 - (CGRect)rectOfColumn:(CPInteger)aColumnIndex
 {
     aColumnIndex = +aColumnIndex;
+    
+    var column = [[self tableColumns] objectAtIndex:aColumnIndex];
 
-    if (aColumnIndex < 0 || aColumnIndex >= NUMBER_OF_COLUMNS())
+    if ([column isHidden] || aColumnIndex < 0 || aColumnIndex >= NUMBER_OF_COLUMNS())
         return _CGRectMakeZero();
 
     UPDATE_COLUMN_RANGES_IF_NECESSARY();
@@ -2042,10 +2067,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         columnsCount = columnArray.length;
 
     for (; columnIndex < columnsCount; ++columnIndex)
-    {
+    {        
         var column = columnArray[columnIndex],
-            tableColumn = _tableColumns[column],
-            tableColumnUID = [tableColumn UID];
+            tableColumn = _tableColumns[column];
+            
+        if ([tableColumn isHidden])
+            continue;
+            
+        var tableColumnUID = [tableColumn UID];
 
         if (!_dataViewsForTableColumns[tableColumnUID])
             _dataViewsForTableColumns[tableColumnUID] = [];
@@ -2158,6 +2187,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 
 - (void)_enqueueReusableDataView:(CPView)aDataView
 {
+    if (!aDataView)
+        return;
+    
     // FIXME: yuck!
     var identifier = aDataView.identifier;
 

From 2453e403efc7ae25920e36c3e73049ce2773973c Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Thu, 29 Apr 2010 12:04:44 -0700
Subject: [PATCH 046/175] Make nil a completely valid object in a CPArray.
 Closes #630.

---
 Foundation/CPArray.j           | 50 ++++++++++++----------------------
 Tests/Foundation/CPArrayTest.j | 29 ++++++++++----------
 2 files changed, 31 insertions(+), 48 deletions(-)

diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j
index ab149a6fb..e26731db4 100755
--- a/Foundation/CPArray.j
+++ b/Foundation/CPArray.j
@@ -145,10 +145,10 @@
 {
     var i = 2,
         array = [[self alloc] init],
-        argument;
+        count = arguments.length;
 
-    for (; i < arguments.length && (argument = arguments[i]) != nil; ++i)
-        array.push(argument);
+    for (; i < count; ++i)
+        array.push(arguments[i]);
 
     return array;
 }
@@ -229,10 +229,10 @@
 {
     // The arguments array contains self and _cmd, so the first object is at position 2.
     var i = 2,
-        argument;
+        count = arguments.length;
 
-    for (; i < arguments.length && (argument = arguments[i]) != nil; ++i)
-        push(argument);
+    for (; i < count; ++i)
+        push(arguments[i]);
 
     return self;
 }
@@ -278,21 +278,18 @@
 
 /*!
     Returns the index of \c anObject in this array.
-    If the object is \c nil or not in the array,
+    If the object is not in the array,
     returns \c CPNotFound. It first attempts to find
-    a match using \c -isEqual:, then \c ==.
+    a match using \c -isEqual:, then \c ===.
     @param anObject the object to search for
 */
 - (int)indexOfObject:(id)anObject
 {
-    if (anObject === nil)
-        return CPNotFound;
-
     var i = 0,
         count = length;
 
     // Only use -isEqual: if our object is a CPObject.
-    if (anObject.isa)
+    if (anObject && anObject.isa)
     {
         for (; i < count; ++i)
             if ([self[i] isEqual:anObject])
@@ -305,7 +302,7 @@
     // Last resort, do a straight forward linear O(N) search.
     else
         for (; i < count; ++i)
-            if (self[i] == anObject)
+            if (self[i] === anObject)
                 return i;
 
     return CPNotFound;
@@ -314,21 +311,18 @@
 /*!
     Returns the index of \c anObject in the array
     within \c aRange. It first attempts to find
-    a match using \c -isEqual:, then \c ==.
+    a match using \c -isEqual:, then \c ===.
     @param anObject the object to search for
     @param aRange the range to search within
     @return the index of the object, or \c CPNotFound if it was not found.
 */
 - (int)indexOfObject:(id)anObject inRange:(CPRange)aRange
 {
-    if (anObject === nil)
-        return CPNotFound;
-
     var i = aRange.location,
         count = MIN(CPMaxRange(aRange), length);
 
     // Only use isEqual: if our object is a CPObject.
-    if (anObject.isa)
+    if (anObject && anObject.isa)
     {
         for (; i < count; ++i)
             if ([self[i] isEqual:anObject])
@@ -337,22 +331,19 @@
     // Last resort, do a straight forward linear O(N) search.
     else
         for (; i < count; ++i)
-            if (self[i] == anObject)
+            if (self[i] === anObject)
                 return i;
 
     return CPNotFound;
 }
 
 /*!
-    Returns the index of \c anObject in the array. The test for equality is done using only \c ==.
+    Returns the index of \c anObject in the array. The test for equality is done using only \c ===.
     @param anObject the object to search for
     @return the index of the object in the array. \c CPNotFound if the object is not in the array.
 */
 - (int)indexOfObjectIdenticalTo:(id)anObject
 {
-    if (anObject === nil)
-        return CPNotFound;
-
     // If indexOf exists, use it since it's probably
     // faster than anything we can implement.
     if (self.indexOf)
@@ -382,9 +373,6 @@
 */
 - (int)indexOfObjectIdenticalTo:(id)anObject inRange:(CPRange)aRange
 {
-    if (anObject === nil)
-        return CPNotFound;
-
     // If indexOf exists, use it since it's probably
     // faster than anything we can implement.
     if (self.indexOf)
@@ -460,7 +448,7 @@
 
 - (unsigned)_indexOfObject:(id)anObject sortedByFunction:(Function)aFunction context:(id)aContext
 {
-    if (!aFunction || anObject === undefined)
+    if (!aFunction)
         return CPNotFound;
 
     if (length === 0)
@@ -523,7 +511,8 @@
 {
     var count = [self count];
 
-    if (!count) return nil;
+    if (!count)
+        return nil;
 
     return self[count - 1];
 }
@@ -697,12 +686,7 @@
 */
 - (CPArray)arrayByAddingObject:(id)anObject
 {
-    if (anObject === nil || anObject === undefined)
-        [CPException raise:CPInvalidArgumentException
-                    reason:"arrayByAddingObject: object can't be nil"];
-
     var array = [self copy];
-
     array.push(anObject);
 
     return array;
diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j
index f99ec7b78..75cc9cf01 100644
--- a/Tests/Foundation/CPArrayTest.j
+++ b/Tests/Foundation/CPArrayTest.j
@@ -21,8 +21,8 @@
 
 - (void)testsInsertObjectsAtIndexes
 {
-    var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four", nil],
-        newAdditions = [CPArray arrayWithObjects:@"a", @"b", nil],
+    var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four"],
+        newAdditions = [CPArray arrayWithObjects:@"a", @"b"],
         indexes = [CPMutableIndexSet indexSetWithIndex:1];
 
     [indexes addIndex:3];
@@ -31,8 +31,8 @@
 
     [self assert:array equals:[@"one", @"a", @"two", @"b", @"three", @"four"]];
 
-    var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four", nil],
-        newAdditions = [CPArray arrayWithObjects:@"a", @"b", nil],
+    var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four"],
+        newAdditions = [CPArray arrayWithObjects:@"a", @"b"],
         indexes = [CPMutableIndexSet indexSetWithIndex:5];
     
     [indexes addIndex:4];
@@ -41,8 +41,8 @@
 
     [self assert:array equals:[@"one", @"two", @"three", @"four", @"a", @"b"]];
     
-    var array = [CPMutableArray arrayWithObjects: @"one", @"two", @"three", @"four", nil],
-        newAdditions = [CPArray arrayWithObjects: @"a", @"b", @"c", nil],
+    var array = [CPMutableArray arrayWithObjects: @"one", @"two", @"three", @"four"],
+        newAdditions = [CPArray arrayWithObjects: @"a", @"b", @"c"],
         indexes = [CPMutableIndexSet indexSetWithIndex:1];
 
     [indexes addIndex:2];
@@ -53,8 +53,8 @@
     [self assert:array equals:[@"one", @"a", @"b", @"two", @"c", @"three", @"four"]];
 
 
-    var array = [CPMutableArray arrayWithObjects: @"one", @"two", @"three", @"four", nil],
-        newAdditions = [CPArray arrayWithObjects: @"a", @"b", @"c", nil],
+    var array = [CPMutableArray arrayWithObjects: @"one", @"two", @"three", @"four"],
+        newAdditions = [CPArray arrayWithObjects: @"a", @"b", @"c"],
         indexes = [CPMutableIndexSet indexSetWithIndex:1];
 
     [indexes addIndex:2];
@@ -64,10 +64,9 @@
     
     [self assert:array equals:[@"one", @"a", @"b", @"two", @"three", @"four", @"c"]];
 
-    //
-    
-    var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four", nil],
-        newAdditions = [CPArray arrayWithObjects:@"a", @"b", nil],
+
+    var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four"],
+        newAdditions = [CPArray arrayWithObjects:@"a", @"b"],
         indexes = [CPMutableIndexSet indexSetWithIndex:5];
     
     [indexes addIndex:6];
@@ -88,10 +87,10 @@
 {
 	var array = [CPMutableArray arrayWithObjects:@"one", @"two", @"three", @"four", nil],
 			indexes = [CPMutableIndexSet indexSetWithIndex: 2];
-			
+
 	[array removeObjectsAtIndexes: indexes];
-	
-	[self assert:array equals:[@"one", @"two", @"four"]];
+
+	[self assert:array equals:[@"one", @"two", @"four", nil]];
 }
 
 - (void)testIndexOfObjectSortedByFunction

From 1545f7b60afea3e08d8afe67f6fb9411c6f4f679 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Thu, 29 Apr 2010 15:38:33 -0700
Subject: [PATCH 047/175] Return the cib created in CibLoading.j methods.

---
 AppKit/Cib/CPCibLoading.j | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/AppKit/Cib/CPCibLoading.j b/AppKit/Cib/CPCibLoading.j
index aa7007556..22543eddc 100644
--- a/AppKit/Cib/CPCibLoading.j
+++ b/AppKit/Cib/CPCibLoading.j
@@ -37,12 +37,12 @@ var CPCibOwner = @"CPCibOwner";
 
 @implementation CPBundle (CPCibLoading)
 
-+ (void)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable
++ (CPCib)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable
 {
-    [[[CPCib alloc] initWithContentsOfURL:anAbsolutePath] instantiateCibWithExternalNameTable:aNameTable];
+    return [[[CPCib alloc] initWithContentsOfURL:anAbsolutePath] instantiateCibWithExternalNameTable:aNameTable];
 }
 
-+ (void)loadCibNamed:(CPString)aName owner:(id)anOwner
++ (CPCib)loadCibNamed:(CPString)aName owner:(id)anOwner
 {
     if (![aName hasSuffix:@".cib"])
         aName = [aName stringByAppendingString:@".cib"];
@@ -51,24 +51,24 @@ var CPCibOwner = @"CPCibOwner";
     var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle],
         path = [bundle pathForResource:aName];
 
-    [self loadCibFile:path externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner]];
+    return [self loadCibFile:path externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner]];
 }
 
-- (void)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable
+- (CPCib)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable
 {
-    [[[CPCib alloc] initWithContentsOfURL:aFileName] instantiateCibWithExternalNameTable:aNameTable];
+    return [[[CPCib alloc] initWithContentsOfURL:aFileName] instantiateCibWithExternalNameTable:aNameTable];
 }
 
-+ (void)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable loadDelegate:aDelegate
++ (CPCib)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable loadDelegate:aDelegate
 {
-    [[CPCib alloc]
+    return ([[CPCib alloc]
     initWithContentsOfURL:anAbsolutePath
              loadDelegate:[[_CPCibLoadDelegate alloc]
                 initWithLoadDelegate:aDelegate
-                   externalNameTable:aNameTable]];
+                   externalNameTable:aNameTable]]);
 }
 
-+ (void)loadCibNamed:(CPString)aName owner:(id)anOwner loadDelegate:(id)aDelegate
++ (CPCib)loadCibNamed:(CPString)aName owner:(id)anOwner loadDelegate:(id)aDelegate
 {
     if (![aName hasSuffix:@".cib"])
         aName = [aName stringByAppendingString:@".cib"];
@@ -77,17 +77,17 @@ var CPCibOwner = @"CPCibOwner";
     var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle],
         path = [bundle pathForResource:aName];
     
-    [self loadCibFile:path externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner] loadDelegate:aDelegate];
+    return [self loadCibFile:path externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner] loadDelegate:aDelegate];
 }
 
-- (void)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable loadDelegate:(id)aDelegate
+- (CPCib)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable loadDelegate:(id)aDelegate
 {
-    [[CPCib alloc]
+    return ([[CPCib alloc]
         initWithCibNamed:aFileName
                   bundle:self
             loadDelegate:[[_CPCibLoadDelegate alloc]
                 initWithLoadDelegate:aDelegate
-                   externalNameTable:aNameTable]];
+                   externalNameTable:aNameTable]]);
 }
 
 @end

From f98d3bd44bfcaa322e9f1501ebc6b87dbb3043ad Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sat, 1 May 2010 11:57:32 -0700
Subject: [PATCH 048/175] Add global 403 handler for CFHTTPRequest, to make it
 easier to catch authentication challenges.

---
 Objective-J/CFHTTPRequest.js | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js
index d4f9cba76..f44b334db 100644
--- a/Objective-J/CFHTTPRequest.js
+++ b/Objective-J/CFHTTPRequest.js
@@ -101,6 +101,9 @@ GLOBAL(CFHTTPRequest) = function()
     {
         determineAndDispatchHTTPRequestEvents(self);
     }
+
+    if (CFHTTPRequest.AuthenticationDelegate !== nil)
+        this._eventDispatcher.addEventListener("HTTP403", function(){CFHTTPRequest.AuthenticationDelegate(self)});
 }
 
 CFHTTPRequest.UninitializedState    = 0;
@@ -109,6 +112,9 @@ CFHTTPRequest.LoadedState           = 2;
 CFHTTPRequest.InteractiveState      = 3;
 CFHTTPRequest.CompleteState         = 4;
 
+//override to forward all CFHTTPRequest authorization failures to a single function
+CFHTTPRequest.AuthenticationDelegate = nil;
+
 CFHTTPRequest.prototype.status = function()
 {
     try

From 09727909b34f67a4c1c2cf36f728dbba4b600c62 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sat, 1 May 2010 14:47:43 -0700
Subject: [PATCH 049/175] Fix for menuless windows. Closes #640.

---
 AppKit/CPWindow/CPWindow.j | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j
index 209f6e769..f06953ab1 100644
--- a/AppKit/CPWindow/CPWindow.j
+++ b/AppKit/CPWindow/CPWindow.j
@@ -1933,7 +1933,8 @@ CPTexturedBackgroundWindowMask
             [keyWindow makeKeyWindow];
         else
         {
-            var menuWindow = [CPApp mainMenu]._menuWindow;
+            var mainMenu = [CPApp mainMenu],
+                menuWindow = mainMenu ? mainMenu._menuWindow : nil;
             for (var i = 0; i < windowCount; i++)
             {
                 var currentWindow = allWindows[i];
@@ -1961,7 +1962,8 @@ CPTexturedBackgroundWindowMask
             [mainWindow makeMainWindow];
         else
         {
-            var menuWindow = [CPApp mainMenu]._menuWindow;
+            var mainMenu = [CPApp mainMenu],
+                menuWindow = mainMenu ? mainMenu._menuWindow : nil;
             for (var i = 0; i < windowCount; i++)
             {
                 var currentWindow = allWindows[i];

From b1825334ddd9e25e0e54a0d22f7cbba5f4d31a15 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sat, 1 May 2010 20:40:38 -0700
Subject: [PATCH 050/175] If the vertical status changes, or the pane splitter
 status changes, we need to update the image value.

---
 AppKit/CPSplitView.j | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j
index d7c2bb72e..70f1a9282 100644
--- a/AppKit/CPSplitView.j
+++ b/AppKit/CPSplitView.j
@@ -217,10 +217,9 @@ var CPSplitViewHorizontalImage = nil,
         _DOMDividerElements[_drawingDivider].style.backgroundRepeat = "repeat";
 
         CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
-
-        [self _setupDOMDivider];
     }
 
+    [self _setupDOMDivider];
     CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect));
     CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect));
 #endif

From cb7879eecf5bcd9a0952b6707c24110b1236405c Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sun, 2 May 2010 12:58:36 -0700
Subject: [PATCH 051/175] Make CFHTTPRequests re-fireable.

---
 Objective-J/CFHTTPRequest.js | 44 +++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 11 deletions(-)

diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js
index f44b334db..de32c1897 100644
--- a/Objective-J/CFHTTPRequest.js
+++ b/Objective-J/CFHTTPRequest.js
@@ -92,16 +92,20 @@ if (!NativeRequest)
 
 GLOBAL(CFHTTPRequest) = function()
 {
+    this._requestHeaders = {};
+    this._mimeType = null;
+
     this._eventDispatcher = new EventDispatcher(this);
     this._nativeRequest = new NativeRequest();
 
     var self = this;
-
-    this._nativeRequest.onreadystatechange = function()
+    this._stateChangeHandler = function()
     {
         determineAndDispatchHTTPRequestEvents(self);
     }
 
+    this._nativeRequest.onreadystatechange = this._stateChangeHandler;
+
     if (CFHTTPRequest.AuthenticationDelegate !== nil)
         this._eventDispatcher.addEventListener("HTTP403", function(){CFHTTPRequest.AuthenticationDelegate(self)});
 }
@@ -183,7 +187,7 @@ CFHTTPRequest.prototype.responseText = function()
 
 CFHTTPRequest.prototype.setRequestHeader = function(/*String*/ aHeader, /*Object*/ aValue)
 {
-    return this._nativeRequest.setRequestHeader(aHeader, aValue);
+    this._requestHeaders[aHeader] = aValue;
 }
 
 CFHTTPRequest.prototype.getResponseHeader = function(/*String*/ aHeader)
@@ -198,17 +202,35 @@ CFHTTPRequest.prototype.getAllResponseHeaders = function()
 
 CFHTTPRequest.prototype.overrideMimeType = function(/*String*/ aMimeType)
 {
-    if ("overrideMimeType" in this._nativeRequest)
-        return this._nativeRequest.overrideMimeType(aMimeType);
+    this._mimeType = aMimeType;
 }
 
 CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*Boolean*/ isAsynchronous, /*String*/ aUser, /*String*/ aPassword)
 {
+    this._URL = aURL;
+    this._async = isAsynchronous;
+    this._method = aMethod;
+    this._user = aUser;
+    this._password = aPassword;
     return this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword);
 }
 
 CFHTTPRequest.prototype.send = function(/*Object*/ aBody)
 {
+    delete this._nativeRequest.onreadystatechange;
+
+    for (var i in this._requestHeaders)
+    {
+        if (this._requestHeaders.hasOwnProperty(i))
+            this._nativeRequest.setRequestHeader(i, this._requestHeaders[i]);
+    }
+
+    if (this._mimeType && "overrideMimeType" in this._nativeRequest)
+        this._nativeRequest.overrideMimeType(this._mimeType);
+
+    this._nativeRequest.open(this._method, this._URL, this._async, this._user, this._password);
+    this._nativeRequest.onreadystatechange = this._stateChangeHandler;
+
     try
     {
         return this._nativeRequest.send(aBody);
@@ -242,20 +264,20 @@ function determineAndDispatchHTTPRequestEvents(/*CFHTTPRequest*/ aRequest)
     eventDispatcher.dispatchEvent({ type:"readystatechange", request:aRequest});
 
     var nativeRequest = aRequest._nativeRequest,
-        readyState = ["uninitialized", "loading", "loaded", "interactive", "complete"][aRequest.readyState()];
+        readyStates = ["uninitialized", "loading", "loaded", "interactive", "complete"];
 
-    eventDispatcher.dispatchEvent({ type:readyState, request:aRequest});
-
-    if (readyState === "complete")
+    if (readyStates[aRequest.readyState()] === "complete")
     {
         var status = "HTTP" + aRequest.status();
-
         eventDispatcher.dispatchEvent({ type:status, request:aRequest });
 
         var result = aRequest.success() ? "success" : "failure";
-
         eventDispatcher.dispatchEvent({ type:result, request:aRequest });
+
+        eventDispatcher.dispatchEvent({ type:readyStates[aRequest.readyState()], request:aRequest});
     }
+    else
+        eventDispatcher.dispatchEvent({ type:readyStates[aRequest.readyState()], request:aRequest});
 }
 
 function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure)

From af566ec08aa9a061e7f687c47c0f4b42c6c87dec Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Mon, 3 May 2010 00:25:35 -0700
Subject: [PATCH 052/175] Fix LoadTimeTest, location.host includes the port.

---
 Tests/Manual/LoadTimeTest/AppController.j | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Tests/Manual/LoadTimeTest/AppController.j b/Tests/Manual/LoadTimeTest/AppController.j
index bd1f94618..1638643a2 100644
--- a/Tests/Manual/LoadTimeTest/AppController.j
+++ b/Tests/Manual/LoadTimeTest/AppController.j
@@ -28,7 +28,7 @@
     if (data.length < 10)
     {
         // reload with data in the query string
-        window.location.href = [window.location.protocol, "//", window.location.host, window.location.port, window.location.pathname, "?", encodeURIComponent(JSON.stringify(data))].join("");
+        window.location.href = [window.location.protocol, "//", window.location.host, window.location.pathname, "?", encodeURIComponent(JSON.stringify(data))].join("");
     }
     else
     {

From 50c519ec69c0ebf914acfd3197b4557aff8fcb10 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Mon, 3 May 2010 17:34:12 -0400
Subject: [PATCH 053/175] Fixed issue with CPWebView where document.body didn't
 exist when reloaded quickly.

---
 AppKit/CPWebView.j | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j
index 38ddfb5fa..cd4876675 100644
--- a/AppKit/CPWebView.j
+++ b/AppKit/CPWebView.j
@@ -187,7 +187,7 @@ CPWebViewScrollNative                           = 2;
             var win = null;
             try { win = [self DOMWindow]; } catch (e) {}
 
-            if (win && win.document)
+            if (win && win.document && win.document.body)
             {
                 var width = win.document.body.scrollWidth,
                     height = win.document.body.scrollHeight;

From 032fe7cc0cc0d5a1ef014a28f59cc76b025cb96b Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Tue, 4 May 2010 03:32:16 -0700
Subject: [PATCH 054/175] Fix for timers not working if they are created
 outside of a run loop.

Reviewed by me.
---
 Foundation/CPRunLoop.j | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j
index 0884e4915..a68eead71 100644
--- a/Foundation/CPRunLoop.j
+++ b/Foundation/CPRunLoop.j
@@ -157,6 +157,7 @@ var CPRunLoopLastNativeRunLoop = 0;
     CPDate  _effectiveDate;
 
     CPArray _orderedPerforms;
+    int     _runLoopInsuranceTimer;
 }
 
 /*
@@ -267,6 +268,12 @@ var CPRunLoopLastNativeRunLoop = 0;
         aTimer._lastNativeRunLoopsForModes = {};
         
     aTimer._lastNativeRunLoopsForModes[aMode] = CPRunLoopLastNativeRunLoop;
+
+    if (!_runLoopInsuranceTimer)
+        _runLoopInsuranceTimer = window.setNativeTimeout(function()
+        {
+            [self limitDateForMode:CPDefaultRunLoopMode];
+        }, 0);
 }
 
 /*!
@@ -277,9 +284,15 @@ var CPRunLoopLastNativeRunLoop = 0;
     //simple locking to try to prevent concurrent iterating over timers
     if (_runLoopLock)
         return;
-        
+
     _runLoopLock = YES;
-    
+
+    if (_runLoopInsuranceTimer)
+    {
+        window.clearNativeTimeout(_runLoopInsuranceTimer);
+        _runLoopInsuranceTimer = nil;
+    }
+
     var now = _effectiveDate ? [_effectiveDate laterDate:[CPDate date]] : [CPDate date],
         nextFireDate = nil,
         nextTimerFireDate = _nextTimerFireDatesForModes[aMode];

From 2c23c0ffa7043194dc7ba0358dd429d193320d0b Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Tue, 4 May 2010 10:09:16 -0700
Subject: [PATCH 055/175] Disable new timer stuff for CommonJS.

Reviewed by me.
---
 Foundation/CPRunLoop.j | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j
index a68eead71..ef1f10433 100644
--- a/Foundation/CPRunLoop.j
+++ b/Foundation/CPRunLoop.j
@@ -269,11 +269,13 @@ var CPRunLoopLastNativeRunLoop = 0;
         
     aTimer._lastNativeRunLoopsForModes[aMode] = CPRunLoopLastNativeRunLoop;
 
+#if PLATFORM(DOM)
     if (!_runLoopInsuranceTimer)
         _runLoopInsuranceTimer = window.setNativeTimeout(function()
         {
             [self limitDateForMode:CPDefaultRunLoopMode];
         }, 0);
+#endif
 }
 
 /*!
@@ -287,11 +289,13 @@ var CPRunLoopLastNativeRunLoop = 0;
 
     _runLoopLock = YES;
 
+#if PLATFORM(DOM)
     if (_runLoopInsuranceTimer)
     {
         window.clearNativeTimeout(_runLoopInsuranceTimer);
         _runLoopInsuranceTimer = nil;
     }
+#endif
 
     var now = _effectiveDate ? [_effectiveDate laterDate:[CPDate date]] : [CPDate date],
         nextFireDate = nil,

From fc2560eb32c19436e33d8ef7b8f71a0f5b9cfe66 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Tue, 4 May 2010 10:28:51 -0700
Subject: [PATCH 056/175] Fix for native drag and drop breaking across
 different window starts.

Reviewed by me.
---
 AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
index 30f560581..c0f6503e9 100644
--- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
+++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
@@ -516,6 +516,11 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
         DOMDragElement.style.left = -_CGRectGetWidth(draggedWindowFrame) + "px";
         DOMDragElement.style.top = -_CGRectGetHeight(draggedWindowFrame) + "px";
 
+        var parentNode = DOMDragElement.parentNode;
+
+        if (parentNode)
+            parentNode.removeChild(DOMDragElement);
+
         _DOMBodyElement.appendChild(DOMDragElement);
 
         var draggingOffset = [dragServer draggingOffset];

From 5b4603b6a7247196050774b06e80035a1c81bcd6 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 4 May 2010 13:53:56 -0700
Subject: [PATCH 057/175] add missing ivar declaration to CPPlatformWindow

---
 AppKit/Platform/CPPlatformWindow.j         | 1 +
 AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j
index 4ebfa8f81..1a31d068f 100644
--- a/AppKit/Platform/CPPlatformWindow.j
+++ b/AppKit/Platform/CPPlatformWindow.j
@@ -41,6 +41,7 @@ var PrimaryPlatformWindow   = NULL;
 
     DOMElement      _DOMBodyElement;
     DOMElement      _DOMFocusElement;
+    DOMElement      _DOMEventGuard;
 
     CPArray         _windowLevels;
     CPDictionary    _windowLayers;
diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
index c0f6503e9..efb025890 100644
--- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
+++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
@@ -280,7 +280,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
     _DOMBodyElement = theDocument.getElementById("cappuccino-body") || theDocument.body;
 
     // FIXME: Always do this?
-    if ([CPPlatform supportsDragAndDrop])
+    if (supportsNativeDragAndDrop)
         _DOMBodyElement.style["-khtml-user-select"] = "none";
 
     _DOMBodyElement.webkitTouchCallout = "none";

From 179ef85f4edff4f7b7267843b7f06f7433878d50 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Tue, 4 May 2010 14:49:31 -0700
Subject: [PATCH 058/175] Final timer fix.

Reviewed by me.
---
 Foundation/CPRunLoop.j | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j
index ef1f10433..c5fde7b54 100644
--- a/Foundation/CPRunLoop.j
+++ b/Foundation/CPRunLoop.j
@@ -269,13 +269,16 @@ var CPRunLoopLastNativeRunLoop = 0;
         
     aTimer._lastNativeRunLoopsForModes[aMode] = CPRunLoopLastNativeRunLoop;
 
-#if PLATFORM(DOM)
-    if (!_runLoopInsuranceTimer)
-        _runLoopInsuranceTimer = window.setNativeTimeout(function()
-        {
-            [self limitDateForMode:CPDefaultRunLoopMode];
-        }, 0);
-#endif
+
+    // FIXME: Hack for not doing this in CommonJS
+    if (CFBundle.environments().indexOf("Browser") !== -1)
+    {
+        if (!_runLoopInsuranceTimer)
+            _runLoopInsuranceTimer = window.setNativeTimeout(function()
+            {
+                [self limitDateForMode:CPDefaultRunLoopMode];
+            }, 0);
+    }
 }
 
 /*!
@@ -289,13 +292,15 @@ var CPRunLoopLastNativeRunLoop = 0;
 
     _runLoopLock = YES;
 
-#if PLATFORM(DOM)
-    if (_runLoopInsuranceTimer)
+    // FIXME: Hack for not doing this in CommonJS
+    if (CFBundle.environments().indexOf("Browser") !== -1)
     {
-        window.clearNativeTimeout(_runLoopInsuranceTimer);
-        _runLoopInsuranceTimer = nil;
+        if (_runLoopInsuranceTimer)
+        {
+            window.clearNativeTimeout(_runLoopInsuranceTimer);
+            _runLoopInsuranceTimer = nil;
+        }
     }
-#endif
 
     var now = _effectiveDate ? [_effectiveDate laterDate:[CPDate date]] : [CPDate date],
         nextFireDate = nil,

From e83e5b7c293637ddb7bd5e5f768236d9edf5a4b2 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 4 May 2010 15:04:51 -0700
Subject: [PATCH 059/175] Only send open if we aren't already open

---
 Objective-J/CFHTTPRequest.js | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js
index de32c1897..d4007f585 100644
--- a/Objective-J/CFHTTPRequest.js
+++ b/Objective-J/CFHTTPRequest.js
@@ -92,6 +92,7 @@ if (!NativeRequest)
 
 GLOBAL(CFHTTPRequest) = function()
 {
+    this._isOpen = false;
     this._requestHeaders = {};
     this._mimeType = null;
 
@@ -207,6 +208,7 @@ CFHTTPRequest.prototype.overrideMimeType = function(/*String*/ aMimeType)
 
 CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*Boolean*/ isAsynchronous, /*String*/ aUser, /*String*/ aPassword)
 {
+    this._isOpen = true;
     this._URL = aURL;
     this._async = isAsynchronous;
     this._method = aMethod;
@@ -217,19 +219,23 @@ CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*B
 
 CFHTTPRequest.prototype.send = function(/*Object*/ aBody)
 {
-    delete this._nativeRequest.onreadystatechange;
-
     for (var i in this._requestHeaders)
     {
         if (this._requestHeaders.hasOwnProperty(i))
             this._nativeRequest.setRequestHeader(i, this._requestHeaders[i]);
     }
 
+    if (!this._isOpen)
+    {
+        delete this._nativeRequest.onreadystatechange;
+        this._nativeRequest.open(this._method, this._URL, this._async, this._user, this._password);
+        this._nativeRequest.onreadystatechange = this._stateChangeHandler;
+    }
+
     if (this._mimeType && "overrideMimeType" in this._nativeRequest)
         this._nativeRequest.overrideMimeType(this._mimeType);
 
-    this._nativeRequest.open(this._method, this._URL, this._async, this._user, this._password);
-    this._nativeRequest.onreadystatechange = this._stateChangeHandler;
+    this._isOpen = false;
 
     try
     {
@@ -244,6 +250,7 @@ CFHTTPRequest.prototype.send = function(/*Object*/ aBody)
 
 CFHTTPRequest.prototype.abort = function()
 {
+    this._isOpen = false;
     return this._nativeRequest.abort();
 }
 

From e97af776a0fcec10593e9ae1b741aa02d6c1ba94 Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Tue, 4 May 2010 15:40:35 -0700
Subject: [PATCH 060/175] Fix press/flatten due to changes to CFHTTPRequest.

---
 CommonJS/lib/cappuccino/objj-flatten-additions.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/CommonJS/lib/cappuccino/objj-flatten-additions.js b/CommonJS/lib/cappuccino/objj-flatten-additions.js
index 2b4781e62..4c69f133e 100644
--- a/CommonJS/lib/cappuccino/objj-flatten-additions.js
+++ b/CommonJS/lib/cappuccino/objj-flatten-additions.js
@@ -1,6 +1,7 @@
 
 var URLCache = { };
 
+var CFHTTPRequest_open = CFHTTPRequest.prototype.open;
 CFHTTPRequest.prototype.open = function(/*String*/ method, /*String*/ url, /*Boolean*/ async, /*String*/ user, /*String*/ password)
 {
     var cachedRequest = CFHTTPRequest._lookupCachedRequest(url);
@@ -13,7 +14,7 @@ CFHTTPRequest.prototype.open = function(/*String*/ method, /*String*/ url, /*Boo
             ObjectiveJ.determineAndDispatchHTTPRequestEvents(self);
         };
     }
-    return this._nativeRequest.open(method, url, async, user, password);
+    return CFHTTPRequest_open.apply(this, arguments);
 }
 
 CFHTTPRequest._cacheRequest = function(/*CFURL|String*/ aURL, /*Number*/ status, /*Object*/ headers, /*String*/ body)

From 4b775796be844e7f9c7dbdf75e26bba872b7b668 Mon Sep 17 00:00:00 2001
From: Tom Robinson 
Date: Tue, 4 May 2010 15:41:50 -0700
Subject: [PATCH 061/175] Add a test for capp gen, press, and flatten.

---
 Tests/Tools/ToolsTest.j | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)
 create mode 100644 Tests/Tools/ToolsTest.j

diff --git a/Tests/Tools/ToolsTest.j b/Tests/Tools/ToolsTest.j
new file mode 100644
index 000000000..6705affee
--- /dev/null
+++ b/Tests/Tools/ToolsTest.j
@@ -0,0 +1,39 @@
+var OS = require("os");
+var FILE = require("file");
+
+function cleanup() {
+    ["ToolsTestApp", "PressTestApp", "FlattenTestApp"].forEach(function(dir) {
+        if (FILE.isDirectory(dir))
+            FILE.rmtree(dir);
+    });
+}
+
+@implementation ToolsTest : OJTestCase
+{
+}
+
+- (void)setUp
+{
+    cleanup();
+}
+
+- (void)testTools
+{
+    var status;
+
+    status = OS.system(["capp", "gen", "ToolsTestApp"]);
+    [self assert:status equals:0 message:"capp gen failed"];
+
+    status = OS.system(["press", "-f", "ToolsTestApp", "PressTestApp"]);
+    [self assert:status equals:0 message:"press failed"];
+
+    status = OS.system(["flatten", "-f", "ToolsTestApp", "FlattenTestApp"]);
+    [self assert:status equals:0 message:"flatten failed"];
+}
+
+- (void)tearDown
+{
+    cleanup();
+}
+
+@end

From b5971eae95e45962958bf7263e02a454e5cf74ae Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 4 May 2010 19:08:23 -0700
Subject: [PATCH 062/175] Missed this, it's no longer needed.

---
 AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 2 --
 1 file changed, 2 deletions(-)

diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
index efb025890..7d4f519c7 100644
--- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
+++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
@@ -130,8 +130,6 @@ var CPDOMEventGetClickCount,
     StopDOMEventPropagation,
     StopContextMenuDOMEventPropagation;
 
-var _DOMEventGuard;
-
 //right now we hard code q, w, r and t as keys to propogate
 //these aren't normal keycodes, they are with modifier key codes
 //might be mac only, we should investigate futher later.

From 5044ce4236d12c0a022769f247857aa689b2fea8 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 4 May 2010 22:55:06 -0700
Subject: [PATCH 063/175] Add a doctype when creating new platform windows.

---
 AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
index 7d4f519c7..96c542885 100644
--- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
+++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
@@ -467,7 +467,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
     [PlatformWindows addObject:self];
 
     // FIXME: cpSetFrame?
-    _DOMWindow.document.write("");
+    _DOMWindow.document.write("");
     _DOMWindow.document.close();
 
     if (![CPPlatform isBrowser])
@@ -1192,6 +1192,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
 
         [_windowLevels insertObject:aLevel atIndex:insertionIndex];
         layer._DOMElement.style.zIndex = aLevel;
+
         _DOMBodyElement.appendChild(layer._DOMElement);
     }
     

From 71104e49023e8287539f1f3a57581389d2efc25a Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Thu, 29 Apr 2010 14:44:11 +0200
Subject: [PATCH 064/175] fixed CPTableView moveColumn:

---
 AppKit/CPTableView.j | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 3768e2e60..2937445a6 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -691,15 +691,19 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     else
         _dirtyTableColumnRangeIndex = MIN(fromIndex, toIndex, _dirtyTableColumnRangeIndex);
 
-    if (toIndex > fromIndex)
-        --toIndex;
-
     var tableColumn = _tableColumns[fromIndex];
 
     [_tableColumns removeObjectAtIndex:fromIndex];
     [_tableColumns insertObject:tableColumn atIndex:toIndex];
+    
+    [[self headerView] setNeedsLayout];
+    [[self headerView] setNeedsDisplay:YES];
 
-    [self setNeedsLayout];
+    var rowIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [self numberOfRows])],
+        columnIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(fromIndex, toIndex)];
+        
+    [self reloadDataForRowIndexes:rowIndexes columnIndexes:columnIndexes];
+    // [self setNeedsLayout];
 }
 
 /*!
@@ -717,7 +721,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     [[self headerView] setNeedsLayout];
     [[self headerView] setNeedsDisplay:YES];
     
-    [self reloadData];
+    var rowIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [self numberOfRows])];
+    [self reloadDataForRowIndexes:rowIndexes columnIndexes:[CPIndexSet indexSetWithIndex:columnIndex]];
 }
 
 - (CPArray)tableColumns

From ef68408fff2e5acb22133c01ee2ac5dd31c3bedc Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Fri, 30 Apr 2010 00:14:59 +0200
Subject: [PATCH 065/175] refactored CPTableHeaderView mouse interaction

---
 AppKit/CPTableHeaderView.j | 458 +++++++++++++++++++++++++++++--------
 1 file changed, 365 insertions(+), 93 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 534b24da1..2d752f151 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -147,13 +147,24 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 @implementation CPTableHeaderView : CPView
 {
-    int _resizedColumn @accessors(readonly, property=resizedColumn);
-    int _draggedColumn @accessors(readonly, property=draggedColumn);
-    int _pressedColumn @accessors(readonly, property=pressedColumn);
+    CPPoint                 _previousTrackingLocation;
+    int                     _activeColumn;
+    int                     _pressedColumn;
     
-    float _draggedDistance @accessors(readonly, property=draggedDistance);
-    float _lastLocation;
-    float _columnOldWidth;
+    BOOL                    _isResizing;
+    BOOL                    _isTrackingColumn;
+    
+    // CPPoint             _previousTrackingLocation;
+    // 
+    // int                 _resizedColumn @accessors(readonly, property=resizedColumn);
+    // int                 _draggedColumn @accessors(readonly, property=draggedColumn);
+    // int                 _pressedColumn @accessors(readonly, property=pressedColumn);
+    // int                 _clickedColumn @accessors(readonly, property=clickedColumn);
+    // BOOL                _isTrackingColumn;
+    // 
+    // float               _draggedDistance @accessors(readonly, property=draggedDistance);
+    // float               _lastLocation;
+    // float               _columnOldWidth;
     
     CPTableView _tableView @accessors(property=tableView);
 }
@@ -162,7 +173,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     _resizedColumn = -1;
     _draggedColumn = -1;
-    _pressedColumn = -1;
+    _pressedColumn = CPNotFound;
     _draggedDistance = 0.0;
     _lastLocation = nil;
     _columnOldWidth = nil;
@@ -182,7 +193,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (int)columnAtPoint:(CGPoint)aPoint
 {
-    return [_tableView columnAtPoint:CGPointMake(aPoint.x, 0)];
+    return [_tableView columnAtPoint:CGPointMake(aPoint.x, aPoint.y)];
 }
 
 - (CGRect)headerRectOfColumn:(int)aColumnIndex
@@ -228,104 +239,365 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)mouseDown:(CPEvent)theEvent
 {
-    var mouseLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil],
-        clickedColumn = [self columnAtPoint:mouseLocation];    
-    
-    // should we send column -1 ?
-    [_tableView _sendDelegateDidMouseDownInHeader:clickedColumn];
-    
-    var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
-        resizedColumn = [self columnAtPoint:resizeLocation];
-    
-    if (resizedColumn == -1)
-        return;
-
-    // 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
-    if ([_tableView allowsColumnResizing]
-        && CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
-    {
-        _resizedColumn = resizedColumn;
-        [_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
-        [_tableView setDisableAutomaticResizing:YES];
-        [self trackResizeWithEvent:theEvent];
-    }
-    else
-    {
-        [self _setPressedColumn:clickedColumn];
-        [self trackMouseWithEvent:theEvent];
-    }    
+    [self trackMouse:theEvent];
 }
 
-- (void)trackMouseWithEvent:(CPEvent)theEvent
+- (void)trackMouse:(CPEvent)theEvent
 {
-    var type = [theEvent type];
+    var type = [theEvent type],
+        currentLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil];
     
-    if (type == CPLeftMouseUp)
-    {
-        var location = [self convertPoint:[theEvent locationInWindow] fromView:nil],
-            clickedColumn = [self columnAtPoint:location];
+    // Take the right columns resize tracking area into account
+    currentLocation.x -= 5.0;
 
-        [self _setPressedColumn:-1];
+    var columnIndex = [self columnAtPoint:currentLocation],
+        shouldResize = [self shouldResizeTableColumn:columnIndex at:CPPointMake(currentLocation.x + 5.0, currentLocation.y)];
         
-        if (clickedColumn != -1)
-            [_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
-        
-        return;
-    }
-
-    [CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
-}
-
-- (void)trackResizeWithEvent:(CPEvent)anEvent
-{
-    var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
-        tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
-        type = [anEvent type];
-
-    if (_lastLocation == nil)
-        _lastLocation = location;
-
-    if (_columnOldWidth == nil)
-        _columnOldWidth = [tableColumn width];
-
     if (type === CPLeftMouseUp)
-    {   
-        [self _updateResizeCursor:anEvent];
-                
-        [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
-        [tableColumn setDisableResizingPosting:NO];        
-        [_tableView setDisableAutomaticResizing:NO];
-
-        _resizedColumn = -1;
-        _lastLocation = nil;
-        _columnOldWidth = nil;
-
-        return;
-    }            
-    else if (type === CPLeftMouseDragged)
     {
-        var newWidth = [tableColumn width] + location.x - _lastLocation.x;
-        
-        if (newWidth < [tableColumn minWidth])
-            [[CPCursor resizeRightCursor] set];
-        else if (newWidth > [tableColumn maxWidth])
-            [[CPCursor resizeLeftCursor] set];
+        if (shouldResize)
+            [self stopResizingTableColumn:_activeColumn at:currentLocation];
+        else if ([self _shouldStopTrackingTableColumn:columnIndex at:currentLocation])
+        {
+            [[self tableView] _didClickTableColumn:columnIndex modifierFlags:[theEvent modifierFlags]];
+            [self stopTrackingTableColumn:columnIndex at:currentLocation];
+            
+            _isTrackingColumn = NO;
+        }
+
+        _activeColumn = CPNotFound;
+        return;
+    }
+
+    if (type === CPLeftMouseDown)
+    {
+        _activeColumn = columnIndex;
+
+        [[self tableView] _sendDelegateDidMouseDownInHeader:columnIndex];
+
+        if (shouldResize)
+            [self startResizingTableColumn:columnIndex at:currentLocation];
         else
         {
-            _tableView._lastColumnShouldSnap = NO;
-            [tableColumn setWidth:newWidth];
-            // FIXME: there has to be a better way to do this...
-            // We should refactor the auto resizing crap.
-            // We need to figure out the exact cocoa behavior here though. 
-            _lastLocation = location;
-
-            [[CPCursor resizeLeftRightCursor] set];
-            [self setNeedsLayout];
-            [self setNeedsDisplay:YES];
+            [self startTrackingTableColumn:columnIndex at:currentLocation];
+            _isTrackingColumn = YES;
         }
     }
+    else if (type === CPLeftMouseDragged)
+    {        
+        if (shouldResize)
+            [self continueResizingTableColumn:_activeColumn at:currentLocation];
+        else
+        {
+            if (_activeColumn === columnIndex && CPRectContainsPoint([self headerRectOfColumn:columnIndex], currentLocation))
+            {
+                if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+                    [self continueTrackingTableColumn:columnIndex at:currentLocation];
+                else
+                    [self startTrackingTableColumn:columnIndex at:currentLocation];
+            } else if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+                [self stopTrackingTableColumn:_activeColumn at:currentLocation];
+        }
+    }
+    
+    _previousTrackingLocation = currentLocation;
+    [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
+}
 
-    [CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
+/*!
+    @ignore
+    Determines if the header view should finish the column tracking
+    Returns YES if the receiver is in a tracking session, the active column is equal to the hovered column
+    and the header rect of the column contains the current mouse location
+*/
+- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return _isTrackingColumn && _activeColumn === aColumnIndex && 
+        CPRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint);
+}
+
+- (void)startTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"startTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    [self _setPressedColumn:aColumnIndex];
+}
+
+- (void)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{    
+    CPLog.debug(@"continueTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+}
+
+- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"stopTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    [self _setPressedColumn:CPNotFound];
+}
+
+/*!
+    @ignore
+    Determines if the table column should be resized
+    Returns YES if the receiver is already resizing a column or when the tableview allows 
+    resizing and the point is in the resize rect of the column
+*/
+- (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    if (_isResizing)
+        return YES;
+        
+    if (_isTrackingColumn)
+        return NO;
+
+    return [[self tableView] allowsColumnResizing] && CPRectContainsPoint([self _cursorRectForColumn:aColumnIndex], aPoint);
+}
+
+- (void)startResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    _isResizing = YES;
+    
+    CPLog.debug(@"startResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    
+    [tableColumn setDisableResizingPosting:YES];
+    [[self tableView] setDisableAutomaticResizing:YES];
+    
+    _resizedColumn = aColumnIndex;
+}
+
+- (void)continueResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"continueResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    
+    var newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
+    
+    if (newWidth < [tableColumn minWidth])
+        [[CPCursor resizeRightCursor] set];
+    else if (newWidth > [tableColumn maxWidth])
+        [[CPCursor resizeLeftCursor] set];
+    else
+    {
+        [self tableView]._lastColumnShouldSnap = NO;
+        [tableColumn setWidth:newWidth];
+        
+        [[CPCursor resizeLeftRightCursor] set];
+        [self setNeedsLayout];
+        [self setNeedsDisplay:YES];
+    }
+}
+
+- (void)stopResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"stopResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    // [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
+    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
+    [tableColumn setDisableResizingPosting:NO];
+    [[self tableView] setDisableAutomaticResizing:NO];
+    
+    _isResizing = NO;
+}
+
+// - (void)resizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
+// {
+//     var tableColumn = [[[self tableColumn] tableColumns] objectAtIndex:aColumnIndex];
+//     
+//     if (isMouseUp)
+//     {
+//         [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
+//         
+//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
+//         [tableColumn setDisableResizingPosting:NO];
+//         [[self tableView] setDisableAutomaticResizing:NO];
+//     }
+//     else
+//     {
+//         var newWidth = [tableColumn width] + location - _lastLocation.x;
+//         
+//         if (newWidth < [tableColumn minWidth])
+//             [[CPCursor resizeRightCursor] set];
+//         else if (newWidth > [tableColumn maxWidth])
+//             [[CPCursor resizeLeftCursor] set];
+//         else
+//         {
+//             [self tableView]._lastColumnShouldSnap = NO;
+//             [tableColumn setWidth:newWidth];
+//             
+//             [[CPCursor resizeLeftRightCursor] set];
+//             [self setNeedsLayout];
+//             [self setNeedsDisplay:YES];
+//         }
+//     }
+// }
+
+
+// - (BOOL)startTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
+// {
+//     [self _setPressedColumn:aColumnIndex];
+//     
+//     return YES;
+    
+    // var resizeLocation = CPPointMake(aPoint.x - 5.0, aPoint.y);
+    // 
+    // if ([self shouldResizeTableColumn:aColumnIndex at:aPoint])
+    // {
+    //     _resizedColumn = aColumnIndex;
+    //     [[[[self tableView] tableColumns] objectAtIndex:_resizedColumn] setDisableResizingPosting:YES];
+    //     [[self tableView] setDisableAutomaticResizing:YES];
+    //     
+    //     // // Use point :)
+    //     // [self trackResizeWithEvent:[CPApp currentEvent]];
+    //     // return NO;
+    // }
+    // 
+    // 
+    // return YES;
+    
+    // _clickedColumn = [self columnAtPoint:mouseLocation];    
+    //     
+    //     // should we send column -1 ?
+    //     [_tableView _sendDelegateDidMouseDownInHeader:_clickedColumn];
+    //     
+    //     var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
+    //         resizedColumn = [self columnAtPoint:resizeLocation];
+    //     
+    //     if (resizedColumn == -1)
+    //         return;
+    // 
+    //     // 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
+    //     if ([_tableView allowsColumnResizing]
+    //         && CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
+    //     {
+    //         _resizedColumn = resizedColumn;
+    //         [_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
+    //         [_tableView setDisableAutomaticResizing:YES];
+    //         [self trackResizeWithEvent:theEvent];
+    //     }
+    //     else
+    //     {
+    //         [self _setPressedColumn:_clickedColumn];
+    //         [self trackMouseWithEvent:theEvent];
+    //     }
+}
+// 
+// - (BOOL)continueTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
+// {
+// }
+// 
+// - (void)stopTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint;
+// {
+//     [self _setPressedColumn:-1];
+// }
+
+
+
+// - (void)trackMouseWithEvent:(CPEvent)theEvent
+// {
+//     var type = [theEvent type],
+//         location = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+//     
+//     if (type === CPLeftMouseUp)
+//     {
+//         var clickedColumn = [self columnAtPoint:location],
+//             pressedColumn = _pressedColumn;
+//         
+//         [self _setPressedColumn:-1];
+//         
+//         if (pressedColumn === clickedColumn)        
+//             if (clickedColumn !== -1)
+//                 [_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
+//         
+//         return;
+//     }
+//     else if (type === CPLeftMouseDragged)
+//     {
+//         var hoveredColumn = [self columnAtPoint:location];
+//         
+//         CPLog.debug(@"hovered: %i pressed: %i", hoveredColumn, _pressedColumn);
+//         if (hoveredColumn === _clickedColumn)
+//             [self _setPressedColumn:_clickedColumn];
+//         else
+//             [self _setPressedColumn:-1]
+//     }
+//     //     CPLog.debug(@"...");
+//     //     
+//     //     var point = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+//     //     
+//     //     var view = [[CPView alloc] initWithFrame:CPRectMake(0.0, 0.0, CPRectGetWidth([self bounds], CPRectGetHeight([[self tableView] bounds])))];
+//     //     [view setBackgroundColor:[CPColor greenColor]];
+//     //     var viewLocation = CPPointMake(point.x - CGRectGetWidth(bounds)/2, point.y - CGRectGetHeight(bounds)/2);
+//     //     
+//     //     [self dragView:view at:viewLocation offset:CPPointMakeZero() event:theEvent pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
+//     //     return;
+//     // }
+// 
+//     [CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
+// }
+
+// - (void)trackResizeWithEvent:(CPEvent)anEvent
+// {
+//     var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
+//         tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
+//         type = [anEvent type];
+// 
+//     if (_lastLocation == nil)
+//         _lastLocation = location;
+// 
+//     if (_columnOldWidth == nil)
+//         _columnOldWidth = [tableColumn width];
+// 
+//     if (type === CPLeftMouseUp)
+//     {   
+//         [self _updateResizeCursor:anEvent];
+//                 
+//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
+//         [tableColumn setDisableResizingPosting:NO];        
+//         [_tableView setDisableAutomaticResizing:NO];
+// 
+//         _resizedColumn = -1;
+//         _lastLocation = nil;
+//         _columnOldWidth = nil;
+// 
+//         return;
+//     }            
+//     else if (type === CPLeftMouseDragged)
+//     {
+//         var newWidth = [tableColumn width] + location.x - _lastLocation.x;
+//         
+//         if (newWidth < [tableColumn minWidth])
+//             [[CPCursor resizeRightCursor] set];
+//         else if (newWidth > [tableColumn maxWidth])
+//             [[CPCursor resizeLeftCursor] set];
+//         else
+//         {
+//             _tableView._lastColumnShouldSnap = NO;
+//             [tableColumn setWidth:newWidth];
+//             // FIXME: there has to be a better way to do this...
+//             // We should refactor the auto resizing crap.
+//             // We need to figure out the exact cocoa behavior here though. 
+//             _lastLocation = location;
+// 
+//             [[CPCursor resizeLeftRightCursor] set];
+//             [self setNeedsLayout];
+//             [self setNeedsDisplay:YES];
+//         }
+//     }
+// 
+//     [CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
+// }
+
+- (void)_updateResizeCursorForTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
+{
+    if (![[self tableView] allowsColumnResizing] || (isMouseUp && ![[self window] acceptsMouseMovedEvents]))
+    {
+        [[CPCursor arrowCursor] set];
+        return;
+    }
+    
+    
 }
 
 - (void)_updateResizeCursor:(CPEvent)theEvent

From 85283cff38168c7470ca7b225e645e579e7b871d Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Mon, 3 May 2010 11:10:45 +0200
Subject: [PATCH 066/175] - refactored mouse interaction - implemented basic
 column reordering

---
 AppKit/CPTableHeaderView.j | 255 +++++++++----------------------------
 1 file changed, 63 insertions(+), 192 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 2d752f151..d978f73e9 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -147,6 +147,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 @implementation CPTableHeaderView : CPView
 {
+    CPPoint                 _mouseDownLocation;
     CPPoint                 _previousTrackingLocation;
     int                     _activeColumn;
     int                     _pressedColumn;
@@ -271,6 +272,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
     if (type === CPLeftMouseDown)
     {
+        _mouseDownLocation = currentLocation;
         _activeColumn = columnIndex;
 
         [[self tableView] _sendDelegateDidMouseDownInHeader:columnIndex];
@@ -284,7 +286,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         }
     }
     else if (type === CPLeftMouseDragged)
-    {        
+    {
         if (shouldResize)
             [self continueResizingTableColumn:_activeColumn at:currentLocation];
         else
@@ -292,9 +294,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
             if (_activeColumn === columnIndex && CPRectContainsPoint([self headerRectOfColumn:columnIndex], currentLocation))
             {
                 if (_isTrackingColumn && _pressedColumn !== CPNotFound)
-                    [self continueTrackingTableColumn:columnIndex at:currentLocation];
-                else
+                {
+                    if (![self continueTrackingTableColumn:columnIndex at:currentLocation])
+                        return; // Stop tracking the column, because it's being dragged
+                } else
                     [self startTrackingTableColumn:columnIndex at:currentLocation];
+                    
             } else if (_isTrackingColumn && _pressedColumn !== CPNotFound)
                 [self stopTrackingTableColumn:_activeColumn at:currentLocation];
         }
@@ -322,9 +327,63 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [self _setPressedColumn:aColumnIndex];
 }
 
-- (void)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
+}
+
+- (BOOL)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {    
     CPLog.debug(@"continueTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    if ([self _shouldDragTableColumn:aColumnIndex at:aPoint])
+    {
+        CPLog.debug(@"start drag");
+        
+        var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
+            columnRect = [self headerRectOfColumn:aColumnIndex],
+            // offset = CPSizeMake(_mouseDownLocation.x - aPoint.x, _mouseDownLocation.y);
+        
+        var frame = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([[self tableView] bounds])),
+            view = [[CPView alloc] initWithFrame:frame];
+            
+        [view setBackgroundColor:[CPColor greenColor]];
+        
+        [self dragView:view at:aPoint offset:CPSizeMake(0.0, 0.0) event:[CPApp currentEvent] 
+            pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
+            
+        return NO;
+    }
+    
+    return YES;
+}
+
+- (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
+{
+    var hoveredColumn = [self columnAtPoint:aPoint],
+    if (_activeColumn === hoveredColumn)
+        return;
+        
+    var columnRect = [self headerRectOfColumn:hoveredColumn],
+        columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
+    
+    if (_activeColumn < hoveredColumn && aPoint.x > columnCenterPoint.x)
+    {
+        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
+        _activeColumn = hoveredColumn;
+    }
+    else if (_activeColumn > hoveredColumn && aPoint.x < columnCenterPoint.x)
+    {
+        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
+        _activeColumn = hoveredColumn;
+    }
+}
+
+- (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
+{
+    CPLog.debug(@"draggedView view ended at: %@", CPStringFromPoint(aLocation));
+    
+    [self stopTrackingTableColumn:[self columnAtPoint:aLocation] at:aLocation];
 }
 
 - (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
@@ -401,194 +460,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     _isResizing = NO;
 }
 
-// - (void)resizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
-// {
-//     var tableColumn = [[[self tableColumn] tableColumns] objectAtIndex:aColumnIndex];
-//     
-//     if (isMouseUp)
-//     {
-//         [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
-//         
-//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
-//         [tableColumn setDisableResizingPosting:NO];
-//         [[self tableView] setDisableAutomaticResizing:NO];
-//     }
-//     else
-//     {
-//         var newWidth = [tableColumn width] + location - _lastLocation.x;
-//         
-//         if (newWidth < [tableColumn minWidth])
-//             [[CPCursor resizeRightCursor] set];
-//         else if (newWidth > [tableColumn maxWidth])
-//             [[CPCursor resizeLeftCursor] set];
-//         else
-//         {
-//             [self tableView]._lastColumnShouldSnap = NO;
-//             [tableColumn setWidth:newWidth];
-//             
-//             [[CPCursor resizeLeftRightCursor] set];
-//             [self setNeedsLayout];
-//             [self setNeedsDisplay:YES];
-//         }
-//     }
-// }
-
-
-// - (BOOL)startTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
-// {
-//     [self _setPressedColumn:aColumnIndex];
-//     
-//     return YES;
-    
-    // var resizeLocation = CPPointMake(aPoint.x - 5.0, aPoint.y);
-    // 
-    // if ([self shouldResizeTableColumn:aColumnIndex at:aPoint])
-    // {
-    //     _resizedColumn = aColumnIndex;
-    //     [[[[self tableView] tableColumns] objectAtIndex:_resizedColumn] setDisableResizingPosting:YES];
-    //     [[self tableView] setDisableAutomaticResizing:YES];
-    //     
-    //     // // Use point :)
-    //     // [self trackResizeWithEvent:[CPApp currentEvent]];
-    //     // return NO;
-    // }
-    // 
-    // 
-    // return YES;
-    
-    // _clickedColumn = [self columnAtPoint:mouseLocation];    
-    //     
-    //     // should we send column -1 ?
-    //     [_tableView _sendDelegateDidMouseDownInHeader:_clickedColumn];
-    //     
-    //     var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
-    //         resizedColumn = [self columnAtPoint:resizeLocation];
-    //     
-    //     if (resizedColumn == -1)
-    //         return;
-    // 
-    //     // 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
-    //     if ([_tableView allowsColumnResizing]
-    //         && CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
-    //     {
-    //         _resizedColumn = resizedColumn;
-    //         [_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
-    //         [_tableView setDisableAutomaticResizing:YES];
-    //         [self trackResizeWithEvent:theEvent];
-    //     }
-    //     else
-    //     {
-    //         [self _setPressedColumn:_clickedColumn];
-    //         [self trackMouseWithEvent:theEvent];
-    //     }
-}
-// 
-// - (BOOL)continueTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
-// {
-// }
-// 
-// - (void)stopTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint;
-// {
-//     [self _setPressedColumn:-1];
-// }
-
-
-
-// - (void)trackMouseWithEvent:(CPEvent)theEvent
-// {
-//     var type = [theEvent type],
-//         location = [self convertPoint:[theEvent locationInWindow] fromView:nil];
-//     
-//     if (type === CPLeftMouseUp)
-//     {
-//         var clickedColumn = [self columnAtPoint:location],
-//             pressedColumn = _pressedColumn;
-//         
-//         [self _setPressedColumn:-1];
-//         
-//         if (pressedColumn === clickedColumn)        
-//             if (clickedColumn !== -1)
-//                 [_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
-//         
-//         return;
-//     }
-//     else if (type === CPLeftMouseDragged)
-//     {
-//         var hoveredColumn = [self columnAtPoint:location];
-//         
-//         CPLog.debug(@"hovered: %i pressed: %i", hoveredColumn, _pressedColumn);
-//         if (hoveredColumn === _clickedColumn)
-//             [self _setPressedColumn:_clickedColumn];
-//         else
-//             [self _setPressedColumn:-1]
-//     }
-//     //     CPLog.debug(@"...");
-//     //     
-//     //     var point = [self convertPoint:[theEvent locationInWindow] fromView:nil];
-//     //     
-//     //     var view = [[CPView alloc] initWithFrame:CPRectMake(0.0, 0.0, CPRectGetWidth([self bounds], CPRectGetHeight([[self tableView] bounds])))];
-//     //     [view setBackgroundColor:[CPColor greenColor]];
-//     //     var viewLocation = CPPointMake(point.x - CGRectGetWidth(bounds)/2, point.y - CGRectGetHeight(bounds)/2);
-//     //     
-//     //     [self dragView:view at:viewLocation offset:CPPointMakeZero() event:theEvent pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
-//     //     return;
-//     // }
-// 
-//     [CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
-// }
-
-// - (void)trackResizeWithEvent:(CPEvent)anEvent
-// {
-//     var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
-//         tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
-//         type = [anEvent type];
-// 
-//     if (_lastLocation == nil)
-//         _lastLocation = location;
-// 
-//     if (_columnOldWidth == nil)
-//         _columnOldWidth = [tableColumn width];
-// 
-//     if (type === CPLeftMouseUp)
-//     {   
-//         [self _updateResizeCursor:anEvent];
-//                 
-//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
-//         [tableColumn setDisableResizingPosting:NO];        
-//         [_tableView setDisableAutomaticResizing:NO];
-// 
-//         _resizedColumn = -1;
-//         _lastLocation = nil;
-//         _columnOldWidth = nil;
-// 
-//         return;
-//     }            
-//     else if (type === CPLeftMouseDragged)
-//     {
-//         var newWidth = [tableColumn width] + location.x - _lastLocation.x;
-//         
-//         if (newWidth < [tableColumn minWidth])
-//             [[CPCursor resizeRightCursor] set];
-//         else if (newWidth > [tableColumn maxWidth])
-//             [[CPCursor resizeLeftCursor] set];
-//         else
-//         {
-//             _tableView._lastColumnShouldSnap = NO;
-//             [tableColumn setWidth:newWidth];
-//             // FIXME: there has to be a better way to do this...
-//             // We should refactor the auto resizing crap.
-//             // We need to figure out the exact cocoa behavior here though. 
-//             _lastLocation = location;
-// 
-//             [[CPCursor resizeLeftRightCursor] set];
-//             [self setNeedsLayout];
-//             [self setNeedsDisplay:YES];
-//         }
-//     }
-// 
-//     [CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
-// }
-
 - (void)_updateResizeCursorForTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
 {
     if (![[self tableView] allowsColumnResizing] || (isMouseUp && ![[self window] acceptsMouseMovedEvents]))

From 6bb8514253c29970d54c20e20d051239ab6be73d Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Mon, 3 May 2010 14:42:52 +0200
Subject: [PATCH 067/175] - gave the drag column a proper 'image'
 representation - constrained the drags y coordinates - made sure a drag is
 never out of bounds

---
 AppKit/CPTableHeaderView.j | 42 ++++++++++++++++++++++++------
 AppKit/CPTableView.j       | 53 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 86 insertions(+), 9 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index d978f73e9..444103e29 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -341,15 +341,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         CPLog.debug(@"start drag");
         
         var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
-            columnRect = [self headerRectOfColumn:aColumnIndex],
-            // offset = CPSizeMake(_mouseDownLocation.x - aPoint.x, _mouseDownLocation.y);
+            columnRect = [self headerRectOfColumn:aColumnIndex];
         
-        var frame = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([[self tableView] bounds])),
-            view = [[CPView alloc] initWithFrame:frame];
-            
-        [view setBackgroundColor:[CPColor greenColor]];
+        var offset = CPPointMakeZero(),
+            view = [[self tableView] dragViewForTableColumns:[tableColumn] event:[CPApp currentEvent] offset:offset],
+            viewLocation = CPPointMakeZero();
         
-        [self dragView:view at:aPoint offset:CPSizeMake(0.0, 0.0) event:[CPApp currentEvent] 
+        viewLocation.x = ( CPRectGetMinX(columnRect) + offset.x ) + ( aPoint.x - _mouseDownLocation.x );
+        viewLocation.y = CPRectGetMinY(columnRect) + offset.y;
+        
+        [view setAlphaValue:0.7];
+        
+        [self dragView:view at:viewLocation offset:CPSizeMakeZero() event:[CPApp currentEvent] 
             pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
             
         return NO;
@@ -358,10 +361,33 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     return YES;
 }
 
+- (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
+{
+    var tableColumns = [[self tableView] tableColumns],
+        lastColumnRect = [self headerRectOfColumn:[tableColumns indexOfObjectIdenticalTo:[tableColumns lastObject]]],
+        dragWindow = [theDragView window],
+        frame = [dragWindow frame];
+    
+    // Because the drag window is as wide as the entire tableview, it's start origin is always 0.0
+    // The minimal x coordinate is the minimal dragged table columns negated x value 
+    var minimumX = -(CPRectGetMinX([self headerRectOfColumn:_activeColumn]))
+        maximumX = CPRectGetMinX(lastColumnRect);
+        
+    // This effectively clamps the value between the minimal and maximum
+    // frame.origin.x = MAX(minimumX, MIN(CPRectGetMinX(frame), maximumX));
+    
+    // Make sure the column cannot move vertically
+    frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
+    
+    [dragWindow setFrame:frame];
+}
+
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
 {
+    [self _constrainDragView:aView at:aPoint];
+    
     var hoveredColumn = [self columnAtPoint:aPoint],
-    if (_activeColumn === hoveredColumn)
+    if (hoveredColumn === -1 || _activeColumn === hoveredColumn)
         return;
         
     var columnRect = [self headerRectOfColumn:hoveredColumn],
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 2937445a6..674a650dc 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1810,7 +1810,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return [[CPImage alloc] initWithContentsOfFile:@"Frameworks/AppKit/Resources/GenericFile.png" size:CGSizeMake(32,32)];
 }
 
-- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)theDraggedRows tableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPoint)dragViewOffset
+- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)theDraggedRows tableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPointPointer)dragViewOffset
 {
     var bounds = [self bounds],
         view = [[CPView alloc] initWithFrame:bounds];
@@ -1846,6 +1846,57 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return view;
 }
 
+- (CPView)dragViewForTableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPointPointer)theDragViewOffset
+{
+    var bounds = CPRectMake(0.0, 0.0, 0.0, CPRectGetHeight([self bounds]) + 23.0);
+        index = [theTableColumns count],
+        dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
+    
+    // Fetch all the data views for the columns and visible rows
+    // After that copy these add them to a transparent drag view and use that drag view 
+    // to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
+    while (index--)
+    {
+        // Get the tablecolumn and create a rect with it's width so we can use CPRectUnion 
+        // to determine the end result
+        var tableColumn = [theTableColumns objectAtIndex:index],
+            columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:tableColumn];
+            columnRect = [self rectOfColumn:columnIndex],
+            headerView = [tableColumn headerView];
+        
+        // Add the column header view
+        columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:[headerView frame]];
+        [columnHeaderView setStringValue:[headerView stringValue]];
+        [columnHeaderView setThemeState:[headerView themeState]];
+        [dragView addSubview:columnHeaderView];
+            
+        bounds = CPRectUnion(bounds, columnRect);
+        
+        row = [_exposedRows firstIndex];
+        while (row !== CPNotFound)
+        {
+            var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
+                dataViewFrame = [self frameOfDataViewAtColumn:columnIndex row:row];
+                
+            // Offset by table header height to make room for the table header
+            dataViewFrame.origin.y += 23.0;
+            [dataView setFrame:dataViewFrame];
+            
+            [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
+            [dragView addSubview:dataView];
+            
+            row = [_exposedRows indexGreaterThanIndex:row];
+        }
+    }
+    
+    // The columns are placed in the drag window at their original locations resulting in the dragged column
+    // being of when started the drag, we compensate for this by offseting the drag window by the x coordinate of the column
+    theDragViewOffset.x -= columnRect.origin.x;
+    [dragView setFrame:bounds];
+    
+    return dragView;
+}
+
 - (void)setDraggingSourceOperationMask:(CPDragOperation)mask forLocal:(BOOL)isLocal
 {
     //ignoral local for the time being since only one capp app can run at a time...

From 040e7bc9eeb0ca1e591de8cddcaf74d0e0f74351 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 12:06:06 +0200
Subject: [PATCH 068/175] - made the _dragViewForTableColumn:event:offset:
 method private - removed the multiple column support from
 _dragViewForTableColumn:event:offset: (Cocoa doesn't allow multiple column
 selection / dragging) - made the dragview the size of the dragged column

---
 AppKit/CPTableHeaderView.j | 12 ++----
 AppKit/CPTableView.j       | 77 +++++++++++++++++++-------------------
 2 files changed, 41 insertions(+), 48 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 444103e29..1b721d613 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -338,20 +338,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     
     if ([self _shouldDragTableColumn:aColumnIndex at:aPoint])
     {
-        CPLog.debug(@"start drag");
-        
-        var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
-            columnRect = [self headerRectOfColumn:aColumnIndex];
-        
-        var offset = CPPointMakeZero(),
-            view = [[self tableView] dragViewForTableColumns:[tableColumn] event:[CPApp currentEvent] offset:offset],
+        var columnRect = [self headerRectOfColumn:aColumnIndex],
+            offset = CPPointMakeZero(),
+            view = [[self tableView] _dragViewForColumn:aColumnIndex event:[CPApp currentEvent] offset:offset],
             viewLocation = CPPointMakeZero();
         
         viewLocation.x = ( CPRectGetMinX(columnRect) + offset.x ) + ( aPoint.x - _mouseDownLocation.x );
         viewLocation.y = CPRectGetMinY(columnRect) + offset.y;
         
-        [view setAlphaValue:0.7];
-        
         [self dragView:view at:viewLocation offset:CPSizeMakeZero() event:[CPApp currentEvent] 
             pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
             
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 674a650dc..c9c5bc688 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1846,52 +1846,51 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return view;
 }
 
-- (CPView)dragViewForTableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPointPointer)theDragViewOffset
-{
-    var bounds = CPRectMake(0.0, 0.0, 0.0, CPRectGetHeight([self bounds]) + 23.0);
-        index = [theTableColumns count],
-        dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
-    
-    // Fetch all the data views for the columns and visible rows
-    // After that copy these add them to a transparent drag view and use that drag view 
+/*!
+    @ignore
+    // Fetches all the data views (from the datasource) for the column and it's visible rows
+    // Copy the dataviews add them to a transparent drag view and use that drag view 
     // to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
-    while (index--)
+*/
+- (CPView)_dragViewForColumn:(int)theColumnIndex event:(CPEvent)theDragEvent offset:(CPPointPointer)theDragViewOffset
+{
+    var dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
+        tableColumn = [[self tableColumns] objectAtIndex:theColumnIndex],
+        bounds = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([self bounds]) + 23.0),
+        columnRect = [self rectOfColumn:theColumnIndex],
+        headerView = [tableColumn headerView];
+    
+    // Add the column header view
+    var headerFrame = [headerView frame];
+    headerFrame.origin = CPPointMakeZero();
+    
+    columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:headerFrame];
+    [columnHeaderView setStringValue:[headerView stringValue]];
+    [columnHeaderView setThemeState:[headerView themeState]];
+    [dragView addSubview:columnHeaderView];
+    
+    row = [_exposedRows firstIndex];
+    while (row !== CPNotFound)
     {
-        // Get the tablecolumn and create a rect with it's width so we can use CPRectUnion 
-        // to determine the end result
-        var tableColumn = [theTableColumns objectAtIndex:index],
-            columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:tableColumn];
-            columnRect = [self rectOfColumn:columnIndex],
-            headerView = [tableColumn headerView];
+        var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
+            dataViewFrame = [self frameOfDataViewAtColumn:theColumnIndex row:row];
+            
+        // Offset by table header height to make room for the table header
+        dataViewFrame.origin.x = 0.0;
+        dataViewFrame.origin.y += 23.0;
+        [dataView setFrame:dataViewFrame];
         
-        // Add the column header view
-        columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:[headerView frame]];
-        [columnHeaderView setStringValue:[headerView stringValue]];
-        [columnHeaderView setThemeState:[headerView themeState]];
-        [dragView addSubview:columnHeaderView];
-            
-        bounds = CPRectUnion(bounds, columnRect);
+        [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
+        [dragView addSubview:dataView];
         
-        row = [_exposedRows firstIndex];
-        while (row !== CPNotFound)
-        {
-            var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
-                dataViewFrame = [self frameOfDataViewAtColumn:columnIndex row:row];
-                
-            // Offset by table header height to make room for the table header
-            dataViewFrame.origin.y += 23.0;
-            [dataView setFrame:dataViewFrame];
-            
-            [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
-            [dragView addSubview:dataView];
-            
-            row = [_exposedRows indexGreaterThanIndex:row];
-        }
+        row = [_exposedRows indexGreaterThanIndex:row];
     }
     
     // The columns are placed in the drag window at their original locations resulting in the dragged column
-    // being of when started the drag, we compensate for this by offseting the drag window by the x coordinate of the column
-    theDragViewOffset.x -= columnRect.origin.x;
+    // being of when starting the drag, we compensate for this by offseting the drag window by the x coordinate of the column
+    // theDragViewOffset.x -= columnRect.origin.x;
+    
+    [dragView setAlphaValue:0.7];
     [dragView setFrame:bounds];
     
     return dragView;

From 93afa11ef9fa2a638f8110bdf7e28e6738f387ea Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 13:52:57 +0200
Subject: [PATCH 069/175] - switch columns when the dragged column is more than
 halfway over the previous/next column - constrain the horizontal coordinates
 within the header view

---
 AppKit/CPTableHeaderView.j | 104 +++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 57 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 1b721d613..3306e6b72 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -309,33 +309,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
 }
 
-/*!
-    @ignore
-    Determines if the header view should finish the column tracking
-    Returns YES if the receiver is in a tracking session, the active column is equal to the hovered column
-    and the header rect of the column contains the current mouse location
-*/
-- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{
-    return _isTrackingColumn && _activeColumn === aColumnIndex && 
-        CPRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint);
-}
-
 - (void)startTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    CPLog.debug(@"startTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
     [self _setPressedColumn:aColumnIndex];
 }
 
-- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{
-    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
-}
-
 - (BOOL)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{    
-    CPLog.debug(@"continueTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
+{
     if ([self _shouldDragTableColumn:aColumnIndex at:aPoint])
     {
         var columnRect = [self headerRectOfColumn:aColumnIndex],
@@ -355,20 +335,32 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     return YES;
 }
 
+- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return _isTrackingColumn && _activeColumn === aColumnIndex && 
+        CPRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint);
+}
+
+- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    [self _setPressedColumn:CPNotFound];
+}
+
+- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
+}
+
 - (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
 {
     var tableColumns = [[self tableView] tableColumns],
         lastColumnRect = [self headerRectOfColumn:[tableColumns indexOfObjectIdenticalTo:[tableColumns lastObject]]],
+        activeColumnRect = [self headerRectOfColumn:_activeColumn];
         dragWindow = [theDragView window],
         frame = [dragWindow frame];
     
-    // Because the drag window is as wide as the entire tableview, it's start origin is always 0.0
-    // The minimal x coordinate is the minimal dragged table columns negated x value 
-    var minimumX = -(CPRectGetMinX([self headerRectOfColumn:_activeColumn]))
-        maximumX = CPRectGetMinX(lastColumnRect);
-        
-    // This effectively clamps the value between the minimal and maximum
-    // frame.origin.x = MAX(minimumX, MIN(CPRectGetMinX(frame), maximumX));
+    // This effectively clamps the value between the minimum and maximum
+    frame.origin.x = MAX(0.0, MIN(CPRectGetMinX(frame), CPRectGetMaxX(lastColumnRect) - CPRectGetWidth(activeColumnRect)));
     
     // Make sure the column cannot move vertically
     frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
@@ -376,48 +368,46 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [dragWindow setFrame:frame];
 }
 
+- (void)_moveColumn:(int)aFromIndex toColumn:(int)aToIndex
+{
+    [[self tableView] moveColumn:aFromIndex toColumn:aToIndex];
+    _activeColumn = aToIndex;
+    _pressedColumn = _activeColumn;
+}
+
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
 {
     [self _constrainDragView:aView at:aPoint];
     
-    var hoveredColumn = [self columnAtPoint:aPoint],
-    if (hoveredColumn === -1 || _activeColumn === hoveredColumn)
-        return;
-        
-    var columnRect = [self headerRectOfColumn:hoveredColumn],
-        columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
+    var dragWindowFrame = [[aView window] frame];
     
-    if (_activeColumn < hoveredColumn && aPoint.x > columnCenterPoint.x)
+    var hoverPoint = CPPointCreateCopy(aPoint);
+    if (aPoint.x < _previousTrackingLocation.x)
+        hoverPoint = CPPointMake(CPRectGetMinX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
+    else if (aPoint.x > _previousTrackingLocation.x)
+        hoverPoint = CPPointMake(CPRectGetMaxX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
+    
+    var hoveredColumn = [self columnAtPoint:hoverPoint],
+    
+    if (hoveredColumn !== -1)
     {
-        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
-        _activeColumn = hoveredColumn;
-    }
-    else if (_activeColumn > hoveredColumn && aPoint.x < columnCenterPoint.x)
-    {
-        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
-        _activeColumn = hoveredColumn;
+        var columnRect = [self headerRectOfColumn:hoveredColumn],
+            columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
+    
+        if (hoveredColumn < _activeColumn && hoverPoint.x < columnCenterPoint.x)
+            [self _moveColumn:_activeColumn toColumn:hoveredColumn];
+        else if (hoveredColumn > _activeColumn && hoverPoint.x > columnCenterPoint.x)
+            [self _moveColumn:_activeColumn toColumn:hoveredColumn];
     }
+    
+    _previousTrackingLocation = aPoint;
 }
 
 - (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
 {
-    CPLog.debug(@"draggedView view ended at: %@", CPStringFromPoint(aLocation));
-    
-    [self stopTrackingTableColumn:[self columnAtPoint:aLocation] at:aLocation];
+    [self stopTrackingTableColumn:_activeColumn at:aLocation];
 }
 
-- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{
-    CPLog.debug(@"stopTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    [self _setPressedColumn:CPNotFound];
-}
-
-/*!
-    @ignore
-    Determines if the table column should be resized
-    Returns YES if the receiver is already resizing a column or when the tableview allows 
-    resizing and the point is in the resize rect of the column
-*/
 - (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
     if (_isResizing)

From 006f7e0c158273d691f13ceec4f32f0ecf9819af Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 15:31:21 +0200
Subject: [PATCH 070/175] - fixed a out of bounds error when clicking in the
 table header outside of any column - made the dragged table column appear
 gray - gave the tablecolumn drag view a white background

---
 AppKit/CPTableHeaderView.j | 52 +++++++++++++++++++++-----------------
 AppKit/CPTableView.j       | 32 +++++++++++++++++++----
 2 files changed, 56 insertions(+), 28 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 3306e6b72..318e78357 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -26,7 +26,7 @@
  
 @implementation _CPTableColumnHeaderView : CPView
 {
-    _CPImageAndTextView _textField;
+    _CPImageAndTextView     _textField;
 }
 
 - (void)initWithFrame:(CGRect)frame
@@ -153,6 +153,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     int                     _pressedColumn;
     
     BOOL                    _isResizing;
+    BOOL                    _isDragging;
     BOOL                    _isTrackingColumn;
     
     // CPPoint             _previousTrackingLocation;
@@ -272,6 +273,9 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
     if (type === CPLeftMouseDown)
     {
+        if (columnIndex === -1)
+            return;
+        
         _mouseDownLocation = currentLocation;
         _activeColumn = columnIndex;
 
@@ -373,6 +377,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [[self tableView] moveColumn:aFromIndex toColumn:aToIndex];
     _activeColumn = aToIndex;
     _pressedColumn = _activeColumn;
+    
+    [[self tableView] _setDraggedColumn:_activeColumn];
+}
+
+- (void)draggedView:(CPView)aView beganAt:(CPPoint)aPoint
+{
+    _isDragging = YES;
+    
+    [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:YES];
+    [[self tableView] _setDraggedColumn:_activeColumn];
+    
+    [self setNeedsDisplay:YES];
 }
 
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
@@ -405,7 +421,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
 {
+    _isDragging = NO;
+    
+    [[self tableView] _setDraggedColumn:-1];
+    [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
     [self stopTrackingTableColumn:_activeColumn at:aLocation];
+    
+    [self setNeedsDisplay:YES];
 }
 
 - (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
@@ -594,27 +616,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     
     CGContextClosePath(context);
     CGContextStrokePath(context);
-        
-/*
-    var maxY = CGRectGetMaxY([self bounds]);
-    // draw normal gradient for remaining space
-    if (supportsCanvasGradient)
+    
+    if (_isDragging)
     {
-        aRect.origin.x = columnMaxX - 0.5;
-        aRect.size.width -= columnMaxX;
-        CGContextBeginPath(context);
-        CGContextAddRect(context, CGRectMake(columnMaxX + 1, 0, CGRectGetMaxX([self bounds]) - columnMaxX, CGRectGetHeight([self bounds])));
-        CGContextClosePath(context);    
-        CGContextDrawLinearGradient(context, [_CPTableColumnHeaderView headerGradient], CGPointMake(0,0), CGPointMake(0, maxY - 1),0);
-    }   
-   
-    // Draw bottom line
-    CGContextBeginPath(context);    
-    CGContextMoveToPoint(context, 0, maxY - 0.5);
-    CGContextAddLineToPoint(context, CGRectGetMaxX([self bounds]), maxY - 0.5);
-    CGContextClosePath(context);
-    CGContextStrokePath(context);
-*/   
+        CGContextSetFillColor(context, [CPColor grayColor]);
+        CGContextFillRect(context, [self headerRectOfColumn:_activeColumn])
+    }
 }
 
 @end
@@ -640,5 +647,4 @@ var CPTableHeaderViewTableViewKey = @"CPTableHeaderViewTableViewKey";
     [aCoder encodeObject:_tableView forKey:CPTableHeaderViewTableViewKey];
 }
 
-@end
-
+@end
\ No newline at end of file
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index c9c5bc688..8d79b93d0 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -212,6 +212,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     CPGradient  _sourceListActiveGradient;
     CPColor     _sourceListActiveTopLineColor;
     CPColor     _sourceListActiveBottomLineColor;    
+    
+    int         _draggedColumnIndex;
+    
 /*
     CPGradient  _sourceListInactiveGradient;
     CPColor     _sourceListInactiveTopLineColor;
@@ -309,7 +312,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 
         if (!_cornerView)
             _cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))];
-
+        
+        _draggedColumnIndex = -1;
+        
         // Gradients for the source list
         _sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [89.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2);
         _sourceListActiveTopLineColor = [CPColor colorWithCalibratedRed:(61.0/255.0) green:(123.0/255.0) blue:(218.0/255.0) alpha:1.0];
@@ -672,6 +677,15 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     [self setNeedsLayout];
 }
 
+- (void)_setDraggedColumn:(int)aColumnIndex
+{
+    if (_draggedColumnIndex === aColumnIndex)
+        return;
+        
+    _draggedColumnIndex = aColumnIndex;
+    
+    [self reloadDataForRowIndexes:_exposedRows columnIndexes:[CPIndexSet indexSetWithIndex:aColumnIndex]];
+}
 
 /*!
     Moves the column and heading at a given index to a new given index.
@@ -703,7 +717,6 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         columnIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(fromIndex, toIndex)];
         
     [self reloadDataForRowIndexes:rowIndexes columnIndexes:columnIndexes];
-    // [self setNeedsLayout];
 }
 
 /*!
@@ -1856,7 +1869,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 {
     var dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
         tableColumn = [[self tableColumns] objectAtIndex:theColumnIndex],
-        bounds = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([self bounds]) + 23.0),
+        bounds = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([self _exposedRect]) + 23.0),
         columnRect = [self rectOfColumn:theColumnIndex],
         headerView = [tableColumn headerView];
     
@@ -1890,6 +1903,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     // being of when starting the drag, we compensate for this by offseting the drag window by the x coordinate of the column
     // theDragViewOffset.x -= columnRect.origin.x;
     
+    [dragView setBackgroundColor:[CPColor whiteColor]];
     [dragView setAlphaValue:0.7];
     [dragView setFrame:bounds];
     
@@ -2138,7 +2152,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         var column = columnArray[columnIndex],
             tableColumn = _tableColumns[column];
             
-        if ([tableColumn isHidden])
+        if ([tableColumn isHidden] || columnIndex === _draggedColumnIndex)
             continue;
             
         var tableColumnUID = [tableColumn UID];
@@ -2294,6 +2308,15 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     [self drawBackgroundInClipRect:exposedRect];
     [self drawGridInClipRect:exposedRect];
     [self highlightSelectionInClipRect:exposedRect];
+    
+    if (_draggedColumnIndex === -1)
+        return;
+        
+    var context = [[CPGraphicsContext currentContext] graphicsPort],
+        columnRect = [self rectOfColumn:_draggedColumnIndex];
+
+    CGContextSetFillColor(context, [CPColor grayColor]);
+    CGContextFillRect(context, columnRect);
 }
 
 - (void)drawBackgroundInClipRect:(CGRect)aRect
@@ -2301,7 +2324,6 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     if (!_usesAlternatingRowBackgroundColors)
         return;
 
-
     var rowColors = [self alternatingRowBackgroundColors],
         colorCount = [rowColors count];
 

From bdb0fb1310d08e8c2ca7417934bc18fa41e05f43 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 15:54:13 +0200
Subject: [PATCH 071/175] some cleanup

---
 AppKit/CPTableHeaderView.j | 63 ++++++++++----------------------------
 1 file changed, 16 insertions(+), 47 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 318e78357..8335069d8 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -156,29 +156,23 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     BOOL                    _isDragging;
     BOOL                    _isTrackingColumn;
     
-    // CPPoint             _previousTrackingLocation;
-    // 
-    // int                 _resizedColumn @accessors(readonly, property=resizedColumn);
-    // int                 _draggedColumn @accessors(readonly, property=draggedColumn);
-    // int                 _pressedColumn @accessors(readonly, property=pressedColumn);
-    // int                 _clickedColumn @accessors(readonly, property=clickedColumn);
-    // BOOL                _isTrackingColumn;
-    // 
-    // float               _draggedDistance @accessors(readonly, property=draggedDistance);
-    // float               _lastLocation;
-    // float               _columnOldWidth;
+    float                   _columnOldWidth;
     
-    CPTableView _tableView @accessors(property=tableView);
+    CPTableView             _tableView @accessors(property=tableView);
 }
 
 - (void)_init
 {
-    _resizedColumn = -1;
-    _draggedColumn = -1;
-    _pressedColumn = CPNotFound;
-    _draggedDistance = 0.0;
-    _lastLocation = nil;
-    _columnOldWidth = nil;
+    _mouseDownLocation = CPPointMakeZero();
+    _previousTrackingLocation = CPPointMakeZero();
+    _activeColumn = -1;
+    _pressedColumn = -1;
+    
+    _isResizing = NO;
+    _isDragging = NO;
+    _isTrackingColumn = NO;
+    
+    _columnOldWidth = 0.0;
 
     [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
 }
@@ -297,14 +291,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         {
             if (_activeColumn === columnIndex && CPRectContainsPoint([self headerRectOfColumn:columnIndex], currentLocation))
             {
-                if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+                if (_isTrackingColumn && _pressedColumn !== -1)
                 {
                     if (![self continueTrackingTableColumn:columnIndex at:currentLocation])
                         return; // Stop tracking the column, because it's being dragged
                 } else
                     [self startTrackingTableColumn:columnIndex at:currentLocation];
                     
-            } else if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+            } else if (_isTrackingColumn && _pressedColumn !== -1)
                 [self stopTrackingTableColumn:_activeColumn at:currentLocation];
         }
     }
@@ -348,6 +342,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
     [self _setPressedColumn:CPNotFound];
+    [self _updateResizeCursor:[CPApp currentEvent]];
 }
 
 - (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
@@ -422,6 +417,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
 {
     _isDragging = NO;
+    _isTrackingColumn = NO; // We need to do this explicitly because the mouse up section of trackMouse is never reached
     
     [[self tableView] _setDraggedColumn:-1];
     [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
@@ -445,20 +441,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     _isResizing = YES;
     
-    CPLog.debug(@"startResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
     
     [tableColumn setDisableResizingPosting:YES];
     [[self tableView] setDisableAutomaticResizing:YES];
-    
-    _resizedColumn = aColumnIndex;
 }
 
 - (void)continueResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    CPLog.debug(@"continueResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
     
     var newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
@@ -480,10 +470,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)stopResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    CPLog.debug(@"stopResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
-    // [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
-    
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
     [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
     [tableColumn setDisableResizingPosting:NO];
@@ -492,17 +478,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     _isResizing = NO;
 }
 
-- (void)_updateResizeCursorForTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
-{
-    if (![[self tableView] allowsColumnResizing] || (isMouseUp && ![[self window] acceptsMouseMovedEvents]))
-    {
-        [[CPCursor arrowCursor] set];
-        return;
-    }
-    
-    
-}
-
 - (void)_updateResizeCursor:(CPEvent)theEvent
 {
     // never get stuck in resize cursor mode (FIXME take out when we turn on tracking rects)
@@ -532,12 +507,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         [[CPCursor arrowCursor] set];
 }
 
-- (void)viewDidMoveToWindow
-{
-    //if ([_tableView allowsColumnResizing])
-    //    [[self window] setAcceptsMouseMovedEvents:YES];
-}
-
 - (void)mouseEntered:(CPEvent)theEvent
 {   
     [self _updateResizeCursor:theEvent];

From e7fc9d991259a8b8416c1460e02c89a38a95817e Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Wed, 5 May 2010 10:38:41 +0200
Subject: [PATCH 072/175] fixed a bug where column reordering would break when
 the last column was hidden

---
 AppKit/CPTableHeaderView.j | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 8335069d8..add1d0086 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -350,10 +350,26 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
 }
 
+- (CPRect)_headerRectOfLastVisibleColumn
+{
+    var tableColumns = [[self tableView] tableColumns],
+        columnIndex = [tableColumns count];
+        
+    while (columnIndex--)
+    {
+        var tableColumn = [tableColumns objectAtIndex:columnIndex];
+        
+        if (![tableColumn isHidden])
+            return [self headerRectOfColumn:columnIndex];
+    }
+    
+    return nil;
+}
+
 - (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
 {
     var tableColumns = [[self tableView] tableColumns],
-        lastColumnRect = [self headerRectOfColumn:[tableColumns indexOfObjectIdenticalTo:[tableColumns lastObject]]],
+        lastColumnRect = [self _headerRectOfLastVisibleColumn];
         activeColumnRect = [self headerRectOfColumn:_activeColumn];
         dragWindow = [theDragView window],
         frame = [dragWindow frame];

From a0cf7d578704bee476abf1a1303b69a3f9cbe50f Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Wed, 5 May 2010 12:56:23 +0200
Subject: [PATCH 073/175] made table column reordering work in non full-bridged
 apps

---
 AppKit/CPTableHeaderView.j | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index add1d0086..4bbb4e006 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -374,12 +374,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         dragWindow = [theDragView window],
         frame = [dragWindow frame];
     
+    // Convert the frame origin from the global coordinate system to the windows' coordinate system
+    frame.origin = [[self window] convertGlobalToBase:frame.origin];
+    
     // This effectively clamps the value between the minimum and maximum
     frame.origin.x = MAX(0.0, MIN(CPRectGetMinX(frame), CPRectGetMaxX(lastColumnRect) - CPRectGetWidth(activeColumnRect)));
     
     // Make sure the column cannot move vertically
     frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
     
+    // Convert the calculated origin back to the global coordinate system
+    frame.origin = [[self window] convertBaseToGlobal:frame.origin];
+    
     [dragWindow setFrame:frame];
 }
 
@@ -406,7 +412,8 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     [self _constrainDragView:aView at:aPoint];
     
-    var dragWindowFrame = [[aView window] frame];
+    var dragWindow = [aView window],
+        dragWindowFrame = [dragWindow frame];
     
     var hoverPoint = CPPointCreateCopy(aPoint);
     if (aPoint.x < _previousTrackingLocation.x)
@@ -414,13 +421,16 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     else if (aPoint.x > _previousTrackingLocation.x)
         hoverPoint = CPPointMake(CPRectGetMaxX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
     
-    var hoveredColumn = [self columnAtPoint:hoverPoint],
+    // Convert the hover point from the global coordinate system to windows' coordinate system
+    hoverPoint = [[self window] convertGlobalToBase:hoverPoint];
+    
+    var hoveredColumn = [self columnAtPoint:hoverPoint];
     
     if (hoveredColumn !== -1)
     {
         var columnRect = [self headerRectOfColumn:hoveredColumn],
             columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
-    
+        
         if (hoveredColumn < _activeColumn && hoverPoint.x < columnCenterPoint.x)
             [self _moveColumn:_activeColumn toColumn:hoveredColumn];
         else if (hoveredColumn > _activeColumn && hoverPoint.x > columnCenterPoint.x)

From 2fd85ab78f6ab924c3b45f7fc76fe5154ae947d8 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Wed, 5 May 2010 14:08:06 +0200
Subject: [PATCH 074/175] made column reordering work with scrolled content

---
 AppKit/CPTableView.j | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 8d79b93d0..291adc0a6 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1873,24 +1873,17 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         columnRect = [self rectOfColumn:theColumnIndex],
         headerView = [tableColumn headerView];
     
-    // Add the column header view
-    var headerFrame = [headerView frame];
-    headerFrame.origin = CPPointMakeZero();
-    
-    columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:headerFrame];
-    [columnHeaderView setStringValue:[headerView stringValue]];
-    [columnHeaderView setThemeState:[headerView themeState]];
-    [dragView addSubview:columnHeaderView];
-    
     row = [_exposedRows firstIndex];
     while (row !== CPNotFound)
     {
         var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
             dataViewFrame = [self frameOfDataViewAtColumn:theColumnIndex row:row];
             
-        // Offset by table header height to make room for the table header
+        // Only one column is ever dragged so we just place the view at 
         dataViewFrame.origin.x = 0.0;
-        dataViewFrame.origin.y += 23.0;
+            
+        // Offset by table header height - scroll position
+        dataViewFrame.origin.y = ( CPRectGetMinY(dataViewFrame) - CPRectGetMinY([self _exposedRect]) ) + 23.0;
         [dataView setFrame:dataViewFrame];
         
         [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
@@ -1899,9 +1892,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         row = [_exposedRows indexGreaterThanIndex:row];
     }
     
-    // The columns are placed in the drag window at their original locations resulting in the dragged column
-    // being of when starting the drag, we compensate for this by offseting the drag window by the x coordinate of the column
-    // theDragViewOffset.x -= columnRect.origin.x;
+    // Add the column header view
+    var headerFrame = [headerView frame];
+    headerFrame.origin = CPPointMakeZero();
+    
+    columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:headerFrame];
+    [columnHeaderView setStringValue:[headerView stringValue]];
+    [columnHeaderView setThemeState:[headerView themeState]];
+    [dragView addSubview:columnHeaderView];
     
     [dragView setBackgroundColor:[CPColor whiteColor]];
     [dragView setAlphaValue:0.7];

From 90975c96f9fbe8ca30eb1faf192844fdfe4b42c8 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Wed, 5 May 2010 14:05:09 -0700
Subject: [PATCH 075/175] Updates for scrolling behavior in webview.

---
 AppKit/CPWebView.j | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j
index cd4876675..d8c7dff81 100644
--- a/AppKit/CPWebView.j
+++ b/AppKit/CPWebView.j
@@ -181,7 +181,8 @@ CPWebViewScrollNative                           = 2;
         }
         else
         {
-            [_frameView setFrameSize:[_scrollView contentSize]];
+            var visibleRect = [_frameView visibleRect];
+            [_frameView setFrameSize:CGSizeMake(CGRectGetMaxX(visibleRect), CGRectGetMaxY(visibleRect))];
             
             // try to get the document size so we can correctly set the frame
             var win = null;
@@ -203,6 +204,8 @@ CPWebViewScrollNative                           = 2;
             
                 [_frameView setFrameSize:CGSizeMake(800, 1600)];
             }
+
+            [_frameView scrollRectToVisible:visibleRect];
         }
     }
 }
@@ -256,6 +259,8 @@ CPWebViewScrollNative                           = 2;
 
     [self _setScrollMode:CPWebViewScrollAppKit];
 
+    [_frameView setFrameSize:[_scrollView contentSize]];
+
     [self _startedLoading];
     
     _ignoreLoadStart = YES;

From 9c9eb519dfe188c9d273df116d5d4eea21f2883d Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Thu, 6 May 2010 17:36:11 +0200
Subject: [PATCH 076/175] call willChange* and didChange* methods on the actual
 classes

---
 Foundation/CPKeyValueObserving.j | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j
index b88f766a0..39f29779d 100644
--- a/Foundation/CPKeyValueObserving.j
+++ b/Foundation/CPKeyValueObserving.j
@@ -480,6 +480,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 
 - (void)willChangeValueForKey:(CPString)aKey
 {
+    var superClass = [self class],
+    methodSelector = @selector(willChangeValueForKey:),
+    methodImp = class_getMethodImplementation(superClass, methodSelector);
+    methodImp(self, methodSelector, aKey);
+    
     if (!aKey)
         return;
 
@@ -490,6 +495,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 
 - (void)didChangeValueForKey:(CPString)aKey
 {
+    var superClass = [self class],
+    methodSelector = @selector(didChangeValueForKey:),
+    methodImp = class_getMethodImplementation(superClass, methodSelector);
+    methodImp(self, methodSelector, aKey);
+    
     if (!aKey)
         return;
 
@@ -498,6 +508,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 
 - (void)willChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey
 {
+    var superClass = [self class],
+    methodSelector = @selector(willChange:valuesAtIndexes:forKey:),
+    methodImp = class_getMethodImplementation(superClass, methodSelector);
+    methodImp(self, methodSelector, change, indexes, aKey);
+    
     if (!aKey)
         return;
 
@@ -508,6 +523,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 
 - (void)didChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey
 {
+    var superClass = [self class],
+    methodSelector = @selector(didChange:valuesAtIndexes:forKey:),
+    methodImp = class_getMethodImplementation(superClass, methodSelector);
+    methodImp(self, methodSelector, change, indexes, aKey);
+    
     if (!aKey)
         return;
 

From 542e491bb453ffa12de8d1946f9ec0386b04c655 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Thu, 6 May 2010 11:26:56 -0700
Subject: [PATCH 077/175] whitespace cleanup.

---
 Foundation/CPKeyValueObserving.j | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j
index 39f29779d..9662d5064 100644
--- a/Foundation/CPKeyValueObserving.j
+++ b/Foundation/CPKeyValueObserving.j
@@ -481,10 +481,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 - (void)willChangeValueForKey:(CPString)aKey
 {
     var superClass = [self class],
-    methodSelector = @selector(willChangeValueForKey:),
-    methodImp = class_getMethodImplementation(superClass, methodSelector);
+        methodSelector = @selector(willChangeValueForKey:),
+        methodImp = class_getMethodImplementation(superClass, methodSelector);
+
     methodImp(self, methodSelector, aKey);
-    
+
     if (!aKey)
         return;
 
@@ -496,10 +497,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 - (void)didChangeValueForKey:(CPString)aKey
 {
     var superClass = [self class],
-    methodSelector = @selector(didChangeValueForKey:),
-    methodImp = class_getMethodImplementation(superClass, methodSelector);
+        methodSelector = @selector(didChangeValueForKey:),
+        methodImp = class_getMethodImplementation(superClass, methodSelector);
+
     methodImp(self, methodSelector, aKey);
-    
+
     if (!aKey)
         return;
 
@@ -509,10 +511,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 - (void)willChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey
 {
     var superClass = [self class],
-    methodSelector = @selector(willChange:valuesAtIndexes:forKey:),
-    methodImp = class_getMethodImplementation(superClass, methodSelector);
+        methodSelector = @selector(willChange:valuesAtIndexes:forKey:),
+        methodImp = class_getMethodImplementation(superClass, methodSelector);
+
     methodImp(self, methodSelector, change, indexes, aKey);
-    
+
     if (!aKey)
         return;
 
@@ -524,10 +527,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld,
 - (void)didChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey
 {
     var superClass = [self class],
-    methodSelector = @selector(didChange:valuesAtIndexes:forKey:),
-    methodImp = class_getMethodImplementation(superClass, methodSelector);
+        methodSelector = @selector(didChange:valuesAtIndexes:forKey:),
+        methodImp = class_getMethodImplementation(superClass, methodSelector);
+
     methodImp(self, methodSelector, change, indexes, aKey);
-    
+
     if (!aKey)
         return;
 

From c43b80cb91e92d29b28d7378c8d63be543565c85 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Thu, 6 May 2010 12:41:01 -0700
Subject: [PATCH 078/175] Make mouse wheel events work in CPWebView in Firefox
 3+

---
 AppKit/CPWebView.j                         | 30 ++++++++++++++++++++--
 AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 17 +++++++-----
 2 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j
index d8c7dff81..9da31436e 100644
--- a/AppKit/CPWebView.j
+++ b/AppKit/CPWebView.j
@@ -171,7 +171,32 @@ CPWebViewScrollNative                           = 2;
     [self _resizeWebFrame];
 }
 
-- (BOOL)_resizeWebFrame
+- (void)_attachScrollEventIfNecessary
+{
+    if (_scrollMode !== CPWebViewScrollAppKit)
+        return;
+
+    var win = null;
+    try { win = [self DOMWindow]; } catch (e) {}
+
+    if (win && win.addEventListener)
+    {
+        var scrollEventHandler = function(anEvent)
+        {
+            var frameBounds = [self bounds],
+                frameCenter = CGPointMake(CGRectGetMidX(frameBounds), CGRectGetMidY(frameBounds)),
+                windowOrigin = [self convertPoint:frameCenter toView:nil],
+                globalOrigin = [[self window] convertBaseToBridge:windowOrigin];
+
+            anEvent._overrideLocation = globalOrigin;
+            [[[self window] platformWindow] scrollEvent:anEvent];
+        };
+
+        win.addEventListener("DOMMouseScroll", scrollEventHandler, false);
+    }
+}
+
+- (void)_resizeWebFrame
 {
     if (_scrollMode === CPWebViewScrollAppKit)
     {
@@ -320,7 +345,8 @@ CPWebViewScrollNative                           = 2;
 - (void)_finishedLoading
 {
     [self _resizeWebFrame];
-    
+    [self _attachScrollEventIfNecessary];
+
     [[CPNotificationCenter defaultCenter] postNotificationName:CPWebViewProgressFinishedNotification object:self];
 
     if ([_frameLoadDelegate respondsToSelector:@selector(webView:didFinishLoadForFrame:)])
diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
index 96c542885..a0b9403bb 100644
--- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
+++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
@@ -851,12 +851,13 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
     if(!aDOMEvent)
         aDOMEvent = window.event;
 
+    var location = nil;
     if (CPFeatureIsCompatible(CPJavaScriptMouseWheelValues_8_15))
     {
-        var x = 0.0,
-            y = 0.0,
+        var x = aDOMEvent._offsetX || 0.0,
+            y = aDOMEvent._offsetY || 0.0,
             element = aDOMEvent.target;
-        
+
         while (element.nodeType !== 1)
             element = element.parentNode;
 
@@ -870,11 +871,13 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
             } while (element = element.offsetParent);
         }
     
-        var location = _CGPointMake((x + ((aDOMEvent.clientX - 8) / 15)), (y + ((aDOMEvent.clientY - 8) / 15)));
+        location = _CGPointMake((x + ((aDOMEvent.clientX - 8) / 15)), (y + ((aDOMEvent.clientY - 8) / 15)));
     }
+    else if (aDOMEvent._overrideLocation)
+        location = aDOMEvent._overrideLocation;
     else
-        var location = _CGPointMake(aDOMEvent.clientX, aDOMEvent.clientY);
-        
+        location = _CGPointMake(aDOMEvent.clientX, aDOMEvent.clientY);
+
     var deltaX = 0.0,
         deltaY = 0.0,
         windowNumber = 0,
@@ -883,7 +886,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
                         (aDOMEvent.ctrlKey ? CPControlKeyMask : 0) | 
                         (aDOMEvent.altKey ? CPAlternateKeyMask : 0) | 
                         (aDOMEvent.metaKey ? CPCommandKeyMask : 0);
-          
+
     StopDOMEventPropagation = YES;
 
     var theWindow = [self hitTest:location];

From e5873caf04914adc991475e6908c391465fe00e7 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Fri, 7 May 2010 09:38:23 +0200
Subject: [PATCH 079/175] fixed a typo in objectValueForTableColumn:row:

---
 Tests/Manual/TableTest/AppController.j | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/Tests/Manual/TableTest/AppController.j b/Tests/Manual/TableTest/AppController.j
index ff2889de2..1e573389a 100644
--- a/Tests/Manual/TableTest/AppController.j
+++ b/Tests/Manual/TableTest/AppController.j
@@ -129,8 +129,7 @@ tableTestDragType = @"CPTableViewTestDragType";
 
 - (void)sourceList
 {
-
-    var window3 = [[CPWindow alloc] initWithContentRect:CGRectMake(450, 250, 200, 400) styleMask:CPTitledWindowMask | CPResizableWindowMask];
+    var window3 = [[CPWindow alloc] initWithContentRect:CGRectMake(450, 250, 500, 400) styleMask:CPTitledWindowMask | CPResizableWindowMask];
     
     tableView3 = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 500.0)];
 
@@ -150,6 +149,10 @@ tableTestDragType = @"CPTableViewTestDragType";
     [column setMinWidth:50.0];
     [column setEditable:YES];
     [tableView3 addTableColumn:column];
+    
+    var column = [[CPTableColumn alloc] initWithIdentifier:"sourcelist2"];
+    [[column headerView] setStringValue:"Source List 2"];
+    [tableView3 addTableColumn:column];
 
     var scrollView3 = [[CPScrollView alloc] initWithFrame:[[window3 contentView] bounds]];
     [tableView3 setRowHeight:32.0];
@@ -183,7 +186,7 @@ tableTestDragType = @"CPTableViewTestDragType";
     else if (aTableView === tableView2)
         return String(dataSet2[aRow]);
     else if(aTableView === tableView3)
-        return String(dataSet3[row]);
+        return String(dataSet3[aRow]);
 }
 
 - (void)tableView:(CPTableView)aTableView sortDescriptorsDidChange:(CPArray)oldDescriptors

From e68d70cf1d74901162df420711f4cf97787376fd Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Thu, 6 May 2010 12:41:01 -0700
Subject: [PATCH 080/175] Make mouse wheel events work in CPWebView in Firefox
 3+

---
 AppKit/CPWebView.j                         | 30 ++++++++++++++++++++--
 AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 17 +++++++-----
 2 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j
index d8c7dff81..9da31436e 100644
--- a/AppKit/CPWebView.j
+++ b/AppKit/CPWebView.j
@@ -171,7 +171,32 @@ CPWebViewScrollNative                           = 2;
     [self _resizeWebFrame];
 }
 
-- (BOOL)_resizeWebFrame
+- (void)_attachScrollEventIfNecessary
+{
+    if (_scrollMode !== CPWebViewScrollAppKit)
+        return;
+
+    var win = null;
+    try { win = [self DOMWindow]; } catch (e) {}
+
+    if (win && win.addEventListener)
+    {
+        var scrollEventHandler = function(anEvent)
+        {
+            var frameBounds = [self bounds],
+                frameCenter = CGPointMake(CGRectGetMidX(frameBounds), CGRectGetMidY(frameBounds)),
+                windowOrigin = [self convertPoint:frameCenter toView:nil],
+                globalOrigin = [[self window] convertBaseToBridge:windowOrigin];
+
+            anEvent._overrideLocation = globalOrigin;
+            [[[self window] platformWindow] scrollEvent:anEvent];
+        };
+
+        win.addEventListener("DOMMouseScroll", scrollEventHandler, false);
+    }
+}
+
+- (void)_resizeWebFrame
 {
     if (_scrollMode === CPWebViewScrollAppKit)
     {
@@ -320,7 +345,8 @@ CPWebViewScrollNative                           = 2;
 - (void)_finishedLoading
 {
     [self _resizeWebFrame];
-    
+    [self _attachScrollEventIfNecessary];
+
     [[CPNotificationCenter defaultCenter] postNotificationName:CPWebViewProgressFinishedNotification object:self];
 
     if ([_frameLoadDelegate respondsToSelector:@selector(webView:didFinishLoadForFrame:)])
diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
index 96c542885..a0b9403bb 100644
--- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
+++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j
@@ -851,12 +851,13 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
     if(!aDOMEvent)
         aDOMEvent = window.event;
 
+    var location = nil;
     if (CPFeatureIsCompatible(CPJavaScriptMouseWheelValues_8_15))
     {
-        var x = 0.0,
-            y = 0.0,
+        var x = aDOMEvent._offsetX || 0.0,
+            y = aDOMEvent._offsetY || 0.0,
             element = aDOMEvent.target;
-        
+
         while (element.nodeType !== 1)
             element = element.parentNode;
 
@@ -870,11 +871,13 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
             } while (element = element.offsetParent);
         }
     
-        var location = _CGPointMake((x + ((aDOMEvent.clientX - 8) / 15)), (y + ((aDOMEvent.clientY - 8) / 15)));
+        location = _CGPointMake((x + ((aDOMEvent.clientX - 8) / 15)), (y + ((aDOMEvent.clientY - 8) / 15)));
     }
+    else if (aDOMEvent._overrideLocation)
+        location = aDOMEvent._overrideLocation;
     else
-        var location = _CGPointMake(aDOMEvent.clientX, aDOMEvent.clientY);
-        
+        location = _CGPointMake(aDOMEvent.clientX, aDOMEvent.clientY);
+
     var deltaX = 0.0,
         deltaY = 0.0,
         windowNumber = 0,
@@ -883,7 +886,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
                         (aDOMEvent.ctrlKey ? CPControlKeyMask : 0) | 
                         (aDOMEvent.altKey ? CPAlternateKeyMask : 0) | 
                         (aDOMEvent.metaKey ? CPCommandKeyMask : 0);
-          
+
     StopDOMEventPropagation = YES;
 
     var theWindow = [self hitTest:location];

From 0d35b382822bcab1d787aec176893c85ad6596f2 Mon Sep 17 00:00:00 2001
From: cacaodev 
Date: Fri, 12 Mar 2010 13:51:33 +0100
Subject: [PATCH 081/175] CPOutlineView: Fix a bug where newly expanded items
 would have a white disclosure control.                In CPTableView, add a
 method for data view selection. Use it in CPOutlineView for disclosure
 selection and do not subclass the entire -selectRows:... method.             
   Darken disclosure control when pressed depending on the selected state.

---
 AppKit/CPOutlineView.j | 47 ++++++++++--------------------------------
 AppKit/CPTableView.j   | 22 ++++++++++----------
 2 files changed, 22 insertions(+), 47 deletions(-)

diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j
index 6711eba89..9b1738768 100644
--- a/AppKit/CPOutlineView.j
+++ b/AppKit/CPOutlineView.j
@@ -382,43 +382,14 @@ CPOutlineViewDropOnItemIndex = -1;
     return frame;
 }
 
-- (void)selectRowIndexes:(CPIndexSet)rows byExtendingSelection:(BOOL)shouldExtendSelection
+- (void)_performSelection:(BOOL)select forRow:(CPInteger)rowIndex context:(id)context
 {
-    // First un highlight the old disclosure controls   
-    var previousSelectedRows = [];
-    [[self selectedRowIndexes] getIndexes:previousSelectedRows maxCount:-1 inIndexRange:nil];
+    [super _performSelection:select forRow:rowIndex context:context];
     
-    var index = [previousSelectedRows count];
-    while (index--)
-    {
-        var rowIndex = previousSelectedRows[index],
-            item = [self itemAtRow:rowIndex];
+    var control = _disclosureControlsForRows[rowIndex],
+        selector = select ? @"setThemeState:" : @"unsetThemeState:";
         
-        if (![self isExpandable:item])
-            continue;
-        
-        var control = _disclosureControlsForRows[rowIndex];
-        [control setHighlighted:NO];
-    }
-    
-    [super selectRowIndexes:rows byExtendingSelection:shouldExtendSelection];
-    
-    // Now highlight the new disclosure controls
-    var selectedRows = [];
-        [rows getIndexes:selectedRows maxCount:-1 inIndexRange:nil];
-    
-        var index = [selectedRows count];
-    while (index--)
-    {
-        var rowIndex = selectedRows[index],
-            item = [self itemAtRow:rowIndex];
-        
-        if (![self isExpandable:item])
-            continue;
-        
-        var control = _disclosureControlsForRows[rowIndex];
-        [control setHighlighted:YES];
-    }
+    [control performSelector:CPSelectorFromString(selector) withObject:CPThemeStateSelected];
 }
 
 - (void)setDelegate:(id)aDelegate
@@ -619,6 +590,8 @@ CPOutlineViewDropOnItemIndex = -1;
         _disclosureControlsForRows[row] = control;
 
         [control setState:[self isItemExpanded:item] ? CPOnState : CPOffState];
+        var selector = [self isRowSelected:row] ? @"setThemeState:" : @"unsetThemeState:";
+        [control performSelector:CPSelectorFromString(selector) withObject:CPThemeStateSelected];
         [control setFrame:frame];
 
         [self addSubview:control];
@@ -1080,8 +1053,10 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
     CGContextAddLineToPoint(context, 0.0, 0.0);
 
     CGContextClosePath(context);
-
-    CGContextSetFillColor(context, [self isHighlighted] ? [CPColor whiteColor] : [CPColor grayColor]);
+    var isHighlighted = [self hasThemeState:CPThemeStateHighlighted];
+    var color = [self hasThemeState:CPThemeStateSelected] ? (isHighlighted ? [CPColor lightGrayColor] : [CPColor whiteColor]) : (isHighlighted ? [CPColor blackColor] : [CPColor grayColor]);
+    
+    CGContextSetFillColor(context, color);
     CGContextFillPath(context);
 }
 
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 1032d9cc8..3a589fdbb 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -817,22 +817,22 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 
         var count = deselectRows.length;
         while (count--)
-        {
-            var rowIndex = deselectRows[count];
-            var view = dataViewsInTableColumn[rowIndex];
-            [view unsetThemeState:CPThemeStateSelected];
-        }
-
+            [self _performSelection:NO forRow:deselectRows[count] context:dataViewsInTableColumn];
+        
         count = selectRows.length;
         while (count--)
-        {
-            var rowIndex = selectRows[count];
-            var view = dataViewsInTableColumn[rowIndex];
-            [view setThemeState:CPThemeStateSelected];
-        }
+            [self _performSelection:YES forRow:selectRows[count] context:dataViewsInTableColumn];
     }
 }
 
+- (void)_performSelection:(BOOL)select forRow:(CPInteger)rowIndex context:(id)context
+{
+    var view = context[rowIndex],
+        selector = select ? @"setThemeState:" : @"unsetThemeState:";
+
+    [view performSelector:CPSelectorFromString(selector) withObject:CPThemeStateSelected];
+}
+
 - (void)_updateHighlightWithOldColumns:(CPIndexSet)oldColumns newColumns:(CPIndexSet)newColumns
 {
     var firstExposedColumn = [_exposedColumns firstIndex],

From e5275514ddb66029b089c15ad6abed6d4de34e91 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Tue, 11 May 2010 00:05:12 -0500
Subject: [PATCH 082/175] OutlineView items auto expand when hovering over
 them.

---
 AppKit/CPOutlineView.j | 34 ++++++++++++++++++++++++++++++++++
 AppKit/CPTableView.j   | 26 ++++++++++++++++++++++++--
 2 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j
index 9b1738768..7c396f1f9 100644
--- a/AppKit/CPOutlineView.j
+++ b/AppKit/CPOutlineView.j
@@ -85,6 +85,8 @@ CPOutlineViewDropOnItemIndex = -1;
     
     BOOL            _shouldRetargetChildIndex;
     CPInteger       _retargedChildIndex;
+    CPTimer         _dragHoverTimer;
+    id              _dropItem;
 }
 
 - (id)initWithFrame:(CGRect)aFrame
@@ -108,6 +110,7 @@ CPOutlineViewDropOnItemIndex = -1;
         
         _retargedChildIndex = nil;
         _shouldRetargetChildIndex = NO;
+        _startHoverTime = nil;
 
         [self setIndentationPerLevel:16.0];
         [self setIndentationMarkerFollowsDataView:YES];
@@ -505,6 +508,29 @@ CPOutlineViewDropOnItemIndex = -1;
 
 - (void)setDropItem:(id)theItem dropChildIndex:(int)theIndex
 {
+    if (_dropItem !== theItem && theIndex < 0 && [self isExpandable:theItem] && ![self isItemExpanded:theItem])
+    {
+        if (_dragHoverTimer)
+            [_dragHoverTimer invalidate];
+
+        var autoExpandCallBack = function(){
+            if (_dropItem)
+            {
+                [_dropOperationFeedbackView blink];
+                [CPTimer scheduledTimerWithTimeInterval:.3 callback:objj_msgSend(self, "expandItem:", _dropItem) repeats:NO]; //[self expandItem:_dropItem];
+            }
+        }
+
+        _dragHoverTimer = [CPTimer scheduledTimerWithTimeInterval:.8 callback:autoExpandCallBack repeats:NO];
+    }
+
+    if (theIndex >= 0)
+    {
+        [_dragHoverTimer invalidate];
+        _dragHoverTimer = nil;
+    }
+
+    _dropItem = theItem;
     _retargetedItem = theItem;
     _shouldRetargetItem = YES;
     
@@ -512,6 +538,14 @@ CPOutlineViewDropOnItemIndex = -1;
     _shouldRetargetChildIndex = YES;
 }
 
+- (void)_draggingEnded
+{
+    [super _draggingEnded];
+    _dropItem = nil;
+    [_dragHoverTimer invalidate];
+    _dragHoverTimer = nil;
+}
+
 - (id)_parentItemForUpperRow:(int)theUpperRowIndex andLowerRow:(int)theLowerRowIndex atMouseOffset:(CPPoint)theOffset
 {
     if (_shouldRetargetItem)
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 3a589fdbb..130d50b28 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -3299,11 +3299,12 @@ var CPTableViewDataSourceKey                = @"CPTableViewDataSourceKey",
     unsigned    dropOperation @accessors;
     CPTableView tableView @accessors;
     int         currentRow @accessors;
+    BOOL        isBlinking @accessors;
 }
 
 - (void)drawRect:(CGRect)aRect
 {
-    if(tableView._destinationDragStyle === CPTableViewDraggingDestinationFeedbackStyleNone)
+    if(tableView._destinationDragStyle === CPTableViewDraggingDestinationFeedbackStyleNone || isBlinking)
         return;
     
     var context = [[CPGraphicsContext currentContext] graphicsPort];
@@ -3369,7 +3370,28 @@ var CPTableViewDataSourceKey                = @"CPTableViewDataSourceKey",
         CGContextStrokePath(context);
         //CGContextStrokeLineSegments(context, [aRect.origin.x + 8,  aRect.origin.y + 8, 300 , aRect.origin.y + 8]);
     }
-        
+}
 
+- (void)blink
+{
+    if (dropOperation !== CPTableViewDropOn)
+        return;
+
+    isBlinking = YES;
+
+    var showCallback = function() {
+        objj_msgSend(self, "setHidden:", NO)
+        isBlinking = NO;
+    }
+
+    var hideCallback = function() {
+        objj_msgSend(self, "setHidden:", YES)
+        isBlinking = YES;
+    }
+
+    objj_msgSend(self, "setHidden:", YES);
+    [CPTimer scheduledTimerWithTimeInterval:0.1 callback:showCallback repeats:NO];
+    [CPTimer scheduledTimerWithTimeInterval:0.19 callback:hideCallback repeats:NO];
+    [CPTimer scheduledTimerWithTimeInterval:0.27 callback:showCallback repeats:NO];
 }
 @end

From 5b518797d7679d33bbf04bb3dc56e774d9128261 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Tue, 11 May 2010 00:18:05 -0500
Subject: [PATCH 083/175] fixed CPTableView moveColumn:

Conflicts:

	AppKit/CPTableView.j
---
 AppKit/CPTableView.j | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 130d50b28..b3c6add2a 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -691,15 +691,38 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     else
         _dirtyTableColumnRangeIndex = MIN(fromIndex, toIndex, _dirtyTableColumnRangeIndex);
 
-    if (toIndex > fromIndex)
-        --toIndex;
-
     var tableColumn = _tableColumns[fromIndex];
 
     [_tableColumns removeObjectAtIndex:fromIndex];
     [_tableColumns insertObject:tableColumn atIndex:toIndex];
+    
+    [[self headerView] setNeedsLayout];
+    [[self headerView] setNeedsDisplay:YES];
 
-    [self setNeedsLayout];
+    var rowIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [self numberOfRows])],
+        columnIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(fromIndex, toIndex)];
+        
+    [self reloadDataForRowIndexes:rowIndexes columnIndexes:columnIndexes];
+    // [self setNeedsLayout];
+}
+
+/*!
+    @ignore
+*/
+- (void)_tableColumnVisibilityDidChange:(CPTableColumn)aColumn
+{
+    var columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:aColumn];
+    
+    if (_dirtyTableColumnRangeIndex < 0)
+        _dirtyTableColumnRangeIndex = columnIndex;
+    else
+        _dirtyTableColumnRangeIndex = MIN(columnIndex, _dirtyTableColumnRangeIndex);
+    
+    [[self headerView] setNeedsLayout];
+    [[self headerView] setNeedsDisplay:YES];
+    
+    var rowIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [self numberOfRows])];
+    [self reloadDataForRowIndexes:rowIndexes columnIndexes:[CPIndexSet indexSetWithIndex:columnIndex]];
 }
 
 - (CPArray)tableColumns

From 8b168e76af1a0a317aa4de0cc2ef5df4ef40a28b Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Fri, 30 Apr 2010 00:14:59 +0200
Subject: [PATCH 084/175] refactored CPTableHeaderView mouse interaction

---
 AppKit/CPTableHeaderView.j | 458 +++++++++++++++++++++++++++++--------
 1 file changed, 365 insertions(+), 93 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 8d8d3b9ec..8087a6724 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -147,13 +147,24 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 @implementation CPTableHeaderView : CPView
 {
-    int _resizedColumn @accessors(readonly, property=resizedColumn);
-    int _draggedColumn @accessors(readonly, property=draggedColumn);
-    int _pressedColumn @accessors(readonly, property=pressedColumn);
+    CPPoint                 _previousTrackingLocation;
+    int                     _activeColumn;
+    int                     _pressedColumn;
     
-    float _draggedDistance @accessors(readonly, property=draggedDistance);
-    float _lastLocation;
-    float _columnOldWidth;
+    BOOL                    _isResizing;
+    BOOL                    _isTrackingColumn;
+    
+    // CPPoint             _previousTrackingLocation;
+    // 
+    // int                 _resizedColumn @accessors(readonly, property=resizedColumn);
+    // int                 _draggedColumn @accessors(readonly, property=draggedColumn);
+    // int                 _pressedColumn @accessors(readonly, property=pressedColumn);
+    // int                 _clickedColumn @accessors(readonly, property=clickedColumn);
+    // BOOL                _isTrackingColumn;
+    // 
+    // float               _draggedDistance @accessors(readonly, property=draggedDistance);
+    // float               _lastLocation;
+    // float               _columnOldWidth;
     
     CPTableView _tableView @accessors(property=tableView);
 }
@@ -162,7 +173,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     _resizedColumn = -1;
     _draggedColumn = -1;
-    _pressedColumn = -1;
+    _pressedColumn = CPNotFound;
     _draggedDistance = 0.0;
     _lastLocation = nil;
     _columnOldWidth = nil;
@@ -182,7 +193,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (int)columnAtPoint:(CGPoint)aPoint
 {
-    return [_tableView columnAtPoint:CGPointMake(aPoint.x, 0)];
+    return [_tableView columnAtPoint:CGPointMake(aPoint.x, aPoint.y)];
 }
 
 - (CGRect)headerRectOfColumn:(int)aColumnIndex
@@ -236,104 +247,365 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)mouseDown:(CPEvent)theEvent
 {
-    var mouseLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil],
-        clickedColumn = [self columnAtPoint:mouseLocation];    
-    
-    // should we send column -1 ?
-    [_tableView _sendDelegateDidMouseDownInHeader:clickedColumn];
-    
-    var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
-        resizedColumn = [self columnAtPoint:resizeLocation];
-    
-    if (resizedColumn == -1)
-        return;
-
-    // 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
-    if ([_tableView allowsColumnResizing]
-        && CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
-    {
-        _resizedColumn = resizedColumn;
-        [_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
-        [_tableView setDisableAutomaticResizing:YES];
-        [self trackResizeWithEvent:theEvent];
-    }
-    else
-    {
-        [self _setPressedColumn:clickedColumn];
-        [self trackMouseWithEvent:theEvent];
-    }    
+    [self trackMouse:theEvent];
 }
 
-- (void)trackMouseWithEvent:(CPEvent)theEvent
+- (void)trackMouse:(CPEvent)theEvent
 {
-    var type = [theEvent type];
+    var type = [theEvent type],
+        currentLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil];
     
-    if (type == CPLeftMouseUp)
-    {
-        var location = [self convertPoint:[theEvent locationInWindow] fromView:nil],
-            clickedColumn = [self columnAtPoint:location];
+    // Take the right columns resize tracking area into account
+    currentLocation.x -= 5.0;
 
-        [self _setPressedColumn:-1];
+    var columnIndex = [self columnAtPoint:currentLocation],
+        shouldResize = [self shouldResizeTableColumn:columnIndex at:CPPointMake(currentLocation.x + 5.0, currentLocation.y)];
         
-        if (clickedColumn != -1)
-            [_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
-        
-        return;
-    }
-
-    [CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
-}
-
-- (void)trackResizeWithEvent:(CPEvent)anEvent
-{
-    var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
-        tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
-        type = [anEvent type];
-
-    if (_lastLocation == nil)
-        _lastLocation = location;
-
-    if (_columnOldWidth == nil)
-        _columnOldWidth = [tableColumn width];
-
     if (type === CPLeftMouseUp)
-    {   
-        [self _updateResizeCursor:anEvent];
-                
-        [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
-        [tableColumn setDisableResizingPosting:NO];        
-        [_tableView setDisableAutomaticResizing:NO];
-
-        _resizedColumn = -1;
-        _lastLocation = nil;
-        _columnOldWidth = nil;
-
-        return;
-    }            
-    else if (type === CPLeftMouseDragged)
     {
-        var newWidth = [tableColumn width] + location.x - _lastLocation.x;
-        
-        if (newWidth < [tableColumn minWidth])
-            [[CPCursor resizeRightCursor] set];
-        else if (newWidth > [tableColumn maxWidth])
-            [[CPCursor resizeLeftCursor] set];
+        if (shouldResize)
+            [self stopResizingTableColumn:_activeColumn at:currentLocation];
+        else if ([self _shouldStopTrackingTableColumn:columnIndex at:currentLocation])
+        {
+            [[self tableView] _didClickTableColumn:columnIndex modifierFlags:[theEvent modifierFlags]];
+            [self stopTrackingTableColumn:columnIndex at:currentLocation];
+            
+            _isTrackingColumn = NO;
+        }
+
+        _activeColumn = CPNotFound;
+        return;
+    }
+
+    if (type === CPLeftMouseDown)
+    {
+        _activeColumn = columnIndex;
+
+        [[self tableView] _sendDelegateDidMouseDownInHeader:columnIndex];
+
+        if (shouldResize)
+            [self startResizingTableColumn:columnIndex at:currentLocation];
         else
         {
-            _tableView._lastColumnShouldSnap = NO;
-            [tableColumn setWidth:newWidth];
-            // FIXME: there has to be a better way to do this...
-            // We should refactor the auto resizing crap.
-            // We need to figure out the exact cocoa behavior here though. 
-            _lastLocation = location;
-
-            [[CPCursor resizeLeftRightCursor] set];
-            [self setNeedsLayout];
-            [self setNeedsDisplay:YES];
+            [self startTrackingTableColumn:columnIndex at:currentLocation];
+            _isTrackingColumn = YES;
         }
     }
+    else if (type === CPLeftMouseDragged)
+    {        
+        if (shouldResize)
+            [self continueResizingTableColumn:_activeColumn at:currentLocation];
+        else
+        {
+            if (_activeColumn === columnIndex && CPRectContainsPoint([self headerRectOfColumn:columnIndex], currentLocation))
+            {
+                if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+                    [self continueTrackingTableColumn:columnIndex at:currentLocation];
+                else
+                    [self startTrackingTableColumn:columnIndex at:currentLocation];
+            } else if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+                [self stopTrackingTableColumn:_activeColumn at:currentLocation];
+        }
+    }
+    
+    _previousTrackingLocation = currentLocation;
+    [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
+}
 
-    [CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
+/*!
+    @ignore
+    Determines if the header view should finish the column tracking
+    Returns YES if the receiver is in a tracking session, the active column is equal to the hovered column
+    and the header rect of the column contains the current mouse location
+*/
+- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return _isTrackingColumn && _activeColumn === aColumnIndex && 
+        CPRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint);
+}
+
+- (void)startTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"startTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    [self _setPressedColumn:aColumnIndex];
+}
+
+- (void)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{    
+    CPLog.debug(@"continueTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+}
+
+- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"stopTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    [self _setPressedColumn:CPNotFound];
+}
+
+/*!
+    @ignore
+    Determines if the table column should be resized
+    Returns YES if the receiver is already resizing a column or when the tableview allows 
+    resizing and the point is in the resize rect of the column
+*/
+- (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    if (_isResizing)
+        return YES;
+        
+    if (_isTrackingColumn)
+        return NO;
+
+    return [[self tableView] allowsColumnResizing] && CPRectContainsPoint([self _cursorRectForColumn:aColumnIndex], aPoint);
+}
+
+- (void)startResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    _isResizing = YES;
+    
+    CPLog.debug(@"startResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    
+    [tableColumn setDisableResizingPosting:YES];
+    [[self tableView] setDisableAutomaticResizing:YES];
+    
+    _resizedColumn = aColumnIndex;
+}
+
+- (void)continueResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"continueResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    
+    var newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
+    
+    if (newWidth < [tableColumn minWidth])
+        [[CPCursor resizeRightCursor] set];
+    else if (newWidth > [tableColumn maxWidth])
+        [[CPCursor resizeLeftCursor] set];
+    else
+    {
+        [self tableView]._lastColumnShouldSnap = NO;
+        [tableColumn setWidth:newWidth];
+        
+        [[CPCursor resizeLeftRightCursor] set];
+        [self setNeedsLayout];
+        [self setNeedsDisplay:YES];
+    }
+}
+
+- (void)stopResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    CPLog.debug(@"stopResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    // [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
+    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
+    [tableColumn setDisableResizingPosting:NO];
+    [[self tableView] setDisableAutomaticResizing:NO];
+    
+    _isResizing = NO;
+}
+
+// - (void)resizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
+// {
+//     var tableColumn = [[[self tableColumn] tableColumns] objectAtIndex:aColumnIndex];
+//     
+//     if (isMouseUp)
+//     {
+//         [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
+//         
+//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
+//         [tableColumn setDisableResizingPosting:NO];
+//         [[self tableView] setDisableAutomaticResizing:NO];
+//     }
+//     else
+//     {
+//         var newWidth = [tableColumn width] + location - _lastLocation.x;
+//         
+//         if (newWidth < [tableColumn minWidth])
+//             [[CPCursor resizeRightCursor] set];
+//         else if (newWidth > [tableColumn maxWidth])
+//             [[CPCursor resizeLeftCursor] set];
+//         else
+//         {
+//             [self tableView]._lastColumnShouldSnap = NO;
+//             [tableColumn setWidth:newWidth];
+//             
+//             [[CPCursor resizeLeftRightCursor] set];
+//             [self setNeedsLayout];
+//             [self setNeedsDisplay:YES];
+//         }
+//     }
+// }
+
+
+// - (BOOL)startTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
+// {
+//     [self _setPressedColumn:aColumnIndex];
+//     
+//     return YES;
+    
+    // var resizeLocation = CPPointMake(aPoint.x - 5.0, aPoint.y);
+    // 
+    // if ([self shouldResizeTableColumn:aColumnIndex at:aPoint])
+    // {
+    //     _resizedColumn = aColumnIndex;
+    //     [[[[self tableView] tableColumns] objectAtIndex:_resizedColumn] setDisableResizingPosting:YES];
+    //     [[self tableView] setDisableAutomaticResizing:YES];
+    //     
+    //     // // Use point :)
+    //     // [self trackResizeWithEvent:[CPApp currentEvent]];
+    //     // return NO;
+    // }
+    // 
+    // 
+    // return YES;
+    
+    // _clickedColumn = [self columnAtPoint:mouseLocation];    
+    //     
+    //     // should we send column -1 ?
+    //     [_tableView _sendDelegateDidMouseDownInHeader:_clickedColumn];
+    //     
+    //     var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
+    //         resizedColumn = [self columnAtPoint:resizeLocation];
+    //     
+    //     if (resizedColumn == -1)
+    //         return;
+    // 
+    //     // 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
+    //     if ([_tableView allowsColumnResizing]
+    //         && CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
+    //     {
+    //         _resizedColumn = resizedColumn;
+    //         [_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
+    //         [_tableView setDisableAutomaticResizing:YES];
+    //         [self trackResizeWithEvent:theEvent];
+    //     }
+    //     else
+    //     {
+    //         [self _setPressedColumn:_clickedColumn];
+    //         [self trackMouseWithEvent:theEvent];
+    //     }
+}
+// 
+// - (BOOL)continueTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
+// {
+// }
+// 
+// - (void)stopTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint;
+// {
+//     [self _setPressedColumn:-1];
+// }
+
+
+
+// - (void)trackMouseWithEvent:(CPEvent)theEvent
+// {
+//     var type = [theEvent type],
+//         location = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+//     
+//     if (type === CPLeftMouseUp)
+//     {
+//         var clickedColumn = [self columnAtPoint:location],
+//             pressedColumn = _pressedColumn;
+//         
+//         [self _setPressedColumn:-1];
+//         
+//         if (pressedColumn === clickedColumn)        
+//             if (clickedColumn !== -1)
+//                 [_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
+//         
+//         return;
+//     }
+//     else if (type === CPLeftMouseDragged)
+//     {
+//         var hoveredColumn = [self columnAtPoint:location];
+//         
+//         CPLog.debug(@"hovered: %i pressed: %i", hoveredColumn, _pressedColumn);
+//         if (hoveredColumn === _clickedColumn)
+//             [self _setPressedColumn:_clickedColumn];
+//         else
+//             [self _setPressedColumn:-1]
+//     }
+//     //     CPLog.debug(@"...");
+//     //     
+//     //     var point = [self convertPoint:[theEvent locationInWindow] fromView:nil];
+//     //     
+//     //     var view = [[CPView alloc] initWithFrame:CPRectMake(0.0, 0.0, CPRectGetWidth([self bounds], CPRectGetHeight([[self tableView] bounds])))];
+//     //     [view setBackgroundColor:[CPColor greenColor]];
+//     //     var viewLocation = CPPointMake(point.x - CGRectGetWidth(bounds)/2, point.y - CGRectGetHeight(bounds)/2);
+//     //     
+//     //     [self dragView:view at:viewLocation offset:CPPointMakeZero() event:theEvent pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
+//     //     return;
+//     // }
+// 
+//     [CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
+// }
+
+// - (void)trackResizeWithEvent:(CPEvent)anEvent
+// {
+//     var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
+//         tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
+//         type = [anEvent type];
+// 
+//     if (_lastLocation == nil)
+//         _lastLocation = location;
+// 
+//     if (_columnOldWidth == nil)
+//         _columnOldWidth = [tableColumn width];
+// 
+//     if (type === CPLeftMouseUp)
+//     {   
+//         [self _updateResizeCursor:anEvent];
+//                 
+//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
+//         [tableColumn setDisableResizingPosting:NO];        
+//         [_tableView setDisableAutomaticResizing:NO];
+// 
+//         _resizedColumn = -1;
+//         _lastLocation = nil;
+//         _columnOldWidth = nil;
+// 
+//         return;
+//     }            
+//     else if (type === CPLeftMouseDragged)
+//     {
+//         var newWidth = [tableColumn width] + location.x - _lastLocation.x;
+//         
+//         if (newWidth < [tableColumn minWidth])
+//             [[CPCursor resizeRightCursor] set];
+//         else if (newWidth > [tableColumn maxWidth])
+//             [[CPCursor resizeLeftCursor] set];
+//         else
+//         {
+//             _tableView._lastColumnShouldSnap = NO;
+//             [tableColumn setWidth:newWidth];
+//             // FIXME: there has to be a better way to do this...
+//             // We should refactor the auto resizing crap.
+//             // We need to figure out the exact cocoa behavior here though. 
+//             _lastLocation = location;
+// 
+//             [[CPCursor resizeLeftRightCursor] set];
+//             [self setNeedsLayout];
+//             [self setNeedsDisplay:YES];
+//         }
+//     }
+// 
+//     [CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
+// }
+
+- (void)_updateResizeCursorForTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
+{
+    if (![[self tableView] allowsColumnResizing] || (isMouseUp && ![[self window] acceptsMouseMovedEvents]))
+    {
+        [[CPCursor arrowCursor] set];
+        return;
+    }
+    
+    
 }
 
 - (void)_updateResizeCursor:(CPEvent)theEvent

From fd9dac81229eeb6d17b450fb8a67379ebaa1ae3b Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Mon, 3 May 2010 11:10:45 +0200
Subject: [PATCH 085/175] - refactored mouse interaction - implemented basic
 column reordering

---
 AppKit/CPTableHeaderView.j | 255 +++++++++----------------------------
 1 file changed, 63 insertions(+), 192 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 8087a6724..b0b0db4d5 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -147,6 +147,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 @implementation CPTableHeaderView : CPView
 {
+    CPPoint                 _mouseDownLocation;
     CPPoint                 _previousTrackingLocation;
     int                     _activeColumn;
     int                     _pressedColumn;
@@ -279,6 +280,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
     if (type === CPLeftMouseDown)
     {
+        _mouseDownLocation = currentLocation;
         _activeColumn = columnIndex;
 
         [[self tableView] _sendDelegateDidMouseDownInHeader:columnIndex];
@@ -292,7 +294,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         }
     }
     else if (type === CPLeftMouseDragged)
-    {        
+    {
         if (shouldResize)
             [self continueResizingTableColumn:_activeColumn at:currentLocation];
         else
@@ -300,9 +302,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
             if (_activeColumn === columnIndex && CPRectContainsPoint([self headerRectOfColumn:columnIndex], currentLocation))
             {
                 if (_isTrackingColumn && _pressedColumn !== CPNotFound)
-                    [self continueTrackingTableColumn:columnIndex at:currentLocation];
-                else
+                {
+                    if (![self continueTrackingTableColumn:columnIndex at:currentLocation])
+                        return; // Stop tracking the column, because it's being dragged
+                } else
                     [self startTrackingTableColumn:columnIndex at:currentLocation];
+                    
             } else if (_isTrackingColumn && _pressedColumn !== CPNotFound)
                 [self stopTrackingTableColumn:_activeColumn at:currentLocation];
         }
@@ -330,9 +335,63 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [self _setPressedColumn:aColumnIndex];
 }
 
-- (void)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
+}
+
+- (BOOL)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {    
     CPLog.debug(@"continueTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
+    
+    if ([self _shouldDragTableColumn:aColumnIndex at:aPoint])
+    {
+        CPLog.debug(@"start drag");
+        
+        var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
+            columnRect = [self headerRectOfColumn:aColumnIndex],
+            // offset = CPSizeMake(_mouseDownLocation.x - aPoint.x, _mouseDownLocation.y);
+        
+        var frame = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([[self tableView] bounds])),
+            view = [[CPView alloc] initWithFrame:frame];
+            
+        [view setBackgroundColor:[CPColor greenColor]];
+        
+        [self dragView:view at:aPoint offset:CPSizeMake(0.0, 0.0) event:[CPApp currentEvent] 
+            pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
+            
+        return NO;
+    }
+    
+    return YES;
+}
+
+- (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
+{
+    var hoveredColumn = [self columnAtPoint:aPoint],
+    if (_activeColumn === hoveredColumn)
+        return;
+        
+    var columnRect = [self headerRectOfColumn:hoveredColumn],
+        columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
+    
+    if (_activeColumn < hoveredColumn && aPoint.x > columnCenterPoint.x)
+    {
+        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
+        _activeColumn = hoveredColumn;
+    }
+    else if (_activeColumn > hoveredColumn && aPoint.x < columnCenterPoint.x)
+    {
+        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
+        _activeColumn = hoveredColumn;
+    }
+}
+
+- (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
+{
+    CPLog.debug(@"draggedView view ended at: %@", CPStringFromPoint(aLocation));
+    
+    [self stopTrackingTableColumn:[self columnAtPoint:aLocation] at:aLocation];
 }
 
 - (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
@@ -409,194 +468,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     _isResizing = NO;
 }
 
-// - (void)resizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
-// {
-//     var tableColumn = [[[self tableColumn] tableColumns] objectAtIndex:aColumnIndex];
-//     
-//     if (isMouseUp)
-//     {
-//         [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
-//         
-//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
-//         [tableColumn setDisableResizingPosting:NO];
-//         [[self tableView] setDisableAutomaticResizing:NO];
-//     }
-//     else
-//     {
-//         var newWidth = [tableColumn width] + location - _lastLocation.x;
-//         
-//         if (newWidth < [tableColumn minWidth])
-//             [[CPCursor resizeRightCursor] set];
-//         else if (newWidth > [tableColumn maxWidth])
-//             [[CPCursor resizeLeftCursor] set];
-//         else
-//         {
-//             [self tableView]._lastColumnShouldSnap = NO;
-//             [tableColumn setWidth:newWidth];
-//             
-//             [[CPCursor resizeLeftRightCursor] set];
-//             [self setNeedsLayout];
-//             [self setNeedsDisplay:YES];
-//         }
-//     }
-// }
-
-
-// - (BOOL)startTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
-// {
-//     [self _setPressedColumn:aColumnIndex];
-//     
-//     return YES;
-    
-    // var resizeLocation = CPPointMake(aPoint.x - 5.0, aPoint.y);
-    // 
-    // if ([self shouldResizeTableColumn:aColumnIndex at:aPoint])
-    // {
-    //     _resizedColumn = aColumnIndex;
-    //     [[[[self tableView] tableColumns] objectAtIndex:_resizedColumn] setDisableResizingPosting:YES];
-    //     [[self tableView] setDisableAutomaticResizing:YES];
-    //     
-    //     // // Use point :)
-    //     // [self trackResizeWithEvent:[CPApp currentEvent]];
-    //     // return NO;
-    // }
-    // 
-    // 
-    // return YES;
-    
-    // _clickedColumn = [self columnAtPoint:mouseLocation];    
-    //     
-    //     // should we send column -1 ?
-    //     [_tableView _sendDelegateDidMouseDownInHeader:_clickedColumn];
-    //     
-    //     var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
-    //         resizedColumn = [self columnAtPoint:resizeLocation];
-    //     
-    //     if (resizedColumn == -1)
-    //         return;
-    // 
-    //     // 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
-    //     if ([_tableView allowsColumnResizing]
-    //         && CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
-    //     {
-    //         _resizedColumn = resizedColumn;
-    //         [_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
-    //         [_tableView setDisableAutomaticResizing:YES];
-    //         [self trackResizeWithEvent:theEvent];
-    //     }
-    //     else
-    //     {
-    //         [self _setPressedColumn:_clickedColumn];
-    //         [self trackMouseWithEvent:theEvent];
-    //     }
-}
-// 
-// - (BOOL)continueTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint
-// {
-// }
-// 
-// - (void)stopTrackingColumn:(int)aColumnIndex at:(CPPoint)aPoint;
-// {
-//     [self _setPressedColumn:-1];
-// }
-
-
-
-// - (void)trackMouseWithEvent:(CPEvent)theEvent
-// {
-//     var type = [theEvent type],
-//         location = [self convertPoint:[theEvent locationInWindow] fromView:nil];
-//     
-//     if (type === CPLeftMouseUp)
-//     {
-//         var clickedColumn = [self columnAtPoint:location],
-//             pressedColumn = _pressedColumn;
-//         
-//         [self _setPressedColumn:-1];
-//         
-//         if (pressedColumn === clickedColumn)        
-//             if (clickedColumn !== -1)
-//                 [_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
-//         
-//         return;
-//     }
-//     else if (type === CPLeftMouseDragged)
-//     {
-//         var hoveredColumn = [self columnAtPoint:location];
-//         
-//         CPLog.debug(@"hovered: %i pressed: %i", hoveredColumn, _pressedColumn);
-//         if (hoveredColumn === _clickedColumn)
-//             [self _setPressedColumn:_clickedColumn];
-//         else
-//             [self _setPressedColumn:-1]
-//     }
-//     //     CPLog.debug(@"...");
-//     //     
-//     //     var point = [self convertPoint:[theEvent locationInWindow] fromView:nil];
-//     //     
-//     //     var view = [[CPView alloc] initWithFrame:CPRectMake(0.0, 0.0, CPRectGetWidth([self bounds], CPRectGetHeight([[self tableView] bounds])))];
-//     //     [view setBackgroundColor:[CPColor greenColor]];
-//     //     var viewLocation = CPPointMake(point.x - CGRectGetWidth(bounds)/2, point.y - CGRectGetHeight(bounds)/2);
-//     //     
-//     //     [self dragView:view at:viewLocation offset:CPPointMakeZero() event:theEvent pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
-//     //     return;
-//     // }
-// 
-//     [CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
-// }
-
-// - (void)trackResizeWithEvent:(CPEvent)anEvent
-// {
-//     var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
-//         tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
-//         type = [anEvent type];
-// 
-//     if (_lastLocation == nil)
-//         _lastLocation = location;
-// 
-//     if (_columnOldWidth == nil)
-//         _columnOldWidth = [tableColumn width];
-// 
-//     if (type === CPLeftMouseUp)
-//     {   
-//         [self _updateResizeCursor:anEvent];
-//                 
-//         [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
-//         [tableColumn setDisableResizingPosting:NO];        
-//         [_tableView setDisableAutomaticResizing:NO];
-// 
-//         _resizedColumn = -1;
-//         _lastLocation = nil;
-//         _columnOldWidth = nil;
-// 
-//         return;
-//     }            
-//     else if (type === CPLeftMouseDragged)
-//     {
-//         var newWidth = [tableColumn width] + location.x - _lastLocation.x;
-//         
-//         if (newWidth < [tableColumn minWidth])
-//             [[CPCursor resizeRightCursor] set];
-//         else if (newWidth > [tableColumn maxWidth])
-//             [[CPCursor resizeLeftCursor] set];
-//         else
-//         {
-//             _tableView._lastColumnShouldSnap = NO;
-//             [tableColumn setWidth:newWidth];
-//             // FIXME: there has to be a better way to do this...
-//             // We should refactor the auto resizing crap.
-//             // We need to figure out the exact cocoa behavior here though. 
-//             _lastLocation = location;
-// 
-//             [[CPCursor resizeLeftRightCursor] set];
-//             [self setNeedsLayout];
-//             [self setNeedsDisplay:YES];
-//         }
-//     }
-// 
-//     [CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
-// }
-
 - (void)_updateResizeCursorForTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
 {
     if (![[self tableView] allowsColumnResizing] || (isMouseUp && ![[self window] acceptsMouseMovedEvents]))

From dca66f300db7004907d072371f2ab74f3bce808a Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Mon, 3 May 2010 14:42:52 +0200
Subject: [PATCH 086/175] - gave the drag column a proper 'image'
 representation - constrained the drags y coordinates - made sure a drag is
 never out of bounds

---
 AppKit/CPTableHeaderView.j | 42 ++++++++++++++++++++++++------
 AppKit/CPTableView.j       | 53 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 86 insertions(+), 9 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index b0b0db4d5..6e33d0483 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -349,15 +349,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         CPLog.debug(@"start drag");
         
         var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
-            columnRect = [self headerRectOfColumn:aColumnIndex],
-            // offset = CPSizeMake(_mouseDownLocation.x - aPoint.x, _mouseDownLocation.y);
+            columnRect = [self headerRectOfColumn:aColumnIndex];
         
-        var frame = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([[self tableView] bounds])),
-            view = [[CPView alloc] initWithFrame:frame];
-            
-        [view setBackgroundColor:[CPColor greenColor]];
+        var offset = CPPointMakeZero(),
+            view = [[self tableView] dragViewForTableColumns:[tableColumn] event:[CPApp currentEvent] offset:offset],
+            viewLocation = CPPointMakeZero();
         
-        [self dragView:view at:aPoint offset:CPSizeMake(0.0, 0.0) event:[CPApp currentEvent] 
+        viewLocation.x = ( CPRectGetMinX(columnRect) + offset.x ) + ( aPoint.x - _mouseDownLocation.x );
+        viewLocation.y = CPRectGetMinY(columnRect) + offset.y;
+        
+        [view setAlphaValue:0.7];
+        
+        [self dragView:view at:viewLocation offset:CPSizeMakeZero() event:[CPApp currentEvent] 
             pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
             
         return NO;
@@ -366,10 +369,33 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     return YES;
 }
 
+- (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
+{
+    var tableColumns = [[self tableView] tableColumns],
+        lastColumnRect = [self headerRectOfColumn:[tableColumns indexOfObjectIdenticalTo:[tableColumns lastObject]]],
+        dragWindow = [theDragView window],
+        frame = [dragWindow frame];
+    
+    // Because the drag window is as wide as the entire tableview, it's start origin is always 0.0
+    // The minimal x coordinate is the minimal dragged table columns negated x value 
+    var minimumX = -(CPRectGetMinX([self headerRectOfColumn:_activeColumn]))
+        maximumX = CPRectGetMinX(lastColumnRect);
+        
+    // This effectively clamps the value between the minimal and maximum
+    // frame.origin.x = MAX(minimumX, MIN(CPRectGetMinX(frame), maximumX));
+    
+    // Make sure the column cannot move vertically
+    frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
+    
+    [dragWindow setFrame:frame];
+}
+
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
 {
+    [self _constrainDragView:aView at:aPoint];
+    
     var hoveredColumn = [self columnAtPoint:aPoint],
-    if (_activeColumn === hoveredColumn)
+    if (hoveredColumn === -1 || _activeColumn === hoveredColumn)
         return;
         
     var columnRect = [self headerRectOfColumn:hoveredColumn],
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index b3c6add2a..11a6cab8f 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1803,7 +1803,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return [[CPImage alloc] initWithContentsOfFile:@"Frameworks/AppKit/Resources/GenericFile.png" size:CGSizeMake(32,32)];
 }
 
-- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)theDraggedRows tableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPoint)dragViewOffset
+- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)theDraggedRows tableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPointPointer)dragViewOffset
 {
     var bounds = [self bounds],
         view = [[CPView alloc] initWithFrame:bounds];
@@ -1839,6 +1839,57 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return view;
 }
 
+- (CPView)dragViewForTableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPointPointer)theDragViewOffset
+{
+    var bounds = CPRectMake(0.0, 0.0, 0.0, CPRectGetHeight([self bounds]) + 23.0);
+        index = [theTableColumns count],
+        dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
+    
+    // Fetch all the data views for the columns and visible rows
+    // After that copy these add them to a transparent drag view and use that drag view 
+    // to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
+    while (index--)
+    {
+        // Get the tablecolumn and create a rect with it's width so we can use CPRectUnion 
+        // to determine the end result
+        var tableColumn = [theTableColumns objectAtIndex:index],
+            columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:tableColumn];
+            columnRect = [self rectOfColumn:columnIndex],
+            headerView = [tableColumn headerView];
+        
+        // Add the column header view
+        columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:[headerView frame]];
+        [columnHeaderView setStringValue:[headerView stringValue]];
+        [columnHeaderView setThemeState:[headerView themeState]];
+        [dragView addSubview:columnHeaderView];
+            
+        bounds = CPRectUnion(bounds, columnRect);
+        
+        row = [_exposedRows firstIndex];
+        while (row !== CPNotFound)
+        {
+            var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
+                dataViewFrame = [self frameOfDataViewAtColumn:columnIndex row:row];
+                
+            // Offset by table header height to make room for the table header
+            dataViewFrame.origin.y += 23.0;
+            [dataView setFrame:dataViewFrame];
+            
+            [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
+            [dragView addSubview:dataView];
+            
+            row = [_exposedRows indexGreaterThanIndex:row];
+        }
+    }
+    
+    // The columns are placed in the drag window at their original locations resulting in the dragged column
+    // being of when started the drag, we compensate for this by offseting the drag window by the x coordinate of the column
+    theDragViewOffset.x -= columnRect.origin.x;
+    [dragView setFrame:bounds];
+    
+    return dragView;
+}
+
 - (void)setDraggingSourceOperationMask:(CPDragOperation)mask forLocal:(BOOL)isLocal
 {
     //ignoral local for the time being since only one capp app can run at a time...

From f7b766cc4a420347a84e9e7d982e085485c0cf81 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 12:06:06 +0200
Subject: [PATCH 087/175] - made the _dragViewForTableColumn:event:offset:
 method private - removed the multiple column support from
 _dragViewForTableColumn:event:offset: (Cocoa doesn't allow multiple column
 selection / dragging) - made the dragview the size of the dragged column

---
 AppKit/CPTableHeaderView.j | 12 ++----
 AppKit/CPTableView.j       | 77 +++++++++++++++++++-------------------
 2 files changed, 41 insertions(+), 48 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 6e33d0483..735b7bfcf 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -346,20 +346,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     
     if ([self _shouldDragTableColumn:aColumnIndex at:aPoint])
     {
-        CPLog.debug(@"start drag");
-        
-        var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
-            columnRect = [self headerRectOfColumn:aColumnIndex];
-        
-        var offset = CPPointMakeZero(),
-            view = [[self tableView] dragViewForTableColumns:[tableColumn] event:[CPApp currentEvent] offset:offset],
+        var columnRect = [self headerRectOfColumn:aColumnIndex],
+            offset = CPPointMakeZero(),
+            view = [[self tableView] _dragViewForColumn:aColumnIndex event:[CPApp currentEvent] offset:offset],
             viewLocation = CPPointMakeZero();
         
         viewLocation.x = ( CPRectGetMinX(columnRect) + offset.x ) + ( aPoint.x - _mouseDownLocation.x );
         viewLocation.y = CPRectGetMinY(columnRect) + offset.y;
         
-        [view setAlphaValue:0.7];
-        
         [self dragView:view at:viewLocation offset:CPSizeMakeZero() event:[CPApp currentEvent] 
             pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
             
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 11a6cab8f..f8d3f99dc 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1839,52 +1839,51 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return view;
 }
 
-- (CPView)dragViewForTableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPointPointer)theDragViewOffset
-{
-    var bounds = CPRectMake(0.0, 0.0, 0.0, CPRectGetHeight([self bounds]) + 23.0);
-        index = [theTableColumns count],
-        dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
-    
-    // Fetch all the data views for the columns and visible rows
-    // After that copy these add them to a transparent drag view and use that drag view 
+/*!
+    @ignore
+    // Fetches all the data views (from the datasource) for the column and it's visible rows
+    // Copy the dataviews add them to a transparent drag view and use that drag view 
     // to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
-    while (index--)
+*/
+- (CPView)_dragViewForColumn:(int)theColumnIndex event:(CPEvent)theDragEvent offset:(CPPointPointer)theDragViewOffset
+{
+    var dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
+        tableColumn = [[self tableColumns] objectAtIndex:theColumnIndex],
+        bounds = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([self bounds]) + 23.0),
+        columnRect = [self rectOfColumn:theColumnIndex],
+        headerView = [tableColumn headerView];
+    
+    // Add the column header view
+    var headerFrame = [headerView frame];
+    headerFrame.origin = CPPointMakeZero();
+    
+    columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:headerFrame];
+    [columnHeaderView setStringValue:[headerView stringValue]];
+    [columnHeaderView setThemeState:[headerView themeState]];
+    [dragView addSubview:columnHeaderView];
+    
+    row = [_exposedRows firstIndex];
+    while (row !== CPNotFound)
     {
-        // Get the tablecolumn and create a rect with it's width so we can use CPRectUnion 
-        // to determine the end result
-        var tableColumn = [theTableColumns objectAtIndex:index],
-            columnIndex = [[self tableColumns] indexOfObjectIdenticalTo:tableColumn];
-            columnRect = [self rectOfColumn:columnIndex],
-            headerView = [tableColumn headerView];
+        var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
+            dataViewFrame = [self frameOfDataViewAtColumn:theColumnIndex row:row];
+            
+        // Offset by table header height to make room for the table header
+        dataViewFrame.origin.x = 0.0;
+        dataViewFrame.origin.y += 23.0;
+        [dataView setFrame:dataViewFrame];
         
-        // Add the column header view
-        columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:[headerView frame]];
-        [columnHeaderView setStringValue:[headerView stringValue]];
-        [columnHeaderView setThemeState:[headerView themeState]];
-        [dragView addSubview:columnHeaderView];
-            
-        bounds = CPRectUnion(bounds, columnRect);
+        [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
+        [dragView addSubview:dataView];
         
-        row = [_exposedRows firstIndex];
-        while (row !== CPNotFound)
-        {
-            var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
-                dataViewFrame = [self frameOfDataViewAtColumn:columnIndex row:row];
-                
-            // Offset by table header height to make room for the table header
-            dataViewFrame.origin.y += 23.0;
-            [dataView setFrame:dataViewFrame];
-            
-            [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
-            [dragView addSubview:dataView];
-            
-            row = [_exposedRows indexGreaterThanIndex:row];
-        }
+        row = [_exposedRows indexGreaterThanIndex:row];
     }
     
     // The columns are placed in the drag window at their original locations resulting in the dragged column
-    // being of when started the drag, we compensate for this by offseting the drag window by the x coordinate of the column
-    theDragViewOffset.x -= columnRect.origin.x;
+    // being of when starting the drag, we compensate for this by offseting the drag window by the x coordinate of the column
+    // theDragViewOffset.x -= columnRect.origin.x;
+    
+    [dragView setAlphaValue:0.7];
     [dragView setFrame:bounds];
     
     return dragView;

From 256cc902ebf0b504185a9658520344fead7a4ff4 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 13:52:57 +0200
Subject: [PATCH 088/175] - switch columns when the dragged column is more than
 halfway over the previous/next column - constrain the horizontal coordinates
 within the header view

---
 AppKit/CPTableHeaderView.j | 104 +++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 57 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 735b7bfcf..140aacf23 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -317,33 +317,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
 }
 
-/*!
-    @ignore
-    Determines if the header view should finish the column tracking
-    Returns YES if the receiver is in a tracking session, the active column is equal to the hovered column
-    and the header rect of the column contains the current mouse location
-*/
-- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{
-    return _isTrackingColumn && _activeColumn === aColumnIndex && 
-        CPRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint);
-}
-
 - (void)startTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    CPLog.debug(@"startTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
     [self _setPressedColumn:aColumnIndex];
 }
 
-- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{
-    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
-}
-
 - (BOOL)continueTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{    
-    CPLog.debug(@"continueTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
+{
     if ([self _shouldDragTableColumn:aColumnIndex at:aPoint])
     {
         var columnRect = [self headerRectOfColumn:aColumnIndex],
@@ -363,20 +343,32 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     return YES;
 }
 
+- (BOOL)_shouldStopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return _isTrackingColumn && _activeColumn === aColumnIndex && 
+        CPRectContainsPoint([self headerRectOfColumn:aColumnIndex], aPoint);
+}
+
+- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    [self _setPressedColumn:CPNotFound];
+}
+
+- (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
+{
+    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
+}
+
 - (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
 {
     var tableColumns = [[self tableView] tableColumns],
         lastColumnRect = [self headerRectOfColumn:[tableColumns indexOfObjectIdenticalTo:[tableColumns lastObject]]],
+        activeColumnRect = [self headerRectOfColumn:_activeColumn];
         dragWindow = [theDragView window],
         frame = [dragWindow frame];
     
-    // Because the drag window is as wide as the entire tableview, it's start origin is always 0.0
-    // The minimal x coordinate is the minimal dragged table columns negated x value 
-    var minimumX = -(CPRectGetMinX([self headerRectOfColumn:_activeColumn]))
-        maximumX = CPRectGetMinX(lastColumnRect);
-        
-    // This effectively clamps the value between the minimal and maximum
-    // frame.origin.x = MAX(minimumX, MIN(CPRectGetMinX(frame), maximumX));
+    // This effectively clamps the value between the minimum and maximum
+    frame.origin.x = MAX(0.0, MIN(CPRectGetMinX(frame), CPRectGetMaxX(lastColumnRect) - CPRectGetWidth(activeColumnRect)));
     
     // Make sure the column cannot move vertically
     frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
@@ -384,48 +376,46 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [dragWindow setFrame:frame];
 }
 
+- (void)_moveColumn:(int)aFromIndex toColumn:(int)aToIndex
+{
+    [[self tableView] moveColumn:aFromIndex toColumn:aToIndex];
+    _activeColumn = aToIndex;
+    _pressedColumn = _activeColumn;
+}
+
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
 {
     [self _constrainDragView:aView at:aPoint];
     
-    var hoveredColumn = [self columnAtPoint:aPoint],
-    if (hoveredColumn === -1 || _activeColumn === hoveredColumn)
-        return;
-        
-    var columnRect = [self headerRectOfColumn:hoveredColumn],
-        columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
+    var dragWindowFrame = [[aView window] frame];
     
-    if (_activeColumn < hoveredColumn && aPoint.x > columnCenterPoint.x)
+    var hoverPoint = CPPointCreateCopy(aPoint);
+    if (aPoint.x < _previousTrackingLocation.x)
+        hoverPoint = CPPointMake(CPRectGetMinX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
+    else if (aPoint.x > _previousTrackingLocation.x)
+        hoverPoint = CPPointMake(CPRectGetMaxX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
+    
+    var hoveredColumn = [self columnAtPoint:hoverPoint],
+    
+    if (hoveredColumn !== -1)
     {
-        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
-        _activeColumn = hoveredColumn;
-    }
-    else if (_activeColumn > hoveredColumn && aPoint.x < columnCenterPoint.x)
-    {
-        [[self tableView] moveColumn:_activeColumn toColumn:hoveredColumn];
-        _activeColumn = hoveredColumn;
+        var columnRect = [self headerRectOfColumn:hoveredColumn],
+            columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
+    
+        if (hoveredColumn < _activeColumn && hoverPoint.x < columnCenterPoint.x)
+            [self _moveColumn:_activeColumn toColumn:hoveredColumn];
+        else if (hoveredColumn > _activeColumn && hoverPoint.x > columnCenterPoint.x)
+            [self _moveColumn:_activeColumn toColumn:hoveredColumn];
     }
+    
+    _previousTrackingLocation = aPoint;
 }
 
 - (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
 {
-    CPLog.debug(@"draggedView view ended at: %@", CPStringFromPoint(aLocation));
-    
-    [self stopTrackingTableColumn:[self columnAtPoint:aLocation] at:aLocation];
+    [self stopTrackingTableColumn:_activeColumn at:aLocation];
 }
 
-- (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
-{
-    CPLog.debug(@"stopTrackingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    [self _setPressedColumn:CPNotFound];
-}
-
-/*!
-    @ignore
-    Determines if the table column should be resized
-    Returns YES if the receiver is already resizing a column or when the tableview allows 
-    resizing and the point is in the resize rect of the column
-*/
 - (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
     if (_isResizing)

From 983f0a92b2d87523052344bc5ff127fc48784a55 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Tue, 11 May 2010 00:25:19 -0500
Subject: [PATCH 089/175] - fixed a out of bounds error when clicking in the
 table header outside of any column - made the dragged table column appear
 gray - gave the tablecolumn drag view a white background

Conflicts:

	AppKit/CPTableView.j
---
 AppKit/CPTableHeaderView.j | 50 +++++++++++++++++++++-----------------
 AppKit/CPTableView.j       | 38 ++++++++++++++++++++++++-----
 2 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 140aacf23..3d467997d 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -26,7 +26,7 @@
  
 @implementation _CPTableColumnHeaderView : CPView
 {
-    _CPImageAndTextView _textField;
+    _CPImageAndTextView     _textField;
 }
 
 - (void)initWithFrame:(CGRect)frame
@@ -153,6 +153,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     int                     _pressedColumn;
     
     BOOL                    _isResizing;
+    BOOL                    _isDragging;
     BOOL                    _isTrackingColumn;
     
     // CPPoint             _previousTrackingLocation;
@@ -280,6 +281,9 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
     if (type === CPLeftMouseDown)
     {
+        if (columnIndex === -1)
+            return;
+        
         _mouseDownLocation = currentLocation;
         _activeColumn = columnIndex;
 
@@ -381,6 +385,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [[self tableView] moveColumn:aFromIndex toColumn:aToIndex];
     _activeColumn = aToIndex;
     _pressedColumn = _activeColumn;
+    
+    [[self tableView] _setDraggedColumn:_activeColumn];
+}
+
+- (void)draggedView:(CPView)aView beganAt:(CPPoint)aPoint
+{
+    _isDragging = YES;
+    
+    [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:YES];
+    [[self tableView] _setDraggedColumn:_activeColumn];
+    
+    [self setNeedsDisplay:YES];
 }
 
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
@@ -413,7 +429,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
 {
+    _isDragging = NO;
+    
+    [[self tableView] _setDraggedColumn:-1];
+    [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
     [self stopTrackingTableColumn:_activeColumn at:aLocation];
+    
+    [self setNeedsDisplay:YES];
 }
 
 - (BOOL)shouldResizeTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
@@ -602,27 +624,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     
     CGContextClosePath(context);
     CGContextStrokePath(context);
-        
-/*
-    var maxY = CGRectGetMaxY([self bounds]);
-    // draw normal gradient for remaining space
-    if (supportsCanvasGradient)
+    
+    if (_isDragging)
     {
-        aRect.origin.x = columnMaxX - 0.5;
-        aRect.size.width -= columnMaxX;
-        CGContextBeginPath(context);
-        CGContextAddRect(context, CGRectMake(columnMaxX + 1, 0, CGRectGetMaxX([self bounds]) - columnMaxX, CGRectGetHeight([self bounds])));
-        CGContextClosePath(context);    
-        CGContextDrawLinearGradient(context, [_CPTableColumnHeaderView headerGradient], CGPointMake(0,0), CGPointMake(0, maxY - 1),0);
-    }   
-   
-    // Draw bottom line
-    CGContextBeginPath(context);    
-    CGContextMoveToPoint(context, 0, maxY - 0.5);
-    CGContextAddLineToPoint(context, CGRectGetMaxX([self bounds]), maxY - 0.5);
-    CGContextClosePath(context);
-    CGContextStrokePath(context);
-*/   
+        CGContextSetFillColor(context, [CPColor grayColor]);
+        CGContextFillRect(context, [self headerRectOfColumn:_activeColumn])
+    }
 }
 
 @end
@@ -649,4 +656,3 @@ var CPTableHeaderViewTableViewKey = @"CPTableHeaderViewTableViewKey";
 }
 
 @end
-
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index f8d3f99dc..73f4ab1f6 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -212,6 +212,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     CPGradient  _sourceListActiveGradient;
     CPColor     _sourceListActiveTopLineColor;
     CPColor     _sourceListActiveBottomLineColor;    
+    
+    int         _draggedColumnIndex;
+    
 /*
     CPGradient  _sourceListInactiveGradient;
     CPColor     _sourceListInactiveTopLineColor;
@@ -309,7 +312,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 
         if (!_cornerView)
             _cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))];
-
+        
+        _draggedColumnIndex = -1;
+        
         // Gradients for the source list
         _sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [89.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2);
         _sourceListActiveTopLineColor = [CPColor colorWithCalibratedRed:(61.0/255.0) green:(123.0/255.0) blue:(218.0/255.0) alpha:1.0];
@@ -672,6 +677,15 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     [self setNeedsLayout];
 }
 
+- (void)_setDraggedColumn:(int)aColumnIndex
+{
+    if (_draggedColumnIndex === aColumnIndex)
+        return;
+        
+    _draggedColumnIndex = aColumnIndex;
+    
+    [self reloadDataForRowIndexes:_exposedRows columnIndexes:[CPIndexSet indexSetWithIndex:aColumnIndex]];
+}
 
 /*!
     Moves the column and heading at a given index to a new given index.
@@ -703,7 +717,6 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         columnIndexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(fromIndex, toIndex)];
         
     [self reloadDataForRowIndexes:rowIndexes columnIndexes:columnIndexes];
-    // [self setNeedsLayout];
 }
 
 /*!
@@ -1849,7 +1862,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 {
     var dragView = [[CPView alloc] initWithFrame:CPRectMakeZero()];
         tableColumn = [[self tableColumns] objectAtIndex:theColumnIndex],
-        bounds = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([self bounds]) + 23.0),
+        bounds = CPRectMake(0.0, 0.0, [tableColumn width], CPRectGetHeight([self _exposedRect]) + 23.0),
         columnRect = [self rectOfColumn:theColumnIndex],
         headerView = [tableColumn headerView];
     
@@ -1883,6 +1896,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     // being of when starting the drag, we compensate for this by offseting the drag window by the x coordinate of the column
     // theDragViewOffset.x -= columnRect.origin.x;
     
+    [dragView setBackgroundColor:[CPColor whiteColor]];
     [dragView setAlphaValue:0.7];
     [dragView setFrame:bounds];
     
@@ -2129,8 +2143,12 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     for (; columnIndex < columnsCount; ++columnIndex)
     {
         var column = columnArray[columnIndex],
-            tableColumn = _tableColumns[column],
-            tableColumnUID = [tableColumn UID];
+            tableColumn = _tableColumns[column];
+            
+        if ([tableColumn isHidden] || columnIndex === _draggedColumnIndex)
+            continue;
+            
+        var tableColumnUID = [tableColumn UID];
 
         if (!_dataViewsForTableColumns[tableColumnUID])
             _dataViewsForTableColumns[tableColumnUID] = [];
@@ -2280,6 +2298,15 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     [self drawBackgroundInClipRect:exposedRect];
     [self drawGridInClipRect:exposedRect];
     [self highlightSelectionInClipRect:exposedRect];
+    
+    if (_draggedColumnIndex === -1)
+        return;
+        
+    var context = [[CPGraphicsContext currentContext] graphicsPort],
+        columnRect = [self rectOfColumn:_draggedColumnIndex];
+
+    CGContextSetFillColor(context, [CPColor grayColor]);
+    CGContextFillRect(context, columnRect);
 }
 
 - (void)drawBackgroundInClipRect:(CGRect)aRect
@@ -2287,7 +2314,6 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     if (!_usesAlternatingRowBackgroundColors)
         return;
 
-
     var rowColors = [self alternatingRowBackgroundColors],
         colorCount = [rowColors count];
 

From b8c7d6ea86c51de7b41aa507fd747fa61132574b Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 4 May 2010 15:54:13 +0200
Subject: [PATCH 090/175] some cleanup

---
 AppKit/CPTableHeaderView.j | 63 ++++++++++----------------------------
 1 file changed, 16 insertions(+), 47 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 3d467997d..d820c2e1e 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -156,29 +156,23 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     BOOL                    _isDragging;
     BOOL                    _isTrackingColumn;
     
-    // CPPoint             _previousTrackingLocation;
-    // 
-    // int                 _resizedColumn @accessors(readonly, property=resizedColumn);
-    // int                 _draggedColumn @accessors(readonly, property=draggedColumn);
-    // int                 _pressedColumn @accessors(readonly, property=pressedColumn);
-    // int                 _clickedColumn @accessors(readonly, property=clickedColumn);
-    // BOOL                _isTrackingColumn;
-    // 
-    // float               _draggedDistance @accessors(readonly, property=draggedDistance);
-    // float               _lastLocation;
-    // float               _columnOldWidth;
+    float                   _columnOldWidth;
     
-    CPTableView _tableView @accessors(property=tableView);
+    CPTableView             _tableView @accessors(property=tableView);
 }
 
 - (void)_init
 {
-    _resizedColumn = -1;
-    _draggedColumn = -1;
-    _pressedColumn = CPNotFound;
-    _draggedDistance = 0.0;
-    _lastLocation = nil;
-    _columnOldWidth = nil;
+    _mouseDownLocation = CPPointMakeZero();
+    _previousTrackingLocation = CPPointMakeZero();
+    _activeColumn = -1;
+    _pressedColumn = -1;
+    
+    _isResizing = NO;
+    _isDragging = NO;
+    _isTrackingColumn = NO;
+    
+    _columnOldWidth = 0.0;
 
     [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
 }
@@ -305,14 +299,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         {
             if (_activeColumn === columnIndex && CPRectContainsPoint([self headerRectOfColumn:columnIndex], currentLocation))
             {
-                if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+                if (_isTrackingColumn && _pressedColumn !== -1)
                 {
                     if (![self continueTrackingTableColumn:columnIndex at:currentLocation])
                         return; // Stop tracking the column, because it's being dragged
                 } else
                     [self startTrackingTableColumn:columnIndex at:currentLocation];
                     
-            } else if (_isTrackingColumn && _pressedColumn !== CPNotFound)
+            } else if (_isTrackingColumn && _pressedColumn !== -1)
                 [self stopTrackingTableColumn:_activeColumn at:currentLocation];
         }
     }
@@ -356,6 +350,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)stopTrackingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
     [self _setPressedColumn:CPNotFound];
+    [self _updateResizeCursor:[CPApp currentEvent]];
 }
 
 - (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
@@ -430,6 +425,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)draggedView:(CPImage)aView endedAt:(CGPoint)aLocation operation:(CPDragOperation)anOperation
 {
     _isDragging = NO;
+    _isTrackingColumn = NO; // We need to do this explicitly because the mouse up section of trackMouse is never reached
     
     [[self tableView] _setDraggedColumn:-1];
     [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
@@ -453,20 +449,14 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     _isResizing = YES;
     
-    CPLog.debug(@"startResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
     
     [tableColumn setDisableResizingPosting:YES];
     [[self tableView] setDisableAutomaticResizing:YES];
-    
-    _resizedColumn = aColumnIndex;
 }
 
 - (void)continueResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    CPLog.debug(@"continueResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
     
     var newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
@@ -488,10 +478,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)stopResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    CPLog.debug(@"stopResizingTableColumn: %@ at: %@", aColumnIndex, CPStringFromPoint(aPoint));
-    
-    // [self _updateResizeCursorForTableColumn:aColumnIndex at:aPoint];
-    
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
     [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
     [tableColumn setDisableResizingPosting:NO];
@@ -500,17 +486,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     _isResizing = NO;
 }
 
-- (void)_updateResizeCursorForTableColumn:(int)aColumnIndex at:(CPPoint)aPoint mouseIsUp:(BOOL)isMouseUp
-{
-    if (![[self tableView] allowsColumnResizing] || (isMouseUp && ![[self window] acceptsMouseMovedEvents]))
-    {
-        [[CPCursor arrowCursor] set];
-        return;
-    }
-    
-    
-}
-
 - (void)_updateResizeCursor:(CPEvent)theEvent
 {
     // never get stuck in resize cursor mode (FIXME take out when we turn on tracking rects)
@@ -540,12 +515,6 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         [[CPCursor arrowCursor] set];
 }
 
-- (void)viewDidMoveToWindow
-{
-    //if ([_tableView allowsColumnResizing])
-    //    [[self window] setAcceptsMouseMovedEvents:YES];
-}
-
 - (void)mouseEntered:(CPEvent)theEvent
 {   
     [self _updateResizeCursor:theEvent];

From d7432c376d1d6905c046fdf35e6f9de2b83b116d Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Wed, 5 May 2010 10:38:41 +0200
Subject: [PATCH 091/175] fixed a bug where column reordering would break when
 the last column was hidden

---
 AppKit/CPTableHeaderView.j | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index d820c2e1e..0c5b23a28 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -358,10 +358,26 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
 }
 
+- (CPRect)_headerRectOfLastVisibleColumn
+{
+    var tableColumns = [[self tableView] tableColumns],
+        columnIndex = [tableColumns count];
+        
+    while (columnIndex--)
+    {
+        var tableColumn = [tableColumns objectAtIndex:columnIndex];
+        
+        if (![tableColumn isHidden])
+            return [self headerRectOfColumn:columnIndex];
+    }
+    
+    return nil;
+}
+
 - (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
 {
     var tableColumns = [[self tableView] tableColumns],
-        lastColumnRect = [self headerRectOfColumn:[tableColumns indexOfObjectIdenticalTo:[tableColumns lastObject]]],
+        lastColumnRect = [self _headerRectOfLastVisibleColumn];
         activeColumnRect = [self headerRectOfColumn:_activeColumn];
         dragWindow = [theDragView window],
         frame = [dragWindow frame];

From 213c81ed4d13baca7e85fbb9ebaa3484996431a4 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Wed, 5 May 2010 12:56:23 +0200
Subject: [PATCH 092/175] made table column reordering work in non full-bridged
 apps

---
 AppKit/CPTableHeaderView.j | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 0c5b23a28..64125b0f7 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -382,12 +382,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         dragWindow = [theDragView window],
         frame = [dragWindow frame];
     
+    // Convert the frame origin from the global coordinate system to the windows' coordinate system
+    frame.origin = [[self window] convertGlobalToBase:frame.origin];
+    
     // This effectively clamps the value between the minimum and maximum
     frame.origin.x = MAX(0.0, MIN(CPRectGetMinX(frame), CPRectGetMaxX(lastColumnRect) - CPRectGetWidth(activeColumnRect)));
     
     // Make sure the column cannot move vertically
     frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
     
+    // Convert the calculated origin back to the global coordinate system
+    frame.origin = [[self window] convertBaseToGlobal:frame.origin];
+    
     [dragWindow setFrame:frame];
 }
 
@@ -414,7 +420,8 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     [self _constrainDragView:aView at:aPoint];
     
-    var dragWindowFrame = [[aView window] frame];
+    var dragWindow = [aView window],
+        dragWindowFrame = [dragWindow frame];
     
     var hoverPoint = CPPointCreateCopy(aPoint);
     if (aPoint.x < _previousTrackingLocation.x)
@@ -422,13 +429,16 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     else if (aPoint.x > _previousTrackingLocation.x)
         hoverPoint = CPPointMake(CPRectGetMaxX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
     
-    var hoveredColumn = [self columnAtPoint:hoverPoint],
+    // Convert the hover point from the global coordinate system to windows' coordinate system
+    hoverPoint = [[self window] convertGlobalToBase:hoverPoint];
+    
+    var hoveredColumn = [self columnAtPoint:hoverPoint];
     
     if (hoveredColumn !== -1)
     {
         var columnRect = [self headerRectOfColumn:hoveredColumn],
             columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
-    
+        
         if (hoveredColumn < _activeColumn && hoverPoint.x < columnCenterPoint.x)
             [self _moveColumn:_activeColumn toColumn:hoveredColumn];
         else if (hoveredColumn > _activeColumn && hoverPoint.x > columnCenterPoint.x)

From 79ba8fecd5b1b69e72cb63ff080a8bebb1c4d3cc Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Wed, 5 May 2010 14:08:06 +0200
Subject: [PATCH 093/175] made column reordering work with scrolled content

---
 AppKit/CPTableView.j | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 73f4ab1f6..72f4c2033 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1866,24 +1866,17 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         columnRect = [self rectOfColumn:theColumnIndex],
         headerView = [tableColumn headerView];
     
-    // Add the column header view
-    var headerFrame = [headerView frame];
-    headerFrame.origin = CPPointMakeZero();
-    
-    columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:headerFrame];
-    [columnHeaderView setStringValue:[headerView stringValue]];
-    [columnHeaderView setThemeState:[headerView themeState]];
-    [dragView addSubview:columnHeaderView];
-    
     row = [_exposedRows firstIndex];
     while (row !== CPNotFound)
     {
         var dataView = [self _newDataViewForRow:row tableColumn:tableColumn],
             dataViewFrame = [self frameOfDataViewAtColumn:theColumnIndex row:row];
             
-        // Offset by table header height to make room for the table header
+        // Only one column is ever dragged so we just place the view at 
         dataViewFrame.origin.x = 0.0;
-        dataViewFrame.origin.y += 23.0;
+            
+        // Offset by table header height - scroll position
+        dataViewFrame.origin.y = ( CPRectGetMinY(dataViewFrame) - CPRectGetMinY([self _exposedRect]) ) + 23.0;
         [dataView setFrame:dataViewFrame];
         
         [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
@@ -1892,9 +1885,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
         row = [_exposedRows indexGreaterThanIndex:row];
     }
     
-    // The columns are placed in the drag window at their original locations resulting in the dragged column
-    // being of when starting the drag, we compensate for this by offseting the drag window by the x coordinate of the column
-    // theDragViewOffset.x -= columnRect.origin.x;
+    // Add the column header view
+    var headerFrame = [headerView frame];
+    headerFrame.origin = CPPointMakeZero();
+    
+    columnHeaderView = [[_CPTableColumnHeaderView alloc] initWithFrame:headerFrame];
+    [columnHeaderView setStringValue:[headerView stringValue]];
+    [columnHeaderView setThemeState:[headerView themeState]];
+    [dragView addSubview:columnHeaderView];
     
     [dragView setBackgroundColor:[CPColor whiteColor]];
     [dragView setAlphaValue:0.7];

From 0f02e0d8ddd0b613873c9306df188ba36789a2e0 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 11 May 2010 12:40:37 -0700
Subject: [PATCH 094/175] Revert "added enumerateWithBlock: to CPArray"

This reverts commit 39bb8e341896050afa7b5d8d6489493898c3571f.
---
 Foundation/CPArray.j | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j
index f4f8be793..e26731db4 100755
--- a/Foundation/CPArray.j
+++ b/Foundation/CPArray.j
@@ -1224,18 +1224,6 @@
     sort(function(lhs, rhs) { return objj_msgSend(lhs, aSelector, rhs); });
 }
 
-- (void)enumerateObjectsUsingBlock:(Function)aBlock
-{
-    for (var i = 0; i < self.length; i++)
-    {
-        var shouldStop = NO;
-        aBlock(self[i], i, shouldStop);
-        
-        if (shouldStop)
-            break;
-    }
-}
-
 @end
 
 @implementation CPArray (CPCoding)

From bf71045381d9a275c7322fd6e5ca10a14523ec68 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Tue, 11 May 2010 19:39:51 -0500
Subject: [PATCH 095/175] Fixed bug where column reordering would be off if the
 table didn't sit at (0,0) on a window.

---
 AppKit/CPTableHeaderView.j | 44 ++++++++++++++++++++++----------------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 4bbb4e006..3507b18ee 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -373,19 +373,23 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         activeColumnRect = [self headerRectOfColumn:_activeColumn];
         dragWindow = [theDragView window],
         frame = [dragWindow frame];
-    
+
     // Convert the frame origin from the global coordinate system to the windows' coordinate system
     frame.origin = [[self window] convertGlobalToBase:frame.origin];
-    
+    // the from the window to the view
+    frame.origin = [self convertPoint:frame.origin fromView:nil];
+
     // This effectively clamps the value between the minimum and maximum
-    frame.origin.x = MAX(0.0, MIN(CPRectGetMinX(frame), CPRectGetMaxX(lastColumnRect) - CPRectGetWidth(activeColumnRect)));
-    
+    frame.origin.x = MAX(0.0, MIN(CGRectGetMinX(frame), CGRectGetMaxX(lastColumnRect) - CGRectGetWidth(activeColumnRect)));
+
     // Make sure the column cannot move vertically
-    frame.origin.y = CPRectGetMinY([self convertRect:lastColumnRect toView:nil]);
-    
-    // Convert the calculated origin back to the global coordinate system
+    frame.origin.y = CPRectGetMinY(lastColumnRect);
+
+    // Convert the calculated origin back to the window coordinate system
+    frame.origin = [self convertPoint:frame.origin toView:nil];
+    // Then back to the global coordinate system
     frame.origin = [[self window] convertBaseToGlobal:frame.origin];
-    
+
     [dragWindow setFrame:frame];
 }
 
@@ -411,32 +415,34 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)draggedView:(CPView)aView movedTo:(CPPoint)aPoint
 {
     [self _constrainDragView:aView at:aPoint];
-    
+
     var dragWindow = [aView window],
         dragWindowFrame = [dragWindow frame];
-    
-    var hoverPoint = CPPointCreateCopy(aPoint);
+
+    var hoverPoint = CGPointCreateCopy(aPoint);
+
     if (aPoint.x < _previousTrackingLocation.x)
-        hoverPoint = CPPointMake(CPRectGetMinX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
+        hoverPoint = CGPointMake(CGRectGetMinX(dragWindowFrame), CGRectGetMinY(dragWindowFrame));
     else if (aPoint.x > _previousTrackingLocation.x)
-        hoverPoint = CPPointMake(CPRectGetMaxX(dragWindowFrame), CPRectGetMinY(dragWindowFrame));
-    
+        hoverPoint = CGPointMake(CGRectGetMaxX(dragWindowFrame), CGRectGetMinY(dragWindowFrame));
+
     // Convert the hover point from the global coordinate system to windows' coordinate system
     hoverPoint = [[self window] convertGlobalToBase:hoverPoint];
-    
+    // then to the view
+    hoverPoint = [self convertPoint:hoverPoint fromView:nil];
+
     var hoveredColumn = [self columnAtPoint:hoverPoint];
-    
+
     if (hoveredColumn !== -1)
     {
         var columnRect = [self headerRectOfColumn:hoveredColumn],
-            columnCenterPoint = CPPointMake(CPRectGetMidX(columnRect), CPRectGetMidY(columnRect));
-        
+            columnCenterPoint = [self convertPoint:CGPointMake(CGRectGetMidX(columnRect), CGRectGetMidY(columnRect)) fromView:self];
         if (hoveredColumn < _activeColumn && hoverPoint.x < columnCenterPoint.x)
             [self _moveColumn:_activeColumn toColumn:hoveredColumn];
         else if (hoveredColumn > _activeColumn && hoverPoint.x > columnCenterPoint.x)
             [self _moveColumn:_activeColumn toColumn:hoveredColumn];
     }
-    
+
     _previousTrackingLocation = aPoint;
 }
 

From b94174f9e1964247b75a1b1c5f74c02120d1936c Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Tue, 11 May 2010 19:43:01 -0500
Subject: [PATCH 096/175] Updated TableTest to provide a test case for tables
 that do not sit at (0,0) of a window.

---
 Tests/Manual/TableTest/AppController.j | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/Tests/Manual/TableTest/AppController.j b/Tests/Manual/TableTest/AppController.j
index 1e573389a..0c3d818f2 100644
--- a/Tests/Manual/TableTest/AppController.j
+++ b/Tests/Manual/TableTest/AppController.j
@@ -26,10 +26,10 @@ tableTestDragType = @"CPTableViewTestDragType";
         dataSet3[i - 1] = [CPNumber numberWithInt:i+20];
     }
 
-    var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(50,50,400,400) styleMask:CPClosableWindowMask],
+    var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(50,50,700,500) styleMask:CPClosableWindowMask],
         contentView = [theWindow contentView];
 
-    tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 500.0, 500.0)];
+    tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 400.0)];
 
     [tableView setAllowsMultipleSelection:YES];
     [tableView setAllowsColumnSelection:YES];
@@ -55,7 +55,7 @@ tableTestDragType = @"CPTableViewTestDragType";
 
 
     var desc = [CPSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
-    for (var i = 1; i <= 2; i++)
+    for (var i = 1; i <= 5; i++)
     {
         var column = [[CPTableColumn alloc] initWithIdentifier:String(i)];
         [column setSortDescriptorPrototype:desc];
@@ -63,13 +63,15 @@ tableTestDragType = @"CPTableViewTestDragType";
 
         [column setMinWidth:50.0];
         [column setMaxWidth:500.0];
-        [column setWidth:200.0];
+        [column setWidth:75.0];
         
         [column setEditable:YES];
         [tableView addTableColumn:column];
     }
 
-    var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth([contentView bounds]), CGRectGetHeight([contentView bounds]))];
+    // we offset this scrollview to make sure all the coordinates are calculated correctly
+    // bad things can happen when the tableview doesn't sit at (0,0)
+    var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(200, 50, CGRectGetWidth([contentView bounds]) - 200, CGRectGetHeight([contentView bounds]) -200)];
    
     [scrollView setDocumentView:tableView];
     [scrollView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
@@ -384,4 +386,4 @@ tableTestDragType = @"CPTableViewTestDragType";
 	}
 }
 
-@end
\ No newline at end of file
+@end

From 4afa2bfada69d51ef4399ea65e56e2a57e06d03c Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Tue, 11 May 2010 23:20:02 -0700
Subject: [PATCH 097/175] clean up style issues

---
 AppKit/CPTableHeaderView.j | 101 +++++++++++++++++++------------------
 1 file changed, 51 insertions(+), 50 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 3507b18ee..490c4cc34 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -36,7 +36,7 @@
     {   
         [self _init];
     }
-    
+
     return self;
 }
 
@@ -44,7 +44,7 @@
 {
     _textField = [[_CPImageAndTextView alloc] initWithFrame:CGRectMake(5, 1, CGRectGetWidth([self bounds]) - 10, CGRectGetHeight([self bounds]) - 1)];
     [_textField setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
-    
+
     [_textField setLineBreakMode:CPLineBreakByTruncatingTail];
     [_textField setTextColor: [CPColor colorWithHexString: @"333333"]];
     [_textField setFont:[CPFont boldSystemFontOfSize:12.0]];
@@ -137,7 +137,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)encodeWithCoder:(CPCoder)aCoder
 {
     [super encodeWithCoder:aCoder];
-    
+
     [aCoder encodeObject:[_textField text] forKey:_CPTableColumnHeaderViewStringValueKey];
     [aCoder encodeObject:[_textField image] forKey:_CPTableColumnHeaderViewImageKey];
     [aCoder encodeObject:[_textField font] forKey:_CPTableColumnHeaderViewFontKey];
@@ -151,13 +151,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     CPPoint                 _previousTrackingLocation;
     int                     _activeColumn;
     int                     _pressedColumn;
-    
+
     BOOL                    _isResizing;
     BOOL                    _isDragging;
     BOOL                    _isTrackingColumn;
-    
+
     float                   _columnOldWidth;
-    
+
     CPTableView             _tableView @accessors(property=tableView);
 }
 
@@ -167,11 +167,11 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     _previousTrackingLocation = CPPointMakeZero();
     _activeColumn = -1;
     _pressedColumn = -1;
-    
+
     _isResizing = NO;
     _isDragging = NO;
     _isTrackingColumn = NO;
-    
+
     _columnOldWidth = 0.0;
 
     [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
@@ -196,10 +196,10 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     var headerRect = [self bounds],
         columnRect = [[self tableView] rectOfColumn:aColumnIndex];
-        
+
     headerRect.origin.x = CPRectGetMinX(columnRect);
     headerRect.size.width = CPRectGetWidth(columnRect);
-    
+
     return headerRect;
 }
 
@@ -223,13 +223,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         var headerView = [_tableView._tableColumns[_pressedColumn] headerView];
         [headerView unsetThemeState:CPThemeStateHighlighted];
     }    
-    
+
     if (column != -1)
     {
         var headerView = [_tableView._tableColumns[column] headerView];
         [headerView setThemeState:CPThemeStateHighlighted];
     }
-    
+
     _pressedColumn = column;
 }
 
@@ -242,13 +242,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     var type = [theEvent type],
         currentLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil];
-    
+
     // Take the right columns resize tracking area into account
     currentLocation.x -= 5.0;
 
     var columnIndex = [self columnAtPoint:currentLocation],
         shouldResize = [self shouldResizeTableColumn:columnIndex at:CPPointMake(currentLocation.x + 5.0, currentLocation.y)];
-        
+
     if (type === CPLeftMouseUp)
     {
         if (shouldResize)
@@ -257,10 +257,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         {
             [[self tableView] _didClickTableColumn:columnIndex modifierFlags:[theEvent modifierFlags]];
             [self stopTrackingTableColumn:columnIndex at:currentLocation];
-            
+
             _isTrackingColumn = NO;
         }
 
+        [self _updateResizeCursor:[CPApp currentEvent]];
+
         _activeColumn = CPNotFound;
         return;
     }
@@ -269,7 +271,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     {
         if (columnIndex === -1)
             return;
-        
+
         _mouseDownLocation = currentLocation;
         _activeColumn = columnIndex;
 
@@ -297,12 +299,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
                         return; // Stop tracking the column, because it's being dragged
                 } else
                     [self startTrackingTableColumn:columnIndex at:currentLocation];
-                    
+
             } else if (_isTrackingColumn && _pressedColumn !== -1)
                 [self stopTrackingTableColumn:_activeColumn at:currentLocation];
         }
     }
-    
+
     _previousTrackingLocation = currentLocation;
     [CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
 }
@@ -320,16 +322,16 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
             offset = CPPointMakeZero(),
             view = [[self tableView] _dragViewForColumn:aColumnIndex event:[CPApp currentEvent] offset:offset],
             viewLocation = CPPointMakeZero();
-        
+
         viewLocation.x = ( CPRectGetMinX(columnRect) + offset.x ) + ( aPoint.x - _mouseDownLocation.x );
         viewLocation.y = CPRectGetMinY(columnRect) + offset.y;
-        
+
         [self dragView:view at:viewLocation offset:CPSizeMakeZero() event:[CPApp currentEvent] 
             pasteboard:[CPPasteboard pasteboardWithName:CPDragPboard] source:self slideBack:YES];
-            
+
         return NO;
     }
-    
+
     return YES;
 }
 
@@ -354,15 +356,15 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     var tableColumns = [[self tableView] tableColumns],
         columnIndex = [tableColumns count];
-        
+
     while (columnIndex--)
     {
         var tableColumn = [tableColumns objectAtIndex:columnIndex];
-        
+
         if (![tableColumn isHidden])
             return [self headerRectOfColumn:columnIndex];
     }
-    
+
     return nil;
 }
 
@@ -398,17 +400,17 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [[self tableView] moveColumn:aFromIndex toColumn:aToIndex];
     _activeColumn = aToIndex;
     _pressedColumn = _activeColumn;
-    
+
     [[self tableView] _setDraggedColumn:_activeColumn];
 }
 
 - (void)draggedView:(CPView)aView beganAt:(CPPoint)aPoint
 {
     _isDragging = YES;
-    
+
     [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:YES];
     [[self tableView] _setDraggedColumn:_activeColumn];
-    
+
     [self setNeedsDisplay:YES];
 }
 
@@ -450,11 +452,11 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     _isDragging = NO;
     _isTrackingColumn = NO; // We need to do this explicitly because the mouse up section of trackMouse is never reached
-    
+
     [[self tableView] _setDraggedColumn:-1];
     [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
     [self stopTrackingTableColumn:_activeColumn at:aLocation];
-    
+
     [self setNeedsDisplay:YES];
 }
 
@@ -462,7 +464,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     if (_isResizing)
         return YES;
-        
+
     if (_isTrackingColumn)
         return NO;
 
@@ -472,19 +474,18 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (void)startResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
     _isResizing = YES;
-    
+
     var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
-    
+
     [tableColumn setDisableResizingPosting:YES];
     [[self tableView] setDisableAutomaticResizing:YES];
 }
 
 - (void)continueResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
-    
-    var newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
-    
+    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
+        newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
+
     if (newWidth < [tableColumn minWidth])
         [[CPCursor resizeRightCursor] set];
     else if (newWidth > [tableColumn maxWidth])
@@ -493,7 +494,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     {
         [self tableView]._lastColumnShouldSnap = NO;
         [tableColumn setWidth:newWidth];
-        
+
         [[CPCursor resizeLeftRightCursor] set];
         [self setNeedsLayout];
         [self setNeedsDisplay:YES];
@@ -506,7 +507,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
     [tableColumn setDisableResizingPosting:NO];
     [[self tableView] setDisableAutomaticResizing:NO];
-    
+
     _isResizing = NO;
 }
 
@@ -522,12 +523,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     var mouseLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil],    
         mouseOverLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
         overColumn = [self columnAtPoint:mouseOverLocation];
-    
+
     if (overColumn >= 0 && CGRectContainsPoint([self _cursorRectForColumn:overColumn], mouseLocation))
     {
         var tableColumn = [[_tableView tableColumns] objectAtIndex:overColumn],
             width = [tableColumn width];
-            
+
         if (width == [tableColumn minWidth])
             [[CPCursor resizeRightCursor] set];
         else if (width == [tableColumn maxWidth])
@@ -559,12 +560,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 {
     var tableColumns = [_tableView tableColumns],
         count = [tableColumns count];    
-    
+
     for (var i = 0; i < count; i++) 
     {
         var column = [tableColumns objectAtIndex:i],
             headerView = [column headerView];
-        
+
         var frame = [self headerRectOfColumn:i];
         frame.size.height -= 0.5;
         if (i > 0) 
@@ -572,9 +573,9 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
             frame.origin.x += 0.5;
             frame.size.width -= 1;
         }
-        
+
         [headerView setFrame:frame];
-        
+
         if([headerView superview] != self)
             [self addSubview:headerView];
     }
@@ -601,23 +602,23 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     var columnArrayIndex = 0,
         columnArrayCount = columnsArray.length,
         columnMaxX;
-        
+
     CGContextBeginPath(context);
     for(; columnArrayIndex < columnArrayCount; columnArrayIndex++)
     {
         // grab each column rect and add vertical lines
         var columnIndex = columnsArray[columnArrayIndex],
             columnToStroke = [self headerRectOfColumn:columnIndex];
-            
+
         columnMaxX = CGRectGetMaxX(columnToStroke);
-        
+
         CGContextMoveToPoint(context, ROUND(columnMaxX) + 0.5, ROUND(CGRectGetMinY(columnToStroke)));
         CGContextAddLineToPoint(context, ROUND(columnMaxX) + 0.5, ROUND(CGRectGetMaxY(columnToStroke)));
     }
-    
+
     CGContextClosePath(context);
     CGContextStrokePath(context);
-    
+
     if (_isDragging)
     {
         CGContextSetFillColor(context, [CPColor grayColor]);

From 337f5d9e73dcfd622cae3ca15120629b66852e62 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Wed, 12 May 2010 08:53:50 -0700
Subject: [PATCH 098/175] Correctly handle targeted links in NativeHost.

Reviewed by me.
---
 Tools/NativeHost/AppController.m                      | 1 +
 Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj | 4 ++++
 Tools/NativeHost/WebWindow.m                          | 1 +
 3 files changed, 6 insertions(+)

diff --git a/Tools/NativeHost/AppController.m b/Tools/NativeHost/AppController.m
index aeb2362d3..e45c5d262 100644
--- a/Tools/NativeHost/AppController.m
+++ b/Tools/NativeHost/AppController.m
@@ -175,6 +175,7 @@ NSString *SERVER_USER = nil;
     [webView setUIDelegate:self];
     [webView setFrameLoadDelegate:self];
     [webView setResourceLoadDelegate:self];
+    [webView setPolicyDelegate:self];
 
     webViewWindow = [[NSWindow alloc] init];
 
diff --git a/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj b/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj
index e32b30318..f7d2bbc37 100644
--- a/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj
+++ b/Tools/NativeHost/NativeHost.xcodeproj/project.pbxproj
@@ -16,6 +16,7 @@
 		9E43AC84104DB51400263989 /* WebScripObject+Objective-J.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E43AC83104DB51400263989 /* WebScripObject+Objective-J.m */; };
 		9E44CA9D0FD798FE00860A54 /* NSURL+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E44CA9C0FD798FE00860A54 /* NSURL+Additions.m */; };
 		9E4EBB4210892BDE0091C8E9 /* BridgedMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E4EBB4110892BDE0091C8E9 /* BridgedMethods.m */; };
+		9E52D2F9119B05EF00B831FC /* AppController+WebPolicyDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E52D2F8119B05EF00B831FC /* AppController+WebPolicyDelegate.m */; };
 		9E535D05104F6F4900C119FA /* AppController+MainMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E535D04104F6F4900C119FA /* AppController+MainMenu.m */; };
 		9E535D32104F73FB00C119FA /* MenuBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E535D31104F73FB00C119FA /* MenuBridge.m */; };
 		9E535D37104F761F00C119FA /* MenuItemBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E535D36104F761F00C119FA /* MenuItemBridge.m */; };
@@ -55,6 +56,7 @@
 		9E44CA9C0FD798FE00860A54 /* NSURL+Additions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+Additions.m"; sourceTree = ""; };
 		9E4EBB4010892BDE0091C8E9 /* BridgedMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BridgedMethods.h; sourceTree = ""; };
 		9E4EBB4110892BDE0091C8E9 /* BridgedMethods.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BridgedMethods.m; sourceTree = ""; };
+		9E52D2F8119B05EF00B831FC /* AppController+WebPolicyDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+WebPolicyDelegate.m"; sourceTree = ""; };
 		9E535D04104F6F4900C119FA /* AppController+MainMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppController+MainMenu.m"; sourceTree = ""; };
 		9E535D30104F73FB00C119FA /* MenuBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuBridge.h; sourceTree = ""; };
 		9E535D31104F73FB00C119FA /* MenuBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuBridge.m; sourceTree = ""; };
@@ -106,6 +108,7 @@
 				9ED96C881020072300D24B9C /* AppController+WebFrameLoadDelegate.m */,
 				9ED96C891020072300D24B9C /* AppController+WebResourceLoadDelegate.m */,
 				9ED96C871020072300D24B9C /* AppController+WebUIDelegate.m */,
+				9E52D2F8119B05EF00B831FC /* AppController+WebPolicyDelegate.m */,
 				9EB99C940FD8968100AA94A2 /* AppController.h */,
 				9EB99C950FD8968100AA94A2 /* AppController.m */,
 				9EA1BEF5107E7EE500CDE684 /* Application.h */,
@@ -297,6 +300,7 @@
 				ADCCEF6810D43C970055BDFD /* WebPasteboardProxy.m in Sources */,
 				9E43AC84104DB51400263989 /* WebScripObject+Objective-J.m in Sources */,
 				9E5D4F0D1090FB6E00E76B38 /* WebWindow.m in Sources */,
+				9E52D2F9119B05EF00B831FC /* AppController+WebPolicyDelegate.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Tools/NativeHost/WebWindow.m b/Tools/NativeHost/WebWindow.m
index e49121417..631e73a72 100644
--- a/Tools/NativeHost/WebWindow.m
+++ b/Tools/NativeHost/WebWindow.m
@@ -110,6 +110,7 @@ CGEventRef headTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef e
         [webView setUIDelegate:delegate];
         [webView setFrameLoadDelegate:delegate];
         [webView setResourceLoadDelegate:delegate];
+        [webView setPolicyDelegate:delegate];
         [webView setShouldCloseWithWindow:YES];
 
         [shadowView addSubview:webView];

From 6384bed9cc128b62a2cb3132d31c6de8d1a51572 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Wed, 12 May 2010 09:45:58 -0700
Subject: [PATCH 099/175] Properly handle window.location= links as well.

Reviewed by me.
---
 .../AppController+WebPolicyDelegate.m         | 35 +++++++++++++++++++
 Tools/NativeHost/AppController.h              |  4 +++
 Tools/NativeHost/AppController.m              |  8 +++++
 3 files changed, 47 insertions(+)
 create mode 100644 Tools/NativeHost/AppController+WebPolicyDelegate.m

diff --git a/Tools/NativeHost/AppController+WebPolicyDelegate.m b/Tools/NativeHost/AppController+WebPolicyDelegate.m
new file mode 100644
index 000000000..209870a55
--- /dev/null
+++ b/Tools/NativeHost/AppController+WebPolicyDelegate.m
@@ -0,0 +1,35 @@
+//
+//  AppController+WebPolicyDelegate.m
+//  NativeHost
+//
+//  Created by Francisco Tolmasky on 5/11/10.
+//  Copyright 2010 280 North, Inc. All rights reserved.
+//
+
+#import "NSURL+Additions.h"
+#import "AppController.h"
+
+
+@implementation AppController (WebPolicyDelegate)
+
+- (void)webView:(WebView *)aWebView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)aRequest newFrameName:(NSString *)aFrameName decisionListener:(id < WebPolicyDecisionListener >)aListener
+{
+    [[NSWorkspace sharedWorkspace] openURL:[actionInformation objectForKey:WebActionOriginalURLKey]];
+    [aListener ignore];
+}
+
+- (void)webView:(WebView *)aWebView decidePolicyForNavigationAction:(NSDictionary *)aDictionary request:(NSURLRequest *)aRequest frame:(WebFrame *)aWebFrame decisionListener:(id )aDecisionListener
+{
+    NSURL * requestURL = [aRequest URL];
+
+    if([aWebView mainFrame] != aWebFrame || 
+       [[baseURL scheme] isEqualTo:[requestURL scheme]] &&
+       ![baseURL host] || [[baseURL host] isEqualTo:[requestURL host]] &&
+       ![baseURL port] || [[baseURL port] isEqualTo:[requestURL port]])
+        return [aDecisionListener use];
+
+    [[NSWorkspace sharedWorkspace] openURL:[aDictionary objectForKey:WebActionOriginalURLKey]];
+    [aDecisionListener ignore];
+}
+
+@end
diff --git a/Tools/NativeHost/AppController.h b/Tools/NativeHost/AppController.h
index ee59c24fe..0e245965b 100644
--- a/Tools/NativeHost/AppController.h
+++ b/Tools/NativeHost/AppController.h
@@ -27,8 +27,12 @@ extern NSString *SERVER_USER;
     NSFileHandle                    * stdinFileHandle;
 
     NSMutableAttributedString       * loggedOutput;
+
+    NSURL                           * baseURL;
 }
 
+- (NSURL *)baseURL;
+
 - (void)startServer;
 - (void)startCappuccinoApplication;
 
diff --git a/Tools/NativeHost/AppController.m b/Tools/NativeHost/AppController.m
index e45c5d262..da1204bbd 100644
--- a/Tools/NativeHost/AppController.m
+++ b/Tools/NativeHost/AppController.m
@@ -20,6 +20,7 @@ int SERVER_PORT = 9191;
 NSString *SERVER_PASSWORD = nil;
 NSString *SERVER_USER = nil;
 
+
 @implementation AppController
 
 - (id)init
@@ -139,6 +140,11 @@ NSString *SERVER_USER = nil;
     [stdinFileHandle readInBackgroundAndNotify];
 }
 
+- (NSURL *)baseURL
+{
+    return baseURL;
+}
+
 - (void)startCappuccinoApplication
 {
     NSString *initialURL = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NHInitialURL"];
@@ -152,10 +158,12 @@ NSString *SERVER_USER = nil;
             initialResource = @"Application/index.html";
 
         initialURL = [[NSString stringWithFormat:@"file://%@/%@", [[NSBundle mainBundle] resourcePath], initialResource] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+        baseURL = [[NSURL alloc] initWithString:@"file:///"];
     }
     else if (prependServer)
     {
         initialURL = [NSString stringWithFormat:@"http://127.0.0.1:%d/%@", SERVER_PORT, initialURL];
+        baseURL = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d/", SERVER_PORT]];
     }
 
 	NHLog(@"STARTUP", [initialURL description]);

From d1ae1bd41f72c24578c3c204a83766ed7e73b379 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Wed, 12 May 2010 10:36:48 -0700
Subject: [PATCH 100/175] Menu window's should open in the same platform window
 as the view they are attached to.

---
 AppKit/CPMenu/CPMenu.j | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/AppKit/CPMenu/CPMenu.j b/AppKit/CPMenu/CPMenu.j
index 1116437b7..687fb7045 100644
--- a/AppKit/CPMenu/CPMenu.j
+++ b/AppKit/CPMenu/CPMenu.j
@@ -747,6 +747,9 @@ var _CPMenuBarVisible               = NO,
     }
 
     // Show it.
+    if ([CPPlatform isBrowser])
+        [menuWindow setPlatformWindow:[[aView window] platformWindow]];
+
     [menuWindow orderFront:self];
 
     // Track it.
@@ -816,6 +819,9 @@ var _CPMenuBarVisible               = NO,
         [menuWindow setFrameOrigin:CGRectIntersection(unconstrainedFrame, constraintRect).origin];
     }
 
+    if ([CPPlatform isBrowser])
+        [menuWindow setPlatformWindow:[[aView window] platformWindow]];
+
     [menuWindow orderFront:self];
 
     [[_CPMenuManager sharedMenuManager]

From d3161422db7b86c37c19548816e716f2c434e5cc Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Wed, 12 May 2010 17:14:25 -0500
Subject: [PATCH 101/175] Updated TableTest adding a checkbox as a dataview for
 a column.

---
 Tests/Manual/TableTest/AppController.j | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Tests/Manual/TableTest/AppController.j b/Tests/Manual/TableTest/AppController.j
index 0c3d818f2..327c8aa18 100644
--- a/Tests/Manual/TableTest/AppController.j
+++ b/Tests/Manual/TableTest/AppController.j
@@ -99,6 +99,13 @@ tableTestDragType = @"CPTableViewTestDragType";
     [tableView2 setDelegate:self];
     [tableView2 setDataSource:self];
 
+
+    var checkBox = [[CPCheckBox alloc] initWithFrame:CGRectMake(5,3,24,24)],
+        checkBoxColumn = [[CPTableColumn alloc] initWithIdentifier:@"checkBox"];
+    [checkBoxColumn setDataView:checkBox];
+
+    [tableView2 addTableColumn:checkBoxColumn];
+
     var desc = [CPSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
     for (var i = 1; i <= 3; i++)
     {

From 61d7fe04e84d1385e283f31b73ed37f02c94ae35 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Wed, 12 May 2010 18:43:56 -0500
Subject: [PATCH 102/175] If we tell the tableview not to draw a selection then
 we shouldn't draw it...

---
 AppKit/CPTableView.j | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index fdf194400..18f205602 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -86,7 +86,7 @@ CPTableViewSolidVerticalGridLineMask   = 1 << 0;
 CPTableViewSolidHorizontalGridLineMask = 1 << 1;
 
 CPTableViewNoColumnAutoresizing = 0;
-CPTableViewUniformColumnAutoresizingStyle = 1;
+CPTableViewUniformColumnAutoresizingStyle = 1; // FIX ME: This is FUBAR
 CPTableViewSequentialColumnAutoresizingStyle = 2;
 CPTableViewReverseSequentialColumnAutoresizingStyle = 3;
 CPTableViewLastColumnOnlyAutoresizingStyle = 4;
@@ -2459,6 +2459,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
 
 - (void)highlightSelectionInClipRect:(CGRect)aRect
 {
+    if (_selectionHighlightStyle === CPTableViewDraggingDestinationFeedbackStyleNone)
+        return;
+
     var context = [[CPGraphicsContext currentContext] graphicsPort],
         indexes = [],
         rectSelector = @selector(rectOfRow:);
@@ -2488,9 +2491,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     if (!count)
         return;
   
-    var drawGradient = (_selectionHighlightStyle === CPTableViewSelectionHighlightStyleSourceList && [_selectedRowIndexes count] >= 1);
-    
-    var deltaHeight = 0.5 * (_gridStyleMask & CPTableViewSolidHorizontalGridLineMask);
+    var drawGradient = (_selectionHighlightStyle === CPTableViewSelectionHighlightStyleSourceList && [_selectedRowIndexes count] >= 1),
+        deltaHeight = 0.5 * (_gridStyleMask & CPTableViewSolidHorizontalGridLineMask);
 
     CGContextBeginPath(context);
     while (count--)

From 9eab2071dced51194b698fab408c2055b13bf21e Mon Sep 17 00:00:00 2001
From: Scott Kyle 
Date: Tue, 9 Mar 2010 11:49:36 -0800
Subject: [PATCH 103/175] In CPImageView, performDragOperation: should return a
 BOOL

---
 AppKit/CPImageView.j | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j
index 234f74ceb..7d365f71f 100644
--- a/AppKit/CPImageView.j
+++ b/AppKit/CPImageView.j
@@ -365,7 +365,7 @@ var LEFT_SHADOW_INSET       = 3.0,
     return _isEditable;
 }
 
-- (void)performDragOperation:(CPDraggingInfo)aSender
+- (BOOL)performDragOperation:(CPDraggingInfo)aSender
 {
     var images = [CPKeyedUnarchiver unarchiveObjectWithData:[[aSender draggingPasteboard] dataForType:CPImagesPboardType]];
 
@@ -374,6 +374,8 @@ var LEFT_SHADOW_INSET       = 3.0,
         [self setImage:images[0]];
         [self sendAction:[self action] to:[self target]];
     }
+    
+    return YES;
 }
 
 @end

From ee2f3614250b48b4e0821c0f66b2ec09c003ec60 Mon Sep 17 00:00:00 2001
From: Klaas Pieter Annema 
Date: Tue, 16 Feb 2010 14:33:12 +0100
Subject: [PATCH 104/175] Reimplemented setImageDimsWhenDisabled: on CPButton
 to only dim the image instead of the entire button

---
 AppKit/CPButton.j            |  1 +
 AppKit/_CPImageAndTextView.j | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j
index 8a602a607..00b898233 100644
--- a/AppKit/CPButton.j
+++ b/AppKit/CPButton.j
@@ -530,6 +530,7 @@ CPButtonStateMixed  = CPThemeState("mixed");
         [contentView setTextShadowOffset:[self currentValueForThemeAttribute:@"text-shadow-offset"]];
         [contentView setImagePosition:[self currentValueForThemeAttribute:@"image-position"]];
         [contentView setImageScaling:[self currentValueForThemeAttribute:@"image-scaling"]];
+        [contentView setDimsImage:[self hasThemeState:CPThemeStateDisabled] && _imageDimsWhenDisabled];
     }
 }
 
diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j
index 695598a4d..cee931360 100644
--- a/AppKit/_CPImageAndTextView.j
+++ b/AppKit/_CPImageAndTextView.j
@@ -63,6 +63,7 @@ var HORIZONTAL_MARGIN   = 3.0,
     
     CPCellImagePosition     _imagePosition;
     CPImageScaling          _imageScaling;
+    BOOL                    _shouldDimImage;
     
     CPImage                 _image;
     CPString                _text;
@@ -211,6 +212,17 @@ var HORIZONTAL_MARGIN   = 3.0,
     return _imageScaling;
 }
 
+- (void)setDimsImage:(BOOL)shouldDim
+{
+    var shouldDimImage = !!shouldDimImage;
+
+    if (_shouldDimImage !== shouldDimImage)
+    {
+        _shouldDimImage = shouldDim;
+        [self setNeedsLayout];
+    }
+}
+
 - (void)setTextColor:(CPColor)aTextColor
 {
     if (_textColor === aTextColor)
@@ -572,6 +584,11 @@ var HORIZONTAL_MARGIN   = 3.0,
             imageHeight *= scale;
         }
 
+        if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature))
+            imageStyle.filter = @"alpha(opacity=" + _shouldDimImage ? 35 : 100 + ")";
+        else
+            imageStyle.opacity = _shouldDimImage ? 0.35 : 1.0;
+
         _DOMImageElement.width = imageWidth;
         _DOMImageElement.height = imageHeight;        
         imageStyle.width = MAX(imageWidth, 0) + "px";

From 13a5c7f215f220533e9bd4f4a8129f6110d68304 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Wed, 12 May 2010 16:50:58 -0700
Subject: [PATCH 105/175] indexOf is not a safe operation on arrays.

---
 Foundation/CPRunLoop.j | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j
index c5fde7b54..95ea272bd 100644
--- a/Foundation/CPRunLoop.j
+++ b/Foundation/CPRunLoop.j
@@ -271,7 +271,7 @@ var CPRunLoopLastNativeRunLoop = 0;
 
 
     // FIXME: Hack for not doing this in CommonJS
-    if (CFBundle.environments().indexOf("Browser") !== -1)
+    if ([CFBundle.environments() indexOfObject:("Browser")] !== CPNotFound)
     {
         if (!_runLoopInsuranceTimer)
             _runLoopInsuranceTimer = window.setNativeTimeout(function()
@@ -293,7 +293,7 @@ var CPRunLoopLastNativeRunLoop = 0;
     _runLoopLock = YES;
 
     // FIXME: Hack for not doing this in CommonJS
-    if (CFBundle.environments().indexOf("Browser") !== -1)
+    if ([CFBundle.environments() indexOfObject:("Browser")] !== CPNotFound)
     {
         if (_runLoopInsuranceTimer)
         {

From c31786c4c1f12bc62822020cc6123d5a9b6a09d8 Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Wed, 12 May 2010 19:01:28 -0500
Subject: [PATCH 106/175] Refactored autoresizing

---
 AppKit/CPTableView.j | 77 +++++++++++++++++++++-----------------------
 1 file changed, 36 insertions(+), 41 deletions(-)

diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 18f205602..75e096ce5 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -1283,68 +1283,63 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
     return _CGRectMake(tableColumnRange.location, _CGRectGetMinY(rectOfRow), tableColumnRange.length, _CGRectGetHeight(rectOfRow));
 }
 
-//FIX ME: We should refactor this!
 - (void)resizeWithOldSuperviewSize:(CGSize)aSize
 {
     [super resizeWithOldSuperviewSize:aSize];
-    
+
     if (_disableAutomaticResizing)
         return;
 
     var mask = _columnAutoResizingStyle;
 
     if(mask === CPTableViewUniformColumnAutoresizingStyle)
-    {
        [self _resizeAllColumnUniformlyWithOldSize:aSize];
-    }
-
-    if(mask === CPTableViewLastColumnOnlyAutoresizingStyle)
-    {
+    else if(mask === CPTableViewLastColumnOnlyAutoresizingStyle)
         [self sizeLastColumnToFit];
-    }
+    else if(mask === CPTableViewFirstColumnOnlyAutoresizingStyle)
+        [self _autoResizeFirstColumn];
+}
 
-    if(mask === CPTableViewFirstColumnOnlyAutoresizingStyle)
-    {
-        var superview = [self superview];
+- (void)_autoResizeFirstColumn
+{
+    var superview = [self superview];
 
-        if (!superview)
-            return;
+     if (!superview)
+         return;
 
-        var superviewSize = [superview bounds].size;
+     var superviewSize = [superview bounds].size;
 
-        UPDATE_COLUMN_RANGES_IF_NECESSARY();
+     UPDATE_COLUMN_RANGES_IF_NECESSARY();
 
-        var count = NUMBER_OF_COLUMNS();
+     var count = NUMBER_OF_COLUMNS(),
+         visColumns = [[CPArray alloc] init],
+         totalWidth = 0,
+         i = 0;
 
-        var visColumns = [[CPArray alloc] init];
-        var totalWidth = 0;
+     for(; i < count; i++)
+     {
+         if(![_tableColumns[i] isHidden])
+         {
+             [visColumns addObject:i];
+             totalWidth += [_tableColumns[i] width];
+         }
+     }
 
-        for(var i=0; i < count; i++)
-        {
-            if(![_tableColumns[i] isHidden])
-            {
-                [visColumns addObject:i];
-                totalWidth += [_tableColumns[i] width];
-            }
-        }
+     count = [visColumns count];
 
-        count = [visColumns count];
+     //if there are rows
+     if (count > 0)
+     {
+         var columnToResize = _tableColumns[visColumns[0]];
+         var newWidth = superviewSize.width - totalWidth;// - [columnToResize width];
+         newWidth += [columnToResize width];
+         newWidth = (newWidth < [columnToResize minWidth]) ? [columnToResize minWidth] : newWidth;
+         newWidth = (newWidth > [columnToResize maxWidth]) ? [columnToResize maxWidth] : newWidth;
 
-        //if there are rows
-        if (count > 0)
-        {
-            var columnToResize = _tableColumns[visColumns[0]];
-            var newWidth = superviewSize.width - totalWidth;// - [columnToResize width];
-            newWidth += [columnToResize width];
-            newWidth = (newWidth < [columnToResize minWidth]) ? [columnToResize minWidth] : newWidth;
-            newWidth = (newWidth > [columnToResize maxWidth]) ? [columnToResize maxWidth] : newWidth;
-
-            [columnToResize setWidth:FLOOR(newWidth)];
-        }
-
-        [self setNeedsLayout];
-    }
+         [columnToResize setWidth:FLOOR(newWidth)];
+     }
 
+     [self setNeedsLayout];
 }
 
 - (void)_resizeAllColumnUniformlyWithOldSize:(CGSize)oldSize

From e0a3a683a510d517f4854c79c4bf10ea21e4ec3a Mon Sep 17 00:00:00 2001
From: Randall Luecke 
Date: Wed, 12 May 2010 19:44:07 -0500
Subject: [PATCH 107/175] access ivars directly from within CPTableHeaderView
 class.

---
 AppKit/CPTableHeaderView.j | 40 +++++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j
index 490c4cc34..073db4e72 100644
--- a/AppKit/CPTableHeaderView.j
+++ b/AppKit/CPTableHeaderView.j
@@ -195,7 +195,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 - (CGRect)headerRectOfColumn:(int)aColumnIndex
 {
     var headerRect = [self bounds],
-        columnRect = [[self tableView] rectOfColumn:aColumnIndex];
+        columnRect = [_tableView rectOfColumn:aColumnIndex];
 
     headerRect.origin.x = CPRectGetMinX(columnRect);
     headerRect.size.width = CPRectGetWidth(columnRect);
@@ -255,7 +255,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
             [self stopResizingTableColumn:_activeColumn at:currentLocation];
         else if ([self _shouldStopTrackingTableColumn:columnIndex at:currentLocation])
         {
-            [[self tableView] _didClickTableColumn:columnIndex modifierFlags:[theEvent modifierFlags]];
+            [_tableView _didClickTableColumn:columnIndex modifierFlags:[theEvent modifierFlags]];
             [self stopTrackingTableColumn:columnIndex at:currentLocation];
 
             _isTrackingColumn = NO;
@@ -275,7 +275,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         _mouseDownLocation = currentLocation;
         _activeColumn = columnIndex;
 
-        [[self tableView] _sendDelegateDidMouseDownInHeader:columnIndex];
+        [_tableView _sendDelegateDidMouseDownInHeader:columnIndex];
 
         if (shouldResize)
             [self startResizingTableColumn:columnIndex at:currentLocation];
@@ -320,7 +320,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     {
         var columnRect = [self headerRectOfColumn:aColumnIndex],
             offset = CPPointMakeZero(),
-            view = [[self tableView] _dragViewForColumn:aColumnIndex event:[CPApp currentEvent] offset:offset],
+            view = [_tableView _dragViewForColumn:aColumnIndex event:[CPApp currentEvent] offset:offset],
             viewLocation = CPPointMakeZero();
 
         viewLocation.x = ( CPRectGetMinX(columnRect) + offset.x ) + ( aPoint.x - _mouseDownLocation.x );
@@ -349,12 +349,12 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (BOOL)_shouldDragTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    return [[self tableView] allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
+    return [_tableView allowsColumnReordering] && ABS(aPoint.x - _mouseDownLocation.x) >= 10.0;
 }
 
 - (CPRect)_headerRectOfLastVisibleColumn
 {
-    var tableColumns = [[self tableView] tableColumns],
+    var tableColumns = [_tableView tableColumns],
         columnIndex = [tableColumns count];
 
     while (columnIndex--)
@@ -370,7 +370,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)_constrainDragView:(CPView)theDragView at:(CPPoint)aPoint
 {
-    var tableColumns = [[self tableView] tableColumns],
+    var tableColumns = [_tableView tableColumns],
         lastColumnRect = [self _headerRectOfLastVisibleColumn];
         activeColumnRect = [self headerRectOfColumn:_activeColumn];
         dragWindow = [theDragView window],
@@ -397,19 +397,19 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)_moveColumn:(int)aFromIndex toColumn:(int)aToIndex
 {
-    [[self tableView] moveColumn:aFromIndex toColumn:aToIndex];
+    [_tableView moveColumn:aFromIndex toColumn:aToIndex];
     _activeColumn = aToIndex;
     _pressedColumn = _activeColumn;
 
-    [[self tableView] _setDraggedColumn:_activeColumn];
+    [_tableView _setDraggedColumn:_activeColumn];
 }
 
 - (void)draggedView:(CPView)aView beganAt:(CPPoint)aPoint
 {
     _isDragging = YES;
 
-    [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:YES];
-    [[self tableView] _setDraggedColumn:_activeColumn];
+    [[[[_tableView tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:YES];
+    [_tableView _setDraggedColumn:_activeColumn];
 
     [self setNeedsDisplay:YES];
 }
@@ -453,8 +453,8 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     _isDragging = NO;
     _isTrackingColumn = NO; // We need to do this explicitly because the mouse up section of trackMouse is never reached
 
-    [[self tableView] _setDraggedColumn:-1];
-    [[[[[self tableView] tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
+    [_tableView _setDraggedColumn:-1];
+    [[[[_tableView tableColumns] objectAtIndex:_activeColumn] headerView] setHidden:NO];
     [self stopTrackingTableColumn:_activeColumn at:aLocation];
 
     [self setNeedsDisplay:YES];
@@ -468,22 +468,22 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
     if (_isTrackingColumn)
         return NO;
 
-    return [[self tableView] allowsColumnResizing] && CPRectContainsPoint([self _cursorRectForColumn:aColumnIndex], aPoint);
+    return [_tableView allowsColumnResizing] && CPRectContainsPoint([self _cursorRectForColumn:aColumnIndex], aPoint);
 }
 
 - (void)startResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
     _isResizing = YES;
 
-    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex];
 
     [tableColumn setDisableResizingPosting:YES];
-    [[self tableView] setDisableAutomaticResizing:YES];
+    [_tableView setDisableAutomaticResizing:YES];
 }
 
 - (void)continueResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex],
+    var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex],
         newWidth = [tableColumn width] + aPoint.x - _previousTrackingLocation.x;
 
     if (newWidth < [tableColumn minWidth])
@@ -492,7 +492,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
         [[CPCursor resizeLeftCursor] set];
     else
     {
-        [self tableView]._lastColumnShouldSnap = NO;
+        _tableView._lastColumnShouldSnap = NO;
         [tableColumn setWidth:newWidth];
 
         [[CPCursor resizeLeftRightCursor] set];
@@ -503,10 +503,10 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
 
 - (void)stopResizingTableColumn:(int)aColumnIndex at:(CPPoint)aPoint
 {
-    var tableColumn = [[[self tableView] tableColumns] objectAtIndex:aColumnIndex];
+    var tableColumn = [[_tableView tableColumns] objectAtIndex:aColumnIndex];
     [tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
     [tableColumn setDisableResizingPosting:NO];
-    [[self tableView] setDisableAutomaticResizing:NO];
+    [_tableView setDisableAutomaticResizing:NO];
 
     _isResizing = NO;
 }

From 23b76874df61717c57d1a6afc26a34921d6741fd Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Wed, 12 May 2010 18:21:46 -0700
Subject: [PATCH 108/175] A few IE fixes for web view.

---
 AppKit/CPWebView.j | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j
index 9da31436e..a198c0214 100644
--- a/AppKit/CPWebView.j
+++ b/AppKit/CPWebView.j
@@ -110,6 +110,7 @@ CPWebViewScrollNative                           = 2;
     _iframe.style.width = "100%";
     _iframe.style.height = "100%";
     _iframe.style.borderWidth = "0px";
+    _iframe.frameBorder = "0";
     
     [self setDrawsBackground:YES];
     
@@ -245,7 +246,10 @@ CPWebViewScrollNative                           = 2;
 
 - (void)_setScrollMode:(int)aScrollMode
 {
-    _scrollMode = aScrollMode;
+    if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
+        _scrollMode = CPWebViewScrollNative;
+    else
+        _scrollMode = aScrollMode;
         
     _ignoreLoadStart = YES;
     _ignoreLoadEnd  = YES;

From ac81ab458cf26aa63b8a46906421e2ffba1c8f60 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Wed, 12 May 2010 18:41:14 -0700
Subject: [PATCH 109/175] Fix for same html appearing multiple times in
 CPWebView when using loadHTMLString: many times in succession.

Reviewed by me.
---
 AppKit/CPWebView.j | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j
index a198c0214..bf36a7773 100644
--- a/AppKit/CPWebView.j
+++ b/AppKit/CPWebView.j
@@ -69,11 +69,13 @@ CPWebViewScrollNative                           = 2;
     
     CPString    _url;
     CPString    _html;
-    
+
     Function    _loadCallback;
-    
+
     int         _scrollMode;
     CGSize      _scrollSize;
+
+    int         _loadHTMLStringTimer;
 }
 
 - (id)initWithFrame:(CPRect)frameRect frameName:(CPString)frameName groupName:(CPString)groupName
@@ -327,8 +329,15 @@ CPWebViewScrollNative                           = 2;
         // clear the iframe
         _iframe.src = "";
 
+        if (_loadHTMLStringTimer !== nil)
+        {
+            window.clearTimeout(_loadHTMLStringTimer);
+            _loadHTMLStringTimer = nil;
+        }
+
         // need to give the browser a chance to reset iframe, otherwise we'll be document.write()-ing the previous document 
-        window.setTimeout(function() {
+        _loadHTMLStringTimer = window.setTimeout(function()
+        {
             var win = [self DOMWindow];
             
             win.document.write(_html);

From 80b70ec6b98b57cde1ba57bae385e7142de49055 Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Wed, 12 May 2010 19:08:30 -0700
Subject: [PATCH 110/175] Can't sprited resources whos resulting dataURL is
 larger than 32k, not resources which themselves are over 32k.

---
 Objective-J/CommonJS/lib/objective-j/jake/bundletask.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js b/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js
index 9cf34552b..13e3d7a8b 100644
--- a/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js
+++ b/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js
@@ -453,7 +453,9 @@ BundleTask.prototype.resourcesPath = function()
 
 // Don't sprite images larger than 32KB, IE 8 doesn't like it.
 BundleTask.isSpritable = function(aResourcePath) {
-    return isImage(aResourcePath) && FILE.size(aResourcePath) < 32768;
+    return isImage(aResourcePath) && FILE.size(aResourcePath) < 32768 &&
+           ("data:" + mimeType(aResourcePath) + ";base64," +
+            base64.encode(FILE.read(aResourcePath, "b"))).length < 32768;
 }
 
 BundleTask.prototype.defineResourceTask = function(aResourcePath, aDestinationPath)

From 5a89dfe8f4dd643ffa6cfdc35b18ded9cfaa3372 Mon Sep 17 00:00:00 2001
From: Francisco Ryan Tolmasky I 
Date: Wed, 12 May 2010 19:22:31 -0700
Subject: [PATCH 111/175] Fix for identifying when we can use platform windows.

Reviewed by me.
---
 AppKit/Platform/CPPlatformWindow.j | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j
index 1a31d068f..a0f46cc52 100644
--- a/AppKit/Platform/CPPlatformWindow.j
+++ b/AppKit/Platform/CPPlatformWindow.j
@@ -74,6 +74,15 @@ var PrimaryPlatformWindow   = NULL;
     return [CPSet set];
 }
 
++ (BOOL)supportsMultipleInstances
+{
+#if PLATFORM(DOM)
+    return !CPBrowserIsEngine(CPInternetExplorerBrowserEngine);
+#else
+    return NO;
+#endif
+}
+
 + (CPPlatformWindow)primaryPlatformWindow
 {
     return PrimaryPlatformWindow;

From fc8525e4d8861a23f4281ebcf6b34d59bfb66a24 Mon Sep 17 00:00:00 2001
From: Paul Baumgart 
Date: Mon, 10 May 2010 18:11:19 -0700
Subject: [PATCH 112/175] throw a regular Error() exception in Runtime.js
 because objj_exception doesn't exist anymore

---
 Objective-J/Runtime.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js
index fda9ad563..1df7ab26f 100644
--- a/Objective-J/Runtime.js
+++ b/Objective-J/Runtime.js
@@ -386,7 +386,7 @@ DISPLAY_NAME(objj_registerClassPair);
 GLOBAL(class_createInstance) = function(/*Class*/ aClass)
 {
     if (!aClass)
-        objj_exception_throw(new objj_exception(OBJJNilClassException, "*** Attempting to create object with Nil class."));
+        throw new Error("*** Attempting to create object with Nil class.");
 
     var object = new aClass.allocator();
 

From bc5a21d54500b5ac5cbb1d2535eb447b287c99a7 Mon Sep 17 00:00:00 2001
From: Paul Baumgart 
Date: Mon, 10 May 2010 18:20:48 -0700
Subject: [PATCH 113/175] Change objj_exception_throw to manually throw an
 exception, because objj_exception_throw doesn't exist anymore.

---
 Foundation/CPNumber.j | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Foundation/CPNumber.j b/Foundation/CPNumber.j
index 3b95e242d..8712b2ac2 100644
--- a/Foundation/CPNumber.j
+++ b/Foundation/CPNumber.j
@@ -217,14 +217,14 @@ FIXME: Do we need this?
 */
 - (CPDecimal)decimalValue
 {
-    objj_throw_exception("decimalValue: NOT YET IMPLEMENTED");
+    throw new Error("decimalValue: NOT YET IMPLEMENTED");
 }
 
 - (CPString)descriptionWithLocale:(CPDictionary)aDictionary
 {
     if (!aDictionary) return toString();
     
-    objj_throw_exception("descriptionWithLocale: NOT YET IMPLEMENTED");
+    throw new Error("descriptionWithLocale: NOT YET IMPLEMENTED");
 }
 
 - (CPString)description

From 66180f8de49a7f79a16177eb7df5b1f99d97a2a5 Mon Sep 17 00:00:00 2001
From: Paul Baumgart 
Date: Mon, 10 May 2010 14:55:49 -0700
Subject: [PATCH 114/175] change @property to @accessors in pre-processor error
 messages

---
 Objective-J/Preprocessor.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Objective-J/Preprocessor.js b/Objective-J/Preprocessor.js
index b95b4e61b..d66d47144 100644
--- a/Objective-J/Preprocessor.js
+++ b/Objective-J/Preprocessor.js
@@ -244,19 +244,19 @@ Preprocessor.prototype.accessors = function(tokens)
             value = true;
 
         if (!IS_WORD(name))
-            throw new SyntaxError(this.error_message("*** @property attribute name not valid."));
+            throw new SyntaxError(this.error_message("*** @accessors attribute name not valid."));
 
         if ((token = tokens.skip_whitespace()) == TOKEN_EQUAL)
         {
             value = tokens.skip_whitespace();
             
             if (!IS_WORD(value))
-                throw new SyntaxError(this.error_message("*** @property attribute value not valid."));
+                throw new SyntaxError(this.error_message("*** @accessors attribute value not valid."));
 
             if (name == "setter")
             {
                 if ((token = tokens.next()) != TOKEN_COLON)
-                    throw new SyntaxError(this.error_message("*** @property setter attribute requires argument with \":\" at end of selector name."));
+                    throw new SyntaxError(this.error_message("*** @accessors setter attribute requires argument with \":\" at end of selector name."));
                 
                 value += ":";
             }
@@ -270,7 +270,7 @@ Preprocessor.prototype.accessors = function(tokens)
             break;
         
         if (token != TOKEN_COMMA)
-            throw new SyntaxError(this.error_message("*** Expected ',' or ')' in @property attribute list."));
+            throw new SyntaxError(this.error_message("*** Expected ',' or ')' in @accessors attribute list."));
     }
     
     return attributes;

From fddcde757f6944aa61b9144f2b4b0b6476aa41cc Mon Sep 17 00:00:00 2001
From: Ross Boucher 
Date: Sat, 15 May 2010 12:22:29 -0700
Subject: [PATCH 115/175] Add a more specific cache header. Closes #649.

---
 Foundation/CPURLRequest.j | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Foundation/CPURLRequest.j b/Foundation/CPURLRequest.j
index 5d6b7fc9b..b18b9bd81 100644
--- a/Foundation/CPURLRequest.j
+++ b/Foundation/CPURLRequest.j
@@ -68,7 +68,7 @@
         _HTTPMethod = @"GET";
         _HTTPHeaderFields = [CPDictionary dictionary];
         
-        [self setValue:"Thu, 1 Jan 1970 00:00:00 GMT" forHTTPHeaderField:"If-Modified-Since"];
+        [self setValue:"Thu, 01 Jan 1970 00:00:00 GMT" forHTTPHeaderField:"If-Modified-Since"];
         [self setValue:"no-cache" forHTTPHeaderField:"Cache-Control"];
         [self setValue:"XMLHttpRequest" forHTTPHeaderField:"X-Requested-With"];
     }

From 791e65c88b838e78bb29d132cf3e73dee2ceeb27 Mon Sep 17 00:00:00 2001
From: Alexander Ljungberg 
Date: Fri, 30 Apr 2010 15:11:28 -0400
Subject: [PATCH 116/175] Improved CPArray sortUsingDescriptors performance by
 about 3% by pulling the descriptor count out of the sort function.

---
 Foundation/CPArray.j                  | 13 ++++---
 Tests/Foundation/CPArrayPerformance.j | 56 +++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 5 deletions(-)
 create mode 100644 Tests/Foundation/CPArrayPerformance.j

diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j
index e26731db4..4e22b591a 100755
--- a/Foundation/CPArray.j
+++ b/Foundation/CPArray.j
@@ -490,10 +490,11 @@
 */
 - (unsigned)indexOfObject:(id)anObject sortedByDescriptors:(CPArray)descriptors
 {
+    var count = [descriptors count];
+
     return [self indexOfObject:anObject sortedByFunction:function(lhs, rhs)
     {
         var i = 0,
-            count = [descriptors count],
             result = CPOrderedSame;
 
         while (i < count)
@@ -971,21 +972,22 @@
 
 - (unsigned)insertObject:(id)anObject inArraySortedByDescriptors:(CPArray)descriptors
 {
+    var count = [descriptors count];
+
     var index = [self _indexOfObject:anObject sortedByFunction:function(lhs, rhs)
     {
         var i = 0,
-            count = [descriptors count],
             result = CPOrderedSame;
 
         while (i < count)
-            if ((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
+            if((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
                 return result;
 
         return result;
     } context:nil];
 
     if (index < 0)
-        index = -index - 1;
+        index = -index-1;
 
     [self insertObject:anObject atIndex:index];
     return index;
@@ -1191,10 +1193,11 @@
 
 - (CPArray)sortUsingDescriptors:(CPArray)descriptors
 {
+    var count = [descriptors count];
+
     sort(function(lhs, rhs)
     {
         var i = 0,
-            count = [descriptors count],
             result = CPOrderedSame;
 
         while (i < count)
diff --git a/Tests/Foundation/CPArrayPerformance.j b/Tests/Foundation/CPArrayPerformance.j
new file mode 100644
index 000000000..a41c16dce
--- /dev/null
+++ b/Tests/Foundation/CPArrayPerformance.j
@@ -0,0 +1,56 @@
+@import 
+@import 
+@import 
+@import 
+
+@implementation CPArrayPerformance : OJTestCase
+
+- (void)testSortUsingDescriptorsSpeed
+{
+
+    var ELEMENTS = 1000,
+        REPEATS = 10,
+        array = [];
+    for (var i=0; i
Date: Mon, 10 May 2010 22:17:52 -0400
Subject: [PATCH 117/175] Added documentation in the form of source code
 comments; verified using doxygen and the included recipe file.

---
 AppKit/CPAccordionView.j | 41 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 38 insertions(+), 3 deletions(-)

diff --git a/AppKit/CPAccordionView.j b/AppKit/CPAccordionView.j
index c9bcf71a7..ec1798a67 100644
--- a/AppKit/CPAccordionView.j
+++ b/AppKit/CPAccordionView.j
@@ -30,7 +30,12 @@
 
 #import "CoreGraphics/CGGeometry.h"
 
-
+/*!
+  @ingroup appkit
+  @class CPAccordionViewItem
+  
+  

A CPAccordionViewItem represents a single section of a CPAccordionView.

+*/ @implementation CPAccordionViewItem : CPObject { CPString _identifier @accessors(property=identifier); @@ -43,6 +48,10 @@ return [self initWithIdentifier:@""]; } +/*! + Initializes a new CPAccordionViewItem with the specified identifier. This identifier may + then be used in subsequent methods to provide abstract introspection of the CPAccordionView. +*/ - (id)initWithIdentifier:(CPString)anIdentifier { self = [super init]; @@ -55,6 +64,25 @@ @end +/*! + @ingroup appkit + @class CPAccordionView + +

CPAccordionView provides a container for CPAccordionViewItem objects and manages layout state + for all sublayout items.

+ + Example
+
+var myAccordionView = [[CPAccordionView alloc] initWithFrame:CGRectMakeZero()];
+var firstItem = [[CPAccordionViewItem alloc] initWithIdentifier:@"firstSection"]];
+[firstItem setView:[[CPView alloc] initWithFrame:CGRectMakeZero()]];
+var secondItem = [[CPAccordionViewItem alloc] initWithIdentifier:@"secondSection"]];
+[secondItem setView:[[CPView alloc] initWithFrame:CGRectMakeZero()]];
+[myAccordionView addItem:firstItem];
+[myAccordionView addItem:secondItem];
+[myAccordionView setAutoresizingMask: CPViewWidthSizable | CPViewHeightSizable];
+  
+*/ @implementation CPAccordionView : CPView { CPInteger _dirtyItemIndex; @@ -64,7 +92,10 @@ CPMutableArray _itemViews; CPIndexSet _expandedItemIndexes; } - +/*! + Initializes the receiver for usage with the specified bounding rectangle + @return the initialized view +*/ - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; @@ -95,7 +126,11 @@ { return _items; } - +/*! + Append a CPAccordionViewItem to the receiver. Note that the CPAccordionViewItem must contain + a valid CPView derived component or a TypeError will be generated when the contents of the + ViewItem are disclosed. +*/ - (void)addItem:(CPAccordionViewItem)anItem { [self insertItem:anItem atIndex:_items.length]; From 4520715b5bf92794cf2504dab54e3e7922655ce4 Mon Sep 17 00:00:00 2001 From: Saikat Chakrabarti Date: Thu, 8 Apr 2010 20:38:34 -0700 Subject: [PATCH 118/175] Making CPURLConnection authentication challenges happen before the delegate gets a response --- Foundation/CPURLConnection.j | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index 0d8c7b2a7..368173e34 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -238,24 +238,22 @@ var CPURLConnectionDelegate = nil; var statusCode = _HTTPRequest.status(), URL = [_request URL]; - if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) + if (statusCode === 401 && [CPURLConnectionDelegate respondsToSelector:@selector(connectionDidReceiveAuthenticationChallenge:)]) + [CPURLConnectionDelegate connectionDidReceiveAuthenticationChallenge:self]; + else { - if (_isLocalFileConnection) - [_delegate connection:self didReceiveResponse:[[CPURLResponse alloc] initWithURL:URL]]; - else - { - var response = [[CPHTTPURLResponse alloc] initWithURL:URL]; - - [response _setStatusCode:statusCode]; - - [_delegate connection:self didReceiveResponse:response]; + if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) + { + if (_isLocalFileConnection) + [_delegate connection:self didReceiveResponse:[[CPURLResponse alloc] initWithURL:URL]]; + else + { + var response = [[CPHTTPURLResponse alloc] initWithURL:URL]; + [response _setStatusCode:statusCode]; + [_delegate connection:self didReceiveResponse:response]; + } } - } - if (!_isCanceled) - { - if (statusCode === 401 && [CPURLConnectionDelegate respondsToSelector:@selector(connectionDidReceiveAuthenticationChallenge:)]) - [CPURLConnectionDelegate connectionDidReceiveAuthenticationChallenge:self]; - else + if (!_isCanceled) { if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) [_delegate connection:self didReceiveData:_HTTPRequest.responseText()]; From 61b9c7a1eea8429c678f1a467acd5d1431fa3330 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Sun, 16 May 2010 13:19:28 -0500 Subject: [PATCH 119/175] Moved depreciated CPGeometry methods to CGGeomotry and fixed the filename in the header. --- AppKit/CPViewAnimation.j | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/AppKit/CPViewAnimation.j b/AppKit/CPViewAnimation.j index 692523584..feb6884c0 100644 --- a/AppKit/CPViewAnimation.j +++ b/AppKit/CPViewAnimation.j @@ -1,5 +1,5 @@ /* - * CPFlashView.j + * CPViewAnimation.j * AppKit * * Created by Klaas Pieter Annema on September 3, 2009. @@ -22,6 +22,8 @@ @import +#include "CoreGraphics/CGGeometry.h" + CPViewAnimationTargetKey = @"CPViewAnimationTarget"; CPViewAnimationStartFrameKey = @"CPViewAnimationStartFrame"; CPViewAnimationEndFrameKey = @"CPViewAnimationEndFrame"; @@ -80,14 +82,14 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut"; view = [self _targetView:dictionary] startFrame = [self _startFrame:dictionary] endFrame = [self _endFrame:dictionary] - differenceFrame = CPRectMakeZero(); + differenceFrame = _CGRectMakeZero(); differenceFrame.origin.x = endFrame.origin.x - startFrame.origin.x; differenceFrame.origin.y = endFrame.origin.y - startFrame.origin.y; differenceFrame.size.width = endFrame.size.width - startFrame.size.width; differenceFrame.size.height = endFrame.size.height - startFrame.size.height; - var intermediateFrame = CPRectMakeZero(); + var intermediateFrame = _CGRectMakeZero(); intermediateFrame.origin.x = startFrame.origin.x + differenceFrame.origin.x * progress; intermediateFrame.origin.y = startFrame.origin.y + differenceFrame.origin.y * progress; intermediateFrame.size.width = startFrame.size.width + differenceFrame.size.width * progress; @@ -103,7 +105,7 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut"; [view setAlphaValue:1.0 + ( 0.0 - 1.0 ) * progress]; if (progress === 1.0) - [view setHidden:CPRectIsNull(endFrame) || [view alphaValue] === 0.0]; + [view setHidden:_CGRectIsNull(endFrame) || [view alphaValue] === 0.0]; } } @@ -124,7 +126,7 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut"; else if (effect === CPViewAnimationFadeOutEffect) [view setAlphaValue:0.0]; - [view setHidden:CPRectIsNull(endFrame) || [view alphaValue] === 0.0]; + [view setHidden:_CGRectIsNull(endFrame) || [view alphaValue] === 0.0]; } [super stopAnimation]; @@ -139,7 +141,7 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut"; return targetView; } -- (CPRect)_startFrame:(CPDictionary)dictionary +- (CGRect)_startFrame:(CPDictionary)dictionary { var startFrame = [dictionary valueForKey:CPViewAnimationStartFrameKey]; if (!startFrame) @@ -148,7 +150,7 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut"; return startFrame; } -- (CPRect)_endFrame:(CPDictionary)dictionary +- (CGRect)_endFrame:(CPDictionary)dictionary { var endFrame = [dictionary valueForKey:CPViewAnimationEndFrameKey]; if (!endFrame) From 202243f7111234928bc5b7c05427fab855ab4270 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Sun, 16 May 2010 13:41:09 -0500 Subject: [PATCH 120/175] fixed typo in CPViewAnimation. --- AppKit/CPViewAnimation.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPViewAnimation.j b/AppKit/CPViewAnimation.j index feb6884c0..b1bc4d414 100644 --- a/AppKit/CPViewAnimation.j +++ b/AppKit/CPViewAnimation.j @@ -71,7 +71,7 @@ CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut"; [super startAnimation]; } -- (void)setCurrentProgress:(NSAnimationProgress)progress +- (void)setCurrentProgress:(CPAnimationProgress)progress { [super setCurrentProgress:progress]; From 9b926be5576f0d5cfc4d813a551fe8fabb44e7c8 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Tue, 11 May 2010 14:13:01 -0400 Subject: [PATCH 121/175] Support CPOutlineView inline editing. --- AppKit/CPOutlineView.j | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 7c396f1f9..aae338883 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -887,6 +887,13 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt return [_outlineView._outlineViewDataSource outlineView:_outlineView objectValueForTableColumn:aTableColumn byItem:_outlineView._itemsForRows[aRow]]; } +- (void)tableView:(CPTableView)aTableView setObjectValue:(id)aValue forTableColumn:(CPTableColumn)aColumn row:(CPInteger)aRow +{ + if (!(_outlineView._implementedOutlineViewDataSourceMethods & CPOutlineViewDataSource_outlineView_setObjectValue_forTableColumn_byItem_)) + return; + [_outlineView._outlineViewDataSource outlineView:_outlineView setObjectValue:aValue forTableColumn:aColumn byItem:_outlineView._itemsForRows[aRow]]; +} + - (BOOL)tableView:(CPTableView)aTableColumn writeRowsWithIndexes:(CPIndexSet)theIndexes toPasteboard:(CPPasteboard)thePasteboard { if (!(_outlineView._implementedOutlineViewDataSourceMethods & CPOutlineViewDataSource_outlineView_writeItems_toPasteboard_)) @@ -1014,6 +1021,14 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt return YES; } +- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)aColumn row:(int)aRow +{ + if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_shouldEditTableColumn_item_)) + return [_outlineView._outlineViewDelegate outlineView:_outlineView shouldEditTableColumn:aColumn item:[_outlineView itemAtRow:aRow]]; + + return NO; +} + - (float)tableView:(CPTableView)theTableView heightOfRow:(int)theRow { if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_heightOfRowByItem_)) From f90222359751cec2e95c17caaa4fb9f6e19e1ebc Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Tue, 11 May 2010 15:00:25 -0400 Subject: [PATCH 122/175] Edit table cells programmatically (editColumn:row:withEvent:select:). Also implements editedColumn and editedRow. --- AppKit/CPTableView.j | 45 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 75e096ce5..c70f10759 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -1025,12 +1025,44 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; /* * - preparedCellAtColumn:row: */ + //Editing Cells -/* - * - editColumn:row:withEvent:select: - * - editedColumn - * - editedRow + +/*! + Edits the indicated row. */ +- (void)editColumn:(CPInteger)columnIndex row:(CPInteger)rowIndex withEvent:(CPEvent)theEvent select:(BOOL)flag +{ + if (![self isRowSelected:rowIndex]) + [[CPException exceptionWithName:@"Error" reason:@"Attempt to edit row="+rowIndex+" when not selected." userInfo:nil] raise]; + + // TODO Do something with flag. + + _editingCellIndex = CGPointMake(columnIndex, rowIndex); + [self reloadDataForRowIndexes:[CPIndexSet indexSetWithIndex:rowIndex] + columnIndexes:[CPIndexSet indexSetWithIndex:columnIndex]]; +} + +/*! + Returns the column of the currently edited cell, or -1 if none. +*/ +- (CPInteger)editedColumn +{ + if (!_editingCellIndex) + return -1; + return _editingCellIndex.x; +} + +/*! + Returns the row of the currently edited cell, or -1 if none. +*/ +- (CPInteger)editedRow +{ + if (!_editingCellIndex) + return -1; + return _editingCellIndex.x; +} + //Setting Auxiliary Views /* * - setHeaderView: @@ -2814,10 +2846,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; shouldEdit = [_delegate tableView:self shouldEditTableColumn:column row:rowIndex]; if (shouldEdit) { - _editingCellIndex = CGPointMake(columnIndex, rowIndex); - [self reloadDataForRowIndexes:[CPIndexSet indexSetWithIndex:rowIndex] - columnIndexes:[CPIndexSet indexSetWithIndex:columnIndex]]; - + [self editColumn:columnIndex row:rowIndex withEvent:nil select:YES]; return; } } From a4cadc5fb351d81fa7a7c14b7d81ca31ad925648 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Thu, 13 May 2010 11:48:52 +0200 Subject: [PATCH 123/175] CPOutlineView: fix for _retargetedDropRow not set when retargeting an item which resulted in a wrong drop line position --- AppKit/CPOutlineView.j | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index aae338883..3e846db39 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -536,6 +536,12 @@ CPOutlineViewDropOnItemIndex = -1; _retargedChildIndex = theIndex; _shouldRetargetChildIndex = YES; + + // set CPTableView's _retargetedDropRow based on retargetedItem and retargetedChildIndex + var retargetedItemInfo = (_retargetedItem !== nil) ? _itemInfosForItems[[_retargetedItem UID]] : _rootItemInfo, + retargetedChildItem = (_retargedChildIndex !== CPOutlineViewDropOnItemIndex) ? retargetedItemInfo.children[_retargedChildIndex] : _retargetedItem; + + _retargetedDropRow = [self rowForItem:retargetedChildItem]; } - (void)_draggingEnded From 0be23981f33f6c08313ca9bf6500402083ac797b Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 16 May 2010 20:48:06 -0400 Subject: [PATCH 124/175] Fixed a nonsensical CPTableview highlight style check which only accidentally did the right thing. --- AppKit/CPTableView.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index c70f10759..c2a4f263a 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -2486,7 +2486,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; - (void)highlightSelectionInClipRect:(CGRect)aRect { - if (_selectionHighlightStyle === CPTableViewDraggingDestinationFeedbackStyleNone) + if (_selectionHighlightStyle === CPTableViewSelectionHighlightStyleNone) return; var context = [[CPGraphicsContext currentContext] graphicsPort], From d252e9489283e7aeef28ef0425cb437cfecf1792 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Wed, 19 May 2010 00:13:05 -0500 Subject: [PATCH 125/175] CPOutlineView item Expande/Collapse delegate method notifications Conflicts: AppKit/CPOutlineView.j --- AppKit/CPOutlineView.j | 72 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 3e846db39..00d43d849 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -224,8 +224,14 @@ CPOutlineViewDropOnItemIndex = -1; if (!itemInfo) return; - + + if (itemInfo.isExpanded) + return; + + [self _noteItemWillExpand]; itemInfo.isExpanded = YES; + [self _noteItemDidExpand]; + [self reloadItem:anItem reloadChildren:YES]; if (shouldExpandChildren) @@ -251,7 +257,9 @@ CPOutlineViewDropOnItemIndex = -1; if (!itemInfo.isExpanded) return; + [self _noteItemWillCollapse]; itemInfo.isExpanded = NO; + [self _noteItemDidCollapse]; [self reloadItem:anItem reloadChildren:YES]; } @@ -474,6 +482,36 @@ CPOutlineViewDropOnItemIndex = -1; selector:@selector(outlineViewSelectionIsChanging:) name:CPOutlineViewSelectionIsChangingNotification object:self]; + + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemWillExpand:)]) + [defaultCenter + addObserver:_outlineViewDelegate + selector:@selector(outlineViewItemWillExpand:) + name:CPOutlineViewItemWillExpandNotification + object:self]; + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemDidExpand:)]) + [defaultCenter + addObserver:_outlineViewDelegate + selector:@selector(outlineViewItemDidExpand:) + name:CPOutlineViewItemDidExpandNotification + object:self]; + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemWillCollapse:)]) + [defaultCenter + addObserver:_outlineViewDelegate + selector:@selector(outlineViewItemWillCollapse:) + name:CPOutlineViewItemWillCollapseNotification + object:self]; + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemDidCollapse:)]) + [defaultCenter + addObserver:_outlineViewDelegate + selector:@selector(outlineViewItemDidCollapse:) + name:CPOutlineViewItemDidCollapseNotification + object:self]; + } - (id)delegate @@ -722,6 +760,38 @@ CPOutlineViewDropOnItemIndex = -1; userInfo:nil]; } +- (void)_noteItemWillExpand +{ + [[CPNotificationCenter defaultCenter] + postNotificationName:CPOutlineViewItemWillExpandNotification + object:self + userInfo:nil]; +} + +- (void)_noteItemDidExpand +{ + [[CPNotificationCenter defaultCenter] + postNotificationName:CPOutlineViewItemDidExpandNotification + object:self + userInfo:nil]; +} + +- (void)_noteItemWillCollapse +{ + [[CPNotificationCenter defaultCenter] + postNotificationName:CPOutlineViewItemWillCollapseNotification + object:self + userInfo:nil]; +} + +- (void)_noteItemDidCollapse +{ + [[CPNotificationCenter defaultCenter] + postNotificationName:CPOutlineViewItemDidCollapseNotification + object:self + userInfo:nil]; +} + @end // FIX ME: We're using with() here because Safari fails if we use anOutlineView._itemInfosForItems or whatever... From efb752f1f4f4200113f6b28c570dd5ea0b6f84e9 Mon Sep 17 00:00:00 2001 From: Blair Duncan Date: Sat, 27 Feb 2010 21:44:06 -0500 Subject: [PATCH 126/175] CPOutlineView, forgot to unregister notifications prior to adding them in the last commit. --- AppKit/CPOutlineView.j | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 00d43d849..04f3eda65 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -435,6 +435,35 @@ CPOutlineViewDropOnItemIndex = -1; removeObserver:_outlineViewDelegate name:CPOutlineViewSelectionIsChangingNotification object:self]; + + + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemWillExpand:)]) + [defaultCenter + removeObserver:_outlineViewDelegate + name:CPOutlineViewItemWillExpandNotification + object:self]; + + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemDidExpand:)]) + [defaultCenter + removeObserver:_outlineViewDelegate + name:CPOutlineViewItemDidExpandNotification + object:self]; + + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemWillCollapse:)]) + [defaultCenter + removeObserver:_outlineViewDelegate + name:CPOutlineViewItemWillCollapseNotification + object:self]; + + + if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewItemDidCollapse:)]) + [defaultCenter + removeObserver:_outlineViewDelegate + name:CPOutlineViewItemDidCollapseNotification + object:self]; } _outlineViewDelegate = aDelegate; From f0501f84940f9688841a177130723b271abcd766 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Wed, 19 May 2010 00:29:12 -0500 Subject: [PATCH 127/175] Fixed regression from last commits where children would fail to expand. --- AppKit/CPOutlineView.j | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 04f3eda65..3475765fa 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -216,7 +216,7 @@ CPOutlineViewDropOnItemIndex = -1; - (void)expandItem:(id)anItem expandChildren:(BOOL)shouldExpandChildren { var itemInfo = null; - + if (!anItem) itemInfo = _rootItemInfo; else @@ -225,15 +225,15 @@ CPOutlineViewDropOnItemIndex = -1; if (!itemInfo) return; - if (itemInfo.isExpanded) - return; + // to prevent items which are already expanded from firing notifications + if (!itemInfo.isExpanded) + { + [self _noteItemWillExpand]; + itemInfo.isExpanded = YES; + [self _noteItemDidExpand]; + [self reloadItem:anItem reloadChildren:YES]; + } - [self _noteItemWillExpand]; - itemInfo.isExpanded = YES; - [self _noteItemDidExpand]; - - [self reloadItem:anItem reloadChildren:YES]; - if (shouldExpandChildren) { var children = itemInfo.children, From 76443a5d7f6546efc9828d64c857798b554bade7 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Wed, 19 May 2010 01:02:39 -0500 Subject: [PATCH 128/175] Fire selectionIsChanging when selecting column. closes #437 --- AppKit/CPTableView.j | 1 + 1 file changed, 1 insertion(+) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index c2a4f263a..52de26a13 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -1724,6 +1724,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; if (_allowsColumnSelection) { + [self _noteSelectionIsChanging]; if (modifierFlags & CPCommandKeyMask) { if ([self isColumnSelected:clickedColumn]) From a9f970459b1fcb67ba8e454294edb26139b0f102 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Wed, 19 May 2010 01:33:13 -0500 Subject: [PATCH 129/175] Fix for undoManager thowing exception in -canUndo. --- Foundation/CPUndoManager.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Foundation/CPUndoManager.j b/Foundation/CPUndoManager.j index 7d9c8d8f0..94b9f6516 100644 --- a/Foundation/CPUndoManager.j +++ b/Foundation/CPUndoManager.j @@ -317,8 +317,8 @@ if (_currentGroup == nil) { if (_undoStack.length > 0) return YES; - - return [_currentGrouping actions].length > 0; + + return [[_currentGrouping invocations] count] > 0; } // Preform Undo and Redo From d6ac30be75d0c44ed552d817db4802e2c24926be Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Wed, 19 May 2010 01:55:01 -0500 Subject: [PATCH 130/175] CPTableView dataViews when selected now use the new CPThemeStateSelectedDataView state to avoid conflict with other CPControl theme states. --- AppKit/CPTableColumn.j | 4 ++-- AppKit/CPTableView.j | 13 ++++++------- AppKit/CPTheme.j | 1 + 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 5c6b91cea..81017b7c8 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -81,8 +81,8 @@ CPTableColumnUserResizingMask = 1 << 1; var textDataView = [CPTextField new]; [textDataView setLineBreakMode:CPLineBreakByTruncatingTail]; [textDataView setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"text-color"]; - [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; - [textDataView setValue:[CPFont boldSystemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelectedDataView]; + [textDataView setValue:[CPFont boldSystemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateSelectedDataView]; [textDataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; [self setDataView:textDataView]; } diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 52de26a13..3f89552c2 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -28,7 +28,6 @@ @import "_CPCornerView.j" @import "CPScroller.j" - CPTableViewColumnDidMoveNotification = @"CPTableViewColumnDidMoveNotification"; CPTableViewColumnDidResizeNotification = @"CPTableViewColumnDidResizeNotification"; CPTableViewSelectionDidChangeNotification = @"CPTableViewSelectionDidChangeNotification"; @@ -866,7 +865,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; var view = context[rowIndex], selector = select ? @"setThemeState:" : @"unsetThemeState:"; - [view performSelector:CPSelectorFromString(selector) withObject:CPThemeStateSelected]; + [view performSelector:CPSelectorFromString(selector) withObject:CPThemeStateSelectedDataView]; } - (void)_updateHighlightWithOldColumns:(CPIndexSet)oldColumns newColumns:(CPIndexSet)newColumns @@ -896,7 +895,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; { var rowIndex = selectRows[i], dataView = dataViewsInTableColumn[rowIndex]; - [dataView unsetThemeState:CPThemeStateSelected]; + [dataView unsetThemeState:CPThemeStateSelectedDataView]; } if (_headerView) @@ -917,7 +916,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; { var rowIndex = selectRows[i], dataView = dataViewsInTableColumn[rowIndex]; - [dataView setThemeState:CPThemeStateSelected]; + [dataView setThemeState:CPThemeStateSelectedDataView]; } if (_headerView) { @@ -1827,7 +1826,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; if (_headerView) { if (_currentHighlightedTableColumn != nil) - [[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateSelected]; + [[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateSelectedDataView]; if (aTableColumn != nil) [[aTableColumn headerView] setThemeState:CPThemeStateSelected]; @@ -2201,9 +2200,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]]; if (isColumnSelected || [self isRowSelected:row]) - [dataView setThemeState:CPThemeStateSelected]; + [dataView setThemeState:CPThemeStateSelectedDataView]; else - [dataView unsetThemeState:CPThemeStateSelected]; + [dataView unsetThemeState:CPThemeStateSelectedDataView]; if (_implementedDelegateMethods & CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_) [_delegate tableView:self willDisplayView:dataView forTableColumn:tableColumn row:row]; diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index 77bac886d..4b37e6d7a 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -242,6 +242,7 @@ CPThemeStateNormal = CPThemeStates["normal"] = 0; CPThemeStateDisabled = CPThemeState("disabled"); CPThemeStateHighlighted = CPThemeState("highlighted"); CPThemeStateSelected = CPThemeState("selected"); +CPThemeStateSelectedDataView = CPThemeState("selectedDataView"); CPThemeStateBezeled = CPThemeState("bezeled"); CPThemeStateBordered = CPThemeState("bordered"); CPThemeStateEditable = CPThemeState("editable"); From 1bc8536f0eec7dac1ac08ab9a27760b8d75d937d Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Wed, 19 May 2010 21:15:50 -0500 Subject: [PATCH 131/175] Row indexes which no longer exist are removed from selectedRowIndexes. --- AppKit/CPTableView.j | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 3f89552c2..2ef0dde9b 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -1500,8 +1500,19 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; - (void)noteNumberOfRowsChanged { + var oldNumberOfRows = _numberOfRows; + _numberOfRows = [_dataSource numberOfRowsInTableView:self]; + // remove row indexes from the selection if they no longer exist + var hangingSelections = oldNumberOfRows - _numberOfRows; + + if (hangingSelections > 0) + { + [_selectedRowIndexes removeIndexesInRange:CPMakeRange(_numberOfRows, hangingSelections)]; + [self _noteSelectionDidChange]; + } + [self tile]; } From e96678eebcc249243a00ce311a589d9b999505e6 Mon Sep 17 00:00:00 2001 From: Alan Rogers Date: Thu, 20 May 2010 16:47:42 +1000 Subject: [PATCH 132/175] Fix for gh issue #674: passing item in userInfo for the will/did expand/collapse notifications for the OutlineView. --- AppKit/CPOutlineView.j | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 3475765fa..df90c688d 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -228,9 +228,9 @@ CPOutlineViewDropOnItemIndex = -1; // to prevent items which are already expanded from firing notifications if (!itemInfo.isExpanded) { - [self _noteItemWillExpand]; + [self _noteItemWillExpand:anItem]; itemInfo.isExpanded = YES; - [self _noteItemDidExpand]; + [self _noteItemDidExpand:anItem]; [self reloadItem:anItem reloadChildren:YES]; } @@ -257,9 +257,9 @@ CPOutlineViewDropOnItemIndex = -1; if (!itemInfo.isExpanded) return; - [self _noteItemWillCollapse]; + [self _noteItemWillCollapse:anItem]; itemInfo.isExpanded = NO; - [self _noteItemDidCollapse]; + [self _noteItemDidCollapse:anItem]; [self reloadItem:anItem reloadChildren:YES]; } @@ -789,36 +789,36 @@ CPOutlineViewDropOnItemIndex = -1; userInfo:nil]; } -- (void)_noteItemWillExpand +- (void)_noteItemWillExpand:(id)item { [[CPNotificationCenter defaultCenter] postNotificationName:CPOutlineViewItemWillExpandNotification object:self - userInfo:nil]; + userInfo:[CPDictionary dictionaryWithObject:item forKey:"CPObject"]]; } -- (void)_noteItemDidExpand +- (void)_noteItemDidExpand:(id)item { [[CPNotificationCenter defaultCenter] postNotificationName:CPOutlineViewItemDidExpandNotification object:self - userInfo:nil]; + userInfo:[CPDictionary dictionaryWithObject:item forKey:"CPObject"]]; } -- (void)_noteItemWillCollapse +- (void)_noteItemWillCollapse:(id)item { [[CPNotificationCenter defaultCenter] postNotificationName:CPOutlineViewItemWillCollapseNotification object:self - userInfo:nil]; + userInfo:[CPDictionary dictionaryWithObject:item forKey:"CPObject"]]; } -- (void)_noteItemDidCollapse +- (void)_noteItemDidCollapse:(id)item { [[CPNotificationCenter defaultCenter] postNotificationName:CPOutlineViewItemDidCollapseNotification object:self - userInfo:nil]; + userInfo:[CPDictionary dictionaryWithObject:item forKey:"CPObject"]]; } @end From 6a34329765ece4e227e5a456cabe93ed4c96d9cd Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 20 May 2010 18:52:43 +0200 Subject: [PATCH 133/175] fixed a typo where CPThemeStateSelectedDataView was set on the header view of a table column --- AppKit/CPTableView.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 2ef0dde9b..aad636598 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -1837,7 +1837,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; if (_headerView) { if (_currentHighlightedTableColumn != nil) - [[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateSelectedDataView]; + [[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateSelected]; if (aTableColumn != nil) [[aTableColumn headerView] setThemeState:CPThemeStateSelected]; From 79e8b6e242adf18a3fea225bc19598de243e398b Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Thu, 20 May 2010 19:39:44 -0500 Subject: [PATCH 134/175] Added API for changing tableview selection color and source list gradient. --- AppKit/CPTableView.j | 79 ++++++++++++++++++++------ Tests/Manual/TableTest/AppController.j | 48 +++++++++++++++- 2 files changed, 109 insertions(+), 18 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index aad636598..cd6b22c78 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -74,6 +74,10 @@ CPTableViewDraggingDestinationFeedbackStyleSourceList = 1; CPTableViewDropOn = 0; CPTableViewDropAbove = 1; +CPSourceListGradient = "CPSourceListGradient"; +CPSourceListTopLineColor = "CPSourceListTopLineColor"; +CPSourceListBottomLineColor = "CPSourceListBottomLineColor"; + // TODO: add docs CPTableViewSelectionHighlightStyleNone = -1; @@ -169,6 +173,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; unsigned _selectionHighlightStyle; CPTableColumn _currentHighlightedTableColumn; + CPColor _selectionHighlightColor; unsigned _gridStyleMask; CPColor _gridColor; @@ -288,6 +293,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; if (!_alternatingRowBackgroundColors) _alternatingRowBackgroundColors = [[CPColor whiteColor], [CPColor colorWithHexString:@"e4e7ff"]]; + _selectionHighlightColor = [CPColor colorWithHexString:@"5f83b9"]; + _tableColumnRanges = []; _dirtyTableColumnRangeIndex = 0; _numberOfHiddenColumns = 0; @@ -579,15 +586,67 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; //early return for IE. if (aSelectionHighlightStyle == CPTableViewSelectionHighlightStyleSourceList && !CPFeatureIsCompatible(CPHTMLCanvasFeature)) return; - + _selectionHighlightStyle = aSelectionHighlightStyle; - + [self setNeedsDisplay:YES]; + if (aSelectionHighlightStyle === CPTableViewSelectionHighlightStyleSourceList) _destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleSourceList; else _destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleRegular; } +/*! + Sets the highlight color for a row or column selection + @param aColor a CPColor +*/ +- (void)setSelectionHighlightColor:(CPColor)aColor +{ + if (aColor === _selectionHighlightColor) + return; + + _selectionHighlightColor = aColor; + [self setNeedsDisplay:YES]; +} + +/*! + Returns the highlight color for a row or column selection. +*/ +- (CPColor)selectionHighlightColor +{ + return _selectionHighlightColor; +} + +/*! + Sets the highlight gradient for a row or column selection + This is specific to the + @param aDictionary a CPDictionary expects three keys to be set: + CPSourceListGradient which is a CGGradient + CPSourceListTopLineColor which is a CPColor + CPSourceListBottomLineColor which is a CPColor +*/ +- (void)setSelectionGradientColors:(CPDictionary)aDictionary +{ + if ([aDictionary valueForKey:"CPSourceListGradient"] === _sourceListActiveGradient && [aDictionary valueForKey:"CPSourceListTopLineColor"] === _sourceListActiveTopLineColor && [aDictionary valueForKey:"CPSourceListBottomLineColor"] === _sourceListActiveBottomLineColor) + return; + + _sourceListActiveGradient = [aDictionary valueForKey:CPSourceListGradient]; + _sourceListActiveTopLineColor = [aDictionary valueForKey:CPSourceListTopLineColor] + _sourceListActiveBottomLineColor = [aDictionary valueForKey:CPSourceListBottomLineColor]; + [self setNeedsDisplay:YES] +} + +/*! + Returns a dictionary of containing the keys: + CPSourceListGradient + CPSourceListTopLineColor + CPSourceListBottomLineColor +*/ +- (CPDictionary)selectionGradientColors +{ + return [CPDictionary dictionaryWithObjects:[_sourceListActiveGradient, _sourceListActiveTopLineColor, _sourceListActiveBottomLineColor] forKeys:[CPSourceListGradient, CPSourceListTopLineColor, CPSourceListBottomLineColor]]; +} + /*! Sets the grid color in the non highlighted state. @param aColor a CPColor @@ -2568,7 +2627,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; if (!drawGradient) { - [[CPColor selectionColor] setFill]; + [_selectionHighlightColor setFill]; CGContextFillPath(context); } @@ -3401,20 +3460,6 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", @end -@implementation CPColor (tableview) - -+ (CPColor)selectionColor -{ - return [CPColor colorWithHexString:@"5f83b9"]; -} - -+ (CPColor)selectionColorSourceView -{ - return [CPColor colorWithPatternImage:[[CPImage alloc] initByReferencingFile:@"Resources/tableviewselection.png" size:CGSizeMake(6,22)]]; -} - -@end - @implementation CPIndexSet (tableview) - (void)removeMatches:otherSet diff --git a/Tests/Manual/TableTest/AppController.j b/Tests/Manual/TableTest/AppController.j index 327c8aa18..f383bcc8a 100644 --- a/Tests/Manual/TableTest/AppController.j +++ b/Tests/Manual/TableTest/AppController.j @@ -19,7 +19,7 @@ tableTestDragType = @"CPTableViewTestDragType"; dataSet2 = [], dataSet3 = []; - for(var i = 1; i < 100; i++) + for(var i = 1; i < 10; i++) { dataSet1[i - 1] = [CPNumber numberWithInt:i]; dataSet2[i - 1] = [CPNumber numberWithInt:i+10]; @@ -41,6 +41,7 @@ tableTestDragType = @"CPTableViewTestDragType"; [tableView registerForDraggedTypes:[CPArray arrayWithObject:tableTestDragType]]; [tableView setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle]; [tableView setDelegate:self]; + [tableView setSelectionHighlightColor:[CPColor redColor]]; [tableView setDataSource:self]; @@ -81,6 +82,46 @@ tableTestDragType = @"CPTableViewTestDragType"; [theWindow orderFront:self]; [self newWindow]; [self sourceList]; + + var button = [[CPButton alloc] initWithFrame:CGRectMake(10,10,100, 24)]; + [button setTitle:@"Remove Row"]; + [button setTarget:self]; + [button setAction:@selector(removeRow:)]; + [contentView addSubview:button]; + + var button = [[CPButton alloc] initWithFrame:CGRectMake(10,40,100, 24)]; + [button setTitle:@"Add Row"]; + [button setTarget:self]; + [button setAction:@selector(addRow:)]; + [contentView addSubview:button]; + + var sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [255.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2), + sourceListActiveTopLineColor = [CPColor colorWithCalibratedRed:(255.0/255.0) green:(123.0/255.0) blue:(218.0/255.0) alpha:1.0], + sourceListActiveBottomLineColor = [CPColor colorWithCalibratedRed:(255.0/255.0) green:(92.0/255.0) blue:(207.0/255.0) alpha:1.0]; + [tableView setSelectionGradientColors:[CPDictionary dictionaryWithObjects:[sourceListActiveGradient, sourceListActiveTopLineColor, sourceListActiveBottomLineColor] forKeys:[CPSourceListGradient, CPSourceListTopLineColor, CPSourceListBottomLineColor]]]; + + var button = [[CPButton alloc] initWithFrame:CGRectMake(10,70,100, 24)]; + [button setTitle:@"Switch Highlight"]; + [button setTarget:self]; + [button setAction:@selector(switchSelectionHighlightType:)]; + [contentView addSubview:button]; +} + +- (void)switchSelectionHighlightType:(id)sender +{ + [tableView setSelectionHighlightStyle: ABS([tableView selectionHighlightStyle] - 1)]; +} + +- (void)removeRow:(id)sender +{ + [dataSet1 removeObjectAtIndex:0]; + [tableView reloadData]; +} + +- (void)addRow:(id)sender +{ + [dataSet1 addObject:[dataSet1 count] || 0]; + [tableView reloadData]; } - (void)newWindow @@ -167,6 +208,11 @@ tableTestDragType = @"CPTableViewTestDragType"; [tableView3 setRowHeight:32.0]; [scrollView3 setDocumentView:tableView3]; [scrollView3 setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + + var sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [255.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2), + sourceListActiveTopLineColor = [CPColor colorWithCalibratedRed:(255.0/255.0) green:(123.0/255.0) blue:(218.0/255.0) alpha:1.0], + sourceListActiveBottomLineColor = [CPColor colorWithCalibratedRed:(255.0/255.0) green:(92.0/255.0) blue:(207.0/255.0) alpha:1.0]; + [tableView3 setSelectionGradientColors:[CPDictionary dictionaryWithObjects:[sourceListActiveGradient, sourceListActiveTopLineColor, sourceListActiveBottomLineColor] forKeys:[CPSourceListGradient, CPSourceListTopLineColor, CPSourceListBottomLineColor]]]; [[window3 contentView] addSubview:scrollView3]; From 08b06b8632cf133b1779cdfbcc82ec946352d119 Mon Sep 17 00:00:00 2001 From: klaaspieter Date: Thu, 20 May 2010 22:51:01 -0500 Subject: [PATCH 135/175] implemented CPCoding support for CPSortDescriptor and made CPTableColumn decode it's _sortDescriptorPrototype Conflicts: AppKit/CPTableColumn.j Tools/nib2cib/NSTableColumn.j --- AppKit/CPTableColumn.j | 10 ++++++++- Foundation/CPSortDescriptor.j | 28 +++++++++++++++++++++++++ Tools/nib2cib/NSAppKit.j | 1 + Tools/nib2cib/NSSortDescriptor.j | 35 ++++++++++++++++++++++++++++++++ Tools/nib2cib/NSTableColumn.j | 7 +++++-- 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 Tools/nib2cib/NSSortDescriptor.j diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 81017b7c8..14f239484 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -395,7 +395,9 @@ var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey", CPTableColumnWidthKey = @"CPTableColumnWidthKey", CPTableColumnMinWidthKey = @"CPTableColumnMinWidthKey", CPTableColumnMaxWidthKey = @"CPTableColumnMaxWidthKey", - CPTableColumnResizingMaskKey = @"CPTableColumnResizingMaskKey"; + CPTableColumnResizingMaskKey = @"CPTableColumnResizingMaskKey", + CPTableColumnIsHiddenkey = @"CPTableColumnIsHiddenKey", + CPSortDescriptorPrototypeKey = @"CPSortDescriptorPrototypeKey"; @implementation CPTableColumn (CPCoding) @@ -417,6 +419,9 @@ var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey", [self setHeaderView:[aCoder decodeObjectForKey:CPTableColumnHeaderViewKey]]; _resizingMask = [aCoder decodeBoolForKey:CPTableColumnResizingMaskKey]; + _isHidden = [aCoder decodeBoolForKey:CPTableColumnIsHiddenkey]; + + _sortDescriptorPrototype = [aCoder decodeObjectForKey:CPSortDescriptorPrototypeKey]; } return self; @@ -434,6 +439,9 @@ var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey", [aCoder encodeObject:_dataView forKey:CPTableColumnDataViewKey]; [aCoder encodeObject:_resizingMask forKey:CPTableColumnResizingMaskKey]; + [aCoder encodeBool:_isHidden forKey:CPTableColumnIsHiddenkey]; + + [aCoder encodeObject:_sortDescriptorPrototype forKey:CPSortDescriptorPrototypeKey]; } @end diff --git a/Foundation/CPSortDescriptor.j b/Foundation/CPSortDescriptor.j index c7b78c840..c7d29f16a 100755 --- a/Foundation/CPSortDescriptor.j +++ b/Foundation/CPSortDescriptor.j @@ -149,3 +149,31 @@ CPOrderedDescending = 1; } @end + +var CPSortDescriptorKeyKey = @"CPSortDescriptorKeyKey", // Don't you just love naming schemes ;) + CPSortDescriptorAscendingKey = @"CPSortDescriptorAscendingKey", + CPSortDescriptorSelectorKey = @"CPSortDescriptorSelectorKey"; + +@implementation CPSortDescriptor (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + if (self = [super init]) + { + _key = [aCoder decodeObjectForKey:CPSortDescriptorKeyKey]; + _ascending = [aCoder decodeBoolForKey:CPSortDescriptorAscendingKey]; + _selector = CPSelectorFromString([aCoder decodeObjectForKey:CPSortDescriptorSelectorKey]); + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_key forKey:CPSortDescriptorKeyKey]; + [aCoder encodeBool:_ascending forKey:CPSortDescriptorAscendingKey]; + [aCoder encodeObject:CPStringFromSelector(_selector) forKey:CPSortDescriptorSelectorKey]; +} + +@end + diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index 8a54fb2d1..96a3a52b8 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -67,6 +67,7 @@ @import "NSViewController.j" @import "NSWindowTemplate.j" @import "WebView.j" +@import "NSSortDescriptor.j" function CP_NSMapClassName(aClassName) diff --git a/Tools/nib2cib/NSSortDescriptor.j b/Tools/nib2cib/NSSortDescriptor.j new file mode 100644 index 000000000..c4f0beb87 --- /dev/null +++ b/Tools/nib2cib/NSSortDescriptor.j @@ -0,0 +1,35 @@ +@import + +@implementation CPSortDescriptor (NSCoding) +{ +} + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + if (self = [super init]) + { + _key = [aCoder decodeObjectForKey:@"NSKey"]; + _selector = CPSelectorFromString([aCoder decodeObjectForKey:@"NSSelector"]); + _ascending = [aCoder decodeBoolForKey:@"NSAscending"]; + } + + return self; +} + +@end + +@implementation NSSortDescriptor : CPSortDescriptor +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [CPSortDescriptor class]; +} + +@end \ No newline at end of file diff --git a/Tools/nib2cib/NSTableColumn.j b/Tools/nib2cib/NSTableColumn.j index 735ed5fc5..bdafee212 100644 --- a/Tools/nib2cib/NSTableColumn.j +++ b/Tools/nib2cib/NSTableColumn.j @@ -51,9 +51,12 @@ _minWidth = [aCoder decodeFloatForKey:@"NSMinWidth"]; _maxWidth = [aCoder decodeFloatForKey:@"NSMaxWidth"]; - _resizingMask = [aCoder decodeBoolForKey:@"NSIsResizable"]; + _resizingMask = [aCoder decodeBoolForKey:@"NSIsResizeable"] ? CPTableColumnUserResizingMask : CPTableColumnAutoresizingMask; + _isHidden = [aCoder decodeBoolForKey:@"NSHidden"]; + + _sortDescriptorPrototype = [aCoder decodeObjectForKey:@"NSSortDescriptorPrototype"]; } - + return self; } From 99bc5a018eaacf60ecfe90b0730aa6414f0d1ed8 Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Sun, 9 May 2010 22:41:07 -0400 Subject: [PATCH 136/175] Added segmented control graphics and theme method to support HUD style displays for CPSegmentedControl. --- AppKit/Themes/Aristo/ThemeDescriptors.j | 85 +++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index adc445107..5786c5ee0 100644 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -788,6 +788,91 @@ return [CPColor blackColor]; } ++ (CPPopUpButton)themedSegmentedControl +{ + var segmentedControl = [[CPSegmentedControl alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 24.0)]; + + [segmentedControl setTrackingMode:CPSegmentSwitchTrackingSelectAny]; + [segmentedControl setSegmentCount:3]; + + [segmentedControl setWidth:40.0 forSegment:0]; + [segmentedControl setLabel:@"foo" forSegment:0]; + [segmentedControl setTag:1 forSegment:0]; + + [segmentedControl setWidth:60.0 forSegment:1]; + [segmentedControl setLabel:@"bar" forSegment:1]; + [segmentedControl setTag:2 forSegment:1]; + + [segmentedControl setWidth:35.0 forSegment:2]; + [segmentedControl setLabel:@"1" forSegment:2]; + [segmentedControl setTag:3 forSegment:2]; + + //various colors + var centerBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-center.png" size:CGSizeMake(1.0, 24.0)]), + dividerBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-divider.png" size:CGSizeMake(1.0, 24.0)]), + centerHighlightedBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-center.png" size:CGSizeMake(1.0, 24.0)]), + dividerHighlightedBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-divider.png" size:CGSizeMake(1.0, 24.0)]), + leftHighlightedBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-left.png" size:CGSizeMake(4.0, 24.0)]), + rightHighlightedBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-right.png" size:CGSizeMake(4.0, 24.0)]), + inactiveCenterBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-disabled-center.png" size:CGSizeMake(1.0, 24.0)]), + inactiveDividerBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-disabled-divider.png" size:CGSizeMake(1.0, 24.0)]), + inactiveLeftBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-disabled-left.png" size:CGSizeMake(4.0, 24.0)]), + inactiveRightBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-disabled-right.png" size:CGSizeMake(4.0, 24.0)]), + inactiveHighlightedCenterBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-disabled-center.png" size:CGSizeMake(1.0, 24.0)]), + inactiveHighlightedDividerBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-disabled-divider.png" size:CGSizeMake(1.0, 24.0)]), + inactiveHighlightedLeftBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-disabled-left.png" size:CGSizeMake(4.0, 24.0)]), + inactiveHighlightedRightBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-highlighted-disabled-right.png" size:CGSizeMake(4.0, 24.0)]), + leftBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-left.png" size:CGSizeMake(4.0, 24.0)]), + rightBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-right.png" size:CGSizeMake(4.0, 24.0)]), + pushedCenterBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-pushed-center.png" size:CGSizeMake(1.0, 24.0)]), + pushedLeftBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-pushed-left.png" size:CGSizeMake(4.0, 24.0)]), + pushedRightBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-pushed-right.png" size:CGSizeMake(4.0, 24.0)]); + pushedHighlightedCenterBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-pushed-highlighted-center.png" size:CGSizeMake(1.0, 24.0)]), + pushedHighlightedLeftBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-pushed-highlighted-left.png" size:CGSizeMake(4.0, 24.0)]), + pushedHighlightedRightBezelColor = PatternColor([_CPCibCustomResource imageResourceWithName:@"HUD/segmented-control-bezel-pushed-highlighted-right.png" size:CGSizeMake(4.0, 24.0)]); + + [segmentedControl setValue:centerBezelColor forThemeAttribute:@"center-segment-bezel-color" inState:CPThemeStateNormal]; + [segmentedControl setValue:inactiveCenterBezelColor forThemeAttribute:@"center-segment-bezel-color" inState:CPThemeStateDisabled]; + [segmentedControl setValue:inactiveHighlightedCenterBezelColor forThemeAttribute:@"center-segment-bezel-color" inState:CPThemeStateSelected|CPThemeStateDisabled]; + [segmentedControl setValue:centerHighlightedBezelColor forThemeAttribute:@"center-segment-bezel-color" inState:CPThemeStateSelected]; + [segmentedControl setValue:pushedCenterBezelColor forThemeAttribute:@"center-segment-bezel-color" inState:CPThemeStateHighlighted]; + [segmentedControl setValue:pushedHighlightedCenterBezelColor forThemeAttribute:@"center-segment-bezel-color" inState:CPThemeStateHighlighted|CPThemeStateSelected]; + + [segmentedControl setValue:dividerBezelColor forThemeAttribute:@"divider-bezel-color" inState:CPThemeStateNormal]; + [segmentedControl setValue:inactiveDividerBezelColor forThemeAttribute:@"divider-bezel-color" inState:CPThemeStateDisabled]; + [segmentedControl setValue:inactiveHighlightedDividerBezelColor forThemeAttribute:@"divider-bezel-color" inState:CPThemeStateSelected|CPThemeStateDisabled]; + [segmentedControl setValue:dividerHighlightedBezelColor forThemeAttribute:@"divider-bezel-color" inState:CPThemeStateSelected]; + [segmentedControl setValue:dividerBezelColor forThemeAttribute:@"divider-bezel-color" inState:CPThemeStateHighlighted]; + + [segmentedControl setValue:rightBezelColor forThemeAttribute:@"right-segment-bezel-color" inState:CPThemeStateNormal]; + [segmentedControl setValue:inactiveRightBezelColor forThemeAttribute:@"right-segment-bezel-color" inState:CPThemeStateDisabled]; + [segmentedControl setValue:inactiveHighlightedRightBezelColor forThemeAttribute:@"right-segment-bezel-color" inState:CPThemeStateSelected|CPThemeStateDisabled]; + [segmentedControl setValue:rightHighlightedBezelColor forThemeAttribute:@"right-segment-bezel-color" inState:CPThemeStateSelected]; + [segmentedControl setValue:pushedRightBezelColor forThemeAttribute:@"right-segment-bezel-color" inState:CPThemeStateHighlighted]; + [segmentedControl setValue:pushedHighlightedRightBezelColor forThemeAttribute:@"right-segment-bezel-color" inState:CPThemeStateHighlighted|CPThemeStateSelected]; + + [segmentedControl setValue:leftBezelColor forThemeAttribute:@"left-segment-bezel-color" inState:CPThemeStateNormal]; + [segmentedControl setValue:inactiveLeftBezelColor forThemeAttribute:@"left-segment-bezel-color" inState:CPThemeStateDisabled]; + [segmentedControl setValue:inactiveHighlightedLeftBezelColor forThemeAttribute:@"left-segment-bezel-color" inState:CPThemeStateSelected|CPThemeStateDisabled]; + [segmentedControl setValue:leftHighlightedBezelColor forThemeAttribute:@"left-segment-bezel-color" inState:CPThemeStateSelected]; + [segmentedControl setValue:pushedLeftBezelColor forThemeAttribute:@"left-segment-bezel-color" inState:CPThemeStateHighlighted]; + [segmentedControl setValue:pushedHighlightedLeftBezelColor forThemeAttribute:@"left-segment-bezel-color" inState:CPThemeStateHighlighted|CPThemeStateSelected]; + + [segmentedControl setValue:CGInsetMake(0.0, 4.0, 0.0, 4.0) forThemeAttribute:@"content-inset" inState:CPThemeStateNormal]; + + [segmentedControl setValue:CGInsetMake(0.0, 0.0, 0.0, 0.0) forThemeAttribute:@"bezel-inset" inState:CPThemeStateNormal]; + + [segmentedControl setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font"]; + [segmentedControl setValue:[CPColor colorWithCalibratedWhite:255.0 / 255.0 alpha:1.0] forThemeAttribute:@"text-color"]; + [segmentedControl setValue:[CPColor colorWithCalibratedWhite:0.0 / 255.0 alpha:1.0] forThemeAttribute:@"text-shadow-color"]; + [segmentedControl setValue:CGSizeMake(-1.0, -1.0) forThemeAttribute:@"text-shadow-offset"]; + [segmentedControl setValue:CPLineBreakByTruncatingTail forThemeAttribute:@"line-break-mode"]; + + [segmentedControl setValue:1.0 forThemeAttribute:@"divider-thickness"]; + [segmentedControl setValue:24.0 forThemeAttribute:@"default-height"]; + + return segmentedControl; +} + (CPButton)themedButton { var button = [[CPButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 20.0)], From 16bf635acad02d32bffd18cde5cfe4b064132a5a Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Sun, 9 May 2010 22:45:03 -0400 Subject: [PATCH 137/175] Added images that I missed because git doesn't do recursive directories. --- .../HUD/segmented-control-bezel-center.png | Bin 0 -> 164 bytes .../segmented-control-bezel-disabled-center.png | Bin 0 -> 139 bytes .../segmented-control-bezel-disabled-divider.png | Bin 0 -> 121 bytes .../segmented-control-bezel-disabled-left.png | Bin 0 -> 227 bytes .../segmented-control-bezel-disabled-right.png | Bin 0 -> 228 bytes .../HUD/segmented-control-bezel-divider.png | Bin 0 -> 119 bytes ...egmented-control-bezel-highlighted-center.png | Bin 0 -> 154 bytes ...control-bezel-highlighted-disabled-center.png | Bin 0 -> 159 bytes ...ontrol-bezel-highlighted-disabled-divider.png | Bin 0 -> 121 bytes ...d-control-bezel-highlighted-disabled-left.png | Bin 0 -> 241 bytes ...rol-bezel-highlighted-disabled-right copy.png | Bin 0 -> 2922 bytes ...-control-bezel-highlighted-disabled-right.png | Bin 0 -> 246 bytes ...gmented-control-bezel-highlighted-divider.png | Bin 0 -> 121 bytes .../segmented-control-bezel-highlighted-left.png | Bin 0 -> 244 bytes ...segmented-control-bezel-highlighted-right.png | Bin 0 -> 246 bytes .../HUD/segmented-control-bezel-left.png | Bin 0 -> 225 bytes .../segmented-control-bezel-pushed-center.png | Bin 0 -> 145 bytes ...d-control-bezel-pushed-highlighted-center.png | Bin 0 -> 145 bytes ...ted-control-bezel-pushed-highlighted-left.png | Bin 0 -> 225 bytes ...ed-control-bezel-pushed-highlighted-right.png | Bin 0 -> 225 bytes .../HUD/segmented-control-bezel-pushed-left.png | Bin 0 -> 225 bytes .../HUD/segmented-control-bezel-pushed-right.png | Bin 0 -> 225 bytes .../HUD/segmented-control-bezel-right.png | Bin 0 -> 227 bytes 23 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-divider.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-divider.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-divider.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-right copy.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-divider.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-right.png diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-center.png new file mode 100644 index 0000000000000000000000000000000000000000..1e82207f01603708d0cb51ce752a7759764dca1d GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6}fr3IEGZ*$~m=B@PGk_b6~3v6PsJYz8)Xn#Y+k%9y+`G zw-w`o=2eT%@I3M6IBCE9ZGmH&kl@C`@}#w{Gj6(tR+fMN%4NWyVWX#ifMJIY&_o7L LS3j3^P6|6H_V+Po~-c73q4qIEGZ*N=iyd@JKK+HttUU_4Tzlv+#t|2fqCOU!TG> lTcS?2!k4j;rGbH&VH%I&#z%8Cp8z#7c)I$ztaD0e0svPAD~bRB literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-divider.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-divider.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebec04faefd9d16ea301579c5350d93242623f3 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6-j%#IEGZ*N=isb@L))4`|G1HNsh%>z?g|ef}vw0qo3`~ SnTvtS7(8A5T-G@yGywqn=^)Yo literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-left.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-left.png new file mode 100644 index 0000000000000000000000000000000000000000..26ddb947c71c44e52c6b08f6bd060165f3792ba0 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6}5W0IEGZ*N=j^C@Ki8kOA>TbP+Yrc(Ij;Rg$0L?96557 zN#)FsA3whQ|M&Owzvt)W*_PG+|M&6#|Nrx4I}TPwI|6H_V+Po~-c6}5S~IEGZ*N=i#e@L))iRQShpBwpg|nKR%1|Nj2|c00fP zx;s0I(}hm2kKZpLAt|}@$B!RhX3m&#CZge##J~Ul`4`=2)cP5@KxT#la|{EU0m}@D z3k-?6R|FIeM`i60$zuz6q|VKK+J6IA!iC!Z-`?I%Wo2#Mt#FcMflte-RjckU^`3r% ck%@<4TUHcDQ^4b=Ko>E1y85}Sb4q9e060cjRR910 literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-divider.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-divider.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7955d2d261b73f5708102469fe318fec798537 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;{6nVNhhE&{2N=Qh^U`T5FU!pvtkww{|fsw)Hj99*ORL*ap OA_h-aKbLh*2~7ao{UK!l literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-center.png new file mode 100644 index 0000000000000000000000000000000000000000..920b7280b460c3c0dd3a45f4f89230c9debeea90 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c71?;YIEGZ*O6d*cVo>05N@ZW$x2gEObGEX^4EaaSE(`@d zJ5vN17qbLQR!*F`#O2$g$mkdPCG)s~_pwSaIGfpDf3>`N3eX$|Pgg&ebxsLQ0IbX~ ADF6Tf literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png new file mode 100644 index 0000000000000000000000000000000000000000..15fd9d92946b1dd87a6ff56db2aac316955016e6 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*+pkIEGZ*O6fhx$)F&>{P@=LTPu%di2nAl5fJ&)!sFb* zsG;~Y=|6H_V+Po~-c6-j%#IEGZ*N=iyd@JL`1`l!&zopr0RIaiPXGV_ literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png new file mode 100644 index 0000000000000000000000000000000000000000..1a82ba435a3460e5864e6bbbeb484a38cceee71d GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6;1YZaSW-rwWRML7n326%j8*?Tm_G=e(iMd9?Qplza$@B z%)i&KnR8QZnS$Ia$14X|jLt|mF(ibzUya+U5W9SzeSCRr`G#xfPD%)G%Z(P&Tgr0e z46nkjGd!tWOn+?R+ODv5ha8huGClOE{AK#%<^E5*gPdI+Px&0NVA0I)b+XAZme+Fx pE*>)AIW2I=b+S3{9eE}mhTkuIqdS#lt^l3K;OXk;vd$@?2>>RcU5Nky literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-right copy.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-right copy.png new file mode 100644 index 0000000000000000000000000000000000000000..23587f0959f78991166852335ce5e9da0941cd39 GIT binary patch literal 2922 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 literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-divider.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-divider.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b2c7250c83d12599062f4da99084b4011d41cc GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6-j%#IEGZ*N=isb$Y4ln`|qPLNsh%>z?g|ef??A~#&w3; S(FcLb7(8A5T-G@yGywntav|6H_V+Po~-c6;1PWaSW-rm6Vc@kieEytzgEGWGANZFe5oRT1Q(w{p_hz zr%oR_awJ7XS2>w|%7b5DUyC!J-e3QJhlGUW&VT=YA7@}v(B=8RKxW5*`jW=_|Nj?r zCS?5VU-$HWeHX8)j>9zX|C19mgt@s-f48syU&oxul$hq~>UuH%{=Uvln~OaRjEpuJ r#_THb3|6H_V+Po~-c70vK;aSW-rm6Vc@kiqcC-=T)FgWu@bQT0Fn|Nj2|{CK~d ztZmVg0{zSDEkz0}Lmpr+xirAIuGOBZH@_pUXO@geCx5on*2A literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-left.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-left.png new file mode 100644 index 0000000000000000000000000000000000000000..e9803249705735fe3f956cb319055ab0cbc0887a GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*YUhIEGZ*N=j^CP*o^nOwx2ySjfaOnU#fQ&CD4yDk2+N z*yZKt-@U)Te&@eGKMx=H^8UX4#Q*>Q7c&}0=yP{4a2Xw7h+t6b4sGaUWj&M6ZTQc_Zqca*#oTE1#kmO;P*o)rri6%H^= XxZrU*&q(Mr&^ZjAu6{1-oD!M<^hZ#q literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-center.png new file mode 100644 index 0000000000000000000000000000000000000000..a5881501aa7bcc4ed7e6af84052dff8832582ad4 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6&ZWFIEGZ*N=isb$VdnY4*q@q%kS^`Y-(<9Zft4`B&M_~ rTsX2p^Wb`By<>kK9p!dwU|?o2EoA?G%kR!1pmqjNS3j3^P6|6H_V+Po~-c6&ZWFIEGZ*N=isb$VdnY4*q@q%kS^`Y-(<9Zft4`B&M_~ rTsX2p^Wb`By<>kK9p!dwU|?o2EoA?G%kR!1pmqjNS3j3^P6|6H_V+Po~-c6*YUhIEGZ*N=j*9P*o^nOwx2ySg53{YddrH?AuZ&o~0%x zC4GAE;K7F9pP%zz|NsBLNDJc&SCI$^>bP0l+XkK|Lsqz literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-right.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed9302ffafd3541a01782d30633e294e2555fbb GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*YUhIEGZ*N=i#e$Y4k^RjA`X)RUE!^}n&_eEj}8+h1Q^ zUXGb|e}BEPfsxUtqJn}OhK7cf28@_(qYko1;0N%Jlw9##lgTe~DWM4fEvr(W literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-left.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-left.png new file mode 100644 index 0000000000000000000000000000000000000000..3077ebaf054c35820844755815e10c6b1a560506 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*YUhIEGZ*N=j*9P*o^nOwx2ySg53{YddrH?AuZ&o~0%x zC4GAE;K7F9pP%zz|NsBLNDJc&SCI$^>bP0l+XkK|Lsqz literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-right.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed9302ffafd3541a01782d30633e294e2555fbb GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*YUhIEGZ*N=i#e$Y4k^RjA`X)RUE!^}n&_eEj}8+h1Q^ zUXGb|e}BEPfsxUtqJn}OhK7cf28@_(qYko1;0N%Jlw9##lgTe~DWM4fEvr(W literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-right.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f9cc2fc65defa3c799c252866f0b6dd81333dc0f GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6}5W0IEGZ*N=i#e$Y4k^RjA`X)RUH$_W%Fi-`{^8Zs&J@ ze`n|9)1O{n*JpEcbBnXHv$IxHQ{xv~VAS^i|NmwUy#-!^VjApfCm6&V7zpwUpnTw<2LnV(*j2gkqR;`k%d3j0IuYrM? Z!TeR!giQA}JU|CAc)I$ztaD0e0svmqP}l$f literal 0 HcmV?d00001 From 4020f9c6c2bab4bc29212bffd6399f2169ec87ff Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Sun, 9 May 2010 23:49:52 -0400 Subject: [PATCH 138/175] Adding images for sliders. --- .../Resources/HUD/horizontal-track-center.png | Bin 0 -> 130 bytes .../HUD/horizontal-track-disabled-center.png | Bin 0 -> 129 bytes .../HUD/horizontal-track-disabled-left.png | Bin 0 -> 182 bytes .../HUD/horizontal-track-disabled-right.png | Bin 0 -> 189 bytes .../Resources/HUD/horizontal-track-left.png | Bin 0 -> 185 bytes .../Resources/HUD/horizontal-track-right.png | Bin 0 -> 193 bytes .../Resources/HUD/vertical-track-bottom.png | Bin 0 -> 184 bytes .../Resources/HUD/vertical-track-center.png | Bin 0 -> 126 bytes .../HUD/vertical-track-disabled-bottom.png | Bin 0 -> 184 bytes .../HUD/vertical-track-disabled-center.png | Bin 0 -> 126 bytes .../Resources/HUD/vertical-track-disabled-top.png | Bin 0 -> 211 bytes .../Aristo/Resources/HUD/vertical-track-top.png | Bin 0 -> 204 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 AppKit/Themes/Aristo/Resources/HUD/horizontal-track-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/horizontal-track-disabled-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/horizontal-track-disabled-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/horizontal-track-disabled-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/horizontal-track-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/horizontal-track-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/vertical-track-bottom.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/vertical-track-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-bottom.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-top.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/vertical-track-top.png diff --git a/AppKit/Themes/Aristo/Resources/HUD/horizontal-track-center.png b/AppKit/Themes/Aristo/Resources/HUD/horizontal-track-center.png new file mode 100644 index 0000000000000000000000000000000000000000..b565d8e6aaac9d3df1fe9f2ffab4f912ae2ec746 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrF!3HE-TH59VDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MJk>yjv*Ddl7vJ>Z4WP5w5VvBXK?Umx$Zf0?o=;x@0a6b bVv%6*KE}Rk+D?gHpn3*RS3j3^P6DSr z1<%~X^wgl##FWaylc_d9MarHojv*DdlEg$seUqSU=T+3zzt4^I^z@We aIKW`?lx3cB+;nfCat2RVKbLh*2~7Zne8U}fi7AzZCsS>JiXuE+978H@sdPAU9Z=vokf1BJM6AE7y666D@xKQX+GAfO zSj^nuz{e>R7!l@jhcRJMN61ghImOJ$J#&I~6`gywSANH%nBr+cd1-Zyq4Tdr85qCX dn?Ij{nW0%gLV!OnXbI2`22WQ%mvv4FO#qlhJ>&oY literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/horizontal-track-disabled-right.png b/AppKit/Themes/Aristo/Resources/HUD/horizontal-track-disabled-right.png new file mode 100644 index 0000000000000000000000000000000000000000..d752a54ec809e468c65882636680fb8b8a6d5dfd GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c4!3HFg*81KCQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JisC(8978H@@tiW`YETeiOQ`;r5U|bCrGkO|ylBO#J|T%6 zrk&rM79Qi@cTi&U_j@b1mKlCl-1~j@wOvdzS_QP{6qjqVYA)^U5R1s3KWFort*7eu mbQt#8FPQR3;LuM_0|s$MRoR*9CuaezV(@hJb6Mw<&;$US1w!5c literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/horizontal-track-left.png b/AppKit/Themes/Aristo/Resources/HUD/horizontal-track-left.png new file mode 100644 index 0000000000000000000000000000000000000000..05ff0804eeef7537da01fde7f8611f7209b8fe36 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c4!3HFg*81KCQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JilRMT978H@C8eaNPiJ|=CMG7votE~@zGu;*MaDmW{77m1 zp(`zYn_rBPk&#njhrXuf&#vz7*XrC8iiI_PxJO0(vgPML@Bi%FxpV&8^X^Xi_3Nwl h`R)1lBN&-@78U}fi7AzZCsS>JijqBD978H@F@!R#`p+UNDth+s-@hz>{`@)d^XJb7W?fxf zQ(j))w=66y5^_AUiwzr>v~3wM;w=-qTcHu1u9S2g);ey85}Sb4q9e0E(PK&j0`b literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/vertical-track-bottom.png b/AppKit/Themes/Aristo/Resources/HUD/vertical-track-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..bdec637443d0bd4476d12e518f1eab328cabd9c6 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1d!3HGVjK4YnDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MNytEjv*DdlEMN4ems5s`uF+!_v5)wl>Ptl@iC)XUEROp z>+52Re|&n%{rl?baM{X=igU(GmoA<9|L5oS?7O>4g&j-6!ooNo|NsC0ri6sVlg1hR h9rlbLof{aK8JyoLKP>N9eGX^~gQu&X%Q~loCIC9{N|XQq literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/vertical-track-center.png b/AppKit/Themes/Aristo/Resources/HUD/vertical-track-center.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbcce41e702f1f7da4638646e767356d356670a GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1j!3HG7{-t~dQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiWEFu978H@B~6DSr z1<%~X^wgl##FWaylc_d9MNytEjv*Ddk^%z)R&3q6)s|z)e%qQK6Fy&9= z>tlB>`|$L%__NjF>$N_8_+XRn7+(2rwj- hDg5I+BG16Y!w~URCB$22rvT6v22WQ%mvv4FO#rn}NJ#(y literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-center.png b/AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-center.png new file mode 100644 index 0000000000000000000000000000000000000000..25675211c5931f71b1e4415d97a9c8ed0ecdd646 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1j!3HG7{-t~dQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiWEFu978H@B~6(=J-?u=?4Gi^`uD#V7rW1?{{F6%k;8z& YTae?v=)T);fod5%UHx3vIVCg!08d;e?*IS* literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-top.png b/AppKit/Themes/Aristo/Resources/HUD/vertical-track-disabled-top.png new file mode 100644 index 0000000000000000000000000000000000000000..12abe0927bdf9ce57dc180f06f7dc1262bff5ed4 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1h!3HF`e}{MjDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MWvoDjv*DdlBP_b{yaG$;R9QesKP$xBhiwgA|j6(cKDkCk{n8E) z6c(P4@Ziy-UxyDL{w$txL|#B%=LE}?mdK II;Vst0A(Lh&;S4c literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/vertical-track-top.png b/AppKit/Themes/Aristo/Resources/HUD/vertical-track-top.png new file mode 100644 index 0000000000000000000000000000000000000000..a27c09e56a6f26ffe8b7ccdce3e021f6ab9d1b94 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1h!3HF`e}{MjDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MR}esjv*DdlBP_bK0PfVVFud~Ifp&W9h+xJNJ@$`Y*Z5$ zzaA#Qd*t+t2BU9AMn=`4At8ATFKz$-|GzzrNoY+_P>_B@lm3#WOXHbD4Vy!Z7`Fa< z^6=r$lP6F96h6YvZDeTpH$5%wAO9l9ng#}DhFgUazg|u``4DI`gQu&X%Q~loCIAJ^ BNbdju literal 0 HcmV?d00001 From 5c2e6c8ed881aca8627bd4f7744b7005b4617c4a Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Mon, 10 May 2010 00:09:51 -0400 Subject: [PATCH 139/175] Matched up the knob images to those in the file and split them into HUD as well. --- .../Aristo/Resources/HUD/knob-highlighted.png | Bin 0 -> 1122 bytes AppKit/Themes/Aristo/Resources/HUD/knob.png | Bin 0 -> 1055 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 AppKit/Themes/Aristo/Resources/HUD/knob-highlighted.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/knob.png diff --git a/AppKit/Themes/Aristo/Resources/HUD/knob-highlighted.png b/AppKit/Themes/Aristo/Resources/HUD/knob-highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..68fa561525fbbc834ce0da4f3faad942dfac48fe GIT binary patch literal 1122 zcmV-o1fBbdP)aCc zrsH~2N+lAkk|@xqNEDC|qTnK;h=-6^u1Vu3&`V8I5Kpnwo9PAn%% z6QTf)<2bexCyt+E&x?CUXVU950XAIe)6vzL`OdlLp8Fl{?XQ;Ml*J)<0)g2(2#dgG z_75!a6jC02J_3ng0QWo+ngl(9E`fo2`*@J!PX9&&`gb~98=g{vhN^nR}MH~>+2|9QZnEw8LzU%K;61}2{U0)k-)@5;i`P-_WS=5BFV;}B-7IeYnwcILbHQqMi5 z-F)cd(_tZ@lVSy7zqaJ4IE&*x8uDI}2c$1)k{?8UT#uf##Fsqn{~0 z|MVl+-z~$~*qCcS`}lUB-{Ax>TD1f=hm0-Fv)$tMv8n4JK@iDL=225O>orgm1!P%< zZnq2NN~O=w^8)?Pk6Xdx5}8NgHooOJ4YER%$Xkz2JO=gJ0SJNsk|e?S_=KCWw>q5; z`Okf&z-UgNR&-t0Kp0sj>%#dA}^{zpsH$x%4YaLJM`q@-nC74XP7E zS5tR$`R%QhY!*yXSBg$Yhrc!pu)MnNTDtdq*@ZL|s)w1OnN%8erh$C6N8Uq)+v5bW zHgf&-PZk%`^~}O=Zic6U`j?in^~f`Ceu>0;$kX#)C@ZS@M zK%Rpr`bbyspp&wcceWwBn1+0%nmM1kbz6$Wsc>x(R8SpVat`Wn9AU@mm=$}iEU=N2*JZGtjNZ`)Hvju~?&>G=qw=f~F}Q;Pk6 z(sQrZ4J?g`Ek%FW#S_WQB+{`f8d&3hokVN^3vCAjNO&ra83tWM@4wDaI5ye669^}a oIg5GOCr*FPaUA%+*53jQ0Ah6@HgJ)rNdN!<07*qoM6N<$f}j=&ZvX%Q literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/knob.png b/AppKit/Themes/Aristo/Resources/HUD/knob.png new file mode 100644 index 0000000000000000000000000000000000000000..410f71ceb894e93146f43064928e2701ff23c970 GIT binary patch literal 1055 zcmV+)1mOFLP)Ne`u>D53?$iU%IFo@l9v78N{D1W}797D0cAqKFrW7bw=FRHfpHMf@iyf>&xh zN}Ke^Zq8=2>8|s(lXTNI{_7719GsG$1EeuGK|#FzzB}i*ayQf@y*LO??P?$ zYTQ6cp?0ZsjaQ9Q>BBX#Pq_Y;4XgSwV_{K)(;Fd}zOMen3X{pSkk#p@uq+DL4Y_msYMSn73fj8T-V-id<_BSj?GVF=avz z$3u^Yhqm?(`10NH{MEDO-H#qLIEjyN;o5EGfUPxa6T_kguHIBTb>{5y#_45~Ew=n| zzE^R=Iy)J2lwt+N47X3qD(6!Ns|TXdXi`DFKvG&#Tr_v*z5~_hPm?|*Eck6SXJu8&ObP@;p}4}+(+$_JT!7D? zK0;CH6sXy<4a}A-MJI|Pu&fR&S=m@3w`qcf!ORidK&qlxAP%BRZV+Hkmm6$0n=)U$ zcrHQj5A}kU)!B*vC^ca2x|ME-q0R$3|aY9}vGF1!jh8f6TDN zb6jgM7)-eKlI2w}HZNZR!FgHLngl)CdwJd&>)7F#qeA%k!_hLvYAs9E4yXcQ85Xao z0;9nI0g`A}XE%t^fv|YJJhVE#z9gR!iZcWptwT>58yX8H6jm~fCO17jy-^O= zY_0ozK5(`=K0La2r->|s6lX|Sa5ErABAv}m4^FsTF2Bd)Q5Yr@)VtkoKe0bUe7n#e zt21eb5-}4QHzsFn*`nnucjV?5lp098YgraF8V#u;2?zlQ_4Y#Bub-cqo9>@=wYR+| zK7R&x=-`J-d0XfKIYjcx=Pz7rE1Xn5IwLbrt7Q$M7zz2j{2!;|TT9D}r%xzoI|UZ@ z96BbQs;~R^t4IU`j%}Dt4~sQOl*ZOWL(z?)N8sHDjw+AV>EnloeHC#?u{WB|$jGQP zSpUHiZSMd*q!(>>?LQ*PQsOT&+0P=@R177cRW*oA%T1&NWOZ%FJ5~+;-~FIR6#TCM Z0{{}O=VnMT&CLJ+002ovPDHLkV1jBJ;tBu& literal 0 HcmV?d00001 From ce4e8dc8b7c82409552c106163303fc191466a06 Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Mon, 10 May 2010 00:23:19 -0400 Subject: [PATCH 140/175] Moved knobs down a pixel. --- .../Aristo/Resources/HUD/knob-highlighted.png | Bin 1122 -> 3822 bytes AppKit/Themes/Aristo/Resources/HUD/knob.png | Bin 1055 -> 3748 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/AppKit/Themes/Aristo/Resources/HUD/knob-highlighted.png b/AppKit/Themes/Aristo/Resources/HUD/knob-highlighted.png index 68fa561525fbbc834ce0da4f3faad942dfac48fe..5c4387a55c16f7d4b2ed6a433e9061a4dae1027c 100644 GIT binary patch literal 3822 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 delta 1101 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 Ef*(WUp8x;= From aaf5c7581cb9d66cdf8d8e7a64942c758eb29628 Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Mon, 17 May 2010 22:49:25 -0400 Subject: [PATCH 141/175] Moved the non-highlighted version of the knob down one more freaking pixel. --- AppKit/Themes/Aristo/Resources/HUD/knob.png | Bin 3748 -> 3694 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 AppKit/Themes/Aristo/Resources/HUD/knob.png diff --git a/AppKit/Themes/Aristo/Resources/HUD/knob.png b/AppKit/Themes/Aristo/Resources/HUD/knob.png old mode 100644 new mode 100755 index 77fe7f5e0fef267908fff247c4c6595b6a64e055..bad25cf31fa7e7e4272f5afc7f5565aeaaac5ff2 GIT binary patch delta 3674 zcmV-g4yEy=9qt^EBYz4(X+uL$Nkc;*P;zf(X>4Tx0C)kNmUmQB*%pV-y*Itk5+Wca z^cs2zAksTX6$DXM^`x7XQc?|s+008spb1j2M!0f022Sbr4m>%m+S6U)T+0vHeh z4p;%e;bvw8NBBen)cn0YnVG0a#2diz!JCV%YDoJ5ztS`M50QMwW zn;o;hl~n+=Z3aN);jB;ZAOP|O0JPqm^B#t5UXsM(3?~bV?CflF0iSCwE9f`-pMr17 zzlJ&Ynal3`Ry(E_KY=4j6*FZ;<)){mOGM1f3=WsiWc~LL|Kq?pY0b&QES#Uf7x9JY zRZ-}a34er%XuE|xfmo0(WD10T)!}~_HYW!eew}L+XmwuzeT6wtxJd`dZ#@7*BLgIE zKY9Xv>st^p3dp{^Xswa2bB{85{^$B13tWnB;Y>jyQ|9&zk7RNsqAVGs--K+z0uqo1 zbf5|}fi5rtEMN^BfHQCd-XH*kfJhJnmIE$G0)J^h1hPRs*Z>MaG1viigKBU9)PZ`? z1WtlBa0XliSHKN$3k-lqKnjMzOE3Z6foTYW@DLTEL8_1zqz{=w)({(72zf(6P&gC= z#Y2gZ5RyRo&?cxDDub$_Lr^{RBXk>%$GT@D&7?Df)BxS@M3%+z6yUFe;(hDAI85YkO^7@Yl06UmLMc-BvcR@ z2gb~6tQGuvWbRvcjdBj{|DY1^&LA*&ECQg$SNrogBQY0yvw1HGfY9d`GJ%1*> zA(P2EWJhusSwLP-t|XrzUnLKcKTwn?CKOLf97RIePB}`sKzTrUL#0v;sBY9)s+hW+ zT2H-1eM)^VN0T#`^Oxhvt&^*fYnAJldnHel*OzyfUoM{~Um<@={-*r60#U(0!Bc^w zuvVc);k3d%g-J!4qLpHZVwz%!Vt<3;HN{aSypn;Ew-QgOKCU1lj+6uALzaG31uZ^TjeO_9OWA2v&vEi!Z2X?Gg29)jFXJJjF0m) z=DE+~&)YVyXDz8V=CRT`Hx#x)t5ZkoxO<(lU- z$Fyi#3$+AVVL5M!`j4}Yh7b~ z$A)U-W3$et-R8BesV(1jzwLcHnq9En7Q0Tn&-M=XBKs!$F$X<|c!#|X_tWYh)GZit(Q)Cp9CDE^WG;+fcyOWA zRoj*0TI>4EP1lX*c7Mce#NF6E+5NctD-TN#kw=Til&6#D8qW(}h?lQdkyo#`lJ{co zYVW5$IzEX$jXo2;cD}29FZf~o0{wRS-SgM*=la+CPXsswtO@7}qy$C;RtG){G6@m| zbp*q~0l~Y1A1~5hBwW-M0z&*lc7;3%H4I%9`g0gAEHtbp?03l#rC8DKn|j zsm*DGwD`2sLM35}uq$0NJtw^{!!)BXL%Pao)$UajqCnA+Oek|%X1kb<{!H~qj3k>S zgINo+YO>yEM`fSNQOptM^yHf4Zp$6X^U3>uHD)z;b$@5RcK(L^!8Pt{4y}dOu3X!> zPIq0wy5aS{>yK?9ZAjVh%SOwMWgFjair&;wpi!{CU}&@N=Eg#~LQ&zpEzVmGY{hI9 zZ0+4-0xS$$Xe-OToc?Y*V;rTcf_b_jRe-RZjXSeas3 zUfIyD;D24M<;?P;^0&KJ?7miETXA3yX^&)&v@)o&y-KfYN7bk5r0RhhkDBJa>U+2C zo!ZCS*T3Iwf71bt1H}hE9uyqBf5`VxYpp?T#bMmxti#XiqUyT8XMbORMD0lNk2S0CmgB9Cz6E{f`d#}k-uAkE<&OWI8v~05`tB~i zd;ebCJ?VYk{m}=h4_-gadN}=P{bTIoq9+PZDxRu8t^L*b*Ji1`^z5M5V9&FNXOD)s zLoff8`L9pI1<$F^D@L?N>PM|d&y4wu-CugK^u_SYjF;2ng}*8Ow)d6MtDk;%`@Lsk z$;9w$(d(H%O5UixIr`T2ZRcd@> zO`9e+H~;R>rAle|i7E>B_Jf0m&UN{G1KYeUf6=hNh-?kAU_7HIB0a7z_^3zQsjT<>94;%zSFm(e>1J+DYCRo`F#GZ zV7-Pb?e_ckpZ)Iplk5+0kcOC%W5)lrp5~?_MOzJ}GnrKjd}GT|x^&?@O;0_huAW{x z_2pOO_B0uKUDrtvL~=JbAH~8IfG=2MWp(6C?h-`Fufc(x%D4>T*iwW#Iy#K;;$MH7 zI<`q>vg8oNPWW#Gf6Rc*A1rb`i>Sg)g+h@E1uo@PNhvaUyfEHiLx6Pe(qt=-FP0C%CMPe~!gyNOk0_&}LtTCbw+$ z1~xb%F&*dnS&C=Yf*{SiH*Z+uw=O4mn4u}J0hnnPABy7MZkpSMH1!(O*FgVoi+u6UV zzM)lc2(Fx-%P0wXZZ`C6a`OJf9oR7G8-R%|Z;OQ-aLVcpIN{ue%>Zv!ZV*l%=Qaj# zDx!b_ScoyFHRQ%(4tL=a)Ch0`K;o!_bh@9dJW%MLB?SgK$4^ sx$(vEDfkgIUP1g@WZlRu7Vk0n7d2hsAi`v*I{*Lx07*qoM6N<$g7C07VE_OC delta 3732 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 From 7519b7ab63d0a3610be44bafa98d891eb978c498 Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Mon, 17 May 2010 23:06:49 -0400 Subject: [PATCH 142/175] Added hud style for circular slider knob thing. --- .../Resources/HUD/slider-circular-bezel.png | Bin 0 -> 1496 bytes .../HUD/slider-circular-disabled-bezel.png | Bin 0 -> 1426 bytes .../HUD/slider-circular-disabled-knob.png | Bin 0 -> 199 bytes .../Resources/HUD/slider-circular-knob.png | Bin 0 -> 199 bytes AppKit/Themes/Aristo/ThemeDescriptors.j | 22 ++++++++++++++++++ 5 files changed, 22 insertions(+) create mode 100644 AppKit/Themes/Aristo/Resources/HUD/slider-circular-bezel.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/slider-circular-disabled-bezel.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/slider-circular-disabled-knob.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/slider-circular-knob.png mode change 100644 => 100755 AppKit/Themes/Aristo/ThemeDescriptors.j diff --git a/AppKit/Themes/Aristo/Resources/HUD/slider-circular-bezel.png b/AppKit/Themes/Aristo/Resources/HUD/slider-circular-bezel.png new file mode 100644 index 0000000000000000000000000000000000000000..69d5c29a98d03e15308bbe7ec3f07b4b6a3d1b66 GIT binary patch literal 1496 zcmV;}1t=RN1V?^Q*kQMwx}>244K4Vsk-QL*u}0L0@xwG8FY zMEE`|Bg9wSbHG;?a@BIr$pS#8W$2!N>DA2^OHqT-XnZiLB15uPTh8+ol%#%DlzeWt z`@GFIa`Mv;-o3)p0fxkgEGOu;LRf?%!0^UfNA~3wS`KGtW!`5g$fvxVY*MS$lwnS1 z9-^7Kc?yTaG(Kr3+vphC9n*hJjE%nY_M5MN!$12N5{p5Umb4{>#6>~>#QrBM>UZw? zqO`Q6s(eEUnayc5JMW@-mzN@u2zmYZ(?ltH9VI0tQMxIG?nyV%JU=rqG)x17Lp^P0 z&ph+}@vr*$F+XF;=qwT;muFw% z2~%nc=`|{9>$nu^?d^W*v!m}d^J88Xg2ay50wHov7#`nupk~KIdrofOQfGGiB?^TW zyc2tQr2~ydO-8+z+B+}Joolf+{P6A9SNUCEe9kDPNAi-OGSap_Q2$BIrcLHqmyd!$ zN#p|ZVYPq{_<~RP1_whcbMo+JPY?rnYOa597jMTpo_RHRD5=>)lvNCOAB_=0vJ@-$wE zT9h0|gEKjiI&d}+ZGlO!EDMAPVks2#Nm9s!&?VADPhqZj4kaR3i?G}28S@AH<$67; zDsjdf1TJPkGKxHi7b4BhI0k%PZ#f@!5~qSaGY5f-hvLu#GO<2<#nCQs{o2q)5AU+! zFgLRV!plNzBg4OfQ|68}G=#`^rscH;_!qE{$O zBZTne+#fwxj%Q?K9!l0G^X=N3%jqI;u;)3(A|WVk9OLG!%}ve4rR5D8ji%USGV#>f znaky($?>rfaIjYh0jKz|5;-Ct+mJX;##HO+=A-s0yN6HYYqs&h7ksvyI`JVmWG)=2 z{}sZMFq9EO<@mGz_sbn^KOehcw})BH9iK_y1HRxBzQG}L#ag(MBjQVlJE{_uiO%-( zR<4|+?K^hAkdc{bFs^c$+`Jq!)6>58bFIfNU%X&t0TT>FJ{Aog(}FXrm{6(ERyDXEmK!#=gV1p@){cs*pF9Jg6dG=22<^=tUxvN3KjZhv@& zd-=2mF*wR)F!C4$+jj1L`2OnJy=iIY481`w1Yu9o%FR!bB(aA;fZyjQr*m%Rx9+Z{ zjXxktLFuwDT yaCQ}K8=|A1YoVNr)0VTrh~!CW>sSh}(agYsh(N;#B6 zdpP)fU(V@T3$(bMWKZ(+{Cdyx{q%XC_s6kpY;3US!Gz}l0t{lIAQm#cEsppDaGV?W zky^N>J5M!byr7g@^0m_e3~}+Jlc%c!0e{e0;;bWGt5vdBk}yjtYxBgEl2_#MaCj{A z!?|y#>9%S>I}%5wLB zSU){=CeYN}+;yrc{KN@Q^MTfP54E=m3)BU1S?1kPUBo~v#6)aT7j>;%5d8rP z(|+Vg=Q}UAv`7nag(aygb}Rnh_K1O4h>6(HATP><$;=3bsQAfer(1$SzZaFDY3fr$ zJb_XfVj?y)pha%XL7NkrP6jBu|3!a?jYdFHDXb{zoq{c?CK+NwgI*dTS4o=}Ze~Wr z?hih!_f&byR2ub|6HIZ64Gm}!NP1>BP5@-}R@c5H2qNzix;D+A0WA_RhV!}s!t0~d z<@D05#OuN|3Irw%u9ZS}-A_2FxOh7nuW$ojn4cJoY)9pq)zb#+y5AAi5Y8Ci&vBNMCSg?&y? zLs}X6cP?Nss<6>Tc1qw)2VU{`13_Pf$5$bWmZB1;i_d;5a$Hu`jrHhkBsvxjMMnR= zIZN$PlyGDLUC!&mC{VgiTTVvOPv}Gk;-8#!2_W= gk#Xb%cqyO#3x9y%-882Fu>b%707*qoM6N<$f^xo`CIA2c literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/slider-circular-disabled-knob.png b/AppKit/Themes/Aristo/Resources/HUD/slider-circular-disabled-knob.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0d8bd11bb9c3a7e7ef5b83575ace072bd18e0d GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GnVv3=Ar-fhrc9agBsn?xb6R3z;Lp#`&(DqDUzeNu@afa9 z;zB|}&mKHT`0?>^`>)^M-`|XEVA`~3(ITETYu51Wum7KxkdiVbm1$K4&y{lr&YU^J wu*k7SZNW5OhvIjCet++0bYcGanvsczp}|ezopr03NeaG5`Po literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/slider-circular-knob.png b/AppKit/Themes/Aristo/Resources/HUD/slider-circular-knob.png new file mode 100644 index 0000000000000000000000000000000000000000..050ffefe6e0a36cac2cc477199a63298a8a8226d GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GnVv3=Ar-fhrT{@&a`NnBhYmgZ`275Q+5L5YPbEEk`gE?o ziprBy2M-?n@c20Y{_pSaf8NZ%s^jYFDj5+ODOvab-`N8vPGp>92`Q9WF}HE%%$bZX u%|Cn`bTu7{%l`cS-p}a5{IigOk&R(%gIZ7jkq!x Date: Mon, 24 May 2010 10:09:03 -0700 Subject: [PATCH 143/175] CPDictionary is now KVO compliant. --- Foundation/CPDictionary.j | 4 +- Foundation/CPKeyValueObserving.j | 64 +++++++++++++++++++++++++++++++- Tests/Foundation/CPKVOTest.j | 22 +++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index f805282f2..0b742c98c 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -316,7 +316,7 @@ */ - (CPArray)allKeys { - return _keys; + return [_keys copy]; } /*! @@ -475,7 +475,7 @@ var index = keysForRemoval.length; while (index--) - self.removeValueForKey(keysForRemoval[index]); + [self removeObjectForKey:keysForRemoval[index]]; } /* diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 9662d5064..5612adaf2 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -226,7 +226,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, var currentClass = _nativeClass, kvoClassName = "$KVO_"+class_getName(_nativeClass), existingKVOClass = objj_lookUpClass(kvoClassName); - + if (existingKVOClass) { _targetObject.isa = existingKVOClass; @@ -247,6 +247,18 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, class_addMethod(kvoClass, method_getName(method), method_getImplementation(method), ""); } + if ([_targetObject isKindOfClass:[CPDictionary class]]) + { + var methodList = _CPKVOModelDictionarySubclass.method_list, + count = methodList.length; + + for (var i=0; i Date: Mon, 24 May 2010 01:49:25 -0700 Subject: [PATCH 144/175] Adding grab/grabbing cursors for Firefox. --- AppKit/CPCursor.j | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/AppKit/CPCursor.j b/AppKit/CPCursor.j index 95b1dc79a..45b3f1ab8 100755 --- a/AppKit/CPCursor.j +++ b/AppKit/CPCursor.j @@ -167,7 +167,9 @@ var currentCursor = nil, { if (CPBrowserIsEngine(CPWebKitBrowserEngine)) return [CPCursor cursorWithCSSString:@"-webkit-grab"]; - else if (CPBrowserIsEngine(CPGeckoBrowserEngine) || CPBrowserIsEngine(CPOperaBrowserEngine)) + else if (CPBrowserIsEngine(CPGeckoBrowserEngine)) + return [CPCursor cursorWithCSSString:@"-moz-grab"]; + else if (CPBrowserIsEngine(CPOperaBrowserEngine)) return [CPCursor cursorWithCSSString:@"move"]; return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit only. move in FFMac|Opera @@ -177,8 +179,10 @@ var currentCursor = nil, { if (CPBrowserIsEngine(CPWebKitBrowserEngine)) return [CPCursor cursorWithCSSString:@"-webkit-grabbing"]; + else if (CPBrowserIsEngine(CPGeckoBrowserEngine)) + return [CPCursor cursorWithCSSString:@"-moz-grabbing"]; - return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit only + return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit || FF } + (CPCursor)disappearingItemCursor From 3c5dab1f3484197f7f2680ff18df9b8b97d20eaa Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 21 May 2010 15:44:52 -0400 Subject: [PATCH 145/175] Implemented CPCoding for CPButton imageDimsWhenDisabled. Fixed a problem where setImageDimsWhenDisabled:NO would not cause a redraw even if the image was previously dimmed. --- AppKit/CPButton.j | 69 +++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 00b898233..57a105bd5 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -74,7 +74,7 @@ CPChangeBackgroundCellMask = CPBackgroundButtonMask; CPButtonStateMixed = CPThemeState("mixed"); -/*! +/*! @ingroup appkit @class CPButton @@ -85,10 +85,10 @@ CPButtonStateMixed = CPThemeState("mixed"); @implementation CPButton : CPControl { BOOL _allowsMixedState; - + CPString _title; CPString _alternateTitle; - + CPImage _image; CPImage _alternateImage; @@ -131,7 +131,7 @@ CPButtonStateMixed = CPThemeState("mixed"); - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; - + if (self) { // Should we instead override the defaults? @@ -139,13 +139,13 @@ CPButtonStateMixed = CPThemeState("mixed"); [self setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; [self setValue:CPImageLeft forThemeAttribute:@"image-position"]; [self setValue:CPScaleNone forThemeAttribute:@"image-scaling"]; - + _controlSize = CPRegularControlSize; - + // [self setBezelStyle:CPRoundRectBezelStyle]; [self setBordered:YES]; } - + return self; } @@ -248,9 +248,9 @@ CPButtonStateMixed = CPThemeState("mixed"); { if (_title === aTitle) return; - + _title = aTitle; - + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } @@ -264,7 +264,7 @@ CPButtonStateMixed = CPThemeState("mixed"); { if (_alternateTitle === aTitle) return; - + _alternateTitle = aTitle; [self setNeedsLayout]; @@ -280,9 +280,9 @@ CPButtonStateMixed = CPThemeState("mixed"); { if (_image === anImage) return; - + _image = anImage; - + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } @@ -300,9 +300,9 @@ CPButtonStateMixed = CPThemeState("mixed"); { if (_alternateImage === anImage) return; - + _alternateImage = anImage; - + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } @@ -373,13 +373,13 @@ CPButtonStateMixed = CPThemeState("mixed"); [self setShowsStateBy:CPContentsCellMask]; break; - case CPSwitchButton: [CPException raise:CPInvalidArgumentException + case CPSwitchButton: [CPException raise:CPInvalidArgumentException reason:"The CPSwitchButton type is not supported in Cappuccino, use the CPCheckBox class instead."]; - case CPRadioButton: [CPException raise:CPInvalidArgumentException + case CPRadioButton: [CPException raise:CPInvalidArgumentException reason:"The CPRadioButton type is not supported in Cappuccino, use the CPRadio class instead."]; - default: [CPException raise:CPInvalidArgumentException + default: [CPException raise:CPInvalidArgumentException reason:"Unknown button type."]; } @@ -395,7 +395,7 @@ CPButtonStateMixed = CPThemeState("mixed"); _imageDimsWhenDisabled = imageShouldDimWhenDisabled; - if (_imageDimsWhenDisabled) + if ([self hasThemeState:CPThemeStateDisabled]) { [self setNeedsDisplay:YES]; [self setNeedsLayout]; @@ -410,7 +410,7 @@ CPButtonStateMixed = CPThemeState("mixed"); - (BOOL)startTrackingAt:(CGPoint)aPoint { [self highlight:YES]; - + return [super startTrackingAt:aPoint]; } @@ -435,7 +435,7 @@ CPButtonStateMixed = CPThemeState("mixed"); bounds.origin.y += contentInset.top; bounds.size.width -= contentInset.left + contentInset.right; bounds.size.height -= contentInset.top + contentInset.bottom; - + return bounds; } @@ -483,10 +483,10 @@ CPButtonStateMixed = CPThemeState("mixed"); { if (aName === "bezel-view") return [self bezelRectForBounds:[self bounds]]; - + else if (aName === "content-view") return [self contentRectForBounds:[self bounds]]; - + return [super rectForEphemeralSubviewNamed:aName]; } @@ -497,7 +497,7 @@ CPButtonStateMixed = CPThemeState("mixed"); var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()]; [view setHitTests:NO]; - + return view; } else @@ -570,11 +570,12 @@ CPButtonStateMixed = CPThemeState("mixed"); @end -var CPButtonImageKey = @"CPButtonImageKey", - CPButtonAlternateImageKey = @"CPButtonAlternateImageKey", - CPButtonTitleKey = @"CPButtonTitleKey", - CPButtonAlternateTitleKey = @"CPButtonAlternateTitleKey", - CPButtonIsBorderedKey = @"CPButtonIsBorderedKey"; +var CPButtonImageKey = @"CPButtonImageKey", + CPButtonAlternateImageKey = @"CPButtonAlternateImageKey", + CPButtonTitleKey = @"CPButtonTitleKey", + CPButtonAlternateTitleKey = @"CPButtonAlternateTitleKey", + CPButtonIsBorderedKey = @"CPButtonIsBorderedKey", + CPButtonImageDimsWhenDisabledKey = @"CPButtonImageDimsWhenDisabledKey"; @implementation CPButton (CPCoding) @@ -585,21 +586,23 @@ var CPButtonImageKey = @"CPButtonImageKey", - (id)initWithCoder:(CPCoder)aCoder { self = [super initWithCoder:aCoder]; - + if (self) { _controlSize = CPRegularControlSize; [self setImage:[aCoder decodeObjectForKey:CPButtonImageKey]]; [self setAlternateImage:[aCoder decodeObjectForKey:CPButtonAlternateImageKey]]; - + [self setTitle:[aCoder decodeObjectForKey:CPButtonTitleKey]]; [self setAlternateTitle:[aCoder decodeObjectForKey:CPButtonAlternateTitleKey]]; - + + [self setImageDimsWhenDisabled:[aCoder decodeObjectForKey:CPButtonImageDimsWhenDisabledKey]]; + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } - + return self; } @@ -616,6 +619,8 @@ var CPButtonImageKey = @"CPButtonImageKey", [aCoder encodeObject:_title forKey:CPButtonTitleKey]; [aCoder encodeObject:_alternateTitle forKey:CPButtonAlternateTitleKey]; + + [aCoder encodeObject:[self imageDimsWhenDisabled] forKey:CPButtonImageDimsWhenDisabledKey]; } @end From bbbf4390281a2e7ae15d87d4da34ad0abe216dd5 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Thu, 20 May 2010 23:12:30 -0400 Subject: [PATCH 146/175] Fixed: contentBounds not var'ed in _verticalScrollerDidScroll. Whitespace cleanup. --- AppKit/CPScrollView.j | 64 +++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index 26b837414..051195b66 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -27,7 +27,7 @@ #include "CoreGraphics/CGGeometry.h" -/*! +/*! @ingroup appkit @class CPScrollView @@ -44,12 +44,12 @@ BOOL _hasVerticalScroller; BOOL _hasHorizontalScroller; BOOL _autohidesScrollers; - + CPScroller _verticalScroller; CPScroller _horizontalScroller; - + int _recursionCount; - + float _verticalLineScroll; float _verticalPageScroll; float _horizontalLineScroll; @@ -158,11 +158,11 @@ if (_recursionCount > 5) return; - + ++_recursionCount; var documentView = [self documentView]; - + if (!documentView) { if (_autohidesScrollers) @@ -250,7 +250,7 @@ [_verticalScroller setFloatValue:0.0]; [_verticalScroller setKnobProportion:1.0]; } - + if (shouldShowHorizontalScroller) { [_horizontalScroller setFloatValue:(difference.width <= 0.0) ? 0.0 : scrollPoint.x / difference.width]; @@ -279,13 +279,13 @@ { if (_horizontalScroller === aScroller) return; - + [_horizontalScroller removeFromSuperview]; [_horizontalScroller setTarget:nil]; [_horizontalScroller setAction:nil]; - + _horizontalScroller = aScroller; - + [_horizontalScroller setTarget:self]; [_horizontalScroller setAction:@selector(_horizontalScrollerDidScroll:)]; @@ -339,13 +339,13 @@ { if (_verticalScroller === aScroller) return; - + [_verticalScroller removeFromSuperview]; [_verticalScroller setTarget:nil]; [_verticalScroller setAction:nil]; - + _verticalScroller = aScroller; - + [_verticalScroller setTarget:self]; [_verticalScroller setAction:@selector(_verticalScrollerDidScroll:)]; @@ -403,7 +403,7 @@ return; _autohidesScrollers = autohidesScrollers; - + [self reflectScrolledClipView:_contentView]; } @@ -480,30 +480,30 @@ /* @ignore */ - (void)_verticalScrollerDidScroll:(CPScroller)aScroller { - var value = [aScroller floatValue], - documentFrame = [[_contentView documentView] frame]; + var value = [aScroller floatValue], + documentFrame = [[_contentView documentView] frame], contentBounds = [_contentView bounds]; switch ([_verticalScroller hitPart]) { case CPScrollerDecrementLine: contentBounds.origin.y -= _verticalLineScroll; break; - + case CPScrollerIncrementLine: contentBounds.origin.y += _verticalLineScroll; break; - + case CPScrollerDecrementPage: contentBounds.origin.y -= _CGRectGetHeight(contentBounds) - _verticalPageScroll; break; - + case CPScrollerIncrementPage: contentBounds.origin.y += _CGRectGetHeight(contentBounds) - _verticalPageScroll; break; - + case CPScrollerKnobSlot: case CPScrollerKnob: // We want integral bounds! default: contentBounds.origin.y = ROUND(value * (_CGRectGetHeight(documentFrame) - _CGRectGetHeight(contentBounds))); } - + [_contentView scrollToPoint:contentBounds.origin]; } @@ -513,21 +513,21 @@ var value = [aScroller floatValue], documentFrame = [[self documentView] frame], contentBounds = [_contentView bounds]; - + switch ([_horizontalScroller hitPart]) { case CPScrollerDecrementLine: contentBounds.origin.x -= _horizontalLineScroll; break; - + case CPScrollerIncrementLine: contentBounds.origin.x += _horizontalLineScroll; break; - + case CPScrollerDecrementPage: contentBounds.origin.x -= _CGRectGetWidth(contentBounds) - _horizontalPageScroll; break; - + case CPScrollerIncrementPage: contentBounds.origin.x += _CGRectGetWidth(contentBounds) - _horizontalPageScroll; break; - + case CPScrollerKnobSlot: case CPScrollerKnob: // We want integral bounds! @@ -668,7 +668,7 @@ */ - (void)scrollWheel:(CPEvent)anEvent { - [self _respondToScrollWheelEventWithDeltaX:[anEvent deltaX] * _horizontalLineScroll + [self _respondToScrollWheelEventWithDeltaX:[anEvent deltaX] * _horizontalLineScroll deltaY:[anEvent deltaY] * _verticalLineScroll]; } @@ -771,7 +771,7 @@ var CPScrollViewContentViewKey = "CPScrollViewContentView", _horizontalLineScroll = [aCoder decodeFloatForKey:CPScrollViewHLineScrollKey]; _horizontalPageScroll = [aCoder decodeFloatForKey:CPScrollViewHPageScrollKey]; - + _contentView = [aCoder decodeObjectForKey:CPScrollViewContentViewKey]; _headerClipView = [aCoder decodeObjectForKey:CPScrollViewHeaderClipViewKey]; @@ -793,25 +793,25 @@ var CPScrollViewContentViewKey = "CPScrollViewContentView", // Do to the anything goes nature of decoding, our subviews may not exist yet, so layout at the end of the run loop when we're sure everything is in a correct state. [[CPRunLoop currentRunLoop] performSelector:@selector(reflectScrolledClipView:) target:self argument:_contentView order:0 modes:[CPDefaultRunLoopMode]]; } - + return self; } - (void)encodeWithCoder:(CPCoder)aCoder { [super encodeWithCoder:aCoder]; - + [aCoder encodeObject:_contentView forKey:CPScrollViewContentViewKey]; [aCoder encodeObject:_headerClipView forKey:CPScrollViewHeaderClipViewKey]; [aCoder encodeObject:_verticalScroller forKey:CPScrollViewVScrollerKey]; [aCoder encodeObject:_horizontalScroller forKey:CPScrollViewHScrollerKey]; - + [aCoder encodeFloat:_verticalLineScroll forKey:CPScrollViewVLineScrollKey]; [aCoder encodeFloat:_verticalPageScroll forKey:CPScrollViewVPageScrollKey]; [aCoder encodeFloat:_horizontalLineScroll forKey:CPScrollViewHLineScrollKey]; [aCoder encodeFloat:_horizontalPageScroll forKey:CPScrollViewHPageScrollKey]; - + [aCoder encodeBool:_hasVerticalScroller forKey:CPScrollViewHasVScrollerKey]; [aCoder encodeBool:_hasHorizontalScroller forKey:CPScrollViewHasHScrollerKey]; [aCoder encodeBool:_autohidesScrollers forKey:CPScrollViewAutohidesScrollerKey]; From 28397e672ea4684b737495accc62fa900080d725 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Mon, 24 May 2010 11:28:57 -0700 Subject: [PATCH 147/175] fix a misnamed variable. closes #673. --- Objective-J/CFBundle.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index 7f75d3d1d..8c7044e73 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -635,9 +635,9 @@ function decompileStaticFile(/*Bundle*/ aBundle, /*String*/ aString, /*String*/ if (CFBundleSupportedSpriteType === CFBundleMHTMLUncachedSpriteType) { - var exclamationIndex = URLString.indexOf("!"), - firstPart = URLString.substring(0, exclamationIndex), - lastPart = URLString.substring(exclamationIndex); + var exclamationIndex = mappedURLString.indexOf("!"), + firstPart = mappedURLString.substring(0, exclamationIndex), + lastPart = mappedURLString.substring(exclamationIndex); mappedURLString = firstPart + "?" + CFCacheBuster + lastPart; } From 3d4a33d3734db6f928cf66c2477de0bb6cb59663 Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Tue, 18 May 2010 21:30:51 -0400 Subject: [PATCH 148/175] Re-preflight on the image assets resulting in 24px tall images in each case. This is done by cutting the top edge close (well into the aliased edge on top.) Added defs for the horizontal and vertical sliders. --- .../HUD/segmented-control-bezel-center.png | Bin 164 -> 140 bytes ...egmented-control-bezel-disabled-center.png | Bin 139 -> 140 bytes ...gmented-control-bezel-disabled-divider.png | Bin 121 -> 124 bytes .../segmented-control-bezel-disabled-left.png | Bin 227 -> 228 bytes ...segmented-control-bezel-disabled-right.png | Bin 228 -> 227 bytes .../HUD/segmented-control-bezel-divider.png | Bin 119 -> 124 bytes ...ented-control-bezel-highlighted-center.png | Bin 154 -> 159 bytes ...trol-bezel-highlighted-disabled-center.png | Bin 159 -> 159 bytes ...rol-bezel-highlighted-disabled-divider.png | Bin 121 -> 124 bytes ...ontrol-bezel-highlighted-disabled-left.png | Bin 241 -> 241 bytes ...ntrol-bezel-highlighted-disabled-right.png | Bin 246 -> 245 bytes ...nted-control-bezel-highlighted-divider.png | Bin 121 -> 124 bytes ...gmented-control-bezel-highlighted-left.png | Bin 244 -> 244 bytes ...mented-control-bezel-highlighted-right.png | Bin 246 -> 251 bytes .../HUD/segmented-control-bezel-left.png | Bin 225 -> 226 bytes .../segmented-control-bezel-pushed-center.png | Bin 145 -> 146 bytes ...ontrol-bezel-pushed-highlighted-center.png | Bin 145 -> 145 bytes ...-control-bezel-pushed-highlighted-left.png | Bin 225 -> 226 bytes ...control-bezel-pushed-highlighted-right.png | Bin 225 -> 226 bytes .../segmented-control-bezel-pushed-left.png | Bin 225 -> 227 bytes .../segmented-control-bezel-pushed-right.png | Bin 225 -> 227 bytes .../HUD/segmented-control-bezel-right.png | Bin 227 -> 227 bytes AppKit/Themes/Aristo/ThemeDescriptors.j | 68 ++++++++++++++++++ 23 files changed, 68 insertions(+) diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-center.png index 1e82207f01603708d0cb51ce752a7759764dca1d..455b25deceee2c6fce8de267cb18c212ab91dde1 100644 GIT binary patch delta 74 zcmZ3&*uyx%(^=2c#WAGfR+53S@$d6rUSHQ|Q)5#|`1Sw4y-}kt&wimj%M9v&d}y2~ ecw!P0hXKP;YxBzDY1eKu0D-5gpUXO@geCxx6dq~- delta 98 zcmV-o0G@~ diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-center.png index 0632660c48c85b68af230f10aed608127d8bb13f..a32359e5cf79947de52a72c08b57ae4177354bff 100644 GIT binary patch delta 74 zcmeBX>|vbX>8$7J;uunKE6K>%`1biPudnN~sj(>}{QCdj-l)-+XTQ*%Wd`*>J~U2b eJR!u!VZg9b-rP7k>fdt)An}H(c>7?uF;uunKD=8@7J63SY)X cmIel9hG{&88z0Tpe8K<(p00i_>zopr03qxfs{jB1 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-divider.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-divider.png index 1ebec04faefd9d16ea301579c5350d93242623f3..a07b15d5c69df4799187593410fd509d623f633f 100644 GIT binary patch delta 56 zcmb=dnc!(G=jq}YQgJIOAtB+$c@`Ck7mfzZhRUD+|Nk$~%p$>%y_@CY(bVGY3_#%N L>gTe~DWM4fZNn8D delta 53 zcmb=aoZx97?djqeQgJIOAtAwoA*t=JkHRE57GnWpCKd^Xj*X0dwl`-kW&i?DS3j3^ HP6e(L_t(|+G1p2V31Z(QOOe!5YS;_V&Y-}5@vjSeENU?{$>C3 z=MMwZzkmPu|NsBb4#W%~zyczGf($SK7J$iO6<}gO1BA6uLx2oxso_#478aJDK!Kky z0cIs7C9cn(KMMgRgcunaSs5-}y2P%ks%i%mhyW@`V1(*t0~}&5kPd(V0{{?EN{cPZ R69)hQ002ovPDHLkV1jh3KL7v# delta 162 zcmV;T0A2s&0pkIXNq>b&L_t(|+G1gV07)P=24WFLAR(=yqLL>dAfUs<#Kgq{B+U5u z`1Jq&{mcI6&mRV+fB*jR|NsA=9f-ktSwI9(kO2n30x(&u0!$2OfUp*72#{edHC)QX z!ou|z^tUC#P#{}XCa`35F;ZaE5oHrm)KQRRqcQR5gR}S2><~G0KTC|-X*z& Qe*gdg07*qoM6N<$f`ZOSa{vGU diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-right.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-disabled-right.png index 63cc8bb29dba6abb9ed5834cb77309d1f5ca5c91..9f3a03b7d656c2d96e40a4352a9a31e321f97b5b 100644 GIT binary patch delta 162 zcmV;T0A2s&0pkIXNq>b&L_t(|+F~>_Gu!{~-@k7kK76=x=gyr;EWdvJVqj!sjgD7^ON`4k72PVh>7k~i_0VW1CKv)Yk1jw+K8ZL#K0hIX3!ouCz>3MxY8|px|F1{u>6wzW@RZ01rf6pdP7* Qo&W#<07*qoM6N<$g0FQ&EC2ui delta 163 zcmV;U09^m$0ptOYNq>e(L_t(|+G1v4U`POB86f@)#9tWA%*^)x`}gnLhYugF+_`gS z63ee&zZe)98M*lQ`1F~Wn9Nv!${7Ct{|}N;m)j diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-divider.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-divider.png index aa7955d2d261b73f5708102469fe318fec798537..6811fc89a0c6c7031ee5e687eb631fa11809bf68 100644 GIT binary patch delta 56 zcmXS~nc!(G=jq}YQgJIODIwvgTe~DWM4fZxIy0 delta 51 zcmb;^pWvw{>FMGaQgJIOAt51yA*t(?&^rhotcGcf%J6aW4}x&J_{|NlYU zf0z;o0z=1tWQqR_3=l5!lgE!48Gy1<009O7VR=NH<6}}A00000NkvXXu0mjf5mYE9 delta 88 zcmbQwIE!(DXP}Lzi(^Q|t(4wCE(Qf2r&RW}eVdBkJ7+6v%#eTN?7~pcvol4IaWPA< sWaY$}OI*G^ij01tUowv?cps|-gR`0a^;gTQr!WA4r>mdKI;Vst0GaY2djJ3c diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-center.png index 15fd9d92946b1dd87a6ff56db2aac316955016e6..06105ca177dc41a5720ceaeb4f201bcb1ce3731f 100644 GIT binary patch delta 86 zcmV-c0IC0<0iOYoP)}lxi%;0k^y}9z2Bv@i|1&WC2NVDPLAn1xtpEQ(+<%x72m(XL se`JaO3=9x1^OMJq8JU5yj{yP<07kh*D_y^)kpKVy07*qoM6N<$f-{{acK`qY delta 86 zcmV-c0IC0<0iOYoP)}ry$q4`;5Ch}dr`oB-XchZNJP;K8gbYK70VpBmQqA3AlwjIH s9^`7$LjK~$x6mszpEkzcS{MQh03ql>sINeAm;e9(07*qoM6N<$f=N*%1poj5 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-divider.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-divider.png index 6ad27c168ddff9d27050a2cdc6084ffee817deaf..513282884fe4d8ebf3ca62d78dc20dde38f4995d 100644 GIT binary patch delta 56 zcmb=dnc!(G=jq}YQgJIODIwv;c@`Ck7mfzZhRUD+|Nk$~%p$>%vzp~{dDH$23_#%N L>gTe~DWM4fZ(kKf delta 53 zcmb=aoZx97?djqeQgJIODIvilfl272LQ|t0i?M()6N>~x!gGdCUjn|{FaUw4tDnm{ Hr-UW|+cgn7 diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-highlighted-disabled-left.png index 1a82ba435a3460e5864e6bbbeb484a38cceee71d..e8bf1b6b0704234c78f835ec52cefcab443c0425 100644 GIT binary patch delta 168 zcmV;Z09XI<0r3HlQGZUc3IZ_& zFa1pX^r?KY)DY2hFJ-ExidhI@J&xnbIlnt04+*s25O+xxy>(A;18w W&rk{{CC4uS0000q5ca1o6K58RF4z-j6A4*(RnS9_m5V zzyvbP8-f5}R7cfbwIE%mzCT}gU3ak7&dC@PwryJyE~Ny-%ncyA%nW4;0{lE)hSUa& zRK^=3HNx_D>1X4oPvwhJLqy}0^H`vwnfHDjV_Z4cY!K1HFd+=f5W+>1Hx1k$0t^8A W=uKORBOKHK00001Bkx^1Q-CNA!&s;ChKbe0000u;#Vwj@d@$2fB*jW_|c;)M~)n3 zV*2f^zMOIk)opNWY{mF3_6{|pR3%*e>d{_o#E4wnBQ0S1s5gl75w?;is)fM`Jx zKv(hqKf0EGXj;fHl&}CgTe~DWM4fZ-ErT delta 53 zcmb=aoZx97?djqeQgJIOAt51yA*t=ZkHRE57GnWpCKd^XO&=N88EQu#WB>wBS3j3^ HP6v9T?dm6Nk(Wo6}MVPax3l9rLN14?lH`t^%}<=?-5Tnvni zTz~)lV*mjb5b+PnfeZXc7x?%8KbioBmjCEl{{5%eP{IOax%58?hBC3RuzdgX_wP55 zCJ<&;R8$oG_U)S}J3EI2BO@al!=+1?1XWd4gMli`fC?HIfgv_90vWuZPzM delta 168 zcmV;Z09XI?0rUZoRDWOwVtXJq0AfBCAmM0ZV_PgMCuhyd%F4^a#KdGIEhA$Gl;HaH z>lXvdzkmO@7#JD3{{H*N00JN_4F8}UxWIpOfq(!1qX}SW`H!yU-+zh?B`iReOaGH# zC=&|{%lAKj|9%5$0%2xFMMcqX-@b{mvvWu=GBUC;T)K2gP$5-SH5jO}45*+1Aiw~@ W!%jl+mxnh10000M2SO5S307*qoM6N<$f}4(3yZ`_I delta 181 zcmV;m080P+0rmlqNq?A0L_t(|+G1p2U}ym1Pe6PDhz~Nx#V7p#{rmUl$B!NzJ#yr5 zFVnAIzkm`9ywWlY%L_t(|+G1p2U{C>q$pQib)=W%HyevS%gO88T?(g5fTz~%j zVPN|A@1My3|Npswm;nS>Km<^b0S3SVFj=euOblp%uoh|vkYOz~T*}14!txy`@C_!w ztfZvG`}y-{NuY!TBO@al!=+1?I8{|ugMk8NKm`qqQ2iW0%o+zW6Cl6V$L_t(|+G1gV03{%H0b(geAfW;TlLZ6>teKdYcv*mi2Ol4w z-QT}|x&Hk5!@%_K-#?N6|NnCVF<37PhyV&QzyMePCW}>oi2)4|)d%IFi@Zjs2QLEAiw~S&`8T}G7`%G O0000BXhi(^Q|t)!sf;NR!J{QjQLrsn46#-_%m(6B*(WtN1Q>W|U`M`y(E ksW^Dz&;S4bqZt_47_`N?gQhE2Tx9?PPgg&ebxsLQ04;bQqW}N^ delta 79 zcmbQlIFWIJr-!kpi(^Q|t)zs6gp7oc;Naiqzx@85&!*<)=EkPBKw?U(!i6InG!L$4 j);sp+(NS)<1_ovZ(?a&|xBTuLVgLe9S3j3^P66jzjNZmiH)6%911!tjcRSaoOQAVhR?+H;|z@c{r?}& brEq|u%$wt{+a|v%1|aZs^>bP0l+XkKBN-c% delta 71 zcmbQpIFWHephH4JLPkPJaPaT*Uw(hjXH#=?b7NCmATgy?;lhy(ng`c2>mB>^=qR^a b0|PUIX(9XfTYh&AF#v(5tDnm{r-UW|I*lC( diff --git a/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-left.png b/AppKit/Themes/Aristo/Resources/HUD/segmented-control-bezel-pushed-highlighted-left.png index 3077ebaf054c35820844755815e10c6b1a560506..c81b5aba0efb86c25a72838fca38e4ec8462fa34 100644 GIT binary patch delta 161 zcmV;S0ABy$0pbCWNq>Y%L_t(|+G1p2U~rL^mM-Sz=C%g1d0Cj4n2b0$IPCuX`NQ@9 z|9=LifB*h*0cAj#fsv7sfeFL_$-n>$Oon&?CI&P>6D`ybAjhRFEG*xF0rU+d2*S*Y zii)D&zI_vAXJ?lH3a~L;x^ziURaG?@sIm;Gqk$2q9Ap45G#a3p00ImEUuhnEujZgX P00000NkvXXu0mjf)F?z$ delta 160 zcmV;R0AK&&0pS6VNq>V$L_t(|+G1pY03{%H0b(geAfX~HEj^i=o7)=5=4D}GV)EeN z;IRAi=MUHa|Nj}7{{8zW0+itb>0@MMWMBd@Kr%4E0+S(LfQbPO&_oM01junI3k%D4 zU;ups34$=Ql9Ced*RNkC+1c48fC6j`mo8o6R8>_C2C6Ir>KSMN2rvLt7aRExCzwV6 O0000Y%L_t(|+G12wQ~S@r!0`F&*RMyPK7HED^!xX3hChG)@N#f) z*fB9N88I<3GBQ8`*S~-NxR_wP|NsAkX%-|EL<%r5paGg_p@slCE(HmIFff3=v9Pdw z2b%#5x-TC-d^jX8FMkunZve`asj8|5U%GTjkP)a<3Zw{#zZ!v}10cWv4=ye{V$L_t(|+G1v4U}ykhH6VTu!i;KaYX5b&L_t(|+G1p2U{H~kmY&Sb&20^2^Rh58F?n!saM=C%^M~vI z|Njh3|Ni|G0m^UzF#{tbBLfqN0g{0M7MKk20!$2OfF@d~AwZ5xSy))U0|V$ANDzdX zm6VitzkdBH$d%IFi>R~P)7qJG(0(gm>UmdCP07z0F28XklFH} Q5&!@I07*qoM6N<$f*aREHvj+t delta 160 zcmV;R0AK&(0pS6VNq>V$L_t(|+G1pY03{%H0b(geAfX~HEj^i=o7)=5=4D}GV)EeN z;IRAi=MUHa|Nj}7{{8zW0+itb>0@MMWMBd@Kr%4E0+S(LfQbPO&_oM01junI3k%D4 zU;ups34$=Ql9Ced*RNkC+1c48fC6j`mo8o6R8>_C2C6Ir>KSMN2rvLt7aRExCzwV6 O0000b&L_t(|+G12wQ~S@r!0`F&*RMyPK7E?Y^85F121Z6kUJecp zJ0>P34<;ao0SdVO{re}v1mpex{~t`VAgLfyfQbPO&_oM01junINC1R^0rZW9h2=Zg z3}DcG`S9VxAq546iy-w4K$&lfii&sFu3fv05vWuODEJ46KN|t@4}bsz0KB*?do@Y~ Qg8%>k07*qoM6N<$g7Qj5x&QzG delta 160 zcmV;R0AK&(0pS6VNq>V$L_t(|+G1v4U}ykhH6VTu!i;KaYX5H<0pkIXQGYQrGyDJV-@nfvK72TO=gys6mS4YqF)%VR^78TV*)cIOd9W}5 z!T zJEEYVa1kWg0F)_HRaFhXbm`KmjD0&07*qo IM6N<$f=C!U%>V!Z delta 154 zcmV;L0A>H<0pkIXQGaG&U}ykhH6VTu!i;8SX8-^F`}g_7hYv^Z+_{s>^6S?x21Z6k zUOqlPJ0>P34;G*@hX4QngD5VbN)Z+)2PVh>7k~i_0VW1CKv)Yk1jw+K8ZL#K0hIX0 z!ou<$tO6KxU%q|&c0@rz;UY+~0Vq?Zs;U}%>Cz=mfB*vkHxuewkZDJ(3;+NC07*qo IM6N<$f;?6}UH||9 diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index e0112fadb..96c2aada0 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -1021,6 +1021,74 @@ return scroller; } ++ (CPSlider)themedHorizontalSlider +{ + var slider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 24.0)], + trackColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [_CPCibCustomResource imageResourceWithName:"HUD/horizontal-track-left.png" size:CGSizeMake(4.0, 5.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/horizontal-track-center.png" size:CGSizeMake(1.0, 5.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/horizontal-track-right.png" size:CGSizeMake(4.0, 5.0)] + ] + isVertical:NO]], + + trackDisabledColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [_CPCibCustomResource imageResourceWithName:"HUD/horizontal-track-disabled-left.png" size:CGSizeMake(4.0, 5.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/horizontal-track-disabled-center.png" size:CGSizeMake(1.0, 5.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/horizontal-track-disabled-right.png" size:CGSizeMake(4.0, 5.0)] + ] + isVertical:NO]]; + + [slider setValue:5.0 forThemeAttribute:@"track-width"]; + [slider setValue:trackColor forThemeAttribute:@"track-color"]; + [slider setValue:trackDisabledColor forThemeAttribute:@"track-color" inState:CPThemeStateDisabled]; + + var knobColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"HUD/knob.png" size:CGSizeMake(23.0, 24.0)]], + knobHighlightedColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"HUD/knob-highlighted.png" size:CGSizeMake(23.0, 24.0)]], + knobDisabledColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"HUD/knob-disabled.png" size:CGSizeMake(23.0, 24.0)]]; + + [slider setValue:CGSizeMake(23.0, 24.0) forThemeAttribute:@"knob-size"]; + [slider setValue:knobColor forThemeAttribute:@"knob-color"]; + [slider setValue:knobHighlightedColor forThemeAttribute:@"knob-color" inState:CPThemeStateHighlighted]; + [slider setValue:knobDisabledColor forThemeAttribute:@"knob-color" inState:CPThemeStateDisabled]; + + return slider; +} + ++ (CPSlider)themedVerticalSlider +{ + var slider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 24.0, 50.0)], + trackColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [_CPCibCustomResource imageResourceWithName:"HUD/vertical-track-top.png" size:CGSizeMake(5.0, 6.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/vertical-track-center.png" size:CGSizeMake(5.0, 1.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/vertical-track-bottom.png" size:CGSizeMake(5.0, 4.0)] + ] + isVertical:YES]], + trackDisabledColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [_CPCibCustomResource imageResourceWithName:"HUD/vertical-track-disabled-top.png" size:CGSizeMake(5.0, 6.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/vertical-track-disabled-center.png" size:CGSizeMake(5.0, 1.0)], + [_CPCibCustomResource imageResourceWithName:"HUD/vertical-track-disabled-bottom.png" size:CGSizeMake(5.0, 4.0)] + ] + isVertical:YES]]; + + [slider setValue:5.0 forThemeAttribute:@"track-width"]; + [slider setValue:trackColor forThemeAttribute:@"track-color" inState:CPThemeStateVertical]; + [slider setValue:trackDisabledColor forThemeAttribute:@"track-color" inState:CPThemeStateDisabled]; + + var knobColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"HUD/knob.png" size:CGSizeMake(23.0, 24.0)]], + knobHighlightedColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"HUD/knob-highlighted.png" size:CGSizeMake(23.0, 24.0)]], + knobDisabledColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"HUD/knob-disabled.png" size:CGSizeMake(23.0, 24.0)]]; + + [slider setValue:CGSizeMake(23.0, 24.0) forThemeAttribute:@"knob-size"]; + [slider setValue:knobColor forThemeAttribute:@"knob-color"]; + [slider setValue:knobHighlightedColor forThemeAttribute:@"knob-color" inState:CPThemeStateHighlighted]; + [slider setValue:knobDisabledColor forThemeAttribute:@"knob-color" inState:CPThemeStateDisabled]; + + return slider; +} + (CPSlider)themedCircularSlider { var slider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 34.0, 34.0)], From dfcef3ca2d4654bceb637e46efa704d0aab14097 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 21 May 2010 01:39:30 -0400 Subject: [PATCH 149/175] Fixed: [CPPopUpButton itemTitles] didn't work. --- AppKit/CPPopUpButton.j | 77 ++++++++++++++++---------------- Tests/AppKit/CPPopUpButtonTest.j | 23 ++++++++++ 2 files changed, 62 insertions(+), 38 deletions(-) create mode 100644 Tests/AppKit/CPPopUpButtonTest.j diff --git a/AppKit/CPPopUpButton.j b/AppKit/CPPopUpButton.j index 9913e8023..b5ac0e1e1 100644 --- a/AppKit/CPPopUpButton.j +++ b/AppKit/CPPopUpButton.j @@ -32,7 +32,7 @@ var VISIBLE_MARGIN = 7.0; CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); -/*! +/*! @ingroup appkit @class CPPopUpButton @@ -42,7 +42,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { int _selectedIndex; CPRectEdge _preferredEdge; - + CPMenu _menu; } @@ -60,21 +60,21 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); - (id)initWithFrame:(CGRect)aFrame pullsDown:(BOOL)shouldPullDown { self = [super initWithFrame:aFrame]; - + if (self) { _selectedIndex = CPNotFound; _preferredEdge = CPMaxYEdge; - + [self setValue:CPImageLeft forThemeAttribute:@"image-position"]; [self setValue:CPLeftTextAlignment forThemeAttribute:@"alignment"]; [self setValue:CPLineBreakByTruncatingTail forThemeAttribute:@"line-break-mode"]; - + [self setMenu:[[CPMenu alloc] initWithTitle:@""]]; [self setPullsDown:shouldPullDown]; } - + return self; } @@ -145,7 +145,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { var index = 0, count = [titles count]; - + for (; index < count; ++index) [self addItemWithTitle:titles[index]]; } @@ -159,11 +159,11 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { var items = [self itemArray], count = [items count]; - + while (count--) if ([items[count] title] == aTitle) [self removeItemAtIndex:count]; - + [_menu insertItemWithTitle:aTitle action:NULL keyEquivalent:nil atIndex:anIndex]; } @@ -173,7 +173,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); - (void)removeAllItems { var count = [_menu numberOfItems]; - + while (count--) [_menu removeItemAtIndex:0]; } @@ -206,7 +206,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { if (_selectedIndex < 0 || _selectedIndex > [self numberOfItems] - 1) return nil; - + return [_menu itemAtIndex:_selectedIndex]; } @@ -253,15 +253,15 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { if (_selectedIndex == anIndex) return; - + if (_selectedIndex >= 0 && ![self pullsDown]) [[self selectedItem] setState:CPOffState]; - + _selectedIndex = anIndex; if (_selectedIndex >= 0 && ![self pullsDown]) [[self selectedItem] setState:CPOnState]; - + [self synchronizeTitleAndSelectedItem]; } @@ -310,7 +310,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); return; var defaultCenter = [CPNotificationCenter defaultCenter]; - + if (_menu) { [defaultCenter @@ -330,7 +330,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); } _menu = aMenu; - + if (_menu) { [defaultCenter @@ -338,20 +338,20 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); selector:@selector(menuDidAddItem:) name:CPMenuDidAddItemNotification object:_menu]; - + [defaultCenter addObserver:self selector:@selector(menuDidChangeItem:) name:CPMenuDidChangeItemNotification object:_menu]; - + [defaultCenter addObserver:self selector:@selector(menuDidRemoveItem:) name:CPMenuDidRemoveItemNotification object:_menu]; } - + [self synchronizeTitleAndSelectedItem]; } @@ -396,12 +396,13 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); { var titles = [], items = [self itemArray], - index = 0, count = [items count]; - + for (; index < count; ++index) - items.push([items[index] title]); + titles.push([items[index] title]); + + return titles; } /*! @@ -519,14 +520,14 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); else { var index = [self indexOfItemWithTitle:aTitle]; - + if (index < 0) { [self addItemWithTitle:aTitle]; - + index = [self numberOfItems] - 1; } - + [self selectItemAtIndex:index]; } } @@ -554,7 +555,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); if ([self pullsDown]) { var items = [_menu itemArray]; - + if ([items count] > 0) item = items[0]; } @@ -573,22 +574,22 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); - (void)menuDidAddItem:(CPNotification)aNotification { var index = [[aNotification userInfo] objectForKey:@"CPMenuItemIndex"]; - + if (_selectedIndex < 0) [self selectItemAtIndex:0]; - + else if (index == _selectedIndex) [self synchronizeTitleAndSelectedItem]; - + else if (index < _selectedIndex) ++_selectedIndex; - + if (index == 0 && [self pullsDown]) { var items = [_menu itemArray]; - + [items[0] setHidden:YES]; - + if (items.length > 0) [items[1] setHidden:NO]; } @@ -613,10 +614,10 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); if ([self pullsDown] && index != 0) return; - + if (![self pullsDown] && index != _selectedIndex) return; - + [self synchronizeTitleAndSelectedItem]; } @@ -627,7 +628,7 @@ CPPopUpButtonStatePullsDown = CPThemeState("pulls-down"); - (void)menuDidRemoveItem:(CPNotification)aNotification { var numberOfItems = [self numberOfItems]; - + if (numberOfItems <= _selectedIndex && numberOfItems > 0) [self selectItemAtIndex:numberOfItems - 1]; else @@ -737,7 +738,7 @@ var CPPopUpButtonMenuKey = @"CPPopUpButtonMenuKey", - (id)initWithCoder:(CPCoder)aCoder { self = [super initWithCoder:aCoder]; - + if (self) { // Nothing is currently selected @@ -746,7 +747,7 @@ var CPPopUpButtonMenuKey = @"CPPopUpButtonMenuKey", [self setMenu:[aCoder decodeObjectForKey:CPPopUpButtonMenuKey]]; [self selectItemAtIndex:[aCoder decodeObjectForKey:CPPopUpButtonSelectedIndexKey]]; } - + return self; } @@ -758,7 +759,7 @@ var CPPopUpButtonMenuKey = @"CPPopUpButtonMenuKey", - (void)encodeWithCoder:(CPCoder)aCoder { [super encodeWithCoder:aCoder]; - + [aCoder encodeObject:_menu forKey:CPPopUpButtonMenuKey]; [aCoder encodeInt:_selectedIndex forKey:CPPopUpButtonSelectedIndexKey]; } diff --git a/Tests/AppKit/CPPopUpButtonTest.j b/Tests/AppKit/CPPopUpButtonTest.j new file mode 100644 index 000000000..c45085633 --- /dev/null +++ b/Tests/AppKit/CPPopUpButtonTest.j @@ -0,0 +1,23 @@ + +@import +@import + +@implementation CPPopUpButtonTest : OJTestCase +{ + CPPopUpButton button; +} + +- (void)setUp +{ + button = [CPPopUpButton new]; +} + +- (void)testItemTitles +{ + [self assert:[] equals:[button itemTitles]]; + [button addItem:[[CPMenuItem alloc] initWithTitle:"Option A" action:nil keyEquivalent:nil]]; + [button addItem:[[CPMenuItem alloc] initWithTitle:"Option B" action:nil keyEquivalent:nil]]; + [self assert:["Option A", "Option B"] equals:[button itemTitles]]; +} + +@end From 252b2581597e5acea15702a4785d917e5334f546 Mon Sep 17 00:00:00 2001 From: Paul Baumgart Date: Wed, 19 May 2010 02:24:32 -0700 Subject: [PATCH 150/175] fix CFDictionary.containsValue and CFDictionary.countOfValue and add tests to prove it --- Objective-J/CFDictionary.js | 12 ++++++++--- Tests/Objective-J/CFDictionaryTest.j | 31 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 Tests/Objective-J/CFDictionaryTest.j diff --git a/Objective-J/CFDictionary.js b/Objective-J/CFDictionary.js index a9c0ccb74..ea45b6e2b 100644 --- a/Objective-J/CFDictionary.js +++ b/Objective-J/CFDictionary.js @@ -75,8 +75,11 @@ CFDictionary.prototype.containsValue = function(/*id*/ anObject) count = keys.length; for (; index < count; ++index) - if (buckets[keys] === anObject) + { + var thisKey = keys[index]; + if (buckets[thisKey] === anObject) return YES; + } return NO; } @@ -106,8 +109,11 @@ CFDictionary.prototype.countOfValue = function(/*id*/ anObject) countOfValue = 0; for (; index < count; ++index) - if (buckets[keys] === anObject) - return ++countOfValue; + { + var thisKey = keys[index]; + if (buckets[thisKey] === anObject) + ++countOfValue; + } return countOfValue; } diff --git a/Tests/Objective-J/CFDictionaryTest.j b/Tests/Objective-J/CFDictionaryTest.j new file mode 100644 index 000000000..924d209fe --- /dev/null +++ b/Tests/Objective-J/CFDictionaryTest.j @@ -0,0 +1,31 @@ + +@implementation CFDictionaryTest : OJTestCase + +- (void)testContainsValue +{ + var dict = new CFMutableDictionary(); + [self assert:NO equals:dict.containsValue(@"123")]; + [self assert:NO equals:dict.containsValue(@"abc")]; + + dict.setValueForKey(@"abc", @"123"); + [self assert:YES equals:dict.containsValue(@"123")]; + [self assert:NO equals:dict.containsValue(@"abc")]; + + dict.setValueForKey(@"def", @"123"); + [self assert:YES equals:dict.containsValue(@"123")]; + [self assert:NO equals:dict.containsValue(@"abc")]; +} + +- (void)testCountOfValue +{ + var dict = new CFMutableDictionary(); + [self assert:0 equals:dict.countOfValue(@"123")]; + + dict.setValueForKey(@"abc", @"123"); + [self assert:1 equals:dict.countOfValue(@"123")]; + + dict.setValueForKey(@"def", @"123"); + [self assert:2 equals:dict.countOfValue(@"123")]; +} + +@end From fbd23fb2c33c72e0b293b8e64b6a315c6bb5f8b1 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Mon, 24 May 2010 15:45:54 -0700 Subject: [PATCH 151/175] Removed unecessary var. Reviewed by me. --- Objective-J/CFDictionary.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Objective-J/CFDictionary.js b/Objective-J/CFDictionary.js index ea45b6e2b..8c10b7fdf 100644 --- a/Objective-J/CFDictionary.js +++ b/Objective-J/CFDictionary.js @@ -75,11 +75,8 @@ CFDictionary.prototype.containsValue = function(/*id*/ anObject) count = keys.length; for (; index < count; ++index) - { - var thisKey = keys[index]; - if (buckets[thisKey] === anObject) + if (buckets[keys[index]] === anObject) return YES; - } return NO; } @@ -109,11 +106,8 @@ CFDictionary.prototype.countOfValue = function(/*id*/ anObject) countOfValue = 0; for (; index < count; ++index) - { - var thisKey = keys[index]; - if (buckets[thisKey] === anObject) + if (buckets[keys[index]] === anObject) ++countOfValue; - } return countOfValue; } From 49ae82d96aa347da5ade963043dcf5295934fb6c Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 2 May 2010 01:59:50 -0400 Subject: [PATCH 152/175] Fixed: CPToolbar validateVisibleItems was called validateVisibleToolbarItems. --- AppKit/CPToolbar.j | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/AppKit/CPToolbar.j b/AppKit/CPToolbar.j index f78f891b6..b45d70211 100644 --- a/AppKit/CPToolbar.j +++ b/AppKit/CPToolbar.j @@ -329,7 +329,11 @@ var CPToolbarConfigurationsByIdentifier = nil; return _itemsSortedByVisibilityPriority; } -- (void)validateVisibleToolbarItems +/*! + Validates the visible toolbar items by sending a validate message to + each visible toolbar item. +*/ +- (void)validateVisibleItems { var toolbarItems = [self visibleItems], count = [toolbarItems count]; From f9da7f73b3f3a20512672c428a8989c36920325a Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Mon, 24 May 2010 21:59:37 -0500 Subject: [PATCH 153/175] Added missing pathComponents method to CPURL. --- Foundation/CPURL.j | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Foundation/CPURL.j b/Foundation/CPURL.j index 25dbb7d5a..e6235ab90 100644 --- a/Foundation/CPURL.j +++ b/Foundation/CPURL.j @@ -94,6 +94,11 @@ CPURLCustomIconKey = @"CPURLCustomIconKey"; return [self absoluteURL].path(); } +- (CPArray)pathComponents +{ + return self.pathComponents(); +} + // if absolute, returns the same as path - (CPString)relativePath { From 359a29874b39d9826b79299db8a0ca5cae5ac5ef Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Mon, 24 May 2010 22:44:14 -0500 Subject: [PATCH 154/175] Return a copy instead of the array itself. --- Foundation/CPURL.j | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Foundation/CPURL.j b/Foundation/CPURL.j index e6235ab90..dc240fbaa 100644 --- a/Foundation/CPURL.j +++ b/Foundation/CPURL.j @@ -96,7 +96,8 @@ CPURLCustomIconKey = @"CPURLCustomIconKey"; - (CPArray)pathComponents { - return self.pathComponents(); + var path = self.pathComponents(); + return [path copy]; } // if absolute, returns the same as path From 2a630a7210f6745af2745a75e9fb99ca37945d6a Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Tue, 25 May 2010 20:37:00 +0200 Subject: [PATCH 155/175] made CPDictionary call [super valueForKey:] on keys prefixed with @ --- Foundation/CPKeyValueCoding.j | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index 36ef5b48c..6543d04b6 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -267,7 +267,10 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; - (id)valueForKey:(CPString)aKey { - return [self objectForKey:aKey]; + if ([aKey hasPrefix:@"@"]) + return [super valueForKey:aKey.substr(1)]; + + return [self objectForKey:aKey]; } - (void)setValue:(id)aValue forKey:(CPString)aKey From 6c1a6a20333ef95876a2f9a282aa210b76343f9c Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Tue, 25 May 2010 11:05:07 +0200 Subject: [PATCH 156/175] made _sendPartialString send it's action down the responder chain --- AppKit/CPSearchField.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPSearchField.j b/AppKit/CPSearchField.j index 50528fb0d..f5fdea74a 100644 --- a/AppKit/CPSearchField.j +++ b/AppKit/CPSearchField.j @@ -581,7 +581,7 @@ var CPSearchFieldSearchImage = nil, - (void)_sendPartialString { - [[self target] performSelector:[self action] withObject:self]; + [self _sendAction:self]; } - (void)_searchFieldCancel:(id)sender From 0315ad38f918997aea15960eb6b77b28d61b55da Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Tue, 13 Apr 2010 19:26:08 +0200 Subject: [PATCH 157/175] - fixed CPKeyedUnarchiver decodeBytesForKey attempting to access nil (or undefined) data - improved CPSearchField nib2cib support --- Foundation/CPKeyedUnarchiver.j | 7 +++++-- Tools/nib2cib/NSSearchField.j | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Foundation/CPKeyedUnarchiver.j b/Foundation/CPKeyedUnarchiver.j index 01fd63841..ef7d9c9f0 100644 --- a/Foundation/CPKeyedUnarchiver.j +++ b/Foundation/CPKeyedUnarchiver.j @@ -354,9 +354,12 @@ var CPArrayClass = Ni - (id)decodeBytesForKey:(CPString)aKey { // We get the CPData wrapper, then extract the bytes array - var data = [self decodeObjectForKey:aKey], - objectClass = data.isa; + var data = [self decodeObjectForKey:aKey]; + if (!data) + return nil; + + var objectClass = data.isa; if (objectClass === CPDataClass) return data.bytes; diff --git a/Tools/nib2cib/NSSearchField.j b/Tools/nib2cib/NSSearchField.j index 5e9173712..a68d5ede3 100644 --- a/Tools/nib2cib/NSSearchField.j +++ b/Tools/nib2cib/NSSearchField.j @@ -32,6 +32,12 @@ if (self) { + var cell = [aCoder decodeObjectForKey:@"NSCell"]; + + [self setRecentsAutosaveName:[cell recentsAutosaveName]]; + [self setMaximumRecents:[cell maximumRecents]]; + [self setSendsWholeSearchString:[cell sendsWholeSearchString]]; + [self setSendsSearchStringImmediately:[cell sendsSearchStringImmediately]]; } return self; @@ -59,5 +65,25 @@ @implementation NSSearchFieldCell : NSTextFieldCell { + CPString _recentsAutosaveName @accessors(property=recentsAutosaveName); + int _maximumRecents @accessors(property=maximumRecents); + BOOL _sendsWholeSearchString @accessors(property=sendsWholeSearchString); + BOOL _sendsSearchStringImmediately @accessors(property=sendsSearchStringImmediately); } + +- (id)initWithCoder:(CPCoder)aCoder +{ + if (self = [super initWithCoder:aCoder]) + { + _recentsAutosaveName = [aCoder decodeObjectForKey:@"NSRecentsAutosaveName"]; + _maximumRecents = [aCoder decodeIntForKey:@"NSMaximumRecents"]; + _sendsWholeSearchString = [aCoder decodeBoolForKey:@"NSSendsWholeSearchString"] ? YES : NO; + + // These bytes don't seem to be used for anything else but the send immediatly flag + _sendsSearchStringImmediately = [aCoder decodeBytesForKey:@"NSSearchFieldFlags"] ? YES: NO; + } + + return self; +} + @end From 428f5a656de7db6ee3b94d9135b6ffecaf492ee6 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 7 Apr 2010 18:37:12 +0200 Subject: [PATCH 158/175] changed default table view alternating row colors to aristo --- AppKit/CPTableView.j | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index cd6b22c78..8e5985c30 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -244,7 +244,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5; _selectionHighlightStyle = CPTableViewSelectionHighlightStyleRegular; [self setUsesAlternatingRowBackgroundColors:NO]; - [self setAlternatingRowBackgroundColors:[[CPColor whiteColor], [CPColor colorWithHexString:@"f5f9fc"]]]; + [self setAlternatingRowBackgroundColors: + [[CPColor whiteColor], [CPColor colorWithRed:245.0 / 255.0 green:249.0 / 255.0 blue:252.0 / 255.0 alpha:1.0]]]; _tableColumns = []; _tableColumnRanges = []; @@ -3413,9 +3414,10 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", _gridColor = [aCoder decodeObjectForKey:CPTableViewGridColorKey] || [CPColor grayColor]; _gridStyleMask = [aCoder decodeIntForKey:CPTableViewGridStyleMaskKey] || CPTableViewGridNone; - _alternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewAlternatingRowColorsKey]; _usesAlternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewUsesAlternatingBackgroundKey] - + _alternatingRowBackgroundColors = + [[CPColor whiteColor], [CPColor colorWithRed:245.0 / 255.0 green:249.0 / 255.0 blue:252.0 / 255.0 alpha:1.0]]; + _headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey]; _cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey]; From e65fcdab42c2a277db62ac1d3ab542b117e60b3b Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 7 Apr 2010 18:44:11 +0200 Subject: [PATCH 159/175] - changed default dataview styling to aristo - updated nib2cib support for CPTableColumn --- AppKit/CPTableColumn.j | 13 +++++++++---- Tests/Manual/TableCibTest/Resources/MainMenu.cib | 2 +- Tools/nib2cib/NSTableColumn.j | 8 ++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 14f239484..6c65113b5 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -79,11 +79,16 @@ CPTableColumnUserResizingMask = 1 << 1; [self setHeaderView:header]; var textDataView = [CPTextField new]; - [textDataView setLineBreakMode:CPLineBreakByTruncatingTail]; - [textDataView setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"text-color"]; - [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelectedDataView]; - [textDataView setValue:[CPFont boldSystemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateSelectedDataView]; + + [textDataView setValue:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0] + forThemeAttribute:"text-color"]; + + [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [textDataView setLineBreakMode:CPLineBreakByTruncatingTail]; + [textDataView setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateSelected]; [textDataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; + [textDataView setValue:CGInsetMake(0.0, 0.0, 0.0, 5.0) forThemeAttribute:@"content-inset"]; + [self setDataView:textDataView]; } diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableCibTest/Resources/MainMenu.cib index 94613c585..d918dceb7 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;16E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;60E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;61E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;63E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;65E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;67E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;69E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;69E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;71E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;71E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;72E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;73E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;74E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;75E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;78E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;68E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;32E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;29E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;79E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;79E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;79E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;79E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;80E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;80E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;80E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;83E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;84E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;79E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;85E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;86E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;87E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;89E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;90E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;91E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;92E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;26E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;93E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;94E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;95E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;96E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;97E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;98E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;99E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;100E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;101E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;24E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;103E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;90E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;95E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;26E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;94E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;95E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;107E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;108E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;63E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;109E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;110E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;78E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;111E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;111E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;78E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;94E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;112E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;113E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;114E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;80E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;80E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;80E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;80E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;115E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;117E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;1;0E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;80E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;118E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;82E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;22E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;119E;E;S;16;Table Column (2)S;12;File's OwnerS;17;Table Header ViewS;12;Content ViewS;33;Bordered Scroll View (Table View)S;16;Table Column (3)S;19;Horizontal ScrollerS;15;Window (Window)S;29;Text Field Cell (Text Cell)-1S;29;Text Field Cell (Text Cell)-2S;27;Text Field Cell (Text Cell)S;17;Vertical ScrollerS;16;Table Column (1)S;29;Table View (Column 1, Two, 3)S;11;ApplicationS;14;App ControllerD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;31E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;35E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;E;E;S;1;2d;3;154d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;125E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;12;$atext-colorD;K;6;CP$UIDd;3;130E;K;11;$aalignmentD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;131E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;132E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;77E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;136E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;137E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;138E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;90E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;22E;E;S;19;{{0, 0}, {516, 23}}S;6;normalS;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;82E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;77E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;133E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;111E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;90E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;135E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;35E;E;d;2;10T;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;26E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;139E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;140E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;26E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;90E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;141E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;S;1;3d;3;188d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;83E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;12;$atext-colorD;K;6;CP$UIDd;3;143E;K;11;$aalignmentD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;131E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;132E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;131E;E;S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}d;1;8S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:d;1;4d;1;0f;18;0.9866156787762906S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}S;17;disabled+verticalS;27;_verticalScrollerDidScroll:f;18;0.9482758620689655S;1;1d;3;101D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;144E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;145E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;12;$atext-colorD;K;6;CP$UIDd;3;146E;K;11;$aalignmentD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;131E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;132E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;131E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;27E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;116E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;148E;E;E;S;13;AppControllerS;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;150E;E;E;S;3;TwoD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;151E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;152E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;114E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;153E;K;5;stateD;K;6;CP$UIDd;3;154E;K;5;valueD;K;6;CP$UIDd;3;135E;E;S;0;d;4;3072S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;35E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;116E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;155E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;3;116E;K;22;CPColorPatternImageKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;153E;K;5;stateD;K;6;CP$UIDd;3;154E;K;5;valueD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;159E;E;E;S;8;Column 1D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;153E;K;5;stateD;K;6;CP$UIDd;3;154E;K;5;valueD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;3;160E;D;K;6;CP$UIDd;2;92E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;116E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;161E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;162E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;163E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;65E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;S;5;Ariald;2;11S;10;text-colorS;8;selectedD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;E;E;D;K;10;$classnameS;7;CPImageK;8;$classesA;S;7;CPImageS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;10;CPFilenameD;K;6;CP$UIDd;3;165E;K;6;CPSizeD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;86E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;162E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;163E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;86E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;109E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;162E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;163E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;109E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;f;3;0.5D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;92E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;102;file:/usr/local/narwhal/packages/cappuccino/Frameworks/Debug/AppKit/Resources/tableview-headerview.pngS;7;{1, 23}f;18;0.8941176470588236f;18;0.9058823529411765E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;35E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;60E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;61E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;63E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;65E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;66E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;68E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;69E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;37E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;70E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;71E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;69E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;72E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;73E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;74E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;75E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;76E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;78E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;80E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;81E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;82E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;82E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;81E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;84E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;85E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;85E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;86E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;87E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;88E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;89E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;89E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;89E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;89E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;90E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;92E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;1;0E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;89E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;93E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;95E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;97E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;98E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;75E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;76E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;99E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;100E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;101E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;102E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;103E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;104E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;105E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;106E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;107E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;108E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;109E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;110E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;37E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;111E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;71E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;69E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;112E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;113E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;117E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;118E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;84E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;81E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;22E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;33E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;103E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;103E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;103E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;103E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;89E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;89E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;89E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;95E;E;S;15;Window (Window)S;17;Vertical ScrollerS;16;Table Column (2)S;27;Text Field Cell (Text Cell)S;17;Table Header ViewS;11;ApplicationS;29;Text Field Cell (Text Cell)-1S;12;File's OwnerS;29;Table View (Column 1, Two, 3)S;14;App ControllerS;16;Table Column (1)S;16;Table Column (3)S;19;Horizontal ScrollerS;12;Content ViewS;29;Text Field Cell (Text Cell)-2S;33;Bordered Scroll View (Table View)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:d;1;4f;18;0.9482758620689655S;1;2d;3;154d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;125E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;6;$afontD;K;6;CP$UIDd;3;130E;K;12;$atext-colorD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;71E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;132E;K;11;$aalignmentD;K;6;CP$UIDd;2;69E;K;15;$acontent-insetD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;3;119E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;153E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;155E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;26E;E;S;19;{{0, 0}, {516, 23}}S;6;normalD;K;6;$classD;K;6;CP$UIDd;3;119E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;151E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;85E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;32E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;S;13;AppControllerS;1;1d;3;101D;K;6;$classD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;143E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;71E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;132E;K;11;$aalignmentD;K;6;CP$UIDd;2;69E;K;15;$acontent-insetD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;S;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;147E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;101E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;6;$afontD;K;6;CP$UIDd;3;148E;K;12;$atext-colorD;K;6;CP$UIDd;3;149E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;71E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;132E;K;11;$aalignmentD;K;6;CP$UIDd;2;69E;K;15;$acontent-insetD;K;6;CP$UIDd;3;150E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;95E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;157E;E;E;S;3;TwoD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;158E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;159E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;160E;K;5;stateD;K;6;CP$UIDd;3;161E;K;5;valueD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;169E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;E;E;S;8;Column 1D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;160E;K;5;stateD;K;6;CP$UIDd;3;161E;K;5;valueD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;160E;K;5;stateD;K;6;CP$UIDd;3;161E;K;5;valueD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;78E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;78E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;S;5;Ariald;2;11S;4;fontS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;126E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;177E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;178E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;E;S;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;138E;K;6;normalD;K;6;CP$UIDd;3;179E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}f;3;0.5D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;99E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;99E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;138E;K;6;normalD;K;6;CP$UIDd;3;182E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;105E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;138E;K;6;normalD;K;6;CP$UIDd;3;183E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;17;Arial, sans-serifd;2;12D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;f;18;0.8941176470588236f;18;0.9058823529411765D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;110E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tools/nib2cib/NSTableColumn.j b/Tools/nib2cib/NSTableColumn.j index bdafee212..a9606f081 100644 --- a/Tools/nib2cib/NSTableColumn.j +++ b/Tools/nib2cib/NSTableColumn.j @@ -37,7 +37,15 @@ //var dataViewCell = [aCoder decodeObjectForKey:@"NSDataCell"]; _dataView = [[CPTextField alloc] initWithFrame:CPRectMakeZero()]; + + [_dataView setValue:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0] + forThemeAttribute:"text-color"]; + [_dataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_dataView setLineBreakMode:CPLineBreakByTruncatingTail]; + [_dataView setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_dataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; + [_dataView setValue:CGInsetMake(0.0, 0.0, 0.0, 5.0) forThemeAttribute:@"content-inset"]; var headerCell = [aCoder decodeObjectForKey:@"NSHeaderCell"], headerView = [[_CPTableColumnHeaderView alloc] initWithFrame:CPRectMakeZero()]; From 1f97616f3c4bf3a268d9b63ed8b21b942f9dff32 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 7 Apr 2010 18:48:15 +0200 Subject: [PATCH 160/175] override default IB tableview grid colors with aristo's --- Tests/Manual/TableCibTest/Resources/MainMenu.cib | 2 +- Tests/Manual/TableCibTest/Resources/MainMenu.xib | 16 +++++++++------- Tools/nib2cib/NSTableView.j | 5 +++++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableCibTest/Resources/MainMenu.cib index d918dceb7..7743d2a78 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;35E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;60E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;61E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;62E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;63E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;64E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;65E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;66E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;68E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;69E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;37E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;70E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;71E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;69E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;72E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;73E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;74E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;75E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;76E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;78E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;80E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;81E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;82E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;82E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;81E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;84E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;85E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;85E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;84E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;86E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;87E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;88E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;89E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;89E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;89E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;89E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;90E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;92E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;1;0E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;89E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;93E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;95E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;97E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;98E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;75E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;76E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;99E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;100E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;101E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;102E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;103E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;104E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;105E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;106E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;107E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;108E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;109E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;110E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;37E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;111E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;71E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;69E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;112E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;113E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;117E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;118E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;84E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;81E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;22E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;33E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;103E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;103E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;103E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;103E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;89E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;89E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;89E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;95E;E;S;15;Window (Window)S;17;Vertical ScrollerS;16;Table Column (2)S;27;Text Field Cell (Text Cell)S;17;Table Header ViewS;11;ApplicationS;29;Text Field Cell (Text Cell)-1S;12;File's OwnerS;29;Table View (Column 1, Two, 3)S;14;App ControllerS;16;Table Column (1)S;16;Table Column (3)S;19;Horizontal ScrollerS;12;Content ViewS;29;Text Field Cell (Text Cell)-2S;33;Bordered Scroll View (Table View)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;30E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;30E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:d;1;4f;18;0.9482758620689655S;1;2d;3;154d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;125E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;6;$afontD;K;6;CP$UIDd;3;130E;K;12;$atext-colorD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;71E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;132E;K;11;$aalignmentD;K;6;CP$UIDd;2;69E;K;15;$acontent-insetD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;3;119E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;153E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;154E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;155E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;26E;E;S;19;{{0, 0}, {516, 23}}S;6;normalD;K;6;$classD;K;6;CP$UIDd;3;119E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;151E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;85E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;32E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;138E;D;K;6;CP$UIDd;3;139E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;S;13;AppControllerS;1;1d;3;101D;K;6;$classD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;143E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;71E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;132E;K;11;$aalignmentD;K;6;CP$UIDd;2;69E;K;15;$acontent-insetD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;S;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;147E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;101E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;127E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;128E;K;6;$afontD;K;6;CP$UIDd;3;148E;K;12;$atext-colorD;K;6;CP$UIDd;3;149E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;71E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;132E;K;11;$aalignmentD;K;6;CP$UIDd;2;69E;K;15;$acontent-insetD;K;6;CP$UIDd;3;150E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;95E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;157E;E;E;S;3;TwoD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;126E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;158E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;159E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;88E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;160E;K;5;stateD;K;6;CP$UIDd;3;161E;K;5;valueD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;169E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;E;E;S;8;Column 1D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;160E;K;5;stateD;K;6;CP$UIDd;3;161E;K;5;valueD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;160E;K;5;stateD;K;6;CP$UIDd;3;161E;K;5;valueD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;3;129E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;78E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;78E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;S;5;Ariald;2;11S;4;fontS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;126E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;177E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;178E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;89E;E;S;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;138E;K;6;normalD;K;6;CP$UIDd;3;179E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}f;3;0.5D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;99E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;99E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;138E;K;6;normalD;K;6;CP$UIDd;3;182E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;156E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;105E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;138E;K;6;normalD;K;6;CP$UIDd;3;183E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;17;Arial, sans-serifd;2;12D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;f;18;0.8941176470588236f;18;0.9058823529411765D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;2;91E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;110E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;187E;D;K;6;CP$UIDd;3;110E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;16E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;60E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;61E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;63E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;64E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;24E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;64E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;67E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;68E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;69E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;71E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;73E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;75E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;76E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;77E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;82E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;83E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;20E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;29E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;84E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;85E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;85E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;85E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;87E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;83E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;32E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;91E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;92E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;93E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;24E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;94E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;64E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;96E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;97E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;84E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;98E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;99E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;100E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;101E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;82E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;102E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;103E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;104E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;85E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;85E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;85E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;85E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;105E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;107E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;108E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;85E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;109E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;87E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;110E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;112E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;113E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;71E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;114E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;115E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;116E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;117E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;118E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;119E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;120E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;34E;E;S;17;Vertical ScrollerS;16;Table Column (1)S;33;Bordered Scroll View (Table View)S;27;Text Field Cell (Text Cell)S;17;Table Header ViewS;29;Text Field Cell (Text Cell)-1S;12;File's OwnerS;11;ApplicationS;14;App ControllerS;19;Horizontal ScrollerS;16;Table Column (3)S;29;Table View (Column 1, Two, 3)S;12;Content ViewS;16;Table Column (2)S;29;Text Field Cell (Text Cell)-2S;15;Window (Window)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;28E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:d;1;4f;18;0.9482758620689655S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;64E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;87E;E;E;d;2;36S;6;normalD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;139E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;32E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;141E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;142E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;26E;E;d;2;10T;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;S;19;{{0, 0}, {516, 23}}S;13;AppControllerS;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;1;3d;3;188d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;72E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;96E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;147E;K;12;$atext-colorD;K;6;CP$UIDd;3;148E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;64E;K;15;$acontent-insetD;K;6;CP$UIDd;3;149E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;30E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;150E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;151E;E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;72E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;64E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;104E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;166E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;S;0;d;4;3072S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;173E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;73E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;S;5;Ariald;2;11S;4;fontS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;178E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;179E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;85E;E;S;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;140E;K;6;normalD;K;6;CP$UIDd;3;180E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;99E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;99E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;140E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;114E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;114E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;140E;K;6;normalD;K;6;CP$UIDd;3;184E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;17;Arial, sans-serifd;2;12D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;186E;E;f;18;0.8941176470588236f;18;0.9058823529411765D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;2;93E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.xib b/Tests/Manual/TableCibTest/Resources/MainMenu.xib index 01d7aae19..42934a3ea 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.xib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.xib @@ -2,17 +2,17 @@ 1050 - 10C540 - 740 - 1038.25 - 458.00 + 10D573 + 759 + 1038.29 + 460.00 com.apple.InterfaceBuilder.CocoaPlugin - 740 + 759 YES - + YES @@ -218,9 +218,10 @@ 23 - -694157312 + -157286400 + 3 4 15 0 @@ -531,6 +532,7 @@ 0 + IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx diff --git a/Tools/nib2cib/NSTableView.j b/Tools/nib2cib/NSTableView.j index 955ba7f14..f185ce817 100644 --- a/Tools/nib2cib/NSTableView.j +++ b/Tools/nib2cib/NSTableView.j @@ -54,6 +54,11 @@ _intercellSpacing = CGSizeMake(0.0, 0.0);//CGSizeMake([aCoder decodeFloatForKey:"NSIntercellSpacingWidth"], [aCoder decodeFloatForKey:"NSIntercellSpacingHeight"]); _gridColor = [aCoder decodeObjectForKey:@"NSGridColor"]; + + // Convert xib default to cib default + if ([_gridColor isEqual:[CPColor colorWithRed:127.0 / 255.0 green:127.0 / 255.0 blue:127.0 / 255.0 alpha:1.0]]) + _gridColor = [CPColor colorWithRed:229.0 / 255.0 green:229.0 / 255.0 blue:229.0 / 255.0 alpha:1.0]; + _gridStyleMask = [aCoder decodeIntForKey:@"NSGridStyleMask"]; _usesAlternatingRowBackgroundColors = (flags & 0x00800000) ? YES : NO; From 5479c77ae6fa38e86b101df99d26d713e3f99ed4 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 7 Apr 2010 18:54:40 +0200 Subject: [PATCH 161/175] changed the table header view image height to 23.0 --- AppKit/CPTableHeaderView.j | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index 073db4e72..926914eb4 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -61,13 +61,13 @@ var themeState = [self themeState]; if(themeState & CPThemeStateSelected && themeState & CPThemeStateHighlighted) - [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted-pressed.png", CGSizeMake(1.0, 22.0))]]; + [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted-pressed.png", CGSizeMake(1.0, 23.0))]]; else if (themeState & CPThemeStateSelected) - [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted.png", CGSizeMake(1.0, 22.0))]]; + [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted.png", CGSizeMake(1.0, 23.0))]]; else if (themeState & CPThemeStateHighlighted) - [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-pressed.png", CGSizeMake(1.0, 22.0))]]; + [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-pressed.png", CGSizeMake(1.0, 23.0))]]; else - [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]]; + [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]]; } - (void)setStringValue:(CPString)string @@ -174,7 +174,7 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal _columnOldWidth = 0.0; - [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]]; + [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]]; } - (id)initWithFrame:(CGRect)aFrame From 00096030982529c8c308bf1c6626928f6380f825 Mon Sep 17 00:00:00 2001 From: Randall Luecke Date: Tue, 25 May 2010 14:01:42 -0500 Subject: [PATCH 162/175] removed the border from _CPCornerView (Aristo) Conflicts: Tests/Manual/TableCibTest/Resources/MainMenu.cib --- AppKit/_CPCornerView.j | 14 -------------- Tests/Manual/TableCibTest/Resources/MainMenu.cib | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/AppKit/_CPCornerView.j b/AppKit/_CPCornerView.j index 81c4a86e5..a5e4f9a65 100644 --- a/AppKit/_CPCornerView.j +++ b/AppKit/_CPCornerView.j @@ -20,20 +20,6 @@ return self; } -- (void)drawRect:(CGRect)aRect -{ - var context = [[CPGraphicsContext currentContext] graphicsPort]; - - CGContextSetStrokeColor(context, [CPColor colorWithHexString:@"dce0e2"]); - - var points = [ - CGPointMake(aRect.origin.x, aRect.origin.y + 0.5), - CGPointMake(aRect.origin.x, aRect.origin.y + aRect.size.height) - ]; - - CGContextStrokeLineSegments(context, points, 2); -} - - (id)initWithCoder:(CPCoder)aCoder { self = [super initWithCoder:aCoder]; diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableCibTest/Resources/MainMenu.cib index 7743d2a78..89b2c2de7 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;16E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;60E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;61E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;63E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;64E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;24E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;64E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;67E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;68E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;69E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;71E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;73E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;75E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;76E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;77E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;79E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;82E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;83E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;20E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;29E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;84E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;85E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;85E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;85E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;87E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;83E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;83E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;32E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;91E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;92E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;93E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;24E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;94E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;64E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;96E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;97E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;84E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;98E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;99E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;100E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;101E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;82E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;102E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;103E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;104E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;85E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;85E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;85E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;85E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;105E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;107E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;108E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;85E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;109E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;87E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;110E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;112E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;113E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;71E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;114E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;115E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;116E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;117E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;118E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;119E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;120E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;34E;E;S;17;Vertical ScrollerS;16;Table Column (1)S;33;Bordered Scroll View (Table View)S;27;Text Field Cell (Text Cell)S;17;Table Header ViewS;29;Text Field Cell (Text Cell)-1S;12;File's OwnerS;11;ApplicationS;14;App ControllerS;19;Horizontal ScrollerS;16;Table Column (3)S;29;Table View (Column 1, Two, 3)S;12;Content ViewS;16;Table Column (2)S;29;Text Field Cell (Text Cell)-2S;15;Window (Window)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;28E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:d;1;4f;18;0.9482758620689655S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;72E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;64E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;87E;E;E;d;2;36S;6;normalD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;139E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;32E;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;141E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;142E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;140E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;26E;E;d;2;10T;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;86E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;24E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;S;19;{{0, 0}, {516, 23}}S;13;AppControllerS;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;1;3d;3;188d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;72E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;96E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;147E;K;12;$atext-colorD;K;6;CP$UIDd;3;148E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;64E;K;15;$acontent-insetD;K;6;CP$UIDd;3;149E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;30E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;150E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;140E;D;K;6;CP$UIDd;3;151E;E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;72E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;64E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;104E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;166E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;S;0;d;4;3072S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;173E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;73E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;S;5;Ariald;2;11S;4;fontS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;178E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;179E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;85E;E;S;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;140E;K;6;normalD;K;6;CP$UIDd;3;180E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;99E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;99E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;140E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;114E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;114E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;140E;K;6;normalD;K;6;CP$UIDd;3;184E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;17;Arial, sans-serifd;2;12D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;186E;E;f;18;0.8941176470588236f;18;0.9058823529411765D;K;6;$classD;K;6;CP$UIDd;3;106E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;187E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;2;93E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;3;188E;D;K;6;CP$UIDd;2;93E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;29E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;60E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;61E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;63E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;64E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;36E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;67E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;69E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;72E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;74E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;76E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;77E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;79E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;67E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;36E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;80E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;67E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;81E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;83E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;83E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;82E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;86E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;87E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;88E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;90E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;91E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;92E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;91E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;93E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;94E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;95E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;96E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;96E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;96E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;96E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;97E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;99E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;100E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;96E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;101E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;103E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;104E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;107E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;108E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;109E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;110E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;111E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;112E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;114E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;91E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;82E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;24E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;20E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;87E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;96E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;96E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;96E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;103E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;117E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;118E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;72E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;119E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;120E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;S;19;Horizontal ScrollerS;16;Table Column (1)S;11;ApplicationS;17;Vertical ScrollerS;17;Table Header ViewS;12;File's OwnerS;16;Table Column (3)S;29;Table View (Column 1, Two, 3)S;27;Text Field Cell (Text Cell)S;12;Content ViewS;29;Text Field Cell (Text Cell)-1S;14;App ControllerS;29;Text Field Cell (Text Cell)-2S;15;Window (Window)S;33;Bordered Scroll View (Table View)S;16;Table Column (2)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;E;E;S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}d;1;8S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:d;1;4d;1;0f;18;0.9866156787762906S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}S;17;disabled+verticalS;27;_verticalScrollerDidScroll:f;18;0.9482758620689655D;K;6;$classD;K;6;CP$UIDd;3;116E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;26E;E;S;19;{{0, 0}, {516, 23}}S;6;normalS;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;85E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;139E;K;12;$atext-colorD;K;6;CP$UIDd;3;140E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;15;$acontent-insetD;K;6;CP$UIDd;3;141E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;3;116E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;27E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;142E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;145E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;E;E;S;13;AppControllerS;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;103E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;95E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;166E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;168E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;173E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;S;5;Ariald;2;11S;4;fontS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;178E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;179E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;96E;E;S;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;143E;K;6;normalD;K;6;CP$UIDd;3;180E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;89E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;143E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;119E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;119E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;143E;K;6;normalD;K;6;CP$UIDd;3;185E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;17;Arial, sans-serifd;2;12D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;187E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;2;64E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file From 004829ac9e8898a890a493ad15c6269abf94919d Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 7 Apr 2010 19:07:17 +0200 Subject: [PATCH 163/175] table header view nib2cib updates --- AppKit/CPTableHeaderView.j | 2 +- Tests/Manual/TableCibTest/Resources/MainMenu.cib | 2 +- Tools/nib2cib/NSTableColumn.j | 8 +++----- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index 926914eb4..55707aee4 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -46,7 +46,7 @@ [_textField setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable]; [_textField setLineBreakMode:CPLineBreakByTruncatingTail]; - [_textField setTextColor: [CPColor colorWithHexString: @"333333"]]; + [_textField setTextColor:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0]]; [_textField setFont:[CPFont boldSystemFontOfSize:12.0]]; [_textField setAlignment:CPLeftTextAlignment]; [_textField setVerticalAlignment:CPCenterVerticalTextAlignment]; diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableCibTest/Resources/MainMenu.cib index 89b2c2de7..dc807af86 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;29E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;60E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;61E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;63E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;64E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;36E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;65E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;67E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;69E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;72E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;74E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;76E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;77E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;78E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;79E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;67E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;36E;K;18;CPControlActionKeyD;K;6;CP$UIDd;2;80E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;2;67E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;2;81E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;82E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;83E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;83E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;82E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;86E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;87E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;88E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;90E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;91E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;92E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;91E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;93E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;94E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;95E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;96E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;96E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;96E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;96E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;97E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;99E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;100E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;96E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;101E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;103E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;104E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;105E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;107E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;108E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;109E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;110E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;111E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;31E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;112E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;114E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;31E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;115E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;91E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;82E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;24E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;20E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;87E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;96E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;96E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;96E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;103E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;117E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;118E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;72E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;119E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;120E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;S;19;Horizontal ScrollerS;16;Table Column (1)S;11;ApplicationS;17;Vertical ScrollerS;17;Table Header ViewS;12;File's OwnerS;16;Table Column (3)S;29;Table View (Column 1, Two, 3)S;27;Text Field Cell (Text Cell)S;12;Content ViewS;29;Text Field Cell (Text Cell)-1S;14;App ControllerS;29;Text Field Cell (Text Cell)-2S;15;Window (Window)S;33;Bordered Scroll View (Table View)S;16;Table Column (2)D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;32E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;E;E;S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}d;1;8S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:d;1;4d;1;0f;18;0.9866156787762906S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}S;17;disabled+verticalS;27;_verticalScrollerDidScroll:f;18;0.9482758620689655D;K;6;$classD;K;6;CP$UIDd;3;116E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;26E;E;S;19;{{0, 0}, {516, 23}}S;6;normalS;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;85E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;139E;K;12;$atext-colorD;K;6;CP$UIDd;3;140E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;15;$acontent-insetD;K;6;CP$UIDd;3;141E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;3;116E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;92E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;S;20;{{0, 0}, {516, 290}}d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;27E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;142E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;143E;D;K;6;CP$UIDd;3;144E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;102E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;145E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;36E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;62E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;E;E;S;13;AppControllerS;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;3;103E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;66E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;2;67E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;95E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;166E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;168E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;3;170E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;26E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;173E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;164E;K;6;valuesD;K;6;CP$UIDd;3;174E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;167E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;74E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;74E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;S;5;Ariald;2;11S;4;fontS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;178E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;179E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;96E;E;S;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;143E;K;6;normalD;K;6;CP$UIDd;3;180E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;89E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;143E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;183E;D;K;6;CP$UIDd;3;184E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;119E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;119E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;3;165E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;143E;K;6;normalD;K;6;CP$UIDd;3;185E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18S;17;Arial, sans-serifd;2;12D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;186E;E;D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;187E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;2;98E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;3;189E;D;K;6;CP$UIDd;2;64E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;34E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;61E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;64E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;68E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;69E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;72E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;73E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;74E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;75E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;75E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;78E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;79E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;64E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;80E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;81E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;82E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;83E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;84E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;85E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;86E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;25E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;87E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;87E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;90E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;89E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;92E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;93E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;94E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;95E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;95E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;95E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;95E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;96E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;98E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;95E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;100E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;102E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;30E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;106E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;89E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;87E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;36E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;37E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;71E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;71E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;71E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;71E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;95E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;95E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;95E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;102E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;108E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;111E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;112E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;34E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;113E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;112E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;114E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;117E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;34E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;119E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;112E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;120E;E;S;11;ApplicationS;14;App ControllerS;16;Table Column (1)S;12;File's OwnerS;16;Table Column (3)S;12;Content ViewS;16;Table Column (2)S;29;Text Field Cell (Text Cell)-2S;29;Text Field Cell (Text Cell)-1S;15;Window (Window)S;17;Table Header ViewS;29;Table View (Column 1, Two, 3)S;33;Bordered Scroll View (Table View)S;27;Text Field Cell (Text Cell)S;17;Vertical ScrollerS;19;Horizontal ScrollerD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;20E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;E;E;S;13;AppControllerS;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;91E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;69E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;139E;K;12;$atext-colorD;K;6;CP$UIDd;3;140E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;91E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;15;$acontent-insetD;K;6;CP$UIDd;3;141E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;E;E;S;6;normalS;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;143E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;91E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;15;$acontent-insetD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowD;K;6;$classD;K;6;CP$UIDd;3;107E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;154E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;155E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;156E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;148E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;30E;E;S;19;{{0, 0}, {516, 23}}D;K;6;$classD;K;6;CP$UIDd;3;107E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;152E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;90E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;153E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;148E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;32E;E;S;20;{{0, 0}, {516, 290}}d;1;4d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;23E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;147E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;101E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;150E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;3;102E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:f;18;0.9482758620689655S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;95E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;173E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;30E;E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;66E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;S;17;Arial, sans-serifd;2;12S;4;fontS;8;selectedS;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;148E;K;6;normalD;K;6;CP$UIDd;3;177E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;73E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;148E;K;6;normalD;K;6;CP$UIDd;3;178E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;80E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;80E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;148E;K;6;normalD;K;6;CP$UIDd;3;179E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;118E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;183E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tools/nib2cib/NSTableColumn.j b/Tools/nib2cib/NSTableColumn.j index a9606f081..35b94ab9a 100644 --- a/Tools/nib2cib/NSTableColumn.j +++ b/Tools/nib2cib/NSTableColumn.j @@ -49,11 +49,9 @@ var headerCell = [aCoder decodeObjectForKey:@"NSHeaderCell"], headerView = [[_CPTableColumnHeaderView alloc] initWithFrame:CPRectMakeZero()]; - - [_headerView setStringValue:[headerCell objectValue]]; - [_headerView setFont:[headerCell font]]; - - [self setHeaderView:_headerView]; + + [headerView setStringValue:[headerCell objectValue]]; + [self setHeaderView:headerView]; _width = [aCoder decodeFloatForKey:@"NSWidth"]; _minWidth = [aCoder decodeFloatForKey:@"NSMinWidth"]; From d06d69966be4fc39eb7024e6f632e23ff915dcdb Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 7 Apr 2010 19:09:15 +0200 Subject: [PATCH 164/175] used content inset in stead of frame offset to properly place the table header text --- AppKit/CPTableHeaderView.j | 5 ++++- Tests/Manual/TableCibTest/Resources/MainMenu.cib | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index 55707aee4..eeab68c1f 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -42,10 +42,13 @@ - (void)_init { - _textField = [[_CPImageAndTextView alloc] initWithFrame:CGRectMake(5, 1, CGRectGetWidth([self bounds]) - 10, CGRectGetHeight([self bounds]) - 1)]; + _textField = [[_CPImageAndTextView alloc] initWithFrame: + CGRectMake(0.0, 0.0, CGRectGetWidth([self bounds]), CGRectGetHeight([self bounds]))]; + [_textField setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable]; [_textField setLineBreakMode:CPLineBreakByTruncatingTail]; + [_textField setContentInset:CGInsetMake(0.0, 0.0, 0.0, 5.0)]; [_textField setTextColor:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0]]; [_textField setFont:[CPFont boldSystemFontOfSize:12.0]]; [_textField setAlignment:CPLeftTextAlignment]; diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableCibTest/Resources/MainMenu.cib index dc807af86..fc34bc7a7 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;34E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;61E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;64E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;68E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;69E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;70E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;71E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;72E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;73E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;74E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;75E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;75E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;78E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;79E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;64E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;80E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;81E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;82E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;83E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;84E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;85E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;86E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;25E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;87E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;87E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;31E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;90E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;89E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;92E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;93E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;94E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;95E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;95E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;95E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;95E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;96E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;98E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;95E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;3;100E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;102E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;30E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;33E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;25E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;25E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;106E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;89E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;87E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;36E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;37E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;71E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;71E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;71E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;71E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;95E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;95E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;95E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;3;102E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;108E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;111E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;112E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;34E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;113E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;112E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;114E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;117E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;34E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;119E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;91E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;112E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;120E;E;S;11;ApplicationS;14;App ControllerS;16;Table Column (1)S;12;File's OwnerS;16;Table Column (3)S;12;Content ViewS;16;Table Column (2)S;29;Text Field Cell (Text Cell)-2S;29;Text Field Cell (Text Cell)-1S;15;Window (Window)S;17;Table Header ViewS;29;Table View (Column 1, Two, 3)S;33;Bordered Scroll View (Table View)S;27;Text Field Cell (Text Cell)S;17;Vertical ScrollerS;19;Horizontal ScrollerD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;20E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;28E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;32E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;28E;E;E;S;13;AppControllerS;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;91E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;138E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;69E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;139E;K;12;$atext-colorD;K;6;CP$UIDd;3;140E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;91E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;15;$acontent-insetD;K;6;CP$UIDd;3;141E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;E;E;S;6;normalS;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;142E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;143E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;91E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;15;$acontent-insetD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowD;K;6;$classD;K;6;CP$UIDd;3;107E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;154E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;155E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;156E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;148E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;30E;E;S;19;{{0, 0}, {516, 23}}D;K;6;$classD;K;6;CP$UIDd;3;107E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;152E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;90E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;153E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;148E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;32E;E;S;20;{{0, 0}, {516, 290}}d;1;4d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;23E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;147E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;148E;D;K;6;CP$UIDd;3;149E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;101E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;150E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;110E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;3;102E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:f;18;0.9482758620689655S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;95E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;169E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;170E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;171E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;173E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;30E;E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;66E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;S;17;Arial, sans-serifd;2;12S;4;fontS;8;selectedS;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;148E;K;6;normalD;K;6;CP$UIDd;3;177E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;73E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;73E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;148E;K;6;normalD;K;6;CP$UIDd;3;178E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;80E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;80E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;148E;K;6;normalD;K;6;CP$UIDd;3;179E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;181E;D;K;6;CP$UIDd;3;182E;D;K;6;CP$UIDd;3;118E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;183E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;97E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;20E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;24E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;60E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;61E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;63E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;65E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;67E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;68E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;71E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;72E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;72E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;73E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;74E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;75E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;76E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;77E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;77E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;77E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;77E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;78E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;80E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;81E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;77E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;82E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;84E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;31E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;86E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;87E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;88E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;90E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;91E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;92E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;93E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;94E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;95E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;22E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;96E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;100E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;33E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;73E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;100E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;102E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;103E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;104E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;24E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;105E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;71E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;103E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;29E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;37E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;87E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;77E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;77E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;77E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;110E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;111E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;63E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;112E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;113E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;114E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;117E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;33E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;119E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;73E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;100E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;120E;E;S;16;Table Column (1)S;12;Content ViewS;29;Table View (Column 1, Two, 3)S;29;Text Field Cell (Text Cell)-2S;16;Table Column (3)S;15;Window (Window)S;27;Text Field Cell (Text Cell)S;17;Vertical ScrollerS;17;Table Header ViewS;33;Bordered Scroll View (Table View)S;16;Table Column (2)S;29;Text Field Cell (Text Cell)-1S;12;File's OwnerS;11;ApplicationS;14;App ControllerS;19;Horizontal ScrollerD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;36E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;27E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;24E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;E;E;S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;E;E;S;6;normalD;K;6;$classD;K;6;CP$UIDd;3;109E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;72E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;24E;E;S;20;{{0, 0}, {516, 290}}d;1;4d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;25E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;138E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;141E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;142E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;S;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;85E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;15;$acontent-insetD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:f;18;0.9482758620689655D;K;6;$classD;K;6;CP$UIDd;3;109E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;31E;E;S;19;{{0, 0}, {516, 23}}S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;2;84E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;13;AppControllerS;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;77E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;169E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;65E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;S;17;Arial, sans-serifd;2;12S;4;fontS;8;selectedS;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;177E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;89E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;182E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;183E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file From 6bd8e96ac0ee214d95e669356d921153bb849945 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 8 Apr 2010 14:44:40 +0200 Subject: [PATCH 165/175] fixed a bug where the table header would attempt to set content inset on a _CPImageAndTextView --- AppKit/CPTableHeaderView.j | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AppKit/CPTableHeaderView.j b/AppKit/CPTableHeaderView.j index eeab68c1f..76f71f426 100644 --- a/AppKit/CPTableHeaderView.j +++ b/AppKit/CPTableHeaderView.j @@ -43,12 +43,11 @@ - (void)_init { _textField = [[_CPImageAndTextView alloc] initWithFrame: - CGRectMake(0.0, 0.0, CGRectGetWidth([self bounds]), CGRectGetHeight([self bounds]))]; + CGRectMake(5.0, 0.0, CGRectGetWidth([self bounds]) - 10.0, CGRectGetHeight([self bounds]))]; [_textField setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable]; [_textField setLineBreakMode:CPLineBreakByTruncatingTail]; - [_textField setContentInset:CGInsetMake(0.0, 0.0, 0.0, 5.0)]; [_textField setTextColor:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0]]; [_textField setFont:[CPFont boldSystemFontOfSize:12.0]]; [_textField setAlignment:CPLeftTextAlignment]; From ca7af88c59018771e87b8eed376c651d8fb2ba84 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 20 May 2010 18:34:48 +0200 Subject: [PATCH 166/175] - updated tablecolumn nib2cib to support new row selection theme state - nib2cibed the MainMenu.xib in the tablecib example to update it's cib to the changes --- AppKit/CPTableColumn.j | 4 ++-- Tests/Manual/TableCibTest/Resources/MainMenu.cib | 2 +- Tools/nib2cib/NSTableColumn.j | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 6c65113b5..291b1bf75 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -83,9 +83,9 @@ CPTableColumnUserResizingMask = 1 << 1; [textDataView setValue:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0] forThemeAttribute:"text-color"]; - [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelectedDataView]; [textDataView setLineBreakMode:CPLineBreakByTruncatingTail]; - [textDataView setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [textDataView setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateSelectedDataView]; [textDataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; [textDataView setValue:CGInsetMake(0.0, 0.0, 0.0, 5.0) forThemeAttribute:@"content-inset"]; diff --git a/Tests/Manual/TableCibTest/Resources/MainMenu.cib b/Tests/Manual/TableCibTest/Resources/MainMenu.cib index fc34bc7a7..b13ff6731 100644 --- a/Tests/Manual/TableCibTest/Resources/MainMenu.cib +++ b/Tests/Manual/TableCibTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;20E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;24E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;60E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;61E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;63E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;65E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;67E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;68E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;68E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;69E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;23E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;71E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;72E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;72E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;71E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;73E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;74E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;75E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;76E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;77E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;77E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;77E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;77E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;78E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;80E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;81E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;77E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;82E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;84E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;31E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;85E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;86E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;87E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;88E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;90E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;91E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;92E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;93E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;94E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;95E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;22E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;96E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;99E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;100E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;33E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;73E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;100E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;102E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;103E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;104E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;24E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;22E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;105E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;22E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;71E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;103E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;29E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;37E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;87E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;87E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;77E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;77E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;77E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;110E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;111E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;63E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;112E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;113E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;114E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;117E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;33E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;119E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;73E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;100E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;120E;E;S;16;Table Column (1)S;12;Content ViewS;29;Table View (Column 1, Two, 3)S;29;Text Field Cell (Text Cell)-2S;16;Table Column (3)S;15;Window (Window)S;27;Text Field Cell (Text Cell)S;17;Vertical ScrollerS;17;Table Header ViewS;33;Bordered Scroll View (Table View)S;16;Table Column (2)S;29;Text Field Cell (Text Cell)-1S;12;File's OwnerS;11;ApplicationS;14;App ControllerS;19;Horizontal ScrollerD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;121E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;36E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;27E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;24E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;36E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;27E;E;E;S;1;1d;3;101d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;126E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;15;$acontent-insetD;K;6;CP$UIDd;3;135E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;E;E;S;6;normalD;K;6;$classD;K;6;CP$UIDd;3;109E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;147E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;72E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;148E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;24E;E;S;20;{{0, 0}, {516, 290}}d;1;4d;2;23S;6;{0, 0}F;T;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;25E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;138E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;140E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;83E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;141E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;142E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;S;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;143E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;85E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;144E;K;12;$atext-colorD;K;6;CP$UIDd;3;145E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;15;$acontent-insetD;K;6;CP$UIDd;3;146E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}d;1;8S;17;disabled+verticald;1;0S;27;_verticalScrollerDidScroll:f;18;0.9482758620689655D;K;6;$classD;K;6;CP$UIDd;3;109E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;33E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;151E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;33E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;31E;E;S;19;{{0, 0}, {516, 23}}S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;2;84E;E;E;d;2;36D;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;64E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;124E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;73E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;100E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;137E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;136E;E;S;13;AppControllerS;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:f;18;0.9866156787762906S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;S;8;Column 1D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;77E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;d;1;2D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;167E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;168E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;169E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;24E;E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;3;134E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;65E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;S;17;Arial, sans-serifd;2;12S;4;fontS;8;selectedS;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;177E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;89E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;112E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;112E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;8;selectedD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;182E;E;E;S;19;{{5, 1}, {-10, -1}}S;19;{{0, 0}, {-10, -1}}d;2;18D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;183E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;118E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;4E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;7E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;9E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;2;10E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;2;11E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;2;12E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;2;13E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;2;14E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;16E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;18E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;E;E;S;16;IBCocoaFrameworkD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;23E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;59E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;60E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;2;61E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;2;62E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;2;63E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;2;64E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;2;66E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;2;68E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;69E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;70E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;71E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;72E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;2;76E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;2;77E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;34E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;31E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;2;63E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;2;63E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;2;63E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;2;63E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;2;78E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;2;78E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;2;78E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;2;80E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;81E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;82E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;83E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;84E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;85E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;27E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;86E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;86E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;87E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;76E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;88E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;76E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;2;90E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;2;91E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;2;92E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;2;78E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;2;78E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;2;78E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;2;78E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;2;93E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;2;95E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;2;96E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;2;78E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;2;97E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;2;80E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;37E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;98E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;99E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;101E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;23E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;103E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;104E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;106E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;107E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;108E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;109E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;110E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;111E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;69E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;15E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;58E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;112E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;113E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;104E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;23E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;115E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;89E;K;21;CPScrollerControlSizeD;K;6;CP$UIDd;3;104E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;116E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;117E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;118E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;108E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;109E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;119E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;120E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;2;69E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;1;0E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;77E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;121E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;77E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;29E;E;S;14;App ControllerS;12;File's OwnerS;16;Table Column (3)S;33;Bordered Scroll View (Table View)S;15;Window (Window)S;12;Content ViewS;29;Table View (Column 1, Two, 3)S;19;Horizontal ScrollerS;29;Text Field Cell (Text Cell)-2S;29;Text Field Cell (Text Cell)-1S;16;Table Column (1)S;27;Text Field Cell (Text Cell)S;11;ApplicationS;17;Vertical ScrollerS;16;Table Column (2)S;17;Table Header ViewD;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;16E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;19E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;122E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;19E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;25E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;123E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;19E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;124E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;E;E;S;13;AppControllerS;1;3d;3;188d;2;10d;22;3.4028234663852886e+38D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;126E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;2;61E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;12;$atext-colorD;K;6;CP$UIDd;3;132E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;69E;K;11;$aalignmentD;K;6;CP$UIDd;3;104E;K;15;$acontent-insetD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;d;1;2S;22;{{20, 20}, {518, 308}}S;20;{{0, 0}, {518, 308}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;80E;E;E;d;2;36S;6;normalD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;137E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;88E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;138E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;29E;E;D;K;6;$classD;K;6;CP$UIDd;2;75E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;142E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;139E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;37E;E;T;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;79E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;23E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;143E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;144E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;23E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;100E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;E;S;28;{1.79769e+308, 1.79769e+308}S;8;CPWindowS;24;{{335, 128}, {558, 348}}d;1;7S;6;WindowS;20;{{0, 0}, {558, 348}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;S;20;{{0, 0}, {516, 290}}d;1;4d;2;23S;6;{0, 0}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;21E;E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;145E;E;d;1;3D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;139E;D;K;6;CP$UIDd;3;146E;E;E;S;19;{{1, 1}, {516, 15}}S;19;{{0, 0}, {516, 15}}d;1;8S;8;disabledd;1;1S;29;_horizontalScrollerDidScroll:d;1;0f;18;0.9866156787762906S;1;1d;3;101d;2;40d;4;1000D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;147E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;148E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;149E;K;12;$atext-colorD;K;6;CP$UIDd;3;150E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;69E;K;11;$aalignmentD;K;6;CP$UIDd;3;104E;K;15;$acontent-insetD;K;6;CP$UIDd;3;151E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;S;22;{{502, 16}, {15, 275}}S;19;{{0, 0}, {15, 275}}S;17;disabled+verticalS;27;_verticalScrollerDidScroll:f;18;0.9482758620689655S;1;2d;3;154D;K;6;$classD;K;6;CP$UIDd;2;65E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;152E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;153E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;125E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;129E;K;6;$afontD;K;6;CP$UIDd;3;154E;K;12;$atext-colorD;K;6;CP$UIDd;3;155E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;20;$avertical-alignmentD;K;6;CP$UIDd;2;69E;K;11;$aalignmentD;K;6;CP$UIDd;3;104E;K;15;$acontent-insetD;K;6;CP$UIDd;3;156E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;1;0E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;1;0E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;135E;E;S;19;{{0, 0}, {516, 23}}S;8;delegateS;9;theWindowS;10;dataSourceS;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;158E;E;E;D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;127E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;159E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;160E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;78E;E;S;11;placeholderD;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;165E;E;D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;S;0;d;4;3072S;20;{{1, 1}, {516, 290}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;29E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;167E;E;S;21;{{1, 291}, {516, 17}}S;19;{{0, 0}, {516, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;E;E;S;22;{{502, 285}, {16, 23}}S;18;{{0, 0}, {16, 23}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;102E;E;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;170E;E;E;S;8;Column 1D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;172E;E;E;S;3;TwoD;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;161E;K;5;stateD;K;6;CP$UIDd;3;162E;K;5;valueD;K;6;CP$UIDd;3;128E;E;D;K;6;$classD;K;6;CP$UIDd;3;130E;K;4;nameD;K;6;CP$UIDd;3;163E;K;6;valuesD;K;6;CP$UIDd;3;173E;E;D;K;6;$classD;K;6;CP$UIDd;3;133E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;66E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;66E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;E;S;17;Arial, sans-serifd;2;12S;4;fontS;16;selectedDataViewS;10;text-colorD;K;10;$classnameS;19;CPMutableDictionaryK;8;$classesA;S;19;CPMutableDictionaryS;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;16;selectedDataViewD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;177E;E;E;S;39;{"top":0,"right":0,"bottom":0,"left":5}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;E;E;f;18;0.8980392156862745D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;178E;D;K;6;CP$UIDd;3;179E;D;K;6;CP$UIDd;3;180E;D;K;6;CP$UIDd;3;102E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;110E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;110E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;16;selectedDataViewD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;181E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;157E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;119E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;174E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;175E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;119E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;176E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;3;164E;K;10;CP.objectsD;K;16;selectedDataViewD;K;6;CP$UIDd;3;139E;K;6;normalD;K;6;CP$UIDd;3;182E;E;E;S;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}d;2;18D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;183E;E;f;18;0.9607843137254902f;18;0.9764705882352941f;18;0.9882352941176471D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;184E;E;D;K;6;$classD;K;6;CP$UIDd;2;94E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;185E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;102E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;102E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;186E;D;K;6;CP$UIDd;3;102E;E;E;f;3;0.2E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tools/nib2cib/NSTableColumn.j b/Tools/nib2cib/NSTableColumn.j index 35b94ab9a..8af344031 100644 --- a/Tools/nib2cib/NSTableColumn.j +++ b/Tools/nib2cib/NSTableColumn.j @@ -41,9 +41,9 @@ [_dataView setValue:[CPColor colorWithRed:51.0 / 255.0 green:51.0 / 255.0 blue:51.0 / 255.0 alpha:1.0] forThemeAttribute:"text-color"]; - [_dataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; + [_dataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelectedDataView]; [_dataView setLineBreakMode:CPLineBreakByTruncatingTail]; - [_dataView setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateSelected]; + [_dataView setValue:[CPFont boldSystemFontOfSize:12.0] forThemeAttribute:@"font" inState:CPThemeStateSelectedDataView]; [_dataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; [_dataView setValue:CGInsetMake(0.0, 0.0, 0.0, 5.0) forThemeAttribute:@"content-inset"]; From b32d503d654c02c8c6efc70f3f839543fd71686e Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Wed, 19 May 2010 18:51:18 +0200 Subject: [PATCH 167/175] implemented CPTableColumn isHidden nib2cib support --- AppKit/CPTableColumn.j | 1 + 1 file changed, 1 insertion(+) diff --git a/AppKit/CPTableColumn.j b/AppKit/CPTableColumn.j index 291b1bf75..903f448e6 100644 --- a/AppKit/CPTableColumn.j +++ b/AppKit/CPTableColumn.j @@ -403,6 +403,7 @@ var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey", CPTableColumnResizingMaskKey = @"CPTableColumnResizingMaskKey", CPTableColumnIsHiddenkey = @"CPTableColumnIsHiddenKey", CPSortDescriptorPrototypeKey = @"CPSortDescriptorPrototypeKey"; + CPTableColumnIsHiddenkey = @"CPTableColumnIsHiddenKey"; @implementation CPTableColumn (CPCoding) From eae32703852fa2252b33797897e749840f29f06b Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Tue, 25 May 2010 14:09:10 -0700 Subject: [PATCH 168/175] Add bcomm hook to LoadTimeTest --- Tests/Manual/LoadTimeTest/AppController.j | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Tests/Manual/LoadTimeTest/AppController.j b/Tests/Manual/LoadTimeTest/AppController.j index 1638643a2..bdb9a6c30 100644 --- a/Tests/Manual/LoadTimeTest/AppController.j +++ b/Tests/Manual/LoadTimeTest/AppController.j @@ -48,7 +48,16 @@ loadStdev = Math.sqrt(loadStdev / data.length); launchStdev = Math.sqrt(launchStdev / data.length); - + + if (window.parent.BCOMM) { + window.parent.BCOMM.finishTest({ + loadAvg : loadAvg, + launchAvg : launchAvg, + loadStdev : loadStdev, + launchStdev : launchStdev + }); + } + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], contentView = [theWindow contentView]; From 5a77c1979117f10483b81c656b53882bdf988359 Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Tue, 25 May 2010 16:24:29 -0700 Subject: [PATCH 169/175] Silence tools output during tests (press, flatten, capp gen) --- Tests/Tools/ToolsTest.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Tools/ToolsTest.j b/Tests/Tools/ToolsTest.j index 6705affee..b44cd234b 100644 --- a/Tests/Tools/ToolsTest.j +++ b/Tests/Tools/ToolsTest.j @@ -21,13 +21,13 @@ function cleanup() { { var status; - status = OS.system(["capp", "gen", "ToolsTestApp"]); + status = OS.system(["capp", "gen", "ToolsTestApp"].map(OS.enquote).join(" ") + " > /dev/null"); [self assert:status equals:0 message:"capp gen failed"]; - status = OS.system(["press", "-f", "ToolsTestApp", "PressTestApp"]); + status = OS.system(["press", "-f", "ToolsTestApp", "PressTestApp"].map(OS.enquote).join(" ") + " > /dev/null"); [self assert:status equals:0 message:"press failed"]; - status = OS.system(["flatten", "-f", "ToolsTestApp", "FlattenTestApp"]); + status = OS.system(["flatten", "-f", "ToolsTestApp", "FlattenTestApp"].map(OS.enquote).join(" ") + " > /dev/null"); [self assert:status equals:0 message:"flatten failed"]; } From 2a36488db7d09923a1c4dcc0f6d288e7e14faaf2 Mon Sep 17 00:00:00 2001 From: Thomas Ingham Date: Tue, 25 May 2010 23:29:43 -0400 Subject: [PATCH 170/175] Added new artwork and theme style for the button. Matching fonts to segctl. --- .../Resources/HUD/button-bezel-center.png | Bin 141 -> 170 bytes .../HUD/button-bezel-disabled-center.png | Bin 0 -> 170 bytes .../HUD/button-bezel-disabled-left.png | Bin 0 -> 254 bytes .../HUD/button-bezel-disabled-right.png | Bin 0 -> 257 bytes .../HUD/button-bezel-highlighted-center.png | Bin 151 -> 173 bytes .../HUD/button-bezel-highlighted-left.png | Bin 588 -> 256 bytes .../HUD/button-bezel-highlighted-right.png | Bin 566 -> 261 bytes .../Resources/HUD/button-bezel-left.png | Bin 600 -> 259 bytes .../Resources/HUD/button-bezel-right.png | Bin 572 -> 260 bytes .../HUD/default-button-bezel-center.png | Bin 0 -> 185 bytes .../default-button-bezel-disabled-center.png | Bin 0 -> 182 bytes .../default-button-bezel-disabled-left.png | Bin 0 -> 261 bytes .../default-button-bezel-disabled-right.png | Bin 0 -> 271 bytes ...efault-button-bezel-highlighted-center.png | Bin 0 -> 157 bytes .../default-button-bezel-highlighted-left.png | Bin 0 -> 248 bytes ...default-button-bezel-highlighted-right.png | Bin 0 -> 242 bytes .../HUD/default-button-bezel-left.png | Bin 0 -> 282 bytes .../HUD/default-button-bezel-right.png | Bin 0 -> 278 bytes AppKit/Themes/Aristo/ThemeDescriptors.j | 93 +++++++++++++++--- 19 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-center.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-right.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-left.png create mode 100644 AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-right.png diff --git a/AppKit/Themes/Aristo/Resources/HUD/button-bezel-center.png b/AppKit/Themes/Aristo/Resources/HUD/button-bezel-center.png index 6b3e348c109e897f721c798056e62367d34dd77f..cc9401c7359a8308dbfa20cc26c5e9b397215ad2 100644 GIT binary patch delta 155 zcmeBWT*Wv+yk3HXje&u|`pooOK#H@#BeIx*fm;}a85w5HkpK!RBzpw;GB9K(F));v zF))02#lX;H4&-|?Fg#XeU@$adU=UvOO|DuWsMf&K#WAGfR+53S@$d6rUSHQ|Q)2^y zW&i*GR~Ei;FVdQ&MBb@03&HF AApigX delta 125 zcmZ3**vmLUyiA0Hje&u|hcA2~kdiEMjVKAuPb(=;EJ|f?Ovz75Rq)JBOiv9;O-!jQ zJeg_(RHX0e;uyjao&1BJg~vhQ#Fq5)a&>G9=leKM{N+{uw_wu-!FoZR35+}nVn+hf b1UMOfI!dwseCF~UsFlIf)z4*}Q$iB}PGBfa diff --git a/AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-center.png b/AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-center.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4ce2152560ba6a15b8f899d68b5aa9efd824bb GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|m>CEz|NsAgB4yPBJ?&Vo&XYa7;&6|d!LQtNljNb*bwKwpc)I$ztaD0e0svM|SiJxM literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-right.png b/AppKit/Themes/Aristo/Resources/HUD/button-bezel-disabled-right.png new file mode 100644 index 0000000000000000000000000000000000000000..6f14f35d8afb7ef9648ef4887b4e4dfc4c9f816e GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|Vdzu&V_PQatXDOJovCMI&6Us^z?t=2^?&=wy|*FQsnPy4UC4{gY^W zckW@tA2@lYFZZ@wkk@UmOMC(bOixW2v;`B49#}5<40IBMr>mdKI;Vst04Nw) A;s5{u literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/button-bezel-highlighted-center.png b/AppKit/Themes/Aristo/Resources/HUD/button-bezel-highlighted-center.png index 0f35e8c4b0a81e3e34eb23cd0f692519f9eca7c8..be25a32af4d65578f2c8f661829519652488ef79 100644 GIT binary patch delta 158 zcmbQvxR!B(c)bJ%8v_G_^_l6nfD~teM`SSr1Gg{;GcwGYBLNgtNcITwWnjooVqhpS zV_^95ih-fY9LV=(V0f&`z+h;^z#zQln_RU%P_412i(^Q|t)zh9;NR!J{QjQLrsn46 z#-_%`#-_pTxS%sJxGA1JrswC;Zt)(T|Ns9_7iZ#O(2U^fJ-SqHF;G8)r>mdKI;Vst E0CmbOssI20 delta 136 zcmZ3>IGu5Vc)bV*8v_G_4`28~ASGGi8c`CQpH@vJEDS2yRKg}<7bF>ldGOSCvG9oMGT&vYYu$Oo#A}kbI!d}Q&Tg1 diff --git a/AppKit/Themes/Aristo/Resources/HUD/button-bezel-highlighted-right.png b/AppKit/Themes/Aristo/Resources/HUD/button-bezel-highlighted-right.png index 809339ae4912c4d3751e73c64d43ce2db2ca7c64..cd709f3192791fd223ad6a42fa54f17d4c9f63b8 100644 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|m)hfzOa^OBp)6%6N}vD$d8OIX^zVS~?p0paczNom%NLKm<9J^ug0(kVg* z4Ei3geE)mzxzA@d>8ze|DJ;}nOUWkV&fbgZT^tN=mVR6qaPP*9S_4*@jC)oM48TLhvZTC~pvf)9j3p|sIx zd_goui*~p`Zrft9cm`iuB&09-#-5xDv)MeJ z$zPSiA0`|^eL9* ztrPg&53=JCf+aBDN_wQ#*Z literal 600 zcmV-e0;m0nP)tvt5>h;{`m3Z_{WbQj~_dBtf#ZHGnb2tD*z}5!hukXF#Yb`yB^=a zf4{P5(V~1WFE9W0_V$P+OP0j!*|R5c@7}!$Fbuch=+UD_Kn+(@Qc{9u&YT%}TOzynXxD<>$|z4nSAg!7xk{H_-j37B60$H-G+ozuUKOy8@kP4OC!>4TGI^=FFM! zckkYv^Y-?(yK&=&!|&g}O@WdoxG>n3=g*(70(yGFlqpjzflf36N*Lh7AWh;xg-`11 z>qCJWK_+Pv!XQnGfB*jdt*)+a^5n@AU7(;kAq>)_2K2+%h=>Stpubdrg35$2NR#U4 z&z~OwgV`UL3S@zT@`Nx*lL9bOw_Lh(scqlBed0htX+jtr5KEUXE&TA|!VgoAR0Ag++=0(Qv1PjC<6LhPpsv?1*dH&nCZ--vLeq9I* zQBYcA0%ao@M#&mbjaoqLux#0~GGJtH0BXMW9}Qq+La0;aK!F3q_CV|j#C}K_Fc4i6 mvaKM^px{*iVo=i2fMEdm898>)oF9Jx0000gTe~DWM4f D!f08( literal 572 zcmV-C0>k}@P)TsD{``6A%a<>UUcY|r z%fP_E%zy&~B4NL-uCCnU$B*}X{P^+s_wV12U%Pfq7bwn%qGQjVJqdgF?ge8YJ8{X9 zB{A*o?GfJI-u{agEz1A#4$VW0ulckbMAoj-rR-{QrK^ML+51ys%r(`14R|Ni~k^u~=F z4qjefc0d=LJ9FktIM|s$NdtTs7#K!VrcAK}2F`?M&z`LU+Xj@-CWL_+Od1**LV*T6 z0csKlX;LSIA3uJqtFEqY^6%fj-#|@@AWh1IFfb5QbaZs||Ni|8(xe8`Bu@wfBU*OS zq)8sYpnnF_BuxnK+qX~r^5x5|z)0Q#bDlUM91;>D{{H>@Gs~7OD})7v2tEunT?m*O z!h!L05vais7UTlBFwk_~<;#~Vef|3NMrCDXG*E*qEOL3#FgFl$OrAWM?f(7y?!dUY z0!l_e#ai%Wga(*izI324#W!JV1+2gn%x1jHZUVs;vZB10000< KMNUMnLSTYjX#|D< diff --git a/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-center.png b/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-center.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5b3a93be301301e607f293a680e875df0f5df8 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|XB~)z4*}Q$iB}Bq}rU literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-center.png b/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-center.png new file mode 100644 index 0000000000000000000000000000000000000000..8289aed507394b9b1e004d760f64ad9efffcc098 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|!lO literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-left.png b/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-disabled-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e2c0ac5361485f53c9b1cdbf1c4f8fe810cb15 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|- zYjO}^UEMDCv7Avk!H843f5D83|ElE^S&i=I^>D{Xl>XFOc}iHJ^zPFTb6?qH9n+Q# zx5KY8c09INlqM$Fd6S2Mb;I)t#`(;}^Bc{NKJWT@|Kj-v%a{LiHCge>vUSyuE7Cu?PO(KQMJX7&)w6G& z_v!vc&J&jXN}ohRUC&wCzN;-c_m!bQXyW4U`*;=C@SHSdV3J^5a-BgwIN9p&3(Xlo P2QqlN`njxgN@xNAn#Wwi literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-center.png b/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-center.png new file mode 100644 index 0000000000000000000000000000000000000000..79e37a1a4e450f5f70aa36fe64791e4407800f32 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c71?{bIEGZ*O6fVs$)Lc)Jh|tg&Z5TlJJXCm* zyz2~4mjlb9N#|7bHD7iHxvG2=f8P3&S7%4{Z6+QD7k!R1?muLo1C3(vboFyt=akR{ E0L^|6H_V+Po~-c70vQ=aSW-rwPeCxE+<1Cx5-;9M6~Y2u|9Wll#OLozkk48 za8B(pyB@y3yF2wRIqFMzENItfmttx7T(*7xu0k83iC1m-nv0iTn|0E%dEHj2wl+ou zrHl!a*!R3FCnacxDLb1JNMKvyz&y85}Sb4q9e0J+CqP5=M^ literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-right.png b/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-highlighted-right.png new file mode 100644 index 0000000000000000000000000000000000000000..da0cb9a8ad2295c8793c217f654f79d97b3ddae8 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6;1JUaSW-rm9%B!=KufS-`{`!{k?s*RgZsdjaz14|Igsh z|NryD13XUjb#|WYVD&I)U{F?877tJr=T>GG`SYKDS%kzwtptX3ta=Pryd7ADcX1tR z6H;_&S@=RrLepI2S#&}`U2rKGQ4FRXHtVTxvOXejT#l9!Vd plnst7ZD{)6@IzXlo{htR;ii*8UcfQd2SE2Rc)I$ztaD0e0sx{1S{eWV literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-left.png b/AppKit/Themes/Aristo/Resources/HUD/default-button-bezel-left.png new file mode 100644 index 0000000000000000000000000000000000000000..dd02f1725b7e861675d7a7d1b16703075d61755d GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&5!3HGnK8=|Nq&N#aB8wRqxP?KOkzv*x380`t zvPY0F14DKa14D@!1H+eB3=B=?K)yEv!(&wj216qT2H`c|yax`9GSk)8H+@|^2HtCek;0WPfP3BvZjrJVH|(##e^=HBrTJac*biS znZGUO+E=~#PknnnKH9yGx#8s^4XO8ky?R(YES?(~pKeiMSWv!D((bF(<7@ZIo!(?)$xtom85%m*nS Date: Wed, 26 May 2010 13:17:52 +0300 Subject: [PATCH 171/175] CPCoder typo fixes --- Foundation/CPCoder.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Foundation/CPCoder.j b/Foundation/CPCoder.j index a9cd1bf97..b57cd61f9 100644 --- a/Foundation/CPCoder.j +++ b/Foundation/CPCoder.j @@ -130,7 +130,7 @@ */ -(void)encodeBycopyObject:(id)anObject { - [self encodeObject:object]; + [self encodeObject:anObject]; } /*! @@ -139,7 +139,7 @@ */ -(void)encodeConditionalObject:(id)anObject { - [self encodeObject:object]; + [self encodeObject:anObject]; } @end From 0d848e3d93a7010b462c7f50df1b8b15f80bf1cf Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Wed, 26 May 2010 11:32:35 +0300 Subject: [PATCH 172/175] Add test on self in init of CPAttributedString --- Foundation/CPAttributedString.j | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Foundation/CPAttributedString.j b/Foundation/CPAttributedString.j index 82e7f93a7..2449489c8 100644 --- a/Foundation/CPAttributedString.j +++ b/Foundation/CPAttributedString.j @@ -84,11 +84,14 @@ { self = [super init]; - if (!attributes) - attributes = [CPDictionary dictionary]; + if (self) + { + if (!attributes) + attributes = [CPDictionary dictionary]; - _string = ""+aString; - _rangeEntries = [makeRangeEntry(CPMakeRange(0, _string.length), attributes)]; + _string = ""+aString; + _rangeEntries = [makeRangeEntry(CPMakeRange(0, _string.length), attributes)]; + } return self; } From b6a3d2b283a4b0a15e019d13eb02e05468db0346 Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Wed, 26 May 2010 15:41:25 +0300 Subject: [PATCH 173/175] Remove import of deprecated CPLog.j Remove deprecated CPLog.j --- Foundation/CPObjJRuntime.j | 2 -- Foundation/Foundation.j | 1 - 2 files changed, 3 deletions(-) diff --git a/Foundation/CPObjJRuntime.j b/Foundation/CPObjJRuntime.j index 76cfb8f76..3c49daebd 100644 --- a/Foundation/CPObjJRuntime.j +++ b/Foundation/CPObjJRuntime.j @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPLog.j" - function CPStringFromSelector(aSelector) { diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index 2d4fb3ebb..03709afa5 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -35,7 +35,6 @@ @import "CPKeyedUnarchiver.j" @import "CPKeyValueCoding.j" @import "CPKeyValueObserving.j" -@import "CPLog.j" @import "CPNotification.j" @import "CPNotificationCenter.j" @import "CPNull.j" From b98f0b14272aa6c3f4ab09a6a6b87aae4868acc9 Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Wed, 26 May 2010 15:18:31 +0300 Subject: [PATCH 174/175] Apply style rules to Foundation --- Foundation/CPArray+KVO.j | 112 +++++++++++----------- Foundation/CPArray.j | 10 +- Foundation/CPAttributedString.j | 133 +++++++++++++------------- Foundation/CPBundle.j | 3 +- Foundation/CPCoder.j | 25 +++-- Foundation/CPCountedSet.j | 25 ++--- Foundation/CPData.j | 1 + Foundation/CPDate.j | 10 +- Foundation/CPDictionary.j | 100 +++++++++---------- Foundation/CPEnumerator.j | 7 +- Foundation/CPException.j | 10 +- Foundation/CPFunctionOperation.j | 28 +++--- Foundation/CPIndexSet.j | 13 +-- Foundation/CPInvocation.j | 12 +-- Foundation/CPInvocationOperation.j | 38 ++++---- Foundation/CPJSONPConnection.j | 36 +++---- Foundation/CPKeyValueCoding.j | 97 +++++++++---------- Foundation/CPKeyValueObserving.j | 108 +++++++++++---------- Foundation/CPKeyedArchiver.j | 140 +++++++++++++-------------- Foundation/CPKeyedUnarchiver.j | 6 +- Foundation/CPNotification.j | 6 +- Foundation/CPNotificationCenter.j | 70 +++++++------- Foundation/CPNumber.j | 18 ++-- Foundation/CPObjJRuntime.j | 2 +- Foundation/CPObject.j | 36 +++---- Foundation/CPOperation.j | 65 +++++++------ Foundation/CPOperationQueue.j | 148 +++++++++++++++-------------- Foundation/CPProxy.j | 2 +- Foundation/CPRange.j | 7 +- Foundation/CPRunLoop.j | 92 +++++++++--------- Foundation/CPSet.j | 59 ++++++++---- Foundation/CPSortDescriptor.j | 17 ++-- Foundation/CPString.j | 59 ++++++------ Foundation/CPTimer.j | 63 ++++++------ Foundation/CPURL.j | 25 ++++- Foundation/CPURLConnection.j | 38 ++++---- Foundation/CPURLRequest.j | 10 +- Foundation/CPURLResponse.j | 16 ++-- Foundation/CPUndoManager.j | 100 +++++++++---------- Foundation/CPUserSessionManager.j | 18 ++-- Foundation/CPValue.j | 10 +- Foundation/CPWebDAVManager.j | 21 ++++ 42 files changed, 941 insertions(+), 855 deletions(-) diff --git a/Foundation/CPArray+KVO.j b/Foundation/CPArray+KVO.j index e39536709..03274b748 100644 --- a/Foundation/CPArray+KVO.j +++ b/Foundation/CPArray+KVO.j @@ -23,6 +23,7 @@ @import "CPArray.j" @import "CPNull.j" + @implementation CPObject (CPArrayKVO) - (id)mutableArrayValueForKey:(id)aKey @@ -33,12 +34,12 @@ - (id)mutableArrayValueForKeyPath:(id)aKeyPath { var dotIndex = aKeyPath.indexOf("."); - + if (dotIndex < 0) return [self mutableArrayValueForKey:aKeyPath]; var firstPart = aKeyPath.substring(0, dotIndex), - lastPart = aKeyPath.substring(dotIndex+1); + lastPart = aKeyPath.substring(dotIndex + 1); return [[self valueForKeyPath:firstPart] valueForKeyPath:lastPart]; } @@ -49,34 +50,34 @@ { id _proxyObject; id _key; - + SEL _insertSEL; Function _insert; - + SEL _removeSEL; Function _remove; - + SEL _replaceSEL; Function _replace; - + SEL _insertManySEL; Function _insertMany; - + SEL _removeManySEL; Function _removeMany; - + SEL _replaceManySEL; Function _replaceMany; - + SEL _objectAtIndexSEL; Function _objectAtIndex; - + SEL _countSEL; Function _count; - + SEL _accessSEL; Function _access; - + SEL _setSEL; Function _set; } @@ -96,15 +97,15 @@ return array; } --(id)initWithKey:(id)aKey forProxyObject:(id)anObject +- (id)initWithKey:(id)aKey forProxyObject:(id)anObject { self = [super init]; _key = aKey; _proxyObject = anObject; - + var capitalizedKey = _key.charAt(0).toUpperCase() + _key.substring(1); - + _insertSEL = sel_getName(@"insertObject:in"+capitalizedKey+"AtIndex:"); if ([_proxyObject respondsToSelector:_insertSEL]) _insert = [_proxyObject methodForSelector:_insertSEL]; @@ -112,7 +113,7 @@ _removeSEL = sel_getName(@"removeObjectFrom"+capitalizedKey+"AtIndex:"); if ([_proxyObject respondsToSelector:_removeSEL]) _remove = [_proxyObject methodForSelector:_removeSEL]; - + _replaceSEL = sel_getName(@"replaceObjectFrom"+capitalizedKey+"AtIndex:withObject:"); if ([_proxyObject respondsToSelector:_replaceSEL]) _replace = [_proxyObject methodForSelector:_replaceSEL]; @@ -124,11 +125,11 @@ _removeManySEL = sel_getName(@"removeObjectsFrom"+capitalizedKey+"AtIndexes:"); if ([_proxyObject respondsToSelector:_removeManySEL]) _remove = [_proxyObject methodForSelector:_removeManySEL]; - + _replaceManySEL = sel_getName(@"replaceObjectsFrom"+capitalizedKey+"AtIndexes:withObjects:"); if ([_proxyObject respondsToSelector:_replaceManySEL]) _replace = [_proxyObject methodForSelector:_replaceManySEL]; - + _objectAtIndexSEL = sel_getName(@"objectIn"+capitalizedKey+"AtIndex:"); if ([_proxyObject respondsToSelector:_objectAtIndexSEL]) _objectAtIndex = [_proxyObject methodForSelector:_objectAtIndexSEL]; @@ -150,16 +151,17 @@ - (id)copy { - var theCopy = [], + var i = 0, + theCopy = [], count = [self count]; - for (var i=0; i= 0) { [self[index] addObserver:anObserver forKeyPath:aKeyPath options:options context:context]; @@ -483,7 +483,7 @@ kvoOperators["sum"] = function sumOperator(self, _cmd, param) - (void)removeObserver:(id)anObserver fromObjectsAtIndexes:(CPIndexSet)indexes forKeyPath:(CPString)aKeyPath { var index = [indexes firstIndex]; - + while (index >= 0) { [self[index] removeObserver:anObserver forKeyPath:aKeyPath]; @@ -492,7 +492,7 @@ kvoOperators["sum"] = function sumOperator(self, _cmd, param) } } --(void)addObserver:(id)observer forKeyPath:(CPString)aKeyPath options:(unsigned)options context:(id)context +- (void)addObserver:(id)observer forKeyPath:(CPString)aKeyPath options:(unsigned)options context:(id)context { if ([isa instanceMethodForSelector:_cmd] === [CPArray instanceMethodForSelector:_cmd]) [CPException raise:CPInvalidArgumentException reason:"Unsupported method on CPArray"]; diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j index 4e22b591a..590fd9e83 100755 --- a/Foundation/CPArray.j +++ b/Foundation/CPArray.j @@ -20,11 +20,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@import "CPEnumerator.j" +@import "CPException.j" @import "CPObject.j" @import "CPRange.j" -@import "CPEnumerator.j" @import "CPSortDescriptor.j" -@import "CPException.j" /* @ignore */ @@ -470,7 +470,7 @@ last = mid - 1; else { - while (mid < length - 1 && aFunction(anObject, self[mid+1], aContext) == CPOrderedSame) + while (mid < length - 1 && aFunction(anObject, self[mid + 1], aContext) == CPOrderedSame) mid++; return mid; @@ -894,7 +894,7 @@ @end -@implementation CPArray(CPMutableArray) +@implementation CPArray (CPMutableArray) // Creating arrays /*! @@ -987,7 +987,7 @@ } context:nil]; if (index < 0) - index = -index-1; + index = -index - 1; [self insertObject:anObject atIndex:index]; return index; diff --git a/Foundation/CPAttributedString.j b/Foundation/CPAttributedString.j index 2449489c8..f61b5c0e1 100644 --- a/Foundation/CPAttributedString.j +++ b/Foundation/CPAttributedString.j @@ -20,12 +20,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" -@import "CPString.j" @import "CPDictionary.j" +@import "CPObject.j" @import "CPRange.j" +@import "CPString.j" -/*! + +/*! @class CPAttributedString @ingroup foundation @brief A mutable character string with attributes. @@ -62,13 +63,13 @@ Creates a new attributed string from an existing attributed string. @param aString is the attributed string to initialise from. @return a new CPAttributedString containing the string \c aString. -*/ +*/ - (id)initWithAttributedString:(CPAttributedString)aString { var string = [self initWithString:"" attributes:nil]; - + [string setAttributedString:aString]; - + return string; } @@ -79,18 +80,18 @@ @param attributes is a dictionary of string attributes. @return a new CPAttributedString containing the string \c aString with associated attributes, \c attributes. -*/ +*/ - (id)initWithString:(CPString)aString attributes:(CPDictionary)attributes { self = [super init]; - + if (self) { if (!attributes) attributes = [CPDictionary dictionary]; _string = ""+aString; - _rangeEntries = [makeRangeEntry(CPMakeRange(0, _string.length), attributes)]; + _rangeEntries = [makeRangeEntry(CPMakeRange(0, _string.length), attributes)]; } return self; @@ -101,7 +102,7 @@ Returns a string containing the receiver's character data without attributes. @return a string of type CPString. -*/ +*/ - (CPString)string { return _string; @@ -111,17 +112,17 @@ Returns a string containing the receiver's character data without attributes. @return a string of type CPString. -*/ +*/ - (CPString)mutableString { return [self string]; -} +} /*! Get the length of the string. @return an unsigned integer equivalent to the number of characters in the string. -*/ +*/ - (unsigned)length { return _string.length; @@ -152,7 +153,7 @@ /*! Returns a dictionary of attributes for the character at a given index. The range in which this character resides in which the attributes are the - same, can be returned if desired. + same, can be returned if desired. @note there is no guarantee that the range returned is in fact the complete range of the particular attributes. To ensure this use \c attributesAtIndex:longestEffectiveRange:inRange: instead. Note @@ -163,10 +164,10 @@ that is set (upon return) to the range over which the attributes are the same as those at index, \c anIndex. If not required pass \c nil. - @return a CPDictionary containing the attributes associated with the + @return a CPDictionary containing the attributes associated with the character at index \c anIndex. Returns \c nil if index is out of bounds. -*/ +*/ - (CPDictionary)attributesAtIndex:(unsigned)anIndex effectiveRange:(CPRangePointer)aRange { //find the range entry that contains anIndex. @@ -181,7 +182,7 @@ aRange.location = matchingRange.range.location; aRange.length = matchingRange.range.length; } - + return matchingRange.attributes; } @@ -202,17 +203,17 @@ to the range over which the attributes apply. @param rangeLimit a range limiting the search for the attributes' applicable range. - @return a CPDictionary containing the attributes associated with the + @return a CPDictionary containing the attributes associated with the character at index \c anIndex. Returns \c nil if index is out of bounds. -*/ +*/ - (CPDictionary)attributesAtIndex:(unsigned)anIndex longestEffectiveRange:(CPRangePointer)aRange inRange:(CPRange)rangeLimit -{ +{ var startingEntryIndex = [self _indexOfEntryWithIndex:anIndex]; if (startingEntryIndex == CPNotFound) return nil; - + if (!aRange) return _rangeEntries[startingEntryIndex].attributes; @@ -220,7 +221,7 @@ { aRange.location = rangeLimit.location; aRange.length = rangeLimit.length; - + return _rangeEntries[startingEntryIndex].attributes; } @@ -260,7 +261,7 @@ else break; } - + aRange.length = MIN(CPMaxRange(currentEntry.range), CPMaxRange(rangeLimit)) - aRange.location; return comparisonDict; @@ -268,7 +269,7 @@ /*! Returns the specified named attribute for the given character index and, if - required, the range over which the attribute applies. + required, the range over which the attribute applies. @note there is no guarantee that the range returned is in fact the complete range of a particular attribute. To ensure this use \c -attribute:atIndex:longestEffectiveRange:inRange: instead but @@ -281,7 +282,7 @@ \c nil. @return the named attribute or \c nil is the attribute does not exist. -*/ +*/ - (id)attribute:(CPString)attribute atIndex:(unsigned)index effectiveRange:(CPRangePointer)aRange { if (!attribute) @@ -323,7 +324,7 @@ { //find the range entry that contains anIndex. var startingEntryIndex = [self _indexOfEntryWithIndex:anIndex]; - + if (startingEntryIndex == CPNotFound || !attribute) return nil; @@ -334,7 +335,7 @@ { aRange.location = rangeLimit.location; aRange.length = rangeLimit.length; - + return [_rangeEntries[startingEntryIndex].attributes objectForKey:attribute]; } @@ -374,7 +375,7 @@ else break; } - + aRange.length = MIN(CPMaxRange(currentEntry.range), CPMaxRange(rangeLimit)) - aRange.location; return comparisonAttribute; @@ -389,10 +390,10 @@ */ - (BOOL)isEqualToAttributedString:(CPAttributedString)aString { - if(!aString) + if (!aString) return NO; - if(_string != [aString string]) + if (_string != [aString string]) return NO; var myRange = CPMakeRange(), @@ -410,7 +411,7 @@ else comparisonAttributes = [aString attributesAtIndex:CPMaxRange(comparisonRange) effectiveRange:comparisonRange]; } - + return YES; } @@ -425,10 +426,10 @@ { if (anObject == self) return YES; - + if ([anObject isKindOfClass:[self class]]) return [self isEqualToAttributedString:anObject]; - + return NO; } @@ -443,7 +444,7 @@ - (CPAttributedString)attributedSubstringFromRange:(CPRange)aRange { if (!aRange || CPMaxRange(aRange) > _string.length || aRange.location < 0) - [CPException raise:CPRangeException + [CPException raise:CPRangeException reason:"tried to get attributedSubstring for an invalid range: "+(aRange?CPStringFromRange(aRange):"nil")]; var newString = [[CPAttributedString alloc] initWithString:_string.substring(aRange.location, CPMaxRange(aRange))], @@ -452,7 +453,7 @@ lastIndex = CPMaxRange(aRange); newString._rangeEntries = []; - + while (currentRangeEntry && CPMaxRange(currentRangeEntry.range) < lastIndex) { var newEntry = copyRangeEntry(currentRangeEntry); @@ -471,10 +472,10 @@ if (currentRangeEntry) { var newRangeEntry = copyRangeEntry(currentRangeEntry); - + newRangeEntry.range.length = CPMaxRange(aRange) - newRangeEntry.range.location; newRangeEntry.range.location -= aRange.location; - + if (newRangeEntry.range.location < 0) { newRangeEntry.range.length += newRangeEntry.range.location; @@ -483,12 +484,12 @@ newString._rangeEntries.push(newRangeEntry); } - + return newString; } //Changing Characters -/*! +/*! Replaces the characters in the receiver with those of the specified string over the range, \c aRange. If the range has a length of 0 then the specified string is inserted at the range location. The new characters @@ -508,10 +509,10 @@ if (!aString) aString = ""; - + var startingIndex = [self _indexOfEntryWithIndex:aRange.location], startingRangeEntry = _rangeEntries[startingIndex], - endingIndex = [self _indexOfEntryWithIndex:MAX(CPMaxRange(aRange)-1, 0)], + endingIndex = [self _indexOfEntryWithIndex:MAX(CPMaxRange(aRange) - 1, 0)], endingRangeEntry = _rangeEntries[endingIndex], additionalLength = aString.length - aRange.length; @@ -530,10 +531,10 @@ } endingIndex = startingIndex + 1; - + while(endingIndex < _rangeEntries.length) _rangeEntries[endingIndex++].range.location+=additionalLength; - + [self endEditing]; } @@ -548,9 +549,9 @@ //Changing Attributes /*! - Sets the attributes of the specified character range. + Sets the attributes of the specified character range. - @note This process removes the attributes already associated with the + @note This process removes the attributes already associated with the character range. If you wish to retain the current attributes use \c -addAttributes:range:. @param aDictionary a CPDictionary of attributes (names and values) to set @@ -579,11 +580,11 @@ } /*! - Add a collection of attributes to the specified character range. + Add a collection of attributes to the specified character range. @note Attributes currently associated with the characters in the range are untouched. To remove all previous attributes when adding use - \c -setAttributes:range:. + \c -setAttributes:range:. @param aDictionary a CPDictionary of attributes (names and values) to add. @param aRange a CPRange indicating the range of characters to add the attributes to. @@ -603,7 +604,7 @@ { var keys = [aDictionary allKeys], count = [keys count]; - + while (count--) [_rangeEntries[current].attributes setObject:[aDictionary objectForKey:keys[count]] forKey:keys[count]]; @@ -706,8 +707,8 @@ { var entryCopy = copyRangeEntry(otherRangeEntries[index++]); entryCopy.range.location += anIndex; - - _rangeEntries.splice(entryIndexOfNextEntry-1+index, 0, entryCopy); + + _rangeEntries.splice(entryIndexOfNextEntry - 1 + index, 0, entryCopy); } //necessary? @@ -727,10 +728,10 @@ - (void)replaceCharactersInRange:(CPRange)aRange withAttributedString:(CPAttributedString)aString { [self beginEditing]; - + [self deleteCharactersInRange:aRange]; [self insertAttributedString:aString atIndex:aRange.location]; - + [self endEditing]; } @@ -742,11 +743,14 @@ - (void)setAttributedString:(CPAttributedString)aString { [self beginEditing]; - + _string = aString._string; _rangeEntries = []; - - for (var i=0, count = aString._rangeEntries.length; i= _rangeEntries.length) - end = _rangeEntries.length -1; + end = _rangeEntries.length - 1; while (current < end) { var a = _rangeEntries[current], - b = _rangeEntries[current+1]; + b = _rangeEntries[current + 1]; if ([a.attributes isEqualToDictionary:b.attributes]) { a.range.length = CPMaxRange(b.range) - a.range.location; - _rangeEntries.splice(current+1, 1); + _rangeEntries.splice(current + 1, 1); end--; } else @@ -824,7 +828,8 @@ CPAttributedString already implements mutable methods and this class only exists for source compatability. */ -@implementation CPMutableAttributedString : CPAttributedString {} +@implementation CPMutableAttributedString : CPAttributedString + @end var isEqual = function isEqual(a, b) @@ -852,11 +857,11 @@ var splitRangeEntry = function splitRangeEntryAtIndex(/*RangeEntry*/aRangeEntry, { var newRangeEntry = copyRangeEntry(aRangeEntry), cachedIndex = CPMaxRange(aRangeEntry.range); - + aRangeEntry.range.length = anIndex - aRangeEntry.range.location; newRangeEntry.range.location = anIndex; newRangeEntry.range.length = cachedIndex - anIndex; newRangeEntry.attributes = [newRangeEntry.attributes copy]; - + return [aRangeEntry, newRangeEntry]; } diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index bef8fdb69..39aae0b29 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -20,8 +20,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPDictionary.j" +@import "CPObject.j" + /*! @class CPBundle diff --git a/Foundation/CPCoder.j b/Foundation/CPCoder.j index b57cd61f9..0d8bc04da 100644 --- a/Foundation/CPCoder.j +++ b/Foundation/CPCoder.j @@ -20,28 +20,27 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPException.j" +@import "CPObject.j" -/*! +/*! @class CPCoder @ingroup foundation @brief Defines methods for use when archiving & restoring (enc/decoding). - Top-level class defining methods for use when archiving (encoding) objects to a byte array - or file, and when restoring (decoding) objects. + Top-level class defining methods for use when archiving (encoding) objects to a byte array + or file, and when restoring (decoding) objects. */ @implementation CPCoder : CPObject { - } /*! Returns a flag indicating whether the receiver supports keyed coding. The default implementation returns \c NO. Subclasses supporting keyed coding must override this to return \c YES. */ --(BOOL)allowsKeyedCoding +- (BOOL)allowsKeyedCoding { return NO; } @@ -53,7 +52,7 @@ @param aType the structure or object type @param anObject the object to be encoded */ --(void)encodeValueOfObjCType:(CPString)aType at:(id)anObject +- (void)encodeValueOfObjCType:(CPString)aType at:(id)anObject { CPInvalidAbstractInvocation(); } @@ -62,7 +61,7 @@ Encodes a data object. Subclasses must override this method. @param aData the object to be encoded. */ --(void)encodeDataObject:(CPData)aData +- (void)encodeDataObject:(CPData)aData { CPInvalidAbstractInvocation(); } @@ -71,7 +70,7 @@ Encodes an object. Subclasses must override this method. @param anObject the object to be encoded */ --(void)encodeObject:(id)anObject +- (void)encodeObject:(id)anObject { // [self encodeValueOfObjCType:@encode(id) at:object]; } @@ -110,7 +109,7 @@ Encodes a property list. Not yet implemented. @param aPropertyList the property list to be encoded */ --(void)encodePropertyList:(id)aPropertyList +- (void)encodePropertyList:(id)aPropertyList { // [self encodeValueOfObjCType:@encode(id) at:&propertyList]; } @@ -119,7 +118,7 @@ Encodes the root object of a group of Obj-J objects. @param rootObject the root object to be encoded. */ --(void)encodeRootObject:(id)anObject +- (void)encodeRootObject:(id)anObject { [self encodeObject:anObject]; } @@ -128,7 +127,7 @@ Encodes an object. @param anObject the object to be encoded. */ --(void)encodeBycopyObject:(id)anObject +- (void)encodeBycopyObject:(id)anObject { [self encodeObject:anObject]; } @@ -137,7 +136,7 @@ Encodes an object. @param anObject the object to be encoded. */ --(void)encodeConditionalObject:(id)anObject +- (void)encodeConditionalObject:(id)anObject { [self encodeObject:anObject]; } diff --git a/Foundation/CPCountedSet.j b/Foundation/CPCountedSet.j index a99b94a98..86b4753af 100644 --- a/Foundation/CPCountedSet.j +++ b/Foundation/CPCountedSet.j @@ -22,7 +22,8 @@ @import "CPSet.j" -/*! + +/*! @class CPCountedSet @ingroup foundation @brief An mutable collection which may contain a specific object @@ -37,11 +38,11 @@ { if (!_counts) _counts = {}; - + [super addObject:anObject]; - + var UID = [anObject UID]; - + if (_counts[UID] === undefined) _counts[UID] = 1; else @@ -52,16 +53,16 @@ { if (!_counts) return; - + var UID = [anObject UID]; - + if (_counts[UID] === undefined) return; - + else { --_counts[UID]; - + if (_counts[UID] === 0) { delete _counts[UID]; @@ -84,17 +85,17 @@ { if (!_counts) _counts = {}; - + var UID = [anObject UID]; - + if (_counts[UID] === undefined) return 0; - + return _counts[UID]; } -/* +/* Eventually we should see what these are supposed to do, and then do that. diff --git a/Foundation/CPData.j b/Foundation/CPData.j index 2d73b5a42..0a75abd36 100644 --- a/Foundation/CPData.j +++ b/Foundation/CPData.j @@ -23,6 +23,7 @@ @import "CPObject.j" @import "CPString.j" + /*! @class CPData @ingroup foundation diff --git a/Foundation/CPDate.j b/Foundation/CPDate.j index e4bc13273..6340ef48c 100644 --- a/Foundation/CPDate.j +++ b/Foundation/CPDate.j @@ -24,7 +24,7 @@ @import "CPString.j" -var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)); +var CPDateReferenceDate = new Date(Date.UTC(2001, 1, 1, 0, 0, 0, 0)); /*! @class CPDate @@ -64,12 +64,12 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)); + (id)distantPast { - return new Date(-10000,1,1,0,0,0,0); + return new Date(-10000, 1, 1, 0, 0, 0, 0); } + (id)distantFuture { - return new Date(10000,1,1,0,0,0,0); + return new Date(10000, 1, 1, 0, 0, 0, 0); } - (id)initWithTimeIntervalSinceNow:(CPTimeInterval)seconds @@ -110,7 +110,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)); [CPException raise:CPInvalidArgumentException reason:"initWithString: the string must be of YYYY-MM-DD HH:MM:SS ±HHMM format"]; - var date = new Date(d[1], d[2]-1, d[3]), + var date = new Date(d[1], d[2] - 1, d[3]), timeZoneOffset = (Number(d[8]) * 60 + Number(d[9])) * (d[7] === '-' ? -1 : 1); date.setHours(d[4]); @@ -180,7 +180,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)); var hours = Math.floor(self.getTimezoneOffset() / 60), minutes = self.getTimezoneOffset() - hours * 60; - return [CPString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d +%02d%02d", self.getFullYear(), self.getMonth()+1, self.getDate(), self.getHours(), self.getMinutes(), self.getSeconds(), hours, minutes]; + return [CPString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d +%02d%02d", self.getFullYear(), self.getMonth() + 1, self.getDate(), self.getHours(), self.getMinutes(), self.getSeconds(), hours, minutes]; } - (id)copy diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index 0b742c98c..4fd2d46d8 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -21,9 +21,9 @@ */ @import "CPArray.j" -@import "CPObject.j" @import "CPEnumerator.j" @import "CPException.j" +@import "CPObject.j" /* @ignore */ @@ -36,20 +36,20 @@ - (id)initWithDictionary:(CPDictionary)aDictionary { self = [super init]; - + if (self) { _keyEnumerator = [aDictionary keyEnumerator]; _dictionary = aDictionary; } - + return self; } - (id)nextObject { var key = [_keyEnumerator nextObject]; - + if (!key) return nil; @@ -58,7 +58,7 @@ @end -/*! +/*! @class CPDictionary @ingroup foundation @brief A mutable key-value pair collection. @@ -145,29 +145,33 @@ */ + (id)dictionaryWithJSObject:(JSObject)object recursively:(BOOL)recursively { - var dictionary = [[self alloc] init]; - - for (var key in object) + var key = "", + dictionary = [[self alloc] init]; + + for (key in object) { if (!object.hasOwnProperty(key)) continue; var value = object[key]; - + if (value === null) { [dictionary setObject:[CPNull null] forKey:key]; continue; } - + if (recursively) { if (value.constructor === Object) value = [CPDictionary dictionaryWithJSObject:value recursively:YES]; else if ([value isKindOfClass:CPArray]) { - var newValue = []; - for (var i = 0, count = value.length; i < count; i++) + var newValue = [], + i = 0, + count = value.length; + + for (; i < count; i++) { var thisValue = value[i]; @@ -183,7 +187,7 @@ [dictionary setObject:value forKey:key]; } - + return dictionary; } @@ -193,22 +197,22 @@ @param ... key for the first object and ongoing value-key pairs for more objects. @throws CPInvalidArgumentException if the number of objects and keys is different @return the new CPDictionary - + Assuming that there's no object retaining in Cappuccino, you can create dictionaries same way as with alloc and initWithObjectsAndKeys: var dict = [CPDictionary dictionaryWithObjectsAndKeys: @"value1", @"key1", @"value2", @"key2"]; - + Note, that there's no final nil like in Objective-C/Cocoa. - + @see [CPDictionary initWithObjectsAndKeys:] */ + (id)dictionaryWithObjectsAndKeys:(id)firstObject, ... { arguments[0] = [self alloc]; arguments[1] = @selector(initWithObjectsAndKeys:); - + return objj_msgSend.apply(this, arguments); } @@ -221,10 +225,10 @@ { var key = "", dictionary = [[CPDictionary alloc] init]; - + for (key in aDictionary._buckets) [dictionary setObject:[aDictionary objectForKey:key] forKey:key]; - + return dictionary; } @@ -240,16 +244,16 @@ self = [super init]; if ([objects count] != [keyArray count]) - [CPException raise:CPInvalidArgumentException reason:"Counts are different.("+[objects count]+"!="+[keyArray count]+")"]; + [CPException raise:CPInvalidArgumentException reason:"Counts are different.(" + [objects count] + "!=" + [keyArray count] + ")"]; if (self) { var i = [keyArray count]; - + while (i--) [self setObject:objects[i] forKey:keyArray[i]]; } - + return self; } @@ -259,29 +263,29 @@ @param ... key for the first object and ongoing value-key pairs for more objects. @throws CPInvalidArgumentException if the number of objects and keys is different @return the new CPDictionary - + You can create dictionaries this way: var dict = [[CPDictionary alloc] initWithObjectsAndKeys: @"value1", @"key1", @"value2", @"key2"]; - + Note, that there's no final nil like in Objective-C/Cocoa. */ - (id)initWithObjectsAndKeys:(id)firstObject, ... { var argCount = arguments.length; - + if (argCount % 2 !== 0) [CPException raise:CPInvalidArgumentException reason:"Key-value count is mismatched. (" + argCount + " arguments passed)"]; self = [super init]; - + if (self) { // The arguments array contains self and _cmd, so the first object is at position 2. var index = 2; - - for(; index < argCount; index += 2) + + for (; index < argCount; index += 2) { var value = arguments[index]; @@ -326,7 +330,7 @@ { var index = _keys.length, values = []; - + while (index--) values.push(self.valueForKey(_keys[index])); @@ -350,7 +354,7 @@ } /*! - Compare the receiver to this dictionary, and return whether or not they are equal. + Compare the receiver to this dictionary, and return whether or not they are equal. */ - (BOOL)isEqualToDictionary:(CPDictionary)aDictionary { @@ -372,10 +376,10 @@ if (lhsObject === rhsObject) continue; - + if (lhsObject && lhsObject.isa && rhsObject && rhsObject.isa && [lhsObject respondsToSelector:@selector(isEqual:)] && [lhsObject isEqual:rhsObject]) continue; - + return NO; } @@ -399,9 +403,9 @@ var i= 0, keys= CPArray.array(), count= this.count(); - - while((i= this._objects.indexOfObjectInRage(0, count-i))!=CPNotFound) keys.addObject(this._keys[i]); - + + while ((i= this._objects.indexOfObjectInRage(0, count-i))!=CPNotFound) keys.addObject(this._keys[i]); + return keys; } @@ -412,7 +416,7 @@ { return aSelector.apply(dictionary.objectForKey(this), [dictionary.objectForKey(rhs)]); }; - + return this._keys.sortedArrayUsingSelector(objectSelector); } */ @@ -424,7 +428,7 @@ - (id)objectForKey:(CPString)aKey { var object = _buckets[aKey]; - + return (object === undefined) ? nil : object; } /* @@ -432,20 +436,20 @@ { var i= keys.length, objects= CPArray.array(); - - while(i--) + + while (i--) { var object= this.objectForKey(keys[i]); objects.addObject(object==nil?aNotFoundMarker:object); } - + return objects; } - + Instance.valueForKey(aKey) { - if(aKey.length && aKey[0]=="@") return this.objectForKey(aKey.substr(1)); - + if (aKey.length && aKey[0]=="@") return this.objectForKey(aKey.substr(1)); + return base.valueForKey(aKey); } */ @@ -483,11 +487,11 @@ { this._keys= CPArray.arrayWithArray(aDictionary.allKeys()); this._objects= CPArray.arrayWithArray(aDictionary.allValues()); - + this._dictionary= { }; - + var i= this._keys.count(); - while(i--) this._dictionary[this._keys[i]]= { object: this._objects[i], index: i }; + while (i--) this._dictionary[this._keys[i]]= { object: this._objects[i], index: i }; } */ /*! @@ -507,10 +511,10 @@ { if (!aDictionary) return; - + var keys = [aDictionary allKeys], index = [keys count]; - + while (index--) { var key = keys[index]; diff --git a/Foundation/CPEnumerator.j b/Foundation/CPEnumerator.j index 51d25b92a..50efcb571 100755 --- a/Foundation/CPEnumerator.j +++ b/Foundation/CPEnumerator.j @@ -22,15 +22,12 @@ @import "CPObject.j" -/*! - -*/ -/*! +/*! @class CPEnumerator @ingroup foundation @brief Defines an interface for enumerators. - + CPEnumerator is a superclass (with useless method bodies) that defines an interface for subclasses to follow. The purpose of an enumerator is to be a convenient system for traversing over the elements diff --git a/Foundation/CPException.j b/Foundation/CPException.j index 28abb60ec..770c6ad63 100755 --- a/Foundation/CPException.j +++ b/Foundation/CPException.j @@ -30,7 +30,7 @@ CPUnsupportedMethodException = "CPUnsupportedMethodException"; CPRangeException = "CPRangeException"; CPInternalInconsistencyException = "CPInternalInconsistencyException"; -/*! +/*! @class CPException @ingroup foundation @brief Used to implement exception handling (creating & raising). @@ -40,7 +40,7 @@ CPInternalInconsistencyException = "CPInternalInconsistencyException"; // some code here... if (input == nil) [CPException raise:"MyException" reason:"You didn't do something right."]; - + // code that gets executed if no exception was raised */ @@ -96,7 +96,7 @@ if (input == nil) message = aReason; _userInfo = aUserInfo; } - + return self; } @@ -165,14 +165,14 @@ var CPExceptionNameKey = "CPExceptionNameKey", - (id)initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) { name = [aCoder decodeObjectForKey:CPExceptionNameKey]; message = [aCoder decodeObjectForKey:CPExceptionReasonKey]; _userInfo = [aCoder decodeObjectForKey:CPExceptionUserInfoKey]; } - + return self; } diff --git a/Foundation/CPFunctionOperation.j b/Foundation/CPFunctionOperation.j index 795058737..f9f98c911 100644 --- a/Foundation/CPFunctionOperation.j +++ b/Foundation/CPFunctionOperation.j @@ -23,22 +23,24 @@ @import "CPOperation.j" -/*! +/*! @class CPFunctionOperation @brief Represents an operation using a JavaScript function that can be run in an CPOperationQueue */ -@implementation CPFunctionOperation : CPOperation +@implementation CPFunctionOperation : CPOperation { CPArray _functions; } -- (void)main +- (void)main { - if (_functions && [_functions count] > 0) + if (_functions && [_functions count] > 0) { - var i = 0; - for (i = 0; i < [_functions count]; i++) + var i = 0, + count = [_functions count]; + + for (; i < count; i++) { var func = [_functions objectAtIndex:i]; func(); @@ -46,9 +48,9 @@ } } -- (id)init +- (id)init { - if (self = [super init]) + if (self = [super init]) { _functions = []; } @@ -58,7 +60,7 @@ /*! Adds the specified JS function to the receiver’s list of functions to perform. */ -- (void)addExecutionFunction:(JSObject)jsFunction +- (void)addExecutionFunction:(JSObject)jsFunction { [_functions addObject:jsFunction]; } @@ -66,7 +68,7 @@ /*! Returns an array containing the functions associated with the receiver. */ -- (CPArray)executionFunctions +- (CPArray)executionFunctions { return _functions; } @@ -74,12 +76,12 @@ /*! Creates and returns an NSFunctionOperation object and adds the specified function to it. */ -+ (id)functionOperationWithFunction:(JSObject)jsFunction ++ (id)functionOperationWithFunction:(JSObject)jsFunction { functionOp = [[CPFunctionOperation alloc] init]; [functionOp addExecutionFunction:jsFunction]; - + return functionOp; } -@end \ No newline at end of file +@end diff --git a/Foundation/CPIndexSet.j b/Foundation/CPIndexSet.j index 60e6736e9..266c7273e 100644 --- a/Foundation/CPIndexSet.j +++ b/Foundation/CPIndexSet.j @@ -20,14 +20,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPRange.j" @import "CPObject.j" +@import "CPRange.j" + #define _CPMaxRange(aRange) ((aRange).location + (aRange).length) #define _CPMakeRange(aLocation, aLength) { location:(aLocation), length:aLength } #define _CPMakeRangeCopy(aRange) { location:(aRange).location, length:(aRange).length } -/*! +/*! @class CPIndexSet @ingroup foundation @brief A collection of unique integers. @@ -179,7 +180,7 @@ return NO; // If we have less total indexes than aRange, we can't possibly contain aRange. - if(_count < aRange.length) + if (_count < aRange.length) return NO; // Search for first location @@ -203,7 +204,7 @@ { var otherCount = anIndexSet._count; - if(otherCount <= 0) + if (otherCount <= 0) return YES; // If we have less total indexes than anIndexSet, we can't possibly contain aRange. @@ -692,7 +693,7 @@ var i = _ranges.length - 1, shifted = CPMakeRange(CPNotFound, 0); - for(; i >= 0; --i) + for (; i >= 0; --i) { var range = _ranges[i], maximum = CPMaxRange(range); @@ -700,7 +701,7 @@ if (anIndex > maximum) break; - // If our index is within our range, but not the first index, + // If our index is within our range, but not the first index, // then this range will be split. if (anIndex > range.location && anIndex < maximum) { diff --git a/Foundation/CPInvocation.j b/Foundation/CPInvocation.j index 19e8c2cb1..da66a2a68 100644 --- a/Foundation/CPInvocation.j +++ b/Foundation/CPInvocation.j @@ -20,11 +20,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPException.j" +@import "CPObject.j" -/*! +/*! @class CPInvocation @ingroup foundation @brief An object representation of a message. @@ -57,13 +57,13 @@ - (id)initWithMethodSignature:(CPMethodSignature)aMethodSignature { self = [super init]; - + if (self) { _arguments = []; _methodSignature = aMethodSignature; } - + return self; } @@ -174,13 +174,13 @@ var CPInvocationArguments = @"CPInvocationArguments", - (id)initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) { _returnValue = [aCoder decodeObjectForKey:CPInvocationReturnValue]; _arguments = [aCoder decodeObjectForKey:CPInvocationArguments]; } - + return self; } diff --git a/Foundation/CPInvocationOperation.j b/Foundation/CPInvocationOperation.j index e98fc6c49..0c1bdfda6 100644 --- a/Foundation/CPInvocationOperation.j +++ b/Foundation/CPInvocationOperation.j @@ -19,32 +19,32 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import -@import +@import "CPInvocation.j" +@import "CPObject.j" @import "CPOperation.j" -/*! +/*! @class CPInvocationOperation @brief Represents an operation using an invocation that can be run in an CPOperationQueue */ -@implementation CPInvocationOperation : CPOperation +@implementation CPInvocationOperation : CPOperation { CPInvocation _invocation; } -- (void)main +- (void)main { - if (_invocation) + if (_invocation) { [_invocation invoke]; } } -- (id)init +- (id)init { - if (self = [super init]) + if (self = [super init]) { _invocation = nil; } @@ -55,13 +55,13 @@ Returns a CPInvocationOperation object initialized with the specified invocation object. @param inv the invocation */ -- (id)initWithInvocation:(CPInvocation)inv +- (id)initWithInvocation:(CPInvocation)inv { - if (self = [self init]) + if (self = [self init]) { _invocation = inv; } - + return self; } @@ -71,20 +71,20 @@ @param sel the selector that should be called on the target @param arg the arguments */ -- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg +- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg { var inv = [[CPInvocation alloc] initWithMethodSignature:nil]; [inv setTarget:target]; [inv setSelector:sel]; [inv setArgument:arg atIndex:2]; - + return [self initWithInvocation:inv]; } /*! Returns the receiver’s invocation object. */ -- (CPInvocation)invocation +- (CPInvocation)invocation { return _invocation; } @@ -92,16 +92,14 @@ /*! Returns the result of the invocation or method. */ -- (id)result +- (id)result { - if ([self isFinished] && _invocation) + if ([self isFinished] && _invocation) { return [_invocation returnValue]; } - + return nil; } - - -@end \ No newline at end of file +@end diff --git a/Foundation/CPJSONPConnection.j b/Foundation/CPJSONPConnection.j index 031ef7eb2..c95a362c5 100644 --- a/Foundation/CPJSONPConnection.j +++ b/Foundation/CPJSONPConnection.j @@ -19,15 +19,15 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -@import + +@import "CPObject.j" CPJSONPConnectionCallbacks = {}; CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; -/*! +/*! @ingroup foundation @brief Allows cross domain connections using JSONP protocol. @@ -43,13 +43,13 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; { CPURLRequest _request; id _delegate; - + CPString _callbackParameter; DOMElement _scriptTag; } /*! @deprecated */ -+ (CPJSONPConnection)sendRequest:(CPURLRequest)aRequest callback:(CPString)callbackParameter delegate:(id)aDelegate ++ (CPJSONPConnection)sendRequest:(CPURLRequest)aRequest callback:(CPString)callbackParameter delegate:(id)aDelegate { return [self connectionWithRequest:aRequest callback:callbackParameter delegate:aDelegate]; } @@ -59,7 +59,7 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; return [[[self class] alloc] initWithRequest:aRequest callback:callbackParameter delegate:aDelegate startImmediately:YES]; } -- (id)initWithRequest:(CPURLRequest)aRequest callback:(CPString)aString delegate:(id)aDelegate +- (id)initWithRequest:(CPURLRequest)aRequest callback:(CPString)aString delegate:(id)aDelegate { return [self initWithRequest:aRequest callback:aString delegate:aDelegate startImmediately: NO]; } @@ -67,18 +67,18 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; - (id)initWithRequest:(CPURLRequest)aRequest callback:(CPString)aString delegate:(id)aDelegate startImmediately:(BOOL)shouldStartImmediately { self = [super init]; - + _request = aRequest; _delegate = aDelegate; - + _callbackParameter = aString; - + if (!_callbackParameter && [[_request URL] absoluteString].indexOf(CPJSONPCallbackReplacementString) < 0) [CPException raise:CPInvalidArgumentException reason:@"JSONP source specified without callback parameter or CPJSONPCallbackReplacementString in URL."]; - if(shouldStartImmediately) + if (shouldStartImmediately) [self start]; - + return self; } @@ -93,9 +93,9 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)]) [_delegate connectionDidFinishLoading:self]; - + [self removeScriptTag]; - + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; }; @@ -113,12 +113,12 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; } else return; - + _scriptTag = document.createElement("script"); _scriptTag.setAttribute("type", "text/javascript"); _scriptTag.setAttribute("charset", "utf-8"); _scriptTag.setAttribute("src", source); - + head.appendChild(_scriptTag); } catch (exception) @@ -133,12 +133,12 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}"; - (void)removeScriptTag { var head = document.getElementsByTagName("head").item(0); - + if(_scriptTag && _scriptTag.parentNode == head) head.removeChild(_scriptTag); - CPJSONPConnectionCallbacks["callback"+[self UID]] = nil; - delete CPJSONPConnectionCallbacks["callback"+[self UID]]; + CPJSONPConnectionCallbacks["callback" + [self UID]] = nil; + delete CPJSONPConnectionCallbacks["callback" + [self UID]]; } - (void)cancel diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index 6543d04b6..104a6931f 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -25,6 +25,7 @@ @import "CPNull.j" @import "CPObject.j" + var CPObjectAccessorsForClass = nil, CPObjectModifiersForClass = nil; @@ -44,41 +45,41 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; { if (!CPObjectAccessorsForClass) CPObjectAccessorsForClass = [CPDictionary dictionary]; - + var UID = [isa UID], selector = nil, accessors = [CPObjectAccessorsForClass objectForKey:UID]; - + if (accessors) { selector = [accessors objectForKey:aKey]; - + if (selector) return selector === [CPNull null] ? nil : selector; } else { accessors = [CPDictionary dictionary]; - + [CPObjectAccessorsForClass setObject:accessors forKey:UID]; } var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substr(1); - - if ([self instancesRespondToSelector:selector = CPSelectorFromString("get" + capitalizedKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString(aKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString("is" + capitalizedKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString("_get" + capitalizedKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString("_" + aKey)] || + + if ([self instancesRespondToSelector:selector = CPSelectorFromString("get" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString(aKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("is" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_get" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_" + aKey)] || [self instancesRespondToSelector:selector = CPSelectorFromString("_is" + capitalizedKey)]) { [accessors setObject:selector forKey:aKey]; - + return selector; } - + [accessors setObject:[CPNull null] forKey:aKey]; - + return nil; } @@ -87,25 +88,25 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; { if (!CPObjectModifiersForClass) CPObjectModifiersForClass = [CPDictionary dictionary]; - + var UID = [isa UID], selector = nil, modifiers = [CPObjectModifiersForClass objectForKey:UID]; - + if (modifiers) { selector = [modifiers objectForKey:aKey]; - + if (selector) return selector === [CPNull null] ? nil : selector; } else { modifiers = [CPDictionary dictionary]; - + [CPObjectModifiersForClass setObject:modifiers forKey:UID]; } - + if (selector) return selector === [CPNull null] ? nil : selector; @@ -115,12 +116,12 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; [self instancesRespondToSelector:selector = CPSelectorFromString("_set" + capitalizedKey)]) { [modifiers setObject:selector forKey:aKey]; - + return selector; } - + [modifiers setObject:[CPNull null] forKey:aKey]; - + return nil; } @@ -128,30 +129,30 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; - (CPString)_ivarForKey:(CPString)aKey { var ivar = '_' + aKey; - + if (typeof self[ivar] != "undefined") return ivar; var isKey = "is" + aKey.charAt(0).toUpperCase() + aKey.substr(1); - ivar = '_' + isKey; - + ivar = '_' + isKey; + if (typeof self[ivar] != "undefined") return ivar; - + ivar = aKey; - + if (typeof self[ivar] != "undefined") return ivar; - + ivar = isKey; - + if (typeof self[ivar] != "undefined") return ivar; return nil; } - + - (id)valueForKey:(CPString)aKey { var theClass = [self class], @@ -159,18 +160,18 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; if (selector) return objj_msgSend(self, selector); - - if([theClass accessInstanceVariablesDirectly]) + + if ([theClass accessInstanceVariablesDirectly]) { var ivar = [self _ivarForKey:aKey]; - + if (ivar) return self[ivar]; } - + return [self valueForUndefinedKey:aKey]; } - + - (id)valueForKeyPath:(CPString)aKeyPath { var firstDotIndex = aKeyPath.indexOf("."); @@ -179,7 +180,7 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; return [self valueForKey:aKeyPath]; var firstKeyComponent = aKeyPath.substring(0, firstDotIndex), - remainingKeyPath = aKeyPath.substring(firstDotIndex+1), + remainingKeyPath = aKeyPath.substring(firstDotIndex + 1), value = [self valueForKey:firstKeyComponent]; return [value valueForKeyPath:remainingKeyPath]; @@ -190,7 +191,7 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; var index = 0, count = keys.length, dictionary = [CPDictionary dictionary]; - + for (; index < count; ++index) { var key = keys[index], @@ -201,7 +202,7 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; else [dictionary setObject:value forKey:key]; } - + return dictionary; } @@ -211,7 +212,7 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; reason:[self description] + " is not key value coding-compliant for the key " + aKey userInfo:[CPDictionary dictionaryWithObjects:[self, aKey] forKeys:[CPTargetObjectUserInfoKey, CPUnknownUserInfoKey]]] raise]; } - + - (void)setValue:(id)aValue forKeyPath:(CPString)aKeyPath { if (!aKeyPath) aKeyPath = "self"; @@ -221,12 +222,12 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; count = keys.length - 1, owner = self; - for(; i < count; ++i) + for (; i < count; ++i) owner = [owner valueForKey:keys[i]]; - + [owner setValue:aValue forKey:keys[i]]; } - + - (void)setValue:(id)aValue forKey:(CPString)aKey { var theClass = [self class], @@ -234,26 +235,26 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; if (selector) return objj_msgSend(self, selector, aValue); - - if([theClass accessInstanceVariablesDirectly]) + + if ([theClass accessInstanceVariablesDirectly]) { var ivar = [self _ivarForKey:aKey]; - + if (ivar) { [self willChangeValueForKey:aKey]; - + self[ivar] = aValue; - + [self didChangeValueForKey:aKey]; return; } } - + [self setValue:aValue forUndefinedKey:aKey]; } - + - (void)setValue:(id)aValue forUndefinedKey:(CPString)aKey { [[CPException exceptionWithName:CPUndefinedKeyException diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 5612adaf2..a1a556d3d 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -224,7 +224,7 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)_replaceClass { var currentClass = _nativeClass, - kvoClassName = "$KVO_"+class_getName(_nativeClass), + kvoClassName = "$KVO_" + class_getName(_nativeClass), existingKVOClass = objj_lookUpClass(kvoClassName); if (existingKVOClass) @@ -232,16 +232,17 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, _targetObject.isa = existingKVOClass; return; } - + var kvoClass = objj_allocateClassPair(currentClass, kvoClassName); - + objj_registerClassPair(kvoClass); - + //copy in the methods from our model subclass var methodList = _CPKVOModelSubclass.method_list, - count = methodList.length; + count = methodList.length, + i = 0; - for (var i=0; i O(N^2)), so to avoid it, - // we keep track of whether observers are added or removed, and only do our + // we keep track of whether observers are added or removed, and only do our // rigorous testing in those cases. var observerRemovalCount = _observerRemovalCount, object = [aNotification object], @@ -286,18 +286,18 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ { var currentObservers = observers, count = observers.length; - + while (count--) { var observer = observers[count]; - - // if there wasn't removal of an observer during this posting, or there - // was but we are still in the observer list... + + // if there wasn't removal of an observer during this posting, or there + // was but we are still in the observer list... if ((observerRemovalCount === _observerRemovalCount) || [currentObservers indexOfObjectIdenticalTo:observer] !== CPNotFound) [observer postNotification:aNotification]; } } - + // Now do the same for the nil object observers... observers = [[_objectObservers objectForKey:[[CPNull null] UID]] copy]; @@ -312,8 +312,8 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ { var observer = observers[count]; - // if there wasn't removal of an observer during this posting, or there - // was but we are still in the observer list... + // if there wasn't removal of an observer during this posting, or there + // was but we are still in the observer list... if ((observerRemovalCount === _observerRemovalCount) || [currentObservers indexOfObjectIdenticalTo:observer] !== CPNotFound) [observer postNotification:aNotification]; } @@ -349,7 +349,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ return _observer; } --(void)postNotification:(CPNotification)aNotification +- (void)postNotification:(CPNotification)aNotification { [_observer performSelector:_selector withObject:aNotification]; } diff --git a/Foundation/CPNumber.j b/Foundation/CPNumber.j index 8712b2ac2..a0bbef39e 100644 --- a/Foundation/CPNumber.j +++ b/Foundation/CPNumber.j @@ -27,15 +27,15 @@ var __placeholder = new Number(), CPNumberUIDs = new CFMutableDictionary(); -/*! +/*! @class CPNumber @ingroup foundation @brief A bridged object to native Javascript numbers. This class primarily exists for source compatability. The JavaScript \c Number type can be changed on the fly based on context, - so there is no need to call any of these methods. - + so there is no need to call any of these methods. + In other words, native JavaScript numbers are bridged to CPNumber, so you can use them interchangeably (including operators and methods). */ @@ -93,7 +93,7 @@ var __placeholder = new Number(), { if (aChar.charCodeAt) return aChar.charCodeAt(0); - + return aChar; } @@ -126,7 +126,7 @@ var __placeholder = new Number(), { if (aChar.charCodeAt) return aChar.charCodeAt(0); - + return aChar; } @@ -164,7 +164,7 @@ var __placeholder = new Number(), { if (aChar.charCodeAt) return aChar.charCodeAt(0); - + return aChar; } @@ -223,7 +223,7 @@ FIXME: Do we need this? - (CPString)descriptionWithLocale:(CPDictionary)aDictionary { if (!aDictionary) return toString(); - + throw new Error("descriptionWithLocale: NOT YET IMPLEMENTED"); } @@ -273,7 +273,7 @@ FIXME: Do we need this? return toString(); } -- (unsigned char)unsignedCharValue +- (unsigned char)unsignedCharValue { return String.fromCharCode(self); } @@ -306,7 +306,7 @@ FIXME: Do we need this? { if (self > aNumber) return CPOrderedDescending; else if (self < aNumber) return CPOrderedAscending; - + return CPOrderedSame; } diff --git a/Foundation/CPObjJRuntime.j b/Foundation/CPObjJRuntime.j index 3c49daebd..019888d19 100644 --- a/Foundation/CPObjJRuntime.j +++ b/Foundation/CPObjJRuntime.j @@ -42,7 +42,7 @@ function CPStringFromClass(aClass) } CPOrderedAscending = -1; -CPOrderedSame = 0; +CPOrderedSame = 0; CPOrderedDescending = 1; CPNotFound = -1; diff --git a/Foundation/CPObject.j b/Foundation/CPObject.j index b6c276ee6..fece4e8f6 100644 --- a/Foundation/CPObject.j +++ b/Foundation/CPObject.j @@ -24,27 +24,27 @@ @class CPObject @ingroup foundation @brief The root class from which most classes are subclassed. - + CPObject is the root class for most Cappuccino classes. Like in Objective-C, you have to declare parent class explicitly in Objective-J, so your custom classes should almost always subclass CPObject or one of its children. - + CPObject provides facilities for class allocation and initialization, querying runtime about parent classes and available selectors, using KVC (key-value coding). - + When you subclass CPObject, most of the time you override one selector - init. It is called for default initialization of custom object. You must call parent class init in your overriden code:
- (id)init
 {
     self = [super init];
-    if(self) {
+    if (self) {
         ... provide default initialization code for your object ...
     }
     return self;
 }
- + One more useful thing to override is description(). This selector is used to provide developer-readable information about object. description selector is often used with CPLog debugging: @@ -58,7 +58,7 @@ CPLog(@"Got some class: %@", inst); would output: \c Got \c some \c class: \c - + @todo document KVC usage. */ @implementation CPObject @@ -164,11 +164,11 @@ CPLog(@"Got some class: %@", inst); + (BOOL)isSubclassOfClass:(Class)aClass { var theClass = self; - - for(; theClass; theClass = theClass.super_class) - if(theClass === aClass) + + for (; theClass; theClass = theClass.super_class) + if (theClass === aClass) return YES; - + return NO; } @@ -332,25 +332,25 @@ CPLog(@"Got some class: %@", inst); - (void)forward:(SEL)aSelector :(marg_list)args { var signature = [self methodSignatureForSelector:aSelector]; - + if (signature) { invocation = [CPInvocation invocationWithMethodSignature:signature]; - + [invocation setTarget:self]; [invocation setSelector:aSelector]; - + var index = 2, count = args.length; - + for (; index < count; ++index) [invocation setArgument:args[index] atIndex:index]; - + [self forwardInvocation:invocation]; - + return [invocation returnValue]; } - + [self doesNotRecognizeSelector:aSelector]; } @@ -436,7 +436,7 @@ CPLog(@"Got some class: %@", inst); + (id)setVersion:(int)aVersion { version = aVersion; - + return self; } diff --git a/Foundation/CPOperation.j b/Foundation/CPOperation.j index e24617ae7..710dc5961 100644 --- a/Foundation/CPOperation.j +++ b/Foundation/CPOperation.j @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import +@import "CPObject.j" /*! Operations receive very low priority for execution. @@ -57,13 +57,13 @@ CPOperationQueuePriorityHigh = 4; CPOperationQueuePriorityVeryHigh = 8; -/*! +/*! @class CPOperation @brief Represents an operation that can be run in an CPOperationQueue It should be subclassed an the subclass should implement its own main method to do the actual work. */ -@implementation CPOperation : CPObject +@implementation CPOperation : CPObject { CPArray operations; BOOL _cancelled; @@ -75,15 +75,14 @@ CPOperationQueuePriorityVeryHigh = 8; CPArray _dependencies; } - -- (void)main +- (void)main { // should be overridden in child class } -- (id)init +- (id)init { - if (self = [super init]) + if (self = [super init]) { _cancelled = NO; _executing = NO; @@ -98,15 +97,15 @@ CPOperationQueuePriorityVeryHigh = 8; /*! Starts the operation (runs the main method), sets all the status flags and runs the completion function if it's set */ -- (void)start +- (void)start { - if (!_cancelled) + if (!_cancelled) { [self willChangeValueForKey:@"isExecuting"]; _executing = YES; [self didChangeValueForKey:@"isExecuting"]; [self main]; - if (_completionFunction) + if (_completionFunction) { _completionFunction(); } @@ -123,7 +122,7 @@ CPOperationQueuePriorityVeryHigh = 8; Indicates if this operation has been cancelled @return if this operation has been cancelled */ -- (BOOL)isCancelled +- (BOOL)isCancelled { return _cancelled; } @@ -132,7 +131,7 @@ CPOperationQueuePriorityVeryHigh = 8; Indicates if this operation is currently executing @return if this operation is currently executing */ -- (BOOL)isExecuting +- (BOOL)isExecuting { return _executing; } @@ -141,7 +140,7 @@ CPOperationQueuePriorityVeryHigh = 8; Indicates if this operation has finished running @return if this operation has finished running */ -- (BOOL)isFinished +- (BOOL)isFinished { return _finished; } @@ -150,7 +149,7 @@ CPOperationQueuePriorityVeryHigh = 8; Just added for Cocoa compatibility @return always false */ -- (BOOL)isConcurrent +- (BOOL)isConcurrent { return NO; } @@ -159,8 +158,8 @@ CPOperationQueuePriorityVeryHigh = 8; Indicates if this operation is ready to be executed. Takes the "isFinished" state of dependent operations into account @return if this operation is ready to run */ -- (BOOL)isReady -{ +- (BOOL)isReady +{ return _ready; } @@ -168,7 +167,7 @@ CPOperationQueuePriorityVeryHigh = 8; The JS function that should be run after the main method @return JS function */ -- (JSObject)completionFunction +- (JSObject)completionFunction { return _completionFunction; } @@ -176,7 +175,7 @@ CPOperationQueuePriorityVeryHigh = 8; /*! Sets the JS function that should be run after the main method */ -- (void)setCompletionFunction:(JSObject)aJavaScriptFunction +- (void)setCompletionFunction:(JSObject)aJavaScriptFunction { _completionFunction = aJavaScriptFunction; } @@ -185,7 +184,7 @@ CPOperationQueuePriorityVeryHigh = 8; Makes the receiver dependent on the completion of the specified operation. @param anOperation the operation that the receiver should depend on */ -- (void)addDependency:(CPOperation)anOperation +- (void)addDependency:(CPOperation)anOperation { [self willChangeValueForKey:@"dependencies"]; [anOperation addObserver:self @@ -201,12 +200,12 @@ CPOperationQueuePriorityVeryHigh = 8; Removes the receiver’s dependence on the specified operation. @param anOperation the operation that the receiver should no longer depend on */ -- (void)removeDependency:(CPOperation)anOperation +- (void)removeDependency:(CPOperation)anOperation { [self willChangeValueForKey:@"dependencies"]; [_dependencies removeObject:anOperation]; [anOperation removeObserver:self - forKeyPath:@"isFinished"]; + forKeyPath:@"isFinished"]; [self didChangeValueForKey:@"dependencies"]; [self _updateIsReadyState]; } @@ -215,7 +214,7 @@ CPOperationQueuePriorityVeryHigh = 8; The operations that the receiver depends on @return array of operations */ -- (CPArray)dependencies +- (CPArray)dependencies { return _dependencies; } @@ -223,14 +222,14 @@ CPOperationQueuePriorityVeryHigh = 8; /*! Just added for Cocoa compatibility, doesn't do anything */ -- (void)waitUntilFinished +- (void)waitUntilFinished { } /*! Advises the operation object that it should stop executing its task. */ -- (void)cancel +- (void)cancel { [self willChangeValueForKey:@"isCancelled"]; _cancelled = YES; @@ -241,7 +240,7 @@ CPOperationQueuePriorityVeryHigh = 8; Sets the priority of the operation when used in an operation queue. @param priority the priority */ -- (void)setQueuePriority:(int)priority +- (void)setQueuePriority:(int)priority { _queuePriority = priority; } @@ -250,7 +249,7 @@ CPOperationQueuePriorityVeryHigh = 8; The priority of the operation when used in an operation queue. @return the priority */ -- (int)queuePriority +- (int)queuePriority { return _queuePriority; } @@ -261,28 +260,28 @@ CPOperationQueuePriorityVeryHigh = 8; change:(CPDictionary)change context:(void)context { - if (keyPath == @"isFinished") + if (keyPath == @"isFinished") { [self _updateIsReadyState]; } } -- (void)_updateIsReadyState +- (void)_updateIsReadyState { var newReady = YES; - if (_dependencies && [_dependencies count] > 0) + if (_dependencies && [_dependencies count] > 0) { var i = 0; - for (i = 0; i < [_dependencies count]; i++) + for (i = 0; i < [_dependencies count]; i++) { - if (![[_dependencies objectAtIndex:i] isFinished]) + if (![[_dependencies objectAtIndex:i] isFinished]) { newReady = NO; } } } - - if (newReady != _ready) + + if (newReady != _ready) { [self willChangeValueForKey:@"isReady"]; _ready = newReady; diff --git a/Foundation/CPOperationQueue.j b/Foundation/CPOperationQueue.j index ac4e4842b..b849cdd43 100644 --- a/Foundation/CPOperationQueue.j +++ b/Foundation/CPOperationQueue.j @@ -19,29 +19,29 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import -@import "CPOperation.j" -@import "CPInvocationOperation.j" @import "CPFunctionOperation.j" +@import "CPInvocationOperation.j" +@import "CPObject.j" +@import "CPOperation.j" // the global queue (mainQueue) var cpOperationMainQueue = nil; -/*! +/*! @class CPOperationQueue @brief Represents an operation queue that can run CPOperations */ -@implementation CPOperationQueue : CPObject +@implementation CPOperationQueue : CPObject { CPArray _operations; BOOL _suspended; CPString _name @accessors(property=name); - CPTimer _timer; + CPTimer _timer; } -- (id)init +- (id)init { - if (self = [super init]) + if (self = [super init]) { _operations = [[CPArray alloc] init]; _suspended = NO; @@ -55,35 +55,37 @@ var cpOperationMainQueue = nil; return self; } -- (void)_runNextOpsInQueue +- (void)_runNextOpsInQueue { - if (!_suspended && [self operationCount] > 0) + if (!_suspended && [self operationCount] > 0) { - var i = 0; - for (i = 0; i < [_operations count]; i++) + var i = 0, + count = [_operations count]; + + for (; i < count; i++) { var op = [_operations objectAtIndex:i]; - if ([op isReady] && ![op isCancelled] && ![op isFinished] && ![op isExecuting]) + if ([op isReady] && ![op isCancelled] && ![op isFinished] && ![op isExecuting]) { [op start]; - } + } } } } -- (void)_enableTimer:(BOOL)enable +- (void)_enableTimer:(BOOL)enable { - if (!enable) + if (!enable) { - if (_timer) + if (_timer) { [_timer invalidate]; _timer = nil; } - } - else + } + else { - if (!_timer) + if (!_timer) { _timer = [CPTimer scheduledTimerWithTimeInterval:0.01 target:self @@ -98,7 +100,7 @@ var cpOperationMainQueue = nil; Adds the specified operation object to the receiver. @param anOperation the operation that should be scheduled for execution */ -- (void)addOperation:(CPOperation)anOperation +- (void)addOperation:(CPOperation)anOperation { [self willChangeValueForKey:@"operations"]; [self willChangeValueForKey:@"operationCount"]; @@ -112,70 +114,72 @@ var cpOperationMainQueue = nil; Adds the specified array of operations to the queue. @param ops The array of CPOperation objects that you want to add to the receiver. @param wait If YES, the method only returns once all of the specified operations finish executing. If NO, the operations are added to the queue and control returns immediately to the caller. -*/ -- (void)addOperations:(CPArray)ops waitUntilFinished:(BOOL)wait +*/ +- (void)addOperations:(CPArray)ops waitUntilFinished:(BOOL)wait { - if (ops) + if (ops) { - if (wait) + if (wait) { [self _sortOpsByPriority:ops]; [self _runOpsSynchronously:ops]; - } - + } + [_operations addObjectsFromArray:ops]; [self _sortOpsByPriority:_operations]; - } + } } /*! Wraps the given js function in a CPOperation and adds it to the queue @param aFunction the JS function to add */ -- (void)addOperationWithFunction:(JSObject)aFunction +- (void)addOperationWithFunction:(JSObject)aFunction { [self addOperation:[CPFunctionOperation functionOperationWithFunction:aFunction]]; } -- (CPArray)operations +- (CPArray)operations { return _operations; } -- (int)operationCount +- (int)operationCount { - if (_operations) + if (_operations) { return [_operations count]; } - + return 0; } /*! Cancels all queued and executing operations. */ -- (void)cancelAllOperations +- (void)cancelAllOperations { - if (_operations) + if (_operations) { - var i = 0; - for (i = 0; i < [_operations count]; i++) - { - [[_operations objectAtIndex:i] cancel]; - } + var i = 0, + count = [_operations count]; + + for (; i < count; i++) + { + [[_operations objectAtIndex:i] cancel]; + } } } /*! Blocks until all of the receiver’s queued and executing operations finish executing. */ -- (void)waitUntilAllOperationsAreFinished +- (void)waitUntilAllOperationsAreFinished { // lets first stop the timer so it won't interfere [self _enableTimer:NO]; [self _runOpsSynchronously:_operations]; - if (!_suspended) + if (!_suspended) { [self _enableTimer:YES]; } @@ -186,7 +190,7 @@ var cpOperationMainQueue = nil; Returns the maximum number of concurrent operations that the receiver can execute. Always returns 1 because JS doesn't have threads */ -- (int)maxConcurrentOperationCount +- (int)maxConcurrentOperationCount { return 1; } @@ -195,7 +199,7 @@ var cpOperationMainQueue = nil; Modifies the execution of pending operations @param suspend if YES, queue execution is suspended. If NO, it is resumed */ -- (void)setSuspended:(BOOL)suspend +- (void)setSuspended:(BOOL)suspend { _suspended = suspend; [self _enableTimer:!suspend]; @@ -204,62 +208,64 @@ var cpOperationMainQueue = nil; /*! Returns a Boolean value indicating whether the receiver is scheduling queued operations for execution. */ -- (BOOL)isSuspended +- (BOOL)isSuspended { return _suspended; } -- (void)_sortOpsByPriority:(CPArray)someOps +- (void)_sortOpsByPriority:(CPArray)someOps { - if (someOps) + if (someOps) { - [someOps sortUsingFunction:function(lhs, rhs) + [someOps sortUsingFunction:function(lhs, rhs) { - if ([lhs queuePriority] < [rhs queuePriority]) + if ([lhs queuePriority] < [rhs queuePriority]) { return 1; - } - else + } + else { - if ([lhs queuePriority] > [rhs queuePriority]) + if ([lhs queuePriority] > [rhs queuePriority]) { return -1; - } - else + } + else { return 0; } } - } + } context:nil]; } } -- (void)_runOpsSynchronously:(CPArray)ops +- (void)_runOpsSynchronously:(CPArray)ops { - if (ops) + if (ops) { var keepGoing = YES; - while (keepGoing) + while (keepGoing) { - var i = 0; + var i = 0, + count = [ops count]; + keepGoing = NO; - + // start the ones that are ready - for (i = 0; i < [ops count]; i++) + for (; i < count; i++) { var op = [ops objectAtIndex:i]; - if ([op isReady] && ![op isCancelled] && ![op isFinished] && ![op isExecuting]) + if ([op isReady] && ![op isCancelled] && ![op isFinished] && ![op isExecuting]) { [op start]; - } + } } - + // make sure they are all done - for (i = 0; i < [ops count]; i++) + for (i = 0; i < count; i++) { var op = [ops objectAtIndex:i]; - if (![op isFinished] && ![op isCancelled]) + if (![op isFinished] && ![op isCancelled]) { keepGoing = YES; } @@ -271,23 +277,23 @@ var cpOperationMainQueue = nil; /*! Convenience method for one system wide singelton queue. Returns the same queue as currentQueue. */ -+ (CPOperationQueue)mainQueue ++ (CPOperationQueue)mainQueue { - if (!cpOperationMainQueue) + if (!cpOperationMainQueue) { cpOperationMainQueue = [[CPOperationQueue alloc] init]; [cpOperationMainQueue setName:@"main"]; } - + return cpOperationMainQueue; } /*! Convenience method for one system wide singelton queue. Returns the same queue as mainQueue. */ -+ (CPOperationQueue)currentQueue ++ (CPOperationQueue)currentQueue { return [CPOperationQueue mainQueue]; } -@end \ No newline at end of file +@end diff --git a/Foundation/CPProxy.j b/Foundation/CPProxy.j index 2d5fba736..2b4054c83 100644 --- a/Foundation/CPProxy.j +++ b/Foundation/CPProxy.j @@ -133,7 +133,7 @@ return [invocation returnValue]; } --(BOOL)isMemberOfClass:(Class)aClass +- (BOOL)isMemberOfClass:(Class)aClass { var signature = [self methodSignatureForSelector:_cmd], invocation = [CPInvocation invocationWithMethodSignature:signature]; diff --git a/Foundation/CPRange.j b/Foundation/CPRange.j index 6a0b1b5ce..b91a878d3 100755 --- a/Foundation/CPRange.j +++ b/Foundation/CPRange.j @@ -105,7 +105,7 @@ function CPLocationInRange(aLocation, aRange) } /*! - Creates a new range with the minimum \c location and a \c length + Creates a new range with the minimum \c location and a \c length that extends to the maximum \c length. @param lhsRange the first CPRange @param rhsRange the second CPRange @@ -129,7 +129,7 @@ function CPIntersectionRange(lhsRange, rhsRange) { if(CPMaxRange(lhsRange) < rhsRange.location || CPMaxRange(rhsRange) < lhsRange.location) return CPMakeRange(0, 0); - + var location = MAX(lhsRange.location, rhsRange.location); return CPMakeRange(location, MIN(CPMaxRange(lhsRange), CPMaxRange(rhsRange)) - location); } @@ -166,10 +166,11 @@ function CPStringFromRange(aRange) function CPRangeFromString(aString) { var comma = aString.indexOf(','); - + return { location:parseInt(aString.substr(1, comma - 1)), length:parseInt(aString.substring(comma + 1, aString.length)) }; } /*! @} */ + diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j index 95ea272bd..89ad9337a 100644 --- a/Foundation/CPRunLoop.j +++ b/Foundation/CPRunLoop.j @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPArray.j" +@import "CPObject.j" @import "CPString.j" /*! @@ -53,7 +53,7 @@ var _CPRunLoopPerformPool = [], { if (!aPerform || _CPRunLoopPerformPool.length >= _CPRunLoopPerformPoolCapacity) return; - + _CPRunLoopPerformPool.push(aPerform); } @@ -62,24 +62,24 @@ var _CPRunLoopPerformPool = [], if (_CPRunLoopPerformPool.length) { var perform = _CPRunLoopPerformPool.pop(); - + perform._target = aTarget; perform._selector = aSelector; perform._argument = anArgument; perform._order = anOrder; perform._runLoopModes = modes; perform._isValid = YES; - + return perform; } - + return [[self alloc] initWithSelector:aSelector target:aTarget argument:anArgument order:anOrder modes:modes]; } - (id)initWithSelector:(SEL)aSelector target:(SEL)aTarget argument:(id)anArgument order:(unsigned)anOrder modes:(CPArray)modes { self = [super init]; - + if (self) { _selector = aSelector; @@ -89,7 +89,7 @@ var _CPRunLoopPerformPool = [], _runLoopModes = modes; _isValid = YES; } - + return self; } @@ -117,14 +117,14 @@ var _CPRunLoopPerformPool = [], { if (!_isValid) return YES; - + if ([_runLoopModes containsObject:aRunLoopMode]) { [_target performSelector:_selector withObject:_argument]; - + return YES; } - + return NO; } @@ -174,16 +174,16 @@ var CPRunLoopLastNativeRunLoop = 0; - (id)init { self = [super init]; - + if (self) { _orderedPerforms = []; - + _timersForModes = {}; _nativeTimersForModes = {}; _nextTimerFireDatesForModes = {}; } - + return self; } @@ -220,7 +220,7 @@ var CPRunLoopLastNativeRunLoop = 0; while (count--) if (anOrder < [_orderedPerforms[count] order]) break; - + _orderedPerforms.splice(count + 1, 0, perform); } @@ -233,11 +233,11 @@ var CPRunLoopLastNativeRunLoop = 0; - (void)cancelPerformSelector:(SEL)aSelector target:(id)aTarget argument:(id)anArgument { var count = _orderedPerforms.length; - + while (count--) { var perform = _orderedPerforms[count]; - + if ([perform selector] === aSelector && [perform target] == aTarget && [perform argument] == anArgument) [_orderedPerforms[count] invalidate]; } @@ -261,12 +261,12 @@ var CPRunLoopLastNativeRunLoop = 0; _timersForModes[aMode].push(aTimer); else _timersForModes[aMode] = [aTimer]; - + _didAddTimer = YES; - + if (!aTimer._lastNativeRunLoopsForModes) aTimer._lastNativeRunLoopsForModes = {}; - + aTimer._lastNativeRunLoopsForModes[aMode] = CPRunLoopLastNativeRunLoop; @@ -305,96 +305,96 @@ var CPRunLoopLastNativeRunLoop = 0; var now = _effectiveDate ? [_effectiveDate laterDate:[CPDate date]] : [CPDate date], nextFireDate = nil, nextTimerFireDate = _nextTimerFireDatesForModes[aMode]; - + // Perform Timers if necessary if (_didAddTimer || nextTimerFireDate && nextTimerFireDate <= now) { _didAddTimer = NO; - + // Cancel existing window.setTimeout if (_nativeTimersForModes[aMode] !== nil) { window.clearNativeTimeout(_nativeTimersForModes[aMode]); - + _nativeTimersForModes[aMode] = nil; } - + // Empty timers to avoid catastrophe if a timer is added during a timer fire. var timers = _timersForModes[aMode], index = timers.length; - + _timersForModes[aMode] = nil; - - // Loop through timers looking for ones that had fired + + // Loop through timers looking for ones that had fired while (index--) { var timer = timers[index]; - + if (timer._lastNativeRunLoopsForModes[aMode] < CPRunLoopLastNativeRunLoop && timer._isValid && timer._fireDate <= now) [timer fire]; - + // Timer may or may not still be valid if (timer._isValid) nextFireDate = (nextFireDate === nil) ? timer._fireDate : [nextFireDate earlierDate:timer._fireDate]; - + else { // FIXME: Is there an issue with reseting the fire date in -fire? or adding it back to the run loop?... timer._lastNativeRunLoopsForModes[aMode] = 0; - + timers.splice(index, 1); } } - + // Timers may have been added during the firing of timers - // They do NOT get a shot at firing, because they certainly + // They do NOT get a shot at firing, because they certainly // haven't gone through one native timer. var newTimers = _timersForModes[aMode]; - + if (newTimers && newTimers.length) { index = newTimers.length; - + while (index--) { var timer = newTimers[index]; - + if ([timer isValid]) nextFireDate = (nextFireDate === nil) ? timer._fireDate : [nextFireDate earlierDate:timer._fireDate]; else newTimers.splice(index, 1); } - + _timersForModes[aMode] = newTimers.concat(timers); } else _timersForModes[aMode] = timers; - + _nextTimerFireDatesForModes[aMode] = nextFireDate; - + //initiate a new window.setTimeout if there are any timers if (_nextTimerFireDatesForModes[aMode] !== nil) _nativeTimersForModes[aMode] = window.setNativeTimeout(function() { _effectiveDate = nextFireDate; _nativeTimersForModes[aMode] = nil; ++CPRunLoopLastNativeRunLoop; [self limitDateForMode:aMode]; _effectiveDate = nil; }, MAX(0, [nextFireDate timeIntervalSinceNow] * 1000)); } - + // Run loop performers var performs = _orderedPerforms, index = performs.length; - + _orderedPerforms = []; - + while (index--) { var perform = performs[index]; - + if ([perform fireInMode:CPDefaultRunLoopMode]) { [_CPRunLoopPerform _poolPerform:perform]; - + performs.splice(index, 1); } } - + if (_orderedPerforms.length) { _orderedPerforms = _orderedPerforms.concat(performs); @@ -402,9 +402,9 @@ var CPRunLoopLastNativeRunLoop = 0; } else _orderedPerforms = performs; - + _runLoopLock = NO; - + return nextFireDate; } diff --git a/Foundation/CPSet.j b/Foundation/CPSet.j index ad596c0fd..0a1e5f821 100644 --- a/Foundation/CPSet.j +++ b/Foundation/CPSet.j @@ -24,10 +24,10 @@ * TODO: Needs to implement CPCoding, CPCopying. */ -@import "CPObject.j" @import "CPArray.j" -@import "CPNumber.j" @import "CPEnumerator.j" +@import "CPNumber.j" +@import "CPObject.j" /*! @class CPSet @@ -87,7 +87,7 @@ argLength = arguments.length, i = 2; - for(; i < argLength && ((argument = arguments[i]) !== nil); ++i) + for (; i < argLength && ((argument = arguments[i]) !== nil); ++i) [set addObject:argument]; return set; @@ -155,7 +155,7 @@ var argLength = arguments.length, i = 2; - for(; i < argLength && (argument = arguments[i]) != nil; ++i) + for (; i < argLength && (argument = arguments[i]) != nil; ++i) [self addObject:argument]; } @@ -180,9 +180,10 @@ if (!aSet) return self; - var contents = aSet._contents; + var contents = aSet._contents, + property; - for (var property in contents) + for (property in contents) { if (contents.hasOwnProperty(property)) { @@ -201,9 +202,10 @@ */ - (CPArray)allObjects { - var array = []; + var array = [], + property; - for (var property in _contents) + for (property in _contents) { if (_contents.hasOwnProperty(property)) array.push(_contents[property]); @@ -217,7 +219,9 @@ */ - (id)anyObject { - for (var property in _contents) + var property; + + for (property in _contents) { if (_contents.hasOwnProperty(property)) return _contents[property]; @@ -288,8 +292,11 @@ */ - (BOOL)isSubsetOfSet:(CPSet)set { - var items = [self allObjects]; - for (var i = 0; i < items.length; i++) + var items = [self allObjects], + i = 0, + count = items.length; + + for (; i < count; i++) { // If at least one item is not in both sets, self isn't a subset if (![set containsObject:items[i]]) @@ -315,8 +322,11 @@ */ - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument { - var items = [self allObjects]; - for (var i = 0; i < items.length; i++) + var items = [self allObjects], + i = 0, + count = items.length; + + for (; i < count; i++) { [items[i] performSelector:aSelector withObject:argument]; } @@ -432,8 +442,11 @@ */ - (void)intersectSet:(CPSet)set { - var items = [self allObjects]; - for (var i = 0, count = items.length; i < count; i++) + var items = [self allObjects], + i = 0, + count = items.length; + + for (; i < count; i++) { if (![set containsObject:items[i]]) [self removeObject:items[i]]; @@ -446,8 +459,11 @@ */ - (void)minusSet:(CPSet)set { - var items = [set allObjects]; - for (var i = 0; i < items.length; i++) + var items = [set allObjects], + i = 0, + count = items.length; + + for (; i < count; i++) { if ([self containsObject:items[i]]) [self removeObject:items[i]]; @@ -460,8 +476,11 @@ */ - (void)unionSet:(CPSet)set { - var items = [set allObjects]; - for (var i = 0, count = items.length; i < count; i++) + var items = [set allObjects], + i = 0, + count = items.length; + + for (; i < count; i++) { [self addObject:items[i]]; } @@ -514,5 +533,5 @@ var CPSetObjectsKey = @"CPSetObjectsKey"; */ @implementation CPMutableSet : CPSet -@end +@end diff --git a/Foundation/CPSortDescriptor.j b/Foundation/CPSortDescriptor.j index c7d29f16a..8c246bd4c 100755 --- a/Foundation/CPSortDescriptor.j +++ b/Foundation/CPSortDescriptor.j @@ -43,7 +43,7 @@ CPOrderedSame = 0; */ CPOrderedDescending = 1; -/*! +/*! @class CPSortDescriptor @ingroup foundation @brief Holds attributes necessary to describe how to sort a set of objects. @@ -85,20 +85,20 @@ CPOrderedDescending = 1; Initializes the sort descriptor @param aKey the property key path to sort @param isAscending the sort order - @param aSelector this method gets called to compare objects. The method will take one argument + @param aSelector this method gets called to compare objects. The method will take one argument (the object to compare against itself, and must return a CPComparisonResult. */ - (id)initWithKey:(CPString)aKey ascending:(BOOL)isAscending selector:(SEL)aSelector { self = [super init]; - + if (self) { _key = aKey; _ascending = isAscending; _selector = aSelector; } - + return self; } @@ -150,9 +150,9 @@ CPOrderedDescending = 1; @end -var CPSortDescriptorKeyKey = @"CPSortDescriptorKeyKey", // Don't you just love naming schemes ;) - CPSortDescriptorAscendingKey = @"CPSortDescriptorAscendingKey", - CPSortDescriptorSelectorKey = @"CPSortDescriptorSelectorKey"; +var CPSortDescriptorKeyKey = @"CPSortDescriptorKeyKey", // Don't you just love naming schemes ;) + CPSortDescriptorAscendingKey = @"CPSortDescriptorAscendingKey", + CPSortDescriptorSelectorKey = @"CPSortDescriptorSelectorKey"; @implementation CPSortDescriptor (CPCoding) @@ -164,7 +164,7 @@ var CPSortDescriptorKeyKey = @"CPSortDescriptorKeyKey", // Don't you just love n _ascending = [aCoder decodeBoolForKey:CPSortDescriptorAscendingKey]; _selector = CPSelectorFromString([aCoder decodeObjectForKey:CPSortDescriptorSelectorKey]); } - + return self; } @@ -176,4 +176,3 @@ var CPSortDescriptorKeyKey = @"CPSortDescriptorKeyKey", // Don't you just love n } @end - diff --git a/Foundation/CPString.j b/Foundation/CPString.j index 51154a43c..abbe70c2d 100644 --- a/Foundation/CPString.j +++ b/Foundation/CPString.j @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPException.j" +@import "CPObject.j" @import "CPSortDescriptor.j" @import "CPValue.j" @@ -65,7 +65,7 @@ var CPStringRegexSpecialCharacters = [ CPStringRegexEscapeExpression = new RegExp("(\\" + CPStringRegexSpecialCharacters.join("|\\") + ")", 'g'), CPStringRegexTrimWhitespace = new RegExp("(^\\s+|\\s+$)", 'g'); -/*! +/*! @class CPString @ingroup foundation @brief An immutable string (collection of characters). @@ -103,7 +103,7 @@ var CPStringRegexSpecialCharacters = [ + (id)stringWithHash:(unsigned)aHash { var hashString = parseInt(aHash, 10).toString(16); - return "000000".substring(0, MAX(6-hashString.length, 0)) + hashString; + return "000000".substring(0, MAX(6 - hashString.length, 0)) + hashString; } /*! @@ -147,7 +147,7 @@ var CPStringRegexSpecialCharacters = [ } /*! - Creates a new string using C printf-style formatting. First argument should be a constant format string, + Creates a new string using C printf-style formatting. First argument should be a constant format string, like ' "float val = %f" ', remaining arguments should be the variables to print the values of, comma-separated. @param format the format to be used, printf-style @return the initialized CPString @@ -238,8 +238,8 @@ var CPStringRegexSpecialCharacters = [ while ((difference -= substring.length) >= 0) string += substring; - - if (-difference < substring.length) + + if (-difference < substring.length) string += substring.substring(0, -difference); return string; @@ -329,7 +329,7 @@ var CPStringRegexSpecialCharacters = [ /*! Finds the range of characters in the receiver - where the specified string exists in the given range + where the specified string exists in the given range of the receiver.The search is subject to the options specified in the specified mask which can be a combination of:
@@ -374,7 +374,7 @@ var CPStringRegexSpecialCharacters = [
 }
 
 /*!
-    Returns a new string in which all occurrences of a target string in the reciever are replaced by 
+    Returns a new string in which all occurrences of a target string in the reciever are replaced by
     another given string.
     @param target The string to replace.
     @param replacement the string with which to replace the \c target
@@ -403,7 +403,7 @@ var CPStringRegexSpecialCharacters = [
         regExp;
 
     if (options & CPCaseInsensitiveSearch)
-        regExp = new RegExp(target, "gi"); 
+        regExp = new RegExp(target, "gi");
     else
         regExp = new RegExp(target, "g");
 
@@ -411,7 +411,7 @@ var CPStringRegexSpecialCharacters = [
 }
 
 /*
-   Returns a new string in which the characters in a specified range of the receiver 
+   Returns a new string in which the characters in a specified range of the receiver
    are replaced by a given string.
    @param range A range of characters in the receiver.
    @param replacement The string with which to replace the characters in \c range.
@@ -442,7 +442,6 @@ var CPStringRegexSpecialCharacters = [
     return [self compare:aString options:nil];
 }
 
-
 /*
     Compares the receiver to the specified string.
     @param aString the string with which to compare
@@ -463,18 +462,18 @@ var CPStringRegexSpecialCharacters = [
 {
     var lhs = self,
         rhs = aString;
-    
+
     if (aMask & CPCaseInsensitiveSearch)
     {
         lhs = lhs.toLowerCase();
         rhs = rhs.toLowerCase();
     }
-    
+
     if (lhs < rhs)
         return CPOrderedAscending;
     else if (lhs > rhs)
         return CPOrderedDescending;
-    
+
     return CPOrderedSame;
 }
 
@@ -559,7 +558,7 @@ var CPStringRegexSpecialCharacters = [
         lhs = self,
         rhs = aString,
         min = MIN([lhs length], [rhs length]);
-    
+
     if (aMask & CPCaseInsensitiveSearch)
     {
         lhs = [lhs lowercaseString];
@@ -580,10 +579,13 @@ var CPStringRegexSpecialCharacters = [
 */
 - (CPString)capitalizedString
 {
-    var parts = self.split(/\b/g); // split on word boundaries
-    for (var i = 0; i < parts.length; i++)
+    var parts = self.split(/\b/g), // split on word boundaries
+        i = 0,
+        count = parts.length;
+
+    for (; i < count; i++)
     {
-        if (i == 0 || (/\s$/).test(parts[i-1])) // only capitalize if previous token was whitespace
+        if (i == 0 || (/\s$/).test(parts[i - 1])) // only capitalize if previous token was whitespace
             parts[i] = parts[i].substring(0, 1).toUpperCase() + parts[i].substring(1).toLowerCase();
         else
             parts[i] = parts[i].toLowerCase();
@@ -615,8 +617,8 @@ var CPStringRegexSpecialCharacters = [
     return parseFloat(self, 10);
 }
 /*!
-    Returns \c YES on encountering one of "Y", "y", "T", "t", or 
-    a digit 1-9. Returns \c NO otherwise. This method skips the initial 
+    Returns \c YES on encountering one of "Y", "y", "T", "t", or
+    a digit 1-9. Returns \c NO otherwise. This method skips the initial
     whitespace characters, +,- followed by Zeroes.
 */
 
@@ -678,7 +680,7 @@ var CPStringRegexSpecialCharacters = [
 - (CPString)lastPathComponent
 {
     var components = [self pathComponents];
-    return components[components.length -1];
+    return components[components.length - 1];
 }
 
 /*!
@@ -690,12 +692,12 @@ var CPStringRegexSpecialCharacters = [
 {
     var path = self,
         start = length - 1;
-    
+
     while (path.charAt(start) === '/')
         start--;
-    
+
     path = path.substr(0, path.lastIndexOf('/', start));
-    
+
     if (path === "" && charAt(0) === '/')
         return '/';
 
@@ -758,11 +760,12 @@ var CPStringRegexSpecialCharacters = [
 */
 + (CPString)UUID
 {
-    var g = @"";
-    
-    for(var i = 0; i < 32; i++)
+    var g = @"",
+        i = 0;
+
+    for (; i < 32; i++)
         g += FLOOR(RAND() * 0xF).toString(0xF);
-    
+
     return g;
 }
 
diff --git a/Foundation/CPTimer.j b/Foundation/CPTimer.j
index e1ec83ce5..6e14ba46a 100644
--- a/Foundation/CPTimer.j
+++ b/Foundation/CPTimer.j
@@ -20,13 +20,14 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-@import "CPObject.j"
-@import "CPInvocation.j"
 @import "CPDate.j"
+@import "CPInvocation.j"
+@import "CPObject.j"
 @import "CPRunLoop.j"
 
+
 /*!
-    @class CPTimer 
+    @class CPTimer
     @ingroup foundation
 
     @brief A timer object that can send a message after the given time interval.
@@ -36,7 +37,7 @@
     CPTimeInterval      _timeInterval;
     CPInvocation        _invocation;
     Function            _callback;
-    
+
     BOOL                _repeats;
     BOOL                _isValid;
     CPDate              _fireDate;
@@ -46,13 +47,13 @@
 /*!
     Returns a new NSTimer object and adds it to the current NSRunLoop object in the default mode.
 */
-+ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat 
++ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
 {
     var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat];
 
     //add to the runloop
     [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
-    
+
     return timer;
 }
 
@@ -65,27 +66,27 @@
 
     //add to the runloop
     [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
-        
+
     return timer;
 }
 
 /*!
     Returns a new NSTimer object and adds it to the current NSRunLoop object in the default mode.
 */
-+ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat 
++ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
 {
     var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat];
 
     //add to the runloop
     [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
-    
+
     return timer;
 }
 
 /*!
     Returns a new NSTimer that, when added to a run loop, will fire after seconds.
 */
-+ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat 
++ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
 {
     return [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat];
 }
@@ -101,7 +102,7 @@
 /*!
     Returns a new NSTimer that, when added to a run loop, will fire after seconds.
 */
-+ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat 
++ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
 {
     return [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat];
 }
@@ -112,8 +113,8 @@
 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
 {
     self = [super init];
-    
-    if (self) 
+
+    if (self)
     {
         _timeInterval = seconds;
         _invocation = anInvocation;
@@ -121,7 +122,7 @@
         _isValid = YES;
         _fireDate = aDate;
     }
-    
+
     return self;
 }
 
@@ -131,16 +132,16 @@
 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
 {
     var invocation = [CPInvocation invocationWithMethodSignature:1];
-    
+
     [invocation setTarget:aTarget];
     [invocation setSelector:aSelector];
     [invocation setArgument:self atIndex:2];
-    
+
     self = [self initWithFireDate:aDate interval:seconds invocation:invocation repeats:shouldRepeat];
 
     if (self)
         _userInfo = userInfo;
-        
+
     return self;
 }
 
@@ -150,8 +151,8 @@
 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
 {
     self = [super init];
-    
-    if (self) 
+
+    if (self)
     {
         _timeInterval = seconds;
         _callback = aFunction;
@@ -159,14 +160,14 @@
         _isValid = YES;
         _fireDate = aDate;
     }
-    
+
     return self;
 }
 
 /*!
     Returns the receiver’s time interval.
 */
-- (CPTimeInterval)timeInterval 
+- (CPTimeInterval)timeInterval
 {
    return _timeInterval;
 }
@@ -174,15 +175,15 @@
 /*!
     Returns the date at which the receiver will fire.
 */
-- (CPDate)fireDate 
+- (CPDate)fireDate
 {
-   return _fireDate;  
+   return _fireDate;
 }
 
 /*!
     Resets the receiver to fire next at a given date.
 */
-- (void)setFireDate:(CPDate)aDate 
+- (void)setFireDate:(CPDate)aDate
 {
     _fireDate = aDate;
 }
@@ -205,7 +206,7 @@
 
     if (_repeats)
         _fireDate = [CPDate dateWithTimeIntervalSinceNow:_timeInterval];
-    
+
     else
         [self invalidate];
 }
@@ -213,7 +214,7 @@
 /*!
     Returns a Boolean value that indicates whether the receiver is currently valid.
 */
-- (BOOL)isValid 
+- (BOOL)isValid
 {
    return _isValid;
 }
@@ -221,7 +222,7 @@
 /*!
     Stops the receiver from ever firing again and requests its removal from its NSRunLoop object.
 */
-- (void)invalidate 
+- (void)invalidate
 {
    _isValid = NO;
    _userInfo = nil;
@@ -246,14 +247,14 @@ var _CPTimerBridgeTimer = function(codeOrFunction, aDelay, shouldRepeat, functio
 {
     var timeoutID = CPTimersTimeoutID++,
         theFunction = nil;
-        
+
     if (typeof codeOrFunction === "string")
         theFunction = function() { new Function(codeOrFunction)(); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
     else
     {
         if (!functionArgs)
             functionArgs = [];
-        
+
         theFunction = function() { codeOrFunction.apply(window, functionArgs); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
     }
 
@@ -270,10 +271,10 @@ window.setTimeout = function(codeOrFunction, aDelay)
 window.clearTimeout = function(aTimeoutID)
 {
     var timer = CPTimersForTimeoutIDs[aTimeoutID];
-    
+
     if (timer)
         [timer invalidate];
-        
+
     CPTimersForTimeoutIDs[aTimeoutID] = nil;
 }
 
diff --git a/Foundation/CPURL.j b/Foundation/CPURL.j
index dc240fbaa..1486baad3 100644
--- a/Foundation/CPURL.j
+++ b/Foundation/CPURL.j
@@ -1,5 +1,26 @@
+/*
+ * CPURL.j
+ * Foundation
+ *
+ * Created by Francisco Tolmasky.
+ * Copyright 2008, 280 North, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
 
-@import 
+@import "CPObject.j"
 
 CPURLNameKey                        = @"CPURLNameKey";
 CPURLLocalizedNameKey               = @"CPURLLocalizedNameKey";
@@ -44,7 +65,7 @@ CPURLCustomIconKey                  = @"CPURLCustomIconKey";
 - (id)initWithScheme:(CPString)aScheme host:(CPString)aHost path:(CPString)aPath
 {
     var URLString = (aScheme ? aScheme + ":" : "") + (aHost ? aHost + "//" : "") + (aPath || "");
-    
+
     return [self initWithString:URLString];
 }
 
diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j
index 368173e34..d6f260226 100644
--- a/Foundation/CPURLConnection.j
+++ b/Foundation/CPURLConnection.j
@@ -31,45 +31,45 @@ var CPURLConnectionDelegate = nil;
 /*!
     @class CPURLConnection
     @ingroup foundation
-    @brief Provides loading of a URL request. 
+    @brief Provides loading of a URL request.
 
     An interface to downloading content at a specified URL. Using one of the
     class methods, you can obtain the data.
-    
+
     @delegate -(void)connection:(CPURLConnection)connection didFailWithError:(id)error;
     Called when the connection encounters an error.
     @param connection the connection that had an error
     @param error the error, which is either a javascript DOMException or an http
     status code (javascript number/CPNumber)
-    
+
     @delegate -(void)connection:(CPURLConnection)connection didReceiveResponse:(CPHTTPURLResponse)response;
     Called when the connection receives a response.
     @param connection the connection that received a response
     @param response the received response
-    
+
     @delegate -(void)connection:(CPURLConnection)connection didReceiveData:(CPString)data;
     Called when the connection has received data.
     @param connection the connection that received data
     @param data the received data
-    
+
     @delegate -(void)connectionDidFinishLoading:(CPURLConnection)connection;
     Called when the URL has finished loading.
     @param connection the connection that finished loading
-    
+
     Class Delegate Method:
-    
+
     @delegate -(void)connectionDidReceiveAuthenticationChallenge:(id)connection
     The class delegate allows you to set global behavior for when authentication challenges (401 status codes) are returned.
-    
+
     The recommended way to handle this method is to store a reference to the connection, and then use whatever
-    method you have to authenticate yourself.  Once you've authenticated yourself, you should cancel 
+    method you have to authenticate yourself.  Once you've authenticated yourself, you should cancel
     and then start the connection:
-    
+
 
 [connection cancel];
 [connection start];
 
- + @param connection the connection that received the authentication challenge. */ @implementation CPURLConnection : CPObject @@ -116,7 +116,7 @@ var CPURLConnectionDelegate = nil; catch (anException) { } - + return nil; } @@ -141,13 +141,13 @@ var CPURLConnectionDelegate = nil; - (id)initWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate startImmediately:(BOOL)shouldStartImmediately { self = [super init]; - + if (self) { _request = aRequest; _delegate = aDelegate; _isCanceled = NO; - + var URL = [_request URL], scheme = [URL scheme]; @@ -187,7 +187,7 @@ var CPURLConnectionDelegate = nil; _isCanceled = NO; try - { + { _HTTPRequest.open([_request HTTPMethod], [[_request URL] absoluteString], YES); _HTTPRequest.onreadystatechange = function() { [self _readyStateDidChange]; } @@ -214,7 +214,7 @@ var CPURLConnectionDelegate = nil; - (void)cancel { _isCanceled = YES; - + try { _HTTPRequest.abort(); @@ -240,10 +240,10 @@ var CPURLConnectionDelegate = nil; if (statusCode === 401 && [CPURLConnectionDelegate respondsToSelector:@selector(connectionDidReceiveAuthenticationChallenge:)]) [CPURLConnectionDelegate connectionDidReceiveAuthenticationChallenge:self]; - else + else { if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) - { + { if (_isLocalFileConnection) [_delegate connection:self didReceiveResponse:[[CPURLResponse alloc] initWithURL:URL]]; else @@ -290,4 +290,4 @@ var CPURLConnectionDelegate = nil; return [self _HTTPRequest]; } -@end \ No newline at end of file +@end diff --git a/Foundation/CPURLRequest.j b/Foundation/CPURLRequest.j index b18b9bd81..28b4e4dc4 100644 --- a/Foundation/CPURLRequest.j +++ b/Foundation/CPURLRequest.j @@ -23,7 +23,7 @@ @import "CPObject.j" -/*! +/*! @class CPURLRequest @ingroup foundation @brief Contains data obtained during a request made with CPURLConnection. @@ -34,7 +34,7 @@ @implementation CPURLRequest : CPObject { CPURL _URL; - + // FIXME: this should be CPData CPString _HTTPBody; CPString _HTTPMethod; @@ -59,7 +59,7 @@ - (id)initWithURL:(CPURL)aURL { self = [super init]; - + if (self) { [self setURL:aURL]; @@ -67,12 +67,12 @@ _HTTPBody = @""; _HTTPMethod = @"GET"; _HTTPHeaderFields = [CPDictionary dictionary]; - + [self setValue:"Thu, 01 Jan 1970 00:00:00 GMT" forHTTPHeaderField:"If-Modified-Since"]; [self setValue:"no-cache" forHTTPHeaderField:"Cache-Control"]; [self setValue:"XMLHttpRequest" forHTTPHeaderField:"X-Requested-With"]; } - + return self; } diff --git a/Foundation/CPURLResponse.j b/Foundation/CPURLResponse.j index ed524d940..6d0c0bf5e 100644 --- a/Foundation/CPURLResponse.j +++ b/Foundation/CPURLResponse.j @@ -44,10 +44,10 @@ - (id)initWithURL:(CPURL)aURL { self = [super init]; - + if (self) _URL = aURL; - + return self; } @@ -57,13 +57,13 @@ } /* Creating a Response -initWithURL:MIMEType:expectedContentLength:textEncodingName: +initWithURL:MIMEType:expectedContentLength:textEncodingName: Getting the Response Properties -expectedContentLength -suggestedFilename -MIMEType -textEncodingName -URL +expectedContentLength +suggestedFilename +MIMEType +textEncodingName +URL */ @end diff --git a/Foundation/CPUndoManager.j b/Foundation/CPUndoManager.j index 94b9f6516..f07247589 100644 --- a/Foundation/CPUndoManager.j +++ b/Foundation/CPUndoManager.j @@ -20,15 +20,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPInvocation.j" +@import "CPObject.j" @import "CPProxy.j" var CPUndoManagerNormal = 0, CPUndoManagerUndoing = 1, CPUndoManagerRedoing = 2; - + CPUndoManagerCheckpointNotification = @"CPUndoManagerCheckpointNotification"; CPUndoManagerDidOpenUndoGroupNotification = @"CPUndoManagerDidOpenUndoGroupNotification"; CPUndoManagerDidRedoChangeNotification = @"CPUndoManagerDidRedoChangeNotification"; @@ -53,7 +53,7 @@ var _CPUndoGroupingPool = [], { if (!anUndoGrouping || _CPUndoGroupingPool.length >= _CPUndoGroupingPoolCapacity) return; - + _CPUndoGroupingPool.push(anUndoGrouping); } @@ -62,28 +62,28 @@ var _CPUndoGroupingPool = [], if (_CPUndoGroupingPool.length) { var grouping = _CPUndoGroupingPool.pop(); - + grouping._parent = anUndoGrouping; - + if (grouping._invocations.length) grouping._invocations = []; - + return grouping; } - + return [[self alloc] initWithParent:anUndoGrouping]; } - (id)initWithParent:(_CPUndoGrouping)anUndoGrouping { self = [super init]; - + if (self) { _parent = anUndoGrouping; _invocations = []; } - + return self; } @@ -134,13 +134,13 @@ var _CPUndoGroupingParentKey = @"_CPUndoGroupingParentKey", - (id)initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) { _parent = [aCoder decodeObjectForKey:_CPUndoGroupingParentKey]; _invocations = [aCoder decodeObjectForKey:_CPUndoGroupingInvocationsKey]; } - + return self; } @@ -152,7 +152,7 @@ var _CPUndoGroupingParentKey = @"_CPUndoGroupingParentKey", @end -/*! +/*! @class CPUndoManager @ingroup foundation @brief A general mechanism for user action "undo". @@ -193,21 +193,21 @@ var _CPUndoGroupingParentKey = @"_CPUndoGroupingParentKey", - (id)init { self = [super init]; - + if (self) { _redoStack = []; _undoStack = []; - + _state = CPUndoManagerNormal; - + [self setRunLoopModes:[CPDefaultRunLoopMode]]; [self setGroupsByEvent:YES]; _undoManagerProxy = [_CPUndoManagerProxy alloc]; _undoManagerProxy._undoManager = self; } - + return self; } @@ -258,7 +258,7 @@ var _CPUndoGroupingParentKey = @"_CPUndoGroupingParentKey", - (id)prepareWithInvocationTarget:(id)aTarget { _preparedTarget = aTarget; - + return _undoManagerProxy; } @@ -270,7 +270,7 @@ var _CPUndoGroupingParentKey = @"_CPUndoGroupingParentKey", { if ([_preparedTarget respondsToSelector:aSelector]) return 1; - + return nil;//[_preparedTarget methodSignatureForSelector:selector]; } @@ -337,7 +337,7 @@ if (_currentGroup == nil) Performs an undo on the last undo group. */ - (void)undoNestedGroup -{ +{ if ([_undoStack count] <= 0) return; @@ -373,7 +373,7 @@ if (_currentGroup == nil) // Don't do anything if we have no redos. if ([_redoStack count] <= 0) return; - + /* if (_state == NSUndoManagerUndoing) [NSException raise:NSInternalInconsistencyException format:@"redo called while undoing"]; @@ -386,19 +386,19 @@ if (_currentGroup == nil) [defaultCenter postNotificationName:CPUndoManagerWillRedoChangeNotification object:self]; - + var oldUndoGrouping = _currentGrouping, undoGrouping = _redoStack.pop(); - + _currentGrouping = nil; _state = CPUndoManagerRedoing; [self _beginUndoGrouping]; [undoGrouping invoke]; [self endUndoGrouping]; - + [_CPUndoGrouping _poolUndoGrouping:undoGrouping]; - + _currentGrouping = oldUndoGrouping; _state = CPUndoManagerNormal; @@ -452,31 +452,31 @@ if (_currentGroup == nil) object:self]; var parent = [_currentGrouping parent]; - + if (!parent && [_currentGrouping invocations].length > 0) { [defaultCenter postNotificationName:CPUndoManagerWillCloseUndoGroupNotification object:self]; - + // Put this group on the redo stack if we are currently undoing, otherwise // put it on the undo stack. That way, "undos" become "redos". var stack = _state === CPUndoManagerUndoing ? _redoStack : _undoStack; - + stack.push(_currentGrouping); - + if (_levelsOfUndo > 0 && stack.length > _levelsOfUndo) - stack.splice(0, 1); + stack.splice(0, 1); } - + // Nested Undo Grouping else { [parent addInvocationsFromArray:[_currentGrouping invocations]]; - + [_CPUndoGrouping _poolUndoGrouping:_currentGrouping]; } - + _currentGrouping = parent; } @@ -491,7 +491,7 @@ if (_currentGroup == nil) if (_disableCount <= 0) [CPException raise:CPInternalInconsistencyException reason:"enableUndoRegistration. There are no disable messages in effect right now."]; - + _disableCount--; } @@ -527,10 +527,10 @@ if (_currentGroup == nil) { var grouping = _currentGrouping, level = _currentGrouping != nil; - + while (grouping = [grouping parent]) ++level; - + return level; } @@ -586,27 +586,27 @@ if (_currentGroup == nil) - (void)removeAllActionsWithTarget:(id)aTarget { [_currentGrouping removeInvocationsWithTarget:aTarget]; - + var index = _redoStack.length; - + while (index--) { var grouping = _redoStack[index]; - + [grouping removeInvocationsWithTarget:aTarget]; - + if (![grouping invocations].length) _redoStack.splice(index, 1); } index = _undoStack.length; - + while (index--) { var grouping = _undoStack[index]; - + [grouping removeInvocationsWithTarget:aTarget]; - + if (![grouping invocations].length) _undoStack.splice(index, 1); } @@ -739,7 +739,7 @@ var CPUndoManagerRedoStackKey = @"CPUndoManagerRedoStackKey", CPUndoManagerLevelsOfUndoKey = @"CPUndoManagerLevelsOfUndoKey"; CPUndoManagerActionNameKey = @"CPUndoManagerActionNameKey"; CPUndoManagerCurrentGroupingKey = @"CPUndoManagerCurrentGroupingKey"; - + CPUndoManagerRunLoopModesKey = @"CPUndoManagerRunLoopModesKey"; CPUndoManagerGroupsByEventKey = @"CPUndoManagerGroupsByEventKey"; @@ -748,22 +748,22 @@ var CPUndoManagerRedoStackKey = @"CPUndoManagerRedoStackKey", - (id)initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) { _redoStack = [aCoder decodeObjectForKey:CPUndoManagerRedoStackKey]; _undoStack = [aCoder decodeObjectForKey:CPUndoManagerUndoStackKey]; - + _levelsOfUndo = [aCoder decodeObjectForKey:CPUndoManagerLevelsOfUndoKey]; _actionName = [aCoder decodeObjectForKey:CPUndoManagerActionNameKey]; _currentGrouping = [aCoder decodeObjectForKey:CPUndoManagerCurrentGroupingKey]; - + _state = CPUndoManagerNormal; - + [self setRunLoopModes:[aCoder decodeObjectForKey:CPUndoManagerRunLoopModesKey]]; [self setGroupsByEvent:[aCoder decodeBoolForKey:CPUndoManagerGroupsByEventKey]]; } - + return self; } @@ -771,10 +771,10 @@ var CPUndoManagerRedoStackKey = @"CPUndoManagerRedoStackKey", { [aCoder encodeObject:_redoStack forKey:CPUndoManagerRedoStackKey]; [aCoder encodeObject:_undoStack forKey:CPUndoManagerUndoStackKey]; - + [aCoder encodeInt:_levelsOfUndo forKey:CPUndoManagerLevelsOfUndoKey]; [aCoder encodeObject:_actionName forKey:CPUndoManagerActionNameKey]; - + [aCoder encodeObject:_currentGrouping forKey:CPUndoManagerCurrentGroupingKey]; [aCoder encodeObject:_runLoopModes forKey:CPUndoManagerRunLoopModesKey]; diff --git a/Foundation/CPUserSessionManager.j b/Foundation/CPUserSessionManager.j index b15d1e916..5feca31ff 100644 --- a/Foundation/CPUserSessionManager.j +++ b/Foundation/CPUserSessionManager.j @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import -@import +@import "CPObject.j" +@import "CPString.j" CPUserSessionUndeterminedStatus = 0; @@ -36,7 +36,7 @@ var CPDefaultUserSessionManager = nil; @implementation CPUserSessionManager : CPObject { CPUserSessionStatus _status; - + CPString _userIdentifier; } @@ -51,10 +51,10 @@ var CPDefaultUserSessionManager = nil; - (id)init { self = [super init]; - + if (self) _status = CPUserSessionUndeterminedStatus; - + return self; } @@ -67,9 +67,9 @@ var CPDefaultUserSessionManager = nil; { if (_status == aStatus) return; - + _status = aStatus; - + [[CPNotificationCenter defaultCenter] postNotificationName:CPUserSessionManagerStatusDidChangeNotification object:self]; @@ -87,9 +87,9 @@ var CPDefaultUserSessionManager = nil; { if (_userIdentifier == anIdentifier) return; - + _userIdentifier = anIdentifier; - + [[CPNotificationCenter defaultCenter] postNotificationName:CPUserSessionManagerUserIdentifierDidChangeNotification object:self]; diff --git a/Foundation/CPValue.j b/Foundation/CPValue.j index 1c6de7a92..70ea751ad 100644 --- a/Foundation/CPValue.j +++ b/Foundation/CPValue.j @@ -20,11 +20,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -@import "CPObject.j" @import "CPCoder.j" +@import "CPObject.j" -/*! +/*! @class CPValue @ingroup foundation @brief A generic "value". Can be subclassed to hold specific data types. @@ -54,10 +54,10 @@ - (id)initWithJSObject:(JSObject)aJSObject { self = [super init]; - + if (self) _JSObject = aJSObject; - + return self; } @@ -83,7 +83,7 @@ var CPValueValueKey = @"CPValueValueKey"; - (id)initWithCoder:(CPCoder)aCoder { self = [super init]; - + if (self) _JSObject = JSON.parse([aCoder decodeObjectForKey:CPValueValueKey]); diff --git a/Foundation/CPWebDAVManager.j b/Foundation/CPWebDAVManager.j index fb17b72a2..6b821fb08 100644 --- a/Foundation/CPWebDAVManager.j +++ b/Foundation/CPWebDAVManager.j @@ -1,3 +1,24 @@ +/* + * CPWebDAVManager.j + * Foundation + * + * Created by Francisco Tolmasky. + * Copyright 2008, 280 North, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ var setURLResourceValuesForKeysFromProperties = function(aURL, keys, properties) { From 0062caafdf831dec26194c0891440e1b27f4958a Mon Sep 17 00:00:00 2001 From: cacaodev Date: Wed, 26 May 2010 17:47:01 +0200 Subject: [PATCH 175/175] CPObject -implementsSelector: --- Foundation/CPObject.j | 17 +++++++++++++ Tests/Foundation/CPObjectTest.j | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 Tests/Foundation/CPObjectTest.j diff --git a/Foundation/CPObject.j b/Foundation/CPObject.j index fece4e8f6..c518f4f70 100644 --- a/Foundation/CPObject.j +++ b/Foundation/CPObject.j @@ -231,6 +231,23 @@ CPLog(@"Got some class: %@", inst); return !!class_getInstanceMethod(isa, aSelector); } +/*! + Tests whether the receiver implements to the provided selector regardless of inheritance. + @param aSelector the selector for which to test the receiver + @return \c YES if the receiver implements the selector +*/ +- (BOOL)implementsSelector:(SEL)aSelector +{ + var methods = class_copyMethodList(isa), + count = methods.length; + + while (count--) + if (method_getName(methods[count]) === aSelector) + return YES; + + return NO; +} + // Obtaining method information /*! diff --git a/Tests/Foundation/CPObjectTest.j b/Tests/Foundation/CPObjectTest.j new file mode 100644 index 000000000..729e01c9e --- /dev/null +++ b/Tests/Foundation/CPObjectTest.j @@ -0,0 +1,45 @@ +@import + +@implementation CPObjectTest : OJTestCase +{ +} + +- (void)testImplementsSelector +{ + var receiver = [[Receiver alloc] init]; + + [self assertTrue:[receiver implementsSelector:@selector(implementedInReceiverAndSuper)]]; + [self assertTrue:[receiver implementsSelector:@selector(implementedInReceiverOnly)]]; + + [self assertFalse:[receiver implementsSelector:@selector(implementedInSuperOnly)]]; + [self assertFalse:[receiver implementsSelector:@selector(notImplementedInSuperNorReceiver)]]; + +} + +@end + +@implementation SuperReceiver : CPObject +{ +} + +- (void)implementedInReceiverAndSuper +{ +} + +- (void)implementedInSuperOnly +{ +} +@end + +@implementation Receiver : SuperReceiver +{ +} + +- (void)implementedInReceiverAndSuper +{ +} + +- (void)implementedInReceiverOnly +{ +} +@end