From b1c99a5f0a1826bce63c9126c36fae47f7c4d0f8 Mon Sep 17 00:00:00 2001 From: Will Larson Date: Sun, 7 Sep 2008 09:43:28 -0400 Subject: [PATCH 01/24] Added placeholder and setPlaceholder methods to CPTextField, to facilitate displaying placeholder text for textfields before user has entered text. May want to consider changing text color while displaying placeholder text. --- AppKit/CPTextField.j | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 67064bb9e..23cddb8f3 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -66,6 +66,7 @@ var _CPTextFieldSquareBezelColor = nil; BOOL _isSelectable; id _value; + id _placeholderString; CPLineBreakMode _lineBreakMode; #if PLATFORM(DOM) @@ -104,7 +105,8 @@ var _CPTextFieldSquareBezelColor = nil; if (self) { _value = @""; - + _placeholderValue = @""; + #if PLATFORM(DOM) _DOMTextElement = document.createElement("div"); _DOMTextElement.style.position = "absolute"; @@ -245,6 +247,12 @@ var _CPTextFieldSquareBezelColor = nil; [[CPDOMWindowBridge sharedDOMWindowBridge] _propagateCurrentDOMEvent:YES]; + // If current value is the placeholder value, remove it to + // allow user to update. + if ([_value caseInsensitiveCompare:[self placeholderString]]==0) { + [self setStringValue:@""]; + } + return YES; } @@ -254,6 +262,11 @@ var _CPTextFieldSquareBezelColor = nil; _DOMElement.removeChild(element); [self setStringValue:element.value]; + + // If textfield has no value, then display the placeholderValue + if ([_value caseInsensitiveCompare:@""]==0) { + [self setStringValue:[self placeholderString]]; + } return YES; } @@ -354,6 +367,24 @@ var _CPTextFieldSquareBezelColor = nil; #endif } +- (CPString)placeholderString +{ + return [_placeholderString string]; +} + +-(void)setPlaceholderString:(CPString)aStringValue +{ + _placeholderString = aStringValue; +#if PLATFORM(DOM) + var cssString = _value ? [_value cssString] : @""; + + if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature)) + _DOMTextElement.innerText = cssString; + else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature)) + _DOMTextElement.textContent = cssString; +#endif +} + - (void)sizeToFit { #if PLATFORM(DOM) From c5415eae0503db309b8692b1854246372a22268e Mon Sep 17 00:00:00 2001 From: Will Larson Date: Sun, 7 Sep 2008 10:35:17 -0400 Subject: [PATCH 02/24] In attempt to mimic existing code, inadvertantly mimicked too much. Removing unnecessary lines. --- AppKit/CPTextField.j | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 23cddb8f3..03d724284 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -8,7 +8,7 @@ * 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. +c * 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 @@ -375,14 +375,6 @@ var _CPTextFieldSquareBezelColor = nil; -(void)setPlaceholderString:(CPString)aStringValue { _placeholderString = aStringValue; -#if PLATFORM(DOM) - var cssString = _value ? [_value cssString] : @""; - - if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature)) - _DOMTextElement.innerText = cssString; - else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature)) - _DOMTextElement.textContent = cssString; -#endif } - (void)sizeToFit From 06e56eb37a70898acdf92788c8ef1bb58686ee5b Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Wed, 17 Sep 2008 17:58:11 -0700 Subject: [PATCH 03/24] Override toString on Objective-J objects to return result of calling -description [#4 state:resolved responsible:tlrobinson] --- Foundation/CPLog.j | 51 ++++++++-------------------------------------- 1 file changed, 8 insertions(+), 43 deletions(-) diff --git a/Foundation/CPLog.j b/Foundation/CPLog.j index 82d67a1d1..baea2eed1 100644 --- a/Foundation/CPLog.j +++ b/Foundation/CPLog.j @@ -2,7 +2,7 @@ * CPLog.j * Foundation * - * Created by Francisco Tolmasky. + * Created by Thomas Robinson. * Copyright 2008, 280 North, Inc. * * This library is free software; you can redistribute it and/or @@ -34,8 +34,6 @@ for (var i = 0; i < CPLogLevels.length; i++) var _CPLogRegistrations = {}; // helpers: -var _randomInteger = function(max) { return Math.round(Math.random() * (typeof(max) != "undefined" ? max : (1 << 30))); } -var _randomArrayElement = function(element) { return element[_randomInteger(element.length)]; } var _CPFormatLogMessage = function(aString, aLevel, aTitle) { @@ -375,44 +373,11 @@ var _CPLogInitPopup = function(logWindow) }, false); } -// CPLogServer sends log messages to the server -//var _CPLogServerBatch = true; -//var _CPLogServerSessionID = _randomInteger(); -//function CPLogServer(aString, aLevel, aTitle) -//{ -// var entry = { title: aTitle, message: aString, level: aLevel, timestamp: new Date().getTime() } -// -// if (_CPLogServerBatch) -// { -// } -// else -// { -// -// } -//} -// -//function _CPLogServerSubmit() -//{ -// -//} - -// Testing purposes: - -var lorem = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas fermentum, elit non lobortis cursus, orci velit suscipit est, id mollis turpis mi eget orci. Ut aliquam sollicitudin metus. Mauris at sapien sed sapien congue iaculis. Nulla lorem urna, bibendum id, laoreet iaculis, nonummy eget, massa. Phasellus ullamcorper commodo velit."; - -function CPLogTest(n) { - for(var i=0;i Date: Wed, 17 Sep 2008 18:46:57 -0700 Subject: [PATCH 04/24] fix typo in class_addMethod --- 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 17231cf42..4090a10aa 100644 --- a/Objective-J/runtime.js +++ b/Objective-J/runtime.js @@ -159,7 +159,7 @@ function class_copyIvarList(/*Class*/ aClass) //#define class_copyIvarList(aClass) (aClass.ivars.slice(0)) -function class_addMethod(/*Class*/ aClass, /*SEL*/ aName, /*IMP*/ anImplementation, /*String*/types) +function class_addMethod(/*Class*/ aClass, /*SEL*/ aName, /*IMP*/ anImplementation, /*String*/aType) { if (aClass.method_hash[aName]) return NO; From 53d4a714e23c17b9595b8194163574395bc66223 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Wed, 17 Sep 2008 18:59:30 -0700 Subject: [PATCH 05/24] Fix for requiring delegate methods (#36), and for JSONP not calling the run loop. [#36 state:resolved]; --- AppKit/CPAnimation.j | 5 +++-- Foundation/CPJSONPConnection.j | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/AppKit/CPAnimation.j b/AppKit/CPAnimation.j index 11eed88a5..080f19daf 100644 --- a/AppKit/CPAnimation.j +++ b/AppKit/CPAnimation.j @@ -211,7 +211,7 @@ ACTUAL_FRAME_RATE = 0; - (void)startAnimation { // If we're already animating, or our delegate stops us, animate. - if (_timer || _delegate && ![_delegate animationShouldStart:self]) + if (_timer || _delegate && [_delegate respondsToSelector:@selector(animationShouldStart)] && ![_delegate animationShouldStart:self]) return; _progress = 0.0; @@ -258,7 +258,8 @@ ACTUAL_FRAME_RATE = 0; window.clearTimeout(_timer); _timer = nil; - [_delegate animationDidStop:self]; + if ([_delegate respondsToSelector:@selector(animationDidStop:)]) + [_delegate animationDidStop:self]; } /* diff --git a/Foundation/CPJSONPConnection.j b/Foundation/CPJSONPConnection.j index 521b6661b..0f529d39b 100644 --- a/Foundation/CPJSONPConnection.j +++ b/Foundation/CPJSONPConnection.j @@ -56,6 +56,8 @@ CPJSONPConnectionCallbacks = {}; { [_delegate connection:self didReceiveData:data]; [self removeScriptTag]; + + [[CPRunLoop currentRunLoop] performSelectors]; }; if(shouldStartImmediately) From dbc0999f66969d22422ee198dd55702f68b5effd Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Wed, 17 Sep 2008 22:37:59 -0700 Subject: [PATCH 06/24] CPSplitView initial commit Reviewed by Francisco [#46 state:resolved responsible:tlrobinson] --- AppKit/CPSplitView.j | 407 ++++++++++++++++++ .../CPSplitView/CPSplitViewHorizontal.png | Bin 0 -> 144 bytes .../CPSplitView/CPSplitViewVertical.png | Bin 0 -> 133 bytes 3 files changed, 407 insertions(+) create mode 100644 AppKit/CPSplitView.j create mode 100644 AppKit/Resources/CPSplitView/CPSplitViewHorizontal.png create mode 100644 AppKit/Resources/CPSplitView/CPSplitViewVertical.png diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j new file mode 100644 index 000000000..97bff90a7 --- /dev/null +++ b/AppKit/CPSplitView.j @@ -0,0 +1,407 @@ +/* + * CPSplitView.j + * AppKit + * + * Created by Thomas Robinson. + * 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 "CPImage.j" +import "CPView.j" + +#include "CoreGraphics/CGGeometry.h" +#include "Platform/Platform.h" +#include "Platform/DOM/CPDOMDisplayServer.h" + +CPSplitViewDidResizeSubviewsNotification = @"CPSplitViewDidResizeSubviewsNotification"; +CPSplitViewWillResizeSubviewsNotification = @"CPSplitViewWillResizeSubviewsNotification"; + +var CPSplitViewHorizontalImage = nil, + CPSplitViewVerticalImage = nil; + +@implementation CPSplitView : CPView +{ + id _delegate; + BOOL _isVertical; + BOOL _isPaneSplitter; + + int _currentDivider; + float _initialOffset; + + CPString _originComponent; + CPString _sizeComponent; + + CPArray _DOMDividerElements; +} + +/* + @ignore +*/ +//+ (void)initialize +//{ +// if (self != [CPSplitView class]) +// return; +// +// var bundle = [CPBundle bundleForClass:self]; +// +// CPSplitViewHorizontalImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSplitView/CPSplitViewHorizontal.png"] size:CPSizeMake(5.0, 10.0)]; +// CPSplitViewVerticalImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSplitView/CPSplitViewVertical.png"] size:CPSizeMake(10.0, 5.0)]; +//} + +- (id)initWithFrame:(CGRect)aFrame +{ + if (self = [super initWithFrame:aFrame]) + { + _currentDivider = CPNotFound; + + _DOMDividerElements = []; + + [self setVertical:YES]; + [self setIsPaneSplitter:YES]; + } + + return self; +} + +- (float)dividerThickness +{ + return 10.0; +} + +- (BOOL)isVertical +{ + return _isVertical; +} +- (void)setVertical:(BOOL)flag +{ + _isVertical = flag; + + _originComponent = [self isVertical] ? "x" : "y"; + _sizeComponent = [self isVertical] ? "width" : "height"; + + [self adjustSubviews]; +} + +- (BOOL)isPaneSplitter +{ + return _isPaneSplitter; +} +- (void)setIsPaneSplitter:(BOOL)flag +{ + _isPaneSplitter = flag; +} + +- (void)didAddSubview:(CPView)subview +{ + [self adjustSubviews]; +} + +- (void)adjustSubviews +{ + var frame = [self frame], + dividerThickness = [self dividerThickness]; + + [self _postNotificationWillResize]; + + var eachSize = (frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length; + + for (var i = 0; i < [_subviews count]; i++) + { + if ([self isVertical]) + [_subviews[i] setFrame:CGRectMake(Math.round((eachSize + dividerThickness) * i), 0, Math.round(eachSize), frame.size.height)]; + else + [_subviews[i] setFrame:CGRectMake(0, Math.round((eachSize + dividerThickness) * i), frame.size.width, Math.round(eachSize))]; + } + + [self setNeedsDisplay:YES]; + + [self _postNotificationDidResize]; +} + +- (BOOL)isSubviewCollapsed:(CPView)subview +{ + return [subview frame].size[_sizeComponent] < 1 ? YES : NO; +} + +- (CGRect)rectOfDividerAtIndex:(int)aDivider +{ + var frame = [_subviews[aDivider] frame]; + + var rect = CGRectMakeZero(); + rect.size = CPSizeCreateCopy([self frame].size); + + rect.size[_sizeComponent] = [self dividerThickness]; + rect.origin[_originComponent] = frame.origin[_originComponent] + frame.size[_sizeComponent]; + + return rect; +} + +- (CGRect)effectiveRectOfDividerAtIndex:(int)aDivider +{ + var realRect = [self rectOfDividerAtIndex:aDivider]; + + realRect.size[_sizeComponent] += 4; + realRect.origin[_originComponent] -= 2; + + return realRect; +} + +- (void)drawRect:(CGRect)rect +{ +#if PLATFORM(DOM) + var dividerPath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; + + var count = [_subviews count]; + for (var i = 0; i < count; i++) + { + if (!_DOMDividerElements[i]) + { + _DOMDividerElements[i] = document.createElement("div"); + _DOMDividerElements[i].style.cursor = "move"; + _DOMDividerElements[i].style.position = "absolute"; + _DOMDividerElements[i].style.backgroundRepeat = "repeat"; + CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[i]); + } + + var frame = [self rectOfDividerAtIndex:i]; + CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[i], NULL, _CGRectGetMinX(frame), _CGRectGetMinY(frame)); + CPDOMDisplayServerSetStyleSize(_DOMDividerElements[i], _CGRectGetWidth(frame), _CGRectGetHeight(frame)); + + _DOMDividerElements[i].style.backgroundImage = "url('"+dividerPath+"')"; + } +#endif +} + +- (void)drawDividerInRect:(CGRect)aRect +{ + // TODO: figure out a way to "draw" dividers using DOM element +} + +- (BOOL)cursorAtPoint:(CPPoint)aPoint hitDividerAtIndex:(int)anIndex +{ + var frame = [_subviews[anIndex] frame], + startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent], + effectiveRect = [self effectiveRectOfDividerAtIndex:anIndex], + additionalRect = null; + + if ([_delegate respondsToSelector:@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)]) + effectiveRect = [_delegate splitView:self effectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex]; + + if ([_delegate respondsToSelector:@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)]) + additionalRect = [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex]; + + return CGRectContainsPoint(effectiveRect, aPoint) || (additionalRect && CGRectContainsPoint(additionalRect, aPoint)); +} + +- (void)mouseDown:(CPEvent)theEvent +{ + var location = [theEvent locationInWindow], + point = [self convertPoint:location fromView:nil]; + + for (var i = 0; i < [_subviews count] - 1; i++) + { + var frame = [_subviews[i] frame], + startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent]; + + if ([self cursorAtPoint:point hitDividerAtIndex:i]) + { + if ([theEvent clickCount] == 2 && + [_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)] && + [_delegate respondsToSelector:@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)]) + { + var minPosition = [self minPossiblePositionOfDividerAtIndex:i], + maxPosition = [self maxPossiblePositionOfDividerAtIndex:i]; + + if ([_delegate splitView:self canCollapseSubview:_subviews[i]] && [_delegate splitView:self shouldCollapseSubview:_subviews[i] forDoubleClickOnDividerAtIndex:i]) + { + if ([self isSubviewCollapsed:_subviews[i]]) + [self setPosition:(minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i]; + else + [self setPosition:minPosition ofDividerAtIndex:i]; + } + else if ([_delegate splitView:self canCollapseSubview:_subviews[i+1]] && [_delegate splitView:self shouldCollapseSubview:_subviews[i+1] forDoubleClickOnDividerAtIndex:i]) + { + if ([self isSubviewCollapsed:_subviews[i+1]]) + [self setPosition:(minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i]; + else + [self setPosition:maxPosition ofDividerAtIndex:i]; + } + } + else + { + _currentDivider = i; + _initialOffset = startPosition - point[_originComponent]; + + [self _postNotificationWillResize]; + } + + return; + } + } + _currentDivider = CPNotFound; +} + +- (void)mouseDragged:(CPEvent)theEvent +{ + if (_currentDivider != CPNotFound) + { + var location = [theEvent locationInWindow], + point = [self convertPoint:location fromView:nil]; + + [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; + } +} + +- (void)mouseUp:(CPEvent)theEvent +{ + if (_currentDivider != CPNotFound) + { + _currentDivider = CPNotFound; + [self _postNotificationDidResize]; + } +} + +- (float)maxPossiblePositionOfDividerAtIndex:(int)dividerIndex +{ + var frame = [_subviews[dividerIndex + 1] frame]; + + if (dividerIndex + 1 < [_subviews count] - 1) + return frame.origin[_originComponent] + frame.size[_sizeComponent] - [self dividerThickness]; + else + return [self frame].size[_sizeComponent] - [self dividerThickness]; +} + +- (float)minPossiblePositionOfDividerAtIndex:(int)dividerIndex +{ + var frame = [_subviews[dividerIndex - 1] frame]; + + if (dividerIndex > 0) + return frame.origin[_originComponent] + frame.size[_sizeComponent] + [self dividerThickness]; + else + return 0; +} + +- (void)setPosition:(float)position ofDividerAtIndex:(int)dividerIndex +{ + // not sure where this should override other positions? + if ([_delegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)]) + position = [_delegate splitView:self constrainSplitPosition:position ofSubviewAt:dividerIndex]; + + var proposedMax = [self maxPossiblePositionOfDividerAtIndex:dividerIndex], + proposedMin = [self minPossiblePositionOfDividerAtIndex:dividerIndex], + actualMax = proposedMax, + actualMin = proposedMin; + + if([_delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)]) + actualMin = [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex]; + + if([_delegate respondsToSelector:@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)]) + actualMax = [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex]; + + var frame = [self frame], + viewA = _subviews[dividerIndex], + frameA = CGRectCreateCopy([viewA frame]), + viewB = _subviews[dividerIndex+1], + frameB = CGRectCreateCopy([viewB frame]); + + var realPosition = MAX(MIN(position, actualMax), actualMin); + + if (position < proposedMin + (actualMin - proposedMin) / 2) + if ([_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)]) + if ([_delegate splitView:self canCollapseSubview:viewA]) + realPosition = proposedMin; + + frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent]; + [_subviews[dividerIndex] setFrame:frameA]; + + frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [self dividerThickness]; + frameB.origin[_originComponent] = realPosition + [self dividerThickness]; + [_subviews[dividerIndex+1] setFrame:frameB]; + + [self setNeedsDisplay:YES]; +} + +- (void)resizeSubviewsWithOldSize:(CPSize)oldSize +{ + if ([_delegate respondsToSelector:@selector(splitView:resizeSubviewsWithOldSize:)]) + { + [_delegate splitView:self resizeSubviewsWithOldSize:oldSize]; + return; + } + + [self _postNotificationWillResize]; + + var frame = CGRectCreateCopy([self frame]); + + for (var i = 0; i < [_subviews count]; i++) + { + var view = [_subviews objectAtIndex:i], + newFrame = CGRectCreateCopy(frame); + + if(i + 1 == [_subviews count]) + newFrame.size[_sizeComponent] = frame.size[_sizeComponent] - newFrame.origin[_originComponent]; + else + newFrame.size[_sizeComponent] = frame.size[_sizeComponent] * ([view frame].size[_sizeComponent] / oldSize[_sizeComponent]); + + frame.origin[_originComponent] += newFrame.size[_sizeComponent]; + frame.origin[_originComponent] += [self dividerThickness]; + + [view setFrame:newFrame]; + } + + [self setNeedsDisplay:YES]; + + [self _postNotificationDidResize]; +} + +- (void)setDelegate:(id)delegate +{ + if ([_delegate respondsToSelector:@selector(splitViewDidResizeSubviews:)]) + [[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewDidResizeSubviewsNotification object:self]; + if ([_delegate respondsToSelector:@selector(splitViewWillResizeSubviews:)]) + [[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewWillResizeSubviewsNotification object:self]; + + _delegate = delegate; + + if ([_delegate respondsToSelector:@selector(splitViewDidResizeSubviews:)]) + [[CPNotificationCenter defaultCenter] addObserver:_delegate + selector:@selector(splitViewDidResizeSubviews:) + name:CPSplitViewDidResizeSubviewsNotification + object:self]; + if ([_delegate respondsToSelector:@selector(splitViewWillResizeSubviews:)]) + [[CPNotificationCenter defaultCenter] addObserver:_delegate + selector:@selector(splitViewWillResizeSubviews:) + name:CPSplitViewWillResizeSubviewsNotification + object:self]; +} + +- (void)_postNotificationWillResize +{ + [[CPNotificationCenter defaultCenter] postNotificationName:CPSplitViewWillResizeSubviewsNotification object:self]; +} + +- (void)_postNotificationDidResize +{ + [[CPNotificationCenter defaultCenter] postNotificationName:CPSplitViewDidResizeSubviewsNotification object:self]; +} + +@end + +// FIXME: once +initialize is fixed for superclasses, remove this and uncomment +initialize +var bundle = [CPBundle bundleForClass:CPSplitView]; +CPSplitViewHorizontalImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSplitView/CPSplitViewHorizontal.png"] size:CPSizeMake(5.0, 10.0)]; +CPSplitViewVerticalImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSplitView/CPSplitViewVertical.png"] size:CPSizeMake(10.0, 5.0)]; diff --git a/AppKit/Resources/CPSplitView/CPSplitViewHorizontal.png b/AppKit/Resources/CPSplitView/CPSplitViewHorizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..e144e9b31ebf6d9c989c2123f0e23fcb4460ff63 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y=!2~4#xfUw`DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MMj=3jv*Ddk|KANXfjI}{QLEl`_!+GkJ+bu{rWnbqxSpkC^>bP0l+XkKx*{>j literal 0 HcmV?d00001 diff --git a/AppKit/Resources/CPSplitView/CPSplitViewVertical.png b/AppKit/Resources/CPSplitView/CPSplitViewVertical.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd8973d368e7d8aa7eea810b381607ada1f8dd3 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^AT~1x6OdGm=Trhxk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X)ID7sLn>}1#q26s+1tx2EG%qnY|PEg-O^%kZC&i?BMssL d6WBNm7+TX=zVaHazW~(2;OXk;vd$@?2>=^mBsTy6 literal 0 HcmV?d00001 From e95c2b9efce252b2f76fdff7ffb1b12bc06c9d83 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Wed, 17 Sep 2008 22:39:25 -0700 Subject: [PATCH 07/24] Various fixes to support creating images with specifying the size upfront. [#41 milestone:0.5.2 state:resolved]; [#20 milestone:0.5.2 state:resolved]; --- AppKit/CPImage.j | 13 ++++++-- AppKit/CPImageView.j | 51 +++++++++++++++++++++---------- Foundation/CPNotificationCenter.j | 8 ++--- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/AppKit/CPImage.j b/AppKit/CPImage.j index f51d44805..b5baef554 100644 --- a/AppKit/CPImage.j +++ b/AppKit/CPImage.j @@ -20,10 +20,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -import -import import +import +import import +import import "CPGeometry.j" @@ -35,6 +36,8 @@ CPImageLoadStatusInvalidData = 4; CPImageLoadStatusUnexpectedEOF = 5; CPImageLoadStatusReadError = 6; +CPImageDidLoadNotification = @"CPImageDidLoadNotification"; + @implementation CPBundle (CPImageAdditions) - (CPString)pathForResource:(CPString)aFilename @@ -219,7 +222,11 @@ CPImageLoadStatusReadError = 6; // FIXME: IE is wrong on image sizes???? if (!_size || (_size.width == -1 && _size.height == -1)) _size = CGSizeMake(_image.width, _image.height); - + + [[CPNotificationCenter defaultCenter] + postNotificationName:CPImageDidLoadNotification + object:self]; + if ([_delegate respondsToSelector:@selector(imageDidLoad:)]) [_delegate imageDidLoad:self]; diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j index 6aa860c5c..5cba2ae88 100644 --- a/AppKit/CPImageView.j +++ b/AppKit/CPImageView.j @@ -20,8 +20,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -import "CPImage.j" +import + import "CPControl.j" +import "CPImage.j" import "CPShadowView.j" #include "Platform/Platform.h" @@ -110,20 +112,35 @@ var LEFT_SHADOW_INSET = 3.0, if (_image == anImage) return; + var center = [CPNotificationCenter defaultCenter]; + + if (_image) + [center removeObserver:self name:CPImageDidLoadNotification object:_image]; + _image = anImage; - _DOMImageElement.src = [anImage filename]; + + var size = [_image size]; - if (_imageScaling == CPScaleNone && _image) + if (size && size.width == -1 && size.height == -1) { - var size = [_image size]; + [center addObserver:self selector:@selector(imageDidLoad:) name:CPImageDidLoadNotification object:_image]; + + _DOMImageElement.width = 0; + _DOMImageElement.height = 0; - _DOMImageElement.width = ROUND(size.width); - _DOMImageElement.height = ROUND(size.height); + [_shadowView setHidden:YES]; } - + else + { + [self hideOrDisplayContents]; + [self tile]; + } +} + +- (void)imageDidLoad:(CPNotification)aNotification +{ [self hideOrDisplayContents]; - [self tile]; } @@ -181,13 +198,6 @@ var LEFT_SHADOW_INSET = 3.0, { CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, 0.0, 0.0); } - else if (_imageScaling == CPScaleNone && _image) - { - var size = [_image size]; - - _DOMImageElement.width = ROUND(size.width); - _DOMImageElement.height = ROUND(size.height); - } [self tile]; } @@ -240,7 +250,7 @@ var LEFT_SHADOW_INSET = 3.0, { if (!_image) return; - + var bounds = [self bounds], x = 0.0, y = 0.0, @@ -260,6 +270,9 @@ var LEFT_SHADOW_INSET = 3.0, { var size = [_image size]; + if (size.width == -1 && size.height == -1) + return; + if (_imageScaling == CPScaleProportionally) { // The max size it can be is size.width x size.height, so only @@ -289,6 +302,12 @@ var LEFT_SHADOW_INSET = 3.0, height = size.height; } + if (_imageScaling == CPScaleNone) + { + _DOMImageElement.width = ROUND(size.width); + _DOMImageElement.height = ROUND(size.height); + } + var x = (boundsWidth - width) / 2.0, y = (boundsHeight - height) / 2.0; diff --git a/Foundation/CPNotificationCenter.j b/Foundation/CPNotificationCenter.j index f0f301755..c3b166fad 100644 --- a/Foundation/CPNotificationCenter.j +++ b/Foundation/CPNotificationCenter.j @@ -219,7 +219,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ while (key = [keys nextObject]) { var observers = [_objectObservers objectForKey:key], - count = observers.length; + count = observers ? observers.length : 0; while (count--) if ([observers[count] observer] == anObserver) @@ -231,7 +231,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ observers.splice(count, 1); } - if (observers.length == 0) + if (!observers || observers.length == 0) removedKeys.push(key); } } @@ -239,7 +239,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ { var key = [anObject hash], observers = [_objectObservers objectForKey:key]; - count = observers.length; + count = observers ? observers.length : 0; while (count--) if ([observers[count] observer] == anObserver) @@ -251,7 +251,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ observers.splice(count, 1) } - if (observers.length == 0) + if (!observers || observers.length == 0) removedKeys.push(key); } From 334776df129362057957a94282d5f60c339b5396 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Wed, 17 Sep 2008 22:39:25 -0700 Subject: [PATCH 08/24] Various fixes to support creating images with specifying the size upfront. [#41 milestone:0.5.2 state:resolved]; [#20 milestone:0.5.2 state:resolved]; --- AppKit/CPImage.j | 13 ++++++-- AppKit/CPImageView.j | 51 +++++++++++++++++++++---------- Foundation/CPNotificationCenter.j | 8 ++--- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/AppKit/CPImage.j b/AppKit/CPImage.j index f51d44805..b5baef554 100644 --- a/AppKit/CPImage.j +++ b/AppKit/CPImage.j @@ -20,10 +20,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -import -import import +import +import import +import import "CPGeometry.j" @@ -35,6 +36,8 @@ CPImageLoadStatusInvalidData = 4; CPImageLoadStatusUnexpectedEOF = 5; CPImageLoadStatusReadError = 6; +CPImageDidLoadNotification = @"CPImageDidLoadNotification"; + @implementation CPBundle (CPImageAdditions) - (CPString)pathForResource:(CPString)aFilename @@ -219,7 +222,11 @@ CPImageLoadStatusReadError = 6; // FIXME: IE is wrong on image sizes???? if (!_size || (_size.width == -1 && _size.height == -1)) _size = CGSizeMake(_image.width, _image.height); - + + [[CPNotificationCenter defaultCenter] + postNotificationName:CPImageDidLoadNotification + object:self]; + if ([_delegate respondsToSelector:@selector(imageDidLoad:)]) [_delegate imageDidLoad:self]; diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j index 6aa860c5c..5cba2ae88 100644 --- a/AppKit/CPImageView.j +++ b/AppKit/CPImageView.j @@ -20,8 +20,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -import "CPImage.j" +import + import "CPControl.j" +import "CPImage.j" import "CPShadowView.j" #include "Platform/Platform.h" @@ -110,20 +112,35 @@ var LEFT_SHADOW_INSET = 3.0, if (_image == anImage) return; + var center = [CPNotificationCenter defaultCenter]; + + if (_image) + [center removeObserver:self name:CPImageDidLoadNotification object:_image]; + _image = anImage; - _DOMImageElement.src = [anImage filename]; + + var size = [_image size]; - if (_imageScaling == CPScaleNone && _image) + if (size && size.width == -1 && size.height == -1) { - var size = [_image size]; + [center addObserver:self selector:@selector(imageDidLoad:) name:CPImageDidLoadNotification object:_image]; + + _DOMImageElement.width = 0; + _DOMImageElement.height = 0; - _DOMImageElement.width = ROUND(size.width); - _DOMImageElement.height = ROUND(size.height); + [_shadowView setHidden:YES]; } - + else + { + [self hideOrDisplayContents]; + [self tile]; + } +} + +- (void)imageDidLoad:(CPNotification)aNotification +{ [self hideOrDisplayContents]; - [self tile]; } @@ -181,13 +198,6 @@ var LEFT_SHADOW_INSET = 3.0, { CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, 0.0, 0.0); } - else if (_imageScaling == CPScaleNone && _image) - { - var size = [_image size]; - - _DOMImageElement.width = ROUND(size.width); - _DOMImageElement.height = ROUND(size.height); - } [self tile]; } @@ -240,7 +250,7 @@ var LEFT_SHADOW_INSET = 3.0, { if (!_image) return; - + var bounds = [self bounds], x = 0.0, y = 0.0, @@ -260,6 +270,9 @@ var LEFT_SHADOW_INSET = 3.0, { var size = [_image size]; + if (size.width == -1 && size.height == -1) + return; + if (_imageScaling == CPScaleProportionally) { // The max size it can be is size.width x size.height, so only @@ -289,6 +302,12 @@ var LEFT_SHADOW_INSET = 3.0, height = size.height; } + if (_imageScaling == CPScaleNone) + { + _DOMImageElement.width = ROUND(size.width); + _DOMImageElement.height = ROUND(size.height); + } + var x = (boundsWidth - width) / 2.0, y = (boundsHeight - height) / 2.0; diff --git a/Foundation/CPNotificationCenter.j b/Foundation/CPNotificationCenter.j index f0f301755..c3b166fad 100644 --- a/Foundation/CPNotificationCenter.j +++ b/Foundation/CPNotificationCenter.j @@ -219,7 +219,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ while (key = [keys nextObject]) { var observers = [_objectObservers objectForKey:key], - count = observers.length; + count = observers ? observers.length : 0; while (count--) if ([observers[count] observer] == anObserver) @@ -231,7 +231,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ observers.splice(count, 1); } - if (observers.length == 0) + if (!observers || observers.length == 0) removedKeys.push(key); } } @@ -239,7 +239,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ { var key = [anObject hash], observers = [_objectObservers objectForKey:key]; - count = observers.length; + count = observers ? observers.length : 0; while (count--) if ([observers[count] observer] == anObserver) @@ -251,7 +251,7 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ observers.splice(count, 1) } - if (observers.length == 0) + if (!observers || observers.length == 0) removedKeys.push(key); } From d6b4ebaa30912ee8a3b653012e9b2b786e5a1418 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Wed, 17 Sep 2008 23:56:55 -0700 Subject: [PATCH 09/24] Significant improvements to cib support and nib2cib. Reviewed by rossco. --- AppKit/AppKit.steam | 4 +- AppKit/CPControl.j | 4 +- AppKit/CPView.j | 8 +- AppKit/CPWindow.j | 13 +- AppKit/Cib/CPCib.j | 17 +- AppKit/Cib/CPCustomView.j | 21 +- AppKit/Cib/_CPCibConnector.j | 112 ++++++ AppKit/Cib/_CPCibCustomObject.j | 41 ++ AppKit/Cib/_CPCibObjectData.j | 59 ++- AppKit/Cib/_CPCibWindowTemplate.j | 97 +++++ Foundation/CPKeyValueCoding.j | 198 ++++++++-- Foundation/CPKeyValueObserving.j | 39 ++ Foundation/Foundation.j | 1 + Tools/NibApp/AppController.j | 20 +- Tools/NibApp/HelloWorld.nib/classes.nib | 29 ++ Tools/NibApp/HelloWorld.nib/info.nib | 6 +- Tools/NibApp/HelloWorld.nib/keyedobjects.nib | Bin 11532 -> 4015 bytes Tools/NibApp/HelloWorld.xib | 386 ++++++++++++++++--- Tools/NibApp/main.j | 2 + Tools/nib2cib/NSAppKit.j | 14 + Tools/nib2cib/NSButton.j | 3 + Tools/nib2cib/NSCustomObject.j | 40 ++ Tools/nib2cib/NSCustomView.j | 13 +- Tools/nib2cib/NSIBObjectData.j | 8 +- Tools/nib2cib/NSNibConnector.j | 72 ++++ Tools/nib2cib/NSWindowTemplate.j | 59 +++ 26 files changed, 1085 insertions(+), 181 deletions(-) create mode 100644 AppKit/Cib/_CPCibConnector.j create mode 100644 AppKit/Cib/_CPCibCustomObject.j create mode 100644 AppKit/Cib/_CPCibWindowTemplate.j create mode 100644 Foundation/CPKeyValueObserving.j create mode 100644 Tools/nib2cib/NSCustomObject.j create mode 100644 Tools/nib2cib/NSNibConnector.j create mode 100644 Tools/nib2cib/NSWindowTemplate.j diff --git a/AppKit/AppKit.steam b/AppKit/AppKit.steam index f07d2aaf3..69c4cc952 100644 --- a/AppKit/AppKit.steam +++ b/AppKit/AppKit.steam @@ -34,12 +34,12 @@ Name Debug + Flags + -DDEBUG Settings PREPROCESS - FLAGS - -DDEBUG diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 421b89b08..a035f5467 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -253,8 +253,8 @@ var CPControlBlackColor = [CPColor blackColor]; - (void)mouseUp:(CPEvent)anEvent { - if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])) - [self sendAction:_action to:_target]; + if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])){alert([_target description] + " : " + _action); + [self sendAction:_action to:_target];} [super mouseUp:anEvent]; } diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 05aedecc4..1fe0de2e2 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1684,13 +1684,14 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", _DOMElement = DOMElementPrototype.cloneNode(false); #endif + // Also decode these "early". + _frame = [aCoder decodeRectForKey:CPViewFrameKey]; + _bounds = [aCoder decodeRectForKey:CPViewBoundsKey]; + self = [super initWithCoder:aCoder]; if (self) { - _frame = [aCoder decodeRectForKey:CPViewFrameKey]; - _bounds = [aCoder decodeRectForKey:CPViewBoundsKey]; - _window = [aCoder decodeObjectForKey:CPViewWindowKey]; _subviews = [aCoder decodeObjectForKey:CPViewSubviewsKey]; _superview = [aCoder decodeObjectForKey:CPViewSuperviewKey]; @@ -1716,6 +1717,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", for (; index < count; ++index) { CPDOMDisplayServerAppendChild(_DOMElement, _subviews[index]._DOMElement); + //_subviews[index]._superview = self; } #endif _displayHash = [self hash]; diff --git a/AppKit/CPWindow.j b/AppKit/CPWindow.j index 0383b0cd9..fedddb16d 100644 --- a/AppKit/CPWindow.j +++ b/AppKit/CPWindow.j @@ -269,7 +269,9 @@ var CPWindowSaveImage = nil, CPURL _representedURL; // Bridge Support +#if PLATFORM(DOM) DOMElement _DOMElement; +#endif CPDOMWindowBridge _bridge; unsigned _autoresizingMask; @@ -364,7 +366,8 @@ CPTexturedBackgroundWindowMask [self setContentView:[[CPView alloc] initWithFrame:CGRectMakeZero()]]; _firstResponder = self; - + +#if PLATFORM(DOM) _DOMElement = document.createElement("div"); _DOMElement.style.position = "absolute"; @@ -375,7 +378,8 @@ CPTexturedBackgroundWindowMask CPDOMDisplayServerSetStyleSize(_DOMElement, 1, 1); CPDOMDisplayServerAppendChild(_DOMElement, _windowView._DOMElement); - +#endif + [self setBridge:aBridge]; [self setNextResponder:CPApp]; @@ -854,12 +858,15 @@ CPTexturedBackgroundWindowMask [_shadowView setBackgroundColor:_CPWindowShadowColor]; [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; +#if PLATFORM(DOM) CPDOMDisplayServerInsertBefore(_DOMElement, _shadowView._DOMElement, _windowView._DOMElement); +#endif } else { +#if PLATFORM(DOM) CPDOMDisplayServerRemoveChild(_DOMElement, _shadowView._DOMElement); - +#endif _shadowView = nil; } } diff --git a/AppKit/Cib/CPCib.j b/AppKit/Cib/CPCib.j index e535eaa78..be630aedb 100644 --- a/AppKit/Cib/CPCib.j +++ b/AppKit/Cib/CPCib.j @@ -25,8 +25,9 @@ import import import "CPCustomView.j" +import "_CPCibCustomObject.j" import "_CPCibObjectData.j" - +import "_CPCibWindowTemplate.j" CPCibOwner = @"CPCibOwner", CPCibTopLevelObjects = @"CPCibTopLevelObjects"; @@ -56,20 +57,10 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (!objectData || ![objectData isKindOfClass:[_CPCibObjectData class]]) return NO; + [objectData establishConnectionsWithExternalNameTable:anExternalNameTable]; + var owner = [anExternalNameTable objectForKey:CPCibOwner], topLevelObjects = [anExternalNameTable objectForKey:CPCibTopLevelObjects]; - - var objects = unarchiver._objects, - count = [objects count]; - - // The order in which objects receive the awakeFromCib message is not guaranteed. - while (count--) - { - var object = objects[count]; - - if ([object isMemberOfClass:[CPView class]]) - return object; - } /* // [objectData establishConnectionsWithOwner:owner topLevelObjects:topLevelObjects]; // [objectData cibInstantiateWithOwner:owner topLevelObjects:topLevelObjects]; diff --git a/AppKit/Cib/CPCustomView.j b/AppKit/Cib/CPCustomView.j index c873b2783..e1755d2b5 100644 --- a/AppKit/Cib/CPCustomView.j +++ b/AppKit/Cib/CPCustomView.j @@ -1,5 +1,5 @@ /* - * CPCustomView.j + * _CPCibCustomView.j * AppKit * * Created by Francisco Tolmasky. @@ -36,33 +36,35 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", /* @ignore */ -@implementation CPCustomView : CPView +@implementation _CPCibCustomView : CPView { CPString _className; } @end -var CPCustomViewClassNameKey = @"CPCustomViewClassNameKey"; +var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; -@implementation CPCustomView (CPCoding) +@implementation _CPCibCustomView (CPCoding) - (id)initWithCoder:(CPCoder)aCoder { - _className = [aCoder decodeObjectForKey:CPCustomViewClassNameKey]; + _className = [aCoder decodeObjectForKey:_CPCibCustomViewClassNameKey]; var theClass = CPClassFromString(_className); // If we don't have this class, just use CPView. // FIXME: Should we instead throw an exception? if (!theClass) + { + CPLog("Unknown class \"" + _className + "\" in cib file, using CPView instead."); + theClass = [CPView class]; + } var frame = [aCoder decodeRectForKey:CPViewFrameKey]; - // If this is just a "CPView", don't bother with any funny business, just go ahead and create it with initWithCoder: - if (theClass == [CPView class]) - self = [[CPView alloc] initWithFrame:frame]; + self = [[CPView alloc] initWithFrame:frame]; if (self) { @@ -75,9 +77,8 @@ var CPCustomViewClassNameKey = @"CPCustomViewClassNameKey"; for (; index < count; ++index) { - // This is a bogus superview "CPCustomView". + // This is a bogus superview "_CPCibCustomView". subviews[index]._superview = nil; - [self addSubview:subviews[index]]; } diff --git a/AppKit/Cib/_CPCibConnector.j b/AppKit/Cib/_CPCibConnector.j new file mode 100644 index 000000000..21225891e --- /dev/null +++ b/AppKit/Cib/_CPCibConnector.j @@ -0,0 +1,112 @@ + +import +import + + +var _CPCibConnectorSourceKey = @"_CPCibConnectorSourceKey", + _CPCibConnectorDestinationKey = @"_CPCibConnectorDestinationKey", + _CPCibConnectorLabelKey = @"_CPCibConnectorLabelKey"; + +@implementation _CPCibConnector : CPObject +{ + id _source; + id _destination; + CPString _label; +} + +- (void)replaceObject:(id)anObject withObject:(id)anotherObject +{ + if (_source == anObject) + _source = anotherObject; + + else if (_destination == anObject) + _destination = anotherObject; +} + +@end + +@implementation _CPCibConnector (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _source = [aCoder decodeObjectForKey:_CPCibConnectorSourceKey]; + _destination = [aCoder decodeObjectForKey:_CPCibConnectorDestinationKey]; + _label = [aCoder decodeObjectForKey:_CPCibConnectorLabelKey]; + +#if DEBUG + CPLog("Connection from " + [_source description] + " to " + [_destination description] + " and label " + _label + " decoded."); +#endif + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_source forKey:_CPCibConnectorSourceKey]; + [aCoder encodeObject:_destination forKey:_CPCibConnectorDestinationKey]; + [aCoder encodeObject:_label forKey:_CPCibConnectorLabelKey]; +} + +@end + +@implementation _CPCibControlConnector : _CPCibConnector +{ +} + +- (void)establishConnection +{ +#if DEBUG + CPLog('[' + [_source description] + " setTarget: " + [_destination description] + ']'); + CPLog('[' + [_source description] + " setAction: " + _label + ']'); +#endif + + var selectorName = _label; + + if (![selectorName hasSuffix:@":"]) + selectorName += ':'; + + var selector = CPSelectorFromString(selectorName); + + if (!selector) + [CPException + raise:CPInvalidArgumentException + reason:@"-[" + [self className] + ' ' + _cmd + @"] selector " + selectorName + @" does not exist."]; + + if ([_source respondsToSelector:@selector(setAction:)]) + objj_msgSend(_source, @selector(setAction:), selector); + + else + [CPException + raise:CPInvalidArgumentException + reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setAction:"]; + + if ([_source respondsToSelector:@selector(setTarget:)]) + objj_msgSend(_source, @selector(setTarget:), _destination); + + else + [CPException + raise:CPInvalidArgumentException + reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setTarget:"]; +} + +@end + +@implementation _CPCibOutletConnector : _CPCibConnector +{ +} + +- (void)establishConnection +{ +#if DEBUG + CPLog([_source description] + " setValue: " + [_destination description] + " forKey: " + _label); +#endif + + [_source setValue:_destination forKey:_label]; +} + +@end diff --git a/AppKit/Cib/_CPCibCustomObject.j b/AppKit/Cib/_CPCibCustomObject.j new file mode 100644 index 000000000..56b633c9a --- /dev/null +++ b/AppKit/Cib/_CPCibCustomObject.j @@ -0,0 +1,41 @@ + +import + + +var _CPCibCustomObjectClassName = @"_CPCibCustomObjectClassName"; + +@implementation _CPCibCustomObject : CPObject +{ + CPString _className; +} + +@end + +@implementation _CPCibCustomObject (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + _className = [aCoder decodeObjectForKey:_CPCibCustomObjectClassName]; + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_className forKey:_CPCibCustomObjectClassName]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + var theClass = CPClassFromString(_className); + + if (!theClass) + CPLog("Unknown class \"" + _className + "\" in cib file"); + + return [[theClass alloc] init]; +} + +@end diff --git a/AppKit/Cib/_CPCibObjectData.j b/AppKit/Cib/_CPCibObjectData.j index 53cad72d3..0e43193ab 100644 --- a/AppKit/Cib/_CPCibObjectData.j +++ b/AppKit/Cib/_CPCibObjectData.j @@ -24,36 +24,39 @@ import import import +import "CPCib.j" +import "_CPCibConnector.j" + @implementation _CPCibObjectData : CPObject { - CPArray _namesKeys; - CPArray _namesValues; + CPArray _namesKeys; + CPArray _namesValues; - CPArray _accessibilityConnectors; - CPArray _accessibilityOidsKeys; - CPArray _accessibilityOidsValues; + CPArray _accessibilityConnectors; + CPArray _accessibilityOidsKeys; + CPArray _accessibilityOidsValues; - CPArray _classesKeys; - CPArray _classesValues; + CPArray _classesKeys; + CPArray _classesValues; - CPArray _connections; + CPArray _connections; - id _fontManager; + id _fontManager; - CPString _framework; + CPString _framework; - int _nextOid; + int _nextOid; - CPArray _objectsKeys; - CPArray _objectsValues; + CPArray _objectsKeys; + CPArray _objectsValues; - CPArray _oidKeys; - CPArray _oidValues; + CPArray _oidKeys; + CPArray _oidValues; - CPCustomObject _rootObject; + _CPCibCustomObject _fileOwner; - CPSet _visibleWindows; + CPSet _visibleWindows; } /* - (CPArray)topLevelObjects @@ -103,7 +106,7 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey _CPCibObjectDataOidKeysKey = @"_CPCibObjectDataOidKeysKey", _CPCibObjectDataOidValuesKey = @"_CPCibObjectDataOidValuesKey", - _CPCibObjectDataRootObjectKey = @"_CPCibObjectDataRootObjectKey", + _CPCibObjectDataFileOwnerKey = @"_CPCibObjectDataFileOwnerKey", _CPCibObjectDataVisibleWindowsKey = @"_CPCibObjectDataVisibleWindowsKey"; @implementation _CPCibObjectData (CPCoding) @@ -125,7 +128,6 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey _classesValues = [aCoder decodeObjectForKey:_CPCibObjectDataClassesValuesKey]; _connections = [aCoder decodeObjectForKey:_CPCibObjectDataConnectionsKey]; - //id _fontManager; _framework = [aCoder decodeObjectForKey:_CPCibObjectDataFrameworkKey]; @@ -138,7 +140,7 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey _oidKeys = [aCoder decodeObjectForKey:_CPCibObjectDataOidKeysKey]; _oidValues = [aCoder decodeObjectForKey:_CPCibObjectDataOidValuesKey]; - _rootObject = [aCoder decodeObjectForKey:_CPCibObjectDataRootObjectKey]; + _fileOwner = [aCoder decodeObjectForKey:_CPCibObjectDataFileOwnerKey]; // CPSet _visibleWindows; } @@ -172,10 +174,25 @@ var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey [aCoder encodeObject:_oidKeys forKey:_CPCibObjectDataOidKeysKey]; [aCoder encodeObject:_oidValues forKey:_CPCibObjectDataOidValuesKey]; - [aCoder encodeObject:_rootObject forKey:_CPCibObjectDataRootObjectKey]; + [aCoder encodeObject:_fileOwner forKey:_CPCibObjectDataFileOwnerKey]; // CPCustomObject _fileOwner; // CPSet _visibleWindows; } +- (void)establishConnectionsWithExternalNameTable:(CPDictionary)anExternalNameTable +{ + var index = 0, + count = _connections.length, + cibOwner = [anExternalNameTable objectForKey:CPCibOwner]; + + for (; index < count; ++index) + { + var connection = _connections[index]; + + [connection replaceObject:_fileOwner withObject:cibOwner]; + [connection establishConnection]; + } +} + @end diff --git a/AppKit/Cib/_CPCibWindowTemplate.j b/AppKit/Cib/_CPCibWindowTemplate.j new file mode 100644 index 000000000..7147656aa --- /dev/null +++ b/AppKit/Cib/_CPCibWindowTemplate.j @@ -0,0 +1,97 @@ + +import + + +var _CPCibWindowTemplateMinSizeKey = @"_CPCibWindowTemplateMinSizeKey", + _CPCibWindowTemplateMaxSizeKey = @"_CPCibWindowTemplateMaxSizeKey", + + _CPCibWindowTemplateViewClassKey = @"_CPCibWindowTemplateWindowClassKey", + + _CPCibWindowTemplateWindowRectKey = @"_CPCibWindowTemplateWindowRectKey", + _CPCibWindowTemplateWindowStyleMaskKey = @"_CPCibWindowTempatStyleMaskKey", + _CPCibWindowTemplateWindowTitleKey = @"_CPCibWindowTemplateWindowTitleKey", + _CPCibWindowTemplateWindowViewKey = @"_CPCibWindowTemplateWindowViewKey"; + +@implementation _CPCibWindowTemplate : CPObject +{ + CGSize _minSize; + CGSize _maxSize; + //CGSize _screenRect; + + CPString _viewClass; + //unsigned _wtFlags; + CPString _windowClass; + CGRect _windowRect; + unsigned _windowStyleMask; + + CPString _windowTitle; + CPView _windowView; +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _minSize = [aCoder decodeSizeForKey:_CPCibWindowTemplateMinSizeKey]; + _maxSize = [aCoder decodeSizeForKey:_CPCibWindowTemplateMaxSizeKey]; + + _viewClass = [aCoder decodeObjectForKey:_CPCibWindowTemplateViewClassKey]; + + _windowClass = [aCoder decodeObjectForKey:_CPCibWindowTemplateViewClassKey]; + _windowRect = [aCoder decodeRectForKey:_CPCibWindowTemplateWindowRectKey]; + _windowStyleMask = [aCoder decodeIntForKey:_CPCibWindowTemplateWindowStyleMaskKey]; + + _windowTitle = [aCoder decodeObjectForKey:_CPCibWindowTemplateWindowTitleKey]; + _windowView = [aCoder decodeObjectForKey:_CPCibWindowTemplateWindowViewKey]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeSize:_minSize forKey:_CPCibWindowTemplateMinSizeKey]; + [aCoder encodeSize:_maxSize forKey:_CPCibWindowTemplateMaxSizeKey]; + + [aCoder encodeObject:_viewClass forKey:_CPCibWindowTemplateViewClassKey]; + + [aCoder encodeObject:_windowClass forKey:_CPCibWindowTemplateViewClassKey]; + [aCoder encodeRect:_windowRect forKey:_CPCibWindowTemplateWindowRectKey]; + [aCoder encodeInt:_windowStyleMask forKey:_CPCibWindowTemplateWindowStyleMaskKey]; + + [aCoder encodeObject:_windowTitle forKey:_CPCibWindowTemplateWindowTitleKey]; + [aCoder encodeObject:_windowView forKey:_CPCibWindowTemplateWindowViewKey]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + var windowClass = CPClassFromString(_windowClass); + +/* if (!windowClass) + [NSException raise:NSInvalidArgumentException format:@"Unable to locate NSWindow class %@, using NSWindow",_windowClass]; + class=[NSWindow class];*/ + + var theWindow = [[windowClass alloc] initWithContentRect:_windowRect styleMask:CPHUDBackgroundWindowMask | CPClosableWindowMask];//styleMask:_windowStyleMask]; +// alert(CPStringFromRect(_windowRect)); +// alert(CPStringFromSize(_minSize)); +// alert(CPStringFromSize(_maxSize)); + //[theWindow setMinSize:_minSize]; + //[theWindow setMaxSize:_maxSize]; + [theWindow setLevel:CPFloatingWindowLevel]; + + //[result setHidesOnDeactivate:(_wtFlags&0x80000000)?YES:NO]; + [theWindow setTitle:_windowTitle]; + + // FIXME: we can't autoresize yet... + [_windowView setAutoresizesSubviews:NO]; + + [theWindow setContentView:_windowView]; + + [_windowView setAutoresizesSubviews:YES]; + + return theWindow; +} + +@end diff --git a/Foundation/CPKeyValueCoding.j b/Foundation/CPKeyValueCoding.j index d0cdbbd13..d825acabd 100644 --- a/Foundation/CPKeyValueCoding.j +++ b/Foundation/CPKeyValueCoding.j @@ -22,7 +22,15 @@ import "CPObject.j" -@implementation CPObject(CPKeyValueCoding) + +var CPObjectAccessorsForClass = nil, + CPObjectModifiersForClass = nil; + +CPUndefinedKeyException = @"CPUndefinedKeyException"; +CPTargetObjectUserInfoKey = @"CPTargetObjectUserInfoKey"; +CPUnknownUserInfoKey = @"CPUnknownUserInfoKey"; + +@implementation CPObject (CPKeyValueCoding) + (BOOL)accessInstanceVariablesDirectly { @@ -32,14 +40,42 @@ import "CPObject.j" /* @ignore */ + (SEL)_accessorForKey:(CPString)aKey { - var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substr(1), - selector = CPSelectorFromString("get" + capitalizedKey); + if (!CPObjectAccessorsForClass) + CPObjectAccessorsForClass = [CPDictionary dictionary]; - if ([self instancesRespondToSelector:selector] || + var hash = [isa hash], + selector = nil, + accessors = [CPObjectAccessorsForClass objectForKey:hash]; + + if (accessors) + { + selector = [accessors objectForKey:aKey]; + + if (selector) + return selector == [CPNull null] ? nil : selector; + } + else + { + accessors = [CPDictionary dictionary]; + + [CPObjectAccessorsForClass setObject:accessors forKey:hash]; + } + + 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("_"+aKey)] || - [self instancesRespondToSelector:selector = CPSelectorFromString("is" + capitalizedKey)]) + [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; } @@ -47,22 +83,68 @@ import "CPObject.j" /* @ignore */ + (SEL)_modifierForKey:(CPString)aKey { - var selector = CPSelectorFromString("set" + aKey.charAt(0).toUpperCase() + aKey.substr(1) + ':'); + if (!CPObjectModifiersForClass) + CPObjectModifiersForClass = [CPDictionary dictionary]; + + var hash = [isa hash], + selector = nil, + modifiers = [CPObjectModifiersForClass objectForKey:hash]; + + if (modifiers) + { + selector = [modifiers objectForKey:aKey]; + + if (selector) + return selector == [CPNull null] ? nil : selector; + } + else + { + modifiers = [CPDictionary dictionary]; + + [CPObjectModifiersForClass setObject:modifiers forKey:hash]; + } + + if (selector) + return selector == [CPNull null] ? nil : selector; - if ([self instancesRespondToSelector:selector]) + var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substr(1) + ':'; + + if ([self instancesRespondToSelector:selector = CPSelectorFromString("set" + capitalizedKey)] || + [self instancesRespondToSelector:selector = CPSelectorFromString("_set" + capitalizedKey)]) + { + [modifiers setObject:selector forKey:aKey]; + return selector; - + } + + [modifiers setObject:[CPNull null] forKey:aKey]; + return nil; } /* @ignore */ - (CPString)_ivarForKey:(CPString)aKey { - var ivar, - isKey = "is" + aKey.charAt(0).toUpperCase() + aKey.substr(1); + var ivar = '_' + aKey; + + if (typeof self[ivar] != "undefined") + return ivar; - if (self[ivar = "_" + aKey] != undefined || self[ivar = "_" + isKey] != undefined || - self[ivar = aKey] != undefined || self[ivar = isKey] != undefined) ; + var isKey = "is" + aKey.charAt(0).toUpperCase() + aKey.substr(1); + + 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; @@ -70,35 +152,62 @@ import "CPObject.j" - (id)valueForKey:(CPString)aKey { - var ivar, - theClass = [self class], - selector = [theClass _accessorForKey:aKey] + var selector = [isa _accessorForKey:aKey]; if (selector) - return [self performSelector:selector]; - else if([theClass accessInstanceVariablesDirectly] && (ivar = [self _ivarForKey:aKey])) - return self[ivar]; - else - return [self valueForUndefinedKey:aKey]; + return objj_msgSend(self, selector); + + if([isa accessInstanceVariablesDirectly]) + { + var ivar = [self _ivarForKey:aKey]; + + if (ivar) + return self[ivar]; + } + + return [self valueForUndefinedKey:aKey]; } - (id)valueForKeyPath:(CPString)aKeyPath { - var i = 0, - keys = aKeyPath.split("."), + var keys = aKeyPath.split("."), + + index = 0, count = keys.length, + value = self; - for(; i valueForKey()]: this class is not key value coding-compliant for the key "+aKey+".]"); + [[CPException exceptionWithName:CPUndefinedKeyException + 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 @@ -118,22 +227,35 @@ import "CPObject.j" - (void)setValue:(id)aValue forKey:(CPString)aKey { - var ivar, - theClass = [self class], - selector = [theClass _modifierForKey:aKey]; + var selector = [isa _modifierForKey:aKey]; if (selector) - [self performSelector:selector withObject:aValue]; - else if([theClass accessInstanceVariablesDirectly] && (ivar = [self _ivarForKey:aKey])) - self[ivar] = aValue; - else - [self setValue:aValue forUndefinedKey:aKey]; + return objj_msgSend(self, selector, aValue); + + if([isa 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 { - alert("IMPLEMENT EXCEPTIONS, also, setValueForKey died."); -// CPException.raise(CPUndefinedKeyException, "[<"+this.className()+" "+this+"> setValueForKey()]: this class is not key value coding-compliant for the key "+aKey+".]"); + [[CPException exceptionWithName:CPUndefinedKeyException + reason:[self description] + " is not key value coding-compliant for the key " + aKey + userInfo:[CPDictionary dictionaryWithObjects:[self, aKey] forKeys:[CPTargetObjectUserInfoKey, CPUnknownUserInfoKey]]] raise]; } -@end \ No newline at end of file +@end diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j new file mode 100644 index 000000000..ea1dc2818 --- /dev/null +++ b/Foundation/CPKeyValueObserving.j @@ -0,0 +1,39 @@ +/* + * CPKeyValueCoding.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 "CPObject.j" + + +@implementation CPObject (KeyValueObserving) + +- (void)willChangeValueForKey:(CPString)aKey +{ + +} + + +- (void)didChangeValueForKey:(CPString)aKey +{ + +} + +@end \ No newline at end of file diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index d1e8d97c7..928420510 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -33,6 +33,7 @@ import "CPJSONPConnection.j" import "CPKeyedArchiver.j" import "CPKeyedUnarchiver.j" import "CPKeyValueCoding.j" +import "CPKeyValueObserving.j" import "CPLog.j" import "CPNotification.j" import "CPNotificationCenter.j" diff --git a/Tools/NibApp/AppController.j b/Tools/NibApp/AppController.j index 7dc51c4b8..23f49feef 100644 --- a/Tools/NibApp/AppController.j +++ b/Tools/NibApp/AppController.j @@ -5,21 +5,25 @@ import @implementation AppController : CPObject { + CPWindow _window; + CPWindow _secondWindow; + CPView _view; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification { var cib = [[CPCib alloc] initWithContentsOfURL:@"MainMenu.cib"], - x = [cib instantiateCibWithExternalNameTable:nil]; - - [x setBackgroundColor:[CPColor blueColor]]; - - var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], contentView = [theWindow contentView]; - - [contentView addSubview:x]; - + + [cib instantiateCibWithExternalNameTable:[CPDictionary dictionaryWithObject:self forKey:CPCibOwner]]; + + [_view setBackgroundColor:[CPColor blueColor]]; + + [contentView addSubview:_view]; [theWindow orderFront:self]; + + [_secondWindow orderFront:self]; } @end \ No newline at end of file diff --git a/Tools/NibApp/HelloWorld.nib/classes.nib b/Tools/NibApp/HelloWorld.nib/classes.nib index c4b887e72..01b9f29b9 100644 --- a/Tools/NibApp/HelloWorld.nib/classes.nib +++ b/Tools/NibApp/HelloWorld.nib/classes.nib @@ -2,6 +2,35 @@ + IBClasses + + + CLASS + NSObject + LANGUAGE + ObjC + OUTLETS + + window + id + + + + CLASS + AppController + LANGUAGE + ObjC + OUTLETS + + secondWindow + id + view + id + window + id + + + IBVersion 1 diff --git a/Tools/NibApp/HelloWorld.nib/info.nib b/Tools/NibApp/HelloWorld.nib/info.nib index 2511941ff..b8f7650f5 100644 --- a/Tools/NibApp/HelloWorld.nib/info.nib +++ b/Tools/NibApp/HelloWorld.nib/info.nib @@ -7,11 +7,9 @@ IBOldestOS 5 IBOpenObjects - - 1 - + IBSystem Version - 9E17 + 9F33 targetFramework IBCocoaFramework diff --git a/Tools/NibApp/HelloWorld.nib/keyedobjects.nib b/Tools/NibApp/HelloWorld.nib/keyedobjects.nib index f3853becd952bf6e4288ba57571d3e032bc00511..3ad8add67f8afcdbeae4c98d4699dbea7bfd30f6 100644 GIT binary patch literal 4015 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 GH~$BCC!-Jm literal 11532 zcmeHNZByem5dI9m!p$(#b_Q_lm;jwzZXh9T=D5HR;HDpqqjK&UD`zX@D8qlRCN=`6eMd`yV`yB(b}E&-<~|}83mz>{dW!Hu-VX%@8F5+KfY_+-3|^;8t=Qi zouB$wz1u&pFSM!WhD5u*JHH(Ew8nw1pG~J8()IprU%S2>j&C(8L)R}x4XyE+km+x_ zKA+DIZT8fmgP+)gp?)3UDGJETB^7o+7aUH=q(Rlh(sSFPqZ8L5-QAte7xdEIvjgX| zOP}cI>|Z(>l7McuI~spLFKBYcr<3t?9e(&5IV9xE>>#k&dM;qkpLt$K=gW3dz4Vbt zv*XzzUrz^QpUS$idASMDUFj#E>0yt1l$+nXUZWhXLaJ$61w*_zg}3e;_ANdqA{dzy?& zPLi51z&`nC`!)^BEK-+`ctuf+MRykv=8w}Qz|Il^9+o+{3&%o|_{ukvxoO6zp4$naWEYcChn zn}q~F6~)14N@hEHCJlJi&)Y85QZ#LN-op;I0fKITibyN=AW#==J)%mSxRgeg z+~*%>#HLX{Ml`81>!8OMOw~V(a`oUScz%PERf%Y6o!^R^<t6a`eKWWdqJ` zNvlMaw^>Zn;Nz!Gf3w0{fc1>Z8$!i^Tz)k{0_dp=66ydH1h8rYez!JS6pYFe3QXZJ z%Wk2rV-rf8VZdicTQi|eX-3zofTor46c=qt@A~mjKi2RrrqSS!#j5ZXQd=7~GI=ffg9 zwv@$eu4f^Q_cdaw5S`mYFjE>Jk43cw6W&@r%PYn^{7+ftQq(dRgm|Ba(i&q0P3kw(0dnR{l3`7svs0 z`$`)UC;&}9Kr^z}CfR5yynXLk(-N)}(8`tE)e^|8x*&n|s|ynP22fCW0w$F!#&b=q zDk*UuxE}gB)UM_}Yc3{hD5*^6tGc(zlQ($gPqZ8QO^g;3673g2#edC7=ny0sOnAE=qZH%(=BJuJ|g?8TY2F27sr3IuCiIBqS#@p9DU zt*zV}G|mC@8{@+VdCU2D-m}@E)I>mOud3<|zz+aqFO}nVNgW@_@6p5a_)^oii4Ch@ zR$0?;$a1qFDC2$ZMW41-eZo?uh4Z*fUL0}+PtyX&qcNHpo+tj8L>p! 1050 - 9E17 + 9F33 629 - 949.33 + 949.34 352.00 YES + YES - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES - NSObject + NSObject FirstResponder @@ -41,7 +42,7 @@ -2080244224 134217728 Round Rect Button - + LucidaGrande 1.200000e+01 16 @@ -88,10 +89,119 @@ NSView + + 15 + 2 + {{196, 240}, {480, 270}} + 603979776 + Window + NSWindow + + + + 256 + + YES + + + 268 + {{145, 113}, {154, 19}} + + + YES + + -2080244224 + 134217728 + yikes! + + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{0, 251}, {154, 19}} + + + YES + + -2080244224 + 134217728 + Round Rect Button + + + -2038152961 + 164 + + + 400 + 75 + + + + {480, 270} + + + + {{0, 0}, {1680, 1028}} + + + 15 + 2 + {{196, 240}, {480, 270}} + 603979776 + + + + + + 256 + {480, 270} + + {{0, 0}, {1680, 1028}} + YES + + + view + + + + 20 + + + + window + + + + 21 + + + + orderFront: + + + + 22 + + + + orderOut: + + + + 24 + @@ -160,6 +270,67 @@ + + 12 + + + YES + + + + + + 13 + + + YES + + + + + + + 14 + + + YES + + + + + + 15 + + + + + 16 + + + YES + + + + + + 17 + + + + + 25 + + + YES + + + + + + 26 + + + @@ -174,20 +345,44 @@ 1.editorWindowContentRectSynchronizationRect 10.IBPluginDependency 11.IBPluginDependency + 12.IBPluginDependency + 12.IBWindowTemplateEditedContentRect + 12.NSWindowTemplate.visibleAtLaunch + 12.editorWindowContentRectSynchronizationRect + 13.IBPluginDependency + 14.IBPluginDependency + 14.NSWindowTemplate.visibleAtLaunch + 15.IBPluginDependency + 16.IBPluginDependency + 17.IBPluginDependency + 25.IBPluginDependency + 26.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency YES - - - - + + + + {628, 654} {{319, 416}, {480, 272}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + {{196, 240}, {480, 270}} + + {{196, 240}, {480, 270}} + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + @@ -211,11 +406,41 @@ - 11 + 26 YES + + + + + YES + + YES + + + YES + + + + YES + + YES + + + + + YES + id + + + + + IBUserSource + + + 0 @@ -223,57 +448,90 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxA/AAsADAAxADUANgA7ADwA -QABEAEcASwBUAGwAbQB1AHYAeQCJAIoAjgCYAAsAmQCfALMAtgC3AL8AwgDHAMgAywALAJ0AzADPANIA -0wDVAN4A6ADyAPMA9AD1APYA9wD4APkA/AD/AQkBEwEUARUBFgCrARcBGAEZARwBHwEiVSRudWxs3xAS -AA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAq -ACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18Q -GU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1l -d29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0 -eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1 -ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKAPoAKgDGA -PYAIgCeABYAwgDKAKIA7gACABoAmgDwQDYAz0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA1hOU09iamVj -dNIANwA4ADkAOlgkY2xhc3Nlc1okY2xhc3NuYW1logA6ADVeTlNDdXN0b21PYmplY3RfEBBJQkNvY29h -RnJhbWV3b3Jr0gAOAD0APgA/Wk5TLm9iamVjdHOAB6DSADcAOABBAEKjAEIAQwA1XE5TTXV0YWJsZVNl -dFVOU1NldNIADgA9AEUARoAJoNIANwA4AEgASaMASQBKADVeTlNNdXRhYmxlQXJyYXlXTlNBcnJhedIA -DgA9AEwATYAlpgBOAE8AUABRAFIAU4ALgBCAF4ATgBqAI9wAVQAOAFYAVwBYAFkAWgBbAFwAXQBeAF8A -YABhAGIAYwBkAGIAZgBnAE8AaQBqAGtbTlNDZWxsRmxhZ3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxAS -TlNQZXJpb2RpY0ludGVydmFsXk5TQnV0dG9uRmxhZ3MyXxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29udGVu -dHNZTlNTdXBwb3J0XU5TQ29udHJvbFZpZXdfEA9OU1BlcmlvZGljRGVsYXlcTlNDZWxsRmxhZ3MyXU5T -QnV0dG9uRmxhZ3MT/////4QB/gCAEoAREEsQpIARgAyADYAQEQGQEggAAAAT/////4aEQP9fEBFSb3Vu -ZCBSZWN0IEJ1dHRvbtQADgBuAG8AcABxAHIAcwB0Vk5TU2l6ZVZOU05hbWVYTlNmRmxhZ3OADyNAKAAA -AAAAAIAOEBBcTHVjaWRhR3JhbmRl0gA3ADgAdwB4ogB4ADVWTlNGb2502AB6AA4AewB8AH0AfgB/AIAA -UQCCAIMATgCFAIYAhwBRXxAPTlNOZXh0UmVzcG9uZGVyV05TRnJhbWVWTlNDZWxsWE5TdkZsYWdzWU5T -RW5hYmxlZFhOU1dpbmRvd1tOU1N1cGVydmlld4ATgBaAFIALEQEMCYAVgBNQ0gA3ADgAiwCMpACMAI0A -fAA1XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzYAHoADgCPAH0AkAB/ADIAgACHAJIAkwCFAJQAhwCW -AJdaTlNTdWJ2aWV3c1tOU0ZyYW1lU2l6ZYAVgCKAHIAfgBWAIYAgXxAXe3sxNTcsIDExMH0sIHsxNTQs -IDE5fX3SADcAOACaAJulAJsAnACdAJ4ANVhOU0J1dHRvbllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9u -ZGVy3gCgAFUADgChAKIAWgBbAFwAowCkAF4ApQCmAKcAqABgAKkAqgCrAGIArQBSAK8AsACqALEAsACx -V05TVmFsdWVfEBNOU051bWJlck9mVGlja01hcmtzXxASTlNUaWNrTWFya1Bvc2l0aW9uWk5TTWF4VmFs -dWVaTlNNaW5WYWx1ZVpOU1ZlcnRpY2FsXU5TQWx0SW5jVmFsdWVfEBpOU0FsbG93c1RpY2tNYXJrVmFs -dWVzT25seSNASQAAAAAAAIAbEAAQAYARgBiAGiNAWQAAAAAAACMAAAAAAAAAAAgI1AAOAG4AbwBwAHEA -cgC1AHSAD4AZWUhlbHZldGljYdgAegAOAHsAfAB9AH4AfwCAAFEAuQC6AFAAhQCGAIcAUYATgB6AHYAX -CYAVgBPSADcAOADAAMGkAMEAjQB8ADVcTlNTbGlkZXJDZWxs0gAOAD0ARQDEgAmiAE8AUoAQgBpfEBZ7 -ezM1OSwgMTA4fSwgezk2LCAyMX190gA3ADgAyQDKpQDKAJwAnQCeADVYTlNTbGlkZXJaezQ4MCwgMjcy -fdIANwA4AM0AzqQAzgCdAJ4ANVxOU0N1c3RvbVZpZXfSAA4AMgAzANGABIAkXU5TQXBwbGljYXRpb27S -ADcAOADUAEqiAEoANdIADgA9AEwA14AlpgBPAFEAUgAfAFEAH4AQgBOAGoACgBOAAtIADgA9AEwA4IAl -pwBQAB8ATgBPAFEAUgBTgBeAAoALgBCAE4AagCPSAA4APQBMAOqAJacA6wDsAO0A7gDvAPAA8YApgCqA -K4AsgC2ALoAvW1NsaWRlciBDZWxsXEZpbGUncyBPd25lcl8QH0J1dHRvbiBDZWxsIChSb3VuZCBSZWN0 -IEJ1dHRvbilfECVSb3VuZCBSZWN0IEJ1dHRvbiAoUm91bmQgUmVjdCBCdXR0b24pW0N1c3RvbSBWaWV3 -XxARSG9yaXpvbnRhbCBTbGlkZXJbQXBwbGljYXRpb27SAA4APQBMAPuAJaDSAA4APQBMAP6AJaDSAA4A -PQBMAQGAJacAUAAfAE4ATwBRAFIAU4AXgAKAC4AQgBOAGoAj0gAOAD0ATAELgCWnAQwBDQEOAQ8BEAER -ARKANIA1gDaAN4A4gDmAOhALEAwQCRAIEAoT//////////3SAA4APQBFARuACaDSAA4APQBMAR6AJaDS -AA4APQBMASGAJaDSADcAOAEjASSiASQANV5OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBU -AGYA5wDtATgBPwFGAVQBZgGCAZABnAGoAbYBwQHPAesB+QIMAh4COAJCAk8CUQJTAlUCVwJZAlsCXQJf -AmECYwJlAmcCaQJrAm0CbwJxAnMCfAKIAooCjAKVAp4CpwKyArcCxgLZAuIC7QLvAvAC+QMAAw0DEwMc -Ax4DHwMoAy8DPgNGA08DUQNeA2ADYgNkA2YDaANqA5sDpwO9A9ID4QPzA/4ECAQWBCgENQRDBEwETgRQ -BFIEVARWBFgEWgRcBF8EZARtBIEEkgSZBKAEqQSrBLQEtgS4BMUEzgTTBNoE+wUNBRUFHAUlBS8FOAVE -BUYFSAVKBUwFTwVQBVIFVAVVBV4FZwV0BYEFogWtBbkFuwW9Bb8FwQXDBcUFxwXhBeoF9QX+BggGDwYb -BlQGXAZyBocGkgadBqgGtgbTBtwG3gbgBuIG5AbmBugG8Qb6BvsG/AcNBw8HEQcbBzwHPgdAB0IHRAdF -B0cHSQdSB1sHaAdxB3MHeAd6B3wHlQeeB6kHsge9B8YHzwfcB+UH5wfpB/cIAAgFCA4IEAgdCB8IIQgj -CCUIJwgpCDIINAhDCEUIRwhJCEsITQhPCFEIWghcCGsIbQhvCHEIcwh1CHcIeQiFCJIItAjcCOgI/AkI -CREJEwkUCR0JHwkgCSkJKwk6CTwJPglACUIJRAlGCUgJUQlTCWIJZAlmCWgJaglsCW4JcAlyCXQJdgl4 -CXoJgwmMCY4JjwmYCZoJmwmkCaYJpwmwCbUAAAAAAAACAgAAAAAAAAElAAAAAAAAAAAAAAAAAAAJxA +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxB2AAsADAAxADUANgA7ADwA +QgBWAFcAWABZAGEAYgBmAGcAagBWAHIACwB7AIAAjACNAKUApgCuAK8AsgCzALcAuwDDAMQAywDMAGEA +CwBmANAA1ADbAOMA5ADoAO0ACwD1APoBAgEDAMsBCgESARMBJwEqASsBLgExAAsAZAEyATUBNgE7ATwB +PwFEAUUBVgFZAVoBXAFtAX8BkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGjAaYBvAHSAdMB +1AEfAdUB1gHXAdgB2QHaAdsB3ACtAd0B3gBUAd8B4AHhAeIB5QHoAetVJG51bGzfEBIADQAOAA8AEAAR +ABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAv +ADBWTlNSb290ViRjbGFzc11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3Np +YmlsaXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xh +c3Nlc0tleXNaTlNPaWRzS2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9y +c11OU0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNj +ZXNzaWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoB1gEWAXIB0gCiASoAFgFuA +XYBLgHKAAIAGgEmAcxAcgF7SAA4AMgAzADRbTlNDbGFzc05hbWWABIADWE5TT2JqZWN00gA3ADgAOQA6 +WCRjbGFzc2VzWiRjbGFzc25hbWWiADoANV5OU0N1c3RvbU9iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvS +AA4APQA+AD9aTlMub2JqZWN0c4AnogBAAEGAB4AQ2gBDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8A +UABRAFIAUwBUACtcTlNXaW5kb3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFn +c11OU1dpbmRvd0NsYXNzXE5TV2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5 +bGVNYXNrW05TVmlld0NsYXNzgAuAD4AOgAkSJAAAAIAKgAgQAhAPgABfEBh7ezE5NiwgMjQwfSwgezQ4 +MCwgMjcwfX1WV2luZG93WE5TV2luZG931ABaAA4AWwBcACsAXgBfAGBfEA9OU05leHRSZXNwb25kZXJY +TlN2RmxhZ3NbTlNGcmFtZVNpemWAAIANEQEAgAxaezQ4MCwgMjcwfdIANwA4AGMAZKMAZABlADVWTlNW +aWV3W05TUmVzcG9uZGVyXxAWe3swLCAwfSwgezE2ODAsIDEwMjh9fdIANwA4AGgAaaIAaQA1XxAQTlNX +aW5kb3dUZW1wbGF0ZdoAQwAOAEQARQBGAEcASABJAEoASwBrAE0AbQBPAFAAUQBwAFMAVAArgBKAD4Am +gAmACoARgADXAFoADgBzAFsAXABYAHQAdQBeAHcAXwB4AHUAelpOU1N1YnZpZXdzW05TU3VwZXJ2aWV3 +gBOADYAUgCSAE4Al0gAOAD0AfAB9gCOiAH4Af4AVgB/YAFoADgCBAIIAWwCDAFgAdABrAIUAhgCHAIgA +iQB1AGtXTlNGcmFtZVZOU0NlbGxZTlNFbmFibGVkgBKAHoAWgBcRAQwJgBOAEl8QF3t7MTQ1LCAxMTN9 +LCB7MTU0LCAxOX193ACOAA4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AmwCfAKAAfgCiAKMA +pFtOU0NlbGxGbGFnc18QE05TQWx0ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNC +dXR0b25GbGFnczJfEA9OU0tleUVxdWl2YWxlbnRaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9s +Vmlld18QD05TUGVyaW9kaWNEZWxheVxOU0NlbGxGbGFnczJdTlNCdXR0b25GbGFncxP/////hAH+AIAd +gBwQSxCkgByAGIAZgBURAZASCAAAABP/////hoRA/1Z5aWtlcyHUAA4ApwCoAKkAqgCrAKwArVZOU1Np +emVWTlNOYW1lWE5TZkZsYWdzgBsjQCgAAAAAAACAGhAQXEx1Y2lkYUdyYW5kZdIANwA4ALAAsaIAsQA1 +Vk5TRm9udFDSADcAOAC0ALWkALUAtgCCADVcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2VsbNIANwA4ALgA +uaUAuQC6AGQAZQA1WE5TQnV0dG9uWU5TQ29udHJvbNgAWgAOAIEAggBbAIMAWAB0AGsAhQC+AL8AiACJ +AHUAa4ASgB6AIIAhCYATgBJfEBV7ezAsIDI1MX0sIHsxNTQsIDE5fX3cAI4ADgCPAJAAkQCSAJMAlACV +AJYAlwCYAJkAmgCbAJwAnQCbAMgAoAB/AKIAowCkgB2AHIAcgCKAGYAfXxARUm91bmQgUmVjdCBCdXR0 +b27SADcAOADNAM6jAM4AzwA1Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnSADcAOADRANKjANIA0wA1XE5T +TXV0YWJsZVNldFVOU1NldNIADgA9AHwA1oAjpADXANgA2QDagCmALIBAgEPUAA4A3ADdAN4A3wBBAB8A +4l1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyAK4AQgAKAKlZ3aW5kb3fSADcAOADlAOajAOYA +5wA1XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4A3ADdAN4A3wDqAB8A7IAr +gC2AAoA/2ABaAA4AcwBbAFwAWAAyAHQA7gDvAPAAiADxAO4A8wD0gC6APoAvgDuALoA9gDzSAA4APQB8 +APeAI6IA+AD5gDCANNgAWgAOAIEAggBbAIMAWAB0AOoAhQD9AP4AiACJAO4A6oAtgB6AMYAyCYAugC1f +EBd7ezE1NywgMTEwfSwgezE1NCwgMTl9fdwAjgAOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACd +AJsBBwCgAPgAogCjAKSAHYAcgByAM4AZgDDYAFoADgCBAIIAWwCDAFgAdADqAQwBDQEOAIgAiQDuAOqA +LYA6gDWANgmALoAtXxAWe3szNTksIDEwOH0sIHs5NiwgMjF9fd4BFACOAA4BFQEWAJMAlACVARcBGACX +ARkBGgEbARwAmQEdAR4BHwCbASEA+QEjASQBHgElASQBJVdOU1ZhbHVlXxATTlNOdW1iZXJPZlRpY2tN +YXJrc18QEk5TVGlja01hcmtQb3NpdGlvblpOU01heFZhbHVlWk5TTWluVmFsdWVaTlNWZXJ0aWNhbF1O +U0FsdEluY1ZhbHVlXxAaTlNBbGxvd3NUaWNrTWFya1ZhbHVlc09ubHkjQEkAAAAAAACAORAAEAGAHIA3 +gDQjQFkAAAAAAAAjAAAAAAAAAAAICNQADgCnAKgAqQCqAKsBKQCtgBuAOFlIZWx2ZXRpY2HSADcAOAEs +AS2kAS0AtgCCADVcTlNTbGlkZXJDZWxs0gA3ADgBLwEwpQEwALoAZABlADVYTlNTbGlkZXJaezQ4MCwg +MjcyfdIANwA4ATMBNKQBNABkAGUANVxOU0N1c3RvbVZpZXdUdmlld9QADgDcAN0A3gE3AEEAfgE6gEKA +EIAVgEFZb3JkZXJPdXQ60gA3ADgBPQE+owE+AOcANV8QFU5TTmliQ29udHJvbENvbm5lY3RvctQADgDc +AN0A3gE3AEEA+AFDgEKAEIAwgERbb3JkZXJGcm9udDrSAA4APQFGAUeASK4A+QEOAOoAawCHAL8BTgD+ +AH8AfgBAAEEATAD4gDSANoAtgBKAF4AhgEaAMoAfgBWAB4AQgAuAMNIADgAyADMBWIAEgEddTlNBcHBs +aWNhdGlvbtIANwA4AVsAz6IAzwA10gAOAD0BRgFegEiuAOoA+QAfAEEAfgB/AB8A+ABrAGsAHwAfAEAA +6oAtgDSAAoAQgBWAH4ACgDCAEoASgAKAAoAHgC3SAA4APQFGAW+ASK8QDwD5AGsA6gEOAIcAvwFOAP4A +fwBAAEwAQQB+AB8A+IA0gBKALYA2gBeAIYBGgDKAH4AHgAuAEIAVgAKAMNIADgA9AUYBgYBIrxAPAYIB +gwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQgEyATYBOgE+AUIBRgFKAU4BUgFWAVoBXgFiAWYBaXxAR +SG9yaXpvbnRhbCBTbGlkZXJcQ29udGVudCBWaWV3W0N1c3RvbSBWaWV3W1NsaWRlciBDZWxsXxAUQnV0 +dG9uIENlbGwgKHlpa2VzISlfECFCdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pLTFbQXBwbGlj +YXRpb25fEB9CdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pXxAnUm91bmQgUmVjdCBCdXR0b24g +KFJvdW5kIFJlY3QgQnV0dG9uKS0xXxARV2luZG93IChXaW5kb3cpLTFeQ29udGVudCBWaWV3LTFfEA9X +aW5kb3cgKFdpbmRvdylfEBpSb3VuZCBSZWN0IEJ1dHRvbiAoeWlrZXMhKVxGaWxlJ3MgT3duZXJfECVS +b3VuZCBSZWN0IEJ1dHRvbiAoUm91bmQgUmVjdCBCdXR0b24p0gAOAD0BRgGigEig0gAOAD0BRgGlgEig +0gAOAD0BRgGogEivEBMA2AD5AQ4A6gBrAIcAvwFOANkA2gD+AH8AfgBAAEEATADXAB8A+IAsgDSANoAt +gBKAF4AhgEaAQIBDgDKAH4AVgAeAEIALgCmAAoAw0gAOAD0BRgG+gEivEBMBvwHAAcEBwgHDAcQBxQHG +AccByAHJAcoBywHMAc0BzgHPAdAB0YBfgGCAYYBigGOAZIBlgGaAZ4BogGmAaoBrgGyAbYBugG+AcIBx +EBQQChALEA0QERAaE//////////9EBgQFhAJEBkQDhAMEBUQGxAI0gAOAD0AfAHkgCOg0gAOAD0BRgHn +gEig0gAOAD0BRgHqgEig0gA3ADgB7AHtogHtADVeTlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBE +AFIAVABmAVUBWwGmAa0BtAHCAdQB8AH+AgoCFgIkAi8CPQJZAmcCegKMAqYCsAK9Ar8CwQLDAsUCxwLJ +AssCzQLPAtEC0wLVAtcC2QLbAt0C3wLhAuoC9gL4AvoDAwMMAxUDIAMlAzQDRwNQA1sDXQNiA2QDZgOP +A5wDqQO3A8EDzwPcA+4EAgQOBBAEEgQUBBYEGwQdBB8EIQQjBCUEQARHBFAEYQRzBHwEiASKBIwEjwSR +BJwEpQSsBLMEvwTYBOEE5gT5BSIFJAUmBSgFKgUsBS4FMAVNBVgFZAVmBWgFagVsBW4FcAV5BXsFgAWC +BYQFpQWtBbQFvgXABcIFxAXGBckFygXMBc4F6AYZBiUGOwZQBl8GcQZ8BoYGlAamBrMGwQbKBswGzgbQ +BtIG1AbWBtgG2gbdBuIG6wbyBwMHCgcRBxoHHAclBycHKQc2Bz8HRAdLB0wHVQdeB2sHeAeBB4wHlQef +B8AHwgfEB8YHyAfJB8sHzQflCBYIGAgaCBwIHgggCCIINgg/CEYIVQhdCGYIbQh6CIAIiQiLCJQIlgiY +CJoInAitCLsIxAjMCM4I0AjSCNQI2wjkCOsJAgkRCSIJJAkmCSgJKglLCU0JTwlRCVMJVQlXCVkJYglk +CWkJawltCY4JkAmSCZQJlgmXCZkJmwm1CeYJ6AnqCewJ7gnwCfIKEwoVChcKGQobChwKHgogCjkKcgp6 +CpAKpQqwCrsKxgrUCvEK+gr8Cv4LAAsCCwQLBgsPCxgLGQsaCysLLQsvCzkLQgtLC1gLYQtsC3ULgAuJ +C5ILnwukC7ULtwu5C7sLvQvHC9AL1wvvDAAMAgwEDAYMCAwUDB0MHww8DD4MQAxCDEQMRgxIDEoMTAxO +DFAMUgxUDFYMWAxhDGMMZQxzDHwMgQyKDIwMqQyrDK0MrwyxDLMMtQy3DLkMuwy9DL8MwQzDDMUMzgzQ +DPEM8wz1DPcM+Qz7DP0M/w0BDQMNBQ0HDQkNCw0NDQ8NGA0aDTsNPQ0/DUENQw1FDUcNSQ1LDU0NTw1R +DVMNVQ1XDVkNbQ16DYYNkg2pDc0N2Q37DiUOOQ5IDloOdw6EDqwOtQ63DrgOwQ7DDsQOzQ7PDvgO+g78 +Dv4PAA8CDwQPBg8IDwoPDA8ODxAPEg8UDxYPGA8aDxwPHg8nDykPUg9UD1YPWA9aD1wPXg9gD2IPZA9m +D2gPag9sD24PcA9yD3QPdg94D3oPfA9+D4APgg+ED40Pjw+RD5MPlQ+XD5kPmw+dD58PqA+qD6sPtA+2 +D7cPwA/CD8MPzA/RAAAAAAAAAgIAAAAAAAAB7gAAAAAAAAAAAAAAAAAAD+A diff --git a/Tools/NibApp/main.j b/Tools/NibApp/main.j index 4bbfb1618..9f3ebc983 100755 --- a/Tools/NibApp/main.j +++ b/Tools/NibApp/main.j @@ -12,6 +12,8 @@ import import "AppController.j" +CPLogRegister(CPLogPopup); + function main(args, namedArgs) { CPApplicationMain(args, namedArgs); diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index f11e4b92d..e307708da 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -23,9 +23,23 @@ import "NSButton.j" import "NSCell.j" import "NSControl.j" +import "NSCustomObject.j" import "NSCustomView.j" import "NSFont.j" import "NSIBObjectData.j" +import "NSNibConnector.j" import "NSResponder.j" import "NSSlider.j" import "NSView.j" +import "NSWindowTemplate.j" + +function CP_NSMapClassName(aClassName) +{ + if (aClassName == @"NSView") + return "CPView"; + + if (aClassName == @"NSWindow") + return @"CPWindow"; + + return aClassName; +} diff --git a/Tools/nib2cib/NSButton.j b/Tools/nib2cib/NSButton.j index 9b0b40d1d..60e408042 100644 --- a/Tools/nib2cib/NSButton.j +++ b/Tools/nib2cib/NSButton.j @@ -45,6 +45,9 @@ import "NSControl.j" [self setBezelStyle:[cell bezelStyle]]; [self setBordered:[cell isBordered]]; + + // FIXME + _sendActionOn = CPLeftMouseUpMask; } return self; diff --git a/Tools/nib2cib/NSCustomObject.j b/Tools/nib2cib/NSCustomObject.j new file mode 100644 index 000000000..62891fdb3 --- /dev/null +++ b/Tools/nib2cib/NSCustomObject.j @@ -0,0 +1,40 @@ + +import + + +@implementation _CPCibCustomObject (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self){ + _className = [aCoder decodeObjectForKey:@"NSClassName"]; + print(":::"+_className); + } + return self; +} + +@end + +@implementation NSCustomObject : _CPCibCustomObject +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{print("i-nit form coder"); + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibCustomObject class]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + print("awaking from coder..."); + return self; +} + +@end \ No newline at end of file diff --git a/Tools/nib2cib/NSCustomView.j b/Tools/nib2cib/NSCustomView.j index 9b114bf53..6a1362497 100644 --- a/Tools/nib2cib/NSCustomView.j +++ b/Tools/nib2cib/NSCustomView.j @@ -25,6 +25,8 @@ import import "NSView.j" +var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; + @implementation NSCustomView : CPView { CPString _className; @@ -44,20 +46,13 @@ import "NSView.j" { [super encodeWithCoder:aCoder]; - [aCoder encodeObject:_NSCustomViewMapClassName(_className) forKey:@"CPCustomViewClassNameKey"]; + [aCoder encodeObject:CP_NSMapClassName(_className) forKey:_CPCibCustomViewClassNameKey]; } - (CPString)classForKeyedArchiver { - return [CPCustomView class]; + return [_CPCibCustomView class]; } @end -function _NSCustomViewMapClassName(aClassName) -{ - if (aClassName == @"NSView") - return "CPView"; - - return aClassName; -} diff --git a/Tools/nib2cib/NSIBObjectData.j b/Tools/nib2cib/NSIBObjectData.j index fa7cd2576..594e8ff79 100644 --- a/Tools/nib2cib/NSIBObjectData.j +++ b/Tools/nib2cib/NSIBObjectData.j @@ -73,9 +73,9 @@ import //_accessibilityConnectors = [aCoder decodeObjectForKey:@"NSAccessibilityConnectors"]; //_accessibilityOidsKeys = [aCoder decodeObjectForKey:@"NSAccessibilityOidsKeys"]; //_accessibilityOidsValues = [aCoder decodeObjectForKey:@"NSAccessibilityOidsValues"]; - - _classesKeys = [aCoder decodeObjectForKey:@"NSClassesKeys"]; - _classesValues = [aCoder decodeObjectForKey:@"NSClassesValues"]; + + _classesKeys = [aCoder decodeObjectForKey:@"NSClassesKeys"];print("d"); + _classesValues = [aCoder decodeObjectForKey:@"NSClassesValues"];print("e"); _connections = [aCoder decodeObjectForKey:@"NSConnections"]; @@ -90,7 +90,7 @@ import _oidKeys = [aCoder decodeObjectForKey:@"NSOidsKeys"]; _oidValues = [aCoder decodeObjectForKey:@"NSOidsValues"]; - _rootObject = [aCoder decodeObjectForKey:@"NSRoot"]; + _fileOwner = [aCoder decodeObjectForKey:@"NSRoot"]; _visibleWindows = [aCoder decodeObjectForKey:@"NSVisibleWindows"]; } diff --git a/Tools/nib2cib/NSNibConnector.j b/Tools/nib2cib/NSNibConnector.j new file mode 100644 index 000000000..f3dae5301 --- /dev/null +++ b/Tools/nib2cib/NSNibConnector.j @@ -0,0 +1,72 @@ + +import + + +@implementation _CPCibConnector (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _source = [aCoder decodeObjectForKey:@"NSSource"]; + _destination = [aCoder decodeObjectForKey:@"NSDestination"]; + _label = [aCoder decodeObjectForKey:@"NSLabel"]; +#if DEBUG + CPLog(@"Connection: " + [_source description] + " " + [_destination description] + " " + _label); +#endif + } + + return self; +} + +@end + +@implementation NSNibConnector : _CPCibConnector +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [[_CPCibConnector alloc] NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibConnector class]; +} + +@end + +@implementation NSNibControlConnector : _CPCibControlConnector +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [[_CPCibControlConnector alloc] NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibControlConnector class]; +} + +@end + +@implementation NSNibOutletConnector : _CPCibOutletConnector +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [[_CPCibOutletConnector alloc] NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibOutletConnector class]; +} + +@end diff --git a/Tools/nib2cib/NSWindowTemplate.j b/Tools/nib2cib/NSWindowTemplate.j new file mode 100644 index 000000000..a87338805 --- /dev/null +++ b/Tools/nib2cib/NSWindowTemplate.j @@ -0,0 +1,59 @@ + +import + + +@implementation _CPCibWindowTemplate (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [super init]; + + if (self) + { + _minSize = [aCoder decodeSizeForKey:@"NSMinSize"]; + _maxSize = [aCoder decodeSizeForKey:@"NSMaxSize"]; + _screenRect = [aCoder decodeRectForKey:@"NSScreenRect"]; // screen created on + _viewClass = [aCoder decodeObjectForKey:@"NSViewClass"]; + _wtFlags = [aCoder decodeIntForKey:@"NSWTFlags"]; + _windowBacking = [aCoder decodeIntForKey:@"NSWindowBacking"]; + + // Convert NSWindows to CPWindows. + _windowClass = CP_NSMapClassName([aCoder decodeObjectForKey:@"NSWindowClass"]); + + _windowRect = [aCoder decodeRectForKey:@"NSWindowRect"]; + _windowStyleMask = [aCoder decodeIntForKey:@"NSWindowStyleMask"]; + _windowTitle = [aCoder decodeObjectForKey:@"NSWindowTitle"]; + _windowView = [aCoder decodeObjectForKey:@"NSWindowView"]; + + /* + _windowRect.origin.y -= _screenRect.size.height - [[NSScreen mainScreen] frame].size.height; + if (![_windowClass isEqualToString:@"NSPanel"]) + _windowRect.origin.y -= [NSMainMenuView menuHeight]; // compensation for the additional menu bar + */ + } + + return self; +} + +@end + +@implementation NSWindowTemplate : _CPCibWindowTemplate +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (id)awakeAfterUsingCoder:(CPCoder)aCoder +{ + return self; +} + +- (Class)classForKeyedArchiver +{ + return [_CPCibWindowTemplate class]; +} + +@end From 92eccd36a8bf935910e3909e3536ca77cb54f2b1 Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Thu, 18 Sep 2008 00:12:52 -0700 Subject: [PATCH 10/24] Updated TextMate bundle --- .../JavaScript Objective-J.tmbundle.zip | Bin 24813 -> 16643 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tools/TextMate/JavaScript Objective-J.tmbundle.zip b/Tools/TextMate/JavaScript Objective-J.tmbundle.zip index 10319c64396a2378f075bf38dde5aea1d1943925..e26fd961cde85439a195afd9899ca78a3f82a26b 100644 GIT binary patch delta 14077 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 literal 24813 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

