mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-09-09 12:17:13 +00:00
Compare commits
47
Commits
1.0.0.007
...
v0.8.0-RC4
@@ -860,12 +860,11 @@ CPRunContinuesResponse = -1002;
|
||||
|
||||
if ([windowController respondsToSelector:anAction])
|
||||
return windowController;
|
||||
|
||||
|
||||
var theDocument = [windowController document];
|
||||
|
||||
if (theDocument != delegate && [theDocument respondsToSelector:anAction])
|
||||
if (theDocument !== delegate && [theDocument respondsToSelector:anAction])
|
||||
return theDocument;
|
||||
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@@ -874,7 +873,7 @@ CPRunContinuesResponse = -1002;
|
||||
Checks for a target in the following order:
|
||||
<ol>
|
||||
<li>a responder from the key window</li>
|
||||
<li>a responder frmo the main window</li>
|
||||
<li>a responder from the main window</li>
|
||||
<li>the CPApplication instance</li>
|
||||
<li>the application delegate</li>
|
||||
<li>the document controller</li>
|
||||
@@ -913,8 +912,6 @@ CPRunContinuesResponse = -1002;
|
||||
- (void)setCallback:(Function)aCallback forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue
|
||||
{
|
||||
_eventListeners.push(_CPEventListenerMake(aMask, aCallback));
|
||||
|
||||
if (_eventListeners.length == 3) objj_debug_print_backtrace();
|
||||
}
|
||||
|
||||
- (CPEvent)setTarget:(id)aTarget selector:(SEL)aSelector forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue
|
||||
@@ -1063,7 +1060,7 @@ CPRunContinuesResponse = -1002;
|
||||
else if ([self mainWindow])
|
||||
[[self mainWindow] makeKeyAndOrderFront:self];
|
||||
else
|
||||
[[[self mainMenu] window] makeKeyWindow]; //FIXME this may not actually work
|
||||
[[self mainMenu]._menuWindow makeKeyWindow]; //FIXME this may not actually work
|
||||
|
||||
_previousKeyWindow = nil;
|
||||
_previousMainWindow = nil;
|
||||
|
||||
@@ -162,6 +162,7 @@ CPGrooveBorder = 3;
|
||||
|
||||
[aView setFrame:CGRectInset([self bounds], _contentMargin.width + _borderWidth, _contentMargin.height + _borderWidth)];
|
||||
[self replaceSubview:_contentView with:aView];
|
||||
[aView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
|
||||
|
||||
_contentView = aView;
|
||||
}
|
||||
|
||||
+2
-5
@@ -502,8 +502,6 @@ CPButtonStateMixed = CPThemeState("mixed");
|
||||
}
|
||||
else
|
||||
return [[_CPImageAndTextView alloc] initWithFrame:_CGRectMakeZero()];
|
||||
|
||||
return [super createEphemeralSubviewNamed:aName];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
@@ -511,9 +509,8 @@ CPButtonStateMixed = CPThemeState("mixed");
|
||||
var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view"
|
||||
positioned:CPWindowBelow
|
||||
relativeToEphemeralSubviewNamed:@"content-view"];
|
||||
|
||||
if (bezelView)
|
||||
[bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]];
|
||||
|
||||
[bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]];
|
||||
|
||||
var contentView = [self layoutEphemeralSubviewNamed:@"content-view"
|
||||
positioned:CPWindowAbove
|
||||
|
||||
+14
-6
@@ -120,9 +120,13 @@
|
||||
|
||||
[super setBoundsOrigin:aPoint];
|
||||
|
||||
var superview = [self superview];
|
||||
|
||||
if([superview isKindOfClass:[CPScrollView class]])
|
||||
var superview = [self superview],
|
||||
|
||||
// This is hack to avoid having to import CPScrollView.
|
||||
// FIXME: Should CPScrollView be finding out about this on its own somehow?
|
||||
scrollViewClass = objj_getClass("CPScrollView");
|
||||
|
||||
if([superview isKindOfClass:scrollViewClass])
|
||||
[superview reflectScrolledClipView:self];
|
||||
}
|
||||
|
||||
@@ -173,9 +177,13 @@
|
||||
return;
|
||||
|
||||
// ... and we're in a scroll view of course.
|
||||
var superview = [self superview];
|
||||
|
||||
if ([superview isKindOfClass:[CPScrollView class]])
|
||||
var superview = [self superview],
|
||||
|
||||
// This is hack to avoid having to import CPScrollView.
|
||||
// FIXME: Should CPScrollView be finding out about this on its own somehow?
|
||||
scrollViewClass = objj_getClass("CPScrollView");
|
||||
|
||||
if ([superview isKindOfClass:scrollViewClass])
|
||||
[superview reflectScrolledClipView:self];
|
||||
}
|
||||
|
||||
|
||||
+55
-30
@@ -597,6 +597,10 @@
|
||||
if (![_selectionIndexes count])
|
||||
return;
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(collectionView:canDragItemsAtIndexes:withEvent:)] &&
|
||||
![_delegate collectionView:self canDragItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent])
|
||||
return;
|
||||
|
||||
// Set up the pasteboard
|
||||
var dragTypes = [_delegate collectionView:self dragTypesForItemsAtIndexes:_selectionIndexes];
|
||||
|
||||
@@ -676,41 +680,42 @@
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (CPCollectionViewItem)itemAtIndex:(unsigned)anIndex
|
||||
{
|
||||
return [_items objectAtIndex:anIndex];
|
||||
}
|
||||
|
||||
- (CGRect)frameForItemAtIndex:(unsigned)anIndex
|
||||
{
|
||||
return [[[self itemAtIndex:anIndex] view] frame];
|
||||
}
|
||||
|
||||
- (CGRect)frameForItemsAtIndexes:(CPIndexSet)anIndexSet
|
||||
{
|
||||
var indexArray = [],
|
||||
frame = CGRectNull;
|
||||
|
||||
[anIndexSet getIndexes:indexArray maxCount:-1 inIndexRange:nil];
|
||||
|
||||
var index = 0,
|
||||
count = [indexArray count];
|
||||
|
||||
for (; index < count; ++index)
|
||||
frame = CGRectUnion(frame, [self rectForItemAtIndex:indexArray[index]]);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation CPCollectionView (KeyboardInteraction)
|
||||
|
||||
- (CGRect)rectForItemAtIndex:(int)index
|
||||
{
|
||||
// Don't re-compute anything just grab the current frame
|
||||
// This allows subclasses to override tile without messing this up.
|
||||
return [[_items[index] view] frame];
|
||||
}
|
||||
|
||||
- (CGRect)rectForItemsAtIndexes:(CPIndexSet)indexSet
|
||||
{
|
||||
var indexArray = [],
|
||||
rect = nil;
|
||||
|
||||
[indexSet getIndexes:indexArray maxCount:-1 inIndexRange:nil];
|
||||
|
||||
for (var i = 0, count = indexArray.length; i < count; ++i)
|
||||
{
|
||||
var index = indexArray[i];
|
||||
if (rect == nil)
|
||||
rect = [self rectForItemAtIndex:index];
|
||||
else
|
||||
rect = CGRectUnion(rect, [self rectForItemAtIndex:index]);
|
||||
}
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
- (void)_scrollToSelection
|
||||
{
|
||||
var rect = [self rectForItemsAtIndexes:[self selectionIndexes]];
|
||||
if (rect)
|
||||
[self scrollRectToVisible:rect];
|
||||
var frame = [self frameForItemsAtIndexes:[self selectionIndexes]];
|
||||
|
||||
if (!CGRectIsNull(frame))
|
||||
[self scrollRectToVisible:frame];
|
||||
}
|
||||
|
||||
- (void)moveLeft:(id)sender
|
||||
@@ -753,7 +758,7 @@
|
||||
[self _scrollToSelection];
|
||||
}
|
||||
|
||||
- (void)deleteBackwards:(id)sender
|
||||
- (void)deleteBackward:(id)sender
|
||||
{
|
||||
if ([[self delegate] respondsToSelector:@selector(collectionView:shouldDeleteItemsAtIndexes:)])
|
||||
{
|
||||
@@ -775,6 +780,26 @@
|
||||
|
||||
@end
|
||||
|
||||
@implementation CPCollectionView (Deprecated)
|
||||
|
||||
- (CGRect)rectForItemAtIndex:(int)anIndex
|
||||
{
|
||||
_CPReportLenientDeprecation([self class], _cmd, @selector(frameForItemAtIndex:));
|
||||
|
||||
// Don't re-compute anything just grab the current frame
|
||||
// This allows subclasses to override tile without messing this up.
|
||||
return [self frameForItemAtIndex:anIndex];
|
||||
}
|
||||
|
||||
- (CGRect)rectForItemsAtIndexes:(CPIndexSet)anIndexSet
|
||||
{
|
||||
_CPReportLenientDeprecation([self class], _cmd, @selector(frameForItemsAtIndexes:));
|
||||
|
||||
return [self frameForItemsAtIndexes:anIndexSet];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeKey",
|
||||
CPCollectionViewMaxItemSizeKey = @"CPCollectionViewMaxItemSizeKey",
|
||||
CPCollectionViewVerticalMarginKey = @"CPCollectionViewVerticalMarginKey",
|
||||
|
||||
@@ -51,7 +51,7 @@ var CPSharedFontManager = nil,
|
||||
|
||||
// Changing the Default Font Conversion Classes
|
||||
/*!
|
||||
Sets the class that will be used to create the applcation's
|
||||
Sets the class that will be used to create the application's
|
||||
font manager.
|
||||
*/
|
||||
+ (void)setFontManagerFactory:(Class)aClass
|
||||
|
||||
+2
-3
@@ -235,7 +235,7 @@ NAMES_FOR_PARTS[CPScrollerKnob] = @"knob";
|
||||
*/
|
||||
- (void)checkSpaceForParts
|
||||
{
|
||||
var bounds = [self bounds];
|
||||
var bounds = [self bounds];
|
||||
|
||||
// Assume we won't be needing the arrows.
|
||||
if (_knobProportion === 1.0)
|
||||
@@ -290,8 +290,7 @@ NAMES_FOR_PARTS[CPScrollerKnob] = @"knob";
|
||||
_partRects[CPScrollerDecrementLine] = _CGRectMakeZero();
|
||||
_partRects[CPScrollerKnobSlot] = _CGRectMake(trackInset.left, 0, width - trackInset.left - trackInset.right, height);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
var decrementLineSize = [self currentValueForThemeAttribute:"decrement-line-size"],
|
||||
|
||||
+15
-17
@@ -158,21 +158,24 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
|
||||
CPTableView _tableView @accessors(property=tableView);
|
||||
}
|
||||
|
||||
- (void)initWithFrame:(CGRect)aFrame
|
||||
- (void)_init
|
||||
{
|
||||
_resizedColumn = -1;
|
||||
_draggedColumn = -1;
|
||||
_pressedColumn = -1;
|
||||
_draggedDistance = 0.0;
|
||||
_lastLocation = nil;
|
||||
_columnOldWidth = nil;
|
||||
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)aFrame
|
||||
{
|
||||
self = [super initWithFrame:aFrame];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_resizedColumn = -1;
|
||||
_draggedColumn = -1;
|
||||
_pressedColumn = -1;
|
||||
_draggedDistance = 0.0;
|
||||
_lastLocation = nil;
|
||||
_columnOldWidth = nil;
|
||||
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
|
||||
}
|
||||
[self _init];
|
||||
|
||||
return self;
|
||||
}
|
||||
@@ -479,12 +482,7 @@ var CPTableHeaderViewTableViewKey = @"CPTableHeaderViewTableViewKey";
|
||||
{
|
||||
if (self = [super initWithCoder:aCoder])
|
||||
{
|
||||
_resizedColumn = -1;
|
||||
_draggedColumn = -1;
|
||||
_pressedColumn = -1;
|
||||
_draggedDistance = 0.0;
|
||||
_lastLocation = nil;
|
||||
_columnOldWidth = nil;
|
||||
[self _init];
|
||||
_tableView = [aCoder decodeObjectForKey:CPTableHeaderViewTableViewKey];
|
||||
}
|
||||
|
||||
|
||||
+18
-21
@@ -1762,25 +1762,18 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (CPImage)dragImageForRowsWithIndexes:(CPIndexSet)dragRows
|
||||
tableColumns:(CPArray)theTableColumns
|
||||
event:(CPEvent)dragEvent
|
||||
offset:(CPPointPointer)dragImageOffset
|
||||
- (CPImage)dragImageForRowsWithIndexes:(CPIndexSet)dragRows tableColumns:(CPArray)theTableColumns event:(CPEvent)dragEvent offset:(CPPointPointer)dragImageOffset
|
||||
{
|
||||
return [[CPImage alloc] initWithContentsOfFile:@"Frameworks/AppKit/Resources/GenericFile.png" size:CGSizeMake(32,32)];
|
||||
}
|
||||
|
||||
- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)theDraggedRows
|
||||
tableColumns:(CPArray)theTableColumns
|
||||
event:(CPEvent)theDragEvent
|
||||
offset:(CPPoint)dragViewOffset
|
||||
- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)theDraggedRows tableColumns:(CPArray)theTableColumns event:(CPEvent)theDragEvent offset:(CPPoint)dragViewOffset
|
||||
{
|
||||
var bounds = [self bounds],
|
||||
view = [[CPView alloc] initWithFrame:bounds];
|
||||
|
||||
[view setBackgroundColor:[CPColor clearColor]];
|
||||
|
||||
[view setAlphaValue:0.7];
|
||||
|
||||
|
||||
// We have to fetch all the data views for the selected rows and columns
|
||||
// After that we can copy these add them to a transparent drag view and use that drag view
|
||||
// to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
|
||||
@@ -1790,35 +1783,34 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
exposedRowsLength = [_exposedRows lastIndex] - firstExposedRow + 1,
|
||||
columns = [],
|
||||
rows = [];
|
||||
|
||||
|
||||
[_exposedColumns getIndexes:columns maxCount:-1 inIndexRange:CPMakeRange(firstExposedColumn, exposedColumnsLength)];
|
||||
[theDraggedRows getIndexes:rows maxCount:-1 inIndexRange:CPMakeRange(firstExposedRow, exposedRowsLength)];
|
||||
|
||||
var columnIndex = [columns count];
|
||||
|
||||
|
||||
while (columnIndex--)
|
||||
{
|
||||
var column = columns[columnIndex],
|
||||
tableColumn = [_tableColumns objectAtIndex:column],
|
||||
rowIndex = [rows count];
|
||||
|
||||
|
||||
while (rowIndex--)
|
||||
{
|
||||
var row = rows[rowIndex];
|
||||
var dataView = [self _newDataViewForRow:row tableColumn:tableColumn];
|
||||
|
||||
[dataView setBackgroundColor:[CPColor clearColor]];
|
||||
|
||||
[dataView setFrame:[self frameOfDataViewAtColumn:column row:row]];
|
||||
[dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
|
||||
|
||||
|
||||
[view addSubview:dataView];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var dragPoint = [self convertPoint:[theDragEvent locationInWindow] fromView:nil];
|
||||
dragViewOffset.x = CGRectGetWidth(bounds)/2 - dragPoint.x;
|
||||
dragViewOffset.y = CGRectGetHeight(bounds)/2 - dragPoint.y;
|
||||
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@@ -1840,7 +1832,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
var numberOfRows = [self numberOfRows] + 1;
|
||||
var reason = @"Attempt to set dropRow=" + row +
|
||||
" dropOperation=CPTableViewDropOn when [0 - " + numberOfRows + "] is valid range of rows."
|
||||
|
||||
|
||||
[[CPException exceptionWithName:@"Error" reason:reason userInfo:nil] raise];
|
||||
}
|
||||
|
||||
@@ -1896,7 +1888,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
return;
|
||||
|
||||
_sortDescriptors = newSortDescriptors;
|
||||
|
||||
|
||||
[self _sendDataSourceSortDescriptorsDidChange:oldSortDescriptors];
|
||||
}
|
||||
|
||||
@@ -3190,6 +3182,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
|
||||
CPTableViewGridColorKey = @"CPTableViewGridColorKey",
|
||||
CPTableViewGridStyleMaskKey = @"CPTableViewGridStyleMaskKey",
|
||||
CPTableViewUsesAlternatingBackgroundKey = @"CPTableViewUsesAlternatingBackgroundKey",
|
||||
CPTableViewAlternatingRowColorsKey = @"CPTableViewAlternatingRowColorsKey",
|
||||
CPTableViewHeaderViewKey = @"CPTableViewHeaderViewKey",
|
||||
CPTableViewCornerViewKey = @"CPTableViewCornerViewKey";
|
||||
|
||||
@@ -3239,6 +3232,9 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
|
||||
|
||||
_gridColor = [aCoder decodeObjectForKey:CPTableViewGridColorKey] || [CPColor grayColor];
|
||||
_gridStyleMask = [aCoder decodeIntForKey:CPTableViewGridStyleMaskKey] || CPTableViewGridNone;
|
||||
|
||||
_alternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewAlternatingRowColorsKey];
|
||||
_usesAlternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewUsesAlternatingBackgroundKey]
|
||||
|
||||
_headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey];
|
||||
_cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey];
|
||||
@@ -3282,6 +3278,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
|
||||
[aCoder encodeInt:_gridStyleMask forKey:CPTableViewGridStyleMaskKey];
|
||||
|
||||
[aCoder encodeBool:_usesAlternatingRowBackgroundColors forKey:CPTableViewUsesAlternatingBackgroundKey];
|
||||
[aCoder encodeObject:_alternatingRowBackgroundColors forKey:CPTableViewAlternatingRowColorsKey]
|
||||
|
||||
[aCoder encodeObject:_cornerView forKey:CPTableViewCornerViewKey];
|
||||
[aCoder encodeObject:_headerView forKey:CPTableViewHeaderViewKey];
|
||||
|
||||
@@ -813,7 +813,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
if (![CPPlatform isBrowser])
|
||||
{
|
||||
[self copy:sender];
|
||||
[self deleteBackwards:sender];
|
||||
[self deleteBackward:sender];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -826,7 +826,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
if (![[pasteboard types] containsObject:CPStringPboardType])
|
||||
return;
|
||||
|
||||
[self deleteBackwards:sender];
|
||||
[self deleteBackward:sender];
|
||||
|
||||
var selectedRange = [self selectedRange],
|
||||
stringValue = [self stringValue],
|
||||
@@ -912,7 +912,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
||||
[self selectText:sender];
|
||||
}
|
||||
|
||||
- (void)deleteBackwards:(id)sender
|
||||
- (void)deleteBackward:(id)sender
|
||||
{
|
||||
var selectedRange = [self selectedRange],
|
||||
stringValue = [self stringValue],
|
||||
|
||||
+1
-1
@@ -668,7 +668,7 @@ var CPViewFlags = { },
|
||||
return _tag;
|
||||
}
|
||||
|
||||
- (void)viewWithTag:(CPInteger)aTag
|
||||
- (CPView)viewWithTag:(CPInteger)aTag
|
||||
{
|
||||
if ([self tag] == aTag)
|
||||
return self;
|
||||
|
||||
@@ -1497,7 +1497,8 @@ CPTexturedBackgroundWindowMask
|
||||
if (_firstResponder != self && [_firstResponder respondsToSelector:@selector(resignKeyWindow)])
|
||||
[_firstResponder resignKeyWindow];
|
||||
|
||||
CPApp._keyWindow = nil;
|
||||
if (CPApp._keyWindow === self)
|
||||
CPApp._keyWindow = nil;
|
||||
|
||||
[[CPNotificationCenter defaultCenter]
|
||||
postNotificationName:CPWindowDidResignKeyNotification
|
||||
@@ -1858,7 +1859,8 @@ CPTexturedBackgroundWindowMask
|
||||
postNotificationName:CPWindowDidResignMainNotification
|
||||
object:self];
|
||||
|
||||
CPApp._mainWindow = nil;
|
||||
if (CPApp._mainWindow === self)
|
||||
CPApp._mainWindow = nil;
|
||||
}
|
||||
|
||||
- (void)_updateMainAndKeyWindows
|
||||
@@ -1866,9 +1868,6 @@ CPTexturedBackgroundWindowMask
|
||||
var allWindows = [CPApp orderedWindows],
|
||||
windowCount = [allWindows count];
|
||||
|
||||
if (!windowCount)
|
||||
return;
|
||||
|
||||
if ([self isKeyWindow])
|
||||
{
|
||||
var keyWindow = [CPApp keyWindow];
|
||||
@@ -1893,11 +1892,10 @@ CPTexturedBackgroundWindowMask
|
||||
}
|
||||
|
||||
if (![CPApp keyWindow])
|
||||
[keyWindow makeKeyWindow];
|
||||
[menuWindow makeKeyWindow];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ([self isMainWindow])
|
||||
{
|
||||
var mainWindow = [CPApp mainWindow];
|
||||
|
||||
@@ -322,25 +322,6 @@
|
||||
return _documents;
|
||||
}
|
||||
|
||||
- (void)setViewController:(CPViewController)aViewController
|
||||
{
|
||||
var containerView = [self viewControllerContainerView] || [[self window] contentView],
|
||||
view = [_viewController view],
|
||||
frame = view ? [view frame] : [containerView bounds];
|
||||
|
||||
[view removeFromSuperview];
|
||||
|
||||
_viewController = aViewController;
|
||||
|
||||
view = [_viewController view];
|
||||
|
||||
if (view)
|
||||
{
|
||||
[view setFrame:frame];
|
||||
[containerView addSubview:view];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setViewControllerContainerView:(CPView)aView
|
||||
{
|
||||
_viewControllerContainerView = aView;
|
||||
|
||||
@@ -777,8 +777,7 @@ if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex)
|
||||
@ignore
|
||||
*/
|
||||
+ (void)runLoopUpdateLayers
|
||||
{if (window.oops) {alert(window.latest); objj_debug_print_backtrace();}
|
||||
window.loop = true;
|
||||
{
|
||||
for (UID in CALayerRegisteredRunLoopUpdates)
|
||||
{
|
||||
var layer = CALayerRegisteredRunLoopUpdates[UID],
|
||||
|
||||
@@ -210,7 +210,7 @@ function CGPathAddQuadCurveToPoint(aPath, aTransform, cpx, cpy, x, y)
|
||||
|
||||
if (aTransform)
|
||||
{
|
||||
cp = _CGPointApplyAffineTransform(control, aTransform);
|
||||
cp = _CGPointApplyAffineTransform(cp, aTransform);
|
||||
end = _CGPointApplyAffineTransform(end, aTransform);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,9 +22,10 @@
|
||||
|
||||
#include "../CoreGraphics/CGGeometry.h"
|
||||
|
||||
var DOMSpanElement = nil,
|
||||
DOMIFrameElement = nil,
|
||||
DefaultFont = nil;
|
||||
var DOMFixedWidthSpanElement = nil,
|
||||
DOMFlexibleWidthSpanElement = nil,
|
||||
DOMIFrameElement = nil,
|
||||
DefaultFont = nil;
|
||||
|
||||
@implementation CPPlatformString : CPBasePlatformString
|
||||
{
|
||||
@@ -37,25 +38,30 @@ var DOMSpanElement = nil,
|
||||
|
||||
+ (void)createDOMElements
|
||||
{
|
||||
var style;
|
||||
|
||||
DOMIFrameElement = document.createElement("iframe");
|
||||
// necessary for Safari caching bug:
|
||||
DOMIFrameElement.name = "iframe_" + FLOOR(RAND() * 10000);
|
||||
DOMIFrameElement.style.position = "absolute";
|
||||
DOMIFrameElement.style.left = "-100px";
|
||||
DOMIFrameElement.style.top = "-100px";
|
||||
DOMIFrameElement.style.width = "1px";
|
||||
DOMIFrameElement.style.height = "1px";
|
||||
DOMIFrameElement.style.borderWidth = "0px";
|
||||
DOMIFrameElement.style.overflow = "hidden";
|
||||
DOMIFrameElement.style.zIndex = 100000000000;
|
||||
DOMIFrameElement.className = "cpdontremove";
|
||||
|
||||
style = DOMIFrameElement.style;
|
||||
style.position = "absolute";
|
||||
style.left = "-100px";
|
||||
style.top = "-100px";
|
||||
style.width = "1px";
|
||||
style.height = "1px";
|
||||
style.borderWidth = "0px";
|
||||
style.overflow = "hidden";
|
||||
style.zIndex = 100000000000;
|
||||
|
||||
var bodyElement = [CPPlatform mainBodyElement];
|
||||
|
||||
bodyElement.appendChild(DOMIFrameElement);
|
||||
|
||||
var DOMIFrameDocument = (DOMIFrameElement.contentDocument || DOMIFrameElement.contentWindow.document);
|
||||
DOMIFrameDocument.write("<html><head></head><body></body></html>");
|
||||
DOMIFrameDocument.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+
|
||||
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head></head><body></body></html>');
|
||||
DOMIFrameDocument.close();
|
||||
|
||||
// IE needs this wide <div> to prevent unwanted text wrapping:
|
||||
@@ -65,18 +71,39 @@ var DOMSpanElement = nil,
|
||||
|
||||
DOMIFrameDocument.body.appendChild(DOMDivElement);
|
||||
|
||||
DOMSpanElement = DOMIFrameDocument.createElement("span");
|
||||
DOMSpanElement.style.position = "absolute";
|
||||
DOMSpanElement.style.visibility = "visible";
|
||||
DOMSpanElement.style.padding = "0px";
|
||||
DOMSpanElement.style.margin = "0px";
|
||||
DOMFlexibleWidthSpanElement = DOMIFrameDocument.createElement("span");
|
||||
style = DOMFlexibleWidthSpanElement.style;
|
||||
style.position = "absolute";
|
||||
style.visibility = "visible";
|
||||
style.padding = "0px";
|
||||
style.margin = "0px";
|
||||
style.whiteSpace = "pre";
|
||||
|
||||
try {
|
||||
DOMSpanElement.style.whiteSpace = "pre";
|
||||
DOMFixedWidthSpanElement = DOMIFrameDocument.createElement("span");
|
||||
style = DOMFixedWidthSpanElement.style;
|
||||
style.display = "block";
|
||||
style.position = "absolute";
|
||||
style.visibility = "visible";
|
||||
style.padding = "0px";
|
||||
style.margin = "0px";
|
||||
style.width = "1px";
|
||||
style.wordWrap = "break-word";
|
||||
try
|
||||
{
|
||||
style.whiteSpace = "pre";
|
||||
style.whiteSpace = "-o-pre-wrap";
|
||||
style.whiteSpace = "-pre-wrap";
|
||||
style.whiteSpace = "-moz-pre-wrap";
|
||||
style.whiteSpace = "pre-wrap";
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
//some versions of IE throw exceptions for unsupported properties.
|
||||
style.whiteSpace = "pre";
|
||||
}
|
||||
catch (e) {}
|
||||
|
||||
DOMDivElement.appendChild(DOMSpanElement);
|
||||
DOMDivElement.appendChild(DOMFlexibleWidthSpanElement);
|
||||
DOMDivElement.appendChild(DOMFixedWidthSpanElement);
|
||||
}
|
||||
|
||||
+ (CGSize)sizeOfString:(CPString)aString withFont:(CPFont)aFont forWidth:(float)aWidth
|
||||
@@ -92,44 +119,23 @@ var DOMSpanElement = nil,
|
||||
if (!DOMIFrameElement)
|
||||
[self createDOMElements];
|
||||
|
||||
var style = DOMSpanElement.style;
|
||||
|
||||
var span;
|
||||
if (!aWidth)
|
||||
{
|
||||
style.width = "";
|
||||
|
||||
try {
|
||||
style.whiteSpace = "pre";
|
||||
}
|
||||
catch (e) {}
|
||||
|
||||
style.wordWrap = "normal";
|
||||
}
|
||||
span = DOMFlexibleWidthSpanElement;
|
||||
else
|
||||
{
|
||||
style.width = ROUND(aWidth) + "px";
|
||||
try
|
||||
{
|
||||
style.whiteSpace = "-o-pre-wrap";
|
||||
style.whiteSpace = "-pre-wrap";
|
||||
style.whiteSpace = "-moz-pre-wrap";
|
||||
style.whiteSpace = "pre-wrap";
|
||||
} catch(e)
|
||||
{
|
||||
//some versions of IE throw exceptions for unsupported properties.
|
||||
}
|
||||
|
||||
style.wordWrap = "break-word";
|
||||
span = DOMFixedWidthSpanElement;
|
||||
span.style.width = ROUND(aWidth) + "px";
|
||||
}
|
||||
|
||||
style.font = [aFont cssString];
|
||||
span.style.font = [aFont cssString];
|
||||
|
||||
if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature))
|
||||
DOMSpanElement.innerText = aString;
|
||||
span.innerText = aString;
|
||||
else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature))
|
||||
DOMSpanElement.textContent = aString;
|
||||
span.textContent = aString;
|
||||
|
||||
return _CGSizeMake(DOMSpanElement.clientWidth, DOMSpanElement.clientHeight);
|
||||
return _CGSizeMake(span.clientWidth, span.clientHeight);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -804,7 +804,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)_checkPasteboardElement
|
||||
{
|
||||
var value = _DOMPasteboardElement.value;
|
||||
@@ -1123,7 +1122,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
|
||||
}
|
||||
|
||||
(CPArray)orderedWindowsAtLevel:(int)aLevel
|
||||
- (CPArray)orderedWindowsAtLevel:(int)aLevel
|
||||
{
|
||||
var layer = [self layerAtLevel:aLevel create:NO];
|
||||
|
||||
|
||||
@@ -332,7 +332,8 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
hasDOMTextElement = !!_DOMTextElement;
|
||||
|
||||
// Create or destroy the DOM Text Element as necessary
|
||||
if (needsDOMTextElement !== hasDOMTextElement)
|
||||
if (needsDOMTextElement !== hasDOMTextElement)
|
||||
{
|
||||
if (hasDOMTextElement)
|
||||
{
|
||||
_DOMElement.removeChild(_DOMTextElement);
|
||||
@@ -361,6 +362,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
// We have to set all these values now.
|
||||
_flags |= _CPImageAndTextViewTextChangedFlag | _CPImageAndTextViewFontChangedFlag | _CPImageAndTextViewLineBreakModeChangedFlag;
|
||||
}
|
||||
}
|
||||
|
||||
var textStyle = hasDOMTextElement ? _DOMTextElement.style : nil;
|
||||
|
||||
@@ -369,6 +371,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
hasDOMTextShadowElement = !!_DOMTextShadowElement;
|
||||
|
||||
if (needsDOMTextShadowElement !== hasDOMTextShadowElement)
|
||||
{
|
||||
if (hasDOMTextShadowElement)
|
||||
{
|
||||
_DOMElement.removeChild(_DOMTextShadowElement);
|
||||
@@ -386,6 +389,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
shadowStyle.font = [_font ? _font : [CPFont systemFontOfSize:12.0] cssString];
|
||||
shadowStyle.position = "absolute";
|
||||
shadowStyle.whiteSpace = textStyle.whiteSpace;
|
||||
shadowStyle.wordWrap = textStyle.wordWrap;
|
||||
shadowStyle.color = [_textShadowColor cssString];
|
||||
|
||||
shadowStyle.zIndex = 150;
|
||||
@@ -394,7 +398,6 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
if (document.attachEvent)
|
||||
{
|
||||
shadowStyle.overflow = textStyle.overflow;
|
||||
shadowStyle.wordWrap = textStyle.wordWrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -408,6 +411,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
|
||||
_flags |= _CPImageAndTextViewTextChangedFlag; //sigh...
|
||||
}
|
||||
}
|
||||
|
||||
var shadowStyle = hasDOMTextShadowElement ? _DOMTextShadowElement.style : nil;
|
||||
|
||||
@@ -447,9 +451,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
case CPLineBreakByClipping: textStyle.overflow = "hidden";
|
||||
textStyle.textOverflow = "clip";
|
||||
textStyle.whiteSpace = "pre";
|
||||
|
||||
if (document.attachEvent)
|
||||
textStyle.wordWrap = "normal";
|
||||
textStyle.wordWrap = "normal";
|
||||
|
||||
break;
|
||||
|
||||
@@ -459,26 +461,23 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
case CPLineBreakByTruncatingTail: textStyle.textOverflow = "ellipsis";
|
||||
textStyle.whiteSpace = "nowrap";
|
||||
textStyle.overflow = "hidden";
|
||||
|
||||
if (document.attachEvent)
|
||||
textStyle.wordWrap = "normal";
|
||||
textStyle.wordWrap = "normal";
|
||||
|
||||
break;
|
||||
|
||||
case CPLineBreakByCharWrapping:
|
||||
case CPLineBreakByWordWrapping: if (document.attachEvent)
|
||||
{
|
||||
case CPLineBreakByWordWrapping: textStyle.wordWrap = "break-word";
|
||||
try {
|
||||
textStyle.whiteSpace = "pre";
|
||||
textStyle.wordWrap = "break-word";
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
textStyle.whiteSpace = "-o-pre-wrap";
|
||||
textStyle.whiteSpace = "-pre-wrap";
|
||||
textStyle.whiteSpace = "-moz-pre-wrap";
|
||||
textStyle.whiteSpace = "pre-wrap";
|
||||
}
|
||||
catch (e) {
|
||||
//internet explorer doesn't like these properties
|
||||
textStyle.whiteSpace = "pre";
|
||||
}
|
||||
|
||||
textStyle.overflow = "hidden";
|
||||
textStyle.textOverflow = "clip";
|
||||
@@ -490,7 +489,6 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
{
|
||||
if (document.attachEvent)
|
||||
{
|
||||
shadowStyle.wordWrap = textStyle.wordWrap;
|
||||
shadowStyle.overflow = textStyle.overflow;
|
||||
}
|
||||
else
|
||||
@@ -499,6 +497,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
shadowStyle.overflowY = textStyle.overflowY;
|
||||
}
|
||||
|
||||
shadowStyle.wordWrap = textStyle.wordWrap;
|
||||
shadowStyle.whiteSpace = textStyle.whiteSpace;
|
||||
shadowStyle.textOverflow = textStyle.textOverflow;
|
||||
}
|
||||
@@ -510,6 +509,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
|
||||
// Create or destroy DOM Image element
|
||||
if (needsDOMImageElement !== hasDOMImageElement)
|
||||
{
|
||||
if (hasDOMImageElement)
|
||||
{
|
||||
_DOMElement.removeChild(_DOMImageElement);
|
||||
@@ -539,8 +539,8 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
_DOMElement.appendChild(_DOMImageElement);
|
||||
|
||||
hasDOMImageElement = YES;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
var size = [self bounds].size,
|
||||
textRect = _CGRectMake(0.0, 0.0, size.width, size.height);
|
||||
@@ -572,60 +572,47 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
imageHeight *= scale;
|
||||
}
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
_DOMImageElement.width = imageWidth;
|
||||
_DOMImageElement.height = imageHeight;
|
||||
imageStyle.width = imageWidth + "px";
|
||||
imageStyle.height = imageHeight + "px";
|
||||
#endif
|
||||
|
||||
if (_imagePosition === CPImageBelow)
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px";
|
||||
imageStyle.top = FLOOR(size.height - imageHeight) + "px";
|
||||
#endif
|
||||
|
||||
textRect.size.height = size.height - imageHeight - VERTICAL_MARGIN;
|
||||
}
|
||||
else if (_imagePosition === CPImageAbove)
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, FLOOR(centerX - imageWidth / 2.0), 0);
|
||||
#endif
|
||||
|
||||
textRect.origin.y += imageHeight + VERTICAL_MARGIN;
|
||||
textRect.size.height = size.height - imageHeight - VERTICAL_MARGIN;
|
||||
}
|
||||
else if (_imagePosition === CPImageLeft)
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px";
|
||||
imageStyle.left = "0px";
|
||||
#endif
|
||||
|
||||
textRect.origin.x = imageWidth + HORIZONTAL_MARGIN;
|
||||
textRect.size.width -= imageWidth + HORIZONTAL_MARGIN;
|
||||
}
|
||||
else if (_imagePosition === CPImageRight)
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px";
|
||||
imageStyle.left = FLOOR(size.width - imageWidth) + "px";
|
||||
#endif
|
||||
|
||||
textRect.size.width -= imageWidth + HORIZONTAL_MARGIN;
|
||||
}
|
||||
else if (_imagePosition === CPImageOnly)
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px";
|
||||
imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
if (hasDOMTextElement)
|
||||
{
|
||||
var textRectX = _CGRectGetMinX(textRect),
|
||||
|
||||
+175
-96
@@ -8,6 +8,7 @@ require("narwhal").ensureEngine("rhino");
|
||||
|
||||
var FILE = require("file");
|
||||
var OS = require("os");
|
||||
var UTIL = require("util");
|
||||
|
||||
var stream = require("term").stream;
|
||||
var parser = new (require("args").Parser)();
|
||||
@@ -24,6 +25,10 @@ parser.option("-F", "--framework", "frameworks")
|
||||
.push()
|
||||
.help("Add a frameworks directory, relative to INPUT_PROJECT (default: ['Frameworks'])");
|
||||
|
||||
parser.option("-P", "--path", "paths")
|
||||
.push()
|
||||
.help("Add a path (relative to the application root) to inline.");
|
||||
|
||||
parser.option("-f", "--force", "force")
|
||||
.def(false)
|
||||
.set(true)
|
||||
@@ -34,6 +39,11 @@ parser.option("--index", "index")
|
||||
.set()
|
||||
.help("The root HTML file to modify (default: index.html)");
|
||||
|
||||
parser.option("-s", "--split", "number", "split")
|
||||
.natural()
|
||||
.def(0)
|
||||
.help("Split into multiple files");
|
||||
|
||||
parser.option("-v", "--verbose", "verbose")
|
||||
.def(false)
|
||||
.set(true)
|
||||
@@ -81,20 +91,27 @@ function main(args)
|
||||
|
||||
var flattener = new ObjectiveJFlattener(rootPath);
|
||||
|
||||
flattener.options = options;
|
||||
|
||||
flattener.setIncludePaths(frameworks);
|
||||
flattener.setEnvironments([environment, "ObjJ"]);
|
||||
|
||||
print("Loading application.");
|
||||
flattener.load(mainPath);
|
||||
flattener.finishLoading();
|
||||
|
||||
var applicationRoot = flattener.require("objective-j").StaticResource.resourceAtURL(rootPath)
|
||||
print(applicationRoot.toString());
|
||||
print("Loading default theme.");
|
||||
flattener.require("objective-j").objj_eval("("+(function() {
|
||||
var blend = [[CPThemeBlend alloc] initWithContentsOfURL:[[CPBundle bundleForClass:[CPApplication class]] pathForResource:[CPApplication defaultThemeName] + ".blend"]];
|
||||
[blend loadWithDelegate:nil];
|
||||
})+")")();
|
||||
|
||||
var applicationJS = flattener.buildApplicationJS(applicationRoot);
|
||||
var applicationJSs = flattener.buildApplicationJS();
|
||||
|
||||
FILE.copyTree(rootPath, outputPath);
|
||||
|
||||
outputPath.join("Application.js").write(applicationJS);
|
||||
applicationJSs.forEach(function(applicationJS, n) {
|
||||
outputPath.join("Application"+(n||"")+".js").write(applicationJS);
|
||||
});
|
||||
|
||||
rewriteMainHTML(outputPath.join(options.index));
|
||||
}
|
||||
@@ -103,123 +120,185 @@ function main(args)
|
||||
function ObjectiveJFlattener(rootPath) {
|
||||
ObjectiveJRuntimeAnalyzer.apply(this, arguments);
|
||||
|
||||
this.resourceBuffer = [];
|
||||
this.bundleBuffer = [];
|
||||
this.filesToCache = {};
|
||||
this.fileCacheBuffer = [];
|
||||
this.functionsBuffer = [];
|
||||
|
||||
this._outputBundles = {};
|
||||
}
|
||||
|
||||
ObjectiveJFlattener.prototype = Object.create(ObjectiveJRuntimeAnalyzer.prototype);
|
||||
|
||||
ObjectiveJFlattener.prototype.buildApplicationJS = function(applicationRoot) {
|
||||
this.serializeStaticResources(applicationRoot);
|
||||
this.serializeStaticFileExecutables();
|
||||
ObjectiveJFlattener.prototype.buildApplicationJS = function() {
|
||||
|
||||
var buffer = []
|
||||
this.setupFileCache();
|
||||
this.serializeFunctions();
|
||||
this.serializeFileCache();
|
||||
|
||||
buffer.push("(function(){");
|
||||
var applicationJSs = [];
|
||||
|
||||
buffer.push("var appURL = new CFURL('.', ObjectiveJ.pageURL);")
|
||||
|
||||
buffer.push(this.bundleBuffer.join("\n"));
|
||||
|
||||
buffer.push("var nodeStack = [];");
|
||||
buffer.push("var applicationRoot = ObjectiveJ.StaticResource.resourceAtURL(appURL, true);");
|
||||
buffer.push("var currentNode = null;");
|
||||
buffer.push("var newNode;");
|
||||
|
||||
buffer.push(this.resourceBuffer.join("\n"));
|
||||
|
||||
buffer.push("})();");
|
||||
|
||||
buffer.push(this.functionsBuffer.join("\n"));
|
||||
|
||||
buffer.push("ObjectiveJ.bootstrap();");
|
||||
|
||||
return buffer.join("\n");
|
||||
}
|
||||
|
||||
ObjectiveJFlattener.prototype.serializeStaticFileExecutables = function() {
|
||||
this.require("objective-j").FileExecutable.allFileExecutables().forEach(function(aFileExecutable) {
|
||||
var deps = aFileExecutable.fileDependencies().map(function(dependency) {
|
||||
return "new ObjectiveJ.FileDependency(new CFURL("+JSON.stringify(dependency.path())+"),"+JSON.stringify(dependency.isLocal())+")"
|
||||
}).join(",");
|
||||
|
||||
var func = aFileExecutable._function.toString();
|
||||
// HACK
|
||||
func = func.replace(", require, exports, module, system, print, window", "");
|
||||
|
||||
this.functionsBuffer.push("var path = "+JSON.stringify(this.rootPath.relative(aFileExecutable.path()).toString())+";");
|
||||
this.functionsBuffer.push("new ObjectiveJ.FileExecutable(path,"+
|
||||
"new ObjectiveJ.Executable(null, ["+deps+"], path, "+func+"));");
|
||||
}, this);
|
||||
}
|
||||
|
||||
ObjectiveJFlattener.prototype.serializeStaticResources = function(node, depth) {
|
||||
depth = depth || 0;
|
||||
|
||||
var bundle = this.context.global.CFBundle.bundleContainingURL(node.URL());
|
||||
var bundlePath;
|
||||
if (!bundle) {
|
||||
stream.print("\0yellow(Warning:\0) No bundle for path: \0cyan("+node.URL()+"\0)");
|
||||
}
|
||||
else if ((bundlePath = bundle.bundlePath()) && !this._outputBundles[bundlePath]) {
|
||||
this._outputBundles[bundlePath] = bundle;
|
||||
stream.print("Writing bundle: \0cyan("+bundlePath+"\0)");
|
||||
print(bundle.infoDictionary())
|
||||
|
||||
var relative = this.rootPath.relative(bundlePath).toString();
|
||||
this.bundleBuffer.push("var bundle = new CFBundle("+
|
||||
"new CFURL("+(relative ? JSON.stringify(relative) : "appURL")+", ObjectiveJ.pageURL)"+
|
||||
");");
|
||||
this.bundleBuffer.push("bundle._loadStatus = " + (1<<4) + ";");
|
||||
this.bundleBuffer.push("bundle._isValid = true;");
|
||||
if (bundle.infoDictionary()) {
|
||||
this.bundleBuffer.push("bundle._infoDictionary = CFPropertyList.propertyListFromString(" +
|
||||
JSON.stringify(CPPropertyListCreateData(bundle.infoDictionary()).rawString()) + ");");
|
||||
}
|
||||
}
|
||||
|
||||
// not the root node:
|
||||
if (depth > 0) {
|
||||
this.resourceBuffer.push("newNode = new ObjectiveJ.StaticResource(new CFURL(" +
|
||||
JSON.stringify(node.name()) + "," +
|
||||
"currentNode.URL().asDirectoryPathURL()" +
|
||||
"), currentNode, " +
|
||||
JSON.stringify(node.isDirectory()) + ", " +
|
||||
JSON.stringify(node.isResolved()) + ");");
|
||||
if (this.options.split === 0) {
|
||||
var buffer = [];
|
||||
buffer.push("var baseURL = new CFURL(\".\", ObjectiveJ.pageURL);");
|
||||
buffer.push(this.fileCacheBuffer.join("\n"));
|
||||
buffer.push(this.functionsBuffer.join("\n"));
|
||||
buffer.push("ObjectiveJ.bootstrap();");
|
||||
applicationJSs.push(buffer.join("\n"));
|
||||
} else {
|
||||
this.resourceBuffer.push("newNode = applicationRoot;");
|
||||
var appFilesCount = this.options.split;
|
||||
|
||||
var buffers = [];
|
||||
for (var i = 0; i <= appFilesCount; i++)
|
||||
buffers.push([]);
|
||||
|
||||
var chunks = this.fileCacheBuffer.concat(this.functionsBuffer).sort(function(chunkA, chunkB) {
|
||||
return chunkA.length - chunkB.length;
|
||||
});
|
||||
|
||||
// try to equally distribute the chunks. could be better but good enough for now.
|
||||
var n = 0;
|
||||
while (chunks.length) {
|
||||
buffers[(n++ % appFilesCount) + 1].push(chunks.pop());
|
||||
}
|
||||
|
||||
buffers[0].push("var baseURL = new CFURL(\".\", ObjectiveJ.pageURL);");
|
||||
|
||||
buffers[0].push("var appFilesCount = " + appFilesCount +";");
|
||||
buffers[0].push("for (var i = 1; i <= appFilesCount; i++) {");
|
||||
buffers[0].push(" var script = document.createElement(\"script\");");
|
||||
buffers[0].push(" script.src = \"Application\"+i+\".js\";");
|
||||
buffers[0].push(" script.onload = function() { if (--appFilesCount === 0) ObjectiveJ.bootstrap(); };");
|
||||
buffers[0].push(" document.getElementsByTagName(\"head\")[0].appendChild(script);");
|
||||
buffers[0].push("}");
|
||||
|
||||
buffers.forEach(function(buffer) {
|
||||
applicationJSs.push(buffer.join("\n"));
|
||||
});
|
||||
}
|
||||
|
||||
// var contents = node.contents();
|
||||
// if (contents) {
|
||||
// this.resourceBuffer.push("newNode._contents = " + JSON.stringify(contents) + ";");
|
||||
// }
|
||||
return applicationJSs;
|
||||
}
|
||||
|
||||
if (!node.children())
|
||||
return;
|
||||
ObjectiveJFlattener.prototype.serializeFunctions = function() {
|
||||
var inlineFunctions = true;//this.options.inlineFunctions;
|
||||
|
||||
this.resourceBuffer.push("nodeStack.push(currentNode);");
|
||||
this.resourceBuffer.push("currentNode = newNode;");
|
||||
var outputFiles = {};
|
||||
|
||||
var children = node.children();
|
||||
for (var name in children) {
|
||||
this.serializeStaticResources(children[name], depth+1);
|
||||
var _cachedExecutableFunctions = {};
|
||||
|
||||
this.require("objective-j").FileExecutable.allFileExecutables().forEach(function(executable) {
|
||||
var path = executable.path();
|
||||
|
||||
if (inlineFunctions)
|
||||
{
|
||||
// stringify the function, replacing arguments
|
||||
var functionString = executable._function.toString().replace(", require, exports, module, system, print, window", ""); // HACK
|
||||
|
||||
var relative = this.rootPath.relative(path).toString();
|
||||
this.functionsBuffer.push("ObjectiveJ.FileExecutable._cacheFunction(new CFURL("+JSON.stringify(relative)+", baseURL),\n"+functionString+");");
|
||||
}
|
||||
|
||||
var bundle = this.context.global.CFBundle.bundleContainingURL(path);
|
||||
if (bundle && bundle.infoDictionary())
|
||||
{
|
||||
var executablePath = bundle.executablePath(),
|
||||
relativeToBundle = FILE.relative(FILE.join(bundle.path(), ""), path);
|
||||
|
||||
if (executablePath)
|
||||
{
|
||||
if (inlineFunctions)
|
||||
{
|
||||
// remove the code since we're inlining the functions
|
||||
executable._code = "alert("+JSON.stringify(relativeToBundle)+");";
|
||||
}
|
||||
|
||||
if (!outputFiles[executablePath])
|
||||
{
|
||||
outputFiles[executablePath] = [];
|
||||
outputFiles[executablePath].push("@STATIC;1.0;");
|
||||
}
|
||||
|
||||
var fileContents = executable.toMarkedString();
|
||||
|
||||
outputFiles[executablePath].push("p;" + relativeToBundle.length + ";" + relativeToBundle);
|
||||
outputFiles[executablePath].push("t;" + fileContents.length + ";" + fileContents);
|
||||
|
||||
// stream.print("Adding \0green(" + this.rootPath.relative(path) + "\0) to \0cyan(" + this.rootPath.relative(executablePath) + "\0)");
|
||||
}
|
||||
}
|
||||
else
|
||||
CPLog.warn("No bundle (or info dictionary for) " + rootPath.relative(path));
|
||||
}, this);
|
||||
|
||||
for (var executablePath in outputFiles)
|
||||
{
|
||||
var relative = this.rootPath.relative(executablePath).toString();
|
||||
var contents = outputFiles[executablePath].join("");
|
||||
this.filesToCache[relative] = contents;
|
||||
}
|
||||
}
|
||||
|
||||
this.resourceBuffer.push("currentNode = nodeStack.pop();");
|
||||
ObjectiveJFlattener.prototype.serializeFileCache = function() {
|
||||
this.fileCacheBuffer.push(FILE.read(FILE.join(FILE.dirname(module.path), "..", "..", "cappuccino", "lib", "cappuccino", "objj-flatten-additions.js"), { charset:"UTF-8" }));
|
||||
for (var relative in this.filesToCache) {
|
||||
var contents = this.filesToCache[relative];
|
||||
print("caching: " + relative + " => " + (contents == null ? 404 : 200));
|
||||
if (contents == null)
|
||||
this.fileCacheBuffer.push("CFHTTPRequest._cacheRequest(new CFURL("+JSON.stringify(relative)+", baseURL), 404);");
|
||||
else
|
||||
this.fileCacheBuffer.push("CFHTTPRequest._cacheRequest(new CFURL("+JSON.stringify(relative)+", baseURL), 200, {}, "+JSON.stringify(contents)+");");
|
||||
}
|
||||
}
|
||||
|
||||
ObjectiveJFlattener.prototype.setupFileCache = function() {
|
||||
var paths = {};
|
||||
|
||||
UTIL.update(paths, this.requestedURLs);
|
||||
|
||||
this.options.paths.forEach(function(relativePath) {
|
||||
paths[this.rootPath.join(relativePath)] = true;
|
||||
}, this);
|
||||
|
||||
Object.keys(paths).forEach(function(absolute) {
|
||||
var relative = this.rootPath.relative(absolute).toString();
|
||||
if (relative.indexOf("..") === 0)
|
||||
{
|
||||
print("skipping (parent of app root): " + absolute);
|
||||
return;
|
||||
}
|
||||
|
||||
if (FILE.isFile(absolute))
|
||||
{
|
||||
// if (this.options.maxCachedSize && FILE.size(absolute) > this.options.maxCachedSize)
|
||||
// {
|
||||
// print("skipping (larger than "+this.options.maxCachedSize+" bytes): " + absolute);
|
||||
// return;
|
||||
// }
|
||||
|
||||
var contents = FILE.read(absolute, { charset : "UTF-8" });
|
||||
this.filesToCache[relative] = contents;
|
||||
} else {
|
||||
this.filesToCache[relative] = null;
|
||||
}
|
||||
}, this);
|
||||
}
|
||||
|
||||
// "$1" is the matching indentation
|
||||
var scriptTagsBefore = '$1<script type = "text/javascript">\n$1 OBJJ_AUTO_BOOTSTRAP = false;\n$1</script>';
|
||||
var scriptTagsAfter = '$1<script type = "text/javascript" src = "Application.js"></script>';
|
||||
|
||||
// enable CPLog:
|
||||
// scriptTagsAfter = '$1<script type = "text/javascript">\n$1 CPLogRegister(CPLogConsole);\n$1</script>\n' + scriptTagsAfter;
|
||||
|
||||
function rewriteMainHTML(indexHTMLPath) {
|
||||
if (indexHTMLPath.isFile()) {
|
||||
var indexHTML = indexHTMLPath.read();
|
||||
|
||||
// inline the Application.js if it's smallish
|
||||
var applicationJSPath = indexHTMLPath.dirname().join("Application.js");
|
||||
if (applicationJSPath.size() < 10*1024) {
|
||||
var applicationJS = applicationJSPath.read().split("\n").join("\n$1 ");
|
||||
scriptTagsAfter = '$1<script type = "text/javascript">\n$1 '+applicationJS+'\n$1</script>'
|
||||
}
|
||||
|
||||
// attempt to find Objective-J script tag and add ours
|
||||
var newIndexHTML = indexHTML.replace(/([ \t]+)<script[^>]+Objective-J\.js[^>]+>(?:\s*<\/script>)?/,
|
||||
scriptTagsBefore+'\n$&\n'+scriptTagsAfter);
|
||||
|
||||
@@ -5,6 +5,8 @@ var Context = require("interpreter").Context;
|
||||
ObjectiveJRuntimeAnalyzer = function(rootPath)
|
||||
{
|
||||
this.rootPath = rootPath;
|
||||
this.rootURL = new CFURL(String(rootPath));
|
||||
|
||||
this.context = new Context();
|
||||
|
||||
this.scope = setupObjectiveJ(this.context);
|
||||
@@ -28,6 +30,14 @@ ObjectiveJRuntimeAnalyzer = function(rootPath)
|
||||
var url = this.executableURL();
|
||||
return url ? url.absoluteURL().path() : null;
|
||||
}
|
||||
|
||||
var requestedURLs = this.requestedURLs = {};
|
||||
var _lookupCachedRequest = this.context.global.CFHTTPRequest._lookupCachedRequest;
|
||||
this.context.global.CFHTTPRequest._lookupCachedRequest = function(aURL) {
|
||||
var path = new CFURL(aURL, this.rootURL).absoluteURL().path();
|
||||
requestedURLs[path] = true;
|
||||
return _lookupCachedRequest.apply(null, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
ObjectiveJRuntimeAnalyzer.prototype.setIncludePaths = function(includePaths) {
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
|
||||
var URLCache = { };
|
||||
|
||||
CFHTTPRequest.prototype.open = function(/*String*/ method, /*String*/ url, /*Boolean*/ async, /*String*/ user, /*String*/ password)
|
||||
{
|
||||
var cachedRequest = CFHTTPRequest._lookupCachedRequest(url);
|
||||
if (cachedRequest)
|
||||
{
|
||||
var self = this;
|
||||
this._nativeRequest = cachedRequest;
|
||||
this._nativeRequest.onreadystatechange = function()
|
||||
{
|
||||
ObjectiveJ.determineAndDispatchHTTPRequestEvents(self);
|
||||
};
|
||||
}
|
||||
return this._nativeRequest.open(method, url, async, user, password);
|
||||
}
|
||||
|
||||
CFHTTPRequest._cacheRequest = function(/*CFURL|String*/ aURL, /*Number*/ status, /*Object*/ headers, /*String*/ body)
|
||||
{
|
||||
URLCache[aURL] = new MockXMLHttpRequest(status, headers, body);
|
||||
}
|
||||
|
||||
CFHTTPRequest._lookupCachedRequest = function(/*CFURL|String*/ aURL)
|
||||
{
|
||||
return URLCache[aURL];
|
||||
}
|
||||
|
||||
function MockXMLHttpRequest(status, headers, body)
|
||||
{
|
||||
this.readyState = CFHTTPRequest.UninitializedState;
|
||||
this.status = status || 200;
|
||||
this.statusText = "";
|
||||
this.responseText = body || "";
|
||||
this._responseHeaders = headers || {};
|
||||
};
|
||||
MockXMLHttpRequest.prototype.open = function(method, url, async, user, password)
|
||||
{
|
||||
this.readyState = CFHTTPRequest.LoadingState;
|
||||
this.async = async;
|
||||
};
|
||||
MockXMLHttpRequest.prototype.send = function(body)
|
||||
{
|
||||
var self = this;
|
||||
self.responseText = self.responseText.toString();
|
||||
function complete() {
|
||||
for (self.readyState = CFHTTPRequest.LoadedState; self.readyState <= CFHTTPRequest.CompleteState; self.readyState++)
|
||||
self.onreadystatechange();
|
||||
}
|
||||
(self.async ? ObjectiveJ.Asynchronous(complete) : complete)();
|
||||
};
|
||||
MockXMLHttpRequest.prototype.onreadystatechange = function() {};
|
||||
MockXMLHttpRequest.prototype.abort = function() {};
|
||||
MockXMLHttpRequest.prototype.setRequestHeader = function(header, value) {};
|
||||
MockXMLHttpRequest.prototype.getAllResponseHeaders = function() { return this._responseHeaders; };
|
||||
MockXMLHttpRequest.prototype.getResponseHeader = function(header) { return this._responseHeaders[header]; };
|
||||
MockXMLHttpRequest.prototype.overrideMimeType = function(mimetype) {};
|
||||
@@ -153,6 +153,12 @@
|
||||
continue;
|
||||
|
||||
var value = object[key];
|
||||
|
||||
if (value === null)
|
||||
{
|
||||
[dictionary setObject:[CPNull null] forKey:key];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (recursively)
|
||||
{
|
||||
@@ -521,6 +527,11 @@
|
||||
return self.toString();
|
||||
}
|
||||
|
||||
- (BOOL)containsKey:(id)aKey
|
||||
{
|
||||
var value = [self objectForKey:aKey];
|
||||
return ((value !== nil) && (value !== undefined));
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation CPDictionary (CPCoding)
|
||||
|
||||
@@ -200,7 +200,7 @@ var CPArrayClass = Ni
|
||||
- (CPDictionary)_decodeDictionaryOfObjectsForKey:(CPString)aKey
|
||||
{
|
||||
var object = _plistObject.valueForKey(aKey),
|
||||
objectClass = object && object.isa;
|
||||
objectClass = (object != nil) && object.isa;
|
||||
|
||||
if (objectClass === CPDictionaryClass || objectClass === CPMutableDictionaryClass)
|
||||
{
|
||||
@@ -315,7 +315,7 @@ var CPArrayClass = Ni
|
||||
- (id)decodeObjectForKey:(CPString)aKey
|
||||
{
|
||||
var object = _plistObject.valueForKey(aKey),
|
||||
objectClass = object && object.isa;
|
||||
objectClass = (object != nil) && object.isa;
|
||||
|
||||
if (objectClass === CPDictionaryClass || objectClass === CPMutableDictionaryClass)
|
||||
return _CPKeyedUnarchiverDecodeObjectAtIndex(self, object.valueForKey(_CPKeyedArchiverUIDKey));
|
||||
@@ -519,7 +519,7 @@ var _CPKeyedUnarchiverDecodeObjectAtIndex = function(self, anIndex)
|
||||
|
||||
// If this object is a member of _CPKeyedArchiverValue, then we know
|
||||
// that it is a wrapper for a primitive JavaScript object.
|
||||
if (object && (object.isa === _CPKeyedArchiverValueClass))
|
||||
if ((object != nil) && (object.isa === _CPKeyedArchiverValueClass))
|
||||
object = [object JSObject];
|
||||
|
||||
return object;
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
- (void)forwardInvocation:(CPInvocation)anInvocation
|
||||
{
|
||||
[CPException raise:CPInvalidArgumentException
|
||||
reason:@"-methodSignatureForSelector: called on abstract CPProxy class."];
|
||||
reason:@"-forwardInvocation: called on abstract CPProxy class."];
|
||||
}
|
||||
|
||||
// FIXME: This should be moved to the runtime?
|
||||
|
||||
+2
-2
@@ -196,8 +196,8 @@ var CPURLURLStringKey = @"CPURLURLStringKey",
|
||||
|
||||
- (id)initWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
return [self initWithURLString:[aCoder decodeObjectForKey:CPURLURLStringKey]
|
||||
baseURL:[aCoder decodeObjectForKey:CPURLBaseURLKey]];
|
||||
return [self initWithString:[aCoder decodeObjectForKey:CPURLURLStringKey]
|
||||
relativeToURL:[aCoder decodeObjectForKey:CPURLBaseURLKey]];
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(CPCoder)aCoder
|
||||
|
||||
@@ -281,7 +281,7 @@ function pushPackage(path, remote, branch)
|
||||
{
|
||||
branch = branch || "master";
|
||||
|
||||
var pushPackagesPath = FILE.path(".push-package")
|
||||
var pushPackagesPath = FILE.path(".push-package");
|
||||
|
||||
pushPackagesPath.mkdirs();
|
||||
|
||||
|
||||
@@ -437,12 +437,13 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure)
|
||||
CFTotalBytesLoaded += anEvent.request.responseText().length;
|
||||
decompileStaticFile(aBundle, anEvent.request.responseText(), spritedImagesURL);
|
||||
aBundle._loadStatus &= ~CFBundleLoadingSpritedImages;
|
||||
success();
|
||||
}
|
||||
catch(anException)
|
||||
{
|
||||
failure(anException);
|
||||
}
|
||||
|
||||
success();
|
||||
}, failure);
|
||||
}
|
||||
|
||||
|
||||
@@ -196,9 +196,9 @@ CFHTTPRequest.prototype.overrideMimeType = function(/*String*/ aMimeType)
|
||||
return this._nativeRequest.overrideMimeType(aMimeType);
|
||||
}
|
||||
|
||||
CFHTTPRequest.prototype.open = function(/*...*/)
|
||||
CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*Boolean*/ isAsynchronous, /*String*/ aUser, /*String*/ aPassword)
|
||||
{
|
||||
return this._nativeRequest.open(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
|
||||
return this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword);
|
||||
}
|
||||
|
||||
CFHTTPRequest.prototype.send = function(/*Object*/ aBody)
|
||||
@@ -259,7 +259,7 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure)
|
||||
if (aURL.pathExtension() === "plist")
|
||||
request.overrideMimeType("text/xml");
|
||||
|
||||
if (FileRequest.async)
|
||||
if (exports.asyncLoader)
|
||||
{
|
||||
request.onsuccess = Asynchronous(onsuccess);
|
||||
request.onfailure = Asynchronous(onfailure);
|
||||
@@ -270,12 +270,16 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure)
|
||||
request.onfailure = onfailure;
|
||||
}
|
||||
|
||||
request.open("GET", aURL.absoluteString(), FileRequest.async);
|
||||
request.open("GET", aURL.absoluteString(), exports.asyncLoader);
|
||||
request.send("");
|
||||
}
|
||||
|
||||
#ifdef BROWSER
|
||||
FileRequest.async = YES;
|
||||
exports.asyncLoader = YES;
|
||||
#else
|
||||
FileRequest.async = NO;
|
||||
exports.asyncLoader = NO;
|
||||
#endif
|
||||
|
||||
// FIXME: Get rid of these when we no longer need Mock requests in flatten.
|
||||
exports.Asynchronous = Asynchronous;
|
||||
exports.determineAndDispatchHTTPRequestEvents = determineAndDispatchHTTPRequestEvents;
|
||||
|
||||
@@ -148,37 +148,12 @@ exports.repl = function()
|
||||
}
|
||||
}
|
||||
|
||||
exports.objj_eval = function(/*String*/ aString)
|
||||
{
|
||||
// We need this while code still refers to window.
|
||||
Executable.setCommonJSArguments(require, exports, module, system, print, window);
|
||||
|
||||
var executable = exports.preprocess(aString, "", 0);
|
||||
|
||||
if (!executable.hasLoadedFileDependencies())
|
||||
executable.loadFileDependencies();
|
||||
|
||||
// A bit of a hack. Executable compiles the code itself into a function, but we want
|
||||
// the raw code to eval here.
|
||||
var code = executable._code;
|
||||
|
||||
// Not clear why these should be global, varing them doesn't seem to take effect with evaluateString.
|
||||
global.objj_executeFile = Executable.fileExecuterForURL(FILE.cwd());
|
||||
global.objj_importFile = Executable.fileImporterForURL(FILE.cwd());
|
||||
|
||||
if (typeof system !== "undefined" && system.engine === "rhino")
|
||||
return Packages.org.mozilla.javascript.Context.getCurrentContext().evaluateString(global, code, "objj_eval", 0, NULL);
|
||||
|
||||
return eval(code);
|
||||
}
|
||||
|
||||
Executable.setCommonJSParameters("require", "exports", "module", "system", "print", "window");
|
||||
|
||||
// creates a narwhal factory function in the objj module scope
|
||||
exports.make_narwhal_factory = function(path)
|
||||
{
|
||||
return function(require, exports, module, system, print)
|
||||
{
|
||||
Executable.setCommonJSParameters("require", "exports", "module", "system", "print", "window");
|
||||
Executable.setCommonJSArguments(require, exports, module, system, print, window);
|
||||
Executable.fileImporterForURL(FILE.dirname(path))(path, YES);
|
||||
}
|
||||
|
||||
@@ -350,6 +350,11 @@ BundleTask.prototype.packageType = function()
|
||||
return 1;
|
||||
}
|
||||
|
||||
function isDataResource(aFilename)
|
||||
{
|
||||
return FILE.isFile(aFilename) && isImage(aFilename);
|
||||
}
|
||||
|
||||
BundleTask.prototype.infoPlist = function()
|
||||
{
|
||||
var infoPlistPath = this.infoPlistPath();
|
||||
@@ -370,14 +375,17 @@ BundleTask.prototype.infoPlist = function()
|
||||
return anEnvironment.name();
|
||||
}));
|
||||
infoPlist.setValueForKey("CPBundleExecutable", this.productName() + ".sj");
|
||||
infoPlist.setValueForKey("CPBundleEnvironmentsWithImageSprites", this.environments().filter(
|
||||
|
||||
var environmentsWithImageSprites = this.environments().filter(
|
||||
function(anEnvironment)
|
||||
{
|
||||
return anEnvironment.spritesImages();
|
||||
}).map(function(anEnvironment)
|
||||
return anEnvironment.spritesImages() && task(this.buildProductDataURLPathForEnvironment(anEnvironment)).prerequisites().filter(isDataResource).length > 0;
|
||||
}, this).map(function(anEnvironment)
|
||||
{
|
||||
return anEnvironment.name();
|
||||
}));
|
||||
});
|
||||
|
||||
infoPlist.setValueForKey("CPBundleEnvironmentsWithImageSprites", environmentsWithImageSprites);
|
||||
|
||||
var principalClass = this.principalClass();
|
||||
|
||||
@@ -581,7 +589,6 @@ BundleTask.prototype.defineResourceTasks = function()
|
||||
}, this);
|
||||
}
|
||||
|
||||
|
||||
var RESOURCES_PATH = FILE.join(FILE.absolute(FILE.dirname(module.path)), "RESOURCES"),
|
||||
MHTMLTestPath = FILE.join(RESOURCES_PATH, "MHTMLTest.txt");
|
||||
|
||||
@@ -595,27 +602,29 @@ BundleTask.prototype.defineSpritedImagesTask = function()
|
||||
var folder = anEnvironment.name() + ".environment",
|
||||
resourcesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Resources", "");
|
||||
|
||||
function isDataResource(/*String*/ aFilename)
|
||||
{
|
||||
return FILE.isFile(aFilename) && aFilename.indexOf(resourcesPath) === 0 && isImage(aFilename);
|
||||
}
|
||||
|
||||
var productName = this.productName(),
|
||||
dataURLPath = this.buildProductDataURLPathForEnvironment(anEnvironment);
|
||||
|
||||
filedir (dataURLPath, function(aTask)
|
||||
{
|
||||
var prerequisites = aTask.prerequisites().filter(isDataResource);
|
||||
|
||||
if (!prerequisites.length)
|
||||
{
|
||||
if (FILE.exists(dataURLPath))
|
||||
FILE.remove(dataURLPath);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
TERM.stream.print("Creating data URLs file... \0green(" + dataURLPath +"\0)");
|
||||
|
||||
var dataURLStream = FILE.open(dataURLPath, "w+", { charset:"UTF-8" });
|
||||
|
||||
dataURLStream.write("@STATIC;1.0;");
|
||||
|
||||
aTask.prerequisites().forEach(function(aFilename)
|
||||
prerequisites.forEach(function(aFilename)
|
||||
{
|
||||
if (!isDataResource(aFilename))
|
||||
return;
|
||||
|
||||
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
|
||||
|
||||
dataURLStream.write("u;" + resourcePath.length + ";" + resourcePath);
|
||||
@@ -636,17 +645,24 @@ BundleTask.prototype.defineSpritedImagesTask = function()
|
||||
|
||||
filedir (MHTMLPath, function(aTask)
|
||||
{
|
||||
var prerequisites = aTask.prerequisites().filter(isDataResource);
|
||||
|
||||
if (!prerequisites.length)
|
||||
{
|
||||
if (FILE.exists(MHTMLPath))
|
||||
FILE.remove(MHTMLPath);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
TERM.stream.print("Creating MHTML paths file... \0green(" + MHTMLPath +"\0)");
|
||||
|
||||
var MHTMLStream = FILE.open(MHTMLPath, "w+", { charset:"UTF-8" });
|
||||
|
||||
MHTMLStream.write("@STATIC;1.0;");
|
||||
|
||||
aTask.prerequisites().forEach(function(aFilename)
|
||||
prerequisites.forEach(function(aFilename)
|
||||
{
|
||||
if (!isDataResource(aFilename))
|
||||
return;
|
||||
|
||||
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename),
|
||||
MHTMLResourcePath = "mhtml:" + FILE.join(folder, "MHTMLData.txt!") + resourcePath;
|
||||
|
||||
@@ -663,17 +679,24 @@ BundleTask.prototype.defineSpritedImagesTask = function()
|
||||
|
||||
filedir (MHTMLDataPath, function(aTask)
|
||||
{
|
||||
var prerequisites = aTask.prerequisites().filter(isDataResource);
|
||||
|
||||
if (!prerequisites.length)
|
||||
{
|
||||
if (FILE.exists(MHTMLDataPath))
|
||||
FILE.remove(MHTMLDataPath);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
TERM.stream.print("Creating MHTML images file... \0green(" + MHTMLDataPath +"\0)");
|
||||
|
||||
var MHTMLDataStream = FILE.open(MHTMLDataPath, "w+", { charset:"UTF-8" });
|
||||
|
||||
MHTMLDataStream.write("/*\r\nContent-Type: multipart/related; boundary=\"_ANY_STRING_WILL_DO_AS_A_SEPARATOR\"\r\n\r\n");
|
||||
|
||||
aTask.prerequisites().forEach(function(aFilename)
|
||||
prerequisites.forEach(function(aFilename)
|
||||
{
|
||||
if (!isDataResource(aFilename))
|
||||
return;
|
||||
|
||||
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
|
||||
|
||||
MHTMLDataStream.write("--_ANY_STRING_WILL_DO_AS_A_SEPARATOR\r\n");
|
||||
|
||||
@@ -27,7 +27,7 @@ if (typeof window !== "undefined")
|
||||
window.setNativeTimeout = window.setTimeout;
|
||||
window.clearNativeTimeout = window.clearTimeout;
|
||||
window.setNativeInterval = window.setInterval;
|
||||
window.clearNativeInterval = window.clearNativeInterval;
|
||||
window.clearNativeInterval = window.clearInterval;
|
||||
}
|
||||
|
||||
// Objective-J Constants
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
GLOBAL(objj_eval) = function(/*String*/ aString)
|
||||
{
|
||||
#if COMMONJS
|
||||
var url = FILE.join(FILE.cwd(), "/");
|
||||
Executable.setCommonJSParameters("require", "exports", "module", "system", "print", "window");
|
||||
Executable.setCommonJSArguments(require, exports, module, system, print, window);
|
||||
#else
|
||||
var url = exports.pageURL;
|
||||
#endif
|
||||
|
||||
// Temporarily switch the loader to sychronous mode since objj_eval must be synchronous
|
||||
// therefore you shouldn't use @imports in objj_eval the browser
|
||||
var asyncLoaderSaved = exports.asyncLoader;
|
||||
exports.asyncLoader = NO;
|
||||
|
||||
var executable = exports.preprocess(aString, url, 0);
|
||||
|
||||
if (!executable.hasLoadedFileDependencies())
|
||||
executable.loadFileDependencies();
|
||||
|
||||
// here we setup a scope object containing the free variables that would normally be arguments to the module function
|
||||
global._objj_eval_scope = {};
|
||||
|
||||
global._objj_eval_scope.objj_executeFile = Executable.fileExecuterForURL(url);
|
||||
global._objj_eval_scope.objj_importFile = Executable.fileImporterForURL(url);
|
||||
#if COMMONJS
|
||||
global._objj_eval_scope.require = require;
|
||||
global._objj_eval_scope.exports = exports;
|
||||
global._objj_eval_scope.module = module;
|
||||
global._objj_eval_scope.system = system;
|
||||
global._objj_eval_scope.print = print;
|
||||
global._objj_eval_scope.window = window;
|
||||
#endif
|
||||
|
||||
// A bit of a hack. Executable compiles the code itself into a function, but we want
|
||||
// the raw code to eval here so we can get the result.
|
||||
// No known way to get the result of a statement except via eval.
|
||||
var code = "with(_objj_eval_scope){" + executable._code + "\n//*/\n}";
|
||||
|
||||
var result;
|
||||
#if COMMONJS
|
||||
if (typeof system !== "undefined" && system.engine === "rhino")
|
||||
result = Packages.org.mozilla.javascript.Context.getCurrentContext().evaluateString(global, code, "objj_eval", 0, NULL);
|
||||
else
|
||||
#endif
|
||||
result = eval(code);
|
||||
|
||||
// restore async loader setting
|
||||
exports.asyncLoader = asyncLoaderSaved;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// deprecated, use global
|
||||
exports.objj_eval = objj_eval;
|
||||
@@ -218,10 +218,13 @@ Executable.prototype.loadFileDependencies = function(aCallback)
|
||||
{
|
||||
var status = this._fileDependencyStatus;
|
||||
|
||||
if (status === ExecutableLoadedFileDependencies)
|
||||
return aCallback();
|
||||
if (aCallback)
|
||||
{
|
||||
if (status === ExecutableLoadedFileDependencies)
|
||||
return aCallback();
|
||||
|
||||
this._fileDependencyCallbacks.push(aCallback)
|
||||
this._fileDependencyCallbacks.push(aCallback);
|
||||
}
|
||||
|
||||
if (status === ExecutableUnloadedFileDependencies)
|
||||
{
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
var FileExecutablesForURLStrings = { };
|
||||
|
||||
function FileExecutable(/*CFURL|String*/ aURL, /*Executable*/ anExecutable)
|
||||
function FileExecutable(/*CFURL|String*/ aURL)
|
||||
{
|
||||
aURL = makeAbsoluteURL(aURL);
|
||||
|
||||
@@ -38,10 +38,7 @@ function FileExecutable(/*CFURL|String*/ aURL, /*Executable*/ anExecutable)
|
||||
executable = NULL,
|
||||
extension = aURL.pathExtension();
|
||||
|
||||
if (anExecutable)
|
||||
executable = anExecutable;
|
||||
|
||||
else if (fileContents.match(/^@STATIC;/))
|
||||
if (fileContents.match(/^@STATIC;/))
|
||||
executable = decompile(fileContents, aURL);
|
||||
|
||||
else if (extension === "j" || !extension)
|
||||
@@ -117,5 +114,23 @@ function decompile(/*String*/ aString, /*CFURL*/ aURL)
|
||||
dependencies.push(new FileDependency(new CFURL(text), YES));
|
||||
}
|
||||
|
||||
var fn = FileExecutable._lookupCachedFunction(aURL)
|
||||
if (fn)
|
||||
return new Executable(code, dependencies, aURL, fn);
|
||||
|
||||
return new Executable(code, dependencies, aURL);
|
||||
}
|
||||
|
||||
var FunctionCache = { };
|
||||
|
||||
FileExecutable._cacheFunction = function(/*CFURL|String*/ aURL, /*Function*/ fn)
|
||||
{
|
||||
aURL = typeof aURL === "string" ? aURL : aURL.absoluteString();
|
||||
FunctionCache[aURL] = fn;
|
||||
}
|
||||
|
||||
FileExecutable._lookupCachedFunction = function(/*CFURL|String*/ aURL)
|
||||
{
|
||||
aURL = typeof aURL === "string" ? aURL : aURL.absoluteString();
|
||||
return FunctionCache[aURL];
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "Executable.js"
|
||||
#include "FileExecutable.js"
|
||||
#include "Runtime.js"
|
||||
#include "Eval.js"
|
||||
#if defined(DEBUG) || defined(COMMONJS)
|
||||
#include "Debug.js"
|
||||
#endif
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
@implementation CPDictionaryTest : OJTestCase
|
||||
{
|
||||
CPDictionary string_dict;
|
||||
CPDictionary json_dict;
|
||||
JSObject json;
|
||||
}
|
||||
|
||||
- (void)setUp
|
||||
@@ -54,14 +57,28 @@
|
||||
- (void)testDictionaryWithJSObjectRecursive
|
||||
{
|
||||
var dict = [CPDictionary dictionaryWithJSObject:json recursively:YES];
|
||||
[self assert:[dict count] equals:3];
|
||||
[self assert:[json_dict count] equals:3];
|
||||
[self assert:[[dict objectForKey:@"key3"] count] equals:1];
|
||||
}
|
||||
|
||||
- (void)testDictionaryWithJSObjectRecursiveWithNull
|
||||
{
|
||||
var json_with_nulls = {
|
||||
"key1": ['1', '2', '3'],
|
||||
"key2": "This is a string",
|
||||
"key3": null
|
||||
}
|
||||
|
||||
var dict = [CPDictionary dictionaryWithJSObject:json_with_nulls recursively:YES];
|
||||
|
||||
[self assert:3 equals:[dict count]];
|
||||
[self assert:[@"key1", @"key2", @"key3"] equals:[dict allKeys]];
|
||||
[self assert:[CPNull null] equals:[dict objectForKey:@"key3"]];
|
||||
}
|
||||
|
||||
- (void)testDictionaryWithJSObjectNonRecursive
|
||||
{
|
||||
var non_recursive_dict = [CPDictionary dictionaryWithJSObject:json recursively:NO];
|
||||
[self assertThrows:[non_recursive_dict objectForKey:@"key3"]];
|
||||
}
|
||||
|
||||
- (void)testCopy
|
||||
@@ -141,8 +158,6 @@
|
||||
[json_dict removeObjectForKey:@"key1"];
|
||||
[self assert:[string_dict count] equals:1];
|
||||
[self assert:[json_dict count] equals:2];
|
||||
[self assertThrows:[string_dict objectForKey:@"key1"]];
|
||||
[self assertThrows:[json_dict objectForKey:@"key1"]];
|
||||
}
|
||||
|
||||
- (void)testRemoveObjectsForKeys
|
||||
@@ -151,9 +166,6 @@
|
||||
[json_dict removeObjectsForKeys:[@"key1", @"key2"]];
|
||||
[self assert:[string_dict count] equals:1];
|
||||
[self assert:[json_dict count] equals:1];
|
||||
[self assertThrows:[string_dict objectForKey:@"key1"]];
|
||||
[self assertThrows:[json_dict objectForKey:@"key1"]];
|
||||
[self assertThrows:[json_dict objectForKey:@"key2"]];
|
||||
}
|
||||
|
||||
- (void)testSetObjectForKey
|
||||
@@ -173,4 +185,21 @@
|
||||
[self assert:[json_dict count] equals:5];
|
||||
}
|
||||
|
||||
@end
|
||||
- (void)testDictionaryWithFalsyValues
|
||||
{
|
||||
var dict = [[CPDictionary alloc] initWithObjects:["", 0, [CPNull null]] forKeys:["1", "2", "3"]];
|
||||
[self assertTrue:[dict containsKey:"1"]];
|
||||
[self assertTrue:[dict containsKey:"2"]];
|
||||
[self assertTrue:[dict containsKey:"3"]];
|
||||
[self assertFalse:[dict containsKey:"4"]];
|
||||
}
|
||||
|
||||
- (void)testThrowsOnNilValue
|
||||
{
|
||||
[self assertThrows:function(){
|
||||
var dict = [[CPDictionary alloc] initWithObjects:[1, nil] forKeys:["1", "2"]];
|
||||
[self assertFalse:dict];
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -32,7 +32,7 @@ CPLogRegister(CPLogConsole);
|
||||
|
||||
- (int)numberOfRowsInTableView:(CPTableView)tableView
|
||||
{
|
||||
return 700000;
|
||||
return 100000;
|
||||
}
|
||||
|
||||
- (id)tableView:(CPTableView)tableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(int)row
|
||||
@@ -43,4 +43,4 @@ CPLogRegister(CPLogConsole);
|
||||
return String((row + 1) * [[tableColumn identifier] intValue]);
|
||||
}
|
||||
|
||||
@end
|
||||
@end
|
||||
File diff suppressed because one or more lines are too long
@@ -12,7 +12,7 @@
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<integer value="372"/>
|
||||
<integer value="371"/>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.PluginDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
@@ -84,6 +84,7 @@
|
||||
<object class="NSMutableArray" key="NSTableColumns">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSTableColumn" id="534516850">
|
||||
<string key="NSIdentifier">1</string>
|
||||
<double key="NSWidth">101</double>
|
||||
<double key="NSMinWidth">40</double>
|
||||
<double key="NSMaxWidth">1000</double>
|
||||
@@ -142,6 +143,7 @@
|
||||
<reference key="NSTableView" ref="86489736"/>
|
||||
</object>
|
||||
<object class="NSTableColumn" id="870554271">
|
||||
<string key="NSIdentifier">2</string>
|
||||
<double key="NSWidth">154</double>
|
||||
<double key="NSMinWidth">40</double>
|
||||
<double key="NSMaxWidth">1000</double>
|
||||
@@ -168,6 +170,7 @@
|
||||
<reference key="NSTableView" ref="86489736"/>
|
||||
</object>
|
||||
<object class="NSTableColumn" id="192893327">
|
||||
<string key="NSIdentifier">3</string>
|
||||
<double key="NSWidth">188</double>
|
||||
<double key="NSMinWidth">10</double>
|
||||
<double key="NSMaxWidth">3.4028234663852886e+38</double>
|
||||
@@ -214,8 +217,8 @@
|
||||
<bytes key="NSWhite">MC41AA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<double key="NSRowHeight">17</double>
|
||||
<int key="NSTvFlags">-702545920</int>
|
||||
<double key="NSRowHeight">23</double>
|
||||
<int key="NSTvFlags">-694157312</int>
|
||||
<reference key="NSDelegate"/>
|
||||
<reference key="NSDataSource"/>
|
||||
<int key="NSColumnAutoresizingStyle">4</int>
|
||||
@@ -277,7 +280,7 @@
|
||||
<reference key="NSContentView" ref="331394667"/>
|
||||
<reference key="NSHeaderClipView" ref="471528550"/>
|
||||
<reference key="NSCornerView" ref="167646100"/>
|
||||
<bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
|
||||
<bytes key="NSScrollAmts">QSAAAEEgAABByAAAQcgAAA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<string key="NSFrameSize">{558, 348}</string>
|
||||
@@ -475,9 +478,9 @@
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>{{47, 268}, {558, 348}}</string>
|
||||
<string>{{370, 244}, {558, 348}}</string>
|
||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||
<string>{{47, 268}, {558, 348}}</string>
|
||||
<string>{{370, 244}, {558, 348}}</string>
|
||||
<integer value="1"/>
|
||||
<string>{{33, 99}, {480, 360}}</string>
|
||||
<string>{3.40282e+38, 3.40282e+38}</string>
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
|
||||
@import <Foundation/CPObject.j>
|
||||
|
||||
@import <Foundation/CPIndexSet.j>
|
||||
@import <AppKit/CPTableColumn.j>
|
||||
@import <AppKit/CPTableView.j>
|
||||
|
||||
tableTestDragType = @"CPTableViewTestDragType";
|
||||
CPLogRegister(CPLogConsole);
|
||||
|
||||
@implementation AppController : CPObject
|
||||
{
|
||||
@@ -20,6 +14,7 @@ CPLogRegister(CPLogConsole);
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
{
|
||||
|
||||
dataSet1 = [],
|
||||
dataSet2 = [],
|
||||
dataSet3 = [];
|
||||
@@ -31,40 +26,40 @@ CPLogRegister(CPLogConsole);
|
||||
dataSet3[i - 1] = [CPNumber numberWithInt:i+20];
|
||||
}
|
||||
|
||||
|
||||
var window1 = [[CPWindow alloc] initWithContentRect:CGRectMake(50, 50, 500, 400) styleMask:CPTitledWindowMask | CPResizableWindowMask],
|
||||
view = [window1 contentView];
|
||||
|
||||
[view setBackgroundColor:[CPColor whiteColor]];
|
||||
|
||||
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(50,50,400,400) styleMask:CPClosableWindowMask],
|
||||
contentView = [theWindow contentView];
|
||||
|
||||
tableView = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 500.0, 500.0)];
|
||||
|
||||
[tableView setAllowsMultipleSelection:YES];
|
||||
[tableView setAllowsColumnSelection:YES];
|
||||
[tableView setUsesAlternatingRowBackgroundColors:YES];
|
||||
[tableView setAlternatingRowBackgroundColors:[[CPColor whiteColor], [CPColor colorWithHexString:@"e4e7ff"], [CPColor colorWithHexString:@"f4e7ff"]]];
|
||||
[tableView setGridStyleMask:CPTableViewSolidHorizontalGridLineMask | CPTableViewSolidVerticalGridLineMask];
|
||||
[tableView setGridStyleMask:CPTableViewSolidHorizontalGridLineMask | CPTableViewSolidVerticalGridLineMask];
|
||||
[tableView setVerticalMotionCanBeginDrag:NO];
|
||||
[tableView setDraggingDestinationFeedbackStyle:CPTableViewDropOn];
|
||||
[tableView registerForDraggedTypes:[CPArray arrayWithObject:tableTestDragType]];
|
||||
[tableView setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle];
|
||||
[tableView setDelegate:self];
|
||||
[tableView setDataSource:self];
|
||||
|
||||
|
||||
var iconView = [[CPImageView alloc] initWithFrame:CGRectMake(16,16,0,0)];
|
||||
|
||||
[iconView setImageScaling:CPScaleNone];
|
||||
|
||||
var iconColumn = [[CPTableColumn alloc] initWithIdentifier:"icons"];
|
||||
|
||||
[iconColumn setWidth:32.0];
|
||||
[iconColumn setMinWidth:32.0];
|
||||
[iconColumn setDataView:iconView];
|
||||
|
||||
[tableView addTableColumn:iconColumn];
|
||||
|
||||
iconImage = [[CPImage alloc] initWithContentsOfFile:"http://cappuccino.org/images/favicon.png" size:CGSizeMake(16,16)];
|
||||
|
||||
|
||||
var desc = [CPSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
|
||||
for (var i = 1; i <= 2; i++)
|
||||
{
|
||||
var column = [[CPTableColumn alloc] initWithIdentifier:String(i)];
|
||||
[column setSortDescriptorPrototype:desc];
|
||||
[[column headerView] setStringValue:"Number "+i];
|
||||
[[column headerView] setStringValue:"Number " + i];
|
||||
|
||||
[column setMinWidth:50.0];
|
||||
[column setMaxWidth:500.0];
|
||||
@@ -74,24 +69,14 @@ CPLogRegister(CPLogConsole);
|
||||
[tableView addTableColumn:column];
|
||||
}
|
||||
|
||||
[tableView setColumnAutoresizingStyle:CPTableViewLastColumnOnlyAutoresizingStyle];
|
||||
|
||||
var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth([view bounds]), CGRectGetHeight([view bounds]))];
|
||||
[tableView setRowHeight:22.0];
|
||||
var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth([contentView bounds]), CGRectGetHeight([contentView bounds]))];
|
||||
|
||||
[scrollView setDocumentView:tableView];
|
||||
[scrollView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
||||
|
||||
[view addSubview:scrollView];
|
||||
[contentView addSubview:scrollView];
|
||||
|
||||
[scrollView setAutohidesScrollers:YES];
|
||||
|
||||
[tableView setDelegate:self];
|
||||
[tableView setDataSource:self];
|
||||
[tableView setVerticalMotionCanBeginDrag:NO];
|
||||
[tableView setDraggingDestinationFeedbackStyle:CPTableViewDropOn];
|
||||
[tableView registerForDraggedTypes:[CPArray arrayWithObject:tableTestDragType]];
|
||||
[window1 setAcceptsMouseMovedEvents:YES];
|
||||
[window1 orderFront:self];
|
||||
[theWindow orderFront:self];
|
||||
[self newWindow];
|
||||
[self sourceList];
|
||||
}
|
||||
@@ -106,39 +91,22 @@ CPLogRegister(CPLogConsole);
|
||||
[tableView2 setAllowsMultipleSelection:YES];
|
||||
[tableView2 setUsesAlternatingRowBackgroundColors:YES];
|
||||
[tableView2 setGridStyleMask:CPTableViewSolidHorizontalGridLineMask | CPTableViewSolidVerticalGridLineMask];
|
||||
|
||||
|
||||
var iconView = [[CPImageView alloc] initWithFrame:CGRectMake(16,16,0,0)];
|
||||
|
||||
[iconView setImageScaling:CPScaleNone];
|
||||
|
||||
var iconColumn = [[CPTableColumn alloc] initWithIdentifier:"icons"];
|
||||
|
||||
[iconColumn setWidth:32.0];
|
||||
[iconColumn setMinWidth:32.0];
|
||||
[iconColumn setDataView:iconView];
|
||||
[iconColumn setResizingMask:CPTableColumnNoResizing];
|
||||
|
||||
//[tableView2 addTableColumn:iconColumn];
|
||||
|
||||
iconImage = [[CPImage alloc] initWithContentsOfFile:"http://cappuccino.org/images/favicon.png" size:CGSizeMake(16,16)];
|
||||
|
||||
var textDataView = [CPTextField new];
|
||||
|
||||
[textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected];
|
||||
[textDataView setValue:[CPFont systemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateSelected];
|
||||
[tableView2 setVerticalMotionCanBeginDrag:NO];
|
||||
[tableView2 registerForDraggedTypes:[CPArray arrayWithObject:tableTestDragType]];
|
||||
[tableView2 setDraggingDestinationFeedbackStyle:CPTableViewDropAbove];
|
||||
[tableView2 setDelegate:self];
|
||||
[tableView2 setDataSource:self];
|
||||
|
||||
var desc = [CPSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
|
||||
|
||||
for (var i = 1; i <= 3; i++)
|
||||
{
|
||||
var column = [[CPTableColumn alloc] initWithIdentifier:String(i)];
|
||||
[column setSortDescriptorPrototype:desc];
|
||||
[[column headerView] setStringValue:"Number "+i];
|
||||
|
||||
[column setWidth:i*75];
|
||||
[column setMinWidth:50.0];
|
||||
|
||||
[column setDataView:textDataView];
|
||||
[column setEditable:YES];
|
||||
|
||||
[tableView2 addTableColumn:column];
|
||||
@@ -153,14 +121,8 @@ CPLogRegister(CPLogConsole);
|
||||
|
||||
[[window2 contentView] addSubview:scrollView];
|
||||
|
||||
[scrollView setAutohidesScrollers:YES];
|
||||
//[scrollView setAutohidesScrollers:YES];
|
||||
|
||||
[tableView2 setDelegate:self];
|
||||
[tableView2 setDataSource:self];
|
||||
|
||||
[tableView2 setVerticalMotionCanBeginDrag:NO];
|
||||
[tableView2 registerForDraggedTypes:[CPArray arrayWithObject:tableTestDragType]];
|
||||
[tableView2 setDraggingDestinationFeedbackStyle:CPTableViewDropAbove];
|
||||
|
||||
[window2 orderFront:self];
|
||||
}
|
||||
@@ -176,19 +138,19 @@ CPLogRegister(CPLogConsole);
|
||||
[tableView3 setUsesAlternatingRowBackgroundColors:NO];
|
||||
[tableView3 setGridStyleMask:CPTableViewGridNone];
|
||||
[tableView3 setSelectionHighlightStyle:CPTableViewSelectionHighlightStyleSourceList];
|
||||
[tableView3 setColumnAutoresizingStyle:CPTableViewUniformColumnAutoresizingStyle];
|
||||
[tableView3 setVerticalMotionCanBeginDrag:NO];
|
||||
[tableView3 setDelegate:self];
|
||||
[tableView3 setDataSource:self];
|
||||
|
||||
var column = [[CPTableColumn alloc] initWithIdentifier:"sourcelist"];
|
||||
[[column headerView] setStringValue:"Source List"];
|
||||
|
||||
[column setWidth:200.0];
|
||||
[column setMinWidth:50.0];
|
||||
|
||||
[column setEditable:YES];
|
||||
|
||||
[tableView3 addTableColumn:column];
|
||||
|
||||
[tableView3 setColumnAutoresizingStyle:CPTableViewUniformColumnAutoresizingStyle];
|
||||
|
||||
var scrollView3 = [[CPScrollView alloc] initWithFrame:[[window3 contentView] bounds]];
|
||||
[tableView3 setRowHeight:32.0];
|
||||
[scrollView3 setDocumentView:tableView3];
|
||||
@@ -197,15 +159,8 @@ CPLogRegister(CPLogConsole);
|
||||
[[window3 contentView] addSubview:scrollView3];
|
||||
|
||||
[scrollView3 setAutohidesScrollers:YES];
|
||||
|
||||
[tableView3 setDelegate:self];
|
||||
[tableView3 setDataSource:self];
|
||||
|
||||
[tableView3 setVerticalMotionCanBeginDrag:NO];
|
||||
//[tableView3 registerForDraggedTypes:[CPArray arrayWithObject:tableTestDragType]];
|
||||
//[tableView3 setDraggingDestinationFeedbackStyle:CPTableViewDropAbove];*/
|
||||
|
||||
[window3 orderFront:self];
|
||||
|
||||
[window3 orderFront:self];
|
||||
}
|
||||
|
||||
- (int)numberOfRowsInTableView:(CPTableView)atableView
|
||||
@@ -218,37 +173,30 @@ CPLogRegister(CPLogConsole);
|
||||
return dataSet3.length;
|
||||
}
|
||||
|
||||
- (id)tableView:(CPTableView)atableView objectValueForTableColumn:(CPTableColumn)tableColumn row:(int)row
|
||||
- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aColumn row:(int)aRow
|
||||
{
|
||||
|
||||
if(atableView === tableView)
|
||||
{
|
||||
if ([tableColumn identifier] === "icons")
|
||||
return iconImage;
|
||||
else
|
||||
return String(dataSet1[row]);
|
||||
}
|
||||
else if(atableView === tableView2)
|
||||
{
|
||||
if ([tableColumn identifier] === "icons")
|
||||
return iconImage;
|
||||
else
|
||||
return String(dataSet2[row]);
|
||||
}
|
||||
else if(atableView === tableView3)
|
||||
{
|
||||
if ([tableColumn identifier] === "icons")
|
||||
return iconImage;
|
||||
else
|
||||
return String(dataSet3[row]);
|
||||
}
|
||||
if ([aColumn identifier] === "icons")
|
||||
return iconImage;
|
||||
|
||||
if (aTableView === tableView)
|
||||
return String(dataSet1[aRow]);
|
||||
else if (aTableView === tableView2)
|
||||
return String(dataSet2[aRow]);
|
||||
else if(aTableView === tableView3)
|
||||
return String(dataSet3[row]);
|
||||
}
|
||||
|
||||
- (id)tableView:(CPTableView)tableView heightOfRow:(int)row
|
||||
- (void)tableView:(CPTableView)aTableView sortDescriptorsDidChange:(CPArray)oldDescriptors
|
||||
{
|
||||
return 50;
|
||||
CPLogConsole(_cmd + [oldDescriptors description]);
|
||||
|
||||
var newDescriptors = [aTableView sortDescriptors];
|
||||
|
||||
[(aTableView === tableView) ? dataSet1:dataSet2 sortUsingDescriptors:newDescriptors];
|
||||
[aTableView reloadData];
|
||||
}
|
||||
|
||||
|
||||
- (void)tableViewSelectionIsChanging:(CPNotification)aNotification
|
||||
{
|
||||
CPLog.debug(@"changing! %@", [aNotification description]);
|
||||
@@ -261,13 +209,13 @@ CPLogRegister(CPLogConsole);
|
||||
|
||||
- (BOOL)tableView:(CPTableView)aTableView shouldSelectRow:(int)rowIndex
|
||||
{
|
||||
//CPLog.debug(@"tableView:shouldSelectRow");
|
||||
CPLog.debug(@"tableView:shouldSelectRow");
|
||||
return true;
|
||||
}
|
||||
|
||||
- (BOOL)selectionShouldChangeInTableView:(CPTableView)aTableView
|
||||
{
|
||||
//CPLog.debug(@"selectionShouldChangeInTableView");
|
||||
CPLog.debug(@"selectionShouldChangeInTableView");
|
||||
return YES;
|
||||
}
|
||||
|
||||
@@ -285,14 +233,6 @@ CPLogRegister(CPLogConsole);
|
||||
{
|
||||
CPLogConsole(_cmd + [notification description]);
|
||||
}
|
||||
|
||||
//- (CPIndexSet)tableView:(CPTableView)tableView selectionIndexesForProposedSelection:(CPIndexSet)proposedSelectionIndexes
|
||||
//{
|
||||
// CPLog.debug(@"selectionIndexesForProposedSelection %@", [proposedSelectionIndexes description]);
|
||||
// return proposedSelectionIndexes;
|
||||
//}
|
||||
|
||||
|
||||
- (BOOL)tableView:(CPTableView)aTableView shouldEditTableColumn:(CPTableColumn)tableColumn row:(int)row
|
||||
{
|
||||
if(aTableView === tableView3)
|
||||
@@ -405,7 +345,7 @@ CPLogRegister(CPLogConsole);
|
||||
|
||||
- (void)tableView:(CPTableView)aTableView didClickTableColumn:(CPTableColumn)aColumn
|
||||
{
|
||||
console.log("table: "+aTableView+" clicked column: "+aColumn);
|
||||
CPLog.debug("table: "+aTableView+" clicked column: "+aColumn);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -39,9 +39,9 @@ app ("__project.nameasidentifier__", function(task)
|
||||
|
||||
function printResults(configuration)
|
||||
{
|
||||
print("----------------------------")
|
||||
print("----------------------------");
|
||||
print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
|
||||
print("----------------------------")
|
||||
print("----------------------------");
|
||||
}
|
||||
|
||||
task ("default", ["__project.nameasidentifier__"], function()
|
||||
|
||||
@@ -40,9 +40,9 @@ app ("__project.nameasidentifier__", function(task)
|
||||
|
||||
function printResults(configuration)
|
||||
{
|
||||
print("----------------------------")
|
||||
print("----------------------------");
|
||||
print(configuration+" app built at path: "+FILE.join("Build", configuration, "__project.nameasidentifier__"));
|
||||
print("----------------------------")
|
||||
print("----------------------------");
|
||||
}
|
||||
|
||||
task ("default", ["__project.nameasidentifier__"], function()
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
//var dataViewCell = [aCoder decodeObjectForKey:@"NSDataCell"];
|
||||
|
||||
_dataView = [[CPTextField alloc] initWithFrame:CPRectMakeZero()];
|
||||
[_dataView setValue:[CPColor whiteColor] forThemeAttribute:"text-color" inState:CPThemeStateHighlighted];
|
||||
[_dataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected];
|
||||
|
||||
var headerCell = [aCoder decodeObjectForKey:@"NSHeaderCell"],
|
||||
headerView = [[_CPTableColumnHeaderView alloc] initWithFrame:CPRectMakeZero()];
|
||||
|
||||
@@ -29,7 +29,13 @@
|
||||
if (self = [super NS_initWithCoder:aCoder])
|
||||
{
|
||||
_tableView = [aCoder decodeObjectForKey:"NSTableView"];
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
|
||||
|
||||
// change the default height
|
||||
if (_bounds.size.height === 17)
|
||||
{
|
||||
_bounds.size.height = 23;
|
||||
_frame.size.height = 23;
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
@@ -35,18 +35,21 @@
|
||||
|
||||
//_dataSource = [aCoder decodeObjectForKey:CPTableViewDataSourceKey];
|
||||
//_delegate = [aCoder decodeObjectForKey:CPTableViewDelegateKey];
|
||||
|
||||
_headerView = [aCoder decodeObjectForKey:@"NSHeaderView"];
|
||||
_cornerView = [aCoder decodeObjectForKey:@"NSCornerView"];
|
||||
|
||||
_tableColumns = [aCoder decodeObjectForKey:@"NSTableColumns"];
|
||||
[_tableColumns makeObjectsPerformSelector:@selector(setTableView:) withObject:self];
|
||||
|
||||
_rowHeight = [aCoder decodeFloatForKey:@"NSRowHeight"];
|
||||
|
||||
// Convert xib default to cib default
|
||||
if (_rowHeight == 17)
|
||||
_rowHeight = 23;
|
||||
|
||||
if ([_gridColor isEqual:[CPColor colorWithRed:127.0 / 255.0 green:127.0 / 255.0 blue:127.0 / 255.0 alpha:1.0]])
|
||||
_gridColor = [CPColor colorWithRed:229.0 / 255.0 green:229.0 / 255.0 blue:229.0 / 255.0 alpha:1.0];
|
||||
|
||||
_headerView = [aCoder decodeObjectForKey:@"NSHeaderView"];
|
||||
_cornerView = [aCoder decodeObjectForKey:@"NSCornerView"];
|
||||
|
||||
_tableColumns = [aCoder decodeObjectForKey:@"NSTableColumns"];
|
||||
[_tableColumns makeObjectsPerformSelector:@selector(setTableView:) withObject:self];
|
||||
|
||||
_intercellSpacing = CGSizeMake(0.0, 0.0);//CGSizeMake([aCoder decodeFloatForKey:"NSIntercellSpacingWidth"], [aCoder decodeFloatForKey:"NSIntercellSpacingHeight"]);
|
||||
|
||||
@@ -54,6 +57,7 @@
|
||||
_gridStyleMask = [aCoder decodeIntForKey:@"NSGridStyleMask"];
|
||||
|
||||
_usesAlternatingRowBackgroundColors = (flags & 0x00800000) ? YES : NO;
|
||||
_alternatingRowBackgroundColors =[[CPColor whiteColor], [CPColor colorWithHexString:@"e4e7ff"]];
|
||||
|
||||
_allowsMultipleSelection = (flags & 0x08000000) ? YES : NO;
|
||||
_allowsEmptySelection = (flags & 0x10000000) ? YES : NO;
|
||||
|
||||
@@ -37,7 +37,16 @@
|
||||
|
||||
- (id)initWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
return [self NS_initWithCoder:aCoder];
|
||||
self = [super NS_initWithCoder:aCoder];
|
||||
if (self)
|
||||
{
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]];
|
||||
|
||||
_frame.size.height = 23.0;
|
||||
_bounds.size.height = 23.0;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (Class)classForKeyedArchiver
|
||||
|
||||
Reference in New Issue
Block a user