Compare commits

..
1 Commits
Author SHA1 Message Date
Tom Robinson 182f6a0030 CPLog refactor 2010-03-08 01:14:39 -08:00
152 changed files with 1501 additions and 3908 deletions
-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"
+44 -30
View File
@@ -146,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)]];
@@ -166,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];
@@ -185,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];
@@ -860,11 +860,12 @@ CPRunContinuesResponse = -1002;
if ([windowController respondsToSelector:anAction]) if ([windowController respondsToSelector:anAction])
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;
} }
@@ -873,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>
@@ -912,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
@@ -970,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;
@@ -1005,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("/");
_args = args;
for (var i = 0, count = args.length; i < count; i++)
args[i] = decodeURIComponent(args[i]);
_args = args;
}
else
_args = [];
} }
- (CPDictionary)namedArguments - (CPDictionary)namedArguments
@@ -1060,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;
@@ -1145,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;
@@ -1224,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;
-1
View File
@@ -162,7 +162,6 @@ CPGrooveBorder = 3;
[aView setFrame:CGRectInset([self bounds], _contentMargin.width + _borderWidth, _contentMargin.height + _borderWidth)]; [aView setFrame:CGRectInset([self bounds], _contentMargin.width + _borderWidth, _contentMargin.height + _borderWidth)];
[self replaceSubview:_contentView with:aView]; [self replaceSubview:_contentView with:aView];
[aView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
_contentView = aView; _contentView = aView;
} }
-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
+5 -2
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
@@ -509,8 +511,9 @@ CPButtonStateMixed = CPThemeState("mixed");
var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view" var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view"
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
+30 -208
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:@""];
if (bezelView)
[bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]];
}
var buttonsNotHidden = [CPArray arrayWithArray:_buttons], - (void)addSubview:(CPView)aSubview
count = [buttonsNotHidden count]; {
[super addSubview:aSubview];
while (count--) [aSubview setAutoresizingMask:CPViewMinXMargin];
if ([buttonsNotHidden[count] isHidden])
[buttonsNotHidden removeObject:buttonsNotHidden[count]];
var currentButtonOffset = _resizeControlIsLeftAligned ? CGRectGetMaxX([self bounds]) + 1 : -1,
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
+6 -14
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",
+57 -11
View File
@@ -437,16 +437,51 @@ var cachedBlackColor,
if (self) if (self)
{ {
_components = components; _components = components;
var hasAlpha = CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0; if (!CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0 && window.Base64 && window.CRC32)
{
_cssString = (hasAlpha ? "rgba(" : "rgb(") + 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];
parseInt(_components[0] * 255.0) + ", " + var r_off = 41;
parseInt(_components[1] * 255.0) + ", " + var g_off = 42;
parseInt(_components[2] * 255.0) + var b_off = 43;
(hasAlpha ? (", " + _components[3]) : "") + ")"; var a_off = 821;
var plte_crc_off = 809;
var trns_crc_off = 822;
var plte_type_off = 37;
var trns_type_off = 817;
bytes[r_off] = Math.round(_components[0]*255);
bytes[g_off] = Math.round(_components[1]*255);
bytes[b_off] = Math.round(_components[2]*255);
bytes[a_off] = Math.round(_components[3]*255);
// 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);
} }
+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);
} }
+3 -13
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;
@@ -469,10 +468,7 @@ 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
+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"],
+80 -56
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,49 +79,64 @@ 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;
_sendsWholeSearchString = NO; _sendsWholeSearchString = NO;
_sendsSearchStringImmediately = NO; _sendsSearchStringImmediately = NO;
_recentsAutosaveName = nil; _recentsAutosaveName = nil;
[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];
[self _initWithFrame:frame];
#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]; [super encodeWithCoder:coder];
[_cancelButton removeFromSuperview];
[coder encodeObject:_searchButton forKey:CPSearchButtonKey];
[super encodeWithCoder:coder]; [coder encodeObject:_cancelButton forKey:CPCancelButtonKey];
if (_searchButton)
[self addSubview:_searchButton];
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,23 +722,21 @@ var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
- (id)initWithCoder:(CPCoder)coder - (id)initWithCoder:(CPCoder)coder
{ {
if (self = [super initWithCoder:coder]) self = [super initWithCoder:coder];
{
[self _initWithFrame:[self frame]]; _searchButton = [coder decodeObjectForKey:CPSearchButtonKey];
_cancelButton = [coder decodeObjectForKey:CPCancelButtonKey];
_recentsAutosaveName = [coder decodeObjectForKey:CPRecentsAutosaveNameKey]; _recentsAutosaveName = [coder decodeObjectForKey:CPRecentsAutosaveNameKey];
_sendsWholeSearchString = [coder decodeBoolForKey:CPSendsWholeSearchStringKey]; _sendsWholeSearchString = [coder decodeBoolForKey:CPSendsWholeSearchStringKey];
_sendsSearchStringImmediately = [coder decodeBoolForKey:CPSendsSearchStringImmediatelyKey]; _sendsSearchStringImmediately = [coder decodeBoolForKey:CPSendsSearchStringImmediatelyKey];
_maximumRecents = [coder decodeIntForKey:CPMaximumRecentsKey]; _maximumRecents = [coder decodeIntForKey:CPMaximumRecentsKey];
var template = [coder decodeObjectForKey:CPSearchMenuTemplateKey];
var template = [coder decodeObjectForKey:CPSearchMenuTemplateKey]; if (template)
if (template) [self setSearchMenuTemplate:template];
[self setSearchMenuTemplate:template];
[self setDelegate:self];
[self setDelegate:self];
}
return self; return self;
} }
@end @end
+61 -195
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"
@@ -44,20 +43,18 @@ var CPSplitViewHorizontalImage = nil,
id _delegate; id _delegate;
BOOL _isVertical; BOOL _isVertical;
BOOL _isPaneSplitter; BOOL _isPaneSplitter;
int _currentDivider; int _currentDivider;
float _initialOffset; float _initialOffset;
CPString _originComponent; CPString _originComponent;
CPString _sizeComponent; CPString _sizeComponent;
CPArray _DOMDividerElements; CPArray _DOMDividerElements;
CPString _dividerImagePath; CPString _dividerImagePath;
int _drawingDivider; int _drawingDivider;
BOOL _needsResizeSubviews; BOOL _needsResizeSubviews;
CPArray _buttonBars;
} }
/* /*
@@ -80,11 +77,10 @@ var CPSplitViewHorizontalImage = nil,
_currentDivider = CPNotFound; _currentDivider = CPNotFound;
_DOMDividerElements = []; _DOMDividerElements = [];
_buttonBars = [];
[self _setVertical:YES]; [self _setVertical:YES];
} }
return self; return self;
} }
@@ -102,7 +98,7 @@ var CPSplitViewHorizontalImage = nil,
{ {
if (![self _setVertical:shouldBeVertical]) if (![self _setVertical:shouldBeVertical])
return; return;
// Just re-adjust evenly. // Just re-adjust evenly.
var frame = [self frame], var frame = [self frame],
dividerThickness = [self dividerThickness]; dividerThickness = [self dividerThickness];
@@ -129,13 +125,13 @@ var CPSplitViewHorizontalImage = nil,
- (BOOL)_setVertical:(BOOL)shouldBeVertical - (BOOL)_setVertical:(BOOL)shouldBeVertical
{ {
var changed = (_isVertical != shouldBeVertical); var changed = (_isVertical != shouldBeVertical);
_isVertical = shouldBeVertical; _isVertical = shouldBeVertical;
_originComponent = [self isVertical] ? "x" : "y"; _originComponent = [self isVertical] ? "x" : "y";
_sizeComponent = [self isVertical] ? "width" : "height"; _sizeComponent = [self isVertical] ? "width" : "height";
_dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename]; _dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename];
return changed; return changed;
} }
@@ -154,7 +150,7 @@ var CPSplitViewHorizontalImage = nil,
if(_DOMDividerElements[_drawingDivider]) if(_DOMDividerElements[_drawingDivider])
[self _setupDOMDivider] [self _setupDOMDivider]
// The divider changes size when pane splitter mode is toggled, so the // The divider changes size when pane splitter mode is toggled, so the
// subviews need to change size too. // subviews need to change size too.
_needsResizeSubviews = YES; _needsResizeSubviews = YES;
[self setNeedsDisplay:YES]; [self setNeedsDisplay:YES];
@@ -213,13 +209,18 @@ 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";
CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]); CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
[self _setupDOMDivider]; [self _setupDOMDivider];
} }
CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect)); CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect));
CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect)); CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect));
@@ -255,7 +256,7 @@ var CPSplitViewHorizontalImage = nil,
var subviews = [self subviews], var subviews = [self subviews],
count = subviews.length, count = subviews.length,
oldSize = CGSizeMakeZero(); oldSize = CGSizeMakeZero();
if ([self isVertical]) if ([self isVertical])
{ {
oldSize.width += [self dividerThickness] * (count - 1); oldSize.width += [self dividerThickness] * (count - 1);
@@ -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
@@ -312,7 +303,7 @@ var CPSplitViewHorizontalImage = nil,
if ([self cursorAtPoint:point hitDividerAtIndex:i]) if ([self cursorAtPoint:point hitDividerAtIndex:i])
return self; return self;
} }
return [super hitTest:aPoint]; return [super hitTest:aPoint];
} }
@@ -329,13 +320,12 @@ var CPSplitViewHorizontalImage = nil,
if (_currentDivider != CPNotFound) if (_currentDivider != CPNotFound)
{ {
_currentDivider = CPNotFound; _currentDivider = CPNotFound;
[self _updateResizeCursor:anEvent];
[self _postNotificationDidResize]; [self _postNotificationDidResize];
} }
return; return;
} }
if (type == CPLeftMouseDown) if (type == CPLeftMouseDown)
{ {
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil]; var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
@@ -352,7 +342,7 @@ var CPSplitViewHorizontalImage = nil,
if ([anEvent clickCount] == 2 && if ([anEvent clickCount] == 2 &&
[_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)] && [_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)] &&
[_delegate respondsToSelector:@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)]) [_delegate respondsToSelector:@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)])
{ {
var minPosition = [self minPossiblePositionOfDividerAtIndex:i], var minPosition = [self minPossiblePositionOfDividerAtIndex:i],
maxPosition = [self maxPossiblePositionOfDividerAtIndex:i]; maxPosition = [self maxPossiblePositionOfDividerAtIndex:i];
@@ -384,16 +374,14 @@ var CPSplitViewHorizontalImage = nil,
if (_currentDivider === CPNotFound) if (_currentDivider === CPNotFound)
return; return;
} }
else if (type == CPLeftMouseDragged && _currentDivider != CPNotFound) else if (type == CPLeftMouseDragged && _currentDivider != CPNotFound)
{ {
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,81 +391,13 @@ 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];
if (dividerIndex + 1 < [_subviews count] - 1) if (dividerIndex + 1 < [_subviews count] - 1)
return frame.origin[_originComponent] + frame.size[_sizeComponent] - [self dividerThickness]; return frame.origin[_originComponent] + frame.size[_sizeComponent] - [self dividerThickness];
else else
return [self frame].size[_sizeComponent] - [self dividerThickness]; return [self frame].size[_sizeComponent] - [self dividerThickness];
} }
@@ -486,15 +406,17 @@ var CPSplitViewHorizontalImage = nil,
if (dividerIndex > 0) if (dividerIndex > 0)
{ {
var frame = [_subviews[dividerIndex - 1] frame]; var frame = [_subviews[dividerIndex - 1] frame];
return frame.origin[_originComponent] + frame.size[_sizeComponent] + [self dividerThickness]; return frame.origin[_originComponent] + frame.size[_sizeComponent] + [self dividerThickness];
} }
else else
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];
@@ -503,56 +425,47 @@ var CPSplitViewHorizontalImage = nil,
proposedMin = [self minPossiblePositionOfDividerAtIndex:dividerIndex], proposedMin = [self minPossiblePositionOfDividerAtIndex:dividerIndex],
actualMax = proposedMax, actualMax = proposedMax,
actualMin = proposedMin; actualMin = proposedMin;
if([_delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)]) if([_delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)])
actualMin = [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex]; actualMin = [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex];
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],
if (position < proposedMin + (actualMin - proposedMin) / 2)
if ([_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)])
if ([_delegate splitView:self canCollapseSubview:viewA])
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], frameA = [viewA frame],
viewB = _subviews[dividerIndex + 1], viewB = _subviews[dividerIndex + 1],
frameB = [viewB frame]; frameB = [viewB frame];
var realPosition = MAX(MIN(position, actualMax), actualMin);
if (position < proposedMin + (actualMin - proposedMin) / 2)
if ([_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)])
if ([_delegate splitView:self canCollapseSubview:viewA])
realPosition = proposedMin;
frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent]; frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent];
[_subviews[dividerIndex] setFrame:frameA]; [_subviews[dividerIndex] setFrame:frameA];
frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [self dividerThickness]; frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [self dividerThickness];
frameB.origin[_originComponent] = realPosition + [self dividerThickness]; frameB.origin[_originComponent] = realPosition + [self dividerThickness];
[_subviews[dividerIndex + 1] setFrame:frameB]; [_subviews[dividerIndex + 1] setFrame:frameB];
[self setNeedsDisplay:YES]; [self setNeedsDisplay:YES];
} }
- (void)setFrameSize:(CGSize)aSize - (void)setFrameSize:(CGSize)aSize
{ {
[self _adjustSubviewsWithCalculatedSize]; [self _adjustSubviewsWithCalculatedSize];
[super setFrameSize:aSize]; [super setFrameSize:aSize];
[self setNeedsDisplay:YES]; [self setNeedsDisplay:YES];
} }
- (void)resizeSubviewsWithOldSize:(CPSize)oldSize - (void)resizeSubviewsWithOldSize:(CPSize)oldSize
{ {
if ([_delegate respondsToSelector:@selector(splitView:resizeSubviewsWithOldSize:)]) if ([_delegate respondsToSelector:@selector(splitView:resizeSubviewsWithOldSize:)])
{ {
[_delegate splitView:self resizeSubviewsWithOldSize:oldSize]; [_delegate splitView:self resizeSubviewsWithOldSize:oldSize];
@@ -560,7 +473,7 @@ var CPSplitViewHorizontalImage = nil,
} }
[self _postNotificationWillResize]; [self _postNotificationWillResize];
var index = 0, var index = 0,
count = [_subviews count], count = [_subviews count],
bounds = [self bounds], bounds = [self bounds],
@@ -611,7 +524,7 @@ var CPSplitViewHorizontalImage = nil,
else if (totalSizableSpace && !isSizable) else if (totalSizableSpace && !isSizable)
viewFrame.size[_sizeComponent] = [view frame].size[_sizeComponent]; viewFrame.size[_sizeComponent] = [view frame].size[_sizeComponent];
bounds.origin[_originComponent] += viewFrame.size[_sizeComponent] + dividerThickness; bounds.origin[_originComponent] += viewFrame.size[_sizeComponent] + dividerThickness;
[view setFrame:viewFrame]; [view setFrame:viewFrame];
} }
@@ -625,7 +538,7 @@ var CPSplitViewHorizontalImage = nil,
[[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewDidResizeSubviewsNotification object:self]; [[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewDidResizeSubviewsNotification object:self];
if ([_delegate respondsToSelector:@selector(splitViewWillResizeSubviews:)]) if ([_delegate respondsToSelector:@selector(splitViewWillResizeSubviews:)])
[[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewWillResizeSubviewsNotification object:self]; [[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewWillResizeSubviewsNotification object:self];
_delegate = delegate; _delegate = delegate;
if ([_delegate respondsToSelector:@selector(splitViewDidResizeSubviews:)]) if ([_delegate respondsToSelector:@selector(splitViewDidResizeSubviews:)])
@@ -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)
@@ -707,21 +578,19 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
- (id)initWithCoder:(CPCoder)aCoder - (id)initWithCoder:(CPCoder)aCoder
{ {
self = [super initWithCoder:aCoder]; self = [super initWithCoder:aCoder];
if (self) if (self)
{ {
_currentDivider = CPNotFound; _currentDivider = CPNotFound;
_DOMDividerElements = [];
_buttonBars = [aCoder decodeObjectForKey:CPSplitViewButtonBarsKey] || [];
_delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey]; _DOMDividerElements = [];
_delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey];;
_isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey]; _isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey];
[self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]]; [self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]];
} }
return self; return self;
} }
@@ -732,12 +601,9 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
- (void)encodeWithCoder:(CPCoder)aCoder - (void)encodeWithCoder:(CPCoder)aCoder
{ {
[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];
[aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey]; [aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey];
} }
+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];
} }
+79 -74
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;
@@ -263,14 +261,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
[_headerView setTableView:self]; [_headerView setTableView:self];
_cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))]; _cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))];
_lastSelectedRow = -1; _lastSelectedRow = -1;
_selectedColumnIndexes = [CPIndexSet indexSet]; _selectedColumnIndexes = [CPIndexSet indexSet];
_selectedRowIndexes = [CPIndexSet indexSet]; _selectedRowIndexes = [CPIndexSet indexSet];
_currentHighlightedTableColumn = nil; _currentHighlightedTableColumn = nil;
_sortDescriptors = [CPArray array]; _sortDescriptors = [CPArray array];
_draggedRowIndexes = [CPIndexSet indexSet]; _draggedRowIndexes = [CPIndexSet indexSet];
_verticalMotionCanDrag = YES; _verticalMotionCanDrag = YES;
_isSelectingSession = NO; _isSelectingSession = NO;
@@ -278,6 +276,10 @@ 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]];
@@ -292,9 +294,6 @@ 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]; _backgroundColor = [CPColor whiteColor];
@@ -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,44 +1757,63 @@ 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];
} }
} }
var dragPoint = [self convertPoint:[theDragEvent locationInWindow] fromView:nil]; var dragPoint = [self convertPoint:[theDragEvent locationInWindow] fromView:nil];
dragViewOffset.x = CGRectGetWidth(bounds)/2 - dragPoint.x; dragViewOffset.x = CGRectGetWidth(bounds)/2 - dragPoint.x;
dragViewOffset.y = CGRectGetHeight(bounds)/2 - dragPoint.y; dragViewOffset.y = CGRectGetHeight(bounds)/2 - dragPoint.y;
return view; return view;
} }
@@ -1822,7 +1835,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
var numberOfRows = [self numberOfRows] + 1; var numberOfRows = [self numberOfRows] + 1;
var reason = @"Attempt to set dropRow=" + row + var reason = @"Attempt to set dropRow=" + row +
" dropOperation=CPTableViewDropOn when [0 - " + numberOfRows + "] is valid range of rows." " dropOperation=CPTableViewDropOn when [0 - " + numberOfRows + "] is valid range of rows."
[[CPException exceptionWithName:@"Error" reason:reason userInfo:nil] raise]; [[CPException exceptionWithName:@"Error" reason:reason userInfo:nil] raise];
} }
@@ -1878,7 +1891,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
return; return;
_sortDescriptors = newSortDescriptors; _sortDescriptors = newSortDescriptors;
[self _sendDataSourceSortDescriptorsDidChange:oldSortDescriptors]; [self _sendDataSourceSortDescriptorsDidChange:oldSortDescriptors];
} }
@@ -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
@@ -2636,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)
@@ -2750,7 +2760,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
*/ */
- (void)draggingExited:(id)sender - (void)draggingExited:(id)sender
{ {
[_dropOperationFeedbackView removeFromSuperview]; [_dropOperationFeedbackView setHidden:YES];
} }
/* /*
@@ -2766,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
@@ -2899,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_);
} }
@@ -3175,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";
@@ -3225,9 +3234,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];
@@ -3271,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];
@@ -3316,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],
+26 -71
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
@@ -1338,72 +1317,56 @@ var CPViewFlags = { },
{ {
if (_backgroundColor == aColor) if (_backgroundColor == aColor)
return; return;
_backgroundColor = aColor; _backgroundColor = aColor;
#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);
DOMElement.style.zIndex = -1000; DOMElement.style.zIndex = -1000;
_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] : ""; // Opera doesn't like DOM properties set to nil.
// https://trac.280north.com/ticket/7
if (colorNeedsDOMElement) _DOMElement.style.background = _backgroundColor ? [_backgroundColor cssString] : "";
{
_DOMElement.style.background = "";
_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],
@@ -1414,31 +1377,23 @@ var CPViewFlags = { },
{ {
var image = slices[count], var image = slices[count],
size = _DOMImageSizes[count] = image ? [image size] : _CGSizeMakeZero(); size = _DOMImageSizes[count] = image ? [image size] : _CGSizeMakeZero();
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)
{ {
var width = frameSize.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, var width = frameSize.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width,
height = frameSize.height - _DOMImageSizes[0].height - _DOMImageSizes[6].height; height = frameSize.height - _DOMImageSizes[0].height - _DOMImageSizes[6].height;
CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], width, _DOMImageSizes[0].height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], width, _DOMImageSizes[0].height);
CPDOMDisplayServerSetStyleSize(_DOMImageParts[3], _DOMImageSizes[3].width, height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[3], _DOMImageSizes[3].width, height);
CPDOMDisplayServerSetStyleSize(_DOMImageParts[4], width, height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[4], width, height);
CPDOMDisplayServerSetStyleSize(_DOMImageParts[5], _DOMImageSizes[5].width, height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[5], _DOMImageSizes[5].width, height);
CPDOMDisplayServerSetStyleSize(_DOMImageParts[7], width, _DOMImageSizes[7].height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[7], width, _DOMImageSizes[7].height);
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0); CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0);
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, _DOMImageSizes[0].width, 0.0); CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, _DOMImageSizes[0].width, 0.0);
CPDOMDisplayServerSetStyleRightTop(_DOMImageParts[2], NULL, 0.0, 0.0); CPDOMDisplayServerSetStyleRightTop(_DOMImageParts[2], NULL, 0.0, 0.0);
@@ -1452,7 +1407,7 @@ var CPViewFlags = { },
else if (_backgroundType == BackgroundVerticalThreePartImage) else if (_backgroundType == BackgroundVerticalThreePartImage)
{ {
CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], frameSize.width, frameSize.height - _DOMImageSizes[0].height - _DOMImageSizes[2].height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], frameSize.width, frameSize.height - _DOMImageSizes[0].height - _DOMImageSizes[2].height);
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0); CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0);
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, 0.0, _DOMImageSizes[0].height); CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, 0.0, _DOMImageSizes[0].height);
CPDOMDisplayServerSetStyleLeftBottom(_DOMImageParts[2], NULL, 0.0, 0.0); CPDOMDisplayServerSetStyleLeftBottom(_DOMImageParts[2], NULL, 0.0, 0.0);
@@ -1460,7 +1415,7 @@ var CPViewFlags = { },
else if (_backgroundType == BackgroundHorizontalThreePartImage) else if (_backgroundType == BackgroundHorizontalThreePartImage)
{ {
CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], frameSize.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, frameSize.height); CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], frameSize.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, frameSize.height);
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0); CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0);
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, _DOMImageSizes[0].width, 0.0); CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, _DOMImageSizes[0].width, 0.0);
CPDOMDisplayServerSetStyleRightTop(_DOMImageParts[2], NULL, 0.0, 0.0); CPDOMDisplayServerSetStyleRightTop(_DOMImageParts[2], NULL, 0.0, 0.0);
+27 -55
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,58 +1331,44 @@ 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)
{ case CPRightMouseUp: return [_rightMouseDownView mouseUp:anEvent];
selector = @selector(rightMouseDragged:) case CPRightMouseDown: _rightMouseDownView = [_windowView hitTest:point];
if (![_leftMouseDownView respondsToSelector:selector]) return [_rightMouseDownView mouseDown:anEvent];
selector = nil; case CPRightMouseDragged: return [_rightMouseDownView mouseDragged:anEvent];
}
if (!selector)
selector = @selector(mouseDragged:)
return [_leftMouseDownView performSelector:selector withObject: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];
+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;
+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
+7 -60
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,13 +1076,8 @@ 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)
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

+9 -41
View File
@@ -721,49 +721,17 @@
+ (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");
+8 -20
View File
@@ -5,18 +5,13 @@
{ {
} }
- (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;
} }
@@ -25,23 +20,16 @@
var context = [[CPGraphicsContext currentContext] graphicsPort]; var context = [[CPGraphicsContext currentContext] graphicsPort];
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)
]; ];
CGContextStrokeLineSegments(context, points, 2); CGContextStrokeLineSegments(context, points, 2);
} }
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
{
[self _init];
}
return self;
}
@end @end
+38 -25
View File
@@ -332,8 +332,7 @@ var HORIZONTAL_MARGIN = 3.0,
hasDOMTextElement = !!_DOMTextElement; hasDOMTextElement = !!_DOMTextElement;
// 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);
@@ -539,8 +539,8 @@ var HORIZONTAL_MARGIN = 3.0,
_DOMElement.appendChild(_DOMImageElement); _DOMElement.appendChild(_DOMImageElement);
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,54 +572,67 @@ 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),
textRectY = _CGRectGetMinY(textRect), textRectY = _CGRectGetMinY(textRect),
textRectWidth = _CGRectGetWidth(textRect), textRectWidth = _CGRectGetWidth(textRect),
textRectHeight = _CGRectGetHeight(textRect); textRectHeight = _CGRectGetHeight(textRect);
if (_verticalAlignment !== CPTopVerticalTextAlignment) if (_verticalAlignment !== CPTopVerticalTextAlignment)
{ {
if (!_textSize) if (!_textSize)
@@ -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"));
});
+103 -175
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,11 +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("-v", "--verbose", "verbose") parser.option("-v", "--verbose", "verbose")
.def(false) .def(false)
.set(true) .set(true)
@@ -91,27 +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);
outputPath.join("Application"+(n||"")+".js").write(applicationJS);
});
rewriteMainHTML(outputPath.join(options.index)); rewriteMainHTML(outputPath.join(options.index));
} }
@@ -120,185 +115,118 @@ 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 applicationJSs = []; buffer.push("(function(){");
if (this.options.split === 0) { buffer.push("var appURL = new CFURL('.', ObjectiveJ.pageURL);")
var buffer = [];
buffer.push("var baseURL = new CFURL(\".\", ObjectiveJ.pageURL);"); buffer.push(this.bundleBuffer.join("\n"));
buffer.push(this.fileCacheBuffer.join("\n"));
buffer.push(this.functionsBuffer.join("\n")); buffer.push("var nodeStack = [];");
buffer.push("ObjectiveJ.bootstrap();"); buffer.push("var applicationRoot = ObjectiveJ.StaticResource.resourceAtURL(appURL, true);");
applicationJSs.push(buffer.join("\n")); buffer.push("var currentNode = null;");
buffer.push("var newNode;");
buffer.push(this.resourceBuffer.join("\n"));
buffer.push("})();");
buffer.push(this.functionsBuffer.join("\n"));
buffer.push("ObjectiveJ.bootstrap();");
return buffer.join("\n");
}
ObjectiveJFlattener.prototype.serializeStaticFileExecutables = function() {
this.require("objective-j").FileExecutable.allFileExecutables().forEach(function(aFileExecutable) {
var deps = aFileExecutable.fileDependencies().map(function(dependency) {
return "new ObjectiveJ.FileDependency(new CFURL("+JSON.stringify(dependency.path())+"),"+JSON.stringify(dependency.isLocal())+")"
}).join(",");
var func = aFileExecutable._function.toString();
// HACK
func = func.replace(", require, exports, module, system, print, window", "");
this.functionsBuffer.push("var path = "+JSON.stringify(this.rootPath.relative(aFileExecutable.path()).toString())+";");
this.functionsBuffer.push("new ObjectiveJ.FileExecutable(path,"+
"new ObjectiveJ.Executable(null, ["+deps+"], path, "+func+"));");
}, this);
}
ObjectiveJFlattener.prototype.serializeStaticResources = function(node, depth) {
depth = depth || 0;
var bundle = this.context.global.CFBundle.bundleContainingURL(node.URL());
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("var appFilesCount = " + appFilesCount +";");
buffers[0].push("for (var i = 1; i <= appFilesCount; i++) {");
buffers[0].push(" var script = document.createElement(\"script\");");
buffers[0].push(" script.src = \"Application\"+i+\".js\";");
buffers[0].push(" script.onload = function() { if (--appFilesCount === 0) ObjectiveJ.bootstrap(); };");
buffers[0].push(" document.getElementsByTagName(\"head\")[0].appendChild(script);");
buffers[0].push("}");
buffers.forEach(function(buffer) {
applicationJSs.push(buffer.join("\n"));
});
} }
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();");
this.fileCacheBuffer.push(FILE.read(FILE.join(FILE.dirname(module.path), "..", "..", "cappuccino", "lib", "cappuccino", "objj-flatten-additions.js"), { charset:"UTF-8" }));
for (var relative in this.filesToCache) {
var contents = this.filesToCache[relative];
print("caching: " + relative + " => " + (contents == null ? 404 : 200));
if (contents == null)
this.fileCacheBuffer.push("CFHTTPRequest._cacheRequest(new CFURL("+JSON.stringify(relative)+", baseURL), 404);");
else
this.fileCacheBuffer.push("CFHTTPRequest._cacheRequest(new CFURL("+JSON.stringify(relative)+", baseURL), 200, {}, "+JSON.stringify(contents)+");");
}
}
ObjectiveJFlattener.prototype.setupFileCache = function() {
var paths = {};
UTIL.update(paths, this.requestedURLs);
this.options.paths.forEach(function(relativePath) {
paths[this.rootPath.join(relativePath)] = true;
}, this);
Object.keys(paths).forEach(function(absolute) {
var relative = this.rootPath.relative(absolute).toString();
if (relative.indexOf("..") === 0)
{
print("skipping (parent of app root): " + absolute);
return;
}
if (FILE.isFile(absolute))
{
// if (this.options.maxCachedSize && FILE.size(absolute) > this.options.maxCachedSize)
// {
// print("skipping (larger than "+this.options.maxCachedSize+" bytes): " + absolute);
// return;
// }
var contents = FILE.read(absolute, { charset : "UTF-8" });
this.filesToCache[relative] = contents;
} else {
this.filesToCache[relative] = null;
}
}, this);
} }
// "$1" is the matching indentation // "$1" is the matching indentation
var scriptTagsBefore = '$1<script type = "text/javascript">\n$1 OBJJ_AUTO_BOOTSTRAP = false;\n$1</script>'; var scriptTagsBefore = '$1<script type = "text/javascript">\n$1 OBJJ_AUTO_BOOTSTRAP = false;\n$1</script>';
var scriptTagsAfter = '$1<script type = "text/javascript" src = "Application.js"></script>'; var scriptTagsAfter = '$1<script type = "text/javascript" src = "Application.js"></script>';
// enable CPLog:
// scriptTagsAfter = '$1<script type = "text/javascript">\n$1 CPLogRegister(CPLogConsole);\n$1</script>\n' + scriptTagsAfter;
function rewriteMainHTML(indexHTMLPath) { function rewriteMainHTML(indexHTMLPath) {
if (indexHTMLPath.isFile()) { if (indexHTMLPath.isFile()) {
var indexHTML = indexHTMLPath.read(); var indexHTML = indexHTMLPath.read();
// inline the Application.js if it's smallish
var applicationJSPath = indexHTMLPath.dirname().join("Application.js");
if (applicationJSPath.size() < 10*1024) {
var applicationJS = applicationJSPath.read().split("\n").join("\n$1 ");
scriptTagsAfter = '$1<script type = "text/javascript">\n$1 '+applicationJS+'\n$1</script>'
}
// attempt to find Objective-J script tag and add ours // 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>)?/,
scriptTagsBefore+'\n$&\n'+scriptTagsAfter); scriptTagsBefore+'\n$&\n'+scriptTagsAfter);
-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,14 +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;
} }
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": [
+6 -10
View File
@@ -105,11 +105,7 @@
*/ */
+ (id)alloc + (id)alloc
{ {
var a = []; return [];
a._retainCount = 1;
a._UID = objj_generateObjectUID();
OBJJ_MEMORY_TABLE[a._UID] = a;
return a;
} }
/*! /*!
@@ -117,7 +113,7 @@
*/ */
+ (id)array + (id)array
{ {
return [[[self alloc] init] autorelease]; return [[self alloc] init];
} }
/*! /*!
@@ -127,7 +123,7 @@
*/ */
+ (id)arrayWithArray:(CPArray)anArray + (id)arrayWithArray:(CPArray)anArray
{ {
return [[[self alloc] initWithArray:anArray] autorelease]; return [[self alloc] initWithArray:anArray];
} }
/*! /*!
@@ -137,7 +133,7 @@
*/ */
+ (id)arrayWithObject:(id)anObject + (id)arrayWithObject:(id)anObject
{ {
return [[[self alloc] initWithObjects:anObject] autorelease]; return [[self alloc] initWithObjects:anObject];
} }
/*! /*!
@@ -154,7 +150,7 @@
for(; i < arguments.length && (argument = arguments[i]) != nil; ++i) for(; i < arguments.length && (argument = arguments[i]) != nil; ++i)
array.push(argument); array.push(argument);
return [array autorelease]; return array;
} }
/*! /*!
@@ -165,7 +161,7 @@
*/ */
+ (id)arrayWithObjects:(id)objects count:(unsigned)aCount + (id)arrayWithObjects:(id)objects count:(unsigned)aCount
{ {
return [[[self alloc] initWithObjects:objects count:aCount] autorelease]; return [[self alloc] initWithObjects:objects count:aCount];
} }
/*! /*!
-56
View File
@@ -1,56 +0,0 @@
@import "CPObject.j"
var MAIN_POOL = nil;
@implementation CPAutoreleasePool : CPObject
{
CPArray _objects;
}
+ (void)initialize
{
MAIN_POOL = [CPAutoreleasePool new];
}
+ (id)_mainAutoreleasePool
{
return MAIN_POOL;
}
+ (void)addObject:(id)anObject
{
[[self _mainAutoreleasePool] addObject:anObject];
}
- (id)init
{
if (self = [super init])
{
_objects = [];
[[CPRunLoop currentRunLoop] performSelector:@selector(drain) target:self argument:nil order:0 modes:[CPDefaultRunLoopMode]];
}
return self;
}
- (void)addObject:(id)anObject
{
_objects.push(anObject);
}
- (void)drain
{
for (var i = 0, count = [_objects count]; i < count; i++)
[_objects.pop() release];
[[CPRunLoop currentRunLoop] performSelector:@selector(drain) target:self argument:nil order:0 modes:[CPDefaultRunLoopMode]];
}
- (void)dealloc
{
[self drain];
[super dealloc];
}
@end
+1 -1
View File
@@ -72,7 +72,7 @@ var CPBundlesForURLStrings = { };
if (self) if (self)
{ {
_bundle = new CFBundle(aURL); _bundle = new CFBundle(aURL);
CPBundlesForURLStrings[URLString] = [self retain]; CPBundlesForURLStrings[URLString] = self;
} }
return self; return self;
+5 -5
View File
@@ -40,27 +40,27 @@
+ (CPData)data + (CPData)data
{ {
return [[[self alloc] init] autorelease]; return [[self alloc] init];
} }
+ (CPData)dataWithRawString:(CPString)aString + (CPData)dataWithRawString:(CPString)aString
{ {
return [[[self alloc] initWithRawString:aString] autorelease]; return [[self alloc] initWithRawString:aString];
} }
+ (CPData)dataWithPlistObject:(id)aPlistObject + (CPData)dataWithPlistObject:(id)aPlistObject
{ {
return [[[self alloc] initWithPlistObject:aPlistObject] autorelease]; return [[self alloc] initWithPlistObject:aPlistObject];
} }
+ (CPData)dataWithPlistObject:(id)aPlistObject format:(CPPropertyListFormat)aFormat + (CPData)dataWithPlistObject:(id)aPlistObject format:(CPPropertyListFormat)aFormat
{ {
return [[[self alloc] initWithPlistObject:aPlistObject format:aFormat] autorelease]; return [[self alloc] initWithPlistObject:aPlistObject format:aFormat];
} }
+ (CPData)dataWithJSONObject:(Object)anObject + (CPData)dataWithJSONObject:(Object)anObject
{ {
return [[[self alloc] initWithJSONObject:anObject] autorelease]; return [[self alloc] initWithJSONObject:anObject];
} }
- (id)initWithRawString:(CPString)aString - (id)initWithRawString:(CPString)aString
+13 -19
View File
@@ -24,13 +24,7 @@
@import "CPString.j" @import "CPString.j"
var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)), var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0));
_CPDateAllocator = function(a) {
a._retainCount = 1;
a._UID = objj_generateObjectUID();
OBJJ_MEMORY_TABLE[a._UID] = a;
return a;
};
/*! /*!
@class CPDate @class CPDate
@@ -45,48 +39,48 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
+ (id)alloc + (id)alloc
{ {
return _CPDateAllocator(new Date); return new Date;
} }
+ (id)date + (id)date
{ {
return [[[self alloc] init] autorelease]; return [[self alloc] init];
} }
+ (id)dateWithTimeIntervalSinceNow:(CPTimeInterval)seconds + (id)dateWithTimeIntervalSinceNow:(CPTimeInterval)seconds
{ {
return [[[CPDate alloc] initWithTimeIntervalSinceNow:seconds] autorelease]; return [[CPDate alloc] initWithTimeIntervalSinceNow:seconds];
} }
+ (id)dateWithTimeIntervalSince1970:(CPTimeInterval)seconds + (id)dateWithTimeIntervalSince1970:(CPTimeInterval)seconds
{ {
return [[[CPDate alloc] initWithTimeIntervalSince1970:seconds] autorelease]; return [[CPDate alloc] initWithTimeIntervalSince1970:seconds];
} }
+ (id)dateWithTimeIntervalSinceReferenceDate:(CPTimeInterval)seconds + (id)dateWithTimeIntervalSinceReferenceDate:(CPTimeInterval)seconds
{ {
return [[[CPDate alloc] initWithTimeIntervalSinceReferenceDate:seconds] autorelease]; return [[CPDate alloc] initWithTimeIntervalSinceReferenceDate:seconds];
} }
+ (id)distantPast + (id)distantPast
{ {
return [_CPDateAllocator(new Date(-10000,1,1,0,0,0,0)) autorelease]; return new Date(-10000,1,1,0,0,0,0);
} }
+ (id)distantFuture + (id)distantFuture
{ {
return [_CPDateAllocator(new Date(10000,1,1,0,0,0,0)) autorelease]; return new Date(10000,1,1,0,0,0,0);
} }
- (id)initWithTimeIntervalSinceNow:(CPTimeInterval)seconds - (id)initWithTimeIntervalSinceNow:(CPTimeInterval)seconds
{ {
self = _CPDateAllocator(new Date((new Date()).getTime() + seconds * 1000)); self = new Date((new Date()).getTime() + seconds * 1000);
return self; return self;
} }
- (id)initWithTimeIntervalSince1970:(CPTimeInterval)seconds - (id)initWithTimeIntervalSince1970:(CPTimeInterval)seconds
{ {
self = _CPDateAllocator(new Date(seconds * 1000)); self = new Date(seconds * 1000);
return self; return self;
} }
@@ -98,7 +92,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
- (id)initWithTimeInterval:(CPTimeInterval)seconds sinceDate:(CPDate)refDate - (id)initWithTimeInterval:(CPTimeInterval)seconds sinceDate:(CPDate)refDate
{ {
self = _CPDateAllocator(new Date(refDate.getTime() + seconds * 1000)); self = new Date(refDate.getTime() + seconds * 1000);
return self; return self;
} }
@@ -123,7 +117,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
date.setMinutes(d[5]); date.setMinutes(d[5]);
date.setSeconds(d[6]); date.setSeconds(d[6]);
self = _CPDateAllocator(new Date(date.getTime() + (timeZoneOffset - date.getTimezoneOffset()) * 60 * 1000)); self = new Date(date.getTime() + (timeZoneOffset - date.getTimezoneOffset()) * 60 * 1000);
return self; return self;
} }
@@ -191,7 +185,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
- (id)copy - (id)copy
{ {
return _CPDateAllocator(new Date(self.getTime())); return new Date(self.getTime());
} }
@end @end
+7 -18
View File
@@ -92,7 +92,7 @@
*/ */
+ (id)dictionary + (id)dictionary
{ {
return [[[self alloc] init] autorelease];; return [[self alloc] init];
} }
/*! /*!
@@ -102,7 +102,7 @@
*/ */
+ (id)dictionaryWithDictionary:(CPDictionary)aDictionary + (id)dictionaryWithDictionary:(CPDictionary)aDictionary
{ {
return [[[self alloc] initWithDictionary:aDictionary] autorelease]; return [[self alloc] initWithDictionary:aDictionary];
} }
/*! /*!
@@ -113,7 +113,7 @@
*/ */
+ (id)dictionaryWithObject:(id)anObject forKey:(id)aKey + (id)dictionaryWithObject:(id)anObject forKey:(id)aKey
{ {
return [[[self alloc] initWithObjects:[anObject] forKeys:[aKey]] autorelease]; return [[self alloc] initWithObjects:[anObject] forKeys:[aKey]];
} }
/*! /*!
@@ -125,7 +125,7 @@
*/ */
+ (id)dictionaryWithObjects:(CPArray)objects forKeys:(CPArray)keys + (id)dictionaryWithObjects:(CPArray)objects forKeys:(CPArray)keys
{ {
return [[[self alloc] initWithObjects:objects forKeys:keys] autorelease]; return [[self alloc] initWithObjects:objects forKeys:keys];
} }
/*! /*!
@@ -135,7 +135,7 @@
*/ */
+ (id)dictionaryWithJSObject:(JSObject)object + (id)dictionaryWithJSObject:(JSObject)object
{ {
return [[self dictionaryWithJSObject:object recursively:NO] autorelease]; return [self dictionaryWithJSObject:object recursively:NO];
} }
/*! /*!
@@ -145,7 +145,7 @@
*/ */
+ (id)dictionaryWithJSObject:(JSObject)object recursively:(BOOL)recursively + (id)dictionaryWithJSObject:(JSObject)object recursively:(BOOL)recursively
{ {
var dictionary = [[[self alloc] init] autorelease]; var dictionary = [[self alloc] init];
for (var key in object) for (var key in object)
{ {
@@ -153,12 +153,6 @@
continue; continue;
var value = object[key]; var value = object[key];
if (value === null)
{
[dictionary setObject:[CPNull null] forKey:key];
continue;
}
if (recursively) if (recursively)
{ {
@@ -209,7 +203,7 @@
arguments[0] = [self alloc]; arguments[0] = [self alloc];
arguments[1] = @selector(initWithObjectsAndKeys:); arguments[1] = @selector(initWithObjectsAndKeys:);
return [objj_msgSend.apply(this, arguments) autorelease]; return objj_msgSend.apply(this, arguments);
} }
/*! /*!
@@ -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 -6
View File
@@ -47,7 +47,7 @@
*/ */
+ (id)indexSet + (id)indexSet
{ {
return [[[self alloc] init] autorelease]; return [[self alloc] init];
} }
/*! /*!
@@ -55,7 +55,7 @@
*/ */
+ (id)indexSetWithIndex:(int)anIndex + (id)indexSetWithIndex:(int)anIndex
{ {
return [[[self alloc] initWithIndex:anIndex] autorelease]; return [[self alloc] initWithIndex:anIndex];
} }
/*! /*!
@@ -64,7 +64,7 @@
*/ */
+ (id)indexSetWithIndexesInRange:(CPRange)aRange + (id)indexSetWithIndexesInRange:(CPRange)aRange
{ {
return [[[self alloc] initWithIndexesInRange:aRange] autorelease]; return [[self alloc] initWithIndexesInRange:aRange];
} }
// Initializing and Index Set // Initializing and Index Set
@@ -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)
{ {
+1 -1
View File
@@ -46,7 +46,7 @@
*/ */
+ (id)invocationWithMethodSignature:(CPMethodSignature)aMethodSignature + (id)invocationWithMethodSignature:(CPMethodSignature)aMethodSignature
{ {
return [[[self alloc] initWithMethodSignature:aMethodSignature] autorelease]; return [[self alloc] initWithMethodSignature:aMethodSignature];
} }
/*! /*!
+1 -1
View File
@@ -56,7 +56,7 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}";
+ (CPJSONPConnection)connectionWithRequest:(CPURLRequest)aRequest callback:(CPString)callbackParameter delegate:(id)aDelegate + (CPJSONPConnection)connectionWithRequest:(CPURLRequest)aRequest callback:(CPString)callbackParameter delegate:(id)aDelegate
{ {
return [[[[self class] alloc] initWithRequest:aRequest callback:callbackParameter delegate:aDelegate startImmediately:YES] autorelease]; return [[[self class] alloc] initWithRequest:aRequest callback:callbackParameter delegate:aDelegate startImmediately:YES];;
} }
- (id)initWithRequest:(CPURLRequest)aRequest callback:(CPString)aString delegate:(id)aDelegate - (id)initWithRequest:(CPURLRequest)aRequest callback:(CPString)aString delegate:(id)aDelegate
-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"
+1 -1
View File
@@ -148,7 +148,7 @@ var _CPKeyedArchiverStringClass = Nil,
+ (CPData)archivedDataWithRootObject:(id)anObject + (CPData)archivedDataWithRootObject:(id)anObject
{ {
var data = [CPData dataWithPlistObject:nil], var data = [CPData dataWithPlistObject:nil],
archiver = [[[self alloc] initForWritingWithMutableData:data] autorelease]; archiver = [[self alloc] initForWritingWithMutableData:data];
[archiver encodeObject:anObject forKey:@"root"]; [archiver encodeObject:anObject forKey:@"root"];
[archiver finishEncoding]; [archiver finishEncoding];
+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] autorelease],
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;
+2 -2
View File
@@ -53,7 +53,7 @@
*/ */
+ (CPNotification)notificationWithName:(CPString)aNotificationName object:(id)anObject userInfo:(CPDictionary)aUserInfo + (CPNotification)notificationWithName:(CPString)aNotificationName object:(id)anObject userInfo:(CPDictionary)aUserInfo
{ {
return [[[self alloc] initWithName:aNotificationName object:anObject userInfo:aUserInfo] autorelease]; return [[self alloc] initWithName:aNotificationName object:anObject userInfo:aUserInfo];
} }
/*! /*!
@@ -64,7 +64,7 @@
*/ */
+ (CPNotification)notificationWithName:(CPString)aNotificationName object:(id)anObject + (CPNotification)notificationWithName:(CPString)aNotificationName object:(id)anObject
{ {
return [[[self alloc] initWithName:aNotificationName object:anObject userInfo:nil] autorelease]; return [[self alloc] initWithName:aNotificationName object:anObject userInfo:nil];
} }
/*! /*!
-3
View File
@@ -333,7 +333,4 @@ FIXME: Do we need this?
Number.prototype.isa = CPNumber; Number.prototype.isa = CPNumber;
Boolean.prototype.isa = CPNumber; Boolean.prototype.isa = CPNumber;
Number.prototype._retainCount = Infinity;
Boolean.prototype._retainCount = Infinity;
[CPNumber initialize]; [CPNumber initialize];
+1 -10
View File
@@ -89,6 +89,7 @@ CPLog(@"Got some class: %@", inst);
*/ */
+ (id)alloc + (id)alloc
{ {
// CPLog("calling alloc on " + self.name + ".");
return class_createInstance(self); return class_createInstance(self);
} }
@@ -129,7 +130,6 @@ CPLog(@"Got some class: %@", inst);
*/ */
- (void)dealloc - (void)dealloc
{ {
delete OBJJ_MEMORY_TABLE[[self UID]];
} }
// Identifying classes // Identifying classes
@@ -464,7 +464,6 @@ CPLog(@"Got some class: %@", inst);
*/ */
- (id)autorelease - (id)autorelease
{ {
[CPAutoreleasePool addObject:self];
return self; return self;
} }
@@ -499,7 +498,6 @@ CPLog(@"Got some class: %@", inst);
*/ */
- (id)retain - (id)retain
{ {
_retainCount++;
return self; return self;
} }
@@ -508,11 +506,6 @@ CPLog(@"Got some class: %@", inst);
*/ */
- (void)release - (void)release
{ {
_retainCount--;
if (_retainCount === 0)
[self dealloc];
else if (OBJJ_ZOMBIE_DETECTION && _retainCount < 0)
throw ("Released a zombie object: "+self);
} }
/*! /*!
@@ -542,5 +535,3 @@ objj_class.prototype.toString = objj_object.prototype.toString = function()
else else
return String(this) + " (-description not implemented)"; return String(this) + " (-description not implemented)";
} }
@import "CPAutoreleasePool.j"
+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?
+1 -1
View File
@@ -73,7 +73,7 @@ var _CPRunLoopPerformPool = [],
return perform; return perform;
} }
return [[[self alloc] initWithSelector:aSelector target:aTarget argument:anArgument order:anOrder modes:modes] autorelease]; return [[self alloc] initWithSelector:aSelector target:aTarget argument:anArgument order:anOrder modes:modes];
} }
- (id)initWithSelector:(SEL)aSelector target:(SEL)aTarget argument:(id)anArgument order:(unsigned)anOrder modes:(CPArray)modes - (id)initWithSelector:(SEL)aSelector target:(SEL)aTarget argument:(id)anArgument order:(unsigned)anOrder modes:(CPArray)modes
+6 -6
View File
@@ -45,7 +45,7 @@
*/ */
+ (id)set + (id)set
{ {
return [[[self alloc] init] autorelease]; return [[self alloc] init];
} }
/* /*
@@ -54,7 +54,7 @@
*/ */
+ (id)setWithArray:(CPArray)array + (id)setWithArray:(CPArray)array
{ {
return [[[self alloc] initWithArray:array] autorelease]; return [[self alloc] initWithArray:array];
} }
/* /*
@@ -63,7 +63,7 @@
*/ */
+ (id)setWithObject:(id)anObject + (id)setWithObject:(id)anObject
{ {
return [[[self alloc] initWithArray:[anObject]] autorelease]; return [[self alloc] initWithArray:[anObject]];
} }
/* /*
@@ -73,7 +73,7 @@
*/ */
+ (id)setWithObjects:(id)objects count:(unsigned)count + (id)setWithObjects:(id)objects count:(unsigned)count
{ {
return [[[self alloc] initWithObjects:objects count:count] autorelease]; return [[self alloc] initWithObjects:objects count:count];
} }
/* /*
@@ -90,7 +90,7 @@
for(; i < argLength && ((argument = arguments[i]) !== nil); ++i) for(; i < argLength && ((argument = arguments[i]) !== nil); ++i)
[set addObject:argument]; [set addObject:argument];
return [set autorelease]; return set;
} }
/* /*
@@ -99,7 +99,7 @@
*/ */
+ (id)setWithSet:(CPSet)set + (id)setWithSet:(CPSet)set
{ {
return [[[self alloc] initWithSet:set] autorelease]; return [[self alloc] initWithSet:set];
} }
/* /*
+1 -1
View File
@@ -78,7 +78,7 @@ CPOrderedDescending = 1;
+ (id)sortDescriptorWithKey:(CPString)aKey ascending:(BOOL)isAscending selector:(SEL)aSelector + (id)sortDescriptorWithKey:(CPString)aKey ascending:(BOOL)isAscending selector:(SEL)aSelector
{ {
return [[[self alloc] initWithKey:aKey ascending:isAscending selector:aSelector] autorelease]; return [[self alloc] initWithKey:aKey ascending:isAscending selector:aSelector];
} }
/*! /*!
-19
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);
@@ -769,4 +751,3 @@ var CPStringRegexSpecialCharacters = [
@end @end
String.prototype.isa = CPString; String.prototype.isa = CPString;
String.prototype._retainCount = Infinity;
+6 -6
View File
@@ -48,7 +48,7 @@
*/ */
+ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
{ {
var timer = [[[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat] autorelease]; var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat];
//add to the runloop //add to the runloop
[[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode]; [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
@@ -61,7 +61,7 @@
*/ */
+ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
{ {
var timer = [[[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat] autorelease]; var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat]
//add to the runloop //add to the runloop
[[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode]; [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
@@ -74,7 +74,7 @@
*/ */
+ (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
{ {
var timer = [[[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat] autorelease]; var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat];
//add to the runloop //add to the runloop
[[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode]; [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
@@ -87,7 +87,7 @@
*/ */
+ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
{ {
return [[[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat] autorelease]; return [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat];
} }
/*! /*!
@@ -95,7 +95,7 @@
*/ */
+ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
{ {
return [[[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat] autorelease]; return [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat];
} }
/*! /*!
@@ -103,7 +103,7 @@
*/ */
+ (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
{ {
return [[[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat] autorelease]; return [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat];
} }
/*! /*!
+3 -3
View File
@@ -55,7 +55,7 @@ CPURLCustomIconKey = @"CPURLCustomIconKey";
+ (id)URLWithString:(CPString)URLString + (id)URLWithString:(CPString)URLString
{ {
return [[[self alloc] initWithString:URLString] autorelease]; return [[self alloc] initWithString:URLString];
} }
- (id)initWithString:(CPString)URLString relativeToURL:(CPURL)aBaseURL - (id)initWithString:(CPString)URLString relativeToURL:(CPURL)aBaseURL
@@ -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
@@ -128,7 +128,7 @@ var CPURLConnectionDelegate = nil;
*/ */
+ (CPURLConnection)connectionWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate + (CPURLConnection)connectionWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate
{ {
return [[[self alloc] initWithRequest:aRequest delegate:aDelegate] autorelease]; return [[self alloc] initWithRequest:aRequest delegate:aDelegate];
} }
/* /*
+1 -1
View File
@@ -48,7 +48,7 @@
*/ */
+ (id)requestWithURL:(CPURL)aURL + (id)requestWithURL:(CPURL)aURL
{ {
return [[[CPURLRequest alloc] initWithURL:aURL] autorelease]; return [[CPURLRequest alloc] initWithURL:aURL];
} }
/*! /*!
+1 -1
View File
@@ -71,7 +71,7 @@ var _CPUndoGroupingPool = [],
return grouping; return grouping;
} }
return [[[self alloc] initWithParent:anUndoGrouping] autorelease]; return [[self alloc] initWithParent:anUndoGrouping];
} }
- (id)initWithParent:(_CPUndoGrouping)anUndoGrouping - (id)initWithParent:(_CPUndoGrouping)anUndoGrouping
+1 -1
View File
@@ -43,7 +43,7 @@
*/ */
+ (id)valueWithJSObject:(JSObject)aJSObject + (id)valueWithJSObject:(JSObject)aJSObject
{ {
return [[[self alloc] initWithJSObject:aJSObject] autorelease]; return [[self alloc] initWithJSObject:aJSObject];
} }
/*! /*!
-1
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 "CPAutoreleasePool.j"
@import "CPArray.j" @import "CPArray.j"
@import "CPBundle.j" @import "CPBundle.j"
@import "CPCoder.j" @import "CPCoder.j"
+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/**/*"));
+20 -32
View File
@@ -247,7 +247,7 @@ task ("demos", function()
// Testing // Testing
task("test", ["CommonJS", "test-only"]); task("test", ["build", "test-only"]);
task("test-only", function() task("test-only", function()
{ {
@@ -280,23 +280,21 @@ task("push-objective-j", function() {
function pushPackage(path, remote, branch) 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"]
@@ -304,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 -63
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 = [];
@@ -57,53 +56,36 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL)
this._infoDictionary = new CFDictionary(); this._infoDictionary = new CFDictionary();
this._eventDispatcher = new EventDispatcher(this); this._eventDispatcher = new EventDispatcher(this);
this._UID = objj_generateObjectUID();
this._retainCount = 1;
OBJJ_MEMORY_TABLE[this._UID] = 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)
@@ -115,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)
@@ -144,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)
@@ -154,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)
@@ -171,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") || [],
@@ -200,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();
@@ -232,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)
@@ -265,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)
{ {
@@ -288,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() + "\""));
@@ -298,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);
@@ -441,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);
} }
@@ -667,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();
-4
View File
@@ -31,10 +31,6 @@ GLOBAL(CFData) = function()
this._bytes = NULL; this._bytes = NULL;
this._base64 = NULL; this._base64 = NULL;
this._UID = objj_generateObjectUID();
this._retainCount = 1;
OBJJ_MEMORY_TABLE[this._UID] = this;
} }
CFData.prototype.propertyList = function() CFData.prototype.propertyList = function()
-2
View File
@@ -26,8 +26,6 @@ GLOBAL(CFDictionary) = function(/*CFDictionary*/ aDictionary)
this._count = 0; this._count = 0;
this._buckets = { }; this._buckets = { };
this._UID = objj_generateObjectUID(); this._UID = objj_generateObjectUID();
this._retainCount = 1;
OBJJ_MEMORY_TABLE[this._UID] = this;
} }
var indexOf = Array.prototype.indexOf, var indexOf = Array.prototype.indexOf,
+33 -22
View File
@@ -196,9 +196,9 @@ 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(/*...*/)
{ {
return this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); return this._nativeRequest.open(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
} }
CFHTTPRequest.prototype.send = function(/*Object*/ aBody) CFHTTPRequest.prototype.send = function(/*Object*/ aBody)
@@ -254,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 -27
View File
@@ -199,8 +199,6 @@ GLOBAL(CFURL) = function(/*CFURL|String*/ aURL, /*CFURL*/ aBaseURL)
} }
this._UID = objj_generateObjectUID(); this._UID = objj_generateObjectUID();
this._retainCount = 1;
OBJJ_MEMORY_TABLE[this._UID] = this;
this._string = aURL; this._string = aURL;
this._baseURL = aBaseURL; this._baseURL = aBaseURL;
@@ -316,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;
@@ -354,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++;
@@ -384,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;
@@ -517,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);
@@ -659,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);
+250 -186
View File
@@ -20,107 +20,175 @@
* 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",
"error": "error", "error": "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;
{
if (typeof alert != "undefined" && !CPLogDisable)
{
var message = _CPFormatLogMessage(aString, aLevel, aTitle);
CPLogDisable = !confirm(message + "\n\n(Click cancel to stop log alerts)");
}
}
// CPLogPopup uses a slick popup window in the browser: // CPLogAlert uses basic browser confirm()
var CPLogWindow = null; function CPLogAlertCreate(formatter)
GLOBAL(CPLogPopup) = function(aString, aLevel, aTitle)
{ {
try { return function(aParameters, aLevel, aTitle) {
if (CPLogDisable || window.open == undefined) if (typeof confirm != "undefined" && !CPLogDisable) {
return; var message = (formatter || CPLogDefaultFormatter)(aParameters, aLevel, aTitle);
CPLogDisable = !confirm(message + "\n\n(Click cancel to stop log alerts)");
if (!CPLogWindow || !CPLogWindow.document)
{
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;
}
_CPLogInitPopup(CPLogWindow);
} }
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(CPLogAlert) = CPLogAlertCreate();
CPLogAlert.create = CPLogAlertCreate;
// CPLogPopup uses a slick popup window in the browser
// TODO: move this into DebugKit
function CPLogPopupCreate(formatter)
{
var logWindow = null;
return function(aParameters, aLevel, aTitle) {
var message = (formatter || CPLogDefaultFormatter)(aString, null, aTitle);
try {
if (CPLogDisable || window.open == undefined)
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);
}
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
}
}
}
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,30 +318,24 @@ 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);
// Enablers // Enablers
var ul = doc.createElement("ul"); var ul = doc.createElement("ul");
ul.setAttribute("id", "enablers"); ul.setAttribute("id", "enablers");
div.appendChild(ul); div.appendChild(ul);
for (var i = 0; i < CPLogLevels.length; i++) { for (var i = 0; i < CPLogLevels.length; i++) {
var li = doc.createElement("li"); var li = doc.createElement("li");
li.setAttribute("id", "en"+CPLogLevels[i]); li.setAttribute("id", "en"+CPLogLevels[i]);
@@ -281,35 +345,35 @@ function _CPLogInitPopup(logWindow)
li.appendChild(doc.createTextNode(CPLogLevels[i])); li.appendChild(doc.createTextNode(CPLogLevels[i]));
ul.appendChild(li); ul.appendChild(li);
} }
// Options // Options
var ul = doc.createElement("ul"); var ul = doc.createElement("ul");
ul.setAttribute("id", "options"); ul.setAttribute("id", "options");
div.appendChild(ul); div.appendChild(ul);
var options = {"focus":["Focus",false], "block":["Block",false], "wrap":["Wrap",false], "scroll":["Scroll",true], "close":["Close",true]}; var options = {"focus":["Focus",false], "block":["Block",false], "wrap":["Wrap",false], "scroll":["Scroll",true], "close":["Close",true]};
for (o in options) { for (o in options) {
var li = doc.createElement("li"); var li = doc.createElement("li");
ul.appendChild(li); ul.appendChild(li);
logWindow[o+"Enabled"] = doc.createElement("input"); logWindow[o+"Enabled"] = doc.createElement("input");
logWindow[o+"Enabled"].setAttribute("id", o); logWindow[o+"Enabled"].setAttribute("id", o);
logWindow[o+"Enabled"].setAttribute("type", "checkbox"); logWindow[o+"Enabled"].setAttribute("type", "checkbox");
if (options[o][1]) if (options[o][1])
logWindow[o+"Enabled"].setAttribute("checked", "checked"); logWindow[o+"Enabled"].setAttribute("checked", "checked");
li.appendChild(logWindow[o+"Enabled"]); li.appendChild(logWindow[o+"Enabled"]);
var label = doc.createElement("label"); var label = doc.createElement("label");
label.setAttribute("for", o); label.setAttribute("for", o);
label.appendChild(doc.createTextNode(options[o][0])); label.appendChild(doc.createTextNode(options[o][0]));
li.appendChild(label); li.appendChild(label);
} }
// Log // Log
logWindow.log = doc.createElement("div"); logWindow.log = doc.createElement("div");
logWindow.log.setAttribute("class", "enerror endebug enwarn eninfo enfatal entrace"); logWindow.log.setAttribute("class", "enerror endebug enwarn eninfo enfatal entrace");
body.appendChild(logWindow.log); body.appendChild(logWindow.log);
logWindow.toggle = function(elem) { logWindow.toggle = function(elem) {
var enabled = (elem.getAttribute("enabled") == "yes") ? "no" : "yes"; var enabled = (elem.getAttribute("enabled") == "yes") ? "no" : "yes";
elem.setAttribute("enabled", enabled); elem.setAttribute("enabled", enabled);
@@ -319,17 +383,17 @@ function _CPLogInitPopup(logWindow)
else else
logWindow.log.className = logWindow.log.className.replace(new RegExp("[\\s]*"+elem.id, "g"), ""); logWindow.log.className = logWindow.log.className.replace(new RegExp("[\\s]*"+elem.id, "g"), "");
} }
// Scroll // Scroll
logWindow.scrollToBottom = function() { logWindow.scrollToBottom = function() {
logWindow.scrollTo(0, body.offsetHeight); logWindow.scrollTo(0, body.offsetHeight);
} }
// Wrap // Wrap
logWindow.wrapEnabled.addEventListener("click", function() { logWindow.wrapEnabled.addEventListener("click", function() {
logWindow.log.setAttribute("wrap", logWindow.wrapEnabled.checked ? "yes" : "no"); logWindow.log.setAttribute("wrap", logWindow.wrapEnabled.checked ? "yes" : "no");
}, false); }, false);
// Clear // Clear
logWindow.addEventListener("keydown", function(e) { logWindow.addEventListener("keydown", function(e) {
var e = e || logWindow.event; var e = e || logWindow.event;
@@ -340,7 +404,7 @@ function _CPLogInitPopup(logWindow)
e.preventDefault(); e.preventDefault();
} }
}, "false"); }, "false");
// Parent closing // Parent closing
window.addEventListener("unload", function() { window.addEventListener("unload", function() {
if (logWindow && logWindow.closeEnabled && logWindow.closeEnabled.checked) { if (logWindow && logWindow.closeEnabled && logWindow.closeEnabled.checked) {
@@ -348,7 +412,7 @@ function _CPLogInitPopup(logWindow)
logWindow.close(); logWindow.close();
} }
}, false); }, false);
// Log popup closing // Log popup closing
logWindow.addEventListener("unload", function() { logWindow.addEventListener("unload", function() {
if (!CPLogDisable) { if (!CPLogDisable) {
@@ -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
+27 -31
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")
@@ -9,7 +7,7 @@ if (system.engine === "rhino")
window.__parent__ = null; window.__parent__ = null;
window.__proto__ = global; window.__proto__ = global;
} }
// setup OBJJ_HOME, OBJJ_INCLUDE_PATHS, etc // setup OBJJ_HOME, OBJJ_INCLUDE_PATHS, etc
window.OBJJ_HOME = exports.OBJJ_HOME = FILE.resolve(module.path, ".."); window.OBJJ_HOME = exports.OBJJ_HOME = FILE.resolve(module.path, "..");
@@ -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);
@@ -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();
@@ -583,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");
@@ -596,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);
@@ -639,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;
@@ -673,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 -6
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
@@ -73,8 +73,3 @@ GLOBAL(PI_2) = Math.PI / 2.0;
GLOBAL(SQRT1_2) = Math.SQRT1_2; GLOBAL(SQRT1_2) = Math.SQRT1_2;
GLOBAL(SQRT2) = Math.SQRT2; GLOBAL(SQRT2) = Math.SQRT2;
GLOBAL(OBJJ_MEMORY_TABLE) = [];
GLOBAL($) = function(pointer) { return OBJJ_MEMORY_TABLE[pointer]; }
GLOBAL($$) = function(object) { return object._UID; }
-5
View File
@@ -20,8 +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
*/ */
CPLogRegister(CPLogDefault);
// formatting helpers // formatting helpers
function objj_debug_object_format(aReceiver) function objj_debug_object_format(aReceiver)
@@ -217,6 +215,3 @@ GLOBAL(objj_debug_typecheck) = function(expectedType, object)
throw ("expected=" + expectedType + ", actual=" + actualType); throw ("expected=" + expectedType + ", actual=" + actualType);
} }
if (typeof window.OBJJ_ZOMBIE_DETECTION === "undefined")
OBJJ_ZOMBIE_DETECTION = false;
-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;

Some files were not shown because too many files have changed in this diff Show More