XYe#2RQS{4Wxee5bH2TVHyy<&hpv;+8oT`6v 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 From 0ee572c09418d38f440c3a1adc491dbeb501153b Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Thu, 18 Sep 2008 00:46:05 -0700 Subject: [PATCH 11/24] CPSplitView updated to draw dividers in drawDividerInRect, and use it's own runloop. [#50 state:resolved responsible:tlrobinson] [#51 state:resolved responsible:tlrobinson] --- AppKit/CPSplitView.j | 191 +++++++++++++++++++++++-------------------- 1 file changed, 104 insertions(+), 87 deletions(-) diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index 97bff90a7..adafffca9 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -35,17 +35,19 @@ var CPSplitViewHorizontalImage = nil, @implementation CPSplitView : CPView { - id _delegate; - BOOL _isVertical; - BOOL _isPaneSplitter; + id _delegate; + BOOL _isVertical; + BOOL _isPaneSplitter; - int _currentDivider; - float _initialOffset; + int _currentDivider; + float _initialOffset; - CPString _originComponent; - CPString _sizeComponent; + CPString _originComponent; + CPString _sizeComponent; - CPArray _DOMDividerElements; + CPArray _DOMDividerElements; + CPString _dividerImagePath; + int _drawingDivider; } /* @@ -92,6 +94,7 @@ var CPSplitViewHorizontalImage = nil, _originComponent = [self isVertical] ? "x" : "y"; _sizeComponent = [self isVertical] ? "width" : "height"; + _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; [self adjustSubviews]; } @@ -162,33 +165,30 @@ var CPSplitViewHorizontalImage = nil, - (void)drawRect:(CGRect)rect { -#if PLATFORM(DOM) - var dividerPath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; - var count = [_subviews count]; - for (var i = 0; i < count; i++) + for (var _drawingDivider = 0; _drawingDivider < count-1; _drawingDivider++) { - if (!_DOMDividerElements[i]) - { - _DOMDividerElements[i] = document.createElement("div"); - _DOMDividerElements[i].style.cursor = "move"; - _DOMDividerElements[i].style.position = "absolute"; - _DOMDividerElements[i].style.backgroundRepeat = "repeat"; - CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[i]); - } - - var frame = [self rectOfDividerAtIndex:i]; - CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[i], NULL, _CGRectGetMinX(frame), _CGRectGetMinY(frame)); - CPDOMDisplayServerSetStyleSize(_DOMDividerElements[i], _CGRectGetWidth(frame), _CGRectGetHeight(frame)); - - _DOMDividerElements[i].style.backgroundImage = "url('"+dividerPath+"')"; + [self drawDividerInRect:[self rectOfDividerAtIndex:_drawingDivider]]; } -#endif } - (void)drawDividerInRect:(CGRect)aRect { - // TODO: figure out a way to "draw" dividers using DOM element +#if PLATFORM(DOM) + if (!_DOMDividerElements[_drawingDivider]) + { + _DOMDividerElements[_drawingDivider] = document.createElement("div"); + _DOMDividerElements[_drawingDivider].style.cursor = "move"; + _DOMDividerElements[_drawingDivider].style.position = "absolute"; + _DOMDividerElements[_drawingDivider].style.backgroundRepeat = "repeat"; + CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]); + } + + CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect)); + CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect)); + + _DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')"; +#endif } - (BOOL)cursorAtPoint:(CPPoint)aPoint hitDividerAtIndex:(int)anIndex @@ -207,72 +207,89 @@ var CPSplitViewHorizontalImage = nil, return CGRectContainsPoint(effectiveRect, aPoint) || (additionalRect && CGRectContainsPoint(additionalRect, aPoint)); } -- (void)mouseDown:(CPEvent)theEvent -{ - var location = [theEvent locationInWindow], - point = [self convertPoint:location fromView:nil]; - - for (var i = 0; i < [_subviews count] - 1; i++) - { - var frame = [_subviews[i] frame], - startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent]; - - if ([self cursorAtPoint:point hitDividerAtIndex:i]) - { - if ([theEvent clickCount] == 2 && - [_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)] && - [_delegate respondsToSelector:@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)]) - { - var minPosition = [self minPossiblePositionOfDividerAtIndex:i], - maxPosition = [self maxPossiblePositionOfDividerAtIndex:i]; - - if ([_delegate splitView:self canCollapseSubview:_subviews[i]] && [_delegate splitView:self shouldCollapseSubview:_subviews[i] forDoubleClickOnDividerAtIndex:i]) - { - if ([self isSubviewCollapsed:_subviews[i]]) - [self setPosition:(minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i]; - else - [self setPosition:minPosition ofDividerAtIndex:i]; - } - else if ([_delegate splitView:self canCollapseSubview:_subviews[i+1]] && [_delegate splitView:self shouldCollapseSubview:_subviews[i+1] forDoubleClickOnDividerAtIndex:i]) - { - if ([self isSubviewCollapsed:_subviews[i+1]]) - [self setPosition:(minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i]; - else - [self setPosition:maxPosition ofDividerAtIndex:i]; - } - } - else - { - _currentDivider = i; - _initialOffset = startPosition - point[_originComponent]; - [self _postNotificationWillResize]; +/* + Tracks the divider. + @param anEvent the input event +*/ +- (void)trackDivider:(CPEvent)anEvent +{ + var type = [anEvent type]; + + if (type == CPLeftMouseUp) + { + if (_currentDivider != CPNotFound) + { + _currentDivider = CPNotFound; + [self _postNotificationDidResize]; + } + + return; + } + + if (type == CPLeftMouseDown) + { + var location = [anEvent locationInWindow], + point = [self convertPoint:location fromView:nil]; + + _currentDivider = CPNotFound; + for (var i = 0; i < [_subviews count] - 1; i++) + { + var frame = [_subviews[i] frame], + startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent]; + + if ([self cursorAtPoint:point hitDividerAtIndex:i]) + { + if ([anEvent clickCount] == 2 && + [_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)] && + [_delegate respondsToSelector:@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)]) + { + var minPosition = [self minPossiblePositionOfDividerAtIndex:i], + maxPosition = [self maxPossiblePositionOfDividerAtIndex:i]; + + if ([_delegate splitView:self canCollapseSubview:_subviews[i]] && [_delegate splitView:self shouldCollapseSubview:_subviews[i] forDoubleClickOnDividerAtIndex:i]) + { + if ([self isSubviewCollapsed:_subviews[i]]) + [self setPosition:(minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i]; + else + [self setPosition:minPosition ofDividerAtIndex:i]; + } + else if ([_delegate splitView:self canCollapseSubview:_subviews[i+1]] && [_delegate splitView:self shouldCollapseSubview:_subviews[i+1] forDoubleClickOnDividerAtIndex:i]) + { + if ([self isSubviewCollapsed:_subviews[i+1]]) + [self setPosition:(minPosition + (maxPosition - minPosition) / 2) ofDividerAtIndex:i]; + else + [self setPosition:maxPosition ofDividerAtIndex:i]; + } + } + else + { + _currentDivider = i; + _initialOffset = startPosition - point[_originComponent]; + + [self _postNotificationWillResize]; + } } - - return; } } - _currentDivider = CPNotFound; + + else if (type == CPLeftMouseDragged) + { + if (_currentDivider != CPNotFound) + { + var location = [anEvent locationInWindow], + point = [self convertPoint:location fromView:nil]; + + [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; + } + } + + [CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES]; } -- (void)mouseDragged:(CPEvent)theEvent +- (void)mouseDown:(CPEvent)anEvent { - if (_currentDivider != CPNotFound) - { - var location = [theEvent locationInWindow], - point = [self convertPoint:location fromView:nil]; - - [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; - } -} - -- (void)mouseUp:(CPEvent)theEvent -{ - if (_currentDivider != CPNotFound) - { - _currentDivider = CPNotFound; - [self _postNotificationDidResize]; - } + [self trackDivider:anEvent]; } - (float)maxPossiblePositionOfDividerAtIndex:(int)dividerIndex From 08d0dfd190cda41e895e9dfd570682e1e98aa360 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Thu, 18 Sep 2008 15:55:12 -0700 Subject: [PATCH 12/24] Remove the alert that was added. --- AppKit/CPControl.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index a035f5467..421b89b08 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -253,8 +253,8 @@ var CPControlBlackColor = [CPColor blackColor]; - (void)mouseUp:(CPEvent)anEvent { - if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])){alert([_target description] + " : " + _action); - [self sendAction:_action to:_target];} + if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil])) + [self sendAction:_action to:_target]; [super mouseUp:anEvent]; } From 07d4ebdf9f0526e5e3575528c8c702d59e65ec33 Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Thu, 18 Sep 2008 16:33:01 -0700 Subject: [PATCH 13/24] Tests README --- Tests/README | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Tests/README diff --git a/Tests/README b/Tests/README new file mode 100644 index 000000000..b81dbe228 --- /dev/null +++ b/Tests/README @@ -0,0 +1,5 @@ +Requires objj be installed, as well as ojunit, located at http://github.com/280north/ojunit + +Run individual tests using a command similar to the following: + + objj ojunit/OJTestRunnerText.j cappuccino/Tests/Foundation/CPDateTest.j From f9e6cf3da98e3bc217382c26e9415a0b4ec6839d Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Thu, 18 Sep 2008 16:38:41 -0700 Subject: [PATCH 14/24] Fix infinite loop in CPTextField, add selectText: [#55 state:resolved] --- AppKit/CPTextField.j | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 900015de8..da3d9fdd2 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -140,7 +140,7 @@ var _CPTextFieldSquareBezelColor = nil; - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; - + if (self) { _value = @""; @@ -432,7 +432,7 @@ var _CPTextFieldSquareBezelColor = nil; return [[self class] _inputElement].value; #endif - return [self stringValue]; + return [super stringValue]; } /* @@ -469,6 +469,19 @@ var _CPTextFieldSquareBezelColor = nil; #endif } +/* + Select all the text in the CPTextField. +*/ +- (void)selectText:(id)sender +{ +#if PLATFORM(DOM) + var element = [[self class] _inputElement]; + + if (element.parentNode == _DOMElement && ([self isEditable] || [self isSelectable])) + element.select(); +#endif +} + @end var CPTextFieldIsSelectableKey = @"CPTextFieldIsSelectableKey", From ae6e3f2c47724625331f65caa7585b66f75269cd Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Thu, 18 Sep 2008 22:47:15 -0700 Subject: [PATCH 15/24] Added coding support for tags to CPView and nib2cib. Reviewed by me. --- AppKit/CPView.j | 18 ++++++++++++++++++ Tools/nib2cib/NSView.j | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 1fe0de2e2..8a90392db 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -88,6 +88,8 @@ var DOMElementPrototype = nil, CPGraphicsContext _graphicsContext; + int _tag; + CGRect _frame; CGRect _bounds; CGAffineTransform _boundsTransform; @@ -174,6 +176,8 @@ var DOMElementPrototype = nil, _subviews = []; + _tag = -1; + _frame = _CGRectMakeCopy(aFrame); _bounds = _CGRectMake(0.0, 0.0, width, height); @@ -464,6 +468,11 @@ var DOMElementPrototype = nil, return enclosingMenuItem;*/ } +- (int)tag +{ + return _tag; +} + /* Returns whether the view is flipped. @return YES if the view is flipped. NO, otherwise. @@ -1665,6 +1674,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", CPViewOpacityKey = @"CPViewOpacityKey", CPViewSubviewsKey = @"CPViewSubviewsKey", CPViewSuperviewKey = @"CPViewSuperviewKey", + CPViewTagKey = @"CPViewTagKey", CPViewWindowKey = @"CPViewWindowKey"; @implementation CPView (CPCoding) @@ -1692,6 +1702,11 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", if (self) { + _tag = -1; + + if ([aCoder containsValueForKey:CPViewTagKey]) + _tag = [aCoder decodeIntForKey:CPViewTagKey]; + _window = [aCoder decodeObjectForKey:CPViewWindowKey]; _subviews = [aCoder decodeObjectForKey:CPViewSubviewsKey]; _superview = [aCoder decodeObjectForKey:CPViewSuperviewKey]; @@ -1736,6 +1751,9 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", { [super encodeWithCoder:aCoder]; + if (_tag != -1) + [aCoder encodeInt:_tag forKey:CPViewTagKey]; + [aCoder encodeRect:_frame forKey:CPViewFrameKey]; [aCoder encodeRect:_bounds forKey:CPViewBoundsKey]; diff --git a/Tools/nib2cib/NSView.j b/Tools/nib2cib/NSView.j index 4d92d3010..dc8eb9058 100644 --- a/Tools/nib2cib/NSView.j +++ b/Tools/nib2cib/NSView.j @@ -41,6 +41,11 @@ import if (self) { + _tag = -1; + + if([aCoder containsValueForKey:@"NSTag"]) + _tag = [aCoder decodeIntForKey:@"NSTag"]; + _bounds = CGRectMake(0.0, 0.0, CGRectGetWidth(_frame), CGRectGetHeight(_frame)); _window = [aCoder decodeObjectForKey:@"NSWindow"]; From 96b1dbdb603cd6fec7610b08e8605bc9ed5926a3 Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Thu, 18 Sep 2008 23:47:50 -0700 Subject: [PATCH 16/24] Missing imports in AppKit.j, and misplaced comma in CPSlider --- AppKit/AppKit.j | 2 ++ AppKit/CPSlider.j | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/AppKit/AppKit.j b/AppKit/AppKit.j index 7a4263b61..b0a9f66d1 100644 --- a/AppKit/AppKit.j +++ b/AppKit/AppKit.j @@ -53,9 +53,11 @@ import "CPSecureTextField.j" import "CPSegmentedControl.j" import "CPShadow.j" import "CPSlider.j" +import "CPSplitView.j" import "CPTextField.j" import "CPToolbar.j" import "CPToolbarItem.j" import "CPView.j" +import "CPWebView.j" import "CPWindow.j" import "CPWindowController.j" diff --git a/AppKit/CPSlider.j b/AppKit/CPSlider.j index 8f0240a9d..ab8d2e6b6 100644 --- a/AppKit/CPSlider.j +++ b/AppKit/CPSlider.j @@ -22,7 +22,7 @@ import "CPControl.j" -var CPSliderHorizontalKnobImage = nil +var CPSliderHorizontalKnobImage = nil, CPSliderHorizontalBarLeftImage = nil, CPSliderHorizontalBarRightImage = nil, CPSliderHorizontalBarCenterImage = nil; From f39dfef168484596d30a1f973281d39de994fcdf Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Fri, 19 Sep 2008 01:12:00 -0700 Subject: [PATCH 17/24] CPSplitView pane splitter (thin divider), archiving, and nib2cib support [#52 state:resolved responsible:tlrobinson] --- AppKit/CPSplitView.j | 117 ++++++++++++++++++++++++++++++------ Tools/nib2cib/NSAppKit.j | 1 + Tools/nib2cib/NSSplitView.j | 55 +++++++++++++++++ Tools/nib2cib/main.j | 1 + 4 files changed, 154 insertions(+), 20 deletions(-) create mode 100644 Tools/nib2cib/NSSplitView.j diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index adafffca9..1ff6f56ac 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -72,8 +72,8 @@ var CPSplitViewHorizontalImage = nil, _DOMDividerElements = []; - [self setVertical:YES]; [self setIsPaneSplitter:YES]; + [self _setVertical:YES]; } return self; @@ -81,7 +81,7 @@ var CPSplitViewHorizontalImage = nil, - (float)dividerThickness { - return 10.0; + return _isPaneSplitter ? 1.0 : 10.0; } - (BOOL)isVertical @@ -90,14 +90,18 @@ var CPSplitViewHorizontalImage = nil, } - (void)setVertical:(BOOL)flag { - _isVertical = flag; - - _originComponent = [self isVertical] ? "x" : "y"; - _sizeComponent = [self isVertical] ? "width" : "height"; - _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; + [self _setVertical:flag]; [self adjustSubviews]; } +- (void)_setVertical:(BOOL)flag +{ + _isVertical = flag; + + _originComponent = [self isVertical] ? "x" : "y"; + _sizeComponent = [self isVertical] ? "width" : "height"; + _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; +} - (BOOL)isPaneSplitter { @@ -122,7 +126,8 @@ var CPSplitViewHorizontalImage = nil, var eachSize = (frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length; - for (var i = 0; i < [_subviews count]; i++) + var count = [_subviews count] + for (var i = 0; i < count; i++) { if ([self isVertical]) [_subviews[i] setFrame:CGRectMake(Math.round((eachSize + dividerThickness) * i), 0, Math.round(eachSize), frame.size.height)]; @@ -157,8 +162,10 @@ var CPSplitViewHorizontalImage = nil, { var realRect = [self rectOfDividerAtIndex:aDivider]; - realRect.size[_sizeComponent] += 4; - realRect.origin[_originComponent] -= 2; + var padding = 2; + + realRect.size[_sizeComponent] += padding * 2; + realRect.origin[_originComponent] -= padding; return realRect; } @@ -187,7 +194,16 @@ var CPSplitViewHorizontalImage = nil, CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect)); CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect)); - _DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')"; + if (_isPaneSplitter) + { + _DOMDividerElements[_drawingDivider].style.backgroundColor = "#A5A5A5"; + _DOMDividerElements[_drawingDivider].style.backgroundImage = ""; + } + else + { + _DOMDividerElements[_drawingDivider].style.backgroundColor = ""; + _DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')"; + } #endif } @@ -207,6 +223,22 @@ var CPSplitViewHorizontalImage = nil, return CGRectContainsPoint(effectiveRect, aPoint) || (additionalRect && CGRectContainsPoint(additionalRect, aPoint)); } +- (CPView)hitTest:(CGPoint)aPoint +{ + if ([self isHidden] || ![self hitTests] || !CGRectContainsPoint([self frame], aPoint)) + return nil; + + var point = [self convertPoint:aPoint fromView:[self superview]]; + + var count = [_subviews count] - 1; + for (var i = 0; i < count; i++) + { + if ([self cursorAtPoint:point hitDividerAtIndex:i]) + return self; + } + + return [super hitTest:aPoint]; +} /* Tracks the divider. @@ -229,11 +261,11 @@ var CPSplitViewHorizontalImage = nil, if (type == CPLeftMouseDown) { - var location = [anEvent locationInWindow], - point = [self convertPoint:location fromView:nil]; + var point = [self convertPoint:[anEvent locationInWindow] fromView:nil]; _currentDivider = CPNotFound; - for (var i = 0; i < [_subviews count] - 1; i++) + var count = [_subviews count] - 1; + for (var i = 0; i < count; i++) { var frame = [_subviews[i] frame], startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent]; @@ -277,8 +309,7 @@ var CPSplitViewHorizontalImage = nil, { if (_currentDivider != CPNotFound) { - var location = [anEvent locationInWindow], - point = [self convertPoint:location fromView:nil]; + var point = [self convertPoint:[anEvent locationInWindow] fromView:nil]; [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; } @@ -331,9 +362,9 @@ var CPSplitViewHorizontalImage = nil, var frame = [self frame], viewA = _subviews[dividerIndex], - frameA = CGRectCreateCopy([viewA frame]), + frameA = [viewA frame], viewB = _subviews[dividerIndex+1], - frameB = CGRectCreateCopy([viewB frame]); + frameB = [viewB frame]; var realPosition = MAX(MIN(position, actualMax), actualMin); @@ -364,12 +395,13 @@ var CPSplitViewHorizontalImage = nil, var frame = CGRectCreateCopy([self frame]); - for (var i = 0; i < [_subviews count]; i++) + var count = [_subviews count]; + for (var i = 0; i < count; i++) { var view = [_subviews objectAtIndex:i], newFrame = CGRectCreateCopy(frame); - if(i + 1 == [_subviews count]) + if (i + 1 == count) newFrame.size[_sizeComponent] = frame.size[_sizeComponent] - newFrame.origin[_originComponent]; else newFrame.size[_sizeComponent] = frame.size[_sizeComponent] * ([view frame].size[_sizeComponent] / oldSize[_sizeComponent]); @@ -418,6 +450,51 @@ var CPSplitViewHorizontalImage = nil, @end +var CPSplitViewDelegateKey = "CPSplitViewDelegateKey", + CPSplitViewIsVerticalKey = "CPSplitViewIsVerticalKey", + CPSplitViewIsPaneSplitterKey = "CPSplitViewIsPaneSplitterKey"; + +@implementation CPSplitView (CPCoding) + +/* + Initializes the split view by unarchiving data from aCoder. + @param aCoder the coder containing the archived CPSplitView. +*/ +- (id)initWithCoder:(CPCoder)aCoder +{ + self = [super initWithCoder:aCoder]; + + if (self) + { + _currentDivider = CPNotFound; + + _DOMDividerElements = []; + + _delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey];; + + _isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey]; + [self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]]; + } + + return self; +} + +/* + Archives this split view into the provided coder. + @param aCoder the coder to which the button's instance data will be written. +*/ +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + + [aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey]; + + [aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey]; + [aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey]; +} + +@end + // FIXME: once +initialize is fixed for superclasses, remove this and uncomment +initialize var bundle = [CPBundle bundleForClass:CPSplitView]; CPSplitViewHorizontalImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSplitView/CPSplitViewHorizontal.png"] size:CPSizeMake(5.0, 10.0)]; diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index e307708da..efb30c17b 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -32,6 +32,7 @@ import "NSResponder.j" import "NSSlider.j" import "NSView.j" import "NSWindowTemplate.j" +import "NSSplitView.j" function CP_NSMapClassName(aClassName) { diff --git a/Tools/nib2cib/NSSplitView.j b/Tools/nib2cib/NSSplitView.j new file mode 100644 index 000000000..8dc7d83ab --- /dev/null +++ b/Tools/nib2cib/NSSplitView.j @@ -0,0 +1,55 @@ +/* + * NSSplitView.j + * nib2cib + * + * Created by Thomas Robinson. + * 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 + + +@implementation CPSplitView (CPCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + if (self = [super NS_initWithCoder:aCoder]) + { + _isVertical = [aCoder decodeBoolForKey:@"NSIsVertical"]; + _isPaneSplitter = [aCoder decodeIntForKey:@"NSDividerStyle"] == 2 ? YES : NO; + } + + return self; +} + +@end + +@implementation NSSplitView : CPSplitView +{ +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [CPSplitView class]; +} + +@end diff --git a/Tools/nib2cib/main.j b/Tools/nib2cib/main.j index 8a822799d..43866e029 100644 --- a/Tools/nib2cib/main.j +++ b/Tools/nib2cib/main.j @@ -30,6 +30,7 @@ import "NSAppKit.j" importClass(java.io.FileWriter); importClass(java.io.BufferedWriter); +CPLogRegister(CPLogPrint); function exec(command) { From 5456bb597be8e408b11cfaff04eb6e3d5ab931fb Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Fri, 19 Sep 2008 04:02:07 -0700 Subject: [PATCH 18/24] Performance improvements for CPSplitView. Reviewed by me. --- AppKit/CPSplitView.j | 103 ++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j index 1ff6f56ac..fc9ac630a 100644 --- a/AppKit/CPSplitView.j +++ b/AppKit/CPSplitView.j @@ -27,6 +27,7 @@ import "CPView.j" #include "Platform/Platform.h" #include "Platform/DOM/CPDOMDisplayServer.h" + CPSplitViewDidResizeSubviewsNotification = @"CPSplitViewDidResizeSubviewsNotification"; CPSplitViewWillResizeSubviewsNotification = @"CPSplitViewWillResizeSubviewsNotification"; @@ -72,7 +73,6 @@ var CPSplitViewHorizontalImage = nil, _DOMDividerElements = []; - [self setIsPaneSplitter:YES]; [self _setVertical:YES]; } @@ -88,12 +88,14 @@ var CPSplitViewHorizontalImage = nil, { return _isVertical; } + - (void)setVertical:(BOOL)flag { [self _setVertical:flag]; [self adjustSubviews]; } + - (void)_setVertical:(BOOL)flag { _isVertical = flag; @@ -107,9 +109,19 @@ var CPSplitViewHorizontalImage = nil, { return _isPaneSplitter; } -- (void)setIsPaneSplitter:(BOOL)flag + +- (void)setIsPaneSplitter:(BOOL)shouldBePaneSplitter { - _isPaneSplitter = flag; + if (_isPaneSplitter == shouldBePaneSplitter) + return; + + _isPaneSplitter = shouldBePaneSplitter; + +#if PLATFORM(DOM) + _DOMDividerElements = []; +#endif + + [self setNeedsDisplay:YES]; } - (void)didAddSubview:(CPView)subview @@ -124,16 +136,16 @@ var CPSplitViewHorizontalImage = nil, [self _postNotificationWillResize]; - var eachSize = (frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length; - - var count = [_subviews count] - for (var i = 0; i < count; i++) - { - if ([self isVertical]) - [_subviews[i] setFrame:CGRectMake(Math.round((eachSize + dividerThickness) * i), 0, Math.round(eachSize), frame.size.height)]; - else - [_subviews[i] setFrame:CGRectMake(0, Math.round((eachSize + dividerThickness) * i), frame.size.width, Math.round(eachSize))]; - } + var eachSize = ROUND((frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length), + index = 0, + count = _subviews.length; + + if ([self isVertical]) + for (; index < count; ++index) + [_subviews[index] setFrame:CGRectMake(ROUND((eachSize + dividerThickness) * index), 0, eachSize, frame.size.height)]; + else + for (; index < count; ++index) + [_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize + dividerThickness) * index), frame.size.width, eachSize)]; [self setNeedsDisplay:YES]; @@ -147,10 +159,10 @@ var CPSplitViewHorizontalImage = nil, - (CGRect)rectOfDividerAtIndex:(int)aDivider { - var frame = [_subviews[aDivider] frame]; + var frame = [_subviews[aDivider] frame], + rect = CGRectMakeZero(); - var rect = CGRectMakeZero(); - rect.size = CPSizeCreateCopy([self frame].size); + rect.size = [self frame].size; rect.size[_sizeComponent] = [self dividerThickness]; rect.origin[_originComponent] = frame.origin[_originComponent] + frame.size[_sizeComponent]; @@ -172,11 +184,10 @@ var CPSplitViewHorizontalImage = nil, - (void)drawRect:(CGRect)rect { - var count = [_subviews count]; - for (var _drawingDivider = 0; _drawingDivider < count-1; _drawingDivider++) - { - [self drawDividerInRect:[self rectOfDividerAtIndex:_drawingDivider]]; - } + var count = [_subviews count] - 1; + + while (count--) + [self drawDividerInRect:[self rectOfDividerAtIndex:count]]; } - (void)drawDividerInRect:(CGRect)aRect @@ -188,22 +199,23 @@ var CPSplitViewHorizontalImage = nil, _DOMDividerElements[_drawingDivider].style.cursor = "move"; _DOMDividerElements[_drawingDivider].style.position = "absolute"; _DOMDividerElements[_drawingDivider].style.backgroundRepeat = "repeat"; + CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]); + + if (_isPaneSplitter) + { + _DOMDividerElements[_drawingDivider].style.backgroundColor = "#A5A5A5"; + _DOMDividerElements[_drawingDivider].style.backgroundImage = ""; + } + else + { + _DOMDividerElements[_drawingDivider].style.backgroundColor = ""; + _DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')"; + } } CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect)); CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect)); - - if (_isPaneSplitter) - { - _DOMDividerElements[_drawingDivider].style.backgroundColor = "#A5A5A5"; - _DOMDividerElements[_drawingDivider].style.backgroundImage = ""; - } - else - { - _DOMDividerElements[_drawingDivider].style.backgroundColor = ""; - _DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')"; - } #endif } @@ -305,14 +317,11 @@ var CPSplitViewHorizontalImage = nil, } } - else if (type == CPLeftMouseDragged) + else if (type == CPLeftMouseDragged && _currentDivider != CPNotFound) { - if (_currentDivider != CPNotFound) - { - var point = [self convertPoint:[anEvent locationInWindow] fromView:nil]; - - [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; - } + var point = [self convertPoint:[anEvent locationInWindow] fromView:nil]; + + [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; } [CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES]; @@ -393,21 +402,23 @@ var CPSplitViewHorizontalImage = nil, [self _postNotificationWillResize]; - var frame = CGRectCreateCopy([self frame]); + var frame = [self frame]; - var count = [_subviews count]; - for (var i = 0; i < count; i++) + var index = 0, + count = [_subviews count], + dividerThickness = [self dividerThickness]; + + for (; index < count; ++index) { - var view = [_subviews objectAtIndex:i], + var view = _subviews[index], newFrame = CGRectCreateCopy(frame); - if (i + 1 == count) + if (index + 1 == count) newFrame.size[_sizeComponent] = frame.size[_sizeComponent] - newFrame.origin[_originComponent]; else newFrame.size[_sizeComponent] = frame.size[_sizeComponent] * ([view frame].size[_sizeComponent] / oldSize[_sizeComponent]); - frame.origin[_originComponent] += newFrame.size[_sizeComponent]; - frame.origin[_originComponent] += [self dividerThickness]; + frame.origin[_originComponent] += newFrame.size[_sizeComponent] + dividerThickness; [view setFrame:newFrame]; } From a5cc45051eb9f634e5db22498dc8fa3debcc6c3a Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Fri, 19 Sep 2008 16:30:55 -0700 Subject: [PATCH 19/24] Fix for borderless windows being resizable. [#61 state:resolved] Reviewed by me. --- AppKit/_CPWindowView.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/_CPWindowView.j b/AppKit/_CPWindowView.j index f427f98a5..d9919e143 100644 --- a/AppKit/_CPWindowView.j +++ b/AppKit/_CPWindowView.j @@ -62,7 +62,7 @@ var _CPWindowViewResizeIndicatorImage = nil; { _resizeIndicatorOffset = CGSizeMake(0.0, 0.0); - [self setShowsResizeIndicator:((_styleMask & CPBorderlessWindowMask) || (_styleMask & CPBorderlessBridgeWindowMask)) && (_styleMask & CPResizableWindowMask)]; + [self setShowsResizeIndicator:!((_styleMask & CPBorderlessWindowMask) || (_styleMask & CPBorderlessBridgeWindowMask)) && (_styleMask & CPResizableWindowMask)]; } return self; From d183f6c43470072034094d1f78eb17f4a7495a8c Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Fri, 19 Sep 2008 16:44:59 -0700 Subject: [PATCH 20/24] Furhter fix for not showing resize indicator. Reviewed by me. --- AppKit/_CPWindowView.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/_CPWindowView.j b/AppKit/_CPWindowView.j index d9919e143..7bbadec51 100644 --- a/AppKit/_CPWindowView.j +++ b/AppKit/_CPWindowView.j @@ -62,7 +62,7 @@ var _CPWindowViewResizeIndicatorImage = nil; { _resizeIndicatorOffset = CGSizeMake(0.0, 0.0); - [self setShowsResizeIndicator:!((_styleMask & CPBorderlessWindowMask) || (_styleMask & CPBorderlessBridgeWindowMask)) && (_styleMask & CPResizableWindowMask)]; + [self setShowsResizeIndicator:!(_styleMask & CPBorderlessBridgeWindowMask) && (_styleMask & CPResizableWindowMask)]; } return self; From a10058fc7f4d3469a462c39ecdbce5cdbe103861 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Fri, 19 Sep 2008 20:19:08 -0700 Subject: [PATCH 21/24] Improved Cib Support. Reviewed by ross. --- AppKit/CPDocumentController.j | 12 +++---- AppKit/CPView.j | 2 +- AppKit/Cib/CPCib.j | 3 +- AppKit/Cib/_CPCibCustomObject.j | 2 +- AppKit/Cib/_CPCibKeyedUnarchiver.j | 34 +++++++++++++++++++ AppKit/Cib/_CPCibWindowTemplate.j | 2 +- AppKit/Platform/DOM/CPDOMDisplayServer.j | 4 +-- Tools/NibApp/HelloWorld.nib/info.nib | 5 ++- Tools/NibApp/HelloWorld.nib/keyedobjects.nib | Bin 4015 -> 4087 bytes 9 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 AppKit/Cib/_CPCibKeyedUnarchiver.j diff --git a/AppKit/CPDocumentController.j b/AppKit/CPDocumentController.j index 84fbd9d7a..80edb065b 100644 --- a/AppKit/CPDocumentController.j +++ b/AppKit/CPDocumentController.j @@ -100,18 +100,18 @@ var CPSharedDocumentController = nil; */ - (void)openUntitledDocumentOfType:(CPString)aType display:(BOOL)shouldDisplay { - var document = [self makeUntitledDocumentOfType:aType error:nil]; + var theDocument = [self makeUntitledDocumentOfType:aType error:nil]; - if (document) - [self addDocument:document]; + if (theDocument) + [self addDocument:theDocument]; if (shouldDisplay) { - [document makeWindowControllers]; - [document showWindows]; + [theDocument makeWindowControllers]; + [theDocument showWindows]; } - return document; + return theDocument; } /* diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 8a90392db..481cce508 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -368,7 +368,7 @@ var DOMElementPrototype = nil, [aSubview removeFromSuperview]; - [aView _insertSubview:aView atIndex:index]; + [self _insertSubview:aView atIndex:index]; } /* @ignore */ diff --git a/AppKit/Cib/CPCib.j b/AppKit/Cib/CPCib.j index be630aedb..ee27f538d 100644 --- a/AppKit/Cib/CPCib.j +++ b/AppKit/Cib/CPCib.j @@ -26,6 +26,7 @@ import import "CPCustomView.j" import "_CPCibCustomObject.j" +import "_CPCibKeyedUnarchiver.j" import "_CPCibObjectData.j" import "_CPCibWindowTemplate.j" @@ -51,7 +52,7 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; - (BOOL)instantiateCibWithExternalNameTable:(CPDictionary)anExternalNameTable { - var unarchiver = [[CPKeyedUnarchiver alloc] initForReadingWithData:_data], + var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data], objectData = [unarchiver decodeObjectForKey:CPCibObjectDataKey]; if (!objectData || ![objectData isKindOfClass:[_CPCibObjectData class]]) diff --git a/AppKit/Cib/_CPCibCustomObject.j b/AppKit/Cib/_CPCibCustomObject.j index 56b633c9a..5064784d8 100644 --- a/AppKit/Cib/_CPCibCustomObject.j +++ b/AppKit/Cib/_CPCibCustomObject.j @@ -28,7 +28,7 @@ var _CPCibCustomObjectClassName = @"_CPCibCustomObjectClassName"; [aCoder encodeObject:_className forKey:_CPCibCustomObjectClassName]; } -- (id)awakeAfterUsingCoder:(CPCoder)aCoder +- (id)_cibInstantiate { var theClass = CPClassFromString(_className); diff --git a/AppKit/Cib/_CPCibKeyedUnarchiver.j b/AppKit/Cib/_CPCibKeyedUnarchiver.j new file mode 100644 index 000000000..f962d2be6 --- /dev/null +++ b/AppKit/Cib/_CPCibKeyedUnarchiver.j @@ -0,0 +1,34 @@ + +import + + +@implementation _CPCibKeyedUnarchiver : CPKeyedUnarchiver +{ +} + +- (id)decodeObjectForKey:(CPString)aKey +{ + var object = [super decodeObjectForKey:aKey]; + + if ([object respondsToSelector:@selector(_cibInstantiate)]) + { + var index = [[_plistObject objectForKey:aKey] objectForKey:_CPKeyedArchiverUIDKey], + processedObject = [object _cibInstantiate]; + + if (processedObject != object) + { + object = processedObject; + + [self replaceObjectAtUID:index withObject:processedObject]; + } + } + + return object; +} + +- (void)replaceObjectAtUID:(int)aUID withObject:(id)anObject +{ + _objects[aUID] = anObject; +} + +@end \ No newline at end of file diff --git a/AppKit/Cib/_CPCibWindowTemplate.j b/AppKit/Cib/_CPCibWindowTemplate.j index 7147656aa..dec6bd3c4 100644 --- a/AppKit/Cib/_CPCibWindowTemplate.j +++ b/AppKit/Cib/_CPCibWindowTemplate.j @@ -65,7 +65,7 @@ var _CPCibWindowTemplateMinSizeKey = @"_CPCibWindowTemplateMinSizeKey", [aCoder encodeObject:_windowView forKey:_CPCibWindowTemplateWindowViewKey]; } -- (id)awakeAfterUsingCoder:(CPCoder)aCoder +- (id)_cibInstantiate { var windowClass = CPClassFromString(_windowClass); diff --git a/AppKit/Platform/DOM/CPDOMDisplayServer.j b/AppKit/Platform/DOM/CPDOMDisplayServer.j index 0e34fef89..b2338c339 100644 --- a/AppKit/Platform/DOM/CPDOMDisplayServer.j +++ b/AppKit/Platform/DOM/CPDOMDisplayServer.j @@ -133,7 +133,7 @@ CPDOMDisplayServerViewsContext = {}; CPDOMDisplayServerInstructions[index++] = nil; break; - }}catch(e) { alert("here?" + instruction) } + }}catch(e) { CPLog("here?" + instruction) } } CPDOMDisplayServerInstructionCount = 0; @@ -155,7 +155,7 @@ CPDOMDisplayServerViewsContext = {}; [view displayIfNeeded]; } } - + [CPDOMDisplayRunLoop performSelector:@selector(run) target:CPDOMDisplayServer argument:nil order:0 modes:[CPDefaultRunLoopMode]]; } diff --git a/Tools/NibApp/HelloWorld.nib/info.nib b/Tools/NibApp/HelloWorld.nib/info.nib index b8f7650f5..d92bee152 100644 --- a/Tools/NibApp/HelloWorld.nib/info.nib +++ b/Tools/NibApp/HelloWorld.nib/info.nib @@ -7,7 +7,10 @@ IBOldestOS 5 IBOpenObjects - + + 1 + 10 + IBSystem Version 9F33 targetFramework diff --git a/Tools/NibApp/HelloWorld.nib/keyedobjects.nib b/Tools/NibApp/HelloWorld.nib/keyedobjects.nib index 3ad8add67f8afcdbeae4c98d4699dbea7bfd30f6..acebe2aa01ffb8ede7a87325d27929eefad4d8cf 100644 GIT binary patch delta 2371 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 bBSwnRVvNWW6T| Date: Fri, 19 Sep 2008 20:55:07 -0700 Subject: [PATCH 22/24] Removed some unecessary code with the last update. Reviewed by me. --- Tools/nib2cib/NSCustomObject.j | 6 ------ Tools/nib2cib/NSWindowTemplate.j | 5 ----- 2 files changed, 11 deletions(-) diff --git a/Tools/nib2cib/NSCustomObject.j b/Tools/nib2cib/NSCustomObject.j index 62891fdb3..58b5f600c 100644 --- a/Tools/nib2cib/NSCustomObject.j +++ b/Tools/nib2cib/NSCustomObject.j @@ -31,10 +31,4 @@ import return [_CPCibCustomObject class]; } -- (id)awakeAfterUsingCoder:(CPCoder)aCoder -{ - print("awaking from coder..."); - return self; -} - @end \ No newline at end of file diff --git a/Tools/nib2cib/NSWindowTemplate.j b/Tools/nib2cib/NSWindowTemplate.j index a87338805..9a8b7b2e7 100644 --- a/Tools/nib2cib/NSWindowTemplate.j +++ b/Tools/nib2cib/NSWindowTemplate.j @@ -46,11 +46,6 @@ import return [self NS_initWithCoder:aCoder]; } -- (id)awakeAfterUsingCoder:(CPCoder)aCoder -{ - return self; -} - - (Class)classForKeyedArchiver { return [_CPCibWindowTemplate class]; From 464ddf269df1669d6d9d324e5bd779e1e06d373d Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Sun, 21 Sep 2008 02:52:24 -0700 Subject: [PATCH 23/24] A number of fixes for Cib. Reviewed by rossco. --- AppKit/CPDocument.j | 4 +- AppKit/CPDocumentController.j | 39 +++- AppKit/CPResponder.j | 2 +- AppKit/CPView.j | 5 + AppKit/Cib/CPCustomView.j | 64 +++--- AppKit/Cib/_CPCibKeyedUnarchiver.j | 33 +-- AppKit/Cib/_CPCibObjectData.j | 19 +- Foundation/CPString.j | 2 +- Tools/NibApp/HelloWorld.nib/info.nib | 1 - Tools/NibApp/HelloWorld.nib/keyedobjects.nib | Bin 4087 -> 4049 bytes Tools/NibApp/HelloWorld.xib | 215 ++++++++++--------- 11 files changed, 213 insertions(+), 171 deletions(-) diff --git a/AppKit/CPDocument.j b/AppKit/CPDocument.j index 2e53ce40a..cff5335eb 100644 --- a/AppKit/CPDocument.j +++ b/AppKit/CPDocument.j @@ -200,7 +200,7 @@ var CPDocumentUntitledCount = 0; - (CPData)dataOfType:(CPString)aType error:({CPError})anError { [CPException raise:CPUnsupportedMethodException - reason:"This method must be overridden by the document"]; + reason:"dataOfType:error: must be overridden by the document subclass."]; } /* @@ -215,7 +215,7 @@ var CPDocumentUntitledCount = 0; - (void)readFromData:(CPData)aData ofType:(CPString)aType error:(CPError)anError { [CPException raise:CPUnsupportedMethodException - reason:"This method must be overridden by the document"]; + reason:"readFromData:ofType: must be overridden by the document subclass."]; } // Creating and managing window controllers diff --git a/AppKit/CPDocumentController.j b/AppKit/CPDocumentController.j index 80edb065b..dc2c04e33 100644 --- a/AppKit/CPDocumentController.j +++ b/AppKit/CPDocumentController.j @@ -137,9 +137,11 @@ var CPSharedDocumentController = nil; var result = [self documentForURL:anAbsoluteURL]; if (!result) - // FIXME: type(!) - result = [self makeDocumentWithContentsOfURL:anAbsoluteURL ofType:[[_documentTypes objectAtIndex:0] objectForKey:@"CPBundleTypeName"] delegate:self didReadSelector:@selector(document:didRead:contextInfo:) contextInfo:nil]; - + { + var type = [self typeForContentsOfURL:anAbsoluteURL error:anError]; + + result = [self makeDocumentWithContentsOfURL:anAbsoluteURL ofType:type delegate:self didReadSelector:@selector(document:didRead:contextInfo:) contextInfo:[CPDictionary dictionaryWithObject:shouldDisplay forKey:@"shouldDisplay"]]; + } else if (shouldDisplay) [result showWindows]; @@ -200,6 +202,9 @@ var CPSharedDocumentController = nil; [self addDocument:aDocument]; [aDocument makeWindowControllers]; + + if ([aContextInfo objectForKey:@"shouldDisplay"]) + [aDocument showWindows]; } /* @@ -240,6 +245,34 @@ var CPSharedDocumentController = nil; [_documents removeObjectIdenticalTo:aDocument]; } +- (CPString)defaultType +{ + return [_documentTypes[0] objectForKey:@"CPBundleTypeName"]; +} + +- (CPString)typeForContentsOfURL:(CPURL)anAbsoluteURL error:(CPError)outError +{ + var index = 0, + count = _documentTypes.length, + + extension = [[anAbsoluteURL pathExtension] lowercaseString]; + + for (; index < count; ++index) + { + var documentType = _documentTypes[index], + extensions = [documentType objectForKey:@"CFBundleTypeExtensions"], + extensionIndex = 0, + extensionCount = extensions.length; + + for (; extensionIndex < extensionCount; ++extensionIndex) + if ([extensions[extensionIndex] lowercaseString] == extension) + return [documentType objectForKey:@"CPBundleTypeName"]; + } + + // FIXME? + return [self defaultType];//nil; +} + // Managing Document Types /* @ignore */ diff --git a/AppKit/CPResponder.j b/AppKit/CPResponder.j index 34e177677..406dbb43e 100644 --- a/AppKit/CPResponder.j +++ b/AppKit/CPResponder.j @@ -301,7 +301,7 @@ var CPResponderNextResponderKey = @"CPResponderNextResponderKey"; */ - (id)initWithCoder:(CPCoder)aCoder { - self = [self init]; + self = [super init]; if (self) _nextResponder = [aCoder decodeObjectForKey:CPResponderNextResponderKey]; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 481cce508..c6ff80a1c 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -161,6 +161,11 @@ var DOMElementPrototype = nil, _CPViewNotificationCenter = [CPNotificationCenter defaultCenter]; } +- (id)init +{ + return [self initWithFrame:CGRectMakeZero()]; +} + /* Initializes the receiver for usage with the specified bounding rectangle @return the initialized view diff --git a/AppKit/Cib/CPCustomView.j b/AppKit/Cib/CPCustomView.j index e1755d2b5..c0c70fce2 100644 --- a/AppKit/Cib/CPCustomView.j +++ b/AppKit/Cib/CPCustomView.j @@ -22,17 +22,6 @@ import "CPView.j" -var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", - CPViewAutoresizesSubviewsKey = @"CPViewAutoresizesSubviews", - CPViewBackgroundColorKey = @"CPViewBackgroundColor", - CPViewBoundsKey = @"CPViewBoundsKey", - CPViewFrameKey = @"CPViewFrameKey", - CPViewHitTestsKey = @"CPViewHitTestsKey", - CPViewIsHiddenKey = @"CPViewIsHiddenKey", - CPViewOpacityKey = @"CPViewOpacityKey", - CPViewSubviewsKey = @"CPViewSubviewsKey", - CPViewSuperviewKey = @"CPViewSuperviewKey", - CPViewWindowKey = @"CPViewWindowKey"; /* @ignore */ @@ -49,8 +38,23 @@ var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; - (id)initWithCoder:(CPCoder)aCoder { - _className = [aCoder decodeObjectForKey:_CPCibCustomViewClassNameKey]; + self = [super initWithCoder:aCoder]; + + if (self) + _className = [aCoder decodeObjectForKey:_CPCibCustomViewClassNameKey]; + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + [aCoder encodeObject:_className forKey:_CPCibCustomViewClassNameKey]; +} + +- (id)_cibInstantiate +{ var theClass = CPClassFromString(_className); // If we don't have this class, just use CPView. @@ -62,37 +66,31 @@ var _CPCibCustomViewClassNameKey = @"_CPCibCustomViewClassNameKey"; theClass = [CPView class]; } - var frame = [aCoder decodeRectForKey:CPViewFrameKey]; - - self = [[CPView alloc] initWithFrame:frame]; + var view = [[theClass alloc] initWithFrame:[self frame]]; - if (self) - { - [self _setWindow:[aCoder decodeObjectForKey:CPViewWindowKey]]; + if (view) + { + [view setBounds:[self bounds]]; // Since the object replacement logic hasn't had a chance to kick in yet, we need to do it manually: - var subviews = [aCoder decodeObjectForKey:CPViewSubviewsKey], + var subviews = [self subviews], index = 0, count = subviews.length; for (; index < count; ++index) - { - // This is a bogus superview "_CPCibCustomView". - subviews[index]._superview = nil; - [self addSubview:subviews[index]]; - } - - _autoresizingMask = [aCoder decodeIntForKey:CPViewAutoresizingMaskKey]; - _autoresizesSubviews = [aCoder decodeBoolForKey:CPViewAutoresizesSubviewsKey]; - - _hitTests = [aCoder decodeObjectForKey:CPViewHitTestsKey]; - _isHidden = [aCoder decodeObjectForKey:CPViewIsHiddenKey]; - _opacity = [aCoder decodeIntForKey:CPViewOpacityKey]; + [view addSubview:subviews[index]]; + + [view setAutoresizingMask:[self autoresizingMask]]; + [view setAutoresizesSubviews:[self autoresizesSubviews]]; - [self setBackgroundColor:[aCoder decodeObjectForKey:CPViewBackgroundColorKey]]; + [view setHitTests:[self hitTests]]; + [view setHidden:[self isHidden]]; + [view setAlphaValue:[self alphaValue]]; + + [view setBackgroundColor:[self backgroundColor]]; } - return self; + return view; } @end diff --git a/AppKit/Cib/_CPCibKeyedUnarchiver.j b/AppKit/Cib/_CPCibKeyedUnarchiver.j index f962d2be6..3776cc5a8 100644 --- a/AppKit/Cib/_CPCibKeyedUnarchiver.j +++ b/AppKit/Cib/_CPCibKeyedUnarchiver.j @@ -6,24 +6,22 @@ import { } -- (id)decodeObjectForKey:(CPString)aKey +- (id)initForReadingWithData:(CPData)data { - var object = [super decodeObjectForKey:aKey]; + self = [super initForReadingWithData:data]; - if ([object respondsToSelector:@selector(_cibInstantiate)]) - { - var index = [[_plistObject objectForKey:aKey] objectForKey:_CPKeyedArchiverUIDKey], - processedObject = [object _cibInstantiate]; - - if (processedObject != object) - { - object = processedObject; - - [self replaceObjectAtUID:index withObject:processedObject]; - } - } + if (self) + [self setDelegate:self]; - return object; + return self; +} + +- (id)unarchiver:(CPKeyedUnarchiver)aKeyedUnarchiver didDecodeObject:(id)anObject +{ + if ([anObject respondsToSelector:@selector(_cibInstantiate)]) + return [anObject _cibInstantiate]; + + return anObject; } - (void)replaceObjectAtUID:(int)aUID withObject:(id)anObject @@ -31,4 +29,9 @@ import _objects[aUID] = anObject; } +- (id)objectAtUID:(int)aUID +{ + return _objects[aUID]; +} + @end \ No newline at end of file diff --git a/AppKit/Cib/_CPCibObjectData.j b/AppKit/Cib/_CPCibObjectData.j index 0e43193ab..736d18265 100644 --- a/AppKit/Cib/_CPCibObjectData.j +++ b/AppKit/Cib/_CPCibObjectData.j @@ -58,27 +58,30 @@ import "_CPCibConnector.j" CPSet _visibleWindows; } -/* + - (CPArray)topLevelObjects { - var count = [_objectsValues count]; - + var count = [_objectsValues count], + topLevelObjects = []; + var str = ""; + str2 = " "; while (count--) - { + {str2 += _namesValues[count] +"\n"; var eachObject = _objectsValues[count]; - if(eachObject == _fileOwner) + if (eachObject == _fileOwner) { var anObject = _objectsKeys[count]; if (anObject != _fileOwner) - topLevelObjects.push(anObject); + {str += _namesValues[count] + "\n"; + anObject.realname = _namesValues[count];str2+='X'+'\n'; + topLevelObjects.push(anObject);} } } - + alert(str2+'\n'+str); return topLevelObjects; } -*/ @end diff --git a/Foundation/CPString.j b/Foundation/CPString.j index efa7c7ecb..691a9ee1b 100644 --- a/Foundation/CPString.j +++ b/Foundation/CPString.j @@ -469,7 +469,7 @@ CPNumericSearch */ - (CPString)pathExtension { - return substr(lastIndexOf('.')+1); + return substr(lastIndexOf('.') + 1); } - (CPString)lastPathComponent diff --git a/Tools/NibApp/HelloWorld.nib/info.nib b/Tools/NibApp/HelloWorld.nib/info.nib index d92bee152..e6ff1f2ef 100644 --- a/Tools/NibApp/HelloWorld.nib/info.nib +++ b/Tools/NibApp/HelloWorld.nib/info.nib @@ -9,7 +9,6 @@ IBOpenObjects 1 - 10 IBSystem Version 9F33 diff --git a/Tools/NibApp/HelloWorld.nib/keyedobjects.nib b/Tools/NibApp/HelloWorld.nib/keyedobjects.nib index acebe2aa01ffb8ede7a87325d27929eefad4d8cf..44157a897a5362ecf97855233c68e2cfee0e805d 100644 GIT binary patch delta 2616 zcma)7X;c(f7QVOkdiBskz$A)*VnoCRagB%yC=!=;K~WS%z!qCu8k$BFmwt>o#uybX zMf4a)0gX-~i5lam87F5#OeT|=#BB)TGDeA$Wim-lCQ;)uue%S#{F|zC>Q&Xb@4Mgo z?swn&De`<|USwE-zri)Q z7T4hmxDhuW?}Ll6YYrR6#N-4};PUxL}t4zghm#6b?sgWMdmy)DCLU*?%=FDY^r&bPa*A}Opp z#|#QaV06}sfkWeaM0g6pq!wF*puhYqQcV z^8~zg0N#R=0o^%zN~y==D$KHFr1Cj#moqTy6r8Sw({Kh7=h`wRmU?pYoc3h5J9jzP z$3F(b{s?Dl;Vk^gdRy)6Er&m|hy(C0G{Ads4&G$3AuT8CwrDVPGH@$OYHgFNHZLT^Ic_uj2GZy zEnI|4keFkJa)}&ylS(~KyC>CUP1ZVjTeCFsEKM9HhQlO$`h-!kAc2>>8Lq-LUhwPu z?VoUy^<@27EbGh1c-F7gFSmVuX<@yZe&v@eKK%|fa?gATU->=L%)kCK-Ig&ew;+fo z?84$$Z=FNMSOt1S;{W53|8kGC1U$mHKlt5;d!v{2jvhW4euf8i@E}mHY+k0)5|3+1 zCO70XpDTZn_A#WuN)*^2X0lK=Fw5oU9mvHQ<`)iSRBBOyOV&;;qD`h0h(v?SWOA8? zWS04L{xxC?2Ky0vvFB#{5!2kovMP)aE6)h`W-Z`- zneQmccg;>NdSbBw(WbJbeXaDTKk+`3CDrrR@h!W73+a=!5#HwwbuO?h-b_9TdT>#F z634Kiyu}6w7TAjC;20RWi0|-DT!Mw@!Xhk2HM63kQr`*kcfOJ17ObqnN^39e85hgXr*eMc zynt1B2pjMMUdJ!-t{@7*LLVVfunF^oa$&8oRj{mo(`fHm;X~mg;qSs#p+)#cxFL$fX2~w&wU79N`lAKbZR4kQ9tEKhQW@(4CUpg(lD}5j}%aW|fnoMLWxAV%T+(C|! z6Xb#NV0oxKOiq=@$m#Mpxj=TwOJyd%ByW~0hL)zo0M zquND{P`xo~yqctrQ!~`LYJpm;ma7$NrCP1-R}ZNt)H7;>dQLsBUQ{oujcSwHtbVQD z*F??Gg0%Kpuoj|4X|Y=~ zYE4?Rc1^pX-PAtQZfl=w|MKdBK0qI&57D2~6ZIs0q&{BH)N}NOdZ}KnZ`3#GTlB5E zrN68n)Q{-z>Hp9_)vxGR_3L_z{-b_Zzpp>g9}z-ANEqosdXiqGH|a~_Ndg&229uE_ znWT~_WEROG3&|p~f~+E5QbE>`b!0u+KsFNZc2Y$SlUK?niHO3eVjWVOc*kn{0)y6KP#;7w681=>*#@~#O zjq}DujPH#fXfO?-Ve~2b4DFmpyUlLa9#;?}^} I`lMU_2LnywjsO4v delta 2688 zcma)8X;c(f7QVNtx|UZ@Y}^$UT#+a$?gkYBK~!j!RuI93r9}t=LL=^dqj8I46g!UN zmLRBcizaGJoS9?P#3eB?!Es!2oQX4MvJk~xaGlKS?qHnEpQ(3Fy<1gx{qA>PcU53r z;F{^K3^0L181#jHFbD=iG$g|WNP&sseKx!Tr7#=TKpAX+jj#pYf(qCPd&ReRVL!YF z2Zi>Z#Pfdm7(Ris@E5oMm*H>lclZZ<4?n;Sp?M!3qJ%OsG{w^n~76l+79-R79>Omq|%7UX9+iYD6Z_L7WQ zIgZle2{!wz*u3=Y;#8YGwkUmu!=5wOA!K_=p`*y7L7W1pfjjWl!W7$b%Uoc)mAy0u;hbD1u^eitq`^zc@~^*`pnKc_}t~On!Pso+FD)YEBKw z>W|zIu1)twOY0tUg#WoP59Y%HSO_j4coi1GVt5Ufz*1NS%f)`jW9{wOgd&&}g*hHzmSTafP@<9quyly8G_*a|b;-L>{nm9T9) zY=iBv1Kxpf;XSIv=`6?>g+>dTqJlhOog|PHs6Ow2&(SW}T?xBkkK3iS4462t&w!rY zf_nAuxxn{zAMB{~`E+kp0@e57Km{CdpHjNI4uK60!x$I~iEsqQ!FcFOLDYuYlR=CE zNf6n?2M-&%3MOR2Q9+~tYUlHN431aAaX10tX*PR8iPO^zyTdtNfaGx2_xB{V*bb-Q zG@OCY;B)FkU8pOC(#scw-v(d6mv9cg5>yO?^X?m3Q0rhpNr^fqmFDDU6_ono{1q-% z!bP~`?yh$W^_g4|Cb@8xUJ~kl6p~U0P0D7 z#onL#)z@6>;dC8^UGbpT`@cB-2&x6EpTaXQt81VdQQ$Q$JzE59PQ9qNAzXELf3LR< z|34UvnqY99kHI9^D^?%D+%R{9(b|O#&~F?1`8qE;6kSs6ESTXT&^XUL{#vvL%sOo1 z1v8AoQ@vou775M?IK`A=b8JBoJ4LRoJcot={*VZoATl28IY2}Mf+&nkk8UsMjU7m# zA(Lz_dt_l@UQTAZGp8Wm+ZOB$dn#ZLgx7lw@pujVWhDsD)etFQ_bpR+?oL|0ZXb%+ z<;@`Qe{zt1n}sLip)O&7kr;*1I1FPj7KdXTj-Y57Mllpi!zqqN&`27U>cb_-J6SKJ zoEDpt=Ljwi8eN+2C=y4Xk19c3e0#_gtN(A_goaJA1|=4hUXW8MVxK@ZN=!+vn3F?dP6Q4Dl{zsq31Vgj3nV%Tl)DI=Lp_)Xgu=uW zne@Crc^)4#FdqxB5NBc$7NZkOa2A%LYc|foxip5xQX<)D9F3e!G_7?{FjT#WQ#j|A{y8sia9wr7$T%N|dssh0=0&74P8s zP&y)=kj_b8OXsC)QnhqfdL~PGBE1^n1#jZG%LS>G!L@86;$~tAevQgQryrq;YyOcf3 zKIJ{7O1Yw3Q+{$OH%Sy`@%TCJy%Q4G&%eR&q zOReRh<+0_d<=-l(lB%exYN&o{bG4(|R~@8AtMRH$O;%IXRCT&KQ=O$QP#3Dp)HUiB zb+>v@J*u8otJKTtztkG_z9ws?)=Uf3T%ENDElx|&rfMs+mD(z8wN|FNwRPHhZKt+d z+pF!`V3)t76}<`UiTTX@nIo6Eg=^g4 zjd&9tmdAVZzPvvl$iw+y9>F7dG>_rK`3OFWC-5XbfluUVd@`TPGk6xC#;5aKp2zcf kDWAjV^2K}!U&>eWGQO5?;^n?S1(M|3@lD@ef9L!E18 YES - + YES - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES @@ -41,7 +41,7 @@ -2080244224 134217728 - Round Rect Button + Round Rect Button LucidaGrande 1.200000e+01 @@ -133,7 +133,7 @@ -2080244224 134217728 - Round Rect Button + -2038152961 @@ -297,6 +297,7 @@ + Francisco 15 @@ -362,28 +363,28 @@ YES - - - - + + + + {628, 654} {{319, 416}, {480, 272}} - - - com.apple.InterfaceBuilder.CocoaPlugin - {{196, 240}, {480, 270}} - - {{196, 240}, {480, 270}} - - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - + + + {{196, 240}, {480, 270}} + + + + + + + + + + + + @@ -438,7 +439,7 @@ IBUserSource - + @@ -448,90 +449,90 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxB2AAsADAAxADUANgA7ADwA +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxB1AAsADAAxADUANgA7ADwA QgBWAFcAWABZAGEAYgBmAGcAagBWAHIACwB7AIAAjACNAKUApgCuAK8AsgCzALcAuwDDAMQAywDMAGEA -CwBmANAA1ADbAOMA5ADoAO0ACwD1APoBAgEDAMsBCgESARMBJwEqASsBLgExAAsAZAEyATUBNgE7ATwB -PwFEAUUBVgFZAVoBXAFtAX8BkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGjAaYBvAHSAdMB -1AEfAdUB1gHXAdgB2QHaAdsB3ACtAd0B3gBUAd8B4AHhAeIB5QHoAetVJG51bGzfEBIADQAOAA8AEAAR -ABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAv -ADBWTlNSb290ViRjbGFzc11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3Np -YmlsaXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xh -c3Nlc0tleXNaTlNPaWRzS2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9y -c11OU0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNj -ZXNzaWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoB1gEWAXIB0gCiASoAFgFuA -XYBLgHKAAIAGgEmAcxAcgF7SAA4AMgAzADRbTlNDbGFzc05hbWWABIADWE5TT2JqZWN00gA3ADgAOQA6 -WCRjbGFzc2VzWiRjbGFzc25hbWWiADoANV5OU0N1c3RvbU9iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvS -AA4APQA+AD9aTlMub2JqZWN0c4AnogBAAEGAB4AQ2gBDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8A -UABRAFIAUwBUACtcTlNXaW5kb3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFn -c11OU1dpbmRvd0NsYXNzXE5TV2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5 -bGVNYXNrW05TVmlld0NsYXNzgAuAD4AOgAkSJAAAAIAKgAgQAhAPgABfEBh7ezE5NiwgMjQwfSwgezQ4 -MCwgMjcwfX1WV2luZG93WE5TV2luZG931ABaAA4AWwBcACsAXgBfAGBfEA9OU05leHRSZXNwb25kZXJY -TlN2RmxhZ3NbTlNGcmFtZVNpemWAAIANEQEAgAxaezQ4MCwgMjcwfdIANwA4AGMAZKMAZABlADVWTlNW -aWV3W05TUmVzcG9uZGVyXxAWe3swLCAwfSwgezE2ODAsIDEwMjh9fdIANwA4AGgAaaIAaQA1XxAQTlNX -aW5kb3dUZW1wbGF0ZdoAQwAOAEQARQBGAEcASABJAEoASwBrAE0AbQBPAFAAUQBwAFMAVAArgBKAD4Am -gAmACoARgADXAFoADgBzAFsAXABYAHQAdQBeAHcAXwB4AHUAelpOU1N1YnZpZXdzW05TU3VwZXJ2aWV3 -gBOADYAUgCSAE4Al0gAOAD0AfAB9gCOiAH4Af4AVgB/YAFoADgCBAIIAWwCDAFgAdABrAIUAhgCHAIgA -iQB1AGtXTlNGcmFtZVZOU0NlbGxZTlNFbmFibGVkgBKAHoAWgBcRAQwJgBOAEl8QF3t7MTQ1LCAxMTN9 -LCB7MTU0LCAxOX193ACOAA4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AmwCfAKAAfgCiAKMA -pFtOU0NlbGxGbGFnc18QE05TQWx0ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNC -dXR0b25GbGFnczJfEA9OU0tleUVxdWl2YWxlbnRaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9s -Vmlld18QD05TUGVyaW9kaWNEZWxheVxOU0NlbGxGbGFnczJdTlNCdXR0b25GbGFncxP/////hAH+AIAd -gBwQSxCkgByAGIAZgBURAZASCAAAABP/////hoRA/1Z5aWtlcyHUAA4ApwCoAKkAqgCrAKwArVZOU1Np -emVWTlNOYW1lWE5TZkZsYWdzgBsjQCgAAAAAAACAGhAQXEx1Y2lkYUdyYW5kZdIANwA4ALAAsaIAsQA1 -Vk5TRm9udFDSADcAOAC0ALWkALUAtgCCADVcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2VsbNIANwA4ALgA -uaUAuQC6AGQAZQA1WE5TQnV0dG9uWU5TQ29udHJvbNgAWgAOAIEAggBbAIMAWAB0AGsAhQC+AL8AiACJ -AHUAa4ASgB6AIIAhCYATgBJfEBV7ezAsIDI1MX0sIHsxNTQsIDE5fX3cAI4ADgCPAJAAkQCSAJMAlACV -AJYAlwCYAJkAmgCbAJwAnQCbAMgAoAB/AKIAowCkgB2AHIAcgCKAGYAfXxARUm91bmQgUmVjdCBCdXR0 -b27SADcAOADNAM6jAM4AzwA1Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnSADcAOADRANKjANIA0wA1XE5T -TXV0YWJsZVNldFVOU1NldNIADgA9AHwA1oAjpADXANgA2QDagCmALIBAgEPUAA4A3ADdAN4A3wBBAB8A -4l1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyAK4AQgAKAKlZ3aW5kb3fSADcAOADlAOajAOYA -5wA1XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4A3ADdAN4A3wDqAB8A7IAr -gC2AAoA/2ABaAA4AcwBbAFwAWAAyAHQA7gDvAPAAiADxAO4A8wD0gC6APoAvgDuALoA9gDzSAA4APQB8 -APeAI6IA+AD5gDCANNgAWgAOAIEAggBbAIMAWAB0AOoAhQD9AP4AiACJAO4A6oAtgB6AMYAyCYAugC1f -EBd7ezE1NywgMTEwfSwgezE1NCwgMTl9fdwAjgAOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACd -AJsBBwCgAPgAogCjAKSAHYAcgByAM4AZgDDYAFoADgCBAIIAWwCDAFgAdADqAQwBDQEOAIgAiQDuAOqA -LYA6gDWANgmALoAtXxAWe3szNTksIDEwOH0sIHs5NiwgMjF9fd4BFACOAA4BFQEWAJMAlACVARcBGACX -ARkBGgEbARwAmQEdAR4BHwCbASEA+QEjASQBHgElASQBJVdOU1ZhbHVlXxATTlNOdW1iZXJPZlRpY2tN -YXJrc18QEk5TVGlja01hcmtQb3NpdGlvblpOU01heFZhbHVlWk5TTWluVmFsdWVaTlNWZXJ0aWNhbF1O -U0FsdEluY1ZhbHVlXxAaTlNBbGxvd3NUaWNrTWFya1ZhbHVlc09ubHkjQEkAAAAAAACAORAAEAGAHIA3 -gDQjQFkAAAAAAAAjAAAAAAAAAAAICNQADgCnAKgAqQCqAKsBKQCtgBuAOFlIZWx2ZXRpY2HSADcAOAEs -AS2kAS0AtgCCADVcTlNTbGlkZXJDZWxs0gA3ADgBLwEwpQEwALoAZABlADVYTlNTbGlkZXJaezQ4MCwg -MjcyfdIANwA4ATMBNKQBNABkAGUANVxOU0N1c3RvbVZpZXdUdmlld9QADgDcAN0A3gE3AEEAfgE6gEKA -EIAVgEFZb3JkZXJPdXQ60gA3ADgBPQE+owE+AOcANV8QFU5TTmliQ29udHJvbENvbm5lY3RvctQADgDc -AN0A3gE3AEEA+AFDgEKAEIAwgERbb3JkZXJGcm9udDrSAA4APQFGAUeASK4A+QEOAOoAawCHAL8BTgD+ -AH8AfgBAAEEATAD4gDSANoAtgBKAF4AhgEaAMoAfgBWAB4AQgAuAMNIADgAyADMBWIAEgEddTlNBcHBs -aWNhdGlvbtIANwA4AVsAz6IAzwA10gAOAD0BRgFegEiuAOoA+QAfAEEAfgB/AB8A+ABrAGsAHwAfAEAA -6oAtgDSAAoAQgBWAH4ACgDCAEoASgAKAAoAHgC3SAA4APQFGAW+ASK8QDwD5AGsA6gEOAIcAvwFOAP4A -fwBAAEwAQQB+AB8A+IA0gBKALYA2gBeAIYBGgDKAH4AHgAuAEIAVgAKAMNIADgA9AUYBgYBIrxAPAYIB -gwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQgEyATYBOgE+AUIBRgFKAU4BUgFWAVoBXgFiAWYBaXxAR -SG9yaXpvbnRhbCBTbGlkZXJcQ29udGVudCBWaWV3W0N1c3RvbSBWaWV3W1NsaWRlciBDZWxsXxAUQnV0 -dG9uIENlbGwgKHlpa2VzISlfECFCdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pLTFbQXBwbGlj -YXRpb25fEB9CdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pXxAnUm91bmQgUmVjdCBCdXR0b24g -KFJvdW5kIFJlY3QgQnV0dG9uKS0xXxARV2luZG93IChXaW5kb3cpLTFeQ29udGVudCBWaWV3LTFfEA9X -aW5kb3cgKFdpbmRvdylfEBpSb3VuZCBSZWN0IEJ1dHRvbiAoeWlrZXMhKVxGaWxlJ3MgT3duZXJfECVS -b3VuZCBSZWN0IEJ1dHRvbiAoUm91bmQgUmVjdCBCdXR0b24p0gAOAD0BRgGigEig0gAOAD0BRgGlgEig -0gAOAD0BRgGogEivEBMA2AD5AQ4A6gBrAIcAvwFOANkA2gD+AH8AfgBAAEEATADXAB8A+IAsgDSANoAt -gBKAF4AhgEaAQIBDgDKAH4AVgAeAEIALgCmAAoAw0gAOAD0BRgG+gEivEBMBvwHAAcEBwgHDAcQBxQHG -AccByAHJAcoBywHMAc0BzgHPAdAB0YBfgGCAYYBigGOAZIBlgGaAZ4BogGmAaoBrgGyAbYBugG+AcIBx -EBQQChALEA0QERAaE//////////9EBgQFhAJEBkQDhAMEBUQGxAI0gAOAD0AfAHkgCOg0gAOAD0BRgHn -gEig0gAOAD0BRgHqgEig0gA3ADgB7AHtogHtADVeTlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBE -AFIAVABmAVUBWwGmAa0BtAHCAdQB8AH+AgoCFgIkAi8CPQJZAmcCegKMAqYCsAK9Ar8CwQLDAsUCxwLJ -AssCzQLPAtEC0wLVAtcC2QLbAt0C3wLhAuoC9gL4AvoDAwMMAxUDIAMlAzQDRwNQA1sDXQNiA2QDZgOP -A5wDqQO3A8EDzwPcA+4EAgQOBBAEEgQUBBYEGwQdBB8EIQQjBCUEQARHBFAEYQRzBHwEiASKBIwEjwSR -BJwEpQSsBLMEvwTYBOEE5gT5BSIFJAUmBSgFKgUsBS4FMAVNBVgFZAVmBWgFagVsBW4FcAV5BXsFgAWC -BYQFpQWtBbQFvgXABcIFxAXGBckFygXMBc4F6AYZBiUGOwZQBl8GcQZ8BoYGlAamBrMGwQbKBswGzgbQ -BtIG1AbWBtgG2gbdBuIG6wbyBwMHCgcRBxoHHAclBycHKQc2Bz8HRAdLB0wHVQdeB2sHeAeBB4wHlQef -B8AHwgfEB8YHyAfJB8sHzQflCBYIGAgaCBwIHgggCCIINgg/CEYIVQhdCGYIbQh6CIAIiQiLCJQIlgiY -CJoInAitCLsIxAjMCM4I0AjSCNQI2wjkCOsJAgkRCSIJJAkmCSgJKglLCU0JTwlRCVMJVQlXCVkJYglk -CWkJawltCY4JkAmSCZQJlgmXCZkJmwm1CeYJ6AnqCewJ7gnwCfIKEwoVChcKGQobChwKHgogCjkKcgp6 -CpAKpQqwCrsKxgrUCvEK+gr8Cv4LAAsCCwQLBgsPCxgLGQsaCysLLQsvCzkLQgtLC1gLYQtsC3ULgAuJ -C5ILnwukC7ULtwu5C7sLvQvHC9AL1wvvDAAMAgwEDAYMCAwUDB0MHww8DD4MQAxCDEQMRgxIDEoMTAxO -DFAMUgxUDFYMWAxhDGMMZQxzDHwMgQyKDIwMqQyrDK0MrwyxDLMMtQy3DLkMuwy9DL8MwQzDDMUMzgzQ -DPEM8wz1DPcM+Qz7DP0M/w0BDQMNBQ0HDQkNCw0NDQ8NGA0aDTsNPQ0/DUENQw1FDUcNSQ1LDU0NTw1R -DVMNVQ1XDVkNbQ16DYYNkg2pDc0N2Q37DiUOOQ5IDloOdw6EDqwOtQ63DrgOwQ7DDsQOzQ7PDvgO+g78 -Dv4PAA8CDwQPBg8IDwoPDA8ODxAPEg8UDxYPGA8aDxwPHg8nDykPUg9UD1YPWA9aD1wPXg9gD2IPZA9m -D2gPag9sD24PcA9yD3QPdg94D3oPfA9+D4APgg+ED40Pjw+RD5MPlQ+XD5kPmw+dD58PqA+qD6sPtA+2 -D7cPwA/CD8MPzA/RAAAAAAAAAgIAAAAAAAAB7gAAAAAAAAAAAAAAAAAAD+A +CwBmANAA1ADbAOMA5ADoAO0A9QD9AAsA/gEFAQYBCQEOAQ8BFAEZASEBIgE2ATkBOgE9AUAACwBkAUEB +RAFFAVYBWQFaAVwBbQF/AZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABowGmAbwB0gHTAdQB +1QHWAdcB2AEuAdkAVAHaAdsB3AHdAd4B3wHgAK0B4QHiAeUB6AHrVSRudWxs3xASAA0ADgAPABAAEQAS +ABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAw +Vk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18QGU5TQWNjZXNzaWJp +bGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1ld29ya11OU0NsYXNz +ZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eUNvbm5lY3RvcnNd +TlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1ZXNfEBdOU0FjY2Vz +c2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKAdIBEgFuAc4AogEmABYBagFyA +SoBxgACABoBIgHIQHIBd0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA1hOU09iamVjdNIANwA4ADkAOlgk +Y2xhc3Nlc1okY2xhc3NuYW1logA6ADVeTlNDdXN0b21PYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAO +AD0APgA/Wk5TLm9iamVjdHOAJ6IAQABBgAeAENoAQwAOAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAA +UQBSAFMAVAArXE5TV2luZG93Vmlld1xOU1NjcmVlblJlY3RdTlNXaW5kb3dUaXRsZVlOU1dURmxhZ3Nd +TlNXaW5kb3dDbGFzc1xOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tpbmdfEBFOU1dpbmRvd1N0eWxl +TWFza1tOU1ZpZXdDbGFzc4ALgA+ADoAJEiQAAACACoAIEAIQD4AAXxAYe3sxOTYsIDI0MH0sIHs0ODAs +IDI3MH19VldpbmRvd1hOU1dpbmRvd9QAWgAOAFsAXAArAF4AXwBgXxAPTlNOZXh0UmVzcG9uZGVyWE5T +dkZsYWdzW05TRnJhbWVTaXplgACADREBAIAMWns0ODAsIDI3MH3SADcAOABjAGSjAGQAZQA1Vk5TVmll +d1tOU1Jlc3BvbmRlcl8QFnt7MCwgMH0sIHsxNjgwLCAxMDI4fX3SADcAOABoAGmiAGkANV8QEE5TV2lu +ZG93VGVtcGxhdGXaAEMADgBEAEUARgBHAEgASQBKAEsAawBNAG0ATwBQAFEAcABTAFQAK4ASgA+AJoAJ +gAqAEYAA1wBaAA4AcwBbAFwAWAB0AHUAXgB3AF8AeAB1AHpaTlNTdWJ2aWV3c1tOU1N1cGVydmlld4AT +gA2AFIAkgBOAJdIADgA9AHwAfYAjogB+AH+AFYAf2ABaAA4AgQCCAFsAgwBYAHQAawCFAIYAhwCIAIkA +dQBrV05TRnJhbWVWTlNDZWxsWU5TRW5hYmxlZIASgB6AFoAXEQEMCYATgBJfEBd7ezE0NSwgMTEzfSwg +ezE1NCwgMTl9fdwAjgAOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACdAJsAnwCgAH4AogCjAKRb +TlNDZWxsRmxhZ3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxASTlNQZXJpb2RpY0ludGVydmFsXk5TQnV0 +dG9uRmxhZ3MyXxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29udGVudHNZTlNTdXBwb3J0XU5TQ29udHJvbFZp +ZXdfEA9OU1BlcmlvZGljRGVsYXlcTlNDZWxsRmxhZ3MyXU5TQnV0dG9uRmxhZ3MT/////4QB/gCAHYAc +EEsQpIAcgBiAGYAVEQGQEggAAAAT/////4aEQP9WeWlrZXMh1AAOAKcAqACpAKoAqwCsAK1WTlNTaXpl +Vk5TTmFtZVhOU2ZGbGFnc4AbI0AoAAAAAAAAgBoQEFxMdWNpZGFHcmFuZGXSADcAOACwALGiALEANVZO +U0ZvbnRQ0gA3ADgAtAC1pAC1ALYAggA1XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzSADcAOAC4ALml +ALkAugBkAGUANVhOU0J1dHRvbllOU0NvbnRyb2zYAFoADgCBAIIAWwCDAFgAdABrAIUAvgC/AIgAiQB1 +AGuAEoAegCCAIQmAE4ASXxAVe3swLCAyNTF9LCB7MTU0LCAxOX193ACOAA4AjwCQAJEAkgCTAJQAlQCW +AJcAmACZAJoAmwCcAJ0AmwDIAKAAfwCiAKMApIAdgByAHIAigBmAH18QEVJvdW5kIFJlY3QgQnV0dG9u +0gA3ADgAzQDOowDOAM8ANV5OU011dGFibGVBcnJheVdOU0FycmF50gA3ADgA0QDSowDSANMANVxOU011 +dGFibGVTZXRVTlNTZXTSAA4APQB8ANaAI6QA1wDYANkA2oApgCyANIA21AAOANwA3QDeAN8AQQAfAOJd +TlNEZXN0aW5hdGlvblhOU1NvdXJjZVdOU0xhYmVsgCuAEIACgCpWd2luZG930gA3ADgA5QDmowDmAOcA +NV8QFE5TTmliT3V0bGV0Q29ubmVjdG9yXk5TTmliQ29ubmVjdG9y1AAOANwA3QDeAOkAQQDrAOyAM4AQ +gC2AMtgAWgAOAIEAggBbAIMAWAB0AO4AhQDwAPEAiACJAPMA7oAugB6AL4AxCYAwgC7YAFoADgBzAFsA +XABYADIAdADzAPcA+ACIAPkA8wD7APyAMIBCgDeAP4AwgEGAQF8QF3t7MTU3LCAxMTB9LCB7MTU0LCAx +OX193ACOAA4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AmwDIAKAA6wCiAKMApIAdgByAHIAi +gBmALVtvcmRlckZyb250OtIANwA4AQcBCKMBCADnADVfEBVOU05pYkNvbnRyb2xDb25uZWN0b3LUAA4A +3ADdAN4A6QBBAH4BDYAzgBCAFYA1WW9yZGVyT3V0OtQADgDcAN0A3gDfAO4AHwETgCuALoACgEPSAA4A +PQB8ARaAI6IA6wEYgC2AONgAWgAOAIEAggBbAIMAWAB0AO4BGwEcAR0AiACJAPMA7oAugD6AOYA6CYAw +gC5fEBZ7ezM1OSwgMTA4fSwgezk2LCAyMX193gEjAI4ADgEkASUAkwCUAJUBJgEnAJcBKAEpASoBKwCZ +ASwBLQEuAJsBMAEYATIBMwEtATQBMwE0V05TVmFsdWVfEBNOU051bWJlck9mVGlja01hcmtzXxASTlNU +aWNrTWFya1Bvc2l0aW9uWk5TTWF4VmFsdWVaTlNNaW5WYWx1ZVpOU1ZlcnRpY2FsXU5TQWx0SW5jVmFs +dWVfEBpOU0FsbG93c1RpY2tNYXJrVmFsdWVzT25seSNASQAAAAAAAIA9EAAQAYAcgDuAOCNAWQAAAAAA +ACMAAAAAAAAAAAgI1AAOAKcAqACpAKoAqwE4AK2AG4A8WUhlbHZldGljYdIANwA4ATsBPKQBPAC2AIIA +NVxOU1NsaWRlckNlbGzSADcAOAE+AT+lAT8AugBkAGUANVhOU1NsaWRlclp7NDgwLCAyNzJ90gA3ADgB +QgFDpAFDAGQAZQA1XE5TQ3VzdG9tVmlld1R2aWV30gAOAD0BRgFHgEeuAGsAfwEYAEAA7gFNAEwA8QEd +AEEA6wCHAL8AfoASgB+AOIAHgC6ARYALgDGAOoAQgC2AF4AhgBXSAA4AMgAzAViABIBGXU5TQXBwbGlj +YXRpb27SADcAOAFbAM+iAM8ANdIADgA9AUYBXoBHrgBBAGsA7gAfAB8AHwBAAOsBGAAfAO4AfgB/AGuA +EIASgC6AAoACgAKAB4AtgDiAAoAugBWAH4AS0gAOAD0BRgFvgEevEA8AawB/ARgAQADuAU0ATADxAR0A +QQAfAOsAvwB+AIeAEoAfgDiAB4AugEWAC4AxgDqAEIACgC2AIYAVgBfSAA4APQFGAYGAR68QDwGCAYMB +hAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkIBLgEyATYBOgE+AUIBRgFKAU4BUgFWAVoBXgFiAWVxDb250 +ZW50IFZpZXdfECdSb3VuZCBSZWN0IEJ1dHRvbiAoUm91bmQgUmVjdCBCdXR0b24pLTFfEBFIb3Jpem9u +dGFsIFNsaWRlcllGcmFuY2lzY29bQ3VzdG9tIFZpZXdbQXBwbGljYXRpb25eQ29udGVudCBWaWV3LTFf +EB9CdXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pW1NsaWRlciBDZWxsXxAPV2luZG93IChXaW5k +b3cpXEZpbGUncyBPd25lcl8QJVJvdW5kIFJlY3QgQnV0dG9uIChSb3VuZCBSZWN0IEJ1dHRvbilfECFC +dXR0b24gQ2VsbCAoUm91bmQgUmVjdCBCdXR0b24pLTFfEBpSb3VuZCBSZWN0IEJ1dHRvbiAoeWlrZXMh +KV8QFEJ1dHRvbiBDZWxsICh5aWtlcyEp0gAOAD0BRgGigEeg0gAOAD0BRgGlgEeg0gAOAD0BRgGogEev +EBMAawB/ARgA2gDYAEAA2QDuAU0ATADXAPEBHQBBAB8A6wCHAH4Av4ASgB+AOIA2gCyAB4A0gC6ARYAL +gCmAMYA6gBCAAoAtgBeAFYAh0gAOAD0BRgG+gEevEBMBvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHM +Ac0BzgHPAdAB0YBegF+AYIBhgGKAY4BkgGWAZoBngGiAaYBqgGuAbIBtgG6Ab4BwEA0QGRAKEBQQFhAO +EBgT//////////0QFRAJEAsQDBAbEAgQERAa0gAOAD0AfAHkgCOg0gAOAD0BRgHngEeg0gAOAD0BRgHq +gEeg0gA3ADgB7AHtogHtADVeTlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBEAFIAVABmAVMBWQGk +AasBsgHAAdIB7gH8AggCFAIiAi0COwJXAmUCeAKKAqQCrgK7Ar0CvwLBAsMCxQLHAskCywLNAs8C0QLT +AtUC1wLZAtsC3QLfAugC9AL2AvgDAQMKAxMDHgMjAzIDRQNOA1kDWwNgA2IDZAONA5oDpwO1A78DzQPa +A+wEAAQMBA4EEAQSBBQEGQQbBB0EHwQhBCMEPgRFBE4EXwRxBHoEhgSIBIoEjQSPBJoEowSqBLEEvQTW +BN8E5AT3BSAFIgUkBSYFKAUqBSwFLgVLBVYFYgVkBWYFaAVqBWwFbgV3BXkFfgWABYIFowWrBbIFvAW+ +BcAFwgXEBccFyAXKBcwF5gYXBiMGOQZOBl0GbwZ6BoQGkgakBrEGvwbIBsoGzAbOBtAG0gbUBtYG2Abb +BuAG6QbwBwEHCAcPBxgHGgcjByUHJwc0Bz0HQgdJB0oHUwdcB2kHdgd/B4oHkwedB74HwAfCB8QHxgfH +B8kHywfjCBQIFggYCBoIHAgeCCAINAg9CEQIUwhbCGQIawh4CH4IhwiJCJIIlAiWCJgImgirCLkIwgjK +CMwIzgjQCNII2QjiCOkJAAkPCSAJIgkkCSYJKAlJCUsJTQlPCVEJUglUCVYJdwl5CXsJfQl/CYEJgwmF +CZ8J0AnSCdQJ1gnYCdoJ3AnoCfEJ+AoQCiEKIwolCicKKQozCkQKRgpICkoKTApVClcKXApeCmAKgQqD +CoUKhwqJCooKjAqOCqcK4AroCv4LEwseCykLNAtCC18LaAtqC2wLbgtwC3ILdAt9C4YLhwuIC5kLmwud +C6cLsAu5C8YLzwvaC+ML7gv3DAAMDQwSDBsMHQw6DDwMPgxADEIMRAxGDEgMSgxMDE4MUAxSDFQMVgxf +DGEMYwxxDHoMfwyIDIoMpwypDKsMrQyvDLEMswy1DLcMuQy7DL0MvwzBDMMMzAzODO8M8QzzDPUM9wz5 +DPsM/Qz/DQENAw0FDQcNCQ0LDQ0NFg0YDTkNOw09DT8NQQ1DDUUNRw1JDUsNTQ1PDVENUw1VDVcNZA2O +DaINrA24DcQN0w31DgEOEw4gDkgObA6JDqAOqQ6rDqwOtQ63DrgOwQ7DDuwO7g7wDvIO9A72DvgO+g78 +Dv4PAA8CDwQPBg8IDwoPDA8ODxAPEg8bDx0PRg9ID0oPTA9OD1APUg9UD1YPWA9aD1wPXg9gD2IPZA9m +D2gPag9sD24PcA9yD3QPdg94D3oPgw+FD4cPiQ+LD40Pjw+RD5MPnA+eD58PqA+qD6sPtA+2D7cPwA/F +AAAAAAAAAgIAAAAAAAAB7gAAAAAAAAAAAAAAAAAAD9Q From 7f59ce782b815f4eef98960bb30f48e13bdfde03 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Sun, 21 Sep 2008 02:56:28 -0700 Subject: [PATCH 24/24] Accidentally committed a few alerts. Reviewed by me. --- AppKit/Cib/_CPCibObjectData.j | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/AppKit/Cib/_CPCibObjectData.j b/AppKit/Cib/_CPCibObjectData.j index 736d18265..f336e6942 100644 --- a/AppKit/Cib/_CPCibObjectData.j +++ b/AppKit/Cib/_CPCibObjectData.j @@ -63,10 +63,9 @@ import "_CPCibConnector.j" { var count = [_objectsValues count], topLevelObjects = []; - var str = ""; - str2 = " "; + while (count--) - {str2 += _namesValues[count] +"\n"; + { var eachObject = _objectsValues[count]; if (eachObject == _fileOwner) @@ -74,12 +73,10 @@ import "_CPCibConnector.j" var anObject = _objectsKeys[count]; if (anObject != _fileOwner) - {str += _namesValues[count] + "\n"; - anObject.realname = _namesValues[count];str2+='X'+'\n'; - topLevelObjects.push(anObject);} + topLevelObjects.push(anObject); } } - alert(str2+'\n'+str); + return topLevelObjects; }