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/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];
}
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 84fbd9d7a..dc2c04e33 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;
}
/*
@@ -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/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;
diff --git a/AppKit/CPSplitView.j b/AppKit/CPSplitView.j
index adafffca9..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,8 +73,7 @@ var CPSplitViewHorizontalImage = nil,
_DOMDividerElements = [];
- [self setVertical:YES];
- [self setIsPaneSplitter:YES];
+ [self _setVertical:YES];
}
return self;
@@ -81,31 +81,47 @@ var CPSplitViewHorizontalImage = nil,
- (float)dividerThickness
{
- return 10.0;
+ return _isPaneSplitter ? 1.0 : 10.0;
}
- (BOOL)isVertical
{
return _isVertical;
}
+
- (void)setVertical:(BOOL)flag
+{
+ [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];
-
- [self adjustSubviews];
+ _originComponent = [self isVertical] ? "x" : "y";
+ _sizeComponent = [self isVertical] ? "width" : "height";
+ _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename];
}
- (BOOL)isPaneSplitter
{
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
@@ -120,15 +136,16 @@ var CPSplitViewHorizontalImage = nil,
[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))];
- }
+ 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];
@@ -142,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];
@@ -157,19 +174,20 @@ 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;
}
- (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
@@ -181,13 +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));
-
- _DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')";
#endif
}
@@ -207,6 +235,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 +273,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];
@@ -273,15 +317,11 @@ var CPSplitViewHorizontalImage = nil,
}
}
- else if (type == CPLeftMouseDragged)
+ else if (type == CPLeftMouseDragged && _currentDivider != CPNotFound)
{
- if (_currentDivider != CPNotFound)
- {
- var location = [anEvent locationInWindow],
- point = [self convertPoint:location 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];
@@ -331,9 +371,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);
@@ -362,20 +402,23 @@ var CPSplitViewHorizontalImage = nil,
[self _postNotificationWillResize];
- var frame = CGRectCreateCopy([self frame]);
+ var frame = [self frame];
- for (var i = 0; i < [_subviews 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 == [_subviews 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];
}
@@ -418,6 +461,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/AppKit/CPTextField.j b/AppKit/CPTextField.j
index 900015de8..fbb63ca66 100644
--- a/AppKit/CPTextField.j
+++ b/AppKit/CPTextField.j
@@ -105,6 +105,7 @@ var _CPTextFieldSquareBezelColor = nil;
BOOL _isSelectable;
id _value;
+ id _placeholderString;
CPLineBreakMode _lineBreakMode;
#if PLATFORM(DOM)
@@ -140,11 +141,12 @@ var _CPTextFieldSquareBezelColor = nil;
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
-
+
if (self)
{
_value = @"";
-
+ _placeholderString = @"";
+
#if PLATFORM(DOM)
_DOMTextElement = document.createElement("div");
_DOMTextElement.style.position = "absolute";
@@ -167,8 +169,7 @@ var _CPTextFieldSquareBezelColor = nil;
// Setting the Bezel Style
/*
Sets whether the textfield will have a bezeled border.
- @param shouldBeBezeled YES means the textfield
- will draw a bezeled border
+ @param shouldBeBezeled YES means the textfield will draw a bezeled border
*/
- (void)setBezeled:(BOOL)shouldBeBezeled
{
@@ -181,8 +182,7 @@ var _CPTextFieldSquareBezelColor = nil;
}
/*
- Returns YES if the textfield draws a
- bezeled border.
+ Returns YES if the textfield draws a bezeled border.
*/
- (BOOL)isBezeled
{
@@ -213,8 +213,7 @@ var _CPTextFieldSquareBezelColor = nil;
/*
Sets whether the textfield will have a border drawn.
- @param shouldBeBordered YES makes the
- textfield draw a border
+ @param shouldBeBordered YES makes the textfield draw a border
*/
- (void)setBordered:(BOOL)shouldBeBordered
{
@@ -227,8 +226,7 @@ var _CPTextFieldSquareBezelColor = nil;
}
/*
- Returns YES if the textfield has
- a border.
+ Returns YES if the textfield has a border.
*/
- (BOOL)isBordered
{
@@ -264,11 +262,13 @@ var _CPTextFieldSquareBezelColor = nil;
[self setBackgroundColor:nil];
}
+/* @ignore */
- (BOOL)acceptsFirstResponder
{
return _isEditable;
}
+/* @ignore */
- (BOOL)becomeFirstResponder
{
var string = [self stringValue];
@@ -283,12 +283,12 @@ var _CPTextFieldSquareBezelColor = nil;
element.style.font = _DOMElement.style.font;
element.style.zIndex = 1000;
element.style.width = CGRectGetWidth([self bounds]) - 3.0 + "px";
-// element.style.left = _DOMTextElement.style.left;
-// element.style.top = _DOMTextElement.style.top;
+ //element.style.left = _DOMTextElement.style.left;
+ //element.style.top = _DOMTextElement.style.top;
_DOMElement.appendChild(element);
window.setTimeout(function() { element.focus(); }, 0.0);
-// element.onblur = function() { objj_debug_print_backtrace(); }
+ //element.onblur = function() { objj_debug_print_backtrace(); }
//element.select();
element.onkeypress = function(aDOMEvent)
@@ -309,12 +309,17 @@ var _CPTextFieldSquareBezelColor = nil;
}
};
+ // If current value is the placeholder value, remove it to allow user to update.
+ if ([_value lowercaseString] == [[self placeholderString] lowercaseString])
+ [self setStringValue:@""];
+
[[CPDOMWindowBridge sharedDOMWindowBridge] _propagateCurrentDOMEvent:YES];
#endif
return YES;
}
+/* @ignore */
- (BOOL)resignFirstResponder
{
#if PLATFORM(DOM)
@@ -322,19 +327,25 @@ var _CPTextFieldSquareBezelColor = nil;
_DOMElement.removeChild(element);
[self setStringValue:element.value];
-#endif
+ // If textfield has no value, then display the placeholderValue
+ if (!_value)
+ [self setStringValue:[self placeholderString]];
+
+#endif
return YES;
}
+/*
+ Sets whether or not the receiver text field can be edited
+*/
- (void)setEditable:(BOOL)shouldBeEditable
{
_isEditable = shouldBeEditable;
}
/*
- Returns YES if the textfield is currently
- editable by the user.
+ Returns YES if the textfield is currently editable by the user.
*/
- (BOOL)isEditable
{
@@ -351,8 +362,7 @@ var _CPTextFieldSquareBezelColor = nil;
}
/*
- Returns YES if the field's text is
- selectable by the user.
+ Returns YES if the field's text is selectable by the user.
*/
- (BOOL)isSelectable
{
@@ -360,8 +370,7 @@ var _CPTextFieldSquareBezelColor = nil;
}
/*
- Sets whether the field's text is selectable
- by the user.
+ Sets whether the field's text is selectable by the user.
@param aFlag YES makes the text selectable
*/
- (void)setSelectable:(BOOL)aFlag
@@ -432,7 +441,7 @@ var _CPTextFieldSquareBezelColor = nil;
return [[self class] _inputElement].value;
#endif
- return [self stringValue];
+ return [super stringValue];
}
/*
@@ -457,6 +466,23 @@ var _CPTextFieldSquareBezelColor = nil;
#endif
}
+/*
+ Returns the receiver's placeholder string
+*/
+- (CPString)placeholderString
+{
+ return _placeholderString;
+}
+
+/*
+ Sets a placeholder string for the receiver. The placeholder is displayed until editing begins,
+ and after editing ends, if the text field has an empty string value
+*/
+-(void)setPlaceholderString:(CPString)aStringValue
+{
+ _placeholderString = aStringValue;
+}
+
/*
Adjusts the text field's size in the application.
*/
@@ -469,6 +495,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",
@@ -520,10 +559,8 @@ var CPTextFieldIsSelectableKey = @"CPTextFieldIsSelectableKey",
}
/*
- Encodes the data of this textfield into the
- provided coder.
- @param aCoder the coder into which the data
- will be written
+ Encodes the data of this textfield into the provided coder.
+ @param aCoder the coder into which the data will be written
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
diff --git a/AppKit/CPView.j b/AppKit/CPView.j
index 1fe0de2e2..db843c9d9 100644
--- a/AppKit/CPView.j
+++ b/AppKit/CPView.j
@@ -37,13 +37,47 @@ import "CPGraphicsContext.j"
#include "CoreGraphics/CGGeometry.h"
#include "Platform/DOM/CPDOMDisplayServer.h"
-
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ The default resizingMask, the view will not resize or reposition itself.
+*/
CPViewNotSizable = 0;
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ Allow for flexible space on the left hand side of the view.
+*/
CPViewMinXMargin = 1;
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ The view should grow and shrink horizontally with its parent view.
+*/
CPViewWidthSizable = 2;
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ Allow for flexible space to the right hand side of the view.
+*/
CPViewMaxXMargin = 4;
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ Allow for flexible space above the view.
+*/
CPViewMinYMargin = 8;
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ The view should grow and shrink vertically with its parent view.
+*/
CPViewHeightSizable = 16;
+/*
+ @global
+ @group CPViewAutoresizingMasks
+ Allow for flexible space below the view.
+*/
CPViewMaxYMargin = 32;
CPViewBoundsDidChangeNotification = @"CPViewBoundsDidChangeNotification";
@@ -88,6 +122,8 @@ var DOMElementPrototype = nil,
CPGraphicsContext _graphicsContext;
+ int _tag;
+
CGRect _frame;
CGRect _bounds;
CGAffineTransform _boundsTransform;
@@ -159,6 +195,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
@@ -174,6 +215,8 @@ var DOMElementPrototype = nil,
_subviews = [];
+ _tag = -1;
+
_frame = _CGRectMakeCopy(aFrame);
_bounds = _CGRectMake(0.0, 0.0, width, height);
@@ -364,7 +407,7 @@ var DOMElementPrototype = nil,
[aSubview removeFromSuperview];
- [aView _insertSubview:aView atIndex:index];
+ [self _insertSubview:aView atIndex:index];
}
/* @ignore */
@@ -464,6 +507,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 +1713,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask",
CPViewOpacityKey = @"CPViewOpacityKey",
CPViewSubviewsKey = @"CPViewSubviewsKey",
CPViewSuperviewKey = @"CPViewSuperviewKey",
+ CPViewTagKey = @"CPViewTagKey",
CPViewWindowKey = @"CPViewWindowKey";
@implementation CPView (CPCoding)
@@ -1692,6 +1741,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 +1790,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/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/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/_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..3776cc5a8
--- /dev/null
+++ b/AppKit/Cib/_CPCibKeyedUnarchiver.j
@@ -0,0 +1,37 @@
+
+import
+
+
+@implementation _CPCibKeyedUnarchiver : CPKeyedUnarchiver
+{
+}
+
+- (id)initForReadingWithData:(CPData)data
+{
+ self = [super initForReadingWithData:data];
+
+ if (self)
+ [self setDelegate:self];
+
+ 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
+{
+ _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..f336e6942 100644
--- a/AppKit/Cib/_CPCibObjectData.j
+++ b/AppKit/Cib/_CPCibObjectData.j
@@ -58,16 +58,17 @@ import "_CPCibConnector.j"
CPSet _visibleWindows;
}
-/*
+
- (CPArray)topLevelObjects
{
- var count = [_objectsValues count];
+ var count = [_objectsValues count],
+ topLevelObjects = [];
while (count--)
{
var eachObject = _objectsValues[count];
- if(eachObject == _fileOwner)
+ if (eachObject == _fileOwner)
{
var anObject = _objectsKeys[count];
@@ -78,7 +79,6 @@ import "_CPCibConnector.j"
return topLevelObjects;
}
-*/
@end
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/AppKit/_CPWindowView.j b/AppKit/_CPWindowView.j
index f427f98a5..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;
diff --git a/Foundation/CPString.j b/Foundation/CPString.j
index c5ade8ee7..ef02d1060 100644
--- a/Foundation/CPString.j
+++ b/Foundation/CPString.j
@@ -553,7 +553,7 @@ var CPStringHashes = new objj_dictionary();
*/
- (CPString)pathExtension
{
- return substr(lastIndexOf('.')+1);
+ return substr(lastIndexOf('.') + 1);
}
/*
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
diff --git a/Tools/NibApp/HelloWorld.nib/info.nib b/Tools/NibApp/HelloWorld.nib/info.nib
index b8f7650f5..e6ff1f2ef 100644
--- a/Tools/NibApp/HelloWorld.nib/info.nib
+++ b/Tools/NibApp/HelloWorld.nib/info.nib
@@ -7,7 +7,9 @@
IBOldestOS
5
IBOpenObjects
-
+
+ 1
+
IBSystem Version
9F33
targetFramework
diff --git a/Tools/NibApp/HelloWorld.nib/keyedobjects.nib b/Tools/NibApp/HelloWorld.nib/keyedobjects.nib
index 3ad8add67..44157a897 100644
Binary files a/Tools/NibApp/HelloWorld.nib/keyedobjects.nib and b/Tools/NibApp/HelloWorld.nib/keyedobjects.nib differ
diff --git a/Tools/NibApp/HelloWorld.xib b/Tools/NibApp/HelloWorld.xib
index 206d50ba7..b94e7b7a8 100644
--- a/Tools/NibApp/HelloWorld.xib
+++ b/Tools/NibApp/HelloWorld.xib
@@ -9,11 +9,11 @@
@@ -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
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/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/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/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"];
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];
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)
{