Compare commits

..
1 Commits
Author SHA1 Message Date
Tom Robinson 182f6a0030 CPLog refactor 2010-03-08 01:14:39 -08:00
148 changed files with 1481 additions and 4306 deletions

No files matched your search

-1
View File
@@ -26,7 +26,6 @@
@import "CPApplication.j" @import "CPApplication.j"
@import "CPBezierPath.j" @import "CPBezierPath.j"
@import "CPBox.j" @import "CPBox.j"
@import "CPBrowser.j"
@import "CPButton.j" @import "CPButton.j"
@import "CPButtonBar.j" @import "CPButtonBar.j"
@import "CPCheckBox.j" @import "CPCheckBox.j"
+3 -3
View File
@@ -96,12 +96,12 @@
return _items; return _items;
} }
- (void)addItem:(CPAccordionViewItem)anItem - (void)addItem:(CPAccordionItem)anItem
{ {
[self insertItem:anItem atIndex:_items.length]; [self insertItem:anItem atIndex:_items.length];
} }
- (void)insertItem:(CPAccordionViewItem)anItem atIndex:(CPInteger)anIndex - (void)insertItem:(CPAccordionItem)anItem atIndex:(CPInteger)anIndex
{ {
// FIXME: SHIFT ITEMS RIGHT // FIXME: SHIFT ITEMS RIGHT
[_expandedItemIndexes addIndex:anIndex]; [_expandedItemIndexes addIndex:anIndex];
@@ -122,7 +122,7 @@
[self setNeedsLayout]; [self setNeedsLayout];
} }
- (void)removeItem:(CPAccordionViewItem)anItem - (void)removeItem:(CPAccordionItem)anItem
{ {
[self removeItemAtIndex:[_items indexOfObjectIdenticalTo:anItem]]; [self removeItemAtIndex:[_items indexOfObjectIdenticalTo:anItem]];
} }
+108 -67
View File
@@ -31,7 +31,6 @@
@import "CPCibLoading.j" @import "CPCibLoading.j"
@import "CPPlatform.j" @import "CPPlatform.j"
#include "Platform/Platform.h"
var CPMainCibFile = @"CPMainCibFile", var CPMainCibFile = @"CPMainCibFile",
CPMainCibFileHumanFriendly = @"Main cib file base name"; CPMainCibFileHumanFriendly = @"Main cib file base name";
@@ -147,14 +146,14 @@ CPRunContinuesResponse = -1002;
[_mainMenu setAutoenablesItems:NO]; [_mainMenu setAutoenablesItems:NO];
var bundle = [CPBundle bundleForClass:[CPApplication class]], var bundle = [CPBundle bundleForClass:[CPApplication class]],
newMenuItem = [[CPMenuItem alloc] initWithTitle:@"New" action:@selector(newDocument:) keyEquivalent:@"n"]; newMenuItem = [[CPMenuItem alloc] initWithTitle:@"New" action:@selector(newDocument:) keyEquivalent:@"N"];
[newMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/New.png"] size:CGSizeMake(16.0, 16.0)]]; [newMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/New.png"] size:CGSizeMake(16.0, 16.0)]];
[newMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/NewHighlighted.png"] size:CGSizeMake(16.0, 16.0)]]; [newMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/NewHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
[_mainMenu addItem:newMenuItem]; [_mainMenu addItem:newMenuItem];
var openMenuItem = [[CPMenuItem alloc] initWithTitle:@"Open" action:@selector(openDocument:) keyEquivalent:@"o"]; var openMenuItem = [[CPMenuItem alloc] initWithTitle:@"Open" action:@selector(openDocument:) keyEquivalent:@"O"];
[openMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Open.png"] size:CGSizeMake(16.0, 16.0)]]; [openMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Open.png"] size:CGSizeMake(16.0, 16.0)]];
[openMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/OpenHighlighted.png"] size:CGSizeMake(16.0, 16.0)]]; [openMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/OpenHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
@@ -167,7 +166,7 @@ CPRunContinuesResponse = -1002;
[saveMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Save.png"] size:CGSizeMake(16.0, 16.0)]]; [saveMenuItem setImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/Save.png"] size:CGSizeMake(16.0, 16.0)]];
[saveMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/SaveHighlighted.png"] size:CGSizeMake(16.0, 16.0)]]; [saveMenuItem setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/SaveHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
[saveMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Save" action:@selector(saveDocument:) keyEquivalent:@"s"]]; [saveMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Save" action:@selector(saveDocument:) keyEquivalent:@"S"]];
[saveMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Save As" action:@selector(saveDocumentAs:) keyEquivalent:nil]]; [saveMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Save As" action:@selector(saveDocumentAs:) keyEquivalent:nil]];
[saveMenuItem setSubmenu:saveMenu]; [saveMenuItem setSubmenu:saveMenu];
@@ -186,9 +185,9 @@ CPRunContinuesResponse = -1002;
[editMenu addItem:undoMenuItem]; [editMenu addItem:undoMenuItem];
[editMenu addItem:redoMenuItem]; [editMenu addItem:redoMenuItem];
[editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Cut" action:@selector(cut:) keyEquivalent:@"x"]], [editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Cut" action:@selector(cut:) keyEquivalent:@"X"]],
[editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Copy" action:@selector(copy:) keyEquivalent:@"c"]], [editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Copy" action:@selector(copy:) keyEquivalent:@"C"]],
[editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Paste" action:@selector(paste:) keyEquivalent:@"v"]]; [editMenu addItem:[[CPMenuItem alloc] initWithTitle:@"Paste" action:@selector(paste:) keyEquivalent:@"V"]];
[editMenuItem setSubmenu:editMenu]; [editMenuItem setSubmenu:editMenu];
[editMenuItem setHidden:YES]; [editMenuItem setHidden:YES];
@@ -214,45 +213,84 @@ CPRunContinuesResponse = -1002;
if (_delegate == aDelegate) if (_delegate == aDelegate)
return; return;
var defaultCenter = [CPNotificationCenter defaultCenter], var defaultCenter = [CPNotificationCenter defaultCenter];
delegateNotifications =
[
CPApplicationWillFinishLaunchingNotification, @selector(applicationWillFinishLaunching:),
CPApplicationDidFinishLaunchingNotification, @selector(applicationDidFinishLaunching:),
CPApplicationWillBecomeActiveNotification, @selector(applicationWillBecomeActive:),
CPApplicationDidBecomeActiveNotification, @selector(applicationDidBecomeActive:),
CPApplicationWillResignActiveNotification, @selector(applicationWillResignActive:),
CPApplicationDidResignActiveNotification, @selector(applicationDidResignActive:),
CPApplicationWillTerminateNotification, @selector(applicationWillTerminate:)
],
count = [delegateNotifications count];
if (_delegate) if (_delegate)
{ {
var index = 0; [defaultCenter
removeObserver:_delegate
name:CPApplicationWillFinishLaunchingNotification
object:self];
for (; index < count; index += 2) [defaultCenter
{ removeObserver:_delegate
var notificationName = delegateNotifications[index], name:CPApplicationDidFinishLaunchingNotification
selector = delegateNotifications[index + 1]; object:self];
if ([_delegate respondsToSelector:selector]) [defaultCenter
[defaultCenter removeObserver:_delegate name:notificationName object:self]; removeObserver:_delegate
} name:CPApplicationWillBecomeActiveNotification
object:self];
[defaultCenter
removeObserver:_delegate
name:CPApplicationDidBecomeActiveNotification
object:self];
[defaultCenter
removeObserver:_delegate
name:CPApplicationWillResignActiveNotification
object:self];
[defaultCenter
removeObserver:_delegate
name:CPApplicationDidResignActiveNotification
object:self];
} }
_delegate = aDelegate; _delegate = aDelegate;
var index = 0; if ([_delegate respondsToSelector:@selector(applicationWillFinishLaunching:)])
[defaultCenter
addObserver:_delegate
selector:@selector(applicationWillFinishLaunching:)
name:CPApplicationWillFinishLaunchingNotification
object:self];
for (; index < count; index += 2) if ([_delegate respondsToSelector:@selector(applicationDidFinishLaunching:)])
{ [defaultCenter
var notificationName = delegateNotifications[index], addObserver:_delegate
selector = delegateNotifications[index + 1]; selector:@selector(applicationDidFinishLaunching:)
name:CPApplicationDidFinishLaunchingNotification
object:self];
if ([_delegate respondsToSelector:selector]) if ([_delegate respondsToSelector:@selector(applicationWillBecomeActive:)])
[defaultCenter addObserver:_delegate selector:selector name:notificationName object:self]; [defaultCenter
} addObserver:_delegate
selector:@selector(applicationWillBecomeActive:)
name:CPApplicationWillBecomeActiveNotification
object:self];
if ([_delegate respondsToSelector:@selector(applicationDidBecomeActive:)])
[defaultCenter
addObserver:_delegate
selector:@selector(applicationDidBecomeActive:)
name:CPApplicationDidBecomeActiveNotification
object:self];
if ([_delegate respondsToSelector:@selector(applicationWillResignActive:)])
[defaultCenter
addObserver:_delegate
selector:@selector(applicationWillResignActive:)
name:CPApplicationWillResignActiveNotification
object:self];
if ([_delegate respondsToSelector:@selector(applicationDidResignActive:)])
[defaultCenter
addObserver:_delegate
selector:@selector(applicationDidResignActive:)
name:CPApplicationDidResignActiveNotification
object:self];
} }
/*! /*!
@@ -331,10 +369,6 @@ CPRunContinuesResponse = -1002;
- (void)terminate:(id)aSender - (void)terminate:(id)aSender
{ {
[[CPNotificationCenter defaultCenter]
postNotificationName:CPApplicationWillTerminateNotification
object:self];
if (![CPPlatform isBrowser]) if (![CPPlatform isBrowser])
{ {
[[CPDocumentController sharedDocumentController] closeAllDocumentsWithDelegate:self [[CPDocumentController sharedDocumentController] closeAllDocumentsWithDelegate:self
@@ -828,7 +862,8 @@ CPRunContinuesResponse = -1002;
return windowController; return windowController;
var theDocument = [windowController document]; var theDocument = [windowController document];
if (theDocument !== delegate && [theDocument respondsToSelector:anAction])
if (theDocument != delegate && [theDocument respondsToSelector:anAction])
return theDocument; return theDocument;
return nil; return nil;
@@ -839,7 +874,7 @@ CPRunContinuesResponse = -1002;
Checks for a target in the following order: Checks for a target in the following order:
<ol> <ol>
<li>a responder from the key window</li> <li>a responder from the key window</li>
<li>a responder from the main window</li> <li>a responder frmo the main window</li>
<li>the CPApplication instance</li> <li>the CPApplication instance</li>
<li>the application delegate</li> <li>the application delegate</li>
<li>the document controller</li> <li>the document controller</li>
@@ -878,6 +913,8 @@ CPRunContinuesResponse = -1002;
- (void)setCallback:(Function)aCallback forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue - (void)setCallback:(Function)aCallback forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue
{ {
_eventListeners.push(_CPEventListenerMake(aMask, aCallback)); _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 - (CPEvent)setTarget:(id)aTarget selector:(SEL)aSelector forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue
@@ -936,9 +973,10 @@ CPRunContinuesResponse = -1002;
[self endSheet:sheet returnCode:0]; [self endSheet:sheet returnCode:0];
} }
- (CPArray)arguments - (CPArray)arguments
{ {
if(_fullArgsString !== window.location.hash) if(_fullArgsString != window.location.hash)
[self _reloadArguments]; [self _reloadArguments];
return _args; return _args;
@@ -971,18 +1009,12 @@ CPRunContinuesResponse = -1002;
- (void)_reloadArguments - (void)_reloadArguments
{ {
_fullArgsString = window.location.hash; _fullArgsString = window.location.hash;
var args = _fullArgsString.replace("#", "").split("/").slice(0);
if (_fullArgsString.length) for(var i=0, count = args.length; i<count; i++)
{ args[i] = decodeURIComponent(args[i]);
var args = _fullArgsString.substring(1).split("/");
for (var i = 0, count = args.length; i < count; i++) _args = args;
args[i] = decodeURIComponent(args[i]);
_args = args;
}
else
_args = [];
} }
- (CPDictionary)namedArguments - (CPDictionary)namedArguments
@@ -1026,7 +1058,7 @@ CPRunContinuesResponse = -1002;
else if ([self mainWindow]) else if ([self mainWindow])
[[self mainWindow] makeKeyAndOrderFront:self]; [[self mainWindow] makeKeyAndOrderFront:self];
else else
[[self mainMenu]._menuWindow makeKeyWindow]; //FIXME this may not actually work [[[self mainMenu] window] makeKeyWindow]; //FIXME this may not actually work
_previousKeyWindow = nil; _previousKeyWindow = nil;
_previousMainWindow = nil; _previousMainWindow = nil;
@@ -1103,13 +1135,6 @@ var _CPRunModalLoop = function(anEvent)
function CPApplicationMain(args, namedArgs) function CPApplicationMain(args, namedArgs)
{ {
#if PLATFORM(DOM)
// hook to allow recorder, etc to manipulate things before starting AppKit
if (window.parent !== window && typeof window.parent._childAppIsStarting === "function")
window.parent._childAppIsStarting(window);
#endif
var mainBundle = [CPBundle mainBundle], var mainBundle = [CPBundle mainBundle],
principalClass = [mainBundle principalClass]; principalClass = [mainBundle principalClass];
@@ -1118,8 +1143,29 @@ function CPApplicationMain(args, namedArgs)
[principalClass sharedApplication]; [principalClass sharedApplication];
if ([args containsObject:"debug"]) //FIXME?
CPLogRegister(CPLogPopup); if (!args)
{
var args = [CPApp arguments];
if([args containsObject:"debug"])
CPLogRegister(CPLogPopup);
}
if (!namedArgs)
{
var searchParams = window.location.search.substring(1).split("&");
namedArgs = [CPDictionary dictionary];
for(var i=0; i<searchParams.length; i++)
{
var index = searchParams[i].indexOf('=');
if(index == -1)
[namedArgs setObject: "" forKey:searchParams[i]];
else
[namedArgs setObject: searchParams[i].substring(index+1) forKey: searchParams[i].substring(0, index)];
}
}
CPApp._args = args; CPApp._args = args;
CPApp._namedArgs = namedArgs; CPApp._namedArgs = namedArgs;
@@ -1197,11 +1243,6 @@ var _CPAppBootstrapperActions = nil;
[self performActions]; [self performActions];
} }
+ (void)cibDidFailToLoad:(CPCib)aCib
{
throw new Error("Could not load main cib file (Did you forget to nib2cib it?).");
}
+ (void)reset + (void)reset
{ {
_CPAppBootstrapperActions = nil; _CPAppBootstrapperActions = nil;
-896
View File
@@ -1,896 +0,0 @@
/*
* CPBrowser.j
* AppKit
*
* Created by Ross Boucher.
* Copyright 2010, 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 "CPControl.j"
@import "CPImage.j"
@import "CPTableView.j"
@import "CPScrollView.j"
/*!
@ingroup appkit
@class CPBrowser
*/
@implementation CPBrowser : CPControl
{
id _delegate;
CPString _pathSeparator;
CPView _contentView;
CPScrollView _horizontalScrollView;
CPView _prototypeView;
CPArray _tableViews;
CPArray _tableDelegates;
id _rootItem;
BOOL _delegateSupportsImages;
SEL _doubleAction @accessors(property=doubleAction);
BOOL _allowsMultipleSelection;
BOOL _allowsEmptySelection;
Class _tableViewClass @accessors(property=tableViewClass);
float _rowHeight;
float _imageWidth;
float _leafWidth;
float _minColumnWidth;
float _defaultColumnWidth @accessors(property=defaultColumnWidth);
CPArray _columnWidths;
}
+ (CPImage)branchImage
{
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[self class]]
pathForResource:"browser-leaf.png"]
size:CGSizeMake(9,9)];
}
+ (CPImage)highlightedBranchImage
{
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[self class]]
pathForResource:"browser-leaf-highlighted.png"]
size:CGSizeMake(9,9)];
}
- (id)initWithFrame:(CGRect)aFrame
{
if (self = [super initWithFrame:aFrame])
{
_rowHeight = 23.0;
_defaultColumnWidth = 140.0;
_minColumnWidth = 80.0;
_imageWidth = 23.0;
_leafWidth = 13.0;
_columnWidths = [];
_pathSeparator = "/";
_tableViews = [];
_tableDelegates = [];
_allowsMultipleSelection = YES;
_allowsEmptySelection = YES;
_tableViewClass = [_CPBrowserTableView class];
_prototypeView = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
[_prototypeView setVerticalAlignment:CPCenterVerticalTextAlignment];
[_prototypeView setValue:[CPColor whiteColor] forThemeAttribute:"text-color" inState:CPThemeStateSelected];
[_prototypeView setLineBreakMode:CPLineBreakByTruncatingTail];
_horizontalScrollView = [[CPScrollView alloc] initWithFrame:[self bounds]];
[_horizontalScrollView setHasVerticalScroller:NO];
[_horizontalScrollView setAutohidesScrollers:YES];
[_horizontalScrollView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
_contentView = [[CPView alloc] initWithFrame:CGRectMake(0, 0, 0, CGRectGetHeight([self bounds]))];
[_contentView setAutoresizingMask:CPViewHeightSizable];
[_horizontalScrollView setDocumentView:_contentView];
[self addSubview:_horizontalScrollView];
}
return self;
}
- (void)setPrototypeView:(CPView)aPrototypeView
{
_prototypeView = [CPKeyedUnarchiver unarchiveObjectWithData:
[CPKeyedArchiver archivedDataWithRootObject:aPrototypeView]];
}
- (CPView)prototypeView
{
return [CPKeyedUnarchiver unarchiveObjectWithData:
[CPKeyedArchiver archivedDataWithRootObject:_prototypeView]];
}
- (void)setDelegate:(id)anObject
{
_delegate = anObject;
_delegateSupportsImages = [_delegate respondsToSelector:@selector(browser:imageValueForItem:)];
[self loadColumnZero];
}
- (id)delegate
{
return _delegate;
}
- (CPTableView)tableViewInColumn:(unsigned)index
{
return _tableViews[index];
}
- (unsigned)columnOfTableView:(CPTableView)aTableView
{
return [_tableViews indexOfObject:aTableView];
}
- (void)loadColumnZero
{
if ([_delegate respondsToSelector:@selector(rootItemForBrowser:)])
_rootItem = [_delegate rootItemForBrowser:self];
else
_rootItem = nil;
[self setLastColumn:-1];
[self addColumn];
}
- (void)setLastColumn:(int)columnIndex
{
if (columnIndex >= _tableViews.length)
return;
var oldValue = _tableViews.length - 1;
// unloads all later columns.
var indexPlusOne = columnIndex + 1;
[[_tableViews.slice(indexPlusOne) valueForKey:"enclosingScrollView"]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
_tableViews = _tableViews.slice(0, indexPlusOne);
_tableDelegates = _tableDelegates.slice(0, indexPlusOne);
if ([_delegate respondsToSelector:@selector(browser:didChangeLastColumn:toColumn:)])
[_delegate browser:self didChangeLastColumn:oldValue toColumn:columnIndex];
[self tile];
}
- (int)lastColumn
{
return _tableViews.length - 1;
}
- (void)addColumn
{
var lastIndex = [self lastColumn],
lastColumn = _tableViews[lastIndex],
selectionIndexes = [lastColumn selectedRowIndexes];
if (lastIndex >= 0 && [selectionIndexes count] > 1)
[CPException raise:CPInvalidArgumentException
reason:"Can't add column, column "+lastIndex+" has invalid selection."];
var index = lastIndex+1,
item = index === 0 ? _rootItem : [_tableDelegates[lastIndex] childAtIndex:[selectionIndexes firstIndex]];
if (index > 0 && item && [self isLeafItem:item])
return;
var table = [[_tableViewClass alloc] initWithFrame:CGRectMakeZero() browser:self];
[table setHeaderView:nil];
[table setCornerView:nil];
[table setAllowsMultipleSelection:_allowsMultipleSelection];
[table setAllowsEmptySelection:_allowsEmptySelection];
[table registerForDraggedTypes:[self registeredDraggedTypes]];
[self setNextResponder:table];
[self _addTableColumnsToTableView:table forColumnIndex:index];
var delegate = [[_CPBrowserTableDelegate alloc] init];
[delegate _setDelegate:_delegate];
[delegate _setBrowser:self];
[delegate _setIndex:index];
[delegate _setItem:item];
_tableViews[index] = table;
_tableDelegates[index] = delegate;
[table setDelegate:delegate];
[table setDataSource:delegate];
[table setTarget:delegate];
[table setAction:@selector(_tableViewClicked:)];
[table setDoubleAction:@selector(_tableViewDoubleClicked:)];
[table setDraggingDestinationFeedbackStyle:CPTableViewDraggingDestinationFeedbackStyleRegular];
var scrollView = [[_CPBrowserScrollView alloc] initWithFrame:CGRectMakeZero()];
[scrollView _setBrowser:self];
[scrollView setDocumentView:table];
[scrollView setHasHorizontalScroller:NO];
[scrollView setAutoresizingMask:CPViewHeightSizable];
[_contentView addSubview:scrollView];
[self tile];
[self scrollColumnToVisible:index];
}
- (void)_addTableColumnsToTableView:(CPTableView)aTableView forColumnIndex:(unsigned)index
{
if (_delegateSupportsImages)
{
var column = [[CPTableColumn alloc] initWithIdentifier:@"Image"],
view = [[CPImageView alloc] initWithFrame:CGRectMakeZero()];
[view setImageScaling:CPScaleProportionally];
[column setDataView:view];
[column setResizingMask:CPTableColumnNoResizing];
[aTableView addTableColumn:column];
}
var column = [[CPTableColumn alloc] initWithIdentifier:@"Content"];
[column setDataView:_prototypeView];
[column setResizingMask:CPTableColumnNoResizing];
[aTableView addTableColumn:column];
var column = [[CPTableColumn alloc] initWithIdentifier:@"Leaf"],
view = [[_CPBrowserLeafView alloc] initWithFrame:CGRectMakeZero()];
[view setBranchImage:[[self class] branchImage]];
[view setHighlightedBranchImage:[[self class] highlightedBranchImage]];
[column setDataView:view];
[column setResizingMask:CPTableColumnNoResizing];
[aTableView addTableColumn:column];
}
- (void)reloadColumn:(int)column
{
[[self tableViewInColumn:column] reloadData];
}
- (void)tile
{
var xOrigin = 0,
scrollerWidth = [CPScroller scrollerWidth],
height = CGRectGetHeight([_contentView bounds]);
for (var i = 0, count = _tableViews.length; i < count; i++)
{
var tableView = _tableViews[i],
scrollView = [tableView enclosingScrollView],
width = [self widthOfColumn:i],
tableHeight = CGRectGetHeight([tableView bounds]);
[[tableView tableColumnWithIdentifier:"Image"] setWidth:_imageWidth];
[[tableView tableColumnWithIdentifier:"Content"] setWidth:width - (_leafWidth + _delegateSupportsImages ? _imageWidth : 0) - scrollerWidth - scrollerWidth];
[[tableView tableColumnWithIdentifier:"Leaf"] setWidth:_leafWidth];
[tableView setRowHeight:_rowHeight];
[tableView setFrameSize:CGSizeMake(width - scrollerWidth, tableHeight)];
[scrollView setFrameOrigin:CGPointMake(xOrigin, 0)];
[scrollView setFrameSize:CGSizeMake(width, height)];
xOrigin += width;
}
[_contentView setFrameSize:CGSizeMake(xOrigin, height)];
}
// ITEMS
- (id)itemAtRow:(int)row inColumn:(int)column
{
return [_tableDelegates[column] childAtIndex:row];
}
- (BOOL)isLeafItem:(id)item
{
return [_delegate respondsToSelector:@selector(browser:isLeafItem:)] && [_delegate browser:self isLeafItem:item];
}
- (id)parentForItemsInColumn:(int)column
{
return [_tableDelegates[column] _item];
}
- (CPSet)selectedItems
{
var selectedColumn = [self selectedColumn],
selectedIndexes = [self selectedRowIndexesInColumn:selectedColumn],
set = [CPSet set],
index = [selectedIndexes firstIndex];
while (index !== CPNotFound)
{
[set addObject:[self itemAtRow:index inColumn:selectedColumn]];
index = [selectedIndexes indexGreaterThanIndex:index];
}
return set;
}
- (id)selectedItem
{
var selectedColumn = [self selectedColumn],
selectedRow = [self selectedRowInColumn:selectedColumn];
return [self itemAtRow:selectedRow inColumn:selectedColumn];
}
// CLICK EVENTS
- (void)_column:(unsigned)columnIndex clickedRow:(unsigned)rowIndex
{
[self setLastColumn:columnIndex];
if (rowIndex >= 0)
[self addColumn];
[self doClick:self];
}
- (void)sendAction
{
[self sendAction:_action to:_target];
}
- (void)doClick:(id)sender
{
[self sendAction:_action to:_target];
}
- (void)doDoubleClick:(id)sender
{
[self sendAction:_doubleAction to:_target];
}
// SIZING
- (float)columnContentWidthForColumnWidth:(float)aWidth
{
return aWidth - (_leafWidth + _delegateSupportsImages ? _imageWidth : 0) - [CPScroller scrollerWidth];
}
- (float)columnWidthForColumnContentWidth:(float)aWidth
{
return aWidth + (_leafWidth + _delegateSupportsImages ? _imageWidth : 0) + [CPScroller scrollerWidth];
}
- (void)setImageWidth:(float)aWidth
{
_imageWidth = aWidth;
[self tile];
}
- (float)imageWidth
{
return _imageWidth;
}
- (void)setMinColumnWidth:(float)minWidth
{
_minColumnWidth = minWidth;
[self tile];
}
- (float)minColumnWidth
{
return _minColumnWidth;
}
- (void)setWidth:(float)aWidth ofColumn:(unsigned)column
{
_columnWidths[column] = aWidth;
if ([_delegate respondsToSelector:@selector(browser:didResizeColumn:)])
[_delegate browser:self didResizeColumn:column];
[self tile];
}
- (float)widthOfColumn:(unsigned)column
{
var width = _columnWidths[column];
if (width == null)
width = _defaultColumnWidth;
return MAX([CPScroller scrollerWidth], MAX(_minColumnWidth, width));
}
- (void)setRowHeight:(float)aHeight
{
_rowHeight = aHeight;
}
- (float)rowHeight
{
return _rowHeight;
}
// SCROLLERS
- (void)scrollColumnToVisible:(unsigned)columnIndex
{
[_contentView scrollRectToVisible:[[[self tableViewInColumn:columnIndex] enclosingScrollView] frame]];
}
– (void)scrollRowToVisible:(unsigned)rowIndex inColumn:(unsigned)columnIndex
{
[self scrollColumnToVisible:columnIndex];
[[self tableViewInColumn:columnIndex] scrollRowToVisible:rowIndex];
}
- (BOOL)autohidesScroller
{
return [_horizontalScrollView autohidesScrollers];
}
- (void)setAutohidesScroller:(BOOL)shouldHide
{
[_horizontalScrollView setAutohidesScrollers:shouldHide];
}
// SELECTION
- (unsigned)selectedRowInColumn:(unsigned)columnIndex
{
if (columnIndex > [self lastColumn] || columnIndex < 0)
return -1;
return [_tableViews[columnIndex] selectedRow];
}
- (unsigned)selectedColumn
{
var column = [self lastColumn],
row = [self selectedRowInColumn:column];
if (row >= 0)
return column;
else
return column - 1;
}
- (void)selectRow:(unsigned)row inColumn:(unsigned)column
{
var selectedIndexes = row === -1 ? [CPIndexSet indexSet] : [CPIndexSet indexSetWithIndex:row];
[self selectRowIndexes:selectedIndexes inColumn:column];
}
- (BOOL)allowsMultipleSelection
{
return _allowsMultipleSelection;
}
- (void)setAllowsMultipleSelection:(BOOL)shouldAllow
{
if (_allowsMultipleSelection === shouldAllow)
return;
_allowsMultipleSelection = shouldAllow;
[_tableViews makeObjectsPerformSelector:@selector(setAllowsMultipleSelection:) withObject:shouldAllow];
}
- (BOOL)allowsEmptySelection
{
return _allowsEmptySelection;
}
- (void)setAllowsEmptySelection:(BOOL)shouldAllow
{
if (_allowsEmptySelection === shouldAllow)
return;
_allowsEmptySelection = shouldAllow;
[_tableViews makeObjectsPerformSelector:@selector(setAllowsEmptySelection:) withObject:shouldAllow];
}
- (CPIndexSet)selectedRowIndexesInColumn:(unsigned)column
{
return [[self tableViewInColumn:column] selectedRowIndexes];
}
- (void)selectRowIndexes:(CPIndexSet)indexSet inColumn:(unsigned)column
{
if (column < 0 || column > [self lastColumn] + 1)
return;
if ([_delegate respondsToSelector:@selector(browser:selectionIndexesForProposedSelection:inColumn:)])
indexSet = [_delegate browser:self selectionIndexesForProposedSelection:indexSet inColumn:column];
if ([_delegate respondsToSelector:@selector(browser:shouldSelectRowIndexes:inColumn:)] &&
![_delegate browser:self shouldSelectRowIndexes:indexSet inColumn:column])
return;
if ([_delegate respondsToSelector:@selector(browserSelectionIsChanging:)])
[_delegate browserSelectionIsChanging:self];
if (column > [self lastColumn])
[self addColumn];
[self setLastColumn:column];
[[self tableViewInColumn:column] selectRowIndexes:indexSet byExtendingSelection:NO];
[self setNextResponder:[self tableViewInColumn:[self lastColumn]]];
[self scrollColumnToVisible:column];
if ([_delegate respondsToSelector:@selector(browserSelectionDidChange:)])
[_delegate browserSelectionDidChange:self];
}
- (void)setBackgroundColor:(CPColor)aColor
{
[super setBackgroundColor:aColor];
[_contentView setBackgroundColor:aColor];
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
// DRAG AND DROP
- (void)registerForDraggedTypes:(CPArray)types
{
[super registerForDraggedTypes:types];
[_tableViews makeObjectsPerformSelector:@selector(registerForDraggedTypes:) withObject:types];
}
- (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent
{
if ([_delegate respondsToSelector:@selector(browser:canDragRowsWithIndexes:inColumn:withEvent:)])
return [_delegate browser:self canDragRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent];
return YES;
}
- (CPImage)draggingImageForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset
{
if ([_delegate respondsToSelector:@selector(browser:draggingImageForRowsWithIndexes:inColumn:withEvent:offset:)])
return [_delegate browser:self draggingImageForRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent offset:dragImageOffset];
return nil;
}
- (CPView)draggingViewForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset
{
if ([_delegate respondsToSelector:@selector(browser:draggingViewForRowsWithIndexes:inColumn:withEvent:offset:)])
return [_delegate browser:self draggingViewForRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent offset:dragImageOffset];
return nil;
}
@end
@implementation _CPBrowserResizeControl : CPView
{
CGPoint _mouseDownX;
CPBrowser _browser;
unsigned _index;
unsigned _width;
}
- (void)mouseDown:(CPEvent)anEvent
{
_mouseDownX = [anEvent locationInWindow].x;
_browser = [[self superview] _browser];
_index = [_browser columnOfTableView:[[self superview] documentView]];
_width = [_browser widthOfColumn:_index];
}
- (void)mouseDragged:(CPEvent)anEvent
{
var deltaX = [anEvent locationInWindow].x - _mouseDownX;
[_browser setWidth:_width + deltaX ofColumn:_index];
}
@end
var _CPBrowserResizeControlBackgroundImage = nil;
@implementation _CPBrowserScrollView : CPScrollView
{
_CPBrowserResizeControl _resizeControl;
CPBrowser _browser @accessors;
}
+ (CPImage)backgroundImage
{
if (!_CPBrowserResizeControlBackgroundImage)
{
var path = [[CPBundle bundleForClass:[self class]] pathForResource:"browser-resize-control.png"];
_CPBrowserResizeControlBackgroundImage = [[CPImage alloc] initWithContentsOfFile:path
size:CGSizeMake(15, 14)];
}
return _CPBrowserResizeControlBackgroundImage;
}
- (void)initWithFrame:(CGRect)aFrame
{
if (self = [super initWithFrame:aFrame])
{
_resizeControl = [[_CPBrowserResizeControl alloc] initWithFrame:CGRectMakeZero()];
[_resizeControl setBackgroundColor:[CPColor colorWithPatternImage:[[self class] backgroundImage]]];
[self addSubview:_resizeControl];
}
return self;
}
- (void)reflectScrolledClipView:(CPClipView)aClipView
{
[super reflectScrolledClipView:aClipView];
var frame = [_verticalScroller frame];
frame.size.height = CGRectGetHeight([self bounds]) - 14.0 - frame.origin.y;
[_verticalScroller setFrameSize:frame.size];
var resizeFrame = CGRectMake(CGRectGetMinX(frame), CGRectGetMaxY(frame), [CPScroller scrollerWidth], 14.0);
[_resizeControl setFrame:resizeFrame];
}
@end
@implementation _CPBrowserTableView : CPTableView
{
CPBrowser _browser;
}
- (id)initWithFrame:(CGRect)aFrame browser:(CPBrowser)aBrowser
{
if (self = [super initWithFrame:aFrame])
_browser = aBrowser;
return self;
}
- (BOOL)acceptsFirstResponder
{
return NO;
}
- (void)mouseDown:(CPEvent)anEvent
{
[super mouseDown:anEvent];
[[self window] makeFirstResponder:_browser];
}
- (CPView)browserView
{
return _browser;
}
- (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes atPoint:(CGPoint)mouseDownPoint
{
return [_browser canDragRowsWithIndexes:rowIndexes inColumn:[_browser columnOfTableView:self] withEvent:[CPApp currentEvent]];
}
- (CPImage)dragImageForRowsWithIndexes:(CPIndexSet)dragRows tableColumns:(CPArray)theTableColumns event:(CPEvent)dragEvent offset:(CPPointPointer)dragImageOffset
{
return [_browser draggingImageForRowsWithIndexes:dragRows inColumn:[_browser columnOfTableView:self] withEvent:dragEvent offset:dragImageOffset] ||
[super dragImageForRowsWithIndexes:dragRows tableColumns:theTableColumns event:dragEvent offset:dragImageOffset];
}
- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)dragRows tableColumns:(CPArray)theTableColumns event:(CPEvent)dragEvent offset:(CPPoint)dragViewOffset
{
var count = theTableColumns.length;
while (count--)
{
if ([theTableColumns[count] identifier] === "Leaf")
[theTableColumns removeObject:theTableColumns[count]];
}
return [_browser draggingViewForRowsWithIndexes:dragRows inColumn:[_browser columnOfTableView:self] withEvent:dragEvent offset:dragViewOffset] ||
[super dragViewForRowsWithIndexes:dragRows tableColumns:theTableColumns event:dragEvent offset:dragViewOffset];
}
- (void)moveUp:(id)sender
{
[super moveUp:sender];
[_browser selectRow:[self selectedRow] inColumn:[_browser selectedColumn]];
}
- (void)moveDown:(id)sender
{
[super moveDown:sender];
[_browser selectRow:[self selectedRow] inColumn:[_browser selectedColumn]];
}
- (void)moveLeft:(id)sender
{
var previousColumn = [_browser selectedColumn] - 1,
selectedRow = [_browser selectedRowInColumn:previousColumn];
[_browser selectRow:selectedRow inColumn:previousColumn];
}
- (void)moveRight:(id)sender
{
[_browser selectRow:0 inColumn:[_browser selectedColumn] + 1];
}
@end
@implementation _CPBrowserTableDelegate : CPObject
{
CPBrowser _browser @accessors;
unsigned _index @accessors;
id _delegate @accessors;
id _item @accessors;
}
- (unsigned)numberOfRowsInTableView:(CPTableView)aTableView
{
return [_delegate browser:_browser numberOfChildrenOfItem:_item];
}
- (void)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)column row:(unsigned)row
{
if ([column identifier] === "Image")
return [_delegate browser:_browser imageValueForItem:[self childAtIndex:row]];
else if ([column identifier] === "Leaf")
return ![_browser isLeafItem:[self childAtIndex:row]];
else
return [_delegate browser:_browser objectValueForItem:[self childAtIndex:row]];
}
- (void)_tableViewDoubleClicked:(CPTableView)aTableView
{
[_browser doDoubleClick:self];
}
- (void)_tableViewClicked:(CPTableView)aTableView
{
var selectedIndexes = [aTableView selectedRowIndexes];
[_browser _column:_index clickedRow:[selectedIndexes count] === 1 ? [selectedIndexes firstIndex] : -1];
}
- (id)childAtIndex:(unsigned)index
{
return [_delegate browser:_browser child:index ofItem:_item];
}
- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation
{
if ([_delegate respondsToSelector:@selector(browser:acceptDrop:atRow:column:dropOperation:)])
return [_delegate browser:_browser acceptDrop:info atRow:row column:_index dropOperation:operation];
else
return NO;
}
- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)operation
{
if ([_delegate respondsToSelector:@selector(browser:validateDrop:proposedRow:column:dropOperation:)])
[_delegate browser:_browser validateDrop:info proposedRow:row column:_index dropOperation:operation];
else
return CPDragOperationNone;
}
- (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard
{
if ([_delegate respondsToSelector:@selector(browser:writeRowsWithIndexes:inColumn:toPasteboard:)])
return [_delegate browser:_browser writeRowsWithIndexes:rowIndexes inColumn:_index toPasteboard:pboard];
else
return NO;
}
- (BOOL)respondsToSelector:(SEL)aSelector
{
if (aSelector === @selector(browser:writeRowsWithIndexes:inColumn:toPasteboard:))
return [_delegate respondsToSelector:@selector(browser:writeRowsWithIndexes:inColumn:toPasteboard:)];
else
return [super respondsToSelector:aSelector];
}
@end
@implementation _CPBrowserLeafView : CPView
{
BOOL _isLeaf @accessors(readonly, property=isLeaf);
CPImage _branchImage @accessors(property=branchImage);
CPImage _highlightedBranchImage @accessors(property=highlightedBranchImage);
}
- (BOOL)objectValue
{
return _isLeaf;
}
- (void)setObjectValue:(id)aValue
{
_isLeaf = !!aValue;
[self setNeedsLayout];
}
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
{
if (aName === "image-view")
return CGRectInset([self bounds], 1, 1);
return [super rectForEphemeralSubviewNamed:aName];
}
- (CPView)createEphemeralSubviewNamed:(CPString)aName
{
if (aName === "image-view")
return [[CPImageView alloc] initWithFrame:CGRectMakeZero()];
return [super createEphemeralSubviewNamed:aName];
}
- (void)layoutSubviews
{
var imageView = [self layoutEphemeralSubviewNamed:@"image-view"
positioned:CPWindowAbove
relativeToEphemeralSubviewNamed:nil];
var isHighlighted = [self themeState] & CPThemeStateSelected;
[imageView setImage: _isLeaf ? (isHighlighted ? _highlightedBranchImage : _branchImage) : nil];
[imageView setImageScaling:CPScaleNone];
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeBool:_isLeaf forKey:"_CPBrowserLeafViewIsLeafKey"];
[aCoder encodeObject:_branchImage forKey:"_CPBrowserLeafViewBranchImageKey"];
[aCoder encodeObject:_highlightedBranchImage forKey:"_CPBrowserLeafViewHighlightedBranchImageKey"];
}
- (void)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
_isLeaf = [aCoder decodeBoolForKey:"_CPBrowserLeafViewIsLeafKey"];
_branchImage = [aCoder decodeObjectForKey:"_CPBrowserLeafViewBranchImageKey"];
_highlightedBranchImage = [aCoder decodeObjectForKey:"_CPBrowserLeafViewHighlightedBranchImageKey"];
}
return self;
}
@end
+4 -1
View File
@@ -502,6 +502,8 @@ CPButtonStateMixed = CPThemeState("mixed");
} }
else else
return [[_CPImageAndTextView alloc] initWithFrame:_CGRectMakeZero()]; return [[_CPImageAndTextView alloc] initWithFrame:_CGRectMakeZero()];
return [super createEphemeralSubviewNamed:aName];
} }
- (void)layoutSubviews - (void)layoutSubviews
@@ -510,7 +512,8 @@ CPButtonStateMixed = CPThemeState("mixed");
positioned:CPWindowBelow positioned:CPWindowBelow
relativeToEphemeralSubviewNamed:@"content-view"]; relativeToEphemeralSubviewNamed:@"content-view"];
[bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; if (bezelView)
[bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]];
var contentView = [self layoutEphemeralSubviewNamed:@"content-view" var contentView = [self layoutEphemeralSubviewNamed:@"content-view"
positioned:CPWindowAbove positioned:CPWindowAbove
+28 -206
View File
@@ -4,33 +4,18 @@
#include "CoreGraphics/CGGeometry.h" #include "CoreGraphics/CGGeometry.h"
@implementation CPButtonBar : CPView @implementation CPButtonBar : CPControl
{ {
BOOL _hasResizeControl;
BOOL _resizeControlIsLeftAligned;
CPArray _buttons;
} }
+ (id)plusButton - (id)initWithFrame:(CGRect)aFrame
{ {
var button = [[CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)], self = [super initWithFrame:aFrame];
image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"plus_button.png"] size:CGSizeMake(11, 12)];
[button setImage:image]; if (self)
[button setImagePosition:CPImageOnly]; [self setNeedsLayout];
return button; return self;
}
+ (id)minusButton
{
var button = [[CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"minus_button.png"] size:CGSizeMake(11, 4)];
[button setImage:image];
[button setImagePosition:CPImageOnly];
return button;
} }
+ (CPString)themeClass + (CPString)themeClass
@@ -40,210 +25,47 @@
+ (id)themeAttributes + (id)themeAttributes
{ {
return [CPDictionary dictionaryWithObjects:[CGInsetMake(0.0, 0.0, 0.0, 0.0), CGSizeMakeZero(), [CPNull null], [CPNull null], [CPNull null]] return [CPDictionary dictionaryWithObjects:[[CPNull null]]
forKeys:[@"resize-control-inset", @"resize-control-size", @"resize-control-color", @"bezel-color", @"button-bezel-color"]]; forKeys:[@"bezel-color"]];
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_buttons = [];
[self setNeedsLayout];
}
return self;
}
- (void)awakeFromCib
{
var view = [self superview],
subview = self;
while (view)
{
if ([view isKindOfClass:[CPSplitView class]])
{
var viewIndex = [[view subviews] indexOfObject:subview];
[view setButtonBar:self forDividerAtIndex:viewIndex];
break;
}
subview = view;
view = [view superview];
}
}
- (void)setButtons:(CPArray)buttons
{
_buttons = [CPArray arrayWithArray:buttons];
for (var i = 0, count = [_buttons count]; i < count; i++)
{
var button = _buttons[i];
var normalColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateNormal],
highlightedColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateHighlighted],
disabledColor = [self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateDisabled];
[button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal|CPThemeStateBordered];
[button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted|CPThemeStateBordered];
[button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled|CPThemeStateBordered];
// FIXME shouldn't need this
[button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal|CPThemeStateBordered|CPPopUpButtonStatePullsDown];
[button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted|CPThemeStateBordered|CPPopUpButtonStatePullsDown];
[button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled|CPThemeStateBordered|CPPopUpButtonStatePullsDown];
[button setBordered:YES];
}
[self setNeedsLayout];
}
- (CPArray)buttons
{
return [CPArray arrayWithArray:_buttons];
}
- (void)setHasResizeControl:(BOOL)shouldHaveResizeControl
{
if (_hasResizeControl === shouldHaveResizeControl)
return;
_hasResizeControl = !!shouldHaveResizeControl;
[self setNeedsLayout];
}
- (BOOL)hasResizeControl
{
return _hasResizeControl;
}
- (void)setResizeControlIsLeftAligned:(BOOL)shouldBeLeftAligned
{
if (_resizeControlIsLeftAligned === shouldBeLeftAligned)
return;
_resizeControlIsLeftAligned = !!shouldBeLeftAligned;
[self setNeedsLayout];
}
- (BOOL)resizeControlIsLeftAligned
{
return _resizeControlIsLeftAligned;
}
- (CGRect)resizeControlFrame
{
var inset = [self currentValueForThemeAttribute:@"resize-control-inset"],
size = [self currentValueForThemeAttribute:@"resize-control-size"],
currentSize = [self bounds],
leftOrigin = _resizeControlIsLeftAligned ? 0 : currentSize.size.width - size.width - inset.right - inset.left;
return CGRectMake(leftOrigin, 0, size.width + inset.left + inset.right, size.height + inset.top + inset.bottom);
} }
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName - (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
{ {
if (aName === "resize-control-view") if (aName === "bezel-view")
{ return [self bounds];
var inset = [self currentValueForThemeAttribute:@"resize-control-inset"],
size = [self currentValueForThemeAttribute:@"resize-control-size"],
currentSize = [self bounds];
if (_resizeControlIsLeftAligned)
return CGRectMake(inset.left, inset.top, size.width, size.height);
else
return CGRectMake(currentSize.size.width - size.width - inset.right, inset.top, size.width, size.height);
}
return [super rectForEphemeralSubviewNamed:aName]; return [super rectForEphemeralSubviewNamed:aName];
} }
- (CPView)createEphemeralSubviewNamed:(CPString)aName - (CPView)createEphemeralSubviewNamed:(CPString)aName
{ {
if (aName === "resize-control-view") if (aName === "bezel-view")
return [[CPView alloc] initWithFrame:CGRectMakeZero()]; {
var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[view setHitTests:NO];
return view;
}
return [super createEphemeralSubviewNamed:aName]; return [super createEphemeralSubviewNamed:aName];
} }
- (void)layoutSubviews - (void)layoutSubviews
{ {
[self setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]]; var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view"
positioned:CPWindowBelow
relativeToEphemeralSubviewNamed:@""];
var buttonsNotHidden = [CPArray arrayWithArray:_buttons], if (bezelView)
count = [buttonsNotHidden count]; [bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]];
}
while (count--) - (void)addSubview:(CPView)aSubview
if ([buttonsNotHidden[count] isHidden]) {
[buttonsNotHidden removeObject:buttonsNotHidden[count]]; [super addSubview:aSubview];
var currentButtonOffset = _resizeControlIsLeftAligned ? CGRectGetMaxX([self bounds]) + 1 : -1, [aSubview setAutoresizingMask:CPViewMinXMargin];
height = CGRectGetHeight([self bounds]) - 1;
for (var i = 0, count = [buttonsNotHidden count]; i < count; i++)
{
var button = buttonsNotHidden[i],
width = CGRectGetWidth([button frame]);
if (_resizeControlIsLeftAligned)
{
[button setFrame:CGRectMake(currentButtonOffset - width, 1, width, height)];
currentButtonOffset -= width - 1;
}
else
{
[button setFrame:CGRectMake(currentButtonOffset, 1, width, height)];
currentButtonOffset += width - 1;
}
[self addSubview:button];
}
if (_hasResizeControl)
{
var resizeControlView = [self layoutEphemeralSubviewNamed:@"resize-control-view"
positioned:CPWindowAbove
relativeToEphemeralSubviewNamed:nil];
[resizeControlView setAutoresizingMask: _resizeControlIsLeftAligned ? CPViewMaxXMargin : CPViewMinXMargin];
[resizeControlView setBackgroundColor:[self currentValueForThemeAttribute:@"resize-control-color"]];
}
} }
@end @end
var CPButtonBarHasResizeControlKey = @"CPButtonBarHasResizeControlKey",
CPButtonBarResizeControlIsLeftAlignedKey = @"CPButtonBarResizeControlIsLeftAlignedKey",
CPButtonBarButtonsKey = @"CPButtonBarButtonsKey";
@implementation CPButtonBar (CPCoding)
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeBool:_hasResizeControl forKey:CPButtonBarHasResizeControlKey];
[aCoder encodeBool:_resizeControlIsLeftAligned forKey:CPButtonBarResizeControlIsLeftAlignedKey];
[aCoder encodeObject:_buttons forKey:CPButtonBarButtonsKey];
}
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
_buttons = [aCoder decodeObjectForKey:CPButtonBarButtonsKey] || [];
_hasResizeControl = [aCoder decodeBoolForKey:CPButtonBarHasResizeControlKey];
_resizeControlIsLeftAligned = [aCoder decodeBoolForKey:CPButtonBarResizeControlIsLeftAlignedKey];
}
return self;
}
@end
+4 -12
View File
@@ -120,13 +120,9 @@
[super setBoundsOrigin:aPoint]; [super setBoundsOrigin:aPoint];
var superview = [self superview], var superview = [self superview];
// This is hack to avoid having to import CPScrollView. if([superview isKindOfClass:[CPScrollView class]])
// FIXME: Should CPScrollView be finding out about this on its own somehow?
scrollViewClass = objj_getClass("CPScrollView");
if([superview isKindOfClass:scrollViewClass])
[superview reflectScrolledClipView:self]; [superview reflectScrolledClipView:self];
} }
@@ -177,13 +173,9 @@
return; return;
// ... and we're in a scroll view of course. // ... and we're in a scroll view of course.
var superview = [self superview], var superview = [self superview];
// This is hack to avoid having to import CPScrollView. if ([superview isKindOfClass:[CPScrollView class]])
// FIXME: Should CPScrollView be finding out about this on its own somehow?
scrollViewClass = objj_getClass("CPScrollView");
if ([superview isKindOfClass:scrollViewClass])
[superview reflectScrolledClipView:self]; [superview reflectScrolledClipView:self];
} }
+30 -55
View File
@@ -597,10 +597,6 @@
if (![_selectionIndexes count]) if (![_selectionIndexes count])
return; return;
if ([_delegate respondsToSelector:@selector(collectionView:canDragItemsAtIndexes:withEvent:)] &&
![_delegate collectionView:self canDragItemsAtIndexes:_selectionIndexes withEvent:_mouseDownEvent])
return;
// Set up the pasteboard // Set up the pasteboard
var dragTypes = [_delegate collectionView:self dragTypesForItemsAtIndexes:_selectionIndexes]; var dragTypes = [_delegate collectionView:self dragTypesForItemsAtIndexes:_selectionIndexes];
@@ -680,42 +676,41 @@
return _delegate; 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 @end
@implementation CPCollectionView (KeyboardInteraction) @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 - (void)_scrollToSelection
{ {
var frame = [self frameForItemsAtIndexes:[self selectionIndexes]]; var rect = [self rectForItemsAtIndexes:[self selectionIndexes]];
if (rect)
if (!CGRectIsNull(frame)) [self scrollRectToVisible:rect];
[self scrollRectToVisible:frame];
} }
- (void)moveLeft:(id)sender - (void)moveLeft:(id)sender
@@ -758,7 +753,7 @@
[self _scrollToSelection]; [self _scrollToSelection];
} }
- (void)deleteBackward:(id)sender - (void)deleteBackwards:(id)sender
{ {
if ([[self delegate] respondsToSelector:@selector(collectionView:shouldDeleteItemsAtIndexes:)]) if ([[self delegate] respondsToSelector:@selector(collectionView:shouldDeleteItemsAtIndexes:)])
{ {
@@ -780,26 +775,6 @@
@end @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", var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeKey",
CPCollectionViewMaxItemSizeKey = @"CPCollectionViewMaxItemSizeKey", CPCollectionViewMaxItemSizeKey = @"CPCollectionViewMaxItemSizeKey",
CPCollectionViewVerticalMarginKey = @"CPCollectionViewVerticalMarginKey", CPCollectionViewVerticalMarginKey = @"CPCollectionViewVerticalMarginKey",
+55 -9
View File
@@ -438,15 +438,50 @@ var cachedBlackColor,
{ {
_components = components; _components = components;
var hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0; if (!CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0 && window.Base64 && window.CRC32)
{
var bytes = [0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x8,0x3,0x0,0x0,0x0,0x28,0xcb,0x34,0xbb,0x0,0x0,0x3,0x0,0x50,0x4c,0x54,0x45,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x17,0x89,0x99,0x55,0x0,0x0,0x0,0x1,0x74,0x52,0x4e,0x53,0x0,0x40,0xe6,0xd8,0x66,0x0,0x0,0x0,0x10,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x60,0x0,0x0,0x0,0x0,0xff,0xff,0x3,0x0,0x0,0x2,0x0,0x1,0x24,0x7f,0x24,0xf1,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,0xff];
var r_off = 41;
var g_off = 42;
var b_off = 43;
var a_off = 821;
var plte_crc_off = 809;
var trns_crc_off = 822;
var plte_type_off = 37;
var trns_type_off = 817;
_cssString = (hasAlpha ? "rgba(" : "rgb(") + bytes[r_off] = Math.round(_components[0]*255);
parseInt(_components[0] * 255.0) + ", " + bytes[g_off] = Math.round(_components[1]*255);
parseInt(_components[1] * 255.0) + ", " + bytes[b_off] = Math.round(_components[2]*255);
parseInt(_components[2] * 255.0) + bytes[a_off] = Math.round(_components[3]*255);
(hasAlpha ? (", " + _components[3]) : "") + ")";
// calculate new CRCs
var new_plte_crc = integerToBytes(CRC32.getCRC(bytes, plte_type_off, 4+768), 4);
var new_trns_crc = integerToBytes(CRC32.getCRC(bytes, trns_type_off, 4+1), 4);
// overwrite old CRCs with new ones
for (var i = 0; i < 4; i++)
{
bytes[plte_crc_off+i] = new_plte_crc[i];
bytes[trns_crc_off+i] = new_trns_crc[i];
}
// Base64 encode, strip whitespace and build data URL
var base64image = Base64.encode(bytes); //.replace(/[\s]/g, "");
_cssString = "url(\"data:image/png;base64," + base64image + "\")";
}
else
{
var hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0;
_cssString = (hasAlpha ? "rgba(" : "rgb(") +
parseInt(_components[0] * 255.0) + ", " +
parseInt(_components[1] * 255.0) + ", " +
parseInt(_components[2] * 255.0) +
(hasAlpha ? (", " + _components[3]) : "") + ")";
}
} }
return self; return self;
} }
@@ -459,7 +494,6 @@ var cachedBlackColor,
{ {
_patternImage = anImage; _patternImage = anImage;
_cssString = "url(\"" + [_patternImage filename] + "\")"; _cssString = "url(\"" + [_patternImage filename] + "\")";
_components = [0.0, 0.0, 0.0, 1.0];
} }
return self; return self;
@@ -702,7 +736,7 @@ var CPColorComponentsKey = @"CPColorComponentsKey",
var hexCharacters = "0123456789ABCDEF"; var hexCharacters = "0123456789ABCDEF";
// HACK: prevent these from becoming globals. workaround for obj-j "function foo(){}" behavior // HACK: prevent these from becoming globals. workaround for obj-j "function foo(){}" behavior
var hexToRGB, rgbToHex, byteToHex; var hexToRGB, integerToBytes, rgbToHex, byteToHex;
/*! /*!
Used for the CPColor \c +colorWithHexString: implementation Used for the CPColor \c +colorWithHexString: implementation
@@ -730,6 +764,18 @@ function hexToRGB(hex)
return [red, green, blue, 1.0]; return [red, green, blue, 1.0];
} }
function integerToBytes(integer, length) {
if (!length)
length = (integer == 0) ? 1 : Math.round((Math.log(integer)/Math.log(2))/8+0.5);
var bytes = new Array(length);
for (var i = length-1; i >= 0; i--) {
bytes[i] = integer & 255;
integer = integer >> 8
}
return bytes;
}
function rgbToHex(r,g,b) { function rgbToHex(r,g,b) {
return byteToHex(r) + byteToHex(g) + byteToHex(b); return byteToHex(r) + byteToHex(g) + byteToHex(b);
} }
+3 -1
View File
@@ -65,6 +65,8 @@ CPInputTypeCanBeChangedFeature = 1 << 25;
CPHTML5DragAndDropSourceYOffBy1 = 1 << 26; CPHTML5DragAndDropSourceYOffBy1 = 1 << 26;
var USER_AGENT = "", var USER_AGENT = "",
PLATFORM_ENGINE = CPUnknownBrowserEngine, PLATFORM_ENGINE = CPUnknownBrowserEngine,
PLATFORM_FEATURES = 0; PLATFORM_FEATURES = 0;
@@ -73,7 +75,7 @@ var USER_AGENT = "",
PLATFORM_FEATURES |= CPInputTypeCanBeChangedFeature; PLATFORM_FEATURES |= CPInputTypeCanBeChangedFeature;
if (typeof window !== "undefined" && typeof window.navigator !== "undefined") if (typeof window != "undfined" && typeof window.navigator != "undefined")
USER_AGENT = window.navigator.userAgent; USER_AGENT = window.navigator.userAgent;
// Opera // Opera
+6 -19
View File
@@ -210,10 +210,10 @@ var CPDocumentUntitledCount = 0;
@throws CPUnsupportedMethodException if this method hasn't been overriden by the subclass @throws CPUnsupportedMethodException if this method hasn't been overriden by the subclass
@return the document data @return the document data
*/ */
- (CPData)dataOfType:(CPString)aType - (CPData)dataOfType:(CPString)aType error:({CPError})anError
{ {
[CPException raise:CPUnsupportedMethodException [CPException raise:CPUnsupportedMethodException
reason:"dataOfType: must be overridden by the document subclass."]; reason:"dataOfType:error: must be overridden by the document subclass."];
} }
/*! /*!
@@ -473,21 +473,8 @@ var CPDocumentUntitledCount = 0;
*/ */
- (void)saveToURL:(CPURL)anAbsoluteURL ofType:(CPString)aTypeName forSaveOperation:(CPSaveOperationType)aSaveOperation delegate:(id)aDelegate didSaveSelector:(SEL)aDidSaveSelector contextInfo:(id)aContextInfo - (void)saveToURL:(CPURL)anAbsoluteURL ofType:(CPString)aTypeName forSaveOperation:(CPSaveOperationType)aSaveOperation delegate:(id)aDelegate didSaveSelector:(SEL)aDidSaveSelector contextInfo:(id)aContextInfo
{ {
if (anAbsoluteURL.isLocalStorageURL()) var data = [self dataOfType:[self fileType] error:nil],
[[CPDocumentController sharedDocumentController] _addLocalDocumentURL:anAbsoluteURL]; oldChangeCount = _changeCount;
var data = nil;
if ([self respondsToSelector:@selector(dataOfType:error:)])
{
CPLog.warn("[" + CPStringFromClass([self class]) + " " + CPStringFromSelector(@selector(dataOfType:error:)) + "] is deprecated, please implement " + CPStringFromSelector(@selector(dataOfType:)) + " instead and simply throw exceptions when necessary.");
data = [self dataOfType:[self fileType] error:nil];
}
else
data = [self dataOfType:[self fileType]];
var oldChangeCount = _changeCount;
_writeRequest = [CPURLRequest requestWithURL:anAbsoluteURL]; _writeRequest = [CPURLRequest requestWithURL:anAbsoluteURL];
@@ -501,10 +488,10 @@ var CPDocumentUntitledCount = 0;
[_writeRequest setValue:@"close" forHTTPHeaderField:@"Connection"]; [_writeRequest setValue:@"close" forHTTPHeaderField:@"Connection"];
if (aSaveOperation === CPSaveOperation) if (aSaveOperation == CPSaveOperation)
[_writeRequest setValue:@"true" forHTTPHeaderField:@"x-cappuccino-overwrite"]; [_writeRequest setValue:@"true" forHTTPHeaderField:@"x-cappuccino-overwrite"];
if (aSaveOperation !== CPSaveToOperation) if (aSaveOperation != CPSaveToOperation)
[self updateChangeCount:CPChangeCleared]; [self updateChangeCount:CPChangeCleared];
// FIXME: Oh man is this every looking for trouble, we need to handle login at the Cappuccino level, with HTTP Errors. // FIXME: Oh man is this every looking for trouble, we need to handle login at the Cappuccino level, with HTTP Errors.
+3 -58
View File
@@ -38,7 +38,6 @@ var CPSharedDocumentController = nil;
{ {
CPArray _documents; CPArray _documents;
CPArray _documentTypes; CPArray _documentTypes;
CPArray _localDocumentURLs;
} }
/*! /*!
@@ -63,27 +62,11 @@ var CPSharedDocumentController = nil;
if (self) if (self)
{ {
_documents = [[CPArray alloc] init];
if (!CPSharedDocumentController) if (!CPSharedDocumentController)
CPSharedDocumentController = self; CPSharedDocumentController = self;
_localDocumentURLs = [CPSet set];
if (window.localStorage)
{
var localDocumentURLs = localStorage.getItem(CPDocumentControllerLocalDocumentURLsKey);
if (localDocumentURLs)
{
localDocumentURLs = JSON.parse(localDocumentURLs);
var count = [localDocumentURLs count];
while (count--)
[_localDocumentURLs addObject:new CFURL(localDocumentURLs[count])];
}
}
_documents = [];
_documentTypes = [[[CPBundle mainBundle] infoDictionary] objectForKey:@"CPBundleDocumentTypes"]; _documentTypes = [[[CPBundle mainBundle] infoDictionary] objectForKey:@"CPBundleDocumentTypes"];
} }
return self; return self;
@@ -236,7 +219,7 @@ var CPSharedDocumentController = nil;
Opens a new document in the application. Opens a new document in the application.
@param aSender the requesting object @param aSender the requesting object
*/ */
- (@action)newDocument:(id)aSender - (CFAction)newDocument:(id)aSender
{ {
[self openUntitledDocumentOfType:[[_documentTypes objectAtIndex:0] objectForKey:@"CPBundleTypeName"] display:YES]; [self openUntitledDocumentOfType:[[_documentTypes objectAtIndex:0] objectForKey:@"CPBundleTypeName"] display:YES];
} }
@@ -472,41 +455,3 @@ var CPSharedDocumentController = nil;
} }
@end @end
var CPDocumentControllerLocalDocumentURLsKey = @"Cappuccino.CPDocumentController.documentURLs";
@implementation CPDocumentController (LocalStorage)
- (void)_addLocalDocumentURL:(CPURL)aURL
{
if (!window.localStorage)
return;
[_localDocumentURLs addObject:aURL];
var stringURLs = [],
URL = nil,
URLEnumerator = [_localDocumentURLs objectEnumerator];
while (URL = [URLEnumerator nextObject])
stringURLs.push(URL + "");
localStorage.setItem(CPDocumentControllerLocalDocumentURLsKey, JSON.stringify(stringURLs));
}
- (void)_removeLocalDocumentURL:(CPURL)aURL
{
if (!window.localStorage)
return;
[_localDocumentURLs removeObject:aURL];
localStorage.setItem(CPDocumentControllerLocalDocumentURLsKey, JSON.stringify([self allObjects]));
}
- (CPSet)localDocumentURLs
{
return [_localDocumentURLs copy];
}
@end
+4 -4
View File
@@ -127,7 +127,7 @@ var CPDragServerDraggingInfo = nil;
@end @end
var CPDraggingSource_draggedImage_movedTo_ = 1 << 0, var CPDraggingSource_draggedImage_movedTo_ = 1 << 0,
CPDraggingSource_draggedImage_endedAt_operation_ = 1 << 1, CPDraggingSource_draggedImage_endAt_operation_ = 1 << 1,
CPDraggingSource_draggedView_movedTo_ = 1 << 2, CPDraggingSource_draggedView_movedTo_ = 1 << 2,
CPDraggingSource_draggedView_endedAt_operation_ = 1 << 3; CPDraggingSource_draggedView_endedAt_operation_ = 1 << 3;
@@ -267,7 +267,7 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0,
if (![CPPlatform supportsDragAndDrop]) if (![CPPlatform supportsDragAndDrop])
[_draggedWindow orderOut:self]; [_draggedWindow orderOut:self];
if (_implementedDraggingSourceMethods & CPDraggingSource_draggedImage_endedAt_operation_) if (_implementedDraggingSourceMethods & CPDraggingSource_draggedImage_endAt_operation_)
[_draggingSource draggedImage:[_draggedView image] endedAt:aLocation operation:anOperation]; [_draggingSource draggedImage:[_draggedView image] endedAt:aLocation operation:anOperation];
else if (_implementedDraggingSourceMethods & CPDraggingSource_draggedView_endedAt_operation_) else if (_implementedDraggingSourceMethods & CPDraggingSource_draggedView_endedAt_operation_)
[_draggingSource draggedView:_draggedView endedAt:aLocation operation:anOperation]; [_draggingSource draggedView:_draggedView endedAt:aLocation operation:anOperation];
@@ -342,8 +342,8 @@ var CPDraggingSource_draggedImage_movedTo_ = 1 << 0,
if ([_draggingSource respondsToSelector:@selector(draggedImage:movedTo:)]) if ([_draggingSource respondsToSelector:@selector(draggedImage:movedTo:)])
_implementedDraggingSourceMethods |= CPDraggingSource_draggedImage_movedTo_; _implementedDraggingSourceMethods |= CPDraggingSource_draggedImage_movedTo_;
if ([_draggingSource respondsToSelector:@selector(draggedImage:endedAt:operation:)]) if ([_draggingSource respondsToSelector:@selector(draggedImage:endAt:operation:)])
_implementedDraggingSourceMethods |= CPDraggingSource_draggedImage_endedAt_operation_; _implementedDraggingSourceMethods |= CPDraggingSource_draggedImage_endAt_operation_;
} }
else else
{ {
+1 -4
View File
@@ -345,10 +345,7 @@ var _CPEventPeriodicEventPeriod = 0,
*/ */
- (int)buttonNumber - (int)buttonNumber
{ {
if (_type === CPRightMouseDown || _type === CPRightMouseUp || _type === CPRightMouseDragged) return _buttonNumber;
return 1;
return 0;
} }
/*! /*!
+1 -1
View File
@@ -51,7 +51,7 @@ var CPSharedFontManager = nil,
// Changing the Default Font Conversion Classes // Changing the Default Font Conversion Classes
/*! /*!
Sets the class that will be used to create the application's Sets the class that will be used to create the applcation's
font manager. font manager.
*/ */
+ (void)setFontManagerFactory:(Class)aClass + (void)setFontManagerFactory:(Class)aClass
-3
View File
@@ -370,10 +370,7 @@ var LEFT_SHADOW_INSET = 3.0,
var images = [CPKeyedUnarchiver unarchiveObjectWithData:[[aSender draggingPasteboard] dataForType:CPImagesPboardType]]; var images = [CPKeyedUnarchiver unarchiveObjectWithData:[[aSender draggingPasteboard] dataForType:CPImagesPboardType]];
if ([images count]) if ([images count])
{
[self setImage:images[0]]; [self setImage:images[0]];
[self sendAction:[self action] to:[self target]];
}
} }
@end @end
+2 -2
View File
@@ -227,8 +227,8 @@ var SelectionColor = nil,
CGContextClosePath(context); CGContextClosePath(context);
CGContextSetShadowWithColor(context, CGSizeMake(0.0, 1.0), 1.1, _shadowColor || [CPColor whiteColor]); CGContextSetShadowWithColor(context, CGSizeMake(0.0, 1.0), 1.1, _shadowColor);
CGContextSetFillColor(context, _color || [CPColor blackColor]); CGContextSetFillColor(context, _color);
CGContextFillPath(context); CGContextFillPath(context);
} }
+2 -12
View File
@@ -52,10 +52,9 @@ var CPOutlineViewDataSource_outlineView_setObjectValue_forTableColumn_byItem_
var CPOutlineViewDelegate_outlineView_dataViewForTableColumn_item_ = 1 << 1, var CPOutlineViewDelegate_outlineView_dataViewForTableColumn_item_ = 1 << 1,
CPOutlineViewDelegate_outlineView_shouldSelectItem_ = 1 << 2, CPOutlineViewDelegate_outlineView_shouldSelectItem_ = 1 << 2;
CPOutlineViewDelegate_outlineView_heightOfRowByItem_ = 1 << 3, CPOutlineViewDelegate_outlineView_heightOfRowByItem_ = 1 << 3,
CPOutlineViewDelegate_outlineView_willDisplayView_forTableColumn_item_ = 1 << 4, CPOutlineViewDelegate_outlineView_willDisplayView_forTableColumn_item_ = 1 << 4;
CPOutlineViewDelegate_outlineView_isGroupItem_ = 1 << 5;
CPOutlineViewDropOnItemIndex = -1; CPOutlineViewDropOnItemIndex = -1;
@@ -470,9 +469,6 @@ CPOutlineViewDropOnItemIndex = -1;
if ([_outlineViewDelegate respondsToSelector:@selector(outlineView:willDisplayView:forTableColumn:item:)]) if ([_outlineViewDelegate respondsToSelector:@selector(outlineView:willDisplayView:forTableColumn:item:)])
_implementedOutlineViewDelegateMethods |= CPOutlineViewDelegate_outlineView_willDisplayView_forTableColumn_item_; _implementedOutlineViewDelegateMethods |= CPOutlineViewDelegate_outlineView_willDisplayView_forTableColumn_item_;
if ([_outlineViewDelegate respondsToSelector:@selector(outlineView:isGroupItem:)])
_implementedOutlineViewDelegateMethods |= CPOutlineViewDelegate_outlineView_isGroupItem_;
if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewColumnDidMove:)]) if ([_outlineViewDelegate respondsToSelector:@selector(outlineViewColumnDidMove:)])
[defaultCenter [defaultCenter
addObserver:_outlineViewDelegate addObserver:_outlineViewDelegate
@@ -1024,13 +1020,7 @@ var _loadItemInfoForItem = function(/*CPOutlineView*/ anOutlineView, /*id*/ anIt
} }
} }
- (BOOL)tableView:(CPTableView)aTableView isGroupRow:(int)row
{
if ((_outlineView._implementedOutlineViewDelegateMethods & CPOutlineViewDelegate_outlineView_isGroupItem_))
return [_outlineView._outlineViewDelegate outlineView:_outlineView isGroupItem:[_outlineView itemAtRow:theRow]];
return NO;
}
@end @end
-18
View File
@@ -152,15 +152,6 @@ CPDownArrowKeyCode = 40;
[_nextResponder performSelector:_cmd withObject:anEvent]; [_nextResponder performSelector:_cmd withObject:anEvent];
} }
/*!
Notifies the receiver that the user has clicked the right mouse down in its area.
@param anEvent contains information about the right click
*/
- (void)rightMouseDown:(CPEvent)anEvent
{
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*! /*!
Notifies the receiver that the user has initiated a drag Notifies the receiver that the user has initiated a drag
over it. A drag is a mouse movement while the left button is down. over it. A drag is a mouse movement while the left button is down.
@@ -180,15 +171,6 @@ CPDownArrowKeyCode = 40;
[_nextResponder performSelector:_cmd withObject:anEvent]; [_nextResponder performSelector:_cmd withObject:anEvent];
} }
/*!
Notifies the receiver that the user has released the right mouse button.
@param anEvent contains information about the release
*/
- (void)rightMouseUp:(CPEvent)anEvent
{
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*! /*!
Notifies the receiver that the user has moved the mouse (with no buttons down). Notifies the receiver that the user has moved the mouse (with no buttons down).
@param anEvent contains information about the movement @param anEvent contains information about the movement
+1 -5
View File
@@ -1,8 +1,8 @@
@import <Foundation/CPObject.j> @import <Foundation/CPObject.j>
#import "CoreGraphics/CGGeometry.h" #import "CoreGraphics/CGGeometry.h"
#import "Platform/Platform.h"
@implementation CPScreen : CPObject @implementation CPScreen : CPObject
{ {
@@ -10,11 +10,7 @@
- (CGRect)visibleFrame - (CGRect)visibleFrame
{ {
#if PLATFORM(DOM)
return _CGRectMake(window.screen.availLeft, window.screen.availTop, window.screen.availWidth, window.screen.availHeight); return _CGRectMake(window.screen.availLeft, window.screen.availTop, window.screen.availWidth, window.screen.availHeight);
#else
return _CGRectMakeZero();
#endif
} }
@end @end
+3 -2
View File
@@ -235,7 +235,7 @@ NAMES_FOR_PARTS[CPScrollerKnob] = @"knob";
*/ */
- (void)checkSpaceForParts - (void)checkSpaceForParts
{ {
var bounds = [self bounds]; var bounds = [self bounds];
// Assume we won't be needing the arrows. // Assume we won't be needing the arrows.
if (_knobProportion === 1.0) if (_knobProportion === 1.0)
@@ -290,7 +290,8 @@ NAMES_FOR_PARTS[CPScrollerKnob] = @"knob";
_partRects[CPScrollerDecrementLine] = _CGRectMakeZero(); _partRects[CPScrollerDecrementLine] = _CGRectMakeZero();
_partRects[CPScrollerKnobSlot] = _CGRectMake(trackInset.left, 0, width - trackInset.left - trackInset.right, height); _partRects[CPScrollerKnobSlot] = _CGRectMake(trackInset.left, 0, width - trackInset.left - trackInset.right, height);
} }
} }
else else
{ {
var decrementLineSize = [self currentValueForThemeAttribute:"decrement-line-size"], var decrementLineSize = [self currentValueForThemeAttribute:"decrement-line-size"],
+74 -50
View File
@@ -24,10 +24,26 @@
#include "Platform/Platform.h" #include "Platform/Platform.h"
CPSearchFieldRecentsTitleMenuItemTag = 1000; /*!
CPSearchFieldRecentsMenuItemTag = 1001; @global
CPSearchFieldClearRecentsMenuItemTag = 1002; @group Menu tags
CPSearchFieldNoRecentsMenuItemTag = 1003; */
CPSearchFieldRecentsTitleMenuItemTag = 1000;
/*!
@global
@group Menu tags
*/
CPSearchFieldRecentsMenuItemTag = 1001;
/*!
@global
@group Menu tags
*/
CPSearchFieldClearRecentsMenuItemTag = 1002;
/*!
@global
@group Menu tags
*/
CPSearchFieldNoRecentsMenuItemTag = 1003;
var CPSearchFieldSearchImage = nil, var CPSearchFieldSearchImage = nil,
CPSearchFieldFindImage = nil, CPSearchFieldFindImage = nil,
@@ -63,15 +79,16 @@ var CPSearchFieldSearchImage = nil,
return; return;
var bundle = [CPBundle bundleForClass:self]; var bundle = [CPBundle bundleForClass:self];
CPSearchFieldSearchImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldSearch.png"] size:CGSizeMake(25, 22)]; CPSearchFieldSearchImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldSearch.png"]];
CPSearchFieldFindImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldFind.png"] size:CGSizeMake(25, 22)]; CPSearchFieldFindImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldFind.png"]];
CPSearchFieldCancelImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancel.png"] size:CGSizeMake(22, 22)]; CPSearchFieldCancelImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancel.png"]];
CPSearchFieldCancelPressedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancelPressed.png"] size:CGSizeMake(22, 22)]; CPSearchFieldCancelPressedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancelPressed.png"]];
} }
- (id)initWithFrame:(CGRect)frame - (id)initWithFrame:(CPRect)frame
{ {
if (self = [super initWithFrame:frame]) self = [super initWithFrame:frame];
if (self != nil)
{ {
_recentSearches = [CPArray array]; _recentSearches = [CPArray array];
_maximumRecents = 10; _maximumRecents = 10;
@@ -79,33 +96,47 @@ var CPSearchFieldSearchImage = nil,
_sendsSearchStringImmediately = NO; _sendsSearchStringImmediately = NO;
_recentsAutosaveName = nil; _recentsAutosaveName = nil;
[self _initWithFrame:frame]; [self setBezeled:YES];
[self setBezelStyle:CPTextFieldRoundedBezel];
[self setBordered:YES];
[self setEditable:YES];
[self setDelegate:self];
_cancelButton = [[CPButton alloc] initWithFrame:CPMakeRect(frame.size.width - 27,(frame.size.height-22)/2,22,22)];
[self resetCancelButton];
[_cancelButton setHidden:YES];
[_cancelButton setAutoresizingMask:CPViewMinXMargin];
[self addSubview:_cancelButton];
_searchButton = [[CPButton alloc] initWithFrame:CPMakeRect(5,(frame.size.height-25)/2,25,25)];
[self resetSearchButton];
[self addSubview:_searchButton];
#if PLATFORM(DOM) #if PLATFORM(DOM)
_cancelButton._DOMElement.style.cursor = "default"; _cancelButton._DOMElement.style.cursor = "default";
_searchButton._DOMElement.style.cursor = "default"; _searchButton._DOMElement.style.cursor = "default";
#endif #endif
} }
return self; return self;
} }
- (void)_initWithFrame:(CGRect)frame - (id)copy
{ {
[self setBezeled:YES]; var copy = [super copy];
[self setBezelStyle:CPTextFieldRoundedBezel];
[self setBordered:YES];
[self setEditable:YES];
[self setDelegate:self];
_cancelButton = [[CPButton alloc] initWithFrame:CGRectMake(frame.size.width - 27,(frame.size.height-22)/2,22,22)]; [copy setCancelButton:[_cancelButton copy]];
[self resetCancelButton]; [copy setSearchButton:[_searchButton copy]];
[_cancelButton setHidden:YES]; [copy setSendsWholeSearchString:[_sendsWholeSearchString copy]];
[_cancelButton setAutoresizingMask:CPViewMinXMargin]; [copy setSendsSearchStringImmediately:[_sendsSearchStringImmediately copy]];
[self addSubview:_cancelButton]; [copy setMaximumRecents:_maximumRecents];
if (_recentsAutosaveName)
[copy setrecentsAutosaveName:[_recentsAutosaveName copy]];
if (_searchMenuTemplate)
[copy setSearchMenutemplate:[_searchMenuTemplate copy]];
_searchButton = [[CPButton alloc] initWithFrame:CGRectMake(5,(frame.size.height-25)/2,25,25)]; return copy;
[self resetSearchButton];
[self addSubview:_searchButton];
} }
// Managing Buttons // Managing Buttons
@@ -664,7 +695,9 @@ var CPSearchFieldSearchImage = nil,
@end @end
var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey", var CPSearchButtonKey = @"CPSearchButtonKey",
CPCancelButtonKey = @"CPCancelButtonKey",
CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
CPSendsWholeSearchStringKey = @"CPSendsWholeSearchStringKey", CPSendsWholeSearchStringKey = @"CPSendsWholeSearchStringKey",
CPSendsSearchStringImmediatelyKey = @"CPSendsSearchStringImmediatelyKey", CPSendsSearchStringImmediatelyKey = @"CPSendsSearchStringImmediatelyKey",
CPMaximumRecentsKey = @"CPMaximumRecentsKey", CPMaximumRecentsKey = @"CPMaximumRecentsKey",
@@ -674,20 +707,13 @@ var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
- (void)encodeWithCoder:(CPCoder)coder - (void)encodeWithCoder:(CPCoder)coder
{ {
[_searchButton removeFromSuperview];
[_cancelButton removeFromSuperview];
[super encodeWithCoder:coder]; [super encodeWithCoder:coder];
if (_searchButton) [coder encodeObject:_searchButton forKey:CPSearchButtonKey];
[self addSubview:_searchButton]; [coder encodeObject:_cancelButton forKey:CPCancelButtonKey];
if (_cancelButton)
[self addSubview:_cancelButton];
[coder encodeBool:_sendsWholeSearchString forKey:CPSendsWholeSearchStringKey]; [coder encodeBool:_sendsWholeSearchString forKey:CPSendsWholeSearchStringKey];
[coder encodeBool:_sendsSearchStringImmediately forKey:CPSendsSearchStringImmediatelyKey]; [coder encodeBool:_sendsSearchStringImmediately forKey:CPSendsSearchStringImmediatelyKey];
[coder encodeInt:_maximumRecents forKey:CPMaximumRecentsKey]; [coder encodeInt:_maximumRecents forKey:CPMaximumRecentsKey];
if (_recentsAutosaveName) if (_recentsAutosaveName)
[coder encodeObject:_recentsAutosaveName forKey:CPRecentsAutosaveNameKey]; [coder encodeObject:_recentsAutosaveName forKey:CPRecentsAutosaveNameKey];
if (_searchMenuTemplate) if (_searchMenuTemplate)
@@ -696,21 +722,19 @@ var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
- (id)initWithCoder:(CPCoder)coder - (id)initWithCoder:(CPCoder)coder
{ {
if (self = [super initWithCoder:coder]) self = [super initWithCoder:coder];
{
[self _initWithFrame:[self frame]];
_recentsAutosaveName = [coder decodeObjectForKey:CPRecentsAutosaveNameKey]; _searchButton = [coder decodeObjectForKey:CPSearchButtonKey];
_sendsWholeSearchString = [coder decodeBoolForKey:CPSendsWholeSearchStringKey]; _cancelButton = [coder decodeObjectForKey:CPCancelButtonKey];
_sendsSearchStringImmediately = [coder decodeBoolForKey:CPSendsSearchStringImmediatelyKey]; _recentsAutosaveName = [coder decodeObjectForKey:CPRecentsAutosaveNameKey];
_maximumRecents = [coder decodeIntForKey:CPMaximumRecentsKey]; _sendsWholeSearchString = [coder decodeBoolForKey:CPSendsWholeSearchStringKey];
_sendsSearchStringImmediately = [coder decodeBoolForKey:CPSendsSearchStringImmediatelyKey];
_maximumRecents = [coder decodeIntForKey:CPMaximumRecentsKey];
var template = [coder decodeObjectForKey:CPSearchMenuTemplateKey];
if (template)
[self setSearchMenuTemplate:template];
var template = [coder decodeObjectForKey:CPSearchMenuTemplateKey]; [self setDelegate:self];
if (template)
[self setSearchMenuTemplate:template];
[self setDelegate:self];
}
return self; return self;
} }
+18 -152
View File
@@ -20,7 +20,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
@import "CPButtonBar.j"
@import "CPImage.j" @import "CPImage.j"
@import "CPView.j" @import "CPView.j"
@@ -56,8 +55,6 @@ var CPSplitViewHorizontalImage = nil,
int _drawingDivider; int _drawingDivider;
BOOL _needsResizeSubviews; BOOL _needsResizeSubviews;
CPArray _buttonBars;
} }
/* /*
@@ -80,7 +77,6 @@ var CPSplitViewHorizontalImage = nil,
_currentDivider = CPNotFound; _currentDivider = CPNotFound;
_DOMDividerElements = []; _DOMDividerElements = [];
_buttonBars = [];
[self _setVertical:YES]; [self _setVertical:YES];
} }
@@ -213,6 +209,11 @@ var CPSplitViewHorizontalImage = nil,
{ {
_DOMDividerElements[_drawingDivider] = document.createElement("div"); _DOMDividerElements[_drawingDivider] = document.createElement("div");
if(_isVertical)
_DOMDividerElements[_drawingDivider].style.cursor = [[CPCursor resizeLeftRightCursor] _cssString];
else
_DOMDividerElements[_drawingDivider].style.cursor = [[CPCursor resizeUpDownCursor] _cssString];
_DOMDividerElements[_drawingDivider].style.position = "absolute"; _DOMDividerElements[_drawingDivider].style.position = "absolute";
_DOMDividerElements[_drawingDivider].style.backgroundRepeat = "repeat"; _DOMDividerElements[_drawingDivider].style.backgroundRepeat = "repeat";
@@ -278,25 +279,15 @@ var CPSplitViewHorizontalImage = nil,
var frame = [_subviews[anIndex] frame], var frame = [_subviews[anIndex] frame],
startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent], startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent],
effectiveRect = [self effectiveRectOfDividerAtIndex:anIndex], effectiveRect = [self effectiveRectOfDividerAtIndex:anIndex],
buttonBar = _buttonBars[anIndex],
buttonBarRect = null,
additionalRect = null; additionalRect = null;
if (buttonBar != null)
{
buttonBarRect = [buttonBar resizeControlFrame];
buttonBarRect.origin = [self convertPoint:buttonBarRect.origin fromView:buttonBar];
}
if ([_delegate respondsToSelector:@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)]) if ([_delegate respondsToSelector:@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)])
effectiveRect = [_delegate splitView:self effectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex]; effectiveRect = [_delegate splitView:self effectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex];
if ([_delegate respondsToSelector:@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)]) if ([_delegate respondsToSelector:@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)])
additionalRect = [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex]; additionalRect = [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex];
return CGRectContainsPoint(effectiveRect, aPoint) || return CGRectContainsPoint(effectiveRect, aPoint) || (additionalRect && CGRectContainsPoint(additionalRect, aPoint));
(additionalRect && CGRectContainsPoint(additionalRect, aPoint)) ||
(buttonBarRect && CGRectContainsPoint(buttonBarRect, aPoint));
} }
- (CPView)hitTest:(CGPoint)aPoint - (CPView)hitTest:(CGPoint)aPoint
@@ -329,7 +320,6 @@ var CPSplitViewHorizontalImage = nil,
if (_currentDivider != CPNotFound) if (_currentDivider != CPNotFound)
{ {
_currentDivider = CPNotFound; _currentDivider = CPNotFound;
[self _updateResizeCursor:anEvent];
[self _postNotificationDidResize]; [self _postNotificationDidResize];
} }
@@ -390,8 +380,6 @@ var CPSplitViewHorizontalImage = nil,
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil]; var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
[self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider]; [self setPosition:(point[_originComponent] + _initialOffset) ofDividerAtIndex:_currentDivider];
// Cursor might change if we reach a resize limit.
[self _updateResizeCursor:anEvent];
} }
[CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES]; [CPApp setTarget:self selector:@selector(trackDivider:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
@@ -403,74 +391,6 @@ var CPSplitViewHorizontalImage = nil,
[self trackDivider:anEvent]; [self trackDivider:anEvent];
} }
- (void)viewDidMoveToWindow
{
// Enable split view resize cursors. Commented out pending CPTrackingArea implementation.
//[[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseEntered:(CPEvent)anEvent
{
// Tracking code handles cursor by itself.
if (_currentDivider == CPNotFound)
[self _updateResizeCursor:anEvent];
}
- (void)mouseMoved:(CPEvent)anEvent
{
if (_currentDivider == CPNotFound)
[self _updateResizeCursor:anEvent];
}
- (void)mouseExited:(CPEvent)anEvent
{
if (_currentDivider == CPNotFound)
// FIXME: we should use CPCursor push/pop (if previous currentCursor != arrow).
[[CPCursor arrowCursor] set];
}
- (void)_updateResizeCursor:(CPEvent)anEvent
{
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
if ([anEvent type] === CPLeftMouseUp && ![[self window] acceptsMouseMovedEvents])
{
[[CPCursor arrowCursor] set];
return;
}
for (var i = 0, count = [_subviews count] - 1; i < count; i++)
{
// If we are currently tracking, keep the resize cursor active even outside of hit areas.
if (_currentDivider === i || (_currentDivider == CPNotFound && [self cursorAtPoint:point hitDividerAtIndex:i]))
{
var frame = [_subviews[i] frame],
startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent],
canShrink = [self _realPositionForPosition:startPosition-1 ofDividerAtIndex:i] < startPosition,
canGrow = [self _realPositionForPosition:startPosition+1 ofDividerAtIndex:i] > startPosition,
cursor = [CPCursor arrowCursor];
if (_isVertical && canShrink && canGrow)
cursor = [CPCursor resizeLeftRightCursor];
else if (_isVertical && canShrink)
cursor = [CPCursor resizeLeftCursor];
else if (_isVertical && canGrow)
cursor = [CPCursor resizeRightCursor];
else if (canShrink && canGrow)
cursor = [CPCursor resizeUpDownCursor];
else if (canShrink)
cursor = [CPCursor resizeUpCursor];
else if (canGrow)
cursor = [CPCursor resizeDownCursor];
[cursor set];
return;
}
}
[[CPCursor arrowCursor] set];
}
- (float)maxPossiblePositionOfDividerAtIndex:(int)dividerIndex - (float)maxPossiblePositionOfDividerAtIndex:(int)dividerIndex
{ {
var frame = [_subviews[dividerIndex + 1] frame]; var frame = [_subviews[dividerIndex + 1] frame];
@@ -493,8 +413,10 @@ var CPSplitViewHorizontalImage = nil,
return 0; return 0;
} }
- (int)_realPositionForPosition:(float)position ofDividerAtIndex:(int)dividerIndex - (void)setPosition:(float)position ofDividerAtIndex:(int)dividerIndex
{ {
[self _adjustSubviewsWithCalculatedSize];
// not sure where this should override other positions? // not sure where this should override other positions?
if ([_delegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)]) if ([_delegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)])
position = [_delegate splitView:self constrainSplitPosition:position ofSubviewAt:dividerIndex]; position = [_delegate splitView:self constrainSplitPosition:position ofSubviewAt:dividerIndex];
@@ -510,28 +432,19 @@ var CPSplitViewHorizontalImage = nil,
if([_delegate respondsToSelector:@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)]) if([_delegate respondsToSelector:@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)])
actualMax = [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex]; actualMax = [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
var viewA = _subviews[dividerIndex], var frame = [self frame],
realPosition = MAX(MIN(position, actualMax), actualMin); viewA = _subviews[dividerIndex],
frameA = [viewA frame],
viewB = _subviews[dividerIndex + 1],
frameB = [viewB frame];
var realPosition = MAX(MIN(position, actualMax), actualMin);
if (position < proposedMin + (actualMin - proposedMin) / 2) if (position < proposedMin + (actualMin - proposedMin) / 2)
if ([_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)]) if ([_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)])
if ([_delegate splitView:self canCollapseSubview:viewA]) if ([_delegate splitView:self canCollapseSubview:viewA])
realPosition = proposedMin; realPosition = proposedMin;
return realPosition;
}
- (void)setPosition:(float)position ofDividerAtIndex:(int)dividerIndex
{
[self _adjustSubviewsWithCalculatedSize];
var realPosition = [self _realPositionForPosition:position ofDividerAtIndex:dividerIndex];
var viewA = _subviews[dividerIndex],
frameA = [viewA frame],
viewB = _subviews[dividerIndex + 1],
frameB = [viewB frame];
frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent]; frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent];
[_subviews[dividerIndex] setFrame:frameA]; [_subviews[dividerIndex] setFrame:frameA];
@@ -640,47 +553,6 @@ var CPSplitViewHorizontalImage = nil,
object:self]; object:self];
} }
/*!
Set the button bar who's resize control should act as a control for this splitview.
Each divider can have at most one button bar assigned to it, and that button bar must be
a subview of one of the split view's subviews.
Calling this method with nil as the button bar will remove any currently assigned button bar
for the divider at that index. Indexes will not be adjusted as new subviews are added, so you
should usually call this method after adding all the desired subviews to the split view.
This method will automatically configure the hasResizeControl and resizeControlIsLeftAligned
parameters of the button bar, and will override any currently set values.
*/
- (void)setButtonBar:(CPButtonBar)aButtonBar forDividerAtIndex:(unsigned)dividerIndex
{
if (!aButtonBar)
{
_buttonBars[dividerIndex] = nil;
return;
}
var view = [aButtonBar superview],
subview = aButtonBar;
while (view && view !== self)
{
subview = view;
view = [view superview];
}
if (view !== self)
[CPException raise:CPInvalidArgumentException
reason:@"CPSplitView button bar must be a subview of the split view."];
var viewIndex = [[self subviews] indexOfObject:subview];
[aButtonBar setHasResizeControl:YES];
[aButtonBar setResizeControlIsLeftAligned:dividerIndex < viewIndex];
_buttonBars[dividerIndex] = aButtonBar;
}
- (void)_postNotificationWillResize - (void)_postNotificationWillResize
{ {
[[CPNotificationCenter defaultCenter] postNotificationName:CPSplitViewWillResizeSubviewsNotification object:self]; [[CPNotificationCenter defaultCenter] postNotificationName:CPSplitViewWillResizeSubviewsNotification object:self];
@@ -695,8 +567,7 @@ var CPSplitViewHorizontalImage = nil,
var CPSplitViewDelegateKey = "CPSplitViewDelegateKey", var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
CPSplitViewIsVerticalKey = "CPSplitViewIsVerticalKey", CPSplitViewIsVerticalKey = "CPSplitViewIsVerticalKey",
CPSplitViewIsPaneSplitterKey = "CPSplitViewIsPaneSplitterKey", CPSplitViewIsPaneSplitterKey = "CPSplitViewIsPaneSplitterKey";
CPSplitViewButtonBarsKey = "CPSplitViewButtonBarsKey";
@implementation CPSplitView (CPCoding) @implementation CPSplitView (CPCoding)
@@ -714,9 +585,7 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
_DOMDividerElements = []; _DOMDividerElements = [];
_buttonBars = [aCoder decodeObjectForKey:CPSplitViewButtonBarsKey] || []; _delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey];;
_delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey];
_isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey]; _isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey];
[self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]]; [self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]];
@@ -733,9 +602,6 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
{ {
[super encodeWithCoder:aCoder]; [super encodeWithCoder:aCoder];
//FIXME how should we handle this?
//[aCoder encodeObject:_buttonBars forKey:CPSplitViewButtonBarsKey];
[aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey]; [aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey];
[aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey]; [aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey];
+2 -2
View File
@@ -81,8 +81,8 @@ CPTableColumnUserResizingMask = 1 << 1;
var textDataView = [CPTextField new]; var textDataView = [CPTextField new];
[textDataView setLineBreakMode:CPLineBreakByTruncatingTail]; [textDataView setLineBreakMode:CPLineBreakByTruncatingTail];
[textDataView setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"text-color"]; [textDataView setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"text-color"];
[textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateSelected]; [textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateHighlighted];
[textDataView setValue:[CPFont boldSystemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateSelected]; [textDataView setValue:[CPFont boldSystemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateHighlighted];
[textDataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"]; [textDataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"];
[self setDataView:textDataView]; [self setDataView:textDataView];
} }
+24 -20
View File
@@ -24,6 +24,8 @@
@import "CPTableView.j" @import "CPTableView.j"
@import "CPView.j" @import "CPView.j"
var CPThemeStatePressed = CPThemeState("pressed");
@implementation _CPTableColumnHeaderView : CPView @implementation _CPTableColumnHeaderView : CPView
{ {
_CPImageAndTextView _textField; _CPImageAndTextView _textField;
@@ -60,11 +62,11 @@
{ {
var themeState = [self themeState]; var themeState = [self themeState];
if(themeState & CPThemeStateSelected && themeState & CPThemeStateHighlighted) if(themeState & CPThemeStateHighlighted && themeState & CPThemeStatePressed)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted-pressed.png", CGSizeMake(1.0, 22.0))]]; [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted-pressed.png", CGSizeMake(1.0, 22.0))]];
else if (themeState & CPThemeStateSelected)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted.png", CGSizeMake(1.0, 22.0))]];
else if (themeState & CPThemeStateHighlighted) else if (themeState & CPThemeStateHighlighted)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted.png", CGSizeMake(1.0, 22.0))]];
else if (themeState & CPThemeStatePressed)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-pressed.png", CGSizeMake(1.0, 22.0))]]; [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-pressed.png", CGSizeMake(1.0, 22.0))]];
else else
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]]; [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
@@ -158,24 +160,21 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
CPTableView _tableView @accessors(property=tableView); CPTableView _tableView @accessors(property=tableView);
} }
- (void)_init - (void)initWithFrame:(CGRect)aFrame
{
_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]; self = [super initWithFrame:aFrame];
if (self) if (self)
[self _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))]];
}
return self; return self;
} }
@@ -222,13 +221,13 @@ var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringVal
if (_pressedColumn != -1) if (_pressedColumn != -1)
{ {
var headerView = [_tableView._tableColumns[_pressedColumn] headerView]; var headerView = [_tableView._tableColumns[_pressedColumn] headerView];
[headerView unsetThemeState:CPThemeStateHighlighted]; [headerView unsetThemeState:CPThemeStatePressed];
} }
if (column != -1) if (column != -1)
{ {
var headerView = [_tableView._tableColumns[column] headerView]; var headerView = [_tableView._tableColumns[column] headerView];
[headerView setThemeState:CPThemeStateHighlighted]; [headerView setThemeState:CPThemeStatePressed];
} }
_pressedColumn = column; _pressedColumn = column;
@@ -482,7 +481,12 @@ var CPTableHeaderViewTableViewKey = @"CPTableHeaderViewTableViewKey";
{ {
if (self = [super initWithCoder:aCoder]) if (self = [super initWithCoder:aCoder])
{ {
[self _init]; _resizedColumn = -1;
_draggedColumn = -1;
_pressedColumn = -1;
_draggedDistance = 0.0;
_lastLocation = nil;
_columnOldWidth = nil;
_tableView = [aCoder decodeObjectForKey:CPTableHeaderViewTableViewKey]; _tableView = [aCoder decodeObjectForKey:CPTableHeaderViewTableViewKey];
} }
+76 -64
View File
@@ -67,29 +67,29 @@ var CPTableViewDelegate_selectionShouldChangeInTableView_
CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 19; CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 19;
//CPTableViewDraggingDestinationFeedbackStyles //CPTableViewDraggingDestinationFeedbackStyles
CPTableViewDraggingDestinationFeedbackStyleNone = -1; CPTableViewDraggingDestinationFeedbackStyleNone = -1,
CPTableViewDraggingDestinationFeedbackStyleRegular = 0; CPTableViewDraggingDestinationFeedbackStyleRegular = 0,
CPTableViewDraggingDestinationFeedbackStyleSourceList = 1; CPTableViewDraggingDestinationFeedbackStyleSourceList = 1;
//CPTableViewDropOperations //CPTableViewDropOperations
CPTableViewDropOn = 0; CPTableViewDropOn = 0,
CPTableViewDropAbove = 1; CPTableViewDropAbove = 1;
// TODO: add docs // TODO: add docs
CPTableViewSelectionHighlightStyleNone = -1; CPTableViewSelectionHighlightStyleNone = -1,
CPTableViewSelectionHighlightStyleRegular = 0; CPTableViewSelectionHighlightStyleRegular = 0,
CPTableViewSelectionHighlightStyleSourceList = 1; CPTableViewSelectionHighlightStyleSourceList = 1;
CPTableViewGridNone = 0; CPTableViewGridNone = 0;
CPTableViewSolidVerticalGridLineMask = 1 << 0; CPTableViewSolidVerticalGridLineMask = 1 << 0;
CPTableViewSolidHorizontalGridLineMask = 1 << 1; CPTableViewSolidHorizontalGridLineMask = 1 << 1;
CPTableViewNoColumnAutoresizing = 0; CPTableViewNoColumnAutoresizing = 0,
CPTableViewUniformColumnAutoresizingStyle = 1; CPTableViewUniformColumnAutoresizingStyle = 1,
CPTableViewSequentialColumnAutoresizingStyle = 2; CPTableViewSequentialColumnAutoresizingStyle = 2,
CPTableViewReverseSequentialColumnAutoresizingStyle = 3; CPTableViewReverseSequentialColumnAutoresizingStyle = 3,
CPTableViewLastColumnOnlyAutoresizingStyle = 4; CPTableViewLastColumnOnlyAutoresizingStyle = 4,
CPTableViewFirstColumnOnlyAutoresizingStyle = 5; CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
@@ -194,17 +194,15 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
SEL _doubleAction; SEL _doubleAction;
unsigned _columnAutoResizingStyle; unsigned _columnAutoResizingStyle;
int _lastTrackedRowIndex;
CGPoint _originalMouseDownPoint; CGPoint _originalMouseDownPoint;
BOOL _verticalMotionCanDrag; BOOL _verticalMotionCanDrag;
unsigned _destinationDragStyle; unsigned _destinationDragStyle;
BOOL _isSelectingSession; BOOL _isSelectingSession;
CPIndexSet _draggedRowIndexes; CPIndexSet _draggedRowIndexes;
_dropOperationDrawingView _dropOperationFeedbackView;
_CPDropOperationDrawingView _dropOperationFeedbackView; CPDragOperation _dragOperationDefaultMask;
CPDragOperation _dragOperationDefaultMask; int _retargetedDropRow;
int _retargetedDropRow; CPDragOperation _retargetedDropOperation;
CPDragOperation _retargetedDropOperation;
BOOL _disableAutomaticResizing @accessors(property=disableAutomaticResizing); BOOL _disableAutomaticResizing @accessors(property=disableAutomaticResizing);
BOOL _lastColumnShouldSnap; BOOL _lastColumnShouldSnap;
@@ -278,13 +276,16 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
_retargetedDropOperation = nil; _retargetedDropOperation = nil;
_dragOperationDefaultMask = nil; _dragOperationDefaultMask = nil;
_destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleRegular; _destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleRegular;
_dropOperationFeedbackView = [[_dropOperationDrawingView alloc] initWithFrame:_CGRectMakeZero()];
[self addSubview:_dropOperationFeedbackView];
[_dropOperationFeedbackView setHidden:YES];
[_dropOperationFeedbackView setTableView:self];
_tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self]; _tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self];
[_tableDrawView setBackgroundColor:[CPColor clearColor]]; [_tableDrawView setBackgroundColor:[CPColor clearColor]];
[self addSubview:_tableDrawView]; [self addSubview:_tableDrawView];
[self setBackgroundColor:[CPColor whiteColor]];
[self _init]; [self _init];
} }
return self; return self;
@@ -293,10 +294,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
// FIX ME: we have a lot of redundent init stuff in initWithFrame: and initWithCoder: we should move it all into here. // FIX ME: we have a lot of redundent init stuff in initWithFrame: and initWithCoder: we should move it all into here.
- (void)_init - (void)_init
{ {
_dropOperationFeedbackView = [[_CPDropOperationDrawingView alloc] initWithFrame:_CGRectMakeZero()];
[_dropOperationFeedbackView setTableView:self];
_lastColumnShouldSnap = NO; _lastColumnShouldSnap = NO;
_backgroundColor = [CPColor whiteColor];
// Gradients for the source list // Gradients for the source list
_sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [89.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2); _sourceListActiveGradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [89.0/255.0, 153.0/255.0, 209.0/255.0,1.0, 33.0/255.0, 94.0/255.0, 208.0/255.0,1.0], [0,1], 2);
@@ -808,7 +807,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
{ {
var rowIndex = deselectRows[count]; var rowIndex = deselectRows[count];
var view = dataViewsInTableColumn[rowIndex]; var view = dataViewsInTableColumn[rowIndex];
[view unsetThemeState:CPThemeStateSelected]; [view unsetThemeState:CPThemeStateHighlighted];
} }
count = selectRows.length; count = selectRows.length;
@@ -816,7 +815,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
{ {
var rowIndex = selectRows[count]; var rowIndex = selectRows[count];
var view = dataViewsInTableColumn[rowIndex]; var view = dataViewsInTableColumn[rowIndex];
[view setThemeState:CPThemeStateSelected]; [view setThemeState:CPThemeStateHighlighted];
} }
} }
} }
@@ -848,13 +847,13 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
{ {
var rowIndex = selectRows[i], var rowIndex = selectRows[i],
dataView = dataViewsInTableColumn[rowIndex]; dataView = dataViewsInTableColumn[rowIndex];
[dataView unsetThemeState:CPThemeStateSelected]; [dataView unsetThemeState:CPThemeStateHighlighted];
} }
if (_headerView) if (_headerView)
{ {
var headerView = [_tableColumns[columnIndex] headerView]; var headerView = [_tableColumns[columnIndex] headerView];
[headerView unsetThemeState:CPThemeStateSelected]; [headerView unsetThemeState:CPThemeStateHighlighted];
} }
} }
@@ -869,21 +868,16 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
{ {
var rowIndex = selectRows[i], var rowIndex = selectRows[i],
dataView = dataViewsInTableColumn[rowIndex]; dataView = dataViewsInTableColumn[rowIndex];
[dataView setThemeState:CPThemeStateSelected]; [dataView setThemeState:CPThemeStateHighlighted];
} }
if (_headerView) if (_headerView)
{ {
var headerView = [_tableColumns[columnIndex] headerView]; var headerView = [_tableColumns[columnIndex] headerView];
[headerView setThemeState:CPThemeStateSelected]; [headerView setThemeState:CPThemeStateHighlighted];
} }
} }
} }
- (int)selectedColumn
{
[_selectedColumnIndexes lastIndex];
}
- (CPIndexSet)selectedColumnIndexes - (CPIndexSet)selectedColumnIndexes
{ {
return _selectedColumnIndexes; return _selectedColumnIndexes;
@@ -1744,10 +1738,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
if (_headerView) if (_headerView)
{ {
if (_currentHighlightedTableColumn != nil) if (_currentHighlightedTableColumn != nil)
[[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateSelected]; [[_currentHighlightedTableColumn headerView] unsetThemeState:CPThemeStateHighlighted];
if (aTableColumn != nil) if (aTableColumn != nil)
[[aTableColumn headerView] setThemeState:CPThemeStateSelected]; [[aTableColumn headerView] setThemeState:CPThemeStateHighlighted];
} }
_currentHighlightedTableColumn = aTableColumn; _currentHighlightedTableColumn = aTableColumn;
@@ -1763,37 +1757,56 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
return YES; 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)]; 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], var bounds = [self bounds],
view = [[CPView alloc] initWithFrame:bounds]; view = [[CPView alloc] initWithFrame:bounds];
[view setBackgroundColor:[CPColor clearColor]];
[view setAlphaValue:0.7]; [view setAlphaValue:0.7];
// We have to fetch all the data views for the selected rows and columns // 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 // 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) // to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
var columnIndex = [theTableColumns count]; var firstExposedColumn = [_exposedColumns firstIndex],
firstExposedRow = [_exposedRows firstIndex],
exposedColumnsLength = [_exposedColumns lastIndex] - firstExposedColumn + 1,
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--) while (columnIndex--)
{ {
var tableColumn = [theTableColumns objectAtIndex:columnIndex], var column = columns[columnIndex],
row = [theDraggedRows firstIndex]; tableColumn = [_tableColumns objectAtIndex:column],
rowIndex = [rows count];
while (row !== CPNotFound) while (rowIndex--)
{ {
var row = rows[rowIndex];
var dataView = [self _newDataViewForRow:row tableColumn:tableColumn]; var dataView = [self _newDataViewForRow:row tableColumn:tableColumn];
[dataView setFrame:[self frameOfDataViewAtColumn:columnIndex row:row]]; [dataView setBackgroundColor:[CPColor clearColor]];
[dataView setFrame:[self frameOfDataViewAtColumn:column row:row]];
[dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]]; [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
[view addSubview:dataView]; [view addSubview:dataView];
row = [theDraggedRows indexGreaterThanIndex:row];
} }
} }
@@ -1978,7 +1991,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
// Now clear all the leftovers // Now clear all the leftovers
// FIXME: this could be faster! // FIXME: this could be faster!
for (var identifier in _cachedDataViews) for (identifier in _cachedDataViews)
{ {
var dataViews = _cachedDataViews[identifier], var dataViews = _cachedDataViews[identifier],
count = dataViews.length; count = dataViews.length;
@@ -2065,9 +2078,9 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
[dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]]; [dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
if (isColumnSelected || [self isRowSelected:row]) if (isColumnSelected || [self isRowSelected:row])
[dataView setThemeState:CPThemeStateSelected]; [dataView setThemeState:CPThemeStateHighlighted];
else else
[dataView unsetThemeState:CPThemeStateSelected]; [dataView unsetThemeState:CPThemeStateHighlighted];
if (_implementedDelegateMethods & CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_) if (_implementedDelegateMethods & CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_)
[_delegate tableView:self willDisplayView:dataView forTableColumn:tableColumn row:row]; [_delegate tableView:self willDisplayView:dataView forTableColumn:tableColumn row:row];
@@ -2136,12 +2149,12 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
} }
} }
- (void)_commitDataViewObjectValue:(id)sender - (void)_commitDataViewObjectValue:(CPTextView)sender
{ {
[_dataSource tableView:self setObjectValue:[sender objectValue] forTableColumn:sender.tableViewEditedColumnObj row:sender.tableViewEditedRowIndex]; [_dataSource tableView:self
setObjectValue:[sender objectValue]
if ([sender respondsToSelector:@selector(setEditable:)]) forTableColumn:sender.tableViewEditedColumnObj
[sender setEditable:NO]; row:sender.tableViewEditedRowIndex];
} }
- (CPView)_newDataViewForRow:(CPInteger)aRow tableColumn:(CPTableColumn)aTableColumn - (CPView)_newDataViewForRow:(CPInteger)aRow tableColumn:(CPTableColumn)aTableColumn
@@ -2200,7 +2213,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
- (void)drawBackgroundInClipRect:(CGRect)aRect - (void)drawBackgroundInClipRect:(CGRect)aRect
{ {
if (!_usesAlternatingRowBackgroundColors) if (!_usesAlternatingRowBackgroundColors)
{
var context = [[CPGraphicsContext currentContext] graphicsPort];
CGContextSetFillColor(context, _backgroundColor);
CGContextFillRect(context, aRect);
return; return;
}
var rowColors = [self alternatingRowBackgroundColors], var rowColors = [self alternatingRowBackgroundColors],
@@ -2629,11 +2649,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
} }
_isSelectingSession = YES; _isSelectingSession = YES;
if(row >= 0 && row !== _lastTrackedRowIndex) if(row >= 0)
{
_lastTrackedRowIndex = row;
[self _updateSelectionWithMouseAtRow:row]; [self _updateSelectionWithMouseAtRow:row];
}
if ((_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_) if ((_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_)
&& !_trackingPointMovedOutOfClickSlop) && !_trackingPointMovedOutOfClickSlop)
@@ -2743,7 +2760,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
*/ */
- (void)draggingExited:(id)sender - (void)draggingExited:(id)sender
{ {
[_dropOperationFeedbackView removeFromSuperview]; [_dropOperationFeedbackView setHidden:YES];
} }
/* /*
@@ -2759,7 +2776,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
_retargetedDropOperation = nil; _retargetedDropOperation = nil;
_retargetedDropRow = nil; _retargetedDropRow = nil;
_draggedRowIndexes = [CPIndexSet indexSet]; _draggedRowIndexes = [CPIndexSet indexSet];
[_dropOperationFeedbackView removeFromSuperview]; [_dropOperationFeedbackView setHidden:YES];
} }
/* /*
@ignore @ignore
@@ -2892,7 +2909,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
{ {
// FIX ME: is there anything else that needs to happen here? // FIX ME: is there anything else that needs to happen here?
// actual validation is called in dragginUpdated: // actual validation is called in dragginUpdated:
[_dropOperationFeedbackView removeFromSuperview]; [_dropOperationFeedbackView setHidden:YES];
return (_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_); return (_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_);
} }
@@ -3168,7 +3185,6 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
CPTableViewGridColorKey = @"CPTableViewGridColorKey", CPTableViewGridColorKey = @"CPTableViewGridColorKey",
CPTableViewGridStyleMaskKey = @"CPTableViewGridStyleMaskKey", CPTableViewGridStyleMaskKey = @"CPTableViewGridStyleMaskKey",
CPTableViewUsesAlternatingBackgroundKey = @"CPTableViewUsesAlternatingBackgroundKey", CPTableViewUsesAlternatingBackgroundKey = @"CPTableViewUsesAlternatingBackgroundKey",
CPTableViewAlternatingRowColorsKey = @"CPTableViewAlternatingRowColorsKey",
CPTableViewHeaderViewKey = @"CPTableViewHeaderViewKey", CPTableViewHeaderViewKey = @"CPTableViewHeaderViewKey",
CPTableViewCornerViewKey = @"CPTableViewCornerViewKey"; CPTableViewCornerViewKey = @"CPTableViewCornerViewKey";
@@ -3219,9 +3235,6 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
_gridColor = [aCoder decodeObjectForKey:CPTableViewGridColorKey] || [CPColor grayColor]; _gridColor = [aCoder decodeObjectForKey:CPTableViewGridColorKey] || [CPColor grayColor];
_gridStyleMask = [aCoder decodeIntForKey:CPTableViewGridStyleMaskKey] || CPTableViewGridNone; _gridStyleMask = [aCoder decodeIntForKey:CPTableViewGridStyleMaskKey] || CPTableViewGridNone;
_alternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewAlternatingRowColorsKey];
_usesAlternatingRowBackgroundColors = [aCoder decodeObjectForKey:CPTableViewUsesAlternatingBackgroundKey]
_headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey]; _headerView = [aCoder decodeObjectForKey:CPTableViewHeaderViewKey];
_cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey]; _cornerView = [aCoder decodeObjectForKey:CPTableViewCornerViewKey];
@@ -3264,7 +3277,6 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
[aCoder encodeInt:_gridStyleMask forKey:CPTableViewGridStyleMaskKey]; [aCoder encodeInt:_gridStyleMask forKey:CPTableViewGridStyleMaskKey];
[aCoder encodeBool:_usesAlternatingRowBackgroundColors forKey:CPTableViewUsesAlternatingBackgroundKey]; [aCoder encodeBool:_usesAlternatingRowBackgroundColors forKey:CPTableViewUsesAlternatingBackgroundKey];
[aCoder encodeObject:_alternatingRowBackgroundColors forKey:CPTableViewAlternatingRowColorsKey]
[aCoder encodeObject:_cornerView forKey:CPTableViewCornerViewKey]; [aCoder encodeObject:_cornerView forKey:CPTableViewCornerViewKey];
[aCoder encodeObject:_headerView forKey:CPTableViewHeaderViewKey]; [aCoder encodeObject:_headerView forKey:CPTableViewHeaderViewKey];
@@ -3309,7 +3321,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
@end @end
@implementation _CPDropOperationDrawingView : CPView @implementation _dropOperationDrawingView : CPView
{ {
unsigned dropOperation @accessors; unsigned dropOperation @accessors;
CPTableView tableView @accessors; CPTableView tableView @accessors;
+3 -3
View File
@@ -813,7 +813,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
if (![CPPlatform isBrowser]) if (![CPPlatform isBrowser])
{ {
[self copy:sender]; [self copy:sender];
[self deleteBackward:sender]; [self deleteBackwards:sender];
} }
} }
@@ -826,7 +826,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
if (![[pasteboard types] containsObject:CPStringPboardType]) if (![[pasteboard types] containsObject:CPStringPboardType])
return; return;
[self deleteBackward:sender]; [self deleteBackwards:sender];
var selectedRange = [self selectedRange], var selectedRange = [self selectedRange],
stringValue = [self stringValue], stringValue = [self stringValue],
@@ -912,7 +912,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
[self selectText:sender]; [self selectText:sender];
} }
- (void)deleteBackward:(id)sender - (void)deleteBackwards:(id)sender
{ {
var selectedRange = [self selectedRange], var selectedRange = [self selectedRange],
stringValue = [self stringValue], stringValue = [self stringValue],
+11 -56
View File
@@ -243,11 +243,6 @@ var CPViewFlags = { },
return [CPSet setWithObjects:@"boundsOrigin", @"boundsSize"]; return [CPSet setWithObjects:@"boundsOrigin", @"boundsSize"];
} }
+ (CPMenu)defaultMenu
{
return nil;
}
- (id)init - (id)init
{ {
return [self initWithFrame:CGRectMakeZero()]; return [self initWithFrame:CGRectMakeZero()];
@@ -673,7 +668,7 @@ var CPViewFlags = { },
return _tag; return _tag;
} }
- (CPView)viewWithTag:(CPInteger)aTag - (void)viewWithTag:(CPInteger)aTag
{ {
if ([self tag] == aTag) if ([self tag] == aTag)
return self; return self;
@@ -1204,7 +1199,7 @@ var CPViewFlags = { },
if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature)) if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature))
{ {
if (anAlphaValue === 1.0) if (anAlphaValue == 1.0)
try { _DOMElement.style.removeAttribute("filter") } catch (anException) { } try { _DOMElement.style.removeAttribute("filter") } catch (anException) { }
else else
_DOMElement.style.filter = "alpha(opacity=" + anAlphaValue * 100 + ")"; _DOMElement.style.filter = "alpha(opacity=" + anAlphaValue * 100 + ")";
@@ -1314,22 +1309,6 @@ var CPViewFlags = { },
[super mouseDown:anEvent]; [super mouseDown:anEvent];
} }
- (void)rightMouseDown:(CPEvent)anEvent
{
var menu = [self menuForEvent:anEvent];
if (menu)
[CPMenu popUpContextMenu:menu withEvent:anEvent forView:self];
else if ([[self nextResponder] isKindOfClass:CPView])
[super rightMouseDown:anEvent];
else
[[[anEvent window] platformWindow] _propagateContextMenuDOMEvent:YES];
}
- (CPMenu)menuForEvent:(CPEvent)anEvent
{
return [self menu] || [[self class] defaultMenu];
}
/*! /*!
Sets the background color of the receiver. Sets the background color of the receiver.
@param aColor the new color for the receiver's background @param aColor the new color for the receiver's background
@@ -1343,30 +1322,28 @@ var CPViewFlags = { },
#if PLATFORM(DOM) #if PLATFORM(DOM)
var patternImage = [_backgroundColor patternImage], var patternImage = [_backgroundColor patternImage],
colorExists = _backgroundColor && ([_backgroundColor patternImage] || [_backgroundColor alphaComponent] > 0.0),
colorHasAlpha = colorExists && [_backgroundColor alphaComponent] < 1.0,
supportsRGBA = CPFeatureIsCompatible(CPCSSRGBAFeature),
colorNeedsDOMElement = colorHasAlpha && !supportsRGBA,
amount = 0; amount = 0;
if ([patternImage isThreePartImage]) if ([patternImage isThreePartImage])
{ {
_backgroundType = [patternImage isVertical] ? BackgroundVerticalThreePartImage : BackgroundHorizontalThreePartImage; _backgroundType = [patternImage isVertical] ? BackgroundVerticalThreePartImage : BackgroundHorizontalThreePartImage;
amount = 3 - _DOMImageParts.length; amount = 3 - _DOMImageParts.length;
} }
else if ([patternImage isNinePartImage]) else if ([patternImage isNinePartImage])
{ {
_backgroundType = BackgroundNinePartImage; _backgroundType = BackgroundNinePartImage;
amount = 9 - _DOMImageParts.length; amount = 9 - _DOMImageParts.length;
} }
else else
{ {
_backgroundType = BackgroundTrivialColor; _backgroundType = BackgroundTrivialColor;
amount = (colorNeedsDOMElement ? 1 : 0) - _DOMImageParts.length;
amount = 0 - _DOMImageParts.length;
} }
if (amount > 0) if (amount > 0)
{
while (amount--) while (amount--)
{ {
var DOMElement = DOMElementPrototype.cloneNode(false); var DOMElement = DOMElementPrototype.cloneNode(false);
@@ -1376,34 +1353,20 @@ var CPViewFlags = { },
_DOMImageParts.push(DOMElement); _DOMImageParts.push(DOMElement);
_DOMElement.appendChild(DOMElement); _DOMElement.appendChild(DOMElement);
} }
}
else else
{ {
amount = -amount; amount = -amount;
while (amount--) while (amount--)
_DOMElement.removeChild(_DOMImageParts.pop()); _DOMElement.removeChild(_DOMImageParts.pop());
} }
if (_backgroundType === BackgroundTrivialColor) if (_backgroundType == BackgroundTrivialColor)
{
var colorCSS = colorExists ? [_backgroundColor cssString] : "";
if (colorNeedsDOMElement) // Opera doesn't like DOM properties set to nil.
{ // https://trac.280north.com/ticket/7
_DOMElement.style.background = ""; _DOMElement.style.background = _backgroundColor ? [_backgroundColor cssString] : "";
_DOMImageParts[0].style.background = [_backgroundColor cssString];
if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature))
_DOMImageParts[0].style.filter = "alpha(opacity=" + [_backgroundColor alphaComponent] * 100 + ")";
else
_DOMImageParts[0].style.opacity = [_backgroundColor alphaComponent];
var size = [self bounds].size;
CPDOMDisplayServerSetStyleSize(_DOMImageParts[0], size.width, size.height);
}
else
_DOMElement.style.background = colorCSS;
}
else else
{ {
var slices = [patternImage imageSlices], var slices = [patternImage imageSlices],
@@ -1418,14 +1381,6 @@ var CPViewFlags = { },
CPDOMDisplayServerSetStyleSize(_DOMImageParts[count], size.width, size.height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[count], size.width, size.height);
_DOMImageParts[count].style.background = image ? "url(\"" + [image filename] + "\")" : ""; _DOMImageParts[count].style.background = image ? "url(\"" + [image filename] + "\")" : "";
if (!supportsRGBA)
{
if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature))
try { _DOMImageParts[count].style.removeAttribute("filter") } catch (anException) { }
else
_DOMImageParts[count].style.opacity = 1.0;
}
} }
if (_backgroundType == BackgroundNinePartImage) if (_backgroundType == BackgroundNinePartImage)
+4 -55
View File
@@ -50,7 +50,7 @@ var CPViewControllerCachedCibs;
CPView _view; CPView _view;
id _representedObject @accessors(property=representedObject); id _representedObject @accessors(property=representedObject);
CPString _title; CPString _title @accessors(property=title);
CPString _cibName @accessors(property=cibName, readonly); CPString _cibName @accessors(property=cibName, readonly);
CPBundle _cibBundle @accessors(property=cibBundle, readonly); CPBundle _cibBundle @accessors(property=cibBundle, readonly);
@@ -78,9 +78,7 @@ var CPViewControllerCachedCibs;
- (id)initWithCibName:(CPString)aCibNameOrNil bundle:(CPBundle)aCibBundleOrNil owner:(id)anOwner - (id)initWithCibName:(CPString)aCibNameOrNil bundle:(CPBundle)aCibBundleOrNil owner:(id)anOwner
{ {
return [self initWithCibName:aCibNameOrNil return [self initWithCibName:aCibNameOrNil bundle:aCibBundleOrNil externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner]];
bundle:aCibBundleOrNil
externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner]];
} }
/*! /*!
@@ -99,34 +97,13 @@ var CPViewControllerCachedCibs;
{ {
// Don't load the cib until someone actually requests the view. The user may just be intending to use setView:. // Don't load the cib until someone actually requests the view. The user may just be intending to use setView:.
_cibName = aCibNameOrNil; _cibName = aCibNameOrNil;
_cibBundle = aCibBundleOrNil; _cibBundle = aCibBundleOrNil || [CPBundle mainBundle];
if (!_cibBundle)
{
var owner = [anExternalNameTable objectForKey:CPCibOwner];
_cibBundle = owner ? [CPBundle bundleForClass:[owner class]] : [CPBundle mainBundle];
}
_cibExternalNameTable = anExternalNameTable || [CPDictionary dictionaryWithObject:self forKey:CPCibOwner]; _cibExternalNameTable = anExternalNameTable || [CPDictionary dictionaryWithObject:self forKey:CPCibOwner];
} }
return self; return self;
} }
- (void)setTitle:(CPString)aTitle
{
_title = aTitle;
if (self._navigationItem)
[_navigationItem setTitle:aTitle];
}
- (CPString)title
{
return _title;
}
/*! /*!
Programmatically creates the view that the controller manages. Programmatically creates the view that the controller manages.
You should never call this method directly. The view controller calls this method when the view property is requested but is nil. You should never call this method directly. The view controller calls this method when the view property is requested but is nil.
@@ -147,9 +124,9 @@ var CPViewControllerCachedCibs;
// check if a cib is already cached for the current _cibName // check if a cib is already cached for the current _cibName
var cib = [CPViewControllerCachedCibs objectForKey:_cibName]; var cib = [CPViewControllerCachedCibs objectForKey:_cibName];
// If the cib isn't cached yet : fetch it and cache it
if (!cib) if (!cib)
{ {
// if the cib isn't cached yet : fetch it and cache it
cib = [[CPCib alloc] initWithContentsOfURL:[_cibBundle pathForResource:_cibName + @".cib"]]; cib = [[CPCib alloc] initWithContentsOfURL:[_cibBundle pathForResource:_cibName + @".cib"]];
[CPViewControllerCachedCibs setObject:cib forKey:_cibName]; [CPViewControllerCachedCibs setObject:cib forKey:_cibName];
} }
@@ -215,34 +192,6 @@ var CPViewControllerCachedCibs;
_view = aView; _view = aView;
} }
- (CPNavigationItem)navigationItem
{
var navigationItem = self._navigationItem;
if (!navigationItem)
navigationItem = [[CPNavigationItem alloc] initWithTitle:[self title]];
self._navigationItem = navigationItem;
return navigationItem;
}
- (void)viewWillAppear:(BOOL)isAnimated
{
}
- (void)viewDidAppear:(BOOL)isAnimated
{
}
- (void)viewWillDisappear:(BOOL)isAnimated
{
}
- (void)viewDidDisappear:(BOOL)isAnimated
{
}
@end @end
+25 -53
View File
@@ -472,6 +472,9 @@ CPTexturedBackgroundWindowMask
- (void)awakeFromCib - (void)awakeFromCib
{ {
if (_initialFirstResponder)
[self makeFirstResponder:_initialFirstResponder];
_keyViewLoopIsDirty = ![self _hasKeyViewLoop]; _keyViewLoopIsDirty = ![self _hasKeyViewLoop];
} }
@@ -735,15 +738,6 @@ CPTexturedBackgroundWindowMask
{ {
[_platformWindow orderFront:self]; [_platformWindow orderFront:self];
[_platformWindow order:CPWindowAbove window:self relativeTo:nil]; [_platformWindow order:CPWindowAbove window:self relativeTo:nil];
if (_firstResponder === self || !_firstResponder)
[self makeFirstResponder:[self initialFirstResponder]];
if (!CPApp._keyWindow)
[self makeKeyWindow];
if (!CPApp._mainWindow)
[self makeMainWindow];
} }
/* /*
@@ -1167,16 +1161,6 @@ CPTexturedBackgroundWindowMask
return YES; return YES;
} }
- (id)initialFirstResponder
{
return _initialFirstResponder;
}
- (void)setInitialFirstResponder:(id)aResponder
{
_initialFirstResponder = aResponder;
}
/*! /*!
Attempts to make the \c aResponder the first responder. Before trying Attempts to make the \c aResponder the first responder. Before trying
to make it the first responder, the receiver will ask the current first responder to make it the first responder, the receiver will ask the current first responder
@@ -1186,7 +1170,7 @@ CPTexturedBackgroundWindowMask
*/ */
- (BOOL)makeFirstResponder:(CPResponder)aResponder - (BOOL)makeFirstResponder:(CPResponder)aResponder
{ {
if (_firstResponder === aResponder) if (_firstResponder == aResponder)
return YES; return YES;
if(![_firstResponder resignFirstResponder]) if(![_firstResponder resignFirstResponder])
@@ -1347,57 +1331,43 @@ CPTexturedBackgroundWindowMask
case CPScrollWheel: return [[_windowView hitTest:point] scrollWheel:anEvent]; case CPScrollWheel: return [[_windowView hitTest:point] scrollWheel:anEvent];
case CPLeftMouseUp: case CPLeftMouseUp: if (!_leftMouseDownView)
case CPRightMouseUp: var hitTestedView = _leftMouseDownView, return [[_windowView hitTest:point] mouseUp:anEvent];
selector = type == CPRightMouseUp ? @selector(rightMouseUp:) : @selector(mouseUp:);
if (!hitTestedView) [_leftMouseDownView mouseUp:anEvent]
hitTestedView = [_windowView hitTest:point];
[hitTestedView performSelector:selector withObject:anEvent];
_leftMouseDownView = nil; _leftMouseDownView = nil;
return; return;
case CPLeftMouseDown: case CPLeftMouseDown: _leftMouseDownView = [_windowView hitTest:point];
case CPRightMouseDown: _leftMouseDownView = [_windowView hitTest:point];
if (_leftMouseDownView != _firstResponder && [_leftMouseDownView acceptsFirstResponder]) if (_leftMouseDownView != _firstResponder && [_leftMouseDownView acceptsFirstResponder])
[self makeFirstResponder:_leftMouseDownView]; [self makeFirstResponder:_leftMouseDownView];
[CPApp activateIgnoringOtherApps:YES]; [CPApp activateIgnoringOtherApps:YES];
var theWindow = [anEvent window], var theWindow = [anEvent window];
selector = type == CPRightMouseDown ? @selector(rightMouseDown:) : @selector(mouseDown:);
if ([theWindow isKeyWindow] || [theWindow becomesKeyOnlyIfNeeded] && ![_leftMouseDownView needsPanelToBecomeKey]) if ([theWindow isKeyWindow] || [theWindow becomesKeyOnlyIfNeeded] && ![_leftMouseDownView needsPanelToBecomeKey])
return [_leftMouseDownView performSelector:selector withObject:anEvent]; return [_leftMouseDownView mouseDown:anEvent];
else else
{ {
// FIXME: delayed ordering? // FIXME: delayed ordering?
[self makeKeyAndOrderFront:self]; [self makeKeyAndOrderFront:self];
if ([_leftMouseDownView acceptsFirstMouse:anEvent]) if ([_leftMouseDownView acceptsFirstMouse:anEvent])
return [_leftMouseDownView performSelector:selector withObject:anEvent]; return [_leftMouseDownView mouseDown:anEvent]
} }
break; break;
case CPLeftMouseDragged: if (!_leftMouseDownView)
case CPLeftMouseDragged:
case CPRightMouseDragged: if (!_leftMouseDownView)
return [[_windowView hitTest:point] mouseDragged:anEvent]; return [[_windowView hitTest:point] mouseDragged:anEvent];
var selector; return [_leftMouseDownView mouseDragged:anEvent];
if (type == CPRightMouseDragged)
{
selector = @selector(rightMouseDragged:)
if (![_leftMouseDownView respondsToSelector:selector])
selector = nil;
}
if (!selector) case CPRightMouseUp: return [_rightMouseDownView mouseUp:anEvent];
selector = @selector(mouseDragged:) case CPRightMouseDown: _rightMouseDownView = [_windowView hitTest:point];
return [_rightMouseDownView mouseDown:anEvent];
return [_leftMouseDownView performSelector:selector withObject:anEvent]; case CPRightMouseDragged: return [_rightMouseDownView mouseDragged:anEvent];
case CPMouseMoved: if (!_acceptsMouseMovedEvents) case CPMouseMoved: if (!_acceptsMouseMovedEvents)
return; return;
@@ -1524,11 +1494,10 @@ CPTexturedBackgroundWindowMask
*/ */
- (void)resignKeyWindow - (void)resignKeyWindow
{ {
if (_firstResponder !== self && [_firstResponder respondsToSelector:@selector(resignKeyWindow)]) if (_firstResponder != self && [_firstResponder respondsToSelector:@selector(resignKeyWindow)])
[_firstResponder resignKeyWindow]; [_firstResponder resignKeyWindow];
if (CPApp._keyWindow === self) CPApp._keyWindow = nil;
CPApp._keyWindow = nil;
[[CPNotificationCenter defaultCenter] [[CPNotificationCenter defaultCenter]
postNotificationName:CPWindowDidResignKeyNotification postNotificationName:CPWindowDidResignKeyNotification
@@ -1889,8 +1858,7 @@ CPTexturedBackgroundWindowMask
postNotificationName:CPWindowDidResignMainNotification postNotificationName:CPWindowDidResignMainNotification
object:self]; object:self];
if (CPApp._mainWindow === self) CPApp._mainWindow = nil;
CPApp._mainWindow = nil;
} }
- (void)_updateMainAndKeyWindows - (void)_updateMainAndKeyWindows
@@ -1898,6 +1866,9 @@ CPTexturedBackgroundWindowMask
var allWindows = [CPApp orderedWindows], var allWindows = [CPApp orderedWindows],
windowCount = [allWindows count]; windowCount = [allWindows count];
if (!windowCount)
return;
if ([self isKeyWindow]) if ([self isKeyWindow])
{ {
var keyWindow = [CPApp keyWindow]; var keyWindow = [CPApp keyWindow];
@@ -1922,10 +1893,11 @@ CPTexturedBackgroundWindowMask
} }
if (![CPApp keyWindow]) if (![CPApp keyWindow])
[menuWindow makeKeyWindow]; [keyWindow makeKeyWindow];
} }
} }
if ([self isMainWindow]) if ([self isMainWindow])
{ {
var mainWindow = [CPApp mainWindow]; var mainWindow = [CPApp mainWindow];
@@ -71,10 +71,9 @@ var _CPToolbarViewBackgroundColor = nil;
[self addSubview:_toolbarBackgroundView positioned:CPWindowBelow relativeTo:nil]; [self addSubview:_toolbarBackgroundView positioned:CPWindowBelow relativeTo:nil];
} }
var frame = CGRectMakeZero(), var frame = CGRectMakeZero();
toolbarOffset = [self toolbarOffset];
frame.origin = CGPointMake(toolbarOffset.width, toolbarOffset.height); frame.origin = CGPointMakeCopy([self toolbarOffset]);
frame.size = [_toolbarView frame].size; frame.size = [_toolbarView frame].size;
[_toolbarBackgroundView setFrame:frame]; [_toolbarBackgroundView setFrame:frame];
+3 -4
View File
@@ -36,7 +36,6 @@ var _CPWindowViewResizeIndicatorImage = nil;
CGSize _resizeIndicatorOffset; CGSize _resizeIndicatorOffset;
CPView _toolbarView; CPView _toolbarView;
CGSize _toolbarOffset;
// BOOL _isAnimatingToolbar; // BOOL _isAnimatingToolbar;
@@ -81,8 +80,8 @@ var _CPWindowViewResizeIndicatorImage = nil;
if (self) if (self)
{ {
_styleMask = aStyleMask; _styleMask = aStyleMask;
_resizeIndicatorOffset = CGSizeMakeZero(); _resizeIndicatorOffset = CGSizeMake(0.0, 0.0);
_toolbarOffset = CGSizeMakeZero(); _toolbarOffset = CGSizeMake(0.0, 0.0);
} }
return self; return self;
@@ -270,7 +269,7 @@ var _CPWindowViewResizeIndicatorImage = nil;
- (CGSize)toolbarOffset - (CGSize)toolbarOffset
{ {
return _toolbarOffset; return CGSizeMakeZero();
} }
- (CPColor)toolbarLabelColor - (CPColor)toolbarLabelColor
+19
View File
@@ -322,6 +322,25 @@
return _documents; 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 - (void)setViewControllerContainerView:(CPView)aView
{ {
_viewControllerContainerView = aView; _viewControllerContainerView = aView;
+1 -6
View File
@@ -171,17 +171,12 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
- (void)connection:(CPURLConnection)aConnection didReceiveData:(CPString)data - (void)connection:(CPURLConnection)aConnection didReceiveData:(CPString)data
{ {
// FIXME: Why aren't we getting connection:didFailWithError:
if (!data)
return [self connection:aConnection didFailWithError:nil];
_data = [CPData dataWithRawString:data]; _data = [CPData dataWithRawString:data];
} }
- (void)connection:(CPURLConnection)aConnection didFailWithError:(CPError)anError - (void)connection:(CPURLConnection)aConnection didFailWithError:(CPError)anError
{ {
if ([_loadDelegate respondsToSelector:@selector(cibDidFailToLoad:)]) alert("cib: connection failed.");
[_loadDelegate cibDidFailToLoad:self];
_loadDelegate = nil; _loadDelegate = nil;
} }
-5
View File
@@ -118,9 +118,4 @@ var CPCibOwner = @"CPCibOwner";
[_loadDelegate cibDidFinishLoading:aCib]; [_loadDelegate cibDidFinishLoading:aCib];
} }
- (void)cibDidFailToLoad:(CPCib)aCib
{
[_loadDelegate cibDidFailToLoad:aCib];
}
@end @end
+2 -1
View File
@@ -777,7 +777,8 @@ if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex)
@ignore @ignore
*/ */
+ (void)runLoopUpdateLayers + (void)runLoopUpdateLayers
{ {if (window.oops) {alert(window.latest); objj_debug_print_backtrace();}
window.loop = true;
for (UID in CALayerRegisteredRunLoopUpdates) for (UID in CALayerRegisteredRunLoopUpdates)
{ {
var layer = CALayerRegisteredRunLoopUpdates[UID], var layer = CALayerRegisteredRunLoopUpdates[UID],
+1 -1
View File
@@ -210,7 +210,7 @@ function CGPathAddQuadCurveToPoint(aPath, aTransform, cpx, cpy, x, y)
if (aTransform) if (aTransform)
{ {
cp = _CGPointApplyAffineTransform(cp, aTransform); cp = _CGPointApplyAffineTransform(control, aTransform);
end = _CGPointApplyAffineTransform(end, aTransform); end = _CGPointApplyAffineTransform(end, aTransform);
} }
+1 -1
View File
@@ -20,7 +20,7 @@ appKitTask = framework ("AppKit", function(appKitTask)
appKitTask.setEmail("feedback @nospam@ 280north.com"); appKitTask.setEmail("feedback @nospam@ 280north.com");
appKitTask.setSummary("AppKit classes for Cappuccino"); appKitTask.setSummary("AppKit classes for Cappuccino");
appKitTask.setIdentifier("com.280n.AppKit"); appKitTask.setIdentifier("com.280n.AppKit");
appKitTask.setVersion(getCappuccinoVersion()); appKitTask.setVersion("0.8.0");
appKitTask.setLicense(BundleTask.License.LGPL_v2_1); appKitTask.setLicense(BundleTask.License.LGPL_v2_1);
appKitTask.setSources(AppKitFiles); appKitTask.setSources(AppKitFiles);
appKitTask.setResources(new FileList("Resources/**/*")); appKitTask.setResources(new FileList("Resources/**/*"));
-1
View File
@@ -46,7 +46,6 @@ var PrimaryPlatformWindow = NULL;
CPDictionary _windowLayers; CPDictionary _windowLayers;
BOOL _mouseIsDown; BOOL _mouseIsDown;
BOOL _mouseDownIsRightClick;
CPWindow _mouseDownWindow; CPWindow _mouseDownWindow;
CPTimeInterval _lastMouseUp; CPTimeInterval _lastMouseUp;
CPTimeInterval _lastMouseDown; CPTimeInterval _lastMouseDown;
+3 -10
View File
@@ -40,16 +40,6 @@ var screenNeedsInitialization = NO,
return; return;
screenNeedsInitialization = [CPPlatform isBrowser]; screenNeedsInitialization = [CPPlatform isBrowser];
// We do this here because doing it later breaks IE.
if (document.documentElement)
document.documentElement.style.overflow = "hidden";
if ([CPPlatform isBrowser])
window.onunload = function()
{
[CPApp terminate:nil];
}
} }
+ (BOOL)isBrowser + (BOOL)isBrowser
@@ -131,6 +121,9 @@ var screenNeedsInitialization = NO,
bodyElement.style.overflow = "hidden"; bodyElement.style.overflow = "hidden";
if (document.documentElement)
document.documentElement.style.overflow = "hidden";
[[CPNotificationCenter defaultCenter] [[CPNotificationCenter defaultCenter]
postNotificationName:CPPlatformDidClearBodyElementNotification postNotificationName:CPPlatformDidClearBodyElementNotification
object:self]; object:self];
+35 -58
View File
@@ -22,10 +22,9 @@
#include "../CoreGraphics/CGGeometry.h" #include "../CoreGraphics/CGGeometry.h"
var DOMFixedWidthSpanElement = nil, var DOMSpanElement = nil,
DOMFlexibleWidthSpanElement = nil, DOMIFrameElement = nil,
DOMIFrameElement = nil, DefaultFont = nil;
DefaultFont = nil;
@implementation CPPlatformString : CPBasePlatformString @implementation CPPlatformString : CPBasePlatformString
{ {
@@ -38,30 +37,25 @@ var DOMFixedWidthSpanElement = nil,
+ (void)createDOMElements + (void)createDOMElements
{ {
var style;
DOMIFrameElement = document.createElement("iframe"); DOMIFrameElement = document.createElement("iframe");
// necessary for Safari caching bug: // necessary for Safari caching bug:
DOMIFrameElement.name = "iframe_" + FLOOR(RAND() * 10000); 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"; 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]; var bodyElement = [CPPlatform mainBodyElement];
bodyElement.appendChild(DOMIFrameElement); bodyElement.appendChild(DOMIFrameElement);
var DOMIFrameDocument = (DOMIFrameElement.contentDocument || DOMIFrameElement.contentWindow.document); var DOMIFrameDocument = (DOMIFrameElement.contentDocument || DOMIFrameElement.contentWindow.document);
DOMIFrameDocument.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+ DOMIFrameDocument.write("<html><head></head><body></body></html>");
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head></head><body></body></html>');
DOMIFrameDocument.close(); DOMIFrameDocument.close();
// IE needs this wide <div> to prevent unwanted text wrapping: // IE needs this wide <div> to prevent unwanted text wrapping:
@@ -71,39 +65,14 @@ var DOMFixedWidthSpanElement = nil,
DOMIFrameDocument.body.appendChild(DOMDivElement); DOMIFrameDocument.body.appendChild(DOMDivElement);
DOMFlexibleWidthSpanElement = DOMIFrameDocument.createElement("span"); DOMSpanElement = DOMIFrameDocument.createElement("span");
style = DOMFlexibleWidthSpanElement.style; DOMSpanElement.style.position = "absolute";
style.position = "absolute"; DOMSpanElement.style.whiteSpace = "pre";
style.visibility = "visible"; DOMSpanElement.style.visibility = "visible";
style.padding = "0px"; DOMSpanElement.style.padding = "0px";
style.margin = "0px"; DOMSpanElement.style.margin = "0px";
style.whiteSpace = "pre";
DOMFixedWidthSpanElement = DOMIFrameDocument.createElement("span"); DOMDivElement.appendChild(DOMSpanElement);
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";
}
DOMDivElement.appendChild(DOMFlexibleWidthSpanElement);
DOMDivElement.appendChild(DOMFixedWidthSpanElement);
} }
+ (CGSize)sizeOfString:(CPString)aString withFont:(CPFont)aFont forWidth:(float)aWidth + (CGSize)sizeOfString:(CPString)aString withFont:(CPFont)aFont forWidth:(float)aWidth
@@ -119,23 +88,31 @@ var DOMFixedWidthSpanElement = nil,
if (!DOMIFrameElement) if (!DOMIFrameElement)
[self createDOMElements]; [self createDOMElements];
var span; var style = DOMSpanElement.style;
if (!aWidth) if (!aWidth)
span = DOMFlexibleWidthSpanElement; {
style.width = "";
style.whiteSpace = "pre";
}
else else
{ {
span = DOMFixedWidthSpanElement; style.width = ROUND(aWidth) + "px";
span.style.width = ROUND(aWidth) + "px"; style.wordWrap = "break-word";
style.whiteSpace = "-o-pre-wrap";
style.whiteSpace = "-pre-wrap";
style.whiteSpace = "-moz-pre-wrap";
style.whiteSpace = "pre-wrap";
} }
span.style.font = [aFont cssString]; style.font = [aFont cssString];
if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature)) if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature))
span.innerText = aString; DOMSpanElement.innerText = aString;
else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature)) else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature))
span.textContent = aString; DOMSpanElement.textContent = aString;
return _CGSizeMake(span.clientWidth, span.clientHeight); return _CGSizeMake(DOMSpanElement.clientWidth, DOMSpanElement.clientHeight);
} }
@end @end
+6 -59
View File
@@ -127,10 +127,7 @@ var PlatformWindows = [CPSet set];
// Define up here so compressor knows about em. // Define up here so compressor knows about em.
var CPDOMEventGetClickCount, var CPDOMEventGetClickCount,
CPDOMEventStop, CPDOMEventStop,
StopDOMEventPropagation, StopDOMEventPropagation;
StopContextMenuDOMEventPropagation;
var _DOMEventGuard;
//right now we hard code q, w, r and t as keys to propogate //right now we hard code q, w, r and t as keys to propogate
//these aren't normal keycodes, they are with modifier key codes //these aren't normal keycodes, they are with modifier key codes
@@ -258,19 +255,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
// Make sure the pastboard element is blurred. // Make sure the pastboard element is blurred.
_DOMPasteboardElement.blur(); _DOMPasteboardElement.blur();
// Create a full screen div to protect against iframes and other elements from consuming events during tracking
// FIXME: multiple windows
_DOMEventGuard = theDocument.createElement("div");
_DOMEventGuard.style.position = "absolute";
_DOMEventGuard.style.top = "0px";
_DOMEventGuard.style.left = "0px";
_DOMEventGuard.style.width = "100%";
_DOMEventGuard.style.height = "100%";
_DOMEventGuard.style.zIndex = "999";
_DOMEventGuard.style.display = "none";
_DOMEventGuard.className = "cpdontremove";
_DOMBodyElement.appendChild(_DOMEventGuard);
} }
- (void)registerDOMWindow - (void)registerDOMWindow
@@ -313,10 +297,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
mouseEventImplementation = class_getMethodImplementation(theClass, mouseEventSelector), mouseEventImplementation = class_getMethodImplementation(theClass, mouseEventSelector),
mouseEventCallback = function (anEvent) { mouseEventImplementation(self, nil, anEvent); }, mouseEventCallback = function (anEvent) { mouseEventImplementation(self, nil, anEvent); },
contextMenuEventSelector = @selector(contextMenuEvent:),
contextMenuEventImplementation = class_getMethodImplementation(theClass, contextMenuEventSelector),
contextMenuEventCallback = function (anEvent) { return contextMenuEventImplementation(self, nil, anEvent); },
scrollEventSelector = @selector(scrollEvent:), scrollEventSelector = @selector(scrollEvent:),
scrollEventImplementation = class_getMethodImplementation(theClass, scrollEventSelector), scrollEventImplementation = class_getMethodImplementation(theClass, scrollEventSelector),
scrollEventCallback = function (anEvent) { scrollEventImplementation(self, nil, anEvent); }, scrollEventCallback = function (anEvent) { scrollEventImplementation(self, nil, anEvent); },
@@ -340,7 +320,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
theDocument.addEventListener("mouseup", mouseEventCallback, NO); theDocument.addEventListener("mouseup", mouseEventCallback, NO);
theDocument.addEventListener("mousedown", mouseEventCallback, NO); theDocument.addEventListener("mousedown", mouseEventCallback, NO);
theDocument.addEventListener("mousemove", mouseEventCallback, NO); theDocument.addEventListener("mousemove", mouseEventCallback, NO);
theDocument.addEventListener("contextmenu", contextMenuEventCallback, NO);
theDocument.addEventListener("beforecopy", copyEventCallback, NO); theDocument.addEventListener("beforecopy", copyEventCallback, NO);
theDocument.addEventListener("beforecut", copyEventCallback, NO); theDocument.addEventListener("beforecut", copyEventCallback, NO);
@@ -368,7 +347,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
theDocument.removeEventListener("mouseup", mouseEventCallback, NO); theDocument.removeEventListener("mouseup", mouseEventCallback, NO);
theDocument.removeEventListener("mousedown", mouseEventCallback, NO); theDocument.removeEventListener("mousedown", mouseEventCallback, NO);
theDocument.removeEventListener("mousemove", mouseEventCallback, NO); theDocument.removeEventListener("mousemove", mouseEventCallback, NO);
theDocument.removeEventListener("contextmenu", contextMenuEventCallback, NO);
theDocument.removeEventListener("keyup", keyEventCallback, NO); theDocument.removeEventListener("keyup", keyEventCallback, NO);
theDocument.removeEventListener("keydown", keyEventCallback, NO); theDocument.removeEventListener("keydown", keyEventCallback, NO);
@@ -401,7 +379,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
theDocument.attachEvent("onmousedown", mouseEventCallback); theDocument.attachEvent("onmousedown", mouseEventCallback);
theDocument.attachEvent("onmousemove", mouseEventCallback); theDocument.attachEvent("onmousemove", mouseEventCallback);
theDocument.attachEvent("ondblclick", mouseEventCallback); theDocument.attachEvent("ondblclick", mouseEventCallback);
theDocument.attachEvent("oncontextmenu", contextMenuEventCallback);
theDocument.attachEvent("onkeyup", keyEventCallback); theDocument.attachEvent("onkeyup", keyEventCallback);
theDocument.attachEvent("onkeydown", keyEventCallback); theDocument.attachEvent("onkeydown", keyEventCallback);
@@ -424,7 +401,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
theDocument.detachEvent("onmousedown", mouseEventCallback); theDocument.detachEvent("onmousedown", mouseEventCallback);
theDocument.detachEvent("onmousemove", mouseEventCallback); theDocument.detachEvent("onmousemove", mouseEventCallback);
theDocument.detachEvent("ondblclick", mouseEventCallback); theDocument.detachEvent("ondblclick", mouseEventCallback);
theDocument.detachEvent("oncontextmenu", contextMenuEventCallback);
theDocument.detachEvent("onkeyup", keyEventCallback); theDocument.detachEvent("onkeyup", keyEventCallback);
theDocument.detachEvent("onkeydown", keyEventCallback); theDocument.detachEvent("onkeydown", keyEventCallback);
@@ -813,6 +789,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
} }
} }
- (void)_checkPasteboardElement - (void)_checkPasteboardElement
{ {
var value = _DOMPasteboardElement.value; var value = _DOMPasteboardElement.value;
@@ -1055,12 +1032,11 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
{ {
if(_mouseIsDown) if(_mouseIsDown)
{ {
event = _CPEventFromNativeMouseEvent(aDOMEvent, _mouseDownIsRightClick ? CPRightMouseUp : CPLeftMouseUp, location, modifierFlags, timestamp, windowNumber, nil, -1, CPDOMEventGetClickCount(_lastMouseUp, timestamp, location), 0); event = _CPEventFromNativeMouseEvent(aDOMEvent, CPLeftMouseUp, location, modifierFlags, timestamp, windowNumber, nil, -1, CPDOMEventGetClickCount(_lastMouseUp, timestamp, location), 0);
_mouseIsDown = NO; _mouseIsDown = NO;
_lastMouseUp = event; _lastMouseUp = event;
_mouseDownWindow = nil; _mouseDownWindow = nil;
_mouseDownIsRightClick = NO;
} }
if(_DOMEventMode) if(_DOMEventMode)
@@ -1100,12 +1076,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
_DOMBodyElement.style["-khtml-user-drag"] = "element"; _DOMBodyElement.style["-khtml-user-drag"] = "element";
} }
var button = aDOMEvent.button; event = _CPEventFromNativeMouseEvent(aDOMEvent, CPLeftMouseDown, location, modifierFlags, timestamp, windowNumber, nil, -1, CPDOMEventGetClickCount(_lastMouseDown, timestamp, location), 0);
_mouseDownIsRightClick = button == 2 || (button == 0 && modifierFlags & CPControlKeyMask);
StopContextMenuDOMEventPropagation = YES;
event = _CPEventFromNativeMouseEvent(aDOMEvent, _mouseDownIsRightClick ? CPRightMouseDown : CPLeftMouseDown, location, modifierFlags, timestamp, windowNumber, nil, -1, CPDOMEventGetClickCount(_lastMouseDown, timestamp, location), 0);
_mouseIsDown = YES; _mouseIsDown = YES;
_lastMouseDown = event; _lastMouseDown = event;
@@ -1116,7 +1087,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
if (_DOMEventMode) if (_DOMEventMode)
return; return;
event = _CPEventFromNativeMouseEvent(aDOMEvent, _mouseIsDown ? (_mouseDownIsRightClick ? CPRightMouseDragged : CPLeftMouseDragged) : CPMouseMoved, location, modifierFlags, timestamp, windowNumber, nil, -1, 1, 0); event = _CPEventFromNativeMouseEvent(aDOMEvent, _mouseIsDown ? CPLeftMouseDragged : CPMouseMoved, location, modifierFlags, timestamp, windowNumber, nil, -1, 1, 0);
} }
var isDragging = [[CPDragServer sharedDragServer] isDragging]; var isDragging = [[CPDragServer sharedDragServer] isDragging];
@@ -1131,21 +1102,10 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
if (StopDOMEventPropagation && (!supportsNativeDragAndDrop || type !== "mousedown" && !isDragging)) if (StopDOMEventPropagation && (!supportsNativeDragAndDrop || type !== "mousedown" && !isDragging))
CPDOMEventStop(aDOMEvent, self); CPDOMEventStop(aDOMEvent, self);
// if there are any tracking event listeners then show the event guard so we don't lose events to iframes
_DOMEventGuard.style.display = (CPApp._eventListeners.length === 0) ? "none" : "";
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
} }
- (void)contextMenuEvent:(DOMEvent)aDOMEvent (CPArray)orderedWindowsAtLevel:(int)aLevel
{
if (StopContextMenuDOMEventPropagation)
CPDOMEventStop(aDOMEvent, self);
return !StopContextMenuDOMEventPropagation;
}
- (CPArray)orderedWindowsAtLevel:(int)aLevel
{ {
var layer = [self layerAtLevel:aLevel create:NO]; var layer = [self layerAtLevel:aLevel create:NO];
@@ -1286,19 +1246,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
return !StopDOMEventPropagation; return !StopDOMEventPropagation;
} }
- (void)_propagateContextMenuDOMEvent:(BOOL)aFlag
{
if (aFlag && CPBrowserIsEngine(CPGeckoBrowserEngine))
StopDOMEventPropagation = !aFlag;
StopContextMenuDOMEventPropagation = !aFlag;
}
- (BOOL)_willPropagateContextMenuDOMEvent
{
return StopContextMenuDOMEventPropagation;
}
- (CPWindow)hitTest:(CPPoint)location - (CPWindow)hitTest:(CPPoint)location
{ {
if (self._only) if (self._only)
+18
View File
@@ -0,0 +1,18 @@
<html>
<head>
</head>
<body>
<div>Test custom cursors with .cur images.</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(disappearingItemCursor.cur), default">disappearingItemCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(closedHandCursor.cur), default">closedHandCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(contextMenuCursor.cur), default">contextMenuCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(dragCopyCursor.cur), default">dragCopyCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(dragLinkCursor.cur), default">dragLinkCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(openHandCursor.cur), default">openHandCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(resizeDownCursor.cur), default">resizeDownCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(resizeLeftCursor.cur), default">resizeLeftCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(resizeRightCursor.cur), default">resizeRightCursor</div>
<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: url(resizeUpCursor.cur), default">resizeUpCursor</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

+8 -40
View File
@@ -721,48 +721,16 @@
+ (CPButtonBar)themedButtonBar + (CPButtonBar)themedButtonBar
{ {
var buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 140.0, 26.0)], var buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 26.0)],
color = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"buttonbar-bezel.png" size:CGSizeMake(1.0, 26.0)]]; color = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
[
[buttonBar setHasResizeControl:YES]; [_CPCibCustomResource imageResourceWithName:"buttonbar-bezel.png" size:CGSizeMake(1.0, 26.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-bezel.png" size:CGSizeMake(1.0, 26.0)],
[buttonBar setValue:color forThemeAttribute:@"bezel-color"]; [_CPCibCustomResource imageResourceWithName:"buttonbar-bezel-right.png" size:CGSizeMake(13.0, 26.0)]
]
var resizeColor = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"buttonbar-resize-control.png" size:CGSizeMake(5.0, 10.0)]];
[buttonBar setValue:CGSizeMake(5.0, 10.0) forThemeAttribute:@"resize-control-size"];
[buttonBar setValue:CGInsetMake(9.0, 4.0, 7.0, 4.0) forThemeAttribute:@"resize-control-inset"];
[buttonBar setValue:resizeColor forThemeAttribute:@"resize-control-color"];
var buttonBezelColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
[
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-left.png" size:CGSizeMake(2.0, 25.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-center.png" size:CGSizeMake(1.0, 25.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-right.png" size:CGSizeMake(2.0, 25.0)]
]
isVertical:NO]],
buttonBezelHighlightedColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
[
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-highlighted-left.png" size:CGSizeMake(2.0, 25.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-highlighted-center.png" size:CGSizeMake(1.0, 25.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-highlighted-right.png" size:CGSizeMake(2.0, 25.0)]
]
isVertical:NO]],
buttonBezelDisabledColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
[
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-disabled-left.png" size:CGSizeMake(2.0, 25.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-disabled-center.png" size:CGSizeMake(1.0, 25.0)],
[_CPCibCustomResource imageResourceWithName:"buttonbar-button-bezel-disabled-right.png" size:CGSizeMake(2.0, 25.0)]
]
isVertical:NO]]; isVertical:NO]];
[buttonBar setValue:buttonBezelColor forThemeAttribute:@"button-bezel-color"]; [buttonBar setValue:color forThemeAttribute:@"bezel-color"];
[buttonBar setValue:buttonBezelHighlightedColor forThemeAttribute:@"button-bezel-color" inState:CPThemeStateHighlighted];
[buttonBar setValue:buttonBezelDisabledColor forThemeAttribute:@"button-bezel-color" inState:CPThemeStateDisabled];
[buttonBar setButtons:[[CPButtonBar plusButton], [CPButtonBar minusButton], [self themedPullDownMenu]]];
return buttonBar; return buttonBar;
} }
+1 -1
View File
@@ -10,7 +10,7 @@ blendKitTask = framework ("BlendKit", function(blendKitTask)
blendKitTask.setBuildPath(FILE.join($BUILD_DIR, $CONFIGURATION)); blendKitTask.setBuildPath(FILE.join($BUILD_DIR, $CONFIGURATION));
blendKitTask.setIdentifier("com.280n.BlendKit"); blendKitTask.setIdentifier("com.280n.BlendKit");
blendKitTask.setVersion(getCappuccinoVersion()); blendKitTask.setVersion("0.8.0");
blendKitTask.setAuthor("280 North, Inc."); blendKitTask.setAuthor("280 North, Inc.");
blendKitTask.setEmail("feedback @nospam@ 280north.com"); blendKitTask.setEmail("feedback @nospam@ 280north.com");
blendKitTask.setSummary("BlendKit classes for Cappuccino"); blendKitTask.setSummary("BlendKit classes for Cappuccino");
+4 -16
View File
@@ -5,16 +5,11 @@
{ {
} }
- (void)_init
{
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]];
}
- (id)initWithFrame:(CGRect)aFrame - (id)initWithFrame:(CGRect)aFrame
{ {
if (self = [super initWithFrame:aFrame]) if (self = [super initWithFrame:aFrame])
{ {
[self _init]; [self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]];
} }
return self; return self;
@@ -27,6 +22,9 @@
CGContextSetStrokeColor(context, [CPColor colorWithHexString:@"dce0e2"]); CGContextSetStrokeColor(context, [CPColor colorWithHexString:@"dce0e2"]);
var points = [ var points = [
CGPointMake(aRect.origin.x, aRect.origin.y),
CGPointMake(aRect.origin.x + aRect.size.width, aRect.origin.y),
CGPointMake(aRect.origin.x, aRect.origin.y + 0.5), CGPointMake(aRect.origin.x, aRect.origin.y + 0.5),
CGPointMake(aRect.origin.x, aRect.origin.y + aRect.size.height) CGPointMake(aRect.origin.x, aRect.origin.y + aRect.size.height)
]; ];
@@ -34,14 +32,4 @@
CGContextStrokeLineSegments(context, points, 2); CGContextStrokeLineSegments(context, points, 2);
} }
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
{
[self _init];
}
return self;
}
@end @end
+35 -22
View File
@@ -333,7 +333,6 @@ var HORIZONTAL_MARGIN = 3.0,
// Create or destroy the DOM Text Element as necessary // Create or destroy the DOM Text Element as necessary
if (needsDOMTextElement !== hasDOMTextElement) if (needsDOMTextElement !== hasDOMTextElement)
{
if (hasDOMTextElement) if (hasDOMTextElement)
{ {
_DOMElement.removeChild(_DOMTextElement); _DOMElement.removeChild(_DOMTextElement);
@@ -362,7 +361,6 @@ var HORIZONTAL_MARGIN = 3.0,
// We have to set all these values now. // We have to set all these values now.
_flags |= _CPImageAndTextViewTextChangedFlag | _CPImageAndTextViewFontChangedFlag | _CPImageAndTextViewLineBreakModeChangedFlag; _flags |= _CPImageAndTextViewTextChangedFlag | _CPImageAndTextViewFontChangedFlag | _CPImageAndTextViewLineBreakModeChangedFlag;
} }
}
var textStyle = hasDOMTextElement ? _DOMTextElement.style : nil; var textStyle = hasDOMTextElement ? _DOMTextElement.style : nil;
@@ -371,7 +369,6 @@ var HORIZONTAL_MARGIN = 3.0,
hasDOMTextShadowElement = !!_DOMTextShadowElement; hasDOMTextShadowElement = !!_DOMTextShadowElement;
if (needsDOMTextShadowElement !== hasDOMTextShadowElement) if (needsDOMTextShadowElement !== hasDOMTextShadowElement)
{
if (hasDOMTextShadowElement) if (hasDOMTextShadowElement)
{ {
_DOMElement.removeChild(_DOMTextShadowElement); _DOMElement.removeChild(_DOMTextShadowElement);
@@ -389,7 +386,6 @@ var HORIZONTAL_MARGIN = 3.0,
shadowStyle.font = [_font ? _font : [CPFont systemFontOfSize:12.0] cssString]; shadowStyle.font = [_font ? _font : [CPFont systemFontOfSize:12.0] cssString];
shadowStyle.position = "absolute"; shadowStyle.position = "absolute";
shadowStyle.whiteSpace = textStyle.whiteSpace; shadowStyle.whiteSpace = textStyle.whiteSpace;
shadowStyle.wordWrap = textStyle.wordWrap;
shadowStyle.color = [_textShadowColor cssString]; shadowStyle.color = [_textShadowColor cssString];
shadowStyle.zIndex = 150; shadowStyle.zIndex = 150;
@@ -398,6 +394,7 @@ var HORIZONTAL_MARGIN = 3.0,
if (document.attachEvent) if (document.attachEvent)
{ {
shadowStyle.overflow = textStyle.overflow; shadowStyle.overflow = textStyle.overflow;
shadowStyle.wordWrap = textStyle.wordWrap;
} }
else else
{ {
@@ -411,7 +408,6 @@ var HORIZONTAL_MARGIN = 3.0,
_flags |= _CPImageAndTextViewTextChangedFlag; //sigh... _flags |= _CPImageAndTextViewTextChangedFlag; //sigh...
} }
}
var shadowStyle = hasDOMTextShadowElement ? _DOMTextShadowElement.style : nil; var shadowStyle = hasDOMTextShadowElement ? _DOMTextShadowElement.style : nil;
@@ -451,7 +447,9 @@ var HORIZONTAL_MARGIN = 3.0,
case CPLineBreakByClipping: textStyle.overflow = "hidden"; case CPLineBreakByClipping: textStyle.overflow = "hidden";
textStyle.textOverflow = "clip"; textStyle.textOverflow = "clip";
textStyle.whiteSpace = "pre"; textStyle.whiteSpace = "pre";
textStyle.wordWrap = "normal";
if (document.attachEvent)
textStyle.wordWrap = "normal";
break; break;
@@ -461,23 +459,26 @@ var HORIZONTAL_MARGIN = 3.0,
case CPLineBreakByTruncatingTail: textStyle.textOverflow = "ellipsis"; case CPLineBreakByTruncatingTail: textStyle.textOverflow = "ellipsis";
textStyle.whiteSpace = "nowrap"; textStyle.whiteSpace = "nowrap";
textStyle.overflow = "hidden"; textStyle.overflow = "hidden";
textStyle.wordWrap = "normal";
if (document.attachEvent)
textStyle.wordWrap = "normal";
break; break;
case CPLineBreakByCharWrapping: case CPLineBreakByCharWrapping:
case CPLineBreakByWordWrapping: textStyle.wordWrap = "break-word"; case CPLineBreakByWordWrapping: if (document.attachEvent)
try { {
textStyle.whiteSpace = "pre"; textStyle.whiteSpace = "pre";
textStyle.wordWrap = "break-word";
}
else
{
textStyle.whiteSpace = "-o-pre-wrap"; textStyle.whiteSpace = "-o-pre-wrap";
textStyle.whiteSpace = "-pre-wrap"; textStyle.whiteSpace = "-pre-wrap";
textStyle.whiteSpace = "-moz-pre-wrap"; textStyle.whiteSpace = "-moz-pre-wrap";
textStyle.whiteSpace = "pre-wrap"; textStyle.whiteSpace = "pre-wrap";
} }
catch (e) {
//internet explorer doesn't like these properties
textStyle.whiteSpace = "pre";
}
textStyle.overflow = "hidden"; textStyle.overflow = "hidden";
textStyle.textOverflow = "clip"; textStyle.textOverflow = "clip";
@@ -489,6 +490,7 @@ var HORIZONTAL_MARGIN = 3.0,
{ {
if (document.attachEvent) if (document.attachEvent)
{ {
shadowStyle.wordWrap = textStyle.wordWrap;
shadowStyle.overflow = textStyle.overflow; shadowStyle.overflow = textStyle.overflow;
} }
else else
@@ -497,7 +499,6 @@ var HORIZONTAL_MARGIN = 3.0,
shadowStyle.overflowY = textStyle.overflowY; shadowStyle.overflowY = textStyle.overflowY;
} }
shadowStyle.wordWrap = textStyle.wordWrap;
shadowStyle.whiteSpace = textStyle.whiteSpace; shadowStyle.whiteSpace = textStyle.whiteSpace;
shadowStyle.textOverflow = textStyle.textOverflow; shadowStyle.textOverflow = textStyle.textOverflow;
} }
@@ -509,7 +510,6 @@ var HORIZONTAL_MARGIN = 3.0,
// Create or destroy DOM Image element // Create or destroy DOM Image element
if (needsDOMImageElement !== hasDOMImageElement) if (needsDOMImageElement !== hasDOMImageElement)
{
if (hasDOMImageElement) if (hasDOMImageElement)
{ {
_DOMElement.removeChild(_DOMImageElement); _DOMElement.removeChild(_DOMImageElement);
@@ -540,7 +540,7 @@ var HORIZONTAL_MARGIN = 3.0,
hasDOMImageElement = YES; hasDOMImageElement = YES;
} }
} #endif
var size = [self bounds].size, var size = [self bounds].size,
textRect = _CGRectMake(0.0, 0.0, size.width, size.height); textRect = _CGRectMake(0.0, 0.0, size.width, size.height);
@@ -572,47 +572,60 @@ var HORIZONTAL_MARGIN = 3.0,
imageHeight *= scale; imageHeight *= scale;
} }
#if PLATFORM(DOM)
_DOMImageElement.width = imageWidth; _DOMImageElement.width = imageWidth;
_DOMImageElement.height = imageHeight; _DOMImageElement.height = imageHeight;
imageStyle.width = MAX(imageWidth, 0) + "px"; imageStyle.width = imageWidth + "px";
imageStyle.height = MAX(imageHeight, 0) + "px"; imageStyle.height = imageHeight + "px";
#endif
if (_imagePosition === CPImageBelow) if (_imagePosition === CPImageBelow)
{ {
#if PLATFORM(DOM)
imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px"; imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px";
imageStyle.top = FLOOR(size.height - imageHeight) + "px"; imageStyle.top = FLOOR(size.height - imageHeight) + "px";
#endif
textRect.size.height = size.height - imageHeight - VERTICAL_MARGIN; textRect.size.height = size.height - imageHeight - VERTICAL_MARGIN;
} }
else if (_imagePosition === CPImageAbove) else if (_imagePosition === CPImageAbove)
{ {
#if PLATFORM(DOM)
CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, FLOOR(centerX - imageWidth / 2.0), 0); CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, FLOOR(centerX - imageWidth / 2.0), 0);
#endif
textRect.origin.y += imageHeight + VERTICAL_MARGIN; textRect.origin.y += imageHeight + VERTICAL_MARGIN;
textRect.size.height = size.height - imageHeight - VERTICAL_MARGIN; textRect.size.height = size.height - imageHeight - VERTICAL_MARGIN;
} }
else if (_imagePosition === CPImageLeft) else if (_imagePosition === CPImageLeft)
{ {
#if PLATFORM(DOM)
imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px"; imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px";
imageStyle.left = "0px"; imageStyle.left = "0px";
#endif
textRect.origin.x = imageWidth + HORIZONTAL_MARGIN; textRect.origin.x = imageWidth + HORIZONTAL_MARGIN;
textRect.size.width -= imageWidth + HORIZONTAL_MARGIN; textRect.size.width -= imageWidth + HORIZONTAL_MARGIN;
} }
else if (_imagePosition === CPImageRight) else if (_imagePosition === CPImageRight)
{ {
#if PLATFORM(DOM)
imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px"; imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px";
imageStyle.left = FLOOR(size.width - imageWidth) + "px"; imageStyle.left = FLOOR(size.width - imageWidth) + "px";
#endif
textRect.size.width -= imageWidth + HORIZONTAL_MARGIN; textRect.size.width -= imageWidth + HORIZONTAL_MARGIN;
} }
else if (_imagePosition === CPImageOnly) else if (_imagePosition === CPImageOnly)
{ {
#if PLATFORM(DOM)
imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px"; imageStyle.top = FLOOR(centerY - imageHeight / 2.0) + "px";
imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px"; imageStyle.left = FLOOR(centerX - imageWidth / 2.0) + "px";
#endif
} }
} }
#if PLATFORM(DOM)
if (hasDOMTextElement) if (hasDOMTextElement)
{ {
var textRectX = _CGRectGetMinX(textRect), var textRectX = _CGRectGetMinX(textRect),
@@ -646,8 +659,8 @@ var HORIZONTAL_MARGIN = 3.0,
textStyle.top = ROUND(textRectY) + "px"; textStyle.top = ROUND(textRectY) + "px";
textStyle.left = ROUND(textRectX) + "px"; textStyle.left = ROUND(textRectX) + "px";
textStyle.width = MAX(ROUND(textRectWidth), 0) + "px"; textStyle.width = ROUND(textRectWidth) + "px";
textStyle.height = MAX(ROUND(textRectHeight), 0) + "px"; textStyle.height = ROUND(textRectHeight) + "px";
if (shadowStyle) if (shadowStyle)
{ {
@@ -656,8 +669,8 @@ var HORIZONTAL_MARGIN = 3.0,
shadowStyle.top = ROUND(textRectY + _textShadowOffset.height) + "px"; shadowStyle.top = ROUND(textRectY + _textShadowOffset.height) + "px";
shadowStyle.left = ROUND(textRectX + _textShadowOffset.width) + "px"; shadowStyle.left = ROUND(textRectX + _textShadowOffset.width) + "px";
shadowStyle.width = MAX(ROUND(textRectWidth), 0) + "px"; shadowStyle.width = ROUND(textRectWidth) + "px";
shadowStyle.height = MAX(ROUND(textRectHeight), 0) + "px"; shadowStyle.height = ROUND(textRectHeight) + "px";
} }
} }
#endif #endif
+1 -5
View File
@@ -8,7 +8,7 @@ new FileList("**/*").exclude("Jakefile").forEach(function(aFilename)
if (!FILE.isFile(aFilename)) if (!FILE.isFile(aFilename))
return; return;
var buildFilename = FILE.join($BUILD_CJS_CAPPUCCINO, aFilename); var buildFilename = FILE.join($BUILD_CONFIGURATION_DIR, "CommonJS", "cappuccino", aFilename);
filedir (buildFilename, [aFilename], function () filedir (buildFilename, [aFilename], function ()
{ {
@@ -27,7 +27,3 @@ new FileList("**/*").exclude("Jakefile").forEach(function(aFilename)
task ("build", buildFilename); task ("build", buildFilename);
CLOBBER.include(buildFilename); CLOBBER.include(buildFilename);
}); });
task ("build", function() {
setPackageMetadata(FILE.join($BUILD_CJS_CAPPUCCINO, "package.json"));
});
+106 -203
View File
@@ -8,7 +8,6 @@ require("narwhal").ensureEngine("rhino");
var FILE = require("file"); var FILE = require("file");
var OS = require("os"); var OS = require("os");
var UTIL = require("util");
var stream = require("term").stream; var stream = require("term").stream;
var parser = new (require("args").Parser)(); var parser = new (require("args").Parser)();
@@ -25,10 +24,6 @@ parser.option("-F", "--framework", "frameworks")
.push() .push()
.help("Add a frameworks directory, relative to INPUT_PROJECT (default: ['Frameworks'])"); .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") parser.option("-f", "--force", "force")
.def(false) .def(false)
.set(true) .set(true)
@@ -39,16 +34,6 @@ parser.option("--index", "index")
.set() .set()
.help("The root HTML file to modify (default: index.html)"); .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("-c", "--compressor", "compressor")
.def("shrinksafe")
.set()
.help("Select a compressor to use (closure-compiler, yuicompressor, shrinksafe), or \"none\" (default: shrinksafe)");
parser.option("-v", "--verbose", "verbose") parser.option("-v", "--verbose", "verbose")
.def(false) .def(false)
.set(true) .set(true)
@@ -96,34 +81,32 @@ function main(args)
var flattener = new ObjectiveJFlattener(rootPath); var flattener = new ObjectiveJFlattener(rootPath);
flattener.options = options;
flattener.setIncludePaths(frameworks); flattener.setIncludePaths(frameworks);
flattener.setEnvironments([environment, "ObjJ"]); flattener.setEnvironments([environment, "ObjJ"]);
print("Loading application.");
flattener.load(mainPath); flattener.load(mainPath);
flattener.finishLoading();
print("Loading default theme."); var rootResources = flattener.require("objective-j").StaticResource.rootResources();
flattener.require("objective-j").objj_eval("("+(function() {
var blend = [[CPThemeBlend alloc] initWithContentsOfURL:[[CPBundle bundleForClass:[CPApplication class]] pathForResource:[CPApplication defaultThemeName] + ".blend"]];
[blend loadWithDelegate:nil];
})+")")();
var applicationJSs = flattener.buildApplicationJS(); var root = rootResources["file:"];
// FIXME: shouldn't have to do this manually
var components = rootPath.split("/").slice(0, -1);
components[0] = "/";
var node = root;
while (components.length) {
node = node.children()[components.shift()];
}
applicationRoot = node;
print(applicationRoot.toString());
var applicationJS = flattener.buildApplicationJS(applicationRoot);
FILE.copyTree(rootPath, outputPath); FILE.copyTree(rootPath, outputPath);
applicationJSs.forEach(function(applicationJS, n) { outputPath.join("Application.js").write(applicationJS);
var name = "Application"+(n||"")+".js";
if (options.compressor === "none") {
print("skipping compression: " + name);
} else {
print("compressing: " + name);
applicationJS = require("minify/"+options.compressor).compress(applicationJS, { charset : "UTF-8", useServer : true });
}
outputPath.join(name).write(applicationJS, { charset : "UTF-8" });
});
rewriteMainHTML(outputPath.join(options.index)); rewriteMainHTML(outputPath.join(options.index));
} }
@@ -132,197 +115,117 @@ function main(args)
function ObjectiveJFlattener(rootPath) { function ObjectiveJFlattener(rootPath) {
ObjectiveJRuntimeAnalyzer.apply(this, arguments); ObjectiveJRuntimeAnalyzer.apply(this, arguments);
this.filesToCache = {}; this.resourceBuffer = [];
this.fileCacheBuffer = []; this.bundleBuffer = [];
this.functionsBuffer = []; this.functionsBuffer = [];
this._outputBundles = {};
} }
ObjectiveJFlattener.prototype = Object.create(ObjectiveJRuntimeAnalyzer.prototype); ObjectiveJFlattener.prototype = Object.create(ObjectiveJRuntimeAnalyzer.prototype);
ObjectiveJFlattener.prototype.buildApplicationJS = function() { ObjectiveJFlattener.prototype.buildApplicationJS = function(applicationRoot) {
this.serializeStaticResources(applicationRoot);
this.serializeStaticFileExecutables();
this.setupFileCache(); var buffer = []
this.serializeFunctions();
this.serializeFileCache();
var additions = FILE.read(FILE.join(FILE.dirname(module.path), "..", "..", "cappuccino", "lib", "cappuccino", "objj-flatten-additions.js"), { charset:"UTF-8" }); buffer.push("(function(){");
var applicationJSs = []; buffer.push("var appURL = new CFURL('.', ObjectiveJ.pageURL);")
if (this.options.split === 0) { buffer.push(this.bundleBuffer.join("\n"));
var buffer = [];
buffer.push("var baseURL = new CFURL(\".\", ObjectiveJ.pageURL);"); buffer.push("var nodeStack = [];");
buffer.push(additions); buffer.push("var applicationRoot = ObjectiveJ.StaticResource.resourceAtURL(appURL, true);");
buffer.push(this.fileCacheBuffer.join("\n")); buffer.push("var currentNode = null;");
buffer.push(this.functionsBuffer.join("\n")); buffer.push("var newNode;");
buffer.push("ObjectiveJ.bootstrap();");
applicationJSs.push(buffer.join("\n")); 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());
if (!bundle) {
stream.print("\0yellow(Warning:\0) No bundle for path: \0cyan("+node.URL()+"\0)");
}
else if (!this._outputBundles[bundle.path()]) {
this._outputBundles[bundle.path()] = bundle;
stream.print("Writing bundle: \0cyan("+bundle.path()+"\0)");
print(bundle.infoDictionary())
var relative = this.rootPath.relative(bundle.path()).toString();
this.bundleBuffer.push("var bundle = new CFBundle("+(relative ? JSON.stringify(relative) : "appURL")+");");
this.bundleBuffer.push("bundle._loadStatus = " + (1<<4) + ";");
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(" +
JSON.stringify(node.name()) +
", currentNode, " +
JSON.stringify(node.isDirectory()) + ", " +
JSON.stringify(node.isResolved()) + ");");
} else { } else {
var appFilesCount = this.options.split; this.resourceBuffer.push("newNode = applicationRoot;");
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(additions);
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.charset = \"UTF-8\";");
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"));
});
} }
return applicationJSs; // var contents = node.contents();
} // if (contents) {
// this.resourceBuffer.push("newNode._contents = " + JSON.stringify(contents) + ";");
// }
ObjectiveJFlattener.prototype.serializeFunctions = function() { if (!node.children())
var inlineFunctions = true;//this.options.inlineFunctions; return;
var outputFiles = {}; this.resourceBuffer.push("nodeStack.push(currentNode);");
this.resourceBuffer.push("currentNode = newNode;");
var _cachedExecutableFunctions = {}; var children = node.children();
for (var name in children) {
this.require("objective-j").FileExecutable.allFileExecutables().forEach(function(executable) { this.serializeStaticResources(children[name], depth+1);
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;
} }
}
ObjectiveJFlattener.prototype.serializeFileCache = function() { this.resourceBuffer.push("currentNode = nodeStack.pop();");
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 // "$1" is the matching indentation
var scriptTagsBefore = var scriptTagsBefore = '$1<script type = "text/javascript">\n$1 OBJJ_AUTO_BOOTSTRAP = false;\n$1</script>';
'$1<script type = "text/javascript">\n'+ var scriptTagsAfter = '$1<script type = "text/javascript" src = "Application.js"></script>';
'$1 OBJJ_AUTO_BOOTSTRAP = false;\n'+
'$1</script>';
var scriptTagsAfter =
'$1<script type="text/javascript" src="Application.js" charset="UTF-8"></script>';
// enable CPLog:
// scriptTagsAfter = '$1<script type="text/javascript">\n$1 CPLogRegister(CPLogConsole);\n$1</script>\n' + scriptTagsAfter;
function rewriteMainHTML(indexHTMLPath) { function rewriteMainHTML(indexHTMLPath) {
if (indexHTMLPath.isFile()) { if (indexHTMLPath.isFile()) {
var indexHTML = indexHTMLPath.read({ charset : "UTF-8" }); var indexHTML = indexHTMLPath.read();
// inline the Application.js if it's smallish
var applicationJSPath = indexHTMLPath.dirname().join("Application.js");
if (applicationJSPath.size() < 10*1024) {
// escape any dollar signs by replacing them with two
// then indent by splitting/joining on newlines
scriptTagsAfter =
'$1<script type="text/javascript">\n'+
'$1 ' + applicationJSPath.read({ charset : "UTF-8" }).replace(/\$/g, "$$$$").split("\n").join("\n$1 ")+'\n'+
'$1</script>';
}
// attempt to find Objective-J script tag and add ours // attempt to find Objective-J script tag and add ours
var newIndexHTML = indexHTML.replace(/([ \t]+)<script[^>]+Objective-J\.js[^>]+>(?:\s*<\/script>)?/, var newIndexHTML = indexHTML.replace(/([ \t]+)<script[^>]+Objective-J\.js[^>]+>(?:\s*<\/script>)?/,
@@ -330,7 +233,7 @@ function rewriteMainHTML(indexHTMLPath) {
if (newIndexHTML !== indexHTML) { if (newIndexHTML !== indexHTML) {
stream.print("\0green(Modified: "+indexHTMLPath+".\0)"); stream.print("\0green(Modified: "+indexHTMLPath+".\0)");
indexHTMLPath.write(newIndexHTML, { charset : "UTF-8" }); indexHTMLPath.write(newIndexHTML);
return; return;
} }
} else { } else {
-23
View File
@@ -1,23 +0,0 @@
var FILE = require("file");
var sprintf = require("printf").sprintf;
var pkg = null;
function getPackage() {
if (!pkg)
pkg = JSON.parse(FILE.path(module.path).dirname().dirname().join("package.json").read({ charset : "UTF-8" }));
return pkg;
}
exports.version = function() { return getPackage()["version"]; }
exports.revision = function() { return getPackage()["cappuccino-revision"]; }
exports.timestamp = function() { return new Date(getPackage()["cappuccino-timestamp"]); }
exports.fullVersionString = function() {
return sprintf("cappuccino %s (%04d-%02d-%02d %s)",
exports.version(),
exports.timestamp().getUTCFullYear(),
exports.timestamp().getUTCMonth()+1,
exports.timestamp().getUTCDate(),
exports.revision().slice(0,6)
);
}
@@ -5,8 +5,6 @@ var Context = require("interpreter").Context;
ObjectiveJRuntimeAnalyzer = function(rootPath) ObjectiveJRuntimeAnalyzer = function(rootPath)
{ {
this.rootPath = rootPath; this.rootPath = rootPath;
this.rootURL = new CFURL(String(rootPath));
this.context = new Context(); this.context = new Context();
this.scope = setupObjectiveJ(this.context); this.scope = setupObjectiveJ(this.context);
@@ -30,19 +28,6 @@ ObjectiveJRuntimeAnalyzer = function(rootPath)
var url = this.executableURL(); var url = this.executableURL();
return url ? url.absoluteURL().path() : null; return url ? url.absoluteURL().path() : null;
} }
this.require("cappuccino/objj-flatten-additions");
if (!this.context.global.CFHTTPRequest._lookupCachedRequest)
print("Warning: CFHTTPRequest._lookupCachedRequest. Need to import objj-flatten-additions module.");
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) { ObjectiveJRuntimeAnalyzer.prototype.setIncludePaths = function(includePaths) {
@@ -1,57 +0,0 @@
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) {};
+1
View File
@@ -4,6 +4,7 @@
"description": "Cappuccino module", "description": "Cappuccino module",
"keywords": ["objective-j", "objj", "objective j", "capp", "cappuccino"], "keywords": ["objective-j", "objj", "objective j", "capp", "cappuccino"],
"author": "280 North, Inc. (http://280north.com/)", "author": "280 North, Inc. (http://280north.com/)",
"version": "0.8.0",
"objj-frameworks": ["Frameworks"], "objj-frameworks": ["Frameworks"],
"objj-debug-frameworks": ["Frameworks/Debug"], "objj-debug-frameworks": ["Frameworks/Debug"],
"contributors": [ "contributors": [
+2 -33
View File
@@ -453,19 +453,10 @@
@return the index of the object, or \c CPNotFound if it was not found. @return the index of the object, or \c CPNotFound if it was not found.
*/ */
- (unsigned)indexOfObject:(id)anObject sortedByFunction:(Function)aFunction context:(id)aContext - (unsigned)indexOfObject:(id)anObject sortedByFunction:(Function)aFunction context:(id)aContext
{
var result = [self _indexOfObject:anObject sortedByFunction:aFunction context:aContext];
return result >= 0 ? result : CPNotFound;
}
- (unsigned)_indexOfObject:(id)anObject sortedByFunction:(Function)aFunction context:(id)aContext
{ {
if (!aFunction || anObject === undefined) if (!aFunction || anObject === undefined)
return CPNotFound; return CPNotFound;
if (length === 0)
return -1;
var mid, c, first = 0, last = length - 1; var mid, c, first = 0, last = length - 1;
while (first <= last) while (first <= last)
{ {
@@ -485,7 +476,7 @@
} }
} }
return -first-1; return CPNotFound;
} }
/*! /*!
@@ -654,7 +645,7 @@
if (self === anArray) if (self === anArray)
return YES; return YES;
if (anArray === nil || length !== anArray.length) if(length != anArray.length)
return NO; return NO;
var index = 0, var index = 0,
@@ -981,28 +972,6 @@
[self insertObject:objects[index] atIndex:currentIndex]; [self insertObject:objects[index] atIndex:currentIndex];
} }
- (unsigned)insertObject:(id)anObject inArraySortedByDescriptors:(CPArray)descriptors
{
var index = [self _indexOfObject:anObject sortedByFunction:function(lhs, rhs)
{
var i = 0,
count = [descriptors count],
result = CPOrderedSame;
while (i < count)
if((result = [descriptors[i++] compareObject:lhs withObject:rhs]) != CPOrderedSame)
return result;
return result;
} context:nil];
if (index < 0)
index = -index-1;
[self insertObject:anObject atIndex:index];
return index;
}
/*! /*!
Replaces the element at \c anIndex with \c anObject. Replaces the element at \c anIndex with \c anObject.
The current element at position \c anIndex will be removed from the array. The current element at position \c anIndex will be removed from the array.
-11
View File
@@ -154,12 +154,6 @@
var value = object[key]; var value = object[key];
if (value === null)
{
[dictionary setObject:[CPNull null] forKey:key];
continue;
}
if (recursively) if (recursively)
{ {
if (value.constructor === Object) if (value.constructor === Object)
@@ -527,11 +521,6 @@
return self.toString(); return self.toString();
} }
- (BOOL)containsKey:(id)aKey
{
var value = [self objectForKey:aKey];
return ((value !== nil) && (value !== undefined));
}
@end @end
@implementation CPDictionary (CPCoding) @implementation CPDictionary (CPCoding)
-3
View File
@@ -739,10 +739,7 @@
shifts = []; shifts = [];
for (; j < count; ++j) for (; j < count; ++j)
{
[shifts addObject:_ranges[j]]; [shifts addObject:_ranges[j]];
_count -= _ranges[j].length;
}
if ((j = i + 1) < count) if ((j = i + 1) < count)
{ {
-9
View File
@@ -277,14 +277,5 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey";
@end @end
@implementation CPNull (KeyValueCoding)
- (id)valueForKey:(CPString)aKey
{
return self;
}
@end
@import "CPKeyValueObserving.j" @import "CPKeyValueObserving.j"
@import "CPArray+KVO.j" @import "CPArray+KVO.j"
+5 -11
View File
@@ -163,15 +163,9 @@ var CPArrayClass = Ni
@param data the data from which to read the graph @param data the data from which to read the graph
@return the unarchived object @return the unarchived object
*/ */
+ (id)unarchiveObjectWithData:(CPData)aData + (id)unarchiveObjectWithData:(CPData)data
{ {
if (!aData) var unarchiver = [[self alloc] initForReadingWithData:data],
{
CPLog.error("Null data passed to -[CPKeyedUnarchiver unarchiveObjectWithData:].");
return nil;
}
var unarchiver = [[self alloc] initForReadingWithData:aData],
object = [unarchiver decodeObjectForKey:@"root"]; object = [unarchiver decodeObjectForKey:@"root"];
[unarchiver finishDecoding]; [unarchiver finishDecoding];
@@ -206,7 +200,7 @@ var CPArrayClass = Ni
- (CPDictionary)_decodeDictionaryOfObjectsForKey:(CPString)aKey - (CPDictionary)_decodeDictionaryOfObjectsForKey:(CPString)aKey
{ {
var object = _plistObject.valueForKey(aKey), var object = _plistObject.valueForKey(aKey),
objectClass = (object != nil) && object.isa; objectClass = object && object.isa;
if (objectClass === CPDictionaryClass || objectClass === CPMutableDictionaryClass) if (objectClass === CPDictionaryClass || objectClass === CPMutableDictionaryClass)
{ {
@@ -321,7 +315,7 @@ var CPArrayClass = Ni
- (id)decodeObjectForKey:(CPString)aKey - (id)decodeObjectForKey:(CPString)aKey
{ {
var object = _plistObject.valueForKey(aKey), var object = _plistObject.valueForKey(aKey),
objectClass = (object != nil) && object.isa; objectClass = object && object.isa;
if (objectClass === CPDictionaryClass || objectClass === CPMutableDictionaryClass) if (objectClass === CPDictionaryClass || objectClass === CPMutableDictionaryClass)
return _CPKeyedUnarchiverDecodeObjectAtIndex(self, object.valueForKey(_CPKeyedArchiverUIDKey)); return _CPKeyedUnarchiverDecodeObjectAtIndex(self, object.valueForKey(_CPKeyedArchiverUIDKey));
@@ -525,7 +519,7 @@ var _CPKeyedUnarchiverDecodeObjectAtIndex = function(self, anIndex)
// If this object is a member of _CPKeyedArchiverValue, then we know // If this object is a member of _CPKeyedArchiverValue, then we know
// that it is a wrapper for a primitive JavaScript object. // that it is a wrapper for a primitive JavaScript object.
if ((object != nil) && (object.isa === _CPKeyedArchiverValueClass)) if (object && (object.isa === _CPKeyedArchiverValueClass))
object = [object JSObject]; object = [object JSObject];
return object; return object;
+1 -1
View File
@@ -61,7 +61,7 @@
- (void)forwardInvocation:(CPInvocation)anInvocation - (void)forwardInvocation:(CPInvocation)anInvocation
{ {
[CPException raise:CPInvalidArgumentException [CPException raise:CPInvalidArgumentException
reason:@"-forwardInvocation: called on abstract CPProxy class."]; reason:@"-methodSignatureForSelector: called on abstract CPProxy class."];
} }
// FIXME: This should be moved to the runtime? // FIXME: This should be moved to the runtime?
-18
View File
@@ -664,9 +664,6 @@ var CPStringRegexSpecialCharacters = [
*/ */
- (CPString)pathExtension - (CPString)pathExtension
{ {
if (lastIndexOf('.') === CPNotFound)
return "";
return substr(lastIndexOf('.') + 1); return substr(lastIndexOf('.') + 1);
} }
@@ -702,21 +699,6 @@ var CPStringRegexSpecialCharacters = [
return path; return path;
} }
/*!
Deletes the extension of a string.
*/
- (CPString)stringByDeletingPathExtension
{
var extension = [self pathExtension];
if (extension === "")
return self;
if (lastIndexOf('.') < 1)
return self;
return substr(0, [self length] - (extension.length + 1));
}
- (CPString)stringByStandardizingPath - (CPString)stringByStandardizingPath
{ {
return objj_standardize_path(self); return objj_standardize_path(self);
+2 -2
View File
@@ -196,8 +196,8 @@ var CPURLURLStringKey = @"CPURLURLStringKey",
- (id)initWithCoder:(CPCoder)aCoder - (id)initWithCoder:(CPCoder)aCoder
{ {
return [self initWithString:[aCoder decodeObjectForKey:CPURLURLStringKey] return [self initWithURLString:[aCoder decodeObjectForKey:CPURLURLStringKey]
relativeToURL:[aCoder decodeObjectForKey:CPURLBaseURLKey]]; baseURL:[aCoder decodeObjectForKey:CPURLBaseURLKey]];
} }
- (void)encodeWithCoder:(CPCoder)aCoder - (void)encodeWithCoder:(CPCoder)aCoder
+1 -1
View File
@@ -34,7 +34,7 @@ foundationTask = framework ("Foundation", function(foundationTask)
foundationTask.setEmail("feedback @nospam@ 280north.com"); foundationTask.setEmail("feedback @nospam@ 280north.com");
foundationTask.setSummary("Foundation classes for Cappuccino"); foundationTask.setSummary("Foundation classes for Cappuccino");
foundationTask.setIdentifier("com.280n.Foundation"); foundationTask.setIdentifier("com.280n.Foundation");
foundationTask.setVersion(getCappuccinoVersion()); foundationTask.setVersion("0.8.0");
foundationTask.setLicense(BundleTask.License.LGPL_v2_1); foundationTask.setLicense(BundleTask.License.LGPL_v2_1);
foundationTask.setSources(new FileList("**/*.j")); foundationTask.setSources(new FileList("**/*.j"));
foundationTask.setResources(new FileList("Resources/**/*")); foundationTask.setResources(new FileList("Resources/**/*"));
+54 -50
View File
@@ -107,16 +107,14 @@ task ("documentation", function()
// Downloads // Downloads
task ("downloads", ["starter_download"]); task ("downloads", ["starter_download", "tools_download"]);
$STARTER_README = FILE.join('Tools', 'READMEs', 'STARTER-README'); $STARTER_README = FILE.join('Tools', 'READMEs', 'STARTER-README');
$STARTER_BOOTSTRAP = 'bootstrap.sh';
$STARTER_DOWNLOAD = FILE.join($BUILD_DIR, 'Cappuccino', 'Starter'); $STARTER_DOWNLOAD = FILE.join($BUILD_DIR, 'Cappuccino', 'Starter');
$STARTER_DOWNLOAD_APPLICATION = FILE.join($STARTER_DOWNLOAD, 'NewApplication'); $STARTER_DOWNLOAD_APPLICATION = FILE.join($STARTER_DOWNLOAD, 'NewApplication');
$STARTER_DOWNLOAD_README = FILE.join($STARTER_DOWNLOAD, 'README'); $STARTER_DOWNLOAD_README = FILE.join($STARTER_DOWNLOAD, 'README');
$STARTER_DOWNLOAD_BOOTSTRAP = FILE.join($STARTER_DOWNLOAD, 'bootstrap.sh');
task ("starter_download", [$STARTER_DOWNLOAD_APPLICATION, $STARTER_DOWNLOAD_README, $STARTER_DOWNLOAD_BOOTSTRAP, "documentation"], function() task ("starter_download", [$STARTER_DOWNLOAD_APPLICATION, $STARTER_DOWNLOAD_README, "documentation"], function()
{ {
if (FILE.exists($DOCUMENTATION_BUILD)) if (FILE.exists($DOCUMENTATION_BUILD))
{ {
@@ -132,8 +130,8 @@ filedir ($STARTER_DOWNLOAD_APPLICATION, ["CommonJS"], function()
if (OS.system(["capp", "gen", $STARTER_DOWNLOAD_APPLICATION, "-t", "Application", "--noconfig"])) if (OS.system(["capp", "gen", $STARTER_DOWNLOAD_APPLICATION, "-t", "Application", "--noconfig"]))
// FIXME: uncomment this: we get conversion errors // FIXME: uncomment this: we get conversion errors
OS.exit(1); // rake abort if ($? != 0) //OS.exit(1); // rake abort if ($? != 0)
//{} {}
// No tools means no objective-j gem // No tools means no objective-j gem
// FILE.rm(FILE.join($STARTER_DOWNLOAD_APPLICATION, 'Rakefile')) // FILE.rm(FILE.join($STARTER_DOWNLOAD_APPLICATION, 'Rakefile'))
}); });
@@ -143,11 +141,36 @@ filedir ($STARTER_DOWNLOAD_README, [$STARTER_README], function()
cp($STARTER_README, $STARTER_DOWNLOAD_README); cp($STARTER_README, $STARTER_DOWNLOAD_README);
}); });
filedir ($STARTER_DOWNLOAD_BOOTSTRAP, [$STARTER_BOOTSTRAP], function() $TOOLS_README = FILE.join('Tools', 'READMEs', 'TOOLS-README');
$TOOLS_EDITORS = FILE.join('Tools', 'Editors');
$TOOLS_INSTALLER = FILE.join('Tools', 'Install', 'install-tools');
$TOOLS_DOWNLOAD = FILE.join($BUILD_DIR, 'Cappuccino', 'Tools');
$TOOLS_DOWNLOAD_EDITORS = FILE.join($TOOLS_DOWNLOAD, 'Editors');
$TOOLS_DOWNLOAD_README = FILE.join($TOOLS_DOWNLOAD, 'README');
$TOOLS_DOWNLOAD_INSTALLER = FILE.join($TOOLS_DOWNLOAD, 'install-tools');
$TOOLS_DOWNLOAD_COMMONJS = FILE.join($BUILD_DIR, "Cappuccino", "Tools", "CommonJS", "objective-j");
task ("tools_download", [$TOOLS_DOWNLOAD_EDITORS, $TOOLS_DOWNLOAD_README, $TOOLS_DOWNLOAD_INSTALLER, $TOOLS_DOWNLOAD_COMMONJS]);
filedir ($TOOLS_DOWNLOAD_EDITORS, [$TOOLS_EDITORS], function()
{ {
var bootstrap = FILE.read($STARTER_BOOTSTRAP, { charset : "UTF-8" }).replace('install_capp=""', 'install_capp="yes"'); cp_r(FILE.join($TOOLS_EDITORS, '.'), $TOOLS_DOWNLOAD_EDITORS);
FILE.write($STARTER_DOWNLOAD_BOOTSTRAP, bootstrap, { charset : "UTF-8" }); });
OS.system(["chmod", "+x", $STARTER_DOWNLOAD_BOOTSTRAP]);
filedir ($TOOLS_DOWNLOAD_README, [$TOOLS_README], function()
{
cp($TOOLS_README, $TOOLS_DOWNLOAD_README);
});
filedir ($TOOLS_DOWNLOAD_INSTALLER, [$TOOLS_INSTALLER], function()
{
cp($TOOLS_INSTALLER, $TOOLS_DOWNLOAD_INSTALLER);
});
filedir ($TOOLS_DOWNLOAD_COMMONJS, ["CommonJS"], function()
{
rm_rf($TOOLS_DOWNLOAD_COMMONJS);
cp_r($COMMONJS_PRODUCT, $TOOLS_DOWNLOAD_COMMONJS);
}); });
// Deployment // Deployment
@@ -217,21 +240,14 @@ task ("demos", function()
return !demo.excluded(); return !demo.excluded();
}).forEach(function(demo) }).forEach(function(demo)
{ {
// copy frameworks into the demos var outputPath = FILE.join(demosDir, demo.name().replace(/\s/g, "-")+".zip");
cp_r(FILE.join($STARTER_DOWNLOAD_APPLICATION, "Frameworks"), FILE.join(demo.path(), "Frameworks")); OS.system("cd "+OS.enquote(FILE.dirname(demo.path()))+"; zip -ry -8 "+OS.enquote(outputPath)+" "+OS.enquote(demo.path()));
rm_rf(FILE.join(demo.path(), "Frameworks", "Debug"));
var outputPath = demo.name().replace(/\s/g, "-")+".zip";
OS.system("cd "+OS.enquote(FILE.dirname(demo.path()))+" && zip -ry -8 "+OS.enquote(outputPath)+" "+OS.enquote(FILE.basename(demo.path())));
// remove the frameworks
rm_rf(FILE.join(demo.path(), "Frameworks"));
}); });
}); });
// Testing // Testing
task("test", ["CommonJS", "test-only"]); task("test", ["build", "test-only"]);
task("test-only", function() task("test-only", function()
{ {
@@ -265,22 +281,20 @@ function pushPackage(path, remote, branch)
{ {
branch = branch || "master"; branch = branch || "master";
var pushPackagesPath = FILE.path(".push-package");
pushPackagesPath.mkdirs();
var packagePath = pushPackagesPath.join(remote.replace(/[^\w]/g, "_"));
stream.print("Pushing \0blue(" + path + "\0) to "+branch+" of \0blue(" + remote + "\0)"); stream.print("Pushing \0blue(" + path + "\0) to "+branch+" of \0blue(" + remote + "\0)");
if (packagePath.isDirectory()) FILE.mkdirs(".push-package");
OS.system(buildCmd([["cd", packagePath], ["git", "fetch"]]));
else
OS.system(["git", "clone", remote, packagePath]);
if (OS.system(buildCmd([["cd", packagePath], ["git", "checkout", "origin/"+branch]]))) { var pushPackageDir = FILE.join(".push-package", remote.replace(/[^\w]/g, "_"));
if (FILE.exists(pushPackageDir))
OS.system(buildCmd([["cd", pushPackageDir], ["git", "fetch"]]));
else
OS.system(["git", "clone", remote, pushPackageDir]);
if (OS.system(buildCmd([["cd", pushPackageDir], ["git", "checkout", "origin/"+branch]]))) {
if (OS.system(buildCmd([ if (OS.system(buildCmd([
["cd", packagePath], ["cd", pushPackageDir],
["git", "symbolic-ref", "HEAD", "refs/heads/"+branch], ["git", "symbolic-ref", "HEAD", "refs/heads/"+branch],
["rm", ".git/index"], ["rm", ".git/index"],
["git", "clean", "-fdx"] ["git", "clean", "-fdx"]
@@ -288,30 +302,20 @@ function pushPackage(path, remote, branch)
throw "pushPackage failed"; throw "pushPackage failed";
} }
if (OS.system("cd "+OS.enquote(packagePath)+" && git rm --ignore-unmatch -r * && rm -rf *")) if (OS.system("cd "+OS.enquote(pushPackageDir)+" && git rm --ignore-unmatch -r * && rm -rf *"))
throw "pushPackage failed"; throw "pushPackage failed";
if (OS.system("cp -R "+OS.enquote(path)+"/* "+OS.enquote(packagePath)+"/.")) if (OS.system("cp -R "+OS.enquote(path)+"/* "+OS.enquote(pushPackageDir)+"/."))
throw "pushPackage failed"; throw "pushPackage failed";
var pkg = JSON.parse(packagePath.join("package.json").read({ charset : "UTF-8" })); OS.system(buildCmd([
["cd", pushPackageDir],
stream.print(" Version: \0purple(" + pkg["version"] + "\0)");
stream.print(" Revision: \0purple(" + pkg["cappuccino-revision"] + "\0)");
stream.print(" Timestamp: \0purple(" + pkg["cappuccino-timestamp"] + "\0)");
var cmd = [
["cd", packagePath],
["git", "add", "."], ["git", "add", "."],
["git", "commit", "-m", "version="+pkg.version+"; revision="+pkg["cappuccino-revision"]+"; timestamp="+pkg["cappuccino-timestamp"]+";"] ["git", "commit", "-m", "Pushed on " + new Date()]
]; ]));
if (pkg["cappuccino-revision"])
cmd.push(["git", "tag", "rev-"+pkg["cappuccino-revision"].slice(0,6)]);
OS.system(buildCmd(cmd));
if (OS.system(buildCmd([ if (OS.system(buildCmd([
["cd", packagePath], ["cd", pushPackageDir],
["git", "push", "--tags", "origin", "HEAD:"+branch] ["git", "push", "origin", "HEAD:"+branch]
]))) ])))
throw "pushPackage failed"; throw "pushPackage failed";
} }
+1 -30
View File
@@ -81,36 +81,7 @@ function resolveMainBundleURL()
Executable.fileImporterForURL(mainBundleURL)(mainFileURL.lastPathComponent(), YES, function() Executable.fileImporterForURL(mainBundleURL)(mainFileURL.lastPathComponent(), YES, function()
{ {
disableCFURLCaching(); disableCFURLCaching();
afterDocumentLoad(function() afterDocumentLoad(main);
{
var hashString = window.location.hash.substring(1),
args = [];
if (hashString.length)
{
args = hashString.split("/");
for (var i = 0, count = args.length; i < count; i++)
args[i] = decodeURIComponent(args[i]);
}
var namedArgsArray = window.location.search.substring(1).split("&"),
namedArgs = new CFMutableDictionary();
for (var i = 0, count = namedArgsArray.length; i < count; i++)
{
var thisArg = namedArgsArray[i].split("=");
if (!thisArg[0])
continue;
if (thisArg[1] == null)
thisArg[1] = true;
namedArgs.setValueForKey(decodeURIComponent(thisArg[0]), decodeURIComponent(thisArg[1]));
}
main(args, namedArgs);
});
}); });
}); });
} }
+5 -59
View File
@@ -49,7 +49,6 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL)
this._resourcesDirectoryURL = new CFURL("Resources/", aURL); this._resourcesDirectoryURL = new CFURL("Resources/", aURL);
this._staticResource = NULL; this._staticResource = NULL;
this._isValid = NO;
this._loadStatus = CFBundleUnloaded; this._loadStatus = CFBundleUnloaded;
this._loadRequests = []; this._loadRequests = [];
@@ -59,47 +58,34 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL)
this._eventDispatcher = new EventDispatcher(this); this._eventDispatcher = new EventDispatcher(this);
} }
DISPLAY_NAME(CFBundle);
CFBundle.environments = function() CFBundle.environments = function()
{ {
// Passed in by GCC. // Passed in by GCC.
return ENVIRONMENTS; return ENVIRONMENTS;
} }
DISPLAY_NAME(CFBundle.environments);
CFBundle.bundleContainingURL = function(/*CFURL|String*/ aURL) CFBundle.bundleContainingURL = function(/*CFURL|String*/ aURL)
{ {
aURL = new CFURL(".", makeAbsoluteURL(aURL)); aURL = new CFURL(".", makeAbsoluteURL(aURL));
var previousURLString, while (aURL.path() !== "/")
URLString = aURL.absoluteString();
while (!previousURLString || previousURLString !== URLString)
{ {
var bundle = CFBundlesForURLStrings[URLString]; var bundle = CFBundlesForURLStrings[aURL.absoluteString()];
if (bundle && bundle._isValid) if (bundle)
return bundle; return bundle;
aURL = new CFURL("..", aURL); aURL = new CFURL("..", aURL);
previousURLString = URLString;
URLString = aURL.absoluteString();
} }
return NULL; return NULL;
} }
DISPLAY_NAME(CFBundle.bundleContainingURL);
CFBundle.mainBundle = function() CFBundle.mainBundle = function()
{ {
return new CFBundle(mainBundleURL); return new CFBundle(mainBundleURL);
} }
DISPLAY_NAME(CFBundle.mainBundle);
function addClassToBundle(aClass, aBundle) function addClassToBundle(aClass, aBundle)
{ {
if (aBundle) if (aBundle)
@@ -111,22 +97,16 @@ CFBundle.bundleForClass = function(/*Class*/ aClass)
return CFBundlesForClasses[aClass.name] || CFBundle.mainBundle(); return CFBundlesForClasses[aClass.name] || CFBundle.mainBundle();
} }
DISPLAY_NAME(CFBundle.bundleForClass);
CFBundle.prototype.bundleURL = function() CFBundle.prototype.bundleURL = function()
{ {
return this._bundleURL; return this._bundleURL;
} }
DISPLAY_NAME(CFBundle.prototype.bundleURL);
CFBundle.prototype.resourcesDirectoryURL = function() CFBundle.prototype.resourcesDirectoryURL = function()
{ {
return this._resourcesDirectoryURL; return this._resourcesDirectoryURL;
} }
DISPLAY_NAME(CFBundle.prototype.resourcesDirectoryURL);
CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ aType, /*String*/ aSubDirectory) CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ aType, /*String*/ aSubDirectory)
{ {
if (aType) if (aType)
@@ -140,8 +120,6 @@ CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ a
return resourceURL.absoluteURL(); return resourceURL.absoluteURL();
} }
DISPLAY_NAME(CFBundle.prototype.resourceURL);
CFBundle.prototype.mostEligibleEnvironmentURL = function() CFBundle.prototype.mostEligibleEnvironmentURL = function()
{ {
if (this._mostEligibleEnvironmentURL === undefined) if (this._mostEligibleEnvironmentURL === undefined)
@@ -150,8 +128,6 @@ CFBundle.prototype.mostEligibleEnvironmentURL = function()
return this._mostEligibleEnvironmentURL; return this._mostEligibleEnvironmentURL;
} }
DISPLAY_NAME(CFBundle.prototype.mostEligibleEnvironmentURL);
CFBundle.prototype.executableURL = function() CFBundle.prototype.executableURL = function()
{ {
if (this._executableURL === undefined) if (this._executableURL === undefined)
@@ -167,22 +143,16 @@ CFBundle.prototype.executableURL = function()
return this._executableURL; return this._executableURL;
} }
DISPLAY_NAME(CFBundle.prototype.executableURL);
CFBundle.prototype.infoDictionary = function() CFBundle.prototype.infoDictionary = function()
{ {
return this._infoDictionary; return this._infoDictionary;
} }
DISPLAY_NAME(CFBundle.prototype.infoDictionary);
CFBundle.prototype.valueForInfoDictionaryKey = function(/*String*/ aKey) CFBundle.prototype.valueForInfoDictionaryKey = function(/*String*/ aKey)
{ {
return this._infoDictionary.valueForKey(aKey); return this._infoDictionary.valueForKey(aKey);
} }
DISPLAY_NAME(CFBundle.prototype.valueForInfoDictionaryKey);
CFBundle.prototype.hasSpritedImages = function() CFBundle.prototype.hasSpritedImages = function()
{ {
var environments = this._infoDictionary.valueForKey("CPBundleEnvironmentsWithImageSprites") || [], var environments = this._infoDictionary.valueForKey("CPBundleEnvironmentsWithImageSprites") || [],
@@ -196,15 +166,11 @@ CFBundle.prototype.hasSpritedImages = function()
return NO; return NO;
} }
DISPLAY_NAME(CFBundle.prototype.hasSpritedImages);
CFBundle.prototype.environments = function() CFBundle.prototype.environments = function()
{ {
return this._infoDictionary.valueForKey("CPBundleEnvironments") || ["ObjJ"]; return this._infoDictionary.valueForKey("CPBundleEnvironments") || ["ObjJ"];
} }
DISPLAY_NAME(CFBundle.prototype.environments);
CFBundle.prototype.mostEligibleEnvironment = function(/*Array*/ environments) CFBundle.prototype.mostEligibleEnvironment = function(/*Array*/ environments)
{ {
environments = environments || this.environments(); environments = environments || this.environments();
@@ -228,15 +194,11 @@ CFBundle.prototype.mostEligibleEnvironment = function(/*Array*/ environments)
return NULL; return NULL;
} }
DISPLAY_NAME(CFBundle.prototype.mostEligibleEnvironment);
CFBundle.prototype.isLoading = function() CFBundle.prototype.isLoading = function()
{ {
return this._loadStatus & CFBundleLoading; return this._loadStatus & CFBundleLoading;
} }
DISPLAY_NAME(CFBundle.prototype.isLoading);
CFBundle.prototype.load = function(/*BOOL*/ shouldExecute) CFBundle.prototype.load = function(/*BOOL*/ shouldExecute)
{ {
if (this._loadStatus !== CFBundleUnloaded) if (this._loadStatus !== CFBundleUnloaded)
@@ -261,13 +223,7 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute)
function onsuccess(/*Event*/ anEvent) function onsuccess(/*Event*/ anEvent)
{ {
self._loadStatus &= ~CFBundleLoadingInfoPlist; self._loadStatus &= ~CFBundleLoadingInfoPlist;
self._infoDictionary = anEvent.request.responsePropertyList();
var infoDictionary = anEvent.request.responsePropertyList();
self._isValid = !!infoDictionary || CFBundle.mainBundle() === self;
if (infoDictionary)
self._infoDictionary = infoDictionary;
if (!self._infoDictionary) if (!self._infoDictionary)
{ {
@@ -284,7 +240,6 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute)
function onfailure() function onfailure()
{ {
self._isValid = CFBundle.mainBundle() === self;
self._loadStatus = CFBundleUnloaded; self._loadStatus = CFBundleUnloaded;
finishBundleLoadingWithError(self, new Error("Could not load bundle at \"" + self.bundleURL() + "\"")); finishBundleLoadingWithError(self, new Error("Could not load bundle at \"" + self.bundleURL() + "\""));
@@ -294,8 +249,6 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute)
}); });
} }
DISPLAY_NAME(CFBundle.prototype.load);
function finishBundleLoadingWithError(/*CFBundle*/ aBundle, /*Event*/ anError) function finishBundleLoadingWithError(/*CFBundle*/ aBundle, /*Event*/ anError)
{ {
resolveStaticResource(aBundle._staticResource); resolveStaticResource(aBundle._staticResource);
@@ -437,13 +390,12 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure)
CFTotalBytesLoaded += anEvent.request.responseText().length; CFTotalBytesLoaded += anEvent.request.responseText().length;
decompileStaticFile(aBundle, anEvent.request.responseText(), spritedImagesURL); decompileStaticFile(aBundle, anEvent.request.responseText(), spritedImagesURL);
aBundle._loadStatus &= ~CFBundleLoadingSpritedImages; aBundle._loadStatus &= ~CFBundleLoadingSpritedImages;
success();
} }
catch(anException) catch(anException)
{ {
failure(anException); failure(anException);
} }
success();
}, failure); }, failure);
} }
@@ -663,22 +615,16 @@ CFBundle.prototype.addEventListener = function(/*String*/ anEventName, /*Functio
this._eventDispatcher.addEventListener(anEventName, anEventListener); this._eventDispatcher.addEventListener(anEventName, anEventListener);
} }
DISPLAY_NAME(CFBundle.prototype.addEventListener);
CFBundle.prototype.removeEventListener = function(/*String*/ anEventName, /*Function*/ anEventListener) CFBundle.prototype.removeEventListener = function(/*String*/ anEventName, /*Function*/ anEventListener)
{ {
this._eventDispatcher.removeEventListener(anEventName, anEventListener); this._eventDispatcher.removeEventListener(anEventName, anEventListener);
} }
DISPLAY_NAME(CFBundle.prototype.removeEventListener);
CFBundle.prototype.onerror = function(/*Event*/ anEvent) CFBundle.prototype.onerror = function(/*Event*/ anEvent)
{ {
throw anEvent.error; throw anEvent.error;
} }
DISPLAY_NAME(CFBundle.prototype.onerror);
CFBundle.prototype.bundlePath = function() CFBundle.prototype.bundlePath = function()
{ {
return this._bundleURL.absoluteURL().path(); return this._bundleURL.absoluteURL().path();
+34 -78
View File
@@ -177,8 +177,7 @@ CFHTTPRequest.prototype.responseText = function()
CFHTTPRequest.prototype.setRequestHeader = function(/*String*/ aHeader, /*Object*/ aValue) CFHTTPRequest.prototype.setRequestHeader = function(/*String*/ aHeader, /*Object*/ aValue)
{ {
if (!this._URL) return this._nativeRequest.setRequestHeader(aHeader, aValue);
return this._nativeRequest.setRequestHeader(aHeader, aValue);
} }
CFHTTPRequest.prototype.getResponseHeader = function(/*String*/ aHeader) CFHTTPRequest.prototype.getResponseHeader = function(/*String*/ aHeader)
@@ -197,67 +196,13 @@ CFHTTPRequest.prototype.overrideMimeType = function(/*String*/ aMimeType)
return this._nativeRequest.overrideMimeType(aMimeType); return this._nativeRequest.overrideMimeType(aMimeType);
} }
CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*Boolean*/ isAsynchronous, /*String*/ aUser, /*String*/ aPassword) CFHTTPRequest.prototype.open = function(/*...*/)
{ {
aURL = makeAbsoluteURL(aURL); return this._nativeRequest.open(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
if (aURL.isStorageURL())
{
this._URL = aURL;
this._method = aMethod;
this._isAsynchronous = isAsynchronous;
return;
}
else if (this._URL)
{
delete this._URL;
delete this._method;
delete this._isAsynchronous;
}
return this._nativeRequest.open(aMethod, aURL + "", isAsynchronous, aUser, aPassword);
}
function sendStorage(/*CFHTTPRequest*/ aRequest, /*String*/ aBody)
{
var method = aRequest._method.toUpperCase(),
eventDispatcher = aRequest._eventDispatcher;
if (method === "GET")
{
var item = localStorage.getItem(aRequest._URL);
if (item === undefined)
eventDispatcher.dispatchEvent({ type:"failure", request:aRequest });
else
eventDispatcher.dispatchEvent({ type:"success", request:aRequest });
}
else if (method === "POST" || method === "PUT")
{
try
{
localStorage.setItem(aRequest._URL, aBody);
eventDispatcher.dispatchEvent({ type:"success", request:aRequest });
}
catch (anException)
{
eventDispatcher.dispatchEvent({ type:"failure", request:aRequest });
}
}
else
eventDispatcher.dispatchEvent({ type:"failure", request:aRequest });
} }
CFHTTPRequest.prototype.send = function(/*Object*/ aBody) CFHTTPRequest.prototype.send = function(/*Object*/ aBody)
{ {
if (this._URL)
return sendStorage(this, aBody);
try try
{ {
return this._nativeRequest.send(aBody); return this._nativeRequest.send(aBody);
@@ -309,32 +254,43 @@ function determineAndDispatchHTTPRequestEvents(/*CFHTTPRequest*/ aRequest)
function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure) function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure)
{ {
#ifdef BROWSER
var request = new CFHTTPRequest(); var request = new CFHTTPRequest();
request.onsuccess = Asynchronous(onsuccess);
request.onfailure = Asynchronous(onfailure);
if (aURL.pathExtension() === "plist") if (aURL.pathExtension() === "plist")
request.overrideMimeType("text/xml"); request.overrideMimeType("text/xml");
if (exports.asyncLoader) request.open("GET", aURL.absoluteString(), YES);
{
request.onsuccess = Asynchronous(onsuccess);
request.onfailure = Asynchronous(onfailure);
}
else
{
request.onsuccess = onsuccess;
request.onfailure = onfailure;
}
request.open("GET", aURL.absoluteString(), exports.asyncLoader);
request.send(""); request.send("");
#else
var FILE = require("file"),
filePath = aURL.absoluteURL().path();
if (!FILE.exists(filePath))
return onfailure();
this._responseText = FILE.read(filePath, { charset:"UTF-8" });
onsuccess({ type:"success", request:this });
#endif
} }
#ifdef BROWSER #ifdef COMMONJS
exports.asyncLoader = YES; FileRequest.prototype.responseText = function()
#else {
exports.asyncLoader = NO; return this._responseText;
#endif }
// FIXME: Get rid of these when we no longer need Mock requests in flatten. FileRequest.prototype.responseXML = function()
exports.Asynchronous = Asynchronous; {
exports.determineAndDispatchHTTPRequestEvents = determineAndDispatchHTTPRequestEvents; return new DOMParser().parseFromString(anXMLString, "text/xml");
}
FileRequest.prototype.responsePropertyList = function()
{
return CFPropertyList.propertyListFromString(this.responseText());
}
#endif
+7 -46
View File
@@ -314,7 +314,7 @@ function resolveURL(aURL)
resolvedPathComponents.splice(basePathComponents.length - 1, 1); resolvedPathComponents.splice(basePathComponents.length - 1, 1);
// If this doesn't start with a "..", then we're simply appending to already standardized paths. // If this doesn't start with a "..", then we're simply appending to already standardized paths.
if (pathComponents.length && (pathComponents[0] === ".." || pathComponents[0] === ".")) if (pathComponents.length && pathComponents[0] === "..")
standardizePathComponents(resolvedPathComponents, YES); standardizePathComponents(resolvedPathComponents, YES);
resolvedParts.pathComponents = resolvedPathComponents; resolvedParts.pathComponents = resolvedPathComponents;
@@ -352,26 +352,19 @@ function standardizePathComponents(/*Array*/ pathComponents, /*BOOL*/ inPlace)
var index = 0, var index = 0,
resultIndex = 0, resultIndex = 0,
count = pathComponents.length, count = pathComponents.length,
result = inPlace ? pathComponents : [], result = inPlace ? pathComponents : [];
startsWithPeriod = NO;
for (; index < count; ++index) for (; index < count; ++index)
{ {
var component = pathComponents[index]; var component = pathComponents[index];
if (component === "") if (component === "" || component === ".")
continue; continue;
if (component === ".")
{
startsWithPeriod = resultIndex === 0;
continue;
}
if (component !== ".." || resultIndex === 0 || result[resultIndex - 1] === "..") if (component !== ".." || resultIndex === 0 || result[resultIndex - 1] === "..")
{ {
result[resultIndex] = component; //if (resultIndex !== index)
result[resultIndex] = component;
resultIndex++; resultIndex++;
@@ -382,9 +375,6 @@ function standardizePathComponents(/*Array*/ pathComponents, /*BOOL*/ inPlace)
--resultIndex; --resultIndex;
} }
if (startsWithPeriod && resultIndex === 0)
result[resultIndex++] = ".";
result.length = resultIndex; result.length = resultIndex;
return result; return result;
@@ -498,27 +488,6 @@ CFURL.prototype.authority = function()
DISPLAY_NAME(CFURL.prototype.authority); DISPLAY_NAME(CFURL.prototype.authority);
CFURL.prototype.isStorageURL = function()
{
return this.isLocalStorageURL() || this.isSessionStorageURL();
}
DISPLAY_NAME(CFURL.prototype.isStorageURL);
CFURL.prototype.isLocalStorageURL = function()
{
return this.scheme() === "storage.local";
}
DISPLAY_NAME(CFURL.prototype.isLocalStorageURL);
CFURL.prototype.isSessionStorageURL = function()
{
return this.scheme() === "storage.session";
}
DISPLAY_NAME(CFURL.prototype.isSessionStorageURL);
CFURL.prototype.hasDirectoryPath = function() CFURL.prototype.hasDirectoryPath = function()
{ {
var hasDirectoryPath = this._hasDirectoryPath; var hasDirectoryPath = this._hasDirectoryPath;
@@ -536,11 +505,10 @@ CFURL.prototype.hasDirectoryPath = function()
var lastPathComponent = this.lastPathComponent(); var lastPathComponent = this.lastPathComponent();
hasDirectoryPath = lastPathComponent === "." || lastPathComponent === ".."; hasDirectoryPath = lastPathComponent === "." || lastPathComponent === "..";
this._hasDirectoryPath = hasDirectoryPath; this._hasDirectoryPath = hasDirectoryPath;
} }
return hasDirectoryPath; return this._hasDirectoryPath;
} }
DISPLAY_NAME(CFURL.prototype.hasDirectoryPath); DISPLAY_NAME(CFURL.prototype.hasDirectoryPath);
@@ -678,14 +646,7 @@ CFURL.prototype.asDirectoryPathURL = function()
if (this.hasDirectoryPath()) if (this.hasDirectoryPath())
return this; return this;
var lastPathComponent = this.lastPathComponent(); return new CFURL(this.lastPathComponent() + "/", this);
// We do this because on Windows the path may start with C: and be
// misinterpreted as a scheme.
if (lastPathComponent !== "/")
lastPathComponent = "./" + lastPathComponent;
return new CFURL(lastPathComponent + "/", this);
} }
DISPLAY_NAME(CFURL.prototype.asDirectoryPathURL); DISPLAY_NAME(CFURL.prototype.asDirectoryPathURL);
+224 -160
View File
@@ -20,106 +20,174 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
GLOBAL(CPLogDisable) = false;
var CPLogDefaultTitle = "Cappuccino";
var CPLogLevels = ["fatal", "error", "warn", "info", "debug", "trace"]; var CPLogLevels = ["fatal", "error", "warn", "info", "debug", "trace"];
var CPLogDefaultLevel = CPLogLevels[3];
var _CPLogLevelsInverted = {}; var _CPLogLevelsInverted = {};
for (var i = 0; i < CPLogLevels.length; i++) for (var i = 0; i < CPLogLevels.length; i++)
_CPLogLevelsInverted[CPLogLevels[i]] = i; _CPLogLevelsInverted[CPLogLevels[i]] = i;
var _CPLogRegistrations = {}; // defaults:
// Register Functions: var CPLogDefaultTitle = "Cappuccino";
var CPLogDefaultLevel = CPLogLevels[3];
// Register a logger for all levels, or up to an optional max level var CPLogDefaultFormatter = function(aParameters, aLevel, aTitle, useColor)
GLOBAL(CPLogRegister) = function(aProvider, aMaxLevel)
{ {
CPLogRegisterRange(aProvider, CPLogLevels[0], aMaxLevel || CPLogLevels[CPLogLevels.length-1]); var color = useColor && defaultFormatterColorMap[aLevel];
} var important = {"fatal":true,"error":true,"warn":true}[aLevel];
// Register a logger for a range of levels // for unimportant messages colorize just the level
GLOBAL(CPLogRegisterRange) = function(aProvider, aMinLevel, aMaxLevel) if (!important && color)
{ aLevel = "\0"+color+"(" + aLevel + "\0)";
var min = _CPLogLevelsInverted[aMinLevel];
var max = _CPLogLevelsInverted[aMaxLevel];
if (min !== undefined && max !== undefined) aLevel = aLevel ? ' [' + aLevel + ']' : '';
for (var i = 0; i <= max; i++)
CPLogRegisterSingle(aProvider, CPLogLevels[i]);
}
// Register a logger for a single level
GLOBAL(CPLogRegisterSingle) = function(aProvider, aLevel)
{
if (!_CPLogRegistrations[aLevel])
_CPLogRegistrations[aLevel] = [];
// prevent duplicate registrations
for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
if (_CPLogRegistrations[aLevel][i] === aProvider)
return;
_CPLogRegistrations[aLevel].push(aProvider);
}
GLOBAL(CPLogUnregister) = function(aProvider) {
for (var aLevel in _CPLogRegistrations)
for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
if (_CPLogRegistrations[aLevel][i] === aProvider)
_CPLogRegistrations[aLevel].splice(i--, 1); // decrement since we're removing an element
}
// Main CPLog, which dispatches to individual loggers
function _CPLogDispatch(parameters, aLevel, aTitle)
{
if (aTitle == undefined)
aTitle = CPLogDefaultTitle;
if (aLevel == undefined)
aLevel = CPLogDefaultLevel;
// use sprintf if param 0 is a string and there is more than one param. otherwise just convert param 0 to a string // use sprintf if param 0 is a string and there is more than one param. otherwise just convert param 0 to a string
var message = (typeof parameters[0] == "string" && parameters.length > 1) ? exports.sprintf.apply(null, parameters) : String(parameters[0]); var aString = (typeof aParameters[0] === "string" && aParameters.length > 1) ? exports.sprintf.apply(null, aParameters) : String(aParameters[0]);
if (_CPLogRegistrations[aLevel])
for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
_CPLogRegistrations[aLevel][i](message, aLevel, aTitle);
}
// Setup CPLog() and CPLog.xxx() aliases
GLOBAL(CPLog) = function() { _CPLogDispatch(arguments); }
for (var i = 0; i < CPLogLevels.length; i++)
CPLog[CPLogLevels[i]] = (function(level) { return function() { _CPLogDispatch(arguments, level); }; })(CPLogLevels[i]);
// Helpers functions:
var _CPFormatLogMessage = function(aString, aLevel, aTitle)
{
var now = new Date(); var now = new Date();
aLevel = ( aLevel == null ? '' : ' [' + aLevel + ']' ); var message = exports.sprintf("%4d-%02d-%02d %02d:%02d:%02d.%03d %s%s: %s",
now.getFullYear(), now.getMonth(), now.getDate(),
now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds(),
aTitle, aLevel, aString);
if (typeof exports.sprintf == "function") // for important messages colorize entire message
return exports.sprintf("%4d-%02d-%02d %02d:%02d:%02d.%03d %s%s: %s", if (important && color)
now.getFullYear(), now.getMonth(), now.getDate(), message = "\0"+color+"(" + message + "\0)";
now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds(),
aTitle, aLevel, aString); return message;
else
return now + " " + aTitle + aLevel + ": " + aString;
} }
// Loggers: var defaultFormatterColorMap = {
"fatal": "red",
"error": "red",
"warn" : "yellow",
"info" : "green",
"debug": "cyan",
"trace": "blue"
};
#if COMMONJS
// attempt to get a better default title based on the command line name
try {
if (require("system").args[0])
CPLogDefaultTitle = require("file").basename(require("system").args[0]);
} catch (e) {
}
#endif
// main Logger constructor / API:
function CreateLogger(aTitle)
{
// public
var self = function() { self._dispatch(arguments, null, _title); };
// logger.error, logger.info, logger.warn
for (var i = 0; i < CPLogLevels.length; i++)
self[CPLogLevels[i]] = (function(level) { return function() { self._dispatch(arguments, level, _title); }; })(CPLogLevels[i]);
self.createLogger = function()
{
return CreateLogger.apply(this, arguments);;
}
// Register a logger for all levels, or up to an optional max level
self.register = function(aProvider, aMaxLevel)
{
if (aMaxLevel === undefined) aMaxLevel = CPLogLevels.length;
self.registerRange(aProvider, 0, aMaxLevel);
}
// Register a logger for a range of levels
self.registerRange = function(aProvider, aMinLevel, aMaxLevel)
{
if (typeof aMinLevel !== "number") aMinLevel = _CPLogLevelsInverted[aMinLevel];
if (typeof aMaxLevel !== "number") aMaxLevel = _CPLogLevelsInverted[aMaxLevel];
if (aMinLevel !== undefined && aMaxLevel !== undefined)
for (var level = aMinLevel; level <= aMaxLevel; level++)
self.registerSingle(aProvider, level);
}
// Register a logger for a single level
self.registerSingle = function(aProvider, aLevel)
{
if (typeof aLevel === "number") aLevel = CPLogLevels[aLevel];
if (!_registrations[aLevel])
_registrations[aLevel] = [];
// prevent duplicate _registrations
for (var i = 0; i < _registrations[aLevel].length; i++)
if (_registrations[aLevel][i] === aProvider)
return;
_registrations[aLevel].push(aProvider);
}
// Unregister a logger for all levels
self.unregister = function(aProvider)
{
for (var aLevel in _registrations)
for (var i = 0; i < _registrations[aLevel].length; i++)
if (_registrations[aLevel][i] === aProvider)
_registrations[aLevel].splice(i--, 1); // decrement since we're removing an element
}
self.setDefaultTitle = function(aTitle)
{
CPLogDefaultTitle = aTitle;
}
self.setDefaultLevel = function(aLevel)
{
CPLogDefaultLevel = aLevel;
}
self.setDefaultFormatter = function(aFormatter)
{
CPLogDefaultFormatter = aFormatter;
}
// private
var _registrations = {};
var _title = aTitle;
self._dispatch = function(aParameters, aLevel, aTitle)
{
aParameters = Array.prototype.slice.call(aParameters);
if (aTitle == undefined) aTitle = CPLogDefaultTitle;
if (aLevel == undefined) aLevel = CPLogDefaultLevel;
if (_registrations[aLevel])
for (var i = 0; i < _registrations[aLevel].length; i++)
_registrations[aLevel][i](aParameters, aLevel, aTitle);
}
return self;
}
// Default CPLog:
GLOBAL(CPLog) = CreateLogger();
// Deprecated global registration functions
GLOBAL(CPLogRegister) = function() { CPLog.register.apply(CPLog, arguments); CPLog("CPLogRegister() is deprecated, use CPLog.register()"); };
GLOBAL(CPLogRegisterRange) = function() { CPLog.registerRange.apply(CPLog, arguments); CPLog("CPLogRegisterRange() is deprecated, use CPLog.registerRange()"); };
GLOBAL(CPLogRegisterSingle) = function() { CPLog.registerSingle.apply(CPLog, arguments); CPLog("CPLogRegisterSingle() is deprecated, use CPLog.registerSingle()"); };
// Included loggers:
// CPLogConsole uses the built in "console" object // CPLogConsole uses the built in "console" object
GLOBAL(CPLogConsole) = function(aString, aLevel, aTitle) // (possibly available in CommonJS environments?)
function CPLogConsoleCreate(formatter)
{ {
if (typeof console != "undefined") return function(aString, aLevel, aTitle) {
{ if (typeof console === "undefined")
var message = _CPFormatLogMessage(aString, aLevel, aTitle); return;
var message = (formatter || CPLogDefaultFormatter)(aString, aLevel, aTitle, false);
var logger = { var logger = {
"fatal": "error", "fatal": "error",
@@ -128,107 +196,109 @@ GLOBAL(CPLogConsole) = function(aString, aLevel, aTitle)
"info": "info", "info": "info",
"debug": "debug", "debug": "debug",
"trace": "debug" "trace": "debug"
}[aLevel]; }[aLevel] || "log";
if (logger && console[logger]) if (console[logger])
console[logger](message); console[logger](message);
else if (console.log)
console.log(message);
} }
} }
GLOBAL(CPLogConsole) = CPLogConsoleCreate();
CPLogConsole.create = CPLogConsoleCreate;
// CommonJS specific loggers
#if COMMONJS #if COMMONJS
var levelColorMap = { // CPLogPrint uses STDOUT to print to console
"fatal": "red", function CPLogPrintCreate(formatter, stream, useColor)
"error": "red",
"warn" : "yellow",
"info" : "green",
"debug": "cyan",
"trace": "blue"
}
try {
var SYSTEM = require("system");
var FILE = require("file");
if (SYSTEM.args[0])
CPLogDefaultTitle = FILE.basename(SYSTEM.args[0]);
} catch (e) {
}
var stream;
GLOBAL(CPLogPrint) = function(aString, aLevel, aTitle)
{ {
if (stream === undefined) { if (!stream) {
try { try {
stream = require("term").stream; stream = require("term").stream;
useColor = true;
} catch (e) { } catch (e) {
stream = null; useColor = false;
if (typeof print != "undefined")
stream = { print : print };
} }
} }
if (stream) { return function(aParameters, aLevel, aTitle) {
if (aLevel == "fatal" || aLevel == "error" || aLevel == "warn") var message = (formatter || CPLogDefaultFormatter)(aParameters, aLevel, aTitle, useColor);
stream.print("\0"+levelColorMap[aLevel]+"(" + _CPFormatLogMessage(aString, aLevel, aTitle) + "\0)"); stream.print(message);
else
stream.print(_CPFormatLogMessage(aString, "\0"+levelColorMap[aLevel]+"(" + aLevel + "\0)", aTitle));
} else if (typeof print != "undefined") {
print(_CPFormatLogMessage(aString, aLevel, aTitle))
} }
} }
GLOBAL(CPLogPrint) = CPLogPrintCreate();
CPLogPrint.create = CPLogPrintCreate;
// Browser specific loggers
#else #else
// CPLogAlert uses basic browser alert() functions // TODO: should this not be global?
GLOBAL(CPLogAlert) = function(aString, aLevel, aTitle) GLOBAL(CPLogDisable) = false;
// CPLogAlert uses basic browser confirm()
function CPLogAlertCreate(formatter)
{ {
if (typeof alert != "undefined" && !CPLogDisable) return function(aParameters, aLevel, aTitle) {
{ if (typeof confirm != "undefined" && !CPLogDisable) {
var message = _CPFormatLogMessage(aString, aLevel, aTitle); var message = (formatter || CPLogDefaultFormatter)(aParameters, aLevel, aTitle);
CPLogDisable = !confirm(message + "\n\n(Click cancel to stop log alerts)"); CPLogDisable = !confirm(message + "\n\n(Click cancel to stop log alerts)");
}
} }
} }
// CPLogPopup uses a slick popup window in the browser: GLOBAL(CPLogAlert) = CPLogAlertCreate();
var CPLogWindow = null; CPLogAlert.create = CPLogAlertCreate;
GLOBAL(CPLogPopup) = function(aString, aLevel, aTitle)
// CPLogPopup uses a slick popup window in the browser
// TODO: move this into DebugKit
function CPLogPopupCreate(formatter)
{ {
try { var logWindow = null;
if (CPLogDisable || window.open == undefined) return function(aParameters, aLevel, aTitle) {
return; var message = (formatter || CPLogDefaultFormatter)(aString, null, aTitle);
if (!CPLogWindow || !CPLogWindow.document) try {
{ if (CPLogDisable || window.open == undefined)
CPLogWindow = window.open("", "_blank", "width=600,height=400,status=no,resizable=yes,scrollbars=yes");
if (!CPLogWindow) {
CPLogDisable = !confirm(aString + "\n\n(Disable pop-up blocking for CPLog window; Click cancel to stop log alerts)");
return; return;
if (!logWindow || !logWindow.document)
{
logWindow = window.open("", "_blank", "width=600,height=400,status=no,resizable=yes,scrollbars=yes");
if (!logWindow) {
CPLogDisable = !confirm(message + "\n\n(Disable pop-up blocking for CPLog window; Click cancel to stop log alerts)");
return;
}
_CPLogPopupInit(logWindow);
} }
_CPLogInitPopup(CPLogWindow); var logDiv = logWindow.document.createElement("div");
logDiv.setAttribute("class", aLevel || "fatal");
logDiv.appendChild(logWindow.document.createTextNode(message));
logWindow.log.appendChild(logDiv);
if (logWindow.focusEnabled.checked)
logWindow.focus();
if (logWindow.blockEnabled.checked)
logWindow.blockEnabled.checked = logWindow.confirm(message+"\nContinue blocking?");
if (logWindow.scrollEnabled.checked)
logWindow.scrollToBottom();
} catch(e) {
// TODO: some error handling/reporting
} }
var logDiv = CPLogWindow.document.createElement("div");
logDiv.setAttribute("class", aLevel || "fatal");
var message = _CPFormatLogMessage(aString, null, aTitle);
logDiv.appendChild(CPLogWindow.document.createTextNode(message));
CPLogWindow.log.appendChild(logDiv);
if (CPLogWindow.focusEnabled.checked)
CPLogWindow.focus();
if (CPLogWindow.blockEnabled.checked)
CPLogWindow.blockEnabled.checked = CPLogWindow.confirm(message+"\nContinue blocking?");
if (CPLogWindow.scrollEnabled.checked)
CPLogWindow.scrollToBottom();
} catch(e) {
// TODO: some error handling/reporting
} }
} }
GLOBAL(CPLogPopup) = CPLogPopupCreate();
CPLogPopup.create = CPLogPopupCreate;
// private CPLogPopup
var CPLogPopupStyle ='<style type="text/css" media="screen"> \ var CPLogPopupStyle ='<style type="text/css" media="screen"> \
body{font:10px Monaco,Courier,"Courier New",monospace,mono;padding-top:15px;} \ body{font:10px Monaco,Courier,"Courier New",monospace,mono;padding-top:15px;} \
div > .fatal,div > .error,div > .warn,div > .info,div > .debug,div > .trace{display:none;overflow:hidden;white-space:pre;padding:0px 5px 0px 5px;margin-top:2px;-moz-border-radius:5px;-webkit-border-radius:5px;} \ div > .fatal,div > .error,div > .warn,div > .info,div > .debug,div > .trace{display:none;overflow:hidden;white-space:pre;padding:0px 5px 0px 5px;margin-top:2px;-moz-border-radius:5px;-webkit-border-radius:5px;} \
@@ -248,21 +318,15 @@ ul#options{display:inline-block;margin:0 15px 0px 15px;padding:0 0px;} \
ul#options li{margin:0 0 0 0;padding:0 0 0 0;display:inline;} \ ul#options li{margin:0 0 0 0;padding:0 0 0 0;display:inline;} \
</style>'; </style>';
function _CPLogInitPopup(logWindow) function _CPLogPopupInit(logWindow)
{ {
var doc = logWindow.document; var doc = logWindow.document;
// HACK so that head is available below:
doc.writeln("<html><head><title></title>"+CPLogPopupStyle+"</head><body></body></html>"); doc.writeln("<html><head><title></title>"+CPLogPopupStyle+"</head><body></body></html>");
doc.title = CPLogDefaultTitle + " Run Log"; doc.title = CPLogDefaultTitle + " Run Log";
var head = doc.getElementsByTagName("head")[0];
var body = doc.getElementsByTagName("body")[0]; var body = doc.getElementsByTagName("body")[0];
var base = window.location.protocol + "//" + window.location.host + window.location.pathname;
base = base.substring(0,base.lastIndexOf("/")+1);
var div = doc.createElement("div"); var div = doc.createElement("div");
div.setAttribute("id", "header"); div.setAttribute("id", "header");
body.appendChild(div); body.appendChild(div);
@@ -358,9 +422,9 @@ function _CPLogInitPopup(logWindow)
} }
#endif #endif
// guess a good default logger:
#if COMMONJS #if COMMONJS
CPLogDefault = CPLogPrint; GLOBAL(CPLogDefault) = CPLogPrint;
#else #else
CPLogDefault = (typeof window === "object" && window.console) ? CPLogConsole : CPLogPopup; GLOBAL(CPLogDefault) = (typeof console !== "undefined") ? CPLogConsole : CPLogPopup;
#endif #endif
+26 -30
View File
@@ -1,7 +1,5 @@
var FILE = require("file"); var FILE = require("file");
var sprintf = require("printf").sprintf;
var window = exports.window = require("browser/window"); var window = exports.window = require("browser/window");
if (system.engine === "rhino") if (system.engine === "rhino")
@@ -79,12 +77,6 @@ exports.run = function(args)
// copy the args since we're going to modify them // copy the args since we're going to modify them
var argv = args.slice(1); var argv = args.slice(1);
if (argv[0] === "--version")
{
print(exports.fullVersionString());
return;
}
while (argv.length && argv[0].indexOf('-I') === 0) while (argv.length && argv[0].indexOf('-I') === 0)
OBJJ_INCLUDE_PATHS.unshift.apply(OBJJ_INCLUDE_PATHS, argv.shift().substr(2).split(':')); OBJJ_INCLUDE_PATHS.unshift.apply(OBJJ_INCLUDE_PATHS, argv.shift().substr(2).split(':'));
} }
@@ -148,12 +140,37 @@ 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 // creates a narwhal factory function in the objj module scope
exports.make_narwhal_factory = function(path) exports.make_narwhal_factory = function(path)
{ {
return function(require, exports, module, system, print) return function(require, exports, module, system, print)
{ {
Executable.setCommonJSParameters("require", "exports", "module", "system", "print", "window");
Executable.setCommonJSArguments(require, exports, module, system, print, window); Executable.setCommonJSArguments(require, exports, module, system, print, window);
Executable.fileImporterForURL(FILE.dirname(path))(path, YES); Executable.fileImporterForURL(FILE.dirname(path))(path, YES);
} }
@@ -161,26 +178,5 @@ exports.make_narwhal_factory = function(path)
} // end "with" } // end "with"
var pkg = null;
function getPackage() {
if (!pkg)
pkg = JSON.parse(FILE.path(module.path).dirname().dirname().join("package.json").read({ charset : "UTF-8" }));
return pkg;
}
exports.version = function() { return getPackage()["version"]; }
exports.revision = function() { return getPackage()["cappuccino-revision"]; }
exports.timestamp = function() { return new Date(getPackage()["cappuccino-timestamp"]); }
exports.fullVersionString = function() {
return sprintf("objective-j %s (%04d-%02d-%02d %s)",
exports.version(),
exports.timestamp().getUTCFullYear(),
exports.timestamp().getUTCMonth()+1,
exports.timestamp().getUTCDate(),
exports.revision().slice(0,6)
);
}
if (require.main == module.id) if (require.main == module.id)
exports.run(system.args); exports.run(system.args);
@@ -1,104 +0,0 @@
var FILE = require("file");
var MD5 = require("md5");
var FileList = require("jake").FileList,
var BundleTask = require("objective-j/jake/bundletask").BundleTask;
exports.generateManifest = function(productPath, indexFilePath)
{
indexFilePath = indexFilePath || FILE.join(productPath, "index.html");
if (!FILE.isFile(indexFilePath)) {
print("Warning: Skipping cache manifest generation, no index file at "+indexFilePath);
return;
}
var index = FILE.read(indexFilePath, { charset : "UTF-8" });
var manifestName = "app.manifest";
var manifestPath = FILE.join(productPath, manifestName);
var manifestAttribute = 'manifest="'+manifestName+'"';
print("Generating cache manifest: " + manifestPath);
var manifestOut = FILE.open(manifestPath, "w", { charset : "UTF-8" });
manifestOut.print("CACHE MANIFEST");
manifestOut.print("");
manifestOut.print("CACHE:");
var list = new FileList(FILE.join(productPath, "**", "*"));
list.exclude(manifestPath);
list.exclude("**/.DS_Store", "**/.htaccess");
list.exclude("**/LICENSE");
list.exclude("**/MHTML*");
list.exclude("**/CommonJS.environment/*");
// FIXME: bleh. heuristic for whether index file includes debug frameworks
if (index.indexOf('"Frameworks/Debug"') < 0)
list.exclude("**/Frameworks/Debug/*");
list.forEach(function(path) {
if (FILE.isFile(path)) {
// FIXME: check the actual sprited images file
if (BundleTask.isSpritable(path))
return;
// include hash of each file in comments to expire when any file changes
var hash = MD5.hash(FILE.read(path, "b")).decodeToString("base16");
manifestOut.print("# " + hash);
manifestOut.print(FILE.relative(productPath, path));
}
});
manifestOut.print("");
manifestOut.print("NETWORK:");
manifestOut.print("*");
manifestOut.close();
// Insert "manifest" attribute in <html> tag of index file
var matchTag = index.match(/<html[^>]*>/i);
if (matchTag) {
var htmlTag = matchTag[0];
var newHTMLTag = null;
var matchAttr = htmlTag.match(/manifest\s*=\s*"([^"]*)"/i);
if (matchAttr) {
if (matchAttr[1] !== manifestName) {
newHTMLTag = htmlTag.replace(matchAttr[0], manifestAttribute);
}
} else {
newHTMLTag = htmlTag.replace(/>$/, " "+manifestAttribute+">");
}
if (newHTMLTag) {
print("Replacing html tag: \n " + htmlTag + "\nwith:\n " + newHTMLTag);
var newIndex = index.replace(htmlTag, newHTMLTag);
if (newIndex === index) {
print("Warning: No change!");
} else {
FILE.write(indexFilePath, newIndex, { charset : "UTF-8" });
}
}
}
else {
print("Warning: Couldn't find <html> tag in "+indexFilePath);
}
// Add Content-Type "text/cache-manifest" for manifest file to .htaccess
// This allows manifests to work out of the box on Apache (if htaccess overrides are allowed)
var htaccessPath = FILE.join(productPath, ".htaccess");
var htaccess = FILE.isFile(htaccessPath) ? FILE.read(htaccessPath, { charset : "UTF-8" }) : "";
var htaccessOut = FILE.open(htaccessPath, "w", { charset : "UTF-8" });
htaccessOut.print(htaccess);
var openTag = "<Files "+manifestName+">";
if (htaccess.indexOf(openTag) < 0) {
htaccessOut.print("");
htaccessOut.print(openTag);
htaccessOut.print("\tHeader set Content-Type text/cache-manifest");
htaccessOut.print("</Files>");
}
htaccessOut.close();
}
@@ -17,8 +17,6 @@ function ApplicationTask(aName)
this._frameworksPath = "Frameworks"; this._frameworksPath = "Frameworks";
else else
this._frameworksPath = null; this._frameworksPath = null;
this._shouldGenerateCacheManifest = false;
} }
ApplicationTask.__proto__ = BundleTask; ApplicationTask.__proto__ = BundleTask;
@@ -35,7 +33,6 @@ ApplicationTask.prototype.defineTasks = function()
this.defineFrameworksTask(); this.defineFrameworksTask();
this.defineIndexFileTask(); this.defineIndexFileTask();
this.defineCacheManifestTask();
} }
ApplicationTask.prototype.setIndexFilePath = function(aFilePath) ApplicationTask.prototype.setIndexFilePath = function(aFilePath)
@@ -62,16 +59,6 @@ ApplicationTask.prototype.frameworksPath = function()
return this._frameworksPath; return this._frameworksPath;
} }
ApplicationTask.prototype.setShouldGenerateCacheManifest = function(shouldGenerateCacheManifest)
{
this._shouldGenerateCacheManifest = shouldGenerateCacheManifest;
}
ApplicationTask.prototype.shouldGenerateCacheManifest = function()
{
return this._shouldGenerateCacheManifest;
}
ApplicationTask.prototype.defineFrameworksTask = function() ApplicationTask.prototype.defineFrameworksTask = function()
{ {
// FIXME: platform requires... // FIXME: platform requires...
@@ -85,7 +72,7 @@ ApplicationTask.prototype.defineFrameworksTask = function()
Jake.fileCreate(newFrameworks, function() Jake.fileCreate(newFrameworks, function()
{ {
if (thisTask._frameworksPath === "capp") if (thisTask._frameworksPath === "capp")
OS.system(["capp", "gen", "-f", "--force", buildPath]); OS.system("capp gen -f --force " + buildPath);
else if (thisTask._frameworksPath) else if (thisTask._frameworksPath)
{ {
if (FILE.exists(newFrameworks)) if (FILE.exists(newFrameworks))
@@ -119,23 +106,6 @@ ApplicationTask.prototype.defineIndexFileTask = function()
this.enhance([buildIndexFilePath]); this.enhance([buildIndexFilePath]);
} }
ApplicationTask.prototype.defineCacheManifestTask = function()
{
if (!this.shouldGenerateCacheManifest())
return;
var productPath = FILE.join(this.buildProductPath(), "");
var indexFilePath = this.buildIndexFilePath();
// TODO: can we conditionally generate based on outdated files?
var manifestPath = FILE.join(productPath, "app.manifest");
Jake.task(manifestPath, function() {
require("../cache-manifest").generateManifest(productPath, indexFilePath);
});
this.enhance([manifestPath]);
}
exports.ApplicationTask = ApplicationTask; exports.ApplicationTask = ApplicationTask;
exports.app = function(aName, aFunction) exports.app = function(aName, aFunction)
@@ -16,7 +16,8 @@ var Task = Jake.Task,
function isImage(/*String*/ aFilename) function isImage(/*String*/ aFilename)
{ {
return UTIL.has([".png", ".jpg", ".jpeg", ".gif", ".tif", ".tiff"], FILE.extension(aFilename).toLowerCase()); return FILE.isFile(aFilename) &&
UTIL.has([".png", ".jpg", ".jpeg", ".gif", ".tif", ".tiff"], FILE.extension(aFilename).toLowerCase());
} }
function mimeType(/*String*/ aFilename) function mimeType(/*String*/ aFilename)
@@ -369,17 +370,14 @@ BundleTask.prototype.infoPlist = function()
return anEnvironment.name(); return anEnvironment.name();
})); }));
infoPlist.setValueForKey("CPBundleExecutable", this.productName() + ".sj"); infoPlist.setValueForKey("CPBundleExecutable", this.productName() + ".sj");
infoPlist.setValueForKey("CPBundleEnvironmentsWithImageSprites", this.environments().filter(
var environmentsWithImageSprites = this.environments().filter(
function(anEnvironment) function(anEnvironment)
{ {
return anEnvironment.spritesImages() && task(this.buildProductDataURLPathForEnvironment(anEnvironment)).prerequisites().filter(isImage).length > 0; return anEnvironment.spritesImages();
}, this).map(function(anEnvironment) }).map(function(anEnvironment)
{ {
return anEnvironment.name(); return anEnvironment.name();
}); }));
infoPlist.setValueForKey("CPBundleEnvironmentsWithImageSprites", environmentsWithImageSprites);
var principalClass = this.principalClass(); var principalClass = this.principalClass();
@@ -451,14 +449,10 @@ BundleTask.prototype.resourcesPath = function()
return FILE.join(this.buildProductPath(), "Resources", ""); return FILE.join(this.buildProductPath(), "Resources", "");
} }
// Don't sprite images larger than 32KB, IE 8 doesn't like it.
BundleTask.isSpritable = function(aResourcePath) {
return isImage(aResourcePath) && FILE.size(aResourcePath) < 32768;
}
BundleTask.prototype.defineResourceTask = function(aResourcePath, aDestinationPath) BundleTask.prototype.defineResourceTask = function(aResourcePath, aDestinationPath)
{ {
if (this.spritesResources() && BundleTask.isSpritable(aResourcePath)) // Don't sprite images larger than 32KB, IE 8 doesn't like it.
if (this.spritesResources() && isImage(aResourcePath) && FILE.size(aResourcePath) < 32768)
{ {
this.environments().forEach(function(/*Environment*/ anEnvironment) this.environments().forEach(function(/*Environment*/ anEnvironment)
{ {
@@ -587,6 +581,7 @@ BundleTask.prototype.defineResourceTasks = function()
}, this); }, this);
} }
var RESOURCES_PATH = FILE.join(FILE.absolute(FILE.dirname(module.path)), "RESOURCES"), var RESOURCES_PATH = FILE.join(FILE.absolute(FILE.dirname(module.path)), "RESOURCES"),
MHTMLTestPath = FILE.join(RESOURCES_PATH, "MHTMLTest.txt"); MHTMLTestPath = FILE.join(RESOURCES_PATH, "MHTMLTest.txt");
@@ -600,29 +595,27 @@ BundleTask.prototype.defineSpritedImagesTask = function()
var folder = anEnvironment.name() + ".environment", var folder = anEnvironment.name() + ".environment",
resourcesPath = FILE.join(this.buildIntermediatesProductPath(), folder, "Resources", ""); 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(), var productName = this.productName(),
dataURLPath = this.buildProductDataURLPathForEnvironment(anEnvironment); dataURLPath = this.buildProductDataURLPathForEnvironment(anEnvironment);
filedir (dataURLPath, function(aTask) filedir (dataURLPath, function(aTask)
{ {
var prerequisites = aTask.prerequisites().filter(isImage);
if (!prerequisites.length)
{
if (FILE.exists(dataURLPath))
FILE.remove(dataURLPath);
return;
}
TERM.stream.print("Creating data URLs file... \0green(" + dataURLPath +"\0)"); TERM.stream.print("Creating data URLs file... \0green(" + dataURLPath +"\0)");
var dataURLStream = FILE.open(dataURLPath, "w+", { charset:"UTF-8" }); var dataURLStream = FILE.open(dataURLPath, "w+", { charset:"UTF-8" });
dataURLStream.write("@STATIC;1.0;"); dataURLStream.write("@STATIC;1.0;");
prerequisites.forEach(function(aFilename) aTask.prerequisites().forEach(function(aFilename)
{ {
if (!isDataResource(aFilename))
return;
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename); var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
dataURLStream.write("u;" + resourcePath.length + ";" + resourcePath); dataURLStream.write("u;" + resourcePath.length + ";" + resourcePath);
@@ -643,24 +636,17 @@ BundleTask.prototype.defineSpritedImagesTask = function()
filedir (MHTMLPath, function(aTask) filedir (MHTMLPath, function(aTask)
{ {
var prerequisites = aTask.prerequisites().filter(isImage);
if (!prerequisites.length)
{
if (FILE.exists(MHTMLPath))
FILE.remove(MHTMLPath);
return;
}
TERM.stream.print("Creating MHTML paths file... \0green(" + MHTMLPath +"\0)"); TERM.stream.print("Creating MHTML paths file... \0green(" + MHTMLPath +"\0)");
var MHTMLStream = FILE.open(MHTMLPath, "w+", { charset:"UTF-8" }); var MHTMLStream = FILE.open(MHTMLPath, "w+", { charset:"UTF-8" });
MHTMLStream.write("@STATIC;1.0;"); MHTMLStream.write("@STATIC;1.0;");
prerequisites.forEach(function(aFilename) aTask.prerequisites().forEach(function(aFilename)
{ {
if (!isDataResource(aFilename))
return;
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename), var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename),
MHTMLResourcePath = "mhtml:" + FILE.join(folder, "MHTMLData.txt!") + resourcePath; MHTMLResourcePath = "mhtml:" + FILE.join(folder, "MHTMLData.txt!") + resourcePath;
@@ -677,24 +663,17 @@ BundleTask.prototype.defineSpritedImagesTask = function()
filedir (MHTMLDataPath, function(aTask) filedir (MHTMLDataPath, function(aTask)
{ {
var prerequisites = aTask.prerequisites().filter(isImage);
if (!prerequisites.length)
{
if (FILE.exists(MHTMLDataPath))
FILE.remove(MHTMLDataPath);
return;
}
TERM.stream.print("Creating MHTML images file... \0green(" + MHTMLDataPath +"\0)"); TERM.stream.print("Creating MHTML images file... \0green(" + MHTMLDataPath +"\0)");
var MHTMLDataStream = FILE.open(MHTMLDataPath, "w+", { charset:"UTF-8" }); 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"); MHTMLDataStream.write("/*\r\nContent-Type: multipart/related; boundary=\"_ANY_STRING_WILL_DO_AS_A_SEPARATOR\"\r\n\r\n");
prerequisites.forEach(function(aFilename) aTask.prerequisites().forEach(function(aFilename)
{ {
if (!isDataResource(aFilename))
return;
var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename); var resourcePath = "Resources/" + FILE.relative(resourcesPath, aFilename);
MHTMLDataStream.write("--_ANY_STRING_WILL_DO_AS_A_SEPARATOR\r\n"); MHTMLDataStream.write("--_ANY_STRING_WILL_DO_AS_A_SEPARATOR\r\n");
+1
View File
@@ -5,6 +5,7 @@
"description": "Objective-J and Cappuccino module", "description": "Objective-J and Cappuccino module",
"keywords": ["objective-j", "objj", "objective j", "cappuccino"], "keywords": ["objective-j", "objj", "objective j", "cappuccino"],
"author": "280 North, Inc. (http://280north.com/)", "author": "280 North, Inc. (http://280north.com/)",
"version": "0.8.0",
"contributors": [ "contributors": [
"Francisco Tolmasky (http://tolmasky.com/)", "Francisco Tolmasky (http://tolmasky.com/)",
"Ross Boucher (http://rossboucher.com/)", "Ross Boucher (http://rossboucher.com/)",
+1 -1
View File
@@ -27,7 +27,7 @@ if (typeof window !== "undefined")
window.setNativeTimeout = window.setTimeout; window.setNativeTimeout = window.setTimeout;
window.clearNativeTimeout = window.clearTimeout; window.clearNativeTimeout = window.clearTimeout;
window.setNativeInterval = window.setInterval; window.setNativeInterval = window.setInterval;
window.clearNativeInterval = window.clearInterval; window.clearNativeInterval = window.clearNativeInterval;
} }
// Objective-J Constants // Objective-J Constants
-4
View File
@@ -20,10 +20,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifdef BROWSER
CPLogRegister(CPLogDefault);
#endif
// formatting helpers // formatting helpers
function objj_debug_object_format(aReceiver) function objj_debug_object_format(aReceiver)
-55
View File
@@ -1,55 +0,0 @@
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;
+7 -14
View File
@@ -137,7 +137,6 @@ Executable.prototype.execute = function()
#endif #endif
var oldContextBundle = CONTEXT_BUNDLE; var oldContextBundle = CONTEXT_BUNDLE;
// FIXME: Should we have stored this?
CONTEXT_BUNDLE = CFBundle.bundleContainingURL(this.URL()); CONTEXT_BUNDLE = CFBundle.bundleContainingURL(this.URL());
var result = this._function.apply(global, this.functionArguments()); var result = this._function.apply(global, this.functionArguments());
@@ -218,13 +217,10 @@ Executable.prototype.loadFileDependencies = function(aCallback)
{ {
var status = this._fileDependencyStatus; var status = this._fileDependencyStatus;
if (aCallback) if (status === ExecutableLoadedFileDependencies)
{ return aCallback();
if (status === ExecutableLoadedFileDependencies)
return aCallback();
this._fileDependencyCallbacks.push(aCallback); this._fileDependencyCallbacks.push(aCallback)
}
if (status === ExecutableUnloadedFileDependencies) if (status === ExecutableUnloadedFileDependencies)
{ {
@@ -284,18 +280,15 @@ function fileExecutableSearchFinished(/*FileExecutable*/ aFileExecutable)
function fileExecutableDependencyLoadFinished() function fileExecutableDependencyLoadFinished()
{ {
var executables = fileDependencyExecutables, var index = 0,
index = 0, count = fileDependencyExecutables.length;
count = executables.length;
fileDependencyExecutables = [];
for (; index < count; ++index) for (; index < count; ++index)
executables[index]._fileDependencyStatus = ExecutableLoadedFileDependencies; fileDependencyExecutables[index]._fileDependencyStatus = ExecutableLoadedFileDependencies;
for (index = 0; index < count; ++index) for (index = 0; index < count; ++index)
{ {
var executable = executables[index], var executable = fileDependencyExecutables[index],
callbacks = executable._fileDependencyCallbacks, callbacks = executable._fileDependencyCallbacks,
callbackIndex = 0, callbackIndex = 0,
callbackCount = callbacks.length; callbackCount = callbacks.length;
+5 -20
View File
@@ -22,7 +22,7 @@
var FileExecutablesForURLStrings = { }; var FileExecutablesForURLStrings = { };
function FileExecutable(/*CFURL|String*/ aURL) function FileExecutable(/*CFURL|String*/ aURL, /*Executable*/ anExecutable)
{ {
aURL = makeAbsoluteURL(aURL); aURL = makeAbsoluteURL(aURL);
@@ -38,7 +38,10 @@ function FileExecutable(/*CFURL|String*/ aURL)
executable = NULL, executable = NULL,
extension = aURL.pathExtension(); extension = aURL.pathExtension();
if (fileContents.match(/^@STATIC;/)) if (anExecutable)
executable = anExecutable;
else if (fileContents.match(/^@STATIC;/))
executable = decompile(fileContents, aURL); executable = decompile(fileContents, aURL);
else if (extension === "j" || !extension) else if (extension === "j" || !extension)
@@ -114,23 +117,5 @@ function decompile(/*String*/ aString, /*CFURL*/ aURL)
dependencies.push(new FileDependency(new CFURL(text), YES)); 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); 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];
}
-1
View File
@@ -47,7 +47,6 @@
#include "Executable.js" #include "Executable.js"
#include "FileExecutable.js" #include "FileExecutable.js"
#include "Runtime.js" #include "Runtime.js"
#include "Eval.js"
#if defined(DEBUG) || defined(COMMONJS) #if defined(DEBUG) || defined(COMMONJS)
#include "Debug.js" #include "Debug.js"
#endif #endif
-4
View File
@@ -87,10 +87,6 @@ new FileList("CommonJS/**/*").forEach(function(aFilename)
CLOBBER.include(buildFilename); CLOBBER.include(buildFilename);
}); });
task ("build", function() {
setPackageMetadata(FILE.join($BUILD_CJS_OBJECTIVE_J, "package.json"));
});
$BUILD_CJS_OBJECTIVE_J_FRAMEWORK = FILE.join($BUILD_CJS_OBJECTIVE_J, "Frameworks", "Objective-J"); $BUILD_CJS_OBJECTIVE_J_FRAMEWORK = FILE.join($BUILD_CJS_OBJECTIVE_J, "Frameworks", "Objective-J");
filedir($BUILD_CJS_OBJECTIVE_J_FRAMEWORK, function() filedir($BUILD_CJS_OBJECTIVE_J_FRAMEWORK, function()
+15 -104
View File
@@ -34,8 +34,6 @@ var TOKEN_ACCESSORS = "accessors",
TOKEN_SUPER = "super", TOKEN_SUPER = "super",
TOKEN_VAR = "var", TOKEN_VAR = "var",
TOKEN_IN = "in", TOKEN_IN = "in",
TOKEN_PRAGMA = "pragma",
TOKEN_MARK = "mark",
TOKEN_EQUAL = '=', TOKEN_EQUAL = '=',
TOKEN_PLUS = '+', TOKEN_PLUS = '+',
@@ -52,7 +50,6 @@ var TOKEN_ACCESSORS = "accessors",
TOKEN_OPEN_BRACKET = '[', TOKEN_OPEN_BRACKET = '[',
TOKEN_DOUBLE_QUOTE = '"', TOKEN_DOUBLE_QUOTE = '"',
TOKEN_PREPROCESSOR = '@', TOKEN_PREPROCESSOR = '@',
TOKEN_HASH = '#',
TOKEN_CLOSE_BRACKET = ']', TOKEN_CLOSE_BRACKET = ']',
TOKEN_QUESTION_MARK = '?', TOKEN_QUESTION_MARK = '?',
TOKEN_OPEN_PARENTHESIS = '(', TOKEN_OPEN_PARENTHESIS = '(',
@@ -174,43 +171,9 @@ var Preprocessor = function(/*String*/ aString, /*CFURL|String*/ aURL, /*unsigne
this._classMethod = false; this._classMethod = false;
this._executable = NULL; this._executable = NULL;
this._classLookupTable = {};
this._classVars = {};
var classObject = new objj_class();
for (var i in classObject)
this._classVars[i] = 1;
this.preprocess(this._tokens, this._buffer); this.preprocess(this._tokens, this._buffer);
} }
Preprocessor.prototype.setClassInfo = function(className, superClassName, ivars)
{
this._classLookupTable[className] = {superClassName:superClassName, ivars:ivars};
}
Preprocessor.prototype.getClassInfo = function(className)
{
return this._classLookupTable[className];
}
Preprocessor.prototype.allIvarNamesForClassName = function(className)
{
var names = {},
classInfo = this.getClassInfo(className);
while (classInfo)
{
for (var i in classInfo.ivars)
names[i] = 1;
classInfo = this.getClassInfo(classInfo.superClassName);
}
return names;
}
exports.Preprocessor = Preprocessor; exports.Preprocessor = Preprocessor;
Preprocessor.Flags = { }; Preprocessor.Flags = { };
@@ -366,29 +329,6 @@ Preprocessor.prototype.directive = function(tokens, aStringBuffer, allowedDirect
return buffer; return buffer;
} }
Preprocessor.prototype.hash = function(tokens, aStringBuffer)
{
// Grab the next token, C preprocessor directives follow '#' immediately.
var buffer = aStringBuffer ? aStringBuffer : new StringBuffer(),
token = tokens.next();
// #pragma (C Preprocessor directive)
if (token === TOKEN_PRAGMA)
{
token = tokens.skip_whitespace();
// '#pragma mark' directive is used in Xcode editor for creating labels,
// which is irrelevant to Cappuccino - just swallow this line
if (token === TOKEN_MARK)
{
while ((token = tokens.next()).indexOf("\n") < 0);
}
}
// if not a #pragma directive, it should not be processed here
else
throw new SyntaxError(this.error_message("*** Expected \"pragma\" to follow # but instead saw \"" + token + "\"."));
}
Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStringBuffer) Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStringBuffer)
{ {
var buffer = aStringBuffer, var buffer = aStringBuffer,
@@ -444,9 +384,9 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
// If we are at an opening curly brace ('{'), then we have an ivar declaration. // If we are at an opening curly brace ('{'), then we have an ivar declaration.
if (token == TOKEN_OPEN_BRACE) if (token == TOKEN_OPEN_BRACE)
{ {
var ivar_names = {}, var ivar_count = 0,
ivar_count = 0,
declaration = [], declaration = [],
attributes, attributes,
accessors = {}; accessors = {};
@@ -462,7 +402,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
} }
else if (token == TOKEN_SEMICOLON) else if (token == TOKEN_SEMICOLON)
{ {
if (ivar_count++ === 0) if (ivar_count++ == 0)
CONCAT(buffer, "class_addIvars(the_class, ["); CONCAT(buffer, "class_addIvars(the_class, [");
else else
CONCAT(buffer, ", "); CONCAT(buffer, ", ");
@@ -471,7 +411,6 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
CONCAT(buffer, "new objj_ivar(\"" + name + "\")"); CONCAT(buffer, "new objj_ivar(\"" + name + "\")");
ivar_names[name] = 1;
declaration = []; declaration = [];
if (attributes) if (attributes)
@@ -494,11 +433,6 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
if (!token) if (!token)
throw new SyntaxError(this.error_message("*** Expected '}'")); throw new SyntaxError(this.error_message("*** Expected '}'"));
this.setClassInfo(class_name, superclass_name === "Nil" ? null : superclass_name, ivar_names);
// build up the list of illegal method param names
var ivar_names = this.allIvarNamesForClassName(class_name);
for (ivar_name in accessors) for (ivar_name in accessors)
{ {
var accessor = accessors[ivar_name], var accessor = accessors[ivar_name],
@@ -511,7 +445,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
if (IS_NOT_EMPTY(instance_methods)) if (IS_NOT_EMPTY(instance_methods))
CONCAT(instance_methods, ",\n"); CONCAT(instance_methods, ",\n");
CONCAT(instance_methods, this.method(new Lexer(getterCode), ivar_names)); CONCAT(instance_methods, this.method(new Lexer(getterCode)));
// setter // setter
if (accessor["readonly"]) if (accessor["readonly"])
@@ -535,7 +469,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
if (IS_NOT_EMPTY(instance_methods)) if (IS_NOT_EMPTY(instance_methods))
CONCAT(instance_methods, ",\n"); CONCAT(instance_methods, ",\n");
CONCAT(instance_methods, this.method(new Lexer(setterCode), ivar_names)); CONCAT(instance_methods, this.method(new Lexer(setterCode)));
} }
} }
else else
@@ -545,9 +479,6 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
CONCAT(buffer, "objj_registerClassPair(the_class);\n"); CONCAT(buffer, "objj_registerClassPair(the_class);\n");
} }
if (!ivar_names)
var ivar_names = this.allIvarNamesForClassName(class_name);
while ((token = tokens.skip_whitespace())) while ((token = tokens.skip_whitespace()))
{ {
if (token == TOKEN_PLUS) if (token == TOKEN_PLUS)
@@ -557,8 +488,9 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
if (IS_NOT_EMPTY(class_methods)) if (IS_NOT_EMPTY(class_methods))
CONCAT(class_methods, ", "); CONCAT(class_methods, ", ");
CONCAT(class_methods, this.method(tokens, this._classVars)); CONCAT(class_methods, this.method(tokens));
} }
else if (token == TOKEN_MINUS) else if (token == TOKEN_MINUS)
{ {
this._classMethod = false; this._classMethod = false;
@@ -566,24 +498,19 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
if (IS_NOT_EMPTY(instance_methods)) if (IS_NOT_EMPTY(instance_methods))
CONCAT(instance_methods, ", "); CONCAT(instance_methods, ", ");
CONCAT(instance_methods, this.method(tokens, ivar_names)); CONCAT(instance_methods, this.method(tokens));
}
// If we reach a # symbol, we may be at a C preprocessor directive.
else if (token == TOKEN_HASH)
{
this.hash(tokens, buffer);
} }
// Check if we've reached @end... // Check if we've reached @end...
else if (token == TOKEN_PREPROCESSOR) else if (token == TOKEN_PREPROCESSOR)
{ {
// The only preprocessor directive we should ever encounter at this point is @end. // The only preprocessor directive we should ever encounter at this point is @end.
if ((token = tokens.next()) == TOKEN_END) if ((token = tokens.next()) == TOKEN_END)
break; break;
else else
throw new SyntaxError(this.error_message("*** Expected \"@end\", found \"@" + token + "\".")); throw new SyntaxError(this.error_message("*** Expected \"@end\", found \"@" + token + "\"."));
} }
//else
// throw new SyntaxError(this.error_message("*** Expected a method declaration, or \"@end\", found \"" + token + "\"."));
} }
if (IS_NOT_EMPTY(instance_methods)) if (IS_NOT_EMPTY(instance_methods))
@@ -633,7 +560,7 @@ Preprocessor.prototype._import = function(tokens)
this._dependencies.push(new FileDependency(new CFURL(URLString), isQuoted)); this._dependencies.push(new FileDependency(new CFURL(URLString), isQuoted));
} }
Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names) Preprocessor.prototype.method = function(/*Lexer*/ tokens)
{ {
var buffer = new StringBuffer(), var buffer = new StringBuffer(),
token, token,
@@ -641,9 +568,7 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
parameters = [], parameters = [],
types = [null]; types = [null];
ivar_names = ivar_names || {}; while((token = tokens.skip_whitespace()) && token != TOKEN_OPEN_BRACE)
while((token = tokens.skip_whitespace()) && token !== TOKEN_OPEN_BRACE && token !== TOKEN_SEMICOLON)
{ {
if (token == TOKEN_COLON) if (token == TOKEN_COLON)
{ {
@@ -668,10 +593,8 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
// Since this follows a colon, this must be the parameter name. // Since this follows a colon, this must be the parameter name.
parameters[parameters.length] = token; parameters[parameters.length] = token;
if (token in ivar_names)
throw new SyntaxError(this.error_message("*** Method ( "+selector+" ) uses a parameter name that is already in use ( "+token+" )"));
} }
else if (token == TOKEN_OPEN_PARENTHESIS) else if (token == TOKEN_OPEN_PARENTHESIS)
{ {
var type = ""; var type = "";
@@ -683,6 +606,7 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
// types[0] is the return argument // types[0] is the return argument
types[0] = type || null; types[0] = type || null;
} }
// Argument list ", ..." // Argument list ", ..."
else if (token == TOKEN_COMMA) else if (token == TOKEN_COMMA)
{ {
@@ -692,21 +616,12 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
// FIXME: Shouldn't allow any more after this. // FIXME: Shouldn't allow any more after this.
} }
// Build selector name. // Build selector name.
else else
selector += token; selector += token;
} }
if (token === TOKEN_SEMICOLON)
{
token = tokens.skip_whitespace();
if (token !== TOKEN_OPEN_BRACE)
{
throw new SyntaxError(this.error_message("Invalid semi-colon in method declaration. "+
"Semi-colons are allowed only to terminate the method signature, before the open brace."));
}
}
var index = 0, var index = 0,
count = parameters.length; count = parameters.length;
@@ -928,10 +843,6 @@ Preprocessor.prototype.preprocess = function(tokens, /*StringBuffer*/ aStringBuf
else if (token == TOKEN_PREPROCESSOR) else if (token == TOKEN_PREPROCESSOR)
this.directive(tokens, buffer); this.directive(tokens, buffer);
// If we reach a # symbol, we may be at a C preprocessor directive.
else if (token == TOKEN_HASH)
this.hash(tokens, buffer);
// If we reach a bracket, we will either be preprocessing a message send, a literal // If we reach a bracket, we will either be preprocessing a message send, a literal
// array, or an array index. // array, or an array index.
else if (token == TOKEN_OPEN_BRACKET) else if (token == TOKEN_OPEN_BRACKET)
+1 -7
View File
@@ -143,14 +143,8 @@ StaticResource.resourceAtURL = function(/*CFURL|String*/ aURL, /*BOOL*/ resolveA
resource = resource._children[name]; resource = resource._children[name];
else if (resolveAsDirectoriesIfNecessary) else if (resolveAsDirectoriesIfNecessary)
{
// We do this because on Windows the path may start with C: and be
// misinterpreted as a scheme.
if (name !== "/")
name = "./" + name;
resource = new StaticResource(new CFURL(name, resource.URL()), resource, YES, YES); resource = new StaticResource(new CFURL(name, resource.URL()), resource, YES, YES);
}
else else
throw new Error("Static Resource at " + aURL + " is not resolved (\"" + name + "\")"); throw new Error("Static Resource at " + aURL + " is not resolved (\"" + name + "\")");
} }
-45
View File
@@ -1,45 +0,0 @@
@import <AppKit/CPView.j>
@import <AppKit/CPApplication.j>
[CPApplication sharedApplication]
@implementation CPViewTest : OJTestCase
{
CPView view;
}
- (void)setUp
{
view = [[CPView alloc] initWithFrame:CGRectMakeZero()];
[super setUp];
}
- (void)testCanCreate
{
[self assertTrue:!!view];
}
/*
During the layout process for the view, _CPImageAndTextView.j throws
a ReferenceError with the following:
"hasDOMImageElement" is not defined
The referenced variable is #if PLATFORM(DOM) excluded in all other
instances. While not isolated to the behaviour of a CPView alone, the
following test ensures that pending actions in the _CPDisplayServer can
be flushed without touching unimplemented portions of the test platform
(e.g. the DOM). There are times where we want to confirm that some setting
requiring relayout (e.g. string truncation based on available space), the
following test should help ensure those types of tests are safe to carry
out with ojunit.
Demonstrates issue #562.
*/
- (void)testCanFlushPendingLayoutWork
{
[self assert:undefined same:[_CPDisplayServer run]];
}
@end
-65
View File
@@ -155,61 +155,6 @@
} }
} }
- (void)testInsertObjectInArraySortedByDescriptors
{
var descriptors = [[[CPSortDescriptor alloc] initWithKey:@"intValue" ascending:YES]];
var array = [1, 3, 5];
[array insertObject: 0 inArraySortedByDescriptors:descriptors];
[self assert:[0, 1, 3, 5] equals:array];
array = [1, 3, 5];
[array insertObject: 2 inArraySortedByDescriptors:descriptors];
[self assert:[1, 2, 3, 5] equals:array];
array = [1, 3, 5];
[array insertObject: 1 inArraySortedByDescriptors:descriptors];
[self assert:[1, 1, 3, 5] equals:array];
array = [1, 3, 5];
[array insertObject: 6 inArraySortedByDescriptors:descriptors];
[self assert:[1, 3, 5, 6] equals:array];
array = [1, 3, 5];
[array insertObject: 3 inArraySortedByDescriptors:descriptors];
[self assert:[1, 3, 3, 5] equals:array];
array = [];
[array insertObject: 3 inArraySortedByDescriptors:descriptors];
[self assert:[3] equals:array];
descriptors = [[[CPSortDescriptor alloc] initWithKey:@"intValue" ascending:NO]];
array = [5, 3, 1];
[array insertObject: 0 inArraySortedByDescriptors:descriptors];
[self assert:[5, 3, 1, 0] equals:array];
array = [5, 3, 1];
[array insertObject: 2 inArraySortedByDescriptors:descriptors];
[self assert:[5, 3, 2, 1] equals:array];
array = [5, 3, 1];
[array insertObject: 1 inArraySortedByDescriptors:descriptors];
[self assert:[5, 3, 1, 1] equals:array];
array = [5, 3, 1];
[array insertObject: 6 inArraySortedByDescriptors:descriptors];
[self assert:[6, 5, 3, 1] equals:array];
array = [5, 3, 1];
[array insertObject: 3 inArraySortedByDescriptors:descriptors];
[self assert:[5, 3, 3, 1] equals:array];
array = [];
[array insertObject: 3 inArraySortedByDescriptors:descriptors];
[self assert:[3] equals:array];
}
- (void)testInitWithArrayCopyItems - (void)testInitWithArrayCopyItems
{ {
var a = [[CopyableObject new], 2, 3]; var a = [[CopyableObject new], 2, 3];
@@ -218,16 +163,6 @@
[self assert:a notEqual:b]; [self assert:a notEqual:b];
} }
- (void)testIsEqualToArray
{
var a = [1, 2, 3],
b = [5];
[self assertTrue:[a isEqualToArray:a]];
[self assertFalse:[a isEqualToArray:b]];
[self assertFalse:[a isEqualToArray:nil]];
}
@end @end
@implementation CPArray (reverse) @implementation CPArray (reverse)
Loaded 100 of 148 files, more files were not shown because too many files have changed in this diff. Show more