Compare commits
@@ -26,7 +26,6 @@
|
||||
@import "CPApplication.j"
|
||||
@import "CPBezierPath.j"
|
||||
@import "CPBox.j"
|
||||
@import "CPBrowser.j"
|
||||
@import "CPButton.j"
|
||||
@import "CPButtonBar.j"
|
||||
@import "CPCheckBox.j"
|
||||
|
||||
@@ -146,14 +146,14 @@ CPRunContinuesResponse = -1002;
|
||||
[_mainMenu setAutoenablesItems:NO];
|
||||
|
||||
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 setAlternateImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPApplication/NewHighlighted.png"] size:CGSizeMake(16.0, 16.0)]];
|
||||
|
||||
[_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 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 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]];
|
||||
|
||||
[saveMenuItem setSubmenu:saveMenu];
|
||||
@@ -185,9 +185,9 @@ CPRunContinuesResponse = -1002;
|
||||
[editMenu addItem:undoMenuItem];
|
||||
[editMenu addItem:redoMenuItem];
|
||||
|
||||
[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:@"Paste" action:@selector(paste:) keyEquivalent:@"v"]];
|
||||
[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:@"Paste" action:@selector(paste:) keyEquivalent:@"V"]];
|
||||
|
||||
[editMenuItem setSubmenu:editMenu];
|
||||
[editMenuItem setHidden:YES];
|
||||
@@ -1224,11 +1224,6 @@ var _CPAppBootstrapperActions = nil;
|
||||
[self performActions];
|
||||
}
|
||||
|
||||
+ (void)cibDidFailToLoad:(CPCib)aCib
|
||||
{
|
||||
throw new Error("Could not load main cib file (Did you forget to nib2cib it?).");
|
||||
}
|
||||
|
||||
+ (void)reset
|
||||
{
|
||||
_CPAppBootstrapperActions = nil;
|
||||
|
||||
@@ -1,896 +0,0 @@
|
||||
/*
|
||||
* CPBrowser.j
|
||||
* AppKit
|
||||
*
|
||||
* Created by Ross Boucher.
|
||||
* Copyright 2010, 280 North, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
@import "CPControl.j"
|
||||
@import "CPImage.j"
|
||||
@import "CPTableView.j"
|
||||
@import "CPScrollView.j"
|
||||
|
||||
/*!
|
||||
@ingroup appkit
|
||||
@class CPBrowser
|
||||
*/
|
||||
|
||||
@implementation CPBrowser : CPControl
|
||||
{
|
||||
id _delegate;
|
||||
CPString _pathSeparator;
|
||||
|
||||
CPView _contentView;
|
||||
CPScrollView _horizontalScrollView;
|
||||
CPView _prototypeView;
|
||||
|
||||
CPArray _tableViews;
|
||||
CPArray _tableDelegates;
|
||||
|
||||
id _rootItem;
|
||||
|
||||
BOOL _delegateSupportsImages;
|
||||
|
||||
SEL _doubleAction @accessors(property=doubleAction);
|
||||
|
||||
BOOL _allowsMultipleSelection;
|
||||
BOOL _allowsEmptySelection;
|
||||
|
||||
Class _tableViewClass @accessors(property=tableViewClass);
|
||||
|
||||
float _rowHeight;
|
||||
float _imageWidth;
|
||||
float _leafWidth;
|
||||
float _minColumnWidth;
|
||||
float _defaultColumnWidth @accessors(property=defaultColumnWidth);
|
||||
|
||||
CPArray _columnWidths;
|
||||
}
|
||||
|
||||
+ (CPImage)branchImage
|
||||
{
|
||||
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[self class]]
|
||||
pathForResource:"browser-leaf.png"]
|
||||
size:CGSizeMake(9,9)];
|
||||
}
|
||||
|
||||
+ (CPImage)highlightedBranchImage
|
||||
{
|
||||
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[self class]]
|
||||
pathForResource:"browser-leaf-highlighted.png"]
|
||||
size:CGSizeMake(9,9)];
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)aFrame
|
||||
{
|
||||
if (self = [super initWithFrame:aFrame])
|
||||
{
|
||||
_rowHeight = 23.0;
|
||||
_defaultColumnWidth = 140.0;
|
||||
_minColumnWidth = 80.0;
|
||||
_imageWidth = 23.0;
|
||||
_leafWidth = 13.0;
|
||||
_columnWidths = [];
|
||||
|
||||
_pathSeparator = "/";
|
||||
_tableViews = [];
|
||||
_tableDelegates = [];
|
||||
_allowsMultipleSelection = YES;
|
||||
_allowsEmptySelection = YES;
|
||||
_tableViewClass = [_CPBrowserTableView class];
|
||||
|
||||
_prototypeView = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
|
||||
[_prototypeView setVerticalAlignment:CPCenterVerticalTextAlignment];
|
||||
[_prototypeView setValue:[CPColor whiteColor] forThemeAttribute:"text-color" inState:CPThemeStateSelected];
|
||||
[_prototypeView setLineBreakMode:CPLineBreakByTruncatingTail];
|
||||
|
||||
_horizontalScrollView = [[CPScrollView alloc] initWithFrame:[self bounds]];
|
||||
|
||||
[_horizontalScrollView setHasVerticalScroller:NO];
|
||||
[_horizontalScrollView setAutohidesScrollers:YES];
|
||||
[_horizontalScrollView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
|
||||
|
||||
_contentView = [[CPView alloc] initWithFrame:CGRectMake(0, 0, 0, CGRectGetHeight([self bounds]))];
|
||||
[_contentView setAutoresizingMask:CPViewHeightSizable];
|
||||
|
||||
[_horizontalScrollView setDocumentView:_contentView];
|
||||
|
||||
[self addSubview:_horizontalScrollView];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setPrototypeView:(CPView)aPrototypeView
|
||||
{
|
||||
_prototypeView = [CPKeyedUnarchiver unarchiveObjectWithData:
|
||||
[CPKeyedArchiver archivedDataWithRootObject:aPrototypeView]];
|
||||
}
|
||||
|
||||
- (CPView)prototypeView
|
||||
{
|
||||
return [CPKeyedUnarchiver unarchiveObjectWithData:
|
||||
[CPKeyedArchiver archivedDataWithRootObject:_prototypeView]];
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id)anObject
|
||||
{
|
||||
_delegate = anObject;
|
||||
_delegateSupportsImages = [_delegate respondsToSelector:@selector(browser:imageValueForItem:)];
|
||||
|
||||
[self loadColumnZero];
|
||||
}
|
||||
|
||||
- (id)delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (CPTableView)tableViewInColumn:(unsigned)index
|
||||
{
|
||||
return _tableViews[index];
|
||||
}
|
||||
|
||||
- (unsigned)columnOfTableView:(CPTableView)aTableView
|
||||
{
|
||||
return [_tableViews indexOfObject:aTableView];
|
||||
}
|
||||
|
||||
- (void)loadColumnZero
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(rootItemForBrowser:)])
|
||||
_rootItem = [_delegate rootItemForBrowser:self];
|
||||
else
|
||||
_rootItem = nil;
|
||||
|
||||
[self setLastColumn:-1];
|
||||
[self addColumn];
|
||||
}
|
||||
|
||||
- (void)setLastColumn:(int)columnIndex
|
||||
{
|
||||
if (columnIndex >= _tableViews.length)
|
||||
return;
|
||||
|
||||
var oldValue = _tableViews.length - 1;
|
||||
|
||||
// unloads all later columns.
|
||||
var indexPlusOne = columnIndex + 1;
|
||||
|
||||
[[_tableViews.slice(indexPlusOne) valueForKey:"enclosingScrollView"]
|
||||
makeObjectsPerformSelector:@selector(removeFromSuperview)];
|
||||
|
||||
_tableViews = _tableViews.slice(0, indexPlusOne);
|
||||
_tableDelegates = _tableDelegates.slice(0, indexPlusOne);
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(browser:didChangeLastColumn:toColumn:)])
|
||||
[_delegate browser:self didChangeLastColumn:oldValue toColumn:columnIndex];
|
||||
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (int)lastColumn
|
||||
{
|
||||
return _tableViews.length - 1;
|
||||
}
|
||||
|
||||
- (void)addColumn
|
||||
{
|
||||
var lastIndex = [self lastColumn],
|
||||
lastColumn = _tableViews[lastIndex],
|
||||
selectionIndexes = [lastColumn selectedRowIndexes];
|
||||
|
||||
if (lastIndex >= 0 && [selectionIndexes count] > 1)
|
||||
[CPException raise:CPInvalidArgumentException
|
||||
reason:"Can't add column, column "+lastIndex+" has invalid selection."];
|
||||
|
||||
var index = lastIndex+1,
|
||||
item = index === 0 ? _rootItem : [_tableDelegates[lastIndex] childAtIndex:[selectionIndexes firstIndex]];
|
||||
|
||||
if (index > 0 && item && [self isLeafItem:item])
|
||||
return;
|
||||
|
||||
var table = [[_tableViewClass alloc] initWithFrame:CGRectMakeZero() browser:self];
|
||||
|
||||
[table setHeaderView:nil];
|
||||
[table setCornerView:nil];
|
||||
[table setAllowsMultipleSelection:_allowsMultipleSelection];
|
||||
[table setAllowsEmptySelection:_allowsEmptySelection];
|
||||
[table registerForDraggedTypes:[self registeredDraggedTypes]];
|
||||
|
||||
[self setNextResponder:table];
|
||||
|
||||
[self _addTableColumnsToTableView:table forColumnIndex:index];
|
||||
|
||||
var delegate = [[_CPBrowserTableDelegate alloc] init];
|
||||
|
||||
[delegate _setDelegate:_delegate];
|
||||
[delegate _setBrowser:self];
|
||||
[delegate _setIndex:index];
|
||||
[delegate _setItem:item];
|
||||
|
||||
_tableViews[index] = table;
|
||||
_tableDelegates[index] = delegate;
|
||||
|
||||
[table setDelegate:delegate];
|
||||
[table setDataSource:delegate];
|
||||
[table setTarget:delegate];
|
||||
[table setAction:@selector(_tableViewClicked:)];
|
||||
[table setDoubleAction:@selector(_tableViewDoubleClicked:)];
|
||||
[table setDraggingDestinationFeedbackStyle:CPTableViewDraggingDestinationFeedbackStyleRegular];
|
||||
|
||||
var scrollView = [[_CPBrowserScrollView alloc] initWithFrame:CGRectMakeZero()];
|
||||
[scrollView _setBrowser:self];
|
||||
[scrollView setDocumentView:table];
|
||||
[scrollView setHasHorizontalScroller:NO];
|
||||
[scrollView setAutoresizingMask:CPViewHeightSizable];
|
||||
|
||||
[_contentView addSubview:scrollView];
|
||||
|
||||
[self tile];
|
||||
|
||||
[self scrollColumnToVisible:index];
|
||||
}
|
||||
|
||||
- (void)_addTableColumnsToTableView:(CPTableView)aTableView forColumnIndex:(unsigned)index
|
||||
{
|
||||
if (_delegateSupportsImages)
|
||||
{
|
||||
var column = [[CPTableColumn alloc] initWithIdentifier:@"Image"],
|
||||
view = [[CPImageView alloc] initWithFrame:CGRectMakeZero()];
|
||||
|
||||
[view setImageScaling:CPScaleProportionally];
|
||||
|
||||
[column setDataView:view];
|
||||
[column setResizingMask:CPTableColumnNoResizing];
|
||||
|
||||
[aTableView addTableColumn:column];
|
||||
}
|
||||
|
||||
var column = [[CPTableColumn alloc] initWithIdentifier:@"Content"];
|
||||
|
||||
[column setDataView:_prototypeView];
|
||||
[column setResizingMask:CPTableColumnNoResizing];
|
||||
|
||||
[aTableView addTableColumn:column];
|
||||
|
||||
var column = [[CPTableColumn alloc] initWithIdentifier:@"Leaf"],
|
||||
view = [[_CPBrowserLeafView alloc] initWithFrame:CGRectMakeZero()];
|
||||
|
||||
[view setBranchImage:[[self class] branchImage]];
|
||||
[view setHighlightedBranchImage:[[self class] highlightedBranchImage]];
|
||||
|
||||
[column setDataView:view];
|
||||
[column setResizingMask:CPTableColumnNoResizing];
|
||||
|
||||
[aTableView addTableColumn:column];
|
||||
}
|
||||
|
||||
- (void)reloadColumn:(int)column
|
||||
{
|
||||
[[self tableViewInColumn:column] reloadData];
|
||||
}
|
||||
|
||||
- (void)tile
|
||||
{
|
||||
var xOrigin = 0,
|
||||
scrollerWidth = [CPScroller scrollerWidth],
|
||||
height = CGRectGetHeight([_contentView bounds]);
|
||||
|
||||
for (var i = 0, count = _tableViews.length; i < count; i++)
|
||||
{
|
||||
var tableView = _tableViews[i],
|
||||
scrollView = [tableView enclosingScrollView],
|
||||
width = [self widthOfColumn:i],
|
||||
tableHeight = CGRectGetHeight([tableView bounds]);
|
||||
|
||||
[[tableView tableColumnWithIdentifier:"Image"] setWidth:_imageWidth];
|
||||
[[tableView tableColumnWithIdentifier:"Content"] setWidth:width - (_leafWidth + _delegateSupportsImages ? _imageWidth : 0) - scrollerWidth - scrollerWidth];
|
||||
[[tableView tableColumnWithIdentifier:"Leaf"] setWidth:_leafWidth];
|
||||
|
||||
[tableView setRowHeight:_rowHeight];
|
||||
[tableView setFrameSize:CGSizeMake(width - scrollerWidth, tableHeight)];
|
||||
[scrollView setFrameOrigin:CGPointMake(xOrigin, 0)];
|
||||
[scrollView setFrameSize:CGSizeMake(width, height)];
|
||||
|
||||
xOrigin += width;
|
||||
}
|
||||
|
||||
[_contentView setFrameSize:CGSizeMake(xOrigin, height)];
|
||||
}
|
||||
|
||||
// ITEMS
|
||||
|
||||
- (id)itemAtRow:(int)row inColumn:(int)column
|
||||
{
|
||||
return [_tableDelegates[column] childAtIndex:row];
|
||||
}
|
||||
|
||||
- (BOOL)isLeafItem:(id)item
|
||||
{
|
||||
return [_delegate respondsToSelector:@selector(browser:isLeafItem:)] && [_delegate browser:self isLeafItem:item];
|
||||
}
|
||||
|
||||
- (id)parentForItemsInColumn:(int)column
|
||||
{
|
||||
return [_tableDelegates[column] _item];
|
||||
}
|
||||
|
||||
- (CPSet)selectedItems
|
||||
{
|
||||
var selectedColumn = [self selectedColumn],
|
||||
selectedIndexes = [self selectedRowIndexesInColumn:selectedColumn],
|
||||
set = [CPSet set],
|
||||
index = [selectedIndexes firstIndex];
|
||||
|
||||
while (index !== CPNotFound)
|
||||
{
|
||||
[set addObject:[self itemAtRow:index inColumn:selectedColumn]];
|
||||
index = [selectedIndexes indexGreaterThanIndex:index];
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
- (id)selectedItem
|
||||
{
|
||||
var selectedColumn = [self selectedColumn],
|
||||
selectedRow = [self selectedRowInColumn:selectedColumn];
|
||||
|
||||
return [self itemAtRow:selectedRow inColumn:selectedColumn];
|
||||
}
|
||||
|
||||
// CLICK EVENTS
|
||||
|
||||
- (void)_column:(unsigned)columnIndex clickedRow:(unsigned)rowIndex
|
||||
{
|
||||
[self setLastColumn:columnIndex];
|
||||
|
||||
if (rowIndex >= 0)
|
||||
[self addColumn];
|
||||
|
||||
[self doClick:self];
|
||||
}
|
||||
|
||||
- (void)sendAction
|
||||
{
|
||||
[self sendAction:_action to:_target];
|
||||
}
|
||||
|
||||
- (void)doClick:(id)sender
|
||||
{
|
||||
[self sendAction:_action to:_target];
|
||||
}
|
||||
|
||||
- (void)doDoubleClick:(id)sender
|
||||
{
|
||||
[self sendAction:_doubleAction to:_target];
|
||||
}
|
||||
|
||||
// SIZING
|
||||
|
||||
- (float)columnContentWidthForColumnWidth:(float)aWidth
|
||||
{
|
||||
return aWidth - (_leafWidth + _delegateSupportsImages ? _imageWidth : 0) - [CPScroller scrollerWidth];
|
||||
}
|
||||
|
||||
- (float)columnWidthForColumnContentWidth:(float)aWidth
|
||||
{
|
||||
return aWidth + (_leafWidth + _delegateSupportsImages ? _imageWidth : 0) + [CPScroller scrollerWidth];
|
||||
}
|
||||
|
||||
- (void)setImageWidth:(float)aWidth
|
||||
{
|
||||
_imageWidth = aWidth;
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (float)imageWidth
|
||||
{
|
||||
return _imageWidth;
|
||||
}
|
||||
|
||||
- (void)setMinColumnWidth:(float)minWidth
|
||||
{
|
||||
_minColumnWidth = minWidth;
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (float)minColumnWidth
|
||||
{
|
||||
return _minColumnWidth;
|
||||
}
|
||||
|
||||
- (void)setWidth:(float)aWidth ofColumn:(unsigned)column
|
||||
{
|
||||
_columnWidths[column] = aWidth;
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(browser:didResizeColumn:)])
|
||||
[_delegate browser:self didResizeColumn:column];
|
||||
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (float)widthOfColumn:(unsigned)column
|
||||
{
|
||||
var width = _columnWidths[column];
|
||||
|
||||
if (width == null)
|
||||
width = _defaultColumnWidth;
|
||||
|
||||
return MAX([CPScroller scrollerWidth], MAX(_minColumnWidth, width));
|
||||
}
|
||||
|
||||
- (void)setRowHeight:(float)aHeight
|
||||
{
|
||||
_rowHeight = aHeight;
|
||||
}
|
||||
|
||||
- (float)rowHeight
|
||||
{
|
||||
return _rowHeight;
|
||||
}
|
||||
|
||||
// SCROLLERS
|
||||
|
||||
- (void)scrollColumnToVisible:(unsigned)columnIndex
|
||||
{
|
||||
[_contentView scrollRectToVisible:[[[self tableViewInColumn:columnIndex] enclosingScrollView] frame]];
|
||||
}
|
||||
|
||||
– (void)scrollRowToVisible:(unsigned)rowIndex inColumn:(unsigned)columnIndex
|
||||
{
|
||||
[self scrollColumnToVisible:columnIndex];
|
||||
[[self tableViewInColumn:columnIndex] scrollRowToVisible:rowIndex];
|
||||
}
|
||||
|
||||
- (BOOL)autohidesScroller
|
||||
{
|
||||
return [_horizontalScrollView autohidesScrollers];
|
||||
}
|
||||
|
||||
- (void)setAutohidesScroller:(BOOL)shouldHide
|
||||
{
|
||||
[_horizontalScrollView setAutohidesScrollers:shouldHide];
|
||||
}
|
||||
|
||||
// SELECTION
|
||||
|
||||
- (unsigned)selectedRowInColumn:(unsigned)columnIndex
|
||||
{
|
||||
if (columnIndex > [self lastColumn] || columnIndex < 0)
|
||||
return -1;
|
||||
|
||||
return [_tableViews[columnIndex] selectedRow];
|
||||
}
|
||||
|
||||
- (unsigned)selectedColumn
|
||||
{
|
||||
var column = [self lastColumn],
|
||||
row = [self selectedRowInColumn:column];
|
||||
|
||||
if (row >= 0)
|
||||
return column;
|
||||
else
|
||||
return column - 1;
|
||||
}
|
||||
|
||||
- (void)selectRow:(unsigned)row inColumn:(unsigned)column
|
||||
{
|
||||
var selectedIndexes = row === -1 ? [CPIndexSet indexSet] : [CPIndexSet indexSetWithIndex:row];
|
||||
[self selectRowIndexes:selectedIndexes inColumn:column];
|
||||
}
|
||||
|
||||
- (BOOL)allowsMultipleSelection
|
||||
{
|
||||
return _allowsMultipleSelection;
|
||||
}
|
||||
|
||||
- (void)setAllowsMultipleSelection:(BOOL)shouldAllow
|
||||
{
|
||||
if (_allowsMultipleSelection === shouldAllow)
|
||||
return;
|
||||
|
||||
_allowsMultipleSelection = shouldAllow;
|
||||
[_tableViews makeObjectsPerformSelector:@selector(setAllowsMultipleSelection:) withObject:shouldAllow];
|
||||
}
|
||||
|
||||
- (BOOL)allowsEmptySelection
|
||||
{
|
||||
return _allowsEmptySelection;
|
||||
}
|
||||
|
||||
- (void)setAllowsEmptySelection:(BOOL)shouldAllow
|
||||
{
|
||||
if (_allowsEmptySelection === shouldAllow)
|
||||
return;
|
||||
|
||||
_allowsEmptySelection = shouldAllow;
|
||||
[_tableViews makeObjectsPerformSelector:@selector(setAllowsEmptySelection:) withObject:shouldAllow];
|
||||
}
|
||||
|
||||
- (CPIndexSet)selectedRowIndexesInColumn:(unsigned)column
|
||||
{
|
||||
return [[self tableViewInColumn:column] selectedRowIndexes];
|
||||
}
|
||||
|
||||
- (void)selectRowIndexes:(CPIndexSet)indexSet inColumn:(unsigned)column
|
||||
{
|
||||
if (column < 0 || column > [self lastColumn] + 1)
|
||||
return;
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(browser:selectionIndexesForProposedSelection:inColumn:)])
|
||||
indexSet = [_delegate browser:self selectionIndexesForProposedSelection:indexSet inColumn:column];
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(browser:shouldSelectRowIndexes:inColumn:)] &&
|
||||
![_delegate browser:self shouldSelectRowIndexes:indexSet inColumn:column])
|
||||
return;
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(browserSelectionIsChanging:)])
|
||||
[_delegate browserSelectionIsChanging:self];
|
||||
|
||||
if (column > [self lastColumn])
|
||||
[self addColumn];
|
||||
|
||||
[self setLastColumn:column];
|
||||
|
||||
[[self tableViewInColumn:column] selectRowIndexes:indexSet byExtendingSelection:NO];
|
||||
|
||||
[self setNextResponder:[self tableViewInColumn:[self lastColumn]]];
|
||||
|
||||
[self scrollColumnToVisible:column];
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(browserSelectionDidChange:)])
|
||||
[_delegate browserSelectionDidChange:self];
|
||||
}
|
||||
|
||||
- (void)setBackgroundColor:(CPColor)aColor
|
||||
{
|
||||
[super setBackgroundColor:aColor];
|
||||
[_contentView setBackgroundColor:aColor];
|
||||
}
|
||||
|
||||
- (BOOL)acceptsFirstResponder
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
// DRAG AND DROP
|
||||
|
||||
- (void)registerForDraggedTypes:(CPArray)types
|
||||
{
|
||||
[super registerForDraggedTypes:types];
|
||||
[_tableViews makeObjectsPerformSelector:@selector(registerForDraggedTypes:) withObject:types];
|
||||
}
|
||||
|
||||
- (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(browser:canDragRowsWithIndexes:inColumn:withEvent:)])
|
||||
return [_delegate browser:self canDragRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (CPImage)draggingImageForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(browser:draggingImageForRowsWithIndexes:inColumn:withEvent:offset:)])
|
||||
return [_delegate browser:self draggingImageForRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent offset:dragImageOffset];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (CPView)draggingViewForRowsWithIndexes:(CPIndexSet)rowIndexes inColumn:(int)columnIndex withEvent:(CPEvent)dragEvent offset:(CGPoint)dragImageOffset
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(browser:draggingViewForRowsWithIndexes:inColumn:withEvent:offset:)])
|
||||
return [_delegate browser:self draggingViewForRowsWithIndexes:rowIndexes inColumn:columnIndex withEvent:dragEvent offset:dragImageOffset];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation _CPBrowserResizeControl : CPView
|
||||
{
|
||||
CGPoint _mouseDownX;
|
||||
CPBrowser _browser;
|
||||
unsigned _index;
|
||||
unsigned _width;
|
||||
}
|
||||
|
||||
- (void)mouseDown:(CPEvent)anEvent
|
||||
{
|
||||
_mouseDownX = [anEvent locationInWindow].x;
|
||||
_browser = [[self superview] _browser];
|
||||
_index = [_browser columnOfTableView:[[self superview] documentView]];
|
||||
_width = [_browser widthOfColumn:_index];
|
||||
}
|
||||
|
||||
- (void)mouseDragged:(CPEvent)anEvent
|
||||
{
|
||||
var deltaX = [anEvent locationInWindow].x - _mouseDownX;
|
||||
[_browser setWidth:_width + deltaX ofColumn:_index];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
var _CPBrowserResizeControlBackgroundImage = nil;
|
||||
|
||||
@implementation _CPBrowserScrollView : CPScrollView
|
||||
{
|
||||
_CPBrowserResizeControl _resizeControl;
|
||||
CPBrowser _browser @accessors;
|
||||
}
|
||||
|
||||
+ (CPImage)backgroundImage
|
||||
{
|
||||
if (!_CPBrowserResizeControlBackgroundImage)
|
||||
{
|
||||
var path = [[CPBundle bundleForClass:[self class]] pathForResource:"browser-resize-control.png"];
|
||||
_CPBrowserResizeControlBackgroundImage = [[CPImage alloc] initWithContentsOfFile:path
|
||||
size:CGSizeMake(15, 14)];
|
||||
}
|
||||
|
||||
return _CPBrowserResizeControlBackgroundImage;
|
||||
}
|
||||
|
||||
- (void)initWithFrame:(CGRect)aFrame
|
||||
{
|
||||
if (self = [super initWithFrame:aFrame])
|
||||
{
|
||||
_resizeControl = [[_CPBrowserResizeControl alloc] initWithFrame:CGRectMakeZero()];
|
||||
[_resizeControl setBackgroundColor:[CPColor colorWithPatternImage:[[self class] backgroundImage]]];
|
||||
[self addSubview:_resizeControl];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)reflectScrolledClipView:(CPClipView)aClipView
|
||||
{
|
||||
[super reflectScrolledClipView:aClipView];
|
||||
|
||||
var frame = [_verticalScroller frame];
|
||||
frame.size.height = CGRectGetHeight([self bounds]) - 14.0 - frame.origin.y;
|
||||
[_verticalScroller setFrameSize:frame.size];
|
||||
|
||||
var resizeFrame = CGRectMake(CGRectGetMinX(frame), CGRectGetMaxY(frame), [CPScroller scrollerWidth], 14.0);
|
||||
[_resizeControl setFrame:resizeFrame];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation _CPBrowserTableView : CPTableView
|
||||
{
|
||||
CPBrowser _browser;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)aFrame browser:(CPBrowser)aBrowser
|
||||
{
|
||||
if (self = [super initWithFrame:aFrame])
|
||||
_browser = aBrowser;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)acceptsFirstResponder
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)mouseDown:(CPEvent)anEvent
|
||||
{
|
||||
[super mouseDown:anEvent];
|
||||
[[self window] makeFirstResponder:_browser];
|
||||
}
|
||||
|
||||
- (CPView)browserView
|
||||
{
|
||||
return _browser;
|
||||
}
|
||||
|
||||
- (BOOL)canDragRowsWithIndexes:(CPIndexSet)rowIndexes atPoint:(CGPoint)mouseDownPoint
|
||||
{
|
||||
return [_browser canDragRowsWithIndexes:rowIndexes inColumn:[_browser columnOfTableView:self] withEvent:[CPApp currentEvent]];
|
||||
}
|
||||
|
||||
- (CPImage)dragImageForRowsWithIndexes:(CPIndexSet)dragRows tableColumns:(CPArray)theTableColumns event:(CPEvent)dragEvent offset:(CPPointPointer)dragImageOffset
|
||||
{
|
||||
return [_browser draggingImageForRowsWithIndexes:dragRows inColumn:[_browser columnOfTableView:self] withEvent:dragEvent offset:dragImageOffset] ||
|
||||
[super dragImageForRowsWithIndexes:dragRows tableColumns:theTableColumns event:dragEvent offset:dragImageOffset];
|
||||
}
|
||||
|
||||
- (CPView)dragViewForRowsWithIndexes:(CPIndexSet)dragRows tableColumns:(CPArray)theTableColumns event:(CPEvent)dragEvent offset:(CPPoint)dragViewOffset
|
||||
{
|
||||
var count = theTableColumns.length;
|
||||
while (count--)
|
||||
{
|
||||
if ([theTableColumns[count] identifier] === "Leaf")
|
||||
[theTableColumns removeObject:theTableColumns[count]];
|
||||
}
|
||||
|
||||
return [_browser draggingViewForRowsWithIndexes:dragRows inColumn:[_browser columnOfTableView:self] withEvent:dragEvent offset:dragViewOffset] ||
|
||||
[super dragViewForRowsWithIndexes:dragRows tableColumns:theTableColumns event:dragEvent offset:dragViewOffset];
|
||||
}
|
||||
|
||||
- (void)moveUp:(id)sender
|
||||
{
|
||||
[super moveUp:sender];
|
||||
[_browser selectRow:[self selectedRow] inColumn:[_browser selectedColumn]];
|
||||
}
|
||||
|
||||
- (void)moveDown:(id)sender
|
||||
{
|
||||
[super moveDown:sender];
|
||||
[_browser selectRow:[self selectedRow] inColumn:[_browser selectedColumn]];
|
||||
}
|
||||
|
||||
- (void)moveLeft:(id)sender
|
||||
{
|
||||
var previousColumn = [_browser selectedColumn] - 1,
|
||||
selectedRow = [_browser selectedRowInColumn:previousColumn];
|
||||
|
||||
[_browser selectRow:selectedRow inColumn:previousColumn];
|
||||
}
|
||||
|
||||
- (void)moveRight:(id)sender
|
||||
{
|
||||
[_browser selectRow:0 inColumn:[_browser selectedColumn] + 1];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation _CPBrowserTableDelegate : CPObject
|
||||
{
|
||||
CPBrowser _browser @accessors;
|
||||
unsigned _index @accessors;
|
||||
id _delegate @accessors;
|
||||
id _item @accessors;
|
||||
}
|
||||
|
||||
- (unsigned)numberOfRowsInTableView:(CPTableView)aTableView
|
||||
{
|
||||
return [_delegate browser:_browser numberOfChildrenOfItem:_item];
|
||||
}
|
||||
|
||||
- (void)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)column row:(unsigned)row
|
||||
{
|
||||
if ([column identifier] === "Image")
|
||||
return [_delegate browser:_browser imageValueForItem:[self childAtIndex:row]];
|
||||
else if ([column identifier] === "Leaf")
|
||||
return ![_browser isLeafItem:[self childAtIndex:row]];
|
||||
else
|
||||
return [_delegate browser:_browser objectValueForItem:[self childAtIndex:row]];
|
||||
}
|
||||
|
||||
- (void)_tableViewDoubleClicked:(CPTableView)aTableView
|
||||
{
|
||||
[_browser doDoubleClick:self];
|
||||
}
|
||||
|
||||
- (void)_tableViewClicked:(CPTableView)aTableView
|
||||
{
|
||||
var selectedIndexes = [aTableView selectedRowIndexes];
|
||||
[_browser _column:_index clickedRow:[selectedIndexes count] === 1 ? [selectedIndexes firstIndex] : -1];
|
||||
}
|
||||
|
||||
- (id)childAtIndex:(unsigned)index
|
||||
{
|
||||
return [_delegate browser:_browser child:index ofItem:_item];
|
||||
}
|
||||
|
||||
- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(int)row dropOperation:(CPTableViewDropOperation)operation
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(browser:acceptDrop:atRow:column:dropOperation:)])
|
||||
return [_delegate browser:_browser acceptDrop:info atRow:row column:_index dropOperation:operation];
|
||||
else
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (CPDragOperation)tableView:(CPTableView)aTableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(CPTableViewDropOperation)operation
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(browser:validateDrop:proposedRow:column:dropOperation:)])
|
||||
[_delegate browser:_browser validateDrop:info proposedRow:row column:_index dropOperation:operation];
|
||||
else
|
||||
return CPDragOperationNone;
|
||||
}
|
||||
|
||||
- (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(browser:writeRowsWithIndexes:inColumn:toPasteboard:)])
|
||||
return [_delegate browser:_browser writeRowsWithIndexes:rowIndexes inColumn:_index toPasteboard:pboard];
|
||||
else
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)respondsToSelector:(SEL)aSelector
|
||||
{
|
||||
if (aSelector === @selector(browser:writeRowsWithIndexes:inColumn:toPasteboard:))
|
||||
return [_delegate respondsToSelector:@selector(browser:writeRowsWithIndexes:inColumn:toPasteboard:)];
|
||||
else
|
||||
return [super respondsToSelector:aSelector];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation _CPBrowserLeafView : CPView
|
||||
{
|
||||
BOOL _isLeaf @accessors(readonly, property=isLeaf);
|
||||
CPImage _branchImage @accessors(property=branchImage);
|
||||
CPImage _highlightedBranchImage @accessors(property=highlightedBranchImage);
|
||||
}
|
||||
|
||||
- (BOOL)objectValue
|
||||
{
|
||||
return _isLeaf;
|
||||
}
|
||||
|
||||
- (void)setObjectValue:(id)aValue
|
||||
{
|
||||
_isLeaf = !!aValue;
|
||||
[self setNeedsLayout];
|
||||
}
|
||||
|
||||
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
|
||||
{
|
||||
if (aName === "image-view")
|
||||
return CGRectInset([self bounds], 1, 1);
|
||||
|
||||
return [super rectForEphemeralSubviewNamed:aName];
|
||||
}
|
||||
|
||||
- (CPView)createEphemeralSubviewNamed:(CPString)aName
|
||||
{
|
||||
if (aName === "image-view")
|
||||
return [[CPImageView alloc] initWithFrame:CGRectMakeZero()];
|
||||
|
||||
return [super createEphemeralSubviewNamed:aName];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
var imageView = [self layoutEphemeralSubviewNamed:@"image-view"
|
||||
positioned:CPWindowAbove
|
||||
relativeToEphemeralSubviewNamed:nil];
|
||||
|
||||
var isHighlighted = [self themeState] & CPThemeStateSelected;
|
||||
[imageView setImage: _isLeaf ? (isHighlighted ? _highlightedBranchImage : _branchImage) : nil];
|
||||
[imageView setImageScaling:CPScaleNone];
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
[super encodeWithCoder:aCoder];
|
||||
|
||||
[aCoder encodeBool:_isLeaf forKey:"_CPBrowserLeafViewIsLeafKey"];
|
||||
[aCoder encodeObject:_branchImage forKey:"_CPBrowserLeafViewBranchImageKey"];
|
||||
[aCoder encodeObject:_highlightedBranchImage forKey:"_CPBrowserLeafViewHighlightedBranchImageKey"];
|
||||
}
|
||||
|
||||
- (void)initWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
if (self = [super initWithCoder:aCoder])
|
||||
{
|
||||
_isLeaf = [aCoder decodeBoolForKey:"_CPBrowserLeafViewIsLeafKey"];
|
||||
_branchImage = [aCoder decodeObjectForKey:"_CPBrowserLeafViewBranchImageKey"];
|
||||
_highlightedBranchImage = [aCoder decodeObjectForKey:"_CPBrowserLeafViewHighlightedBranchImageKey"];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -4,33 +4,18 @@
|
||||
#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)],
|
||||
image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:self] pathForResource:@"plus_button.png"] size:CGSizeMake(11, 12)];
|
||||
self = [super initWithFrame:aFrame];
|
||||
|
||||
[button setImage:image];
|
||||
[button setImagePosition:CPImageOnly];
|
||||
if (self)
|
||||
[self setNeedsLayout];
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
+ (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;
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (CPString)themeClass
|
||||
@@ -40,210 +25,47 @@
|
||||
|
||||
+ (id)themeAttributes
|
||||
{
|
||||
return [CPDictionary dictionaryWithObjects:[CGInsetMake(0.0, 0.0, 0.0, 0.0), CGSizeMakeZero(), [CPNull null], [CPNull null], [CPNull null]]
|
||||
forKeys:[@"resize-control-inset", @"resize-control-size", @"resize-control-color", @"bezel-color", @"button-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);
|
||||
return [CPDictionary dictionaryWithObjects:[[CPNull null]]
|
||||
forKeys:[@"bezel-color"]];
|
||||
}
|
||||
|
||||
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
|
||||
{
|
||||
if (aName === "resize-control-view")
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
if (aName === "bezel-view")
|
||||
return [self bounds];
|
||||
|
||||
return [super rectForEphemeralSubviewNamed:aName];
|
||||
}
|
||||
|
||||
- (CPView)createEphemeralSubviewNamed:(CPString)aName
|
||||
{
|
||||
if (aName === "resize-control-view")
|
||||
return [[CPView alloc] initWithFrame:CGRectMakeZero()];
|
||||
if (aName === "bezel-view")
|
||||
{
|
||||
var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
|
||||
|
||||
[view setHitTests:NO];
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
return [super createEphemeralSubviewNamed:aName];
|
||||
}
|
||||
|
||||
- (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],
|
||||
count = [buttonsNotHidden count];
|
||||
- (void)addSubview:(CPView)aSubview
|
||||
{
|
||||
[super addSubview:aSubview];
|
||||
|
||||
while (count--)
|
||||
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"]];
|
||||
}
|
||||
[aSubview setAutoresizingMask:CPViewMinXMargin];
|
||||
}
|
||||
|
||||
@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
|
||||
|
||||
|
||||
@@ -437,16 +437,51 @@ var cachedBlackColor,
|
||||
if (self)
|
||||
{
|
||||
_components = components;
|
||||
|
||||
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]) : "") + ")";
|
||||
|
||||
if (!CPFeatureIsCompatible(CPCSSRGBAFeature) && _components[3] != 1.0 && window.Base64 && window.CRC32)
|
||||
{
|
||||
var bytes = [0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x8,0x3,0x0,0x0,0x0,0x28,0xcb,0x34,0xbb,0x0,0x0,0x3,0x0,0x50,0x4c,0x54,0x45,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x17,0x89,0x99,0x55,0x0,0x0,0x0,0x1,0x74,0x52,0x4e,0x53,0x0,0x40,0xe6,0xd8,0x66,0x0,0x0,0x0,0x10,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x60,0x0,0x0,0x0,0x0,0xff,0xff,0x3,0x0,0x0,0x2,0x0,0x1,0x24,0x7f,0x24,0xf1,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,0xff];
|
||||
var r_off = 41;
|
||||
var g_off = 42;
|
||||
var b_off = 43;
|
||||
var a_off = 821;
|
||||
var plte_crc_off = 809;
|
||||
var trns_crc_off = 822;
|
||||
var plte_type_off = 37;
|
||||
var trns_type_off = 817;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -459,7 +494,6 @@ var cachedBlackColor,
|
||||
{
|
||||
_patternImage = anImage;
|
||||
_cssString = "url(\"" + [_patternImage filename] + "\")";
|
||||
_components = [0.0, 0.0, 0.0, 1.0];
|
||||
}
|
||||
|
||||
return self;
|
||||
@@ -702,7 +736,7 @@ var CPColorComponentsKey = @"CPColorComponentsKey",
|
||||
var hexCharacters = "0123456789ABCDEF";
|
||||
|
||||
// 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
|
||||
@@ -730,6 +764,18 @@ function hexToRGB(hex)
|
||||
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) {
|
||||
return byteToHex(r) + byteToHex(g) + byteToHex(b);
|
||||
}
|
||||
|
||||
@@ -370,10 +370,7 @@ var LEFT_SHADOW_INSET = 3.0,
|
||||
var images = [CPKeyedUnarchiver unarchiveObjectWithData:[[aSender draggingPasteboard] dataForType:CPImagesPboardType]];
|
||||
|
||||
if ([images count])
|
||||
{
|
||||
[self setImage:images[0]];
|
||||
[self sendAction:[self action] to:[self target]];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -227,8 +227,8 @@ var SelectionColor = nil,
|
||||
|
||||
CGContextClosePath(context);
|
||||
|
||||
CGContextSetShadowWithColor(context, CGSizeMake(0.0, 1.0), 1.1, _shadowColor || [CPColor whiteColor]);
|
||||
CGContextSetFillColor(context, _color || [CPColor blackColor]);
|
||||
CGContextSetShadowWithColor(context, CGSizeMake(0.0, 1.0), 1.1, _shadowColor);
|
||||
CGContextSetFillColor(context, _color);
|
||||
CGContextFillPath(context);
|
||||
}
|
||||
|
||||
|
||||
@@ -152,15 +152,6 @@ CPDownArrowKeyCode = 40;
|
||||
[_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
|
||||
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];
|
||||
}
|
||||
|
||||
/*!
|
||||
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).
|
||||
@param anEvent contains information about the movement
|
||||
|
||||
@@ -63,10 +63,10 @@ var CPSearchFieldSearchImage = nil,
|
||||
return;
|
||||
|
||||
var bundle = [CPBundle bundleForClass:self];
|
||||
CPSearchFieldSearchImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldSearch.png"] size:CGSizeMake(25, 22)];
|
||||
CPSearchFieldFindImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldFind.png"] size:CGSizeMake(25, 22)];
|
||||
CPSearchFieldCancelImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancel.png"] size:CGSizeMake(22, 22)];
|
||||
CPSearchFieldCancelPressedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancelPressed.png"] size:CGSizeMake(22, 22)];
|
||||
CPSearchFieldSearchImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldSearch.png"]];
|
||||
CPSearchFieldFindImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldFind.png"]];
|
||||
CPSearchFieldCancelImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancel.png"]];
|
||||
CPSearchFieldCancelPressedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancelPressed.png"]];
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame
|
||||
@@ -97,13 +97,13 @@ var CPSearchFieldSearchImage = nil,
|
||||
[self setEditable:YES];
|
||||
[self setDelegate:self];
|
||||
|
||||
_cancelButton = [[CPButton alloc] initWithFrame:CGRectMake(frame.size.width - 27,(frame.size.height-22)/2,22,22)];
|
||||
_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:CGRectMake(5,(frame.size.height-25)/2,25,25)];
|
||||
_searchButton = [[CPButton alloc] initWithFrame:CPMakeRect(5,(frame.size.height-25)/2,25,25)];
|
||||
[self resetSearchButton];
|
||||
[self addSubview:_searchButton];
|
||||
}
|
||||
@@ -664,7 +664,9 @@ var CPSearchFieldSearchImage = nil,
|
||||
|
||||
@end
|
||||
|
||||
var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
|
||||
var CPSearchButtonKey = @"CPSearchButtonKey",
|
||||
CPCancelButtonKey = @"CPCancelButtonKey",
|
||||
CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
|
||||
CPSendsWholeSearchStringKey = @"CPSendsWholeSearchStringKey",
|
||||
CPSendsSearchStringImmediatelyKey = @"CPSendsSearchStringImmediatelyKey",
|
||||
CPMaximumRecentsKey = @"CPMaximumRecentsKey",
|
||||
@@ -674,16 +676,10 @@ var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
|
||||
|
||||
- (void)encodeWithCoder:(CPCoder)coder
|
||||
{
|
||||
[_searchButton removeFromSuperview];
|
||||
[_cancelButton removeFromSuperview];
|
||||
|
||||
[super encodeWithCoder:coder];
|
||||
|
||||
if (_searchButton)
|
||||
[self addSubview:_searchButton];
|
||||
if (_cancelButton)
|
||||
[self addSubview:_cancelButton];
|
||||
|
||||
[super encodeWithCoder:coder];
|
||||
|
||||
[coder encodeObject:_searchButton forKey:CPSearchButtonKey];
|
||||
[coder encodeObject:_cancelButton forKey:CPCancelButtonKey];
|
||||
[coder encodeBool:_sendsWholeSearchString forKey:CPSendsWholeSearchStringKey];
|
||||
[coder encodeBool:_sendsSearchStringImmediately forKey:CPSendsSearchStringImmediatelyKey];
|
||||
[coder encodeInt:_maximumRecents forKey:CPMaximumRecentsKey];
|
||||
@@ -698,8 +694,8 @@ var CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
|
||||
{
|
||||
if (self = [super initWithCoder:coder])
|
||||
{
|
||||
[self _initWithFrame:[self frame]];
|
||||
|
||||
_searchButton = [coder decodeObjectForKey:CPSearchButtonKey];
|
||||
_cancelButton = [coder decodeObjectForKey:CPCancelButtonKey];
|
||||
_recentsAutosaveName = [coder decodeObjectForKey:CPRecentsAutosaveNameKey];
|
||||
_sendsWholeSearchString = [coder decodeBoolForKey:CPSendsWholeSearchStringKey];
|
||||
_sendsSearchStringImmediately = [coder decodeBoolForKey:CPSendsSearchStringImmediatelyKey];
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
@import "CPButtonBar.j"
|
||||
@import "CPImage.j"
|
||||
@import "CPView.j"
|
||||
|
||||
@@ -44,20 +43,18 @@ var CPSplitViewHorizontalImage = nil,
|
||||
id _delegate;
|
||||
BOOL _isVertical;
|
||||
BOOL _isPaneSplitter;
|
||||
|
||||
|
||||
int _currentDivider;
|
||||
float _initialOffset;
|
||||
|
||||
|
||||
CPString _originComponent;
|
||||
CPString _sizeComponent;
|
||||
|
||||
|
||||
CPArray _DOMDividerElements;
|
||||
CPString _dividerImagePath;
|
||||
int _drawingDivider;
|
||||
|
||||
|
||||
BOOL _needsResizeSubviews;
|
||||
|
||||
CPArray _buttonBars;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -80,11 +77,10 @@ var CPSplitViewHorizontalImage = nil,
|
||||
_currentDivider = CPNotFound;
|
||||
|
||||
_DOMDividerElements = [];
|
||||
_buttonBars = [];
|
||||
|
||||
[self _setVertical:YES];
|
||||
}
|
||||
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -102,7 +98,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
{
|
||||
if (![self _setVertical:shouldBeVertical])
|
||||
return;
|
||||
|
||||
|
||||
// Just re-adjust evenly.
|
||||
var frame = [self frame],
|
||||
dividerThickness = [self dividerThickness];
|
||||
@@ -129,13 +125,13 @@ var CPSplitViewHorizontalImage = nil,
|
||||
- (BOOL)_setVertical:(BOOL)shouldBeVertical
|
||||
{
|
||||
var changed = (_isVertical != shouldBeVertical);
|
||||
|
||||
|
||||
_isVertical = shouldBeVertical;
|
||||
|
||||
|
||||
_originComponent = [self isVertical] ? "x" : "y";
|
||||
_sizeComponent = [self isVertical] ? "width" : "height";
|
||||
_dividerImagePath = [self isVertical] ? [CPSplitViewVerticalImage filename] : [CPSplitViewHorizontalImage filename];
|
||||
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
@@ -154,7 +150,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
if(_DOMDividerElements[_drawingDivider])
|
||||
[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.
|
||||
_needsResizeSubviews = YES;
|
||||
[self setNeedsDisplay:YES];
|
||||
@@ -213,13 +209,18 @@ var CPSplitViewHorizontalImage = nil,
|
||||
{
|
||||
_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.backgroundRepeat = "repeat";
|
||||
|
||||
CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
|
||||
|
||||
[self _setupDOMDivider];
|
||||
}
|
||||
}
|
||||
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect));
|
||||
CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect));
|
||||
@@ -255,7 +256,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
var subviews = [self subviews],
|
||||
count = subviews.length,
|
||||
oldSize = CGSizeMakeZero();
|
||||
|
||||
|
||||
if ([self isVertical])
|
||||
{
|
||||
oldSize.width += [self dividerThickness] * (count - 1);
|
||||
@@ -278,25 +279,15 @@ var CPSplitViewHorizontalImage = nil,
|
||||
var frame = [_subviews[anIndex] frame],
|
||||
startPosition = frame.origin[_originComponent] + frame.size[_sizeComponent],
|
||||
effectiveRect = [self effectiveRectOfDividerAtIndex:anIndex],
|
||||
buttonBar = _buttonBars[anIndex],
|
||||
buttonBarRect = 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:)])
|
||||
effectiveRect = [_delegate splitView:self effectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex];
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)])
|
||||
additionalRect = [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex];
|
||||
|
||||
return CGRectContainsPoint(effectiveRect, aPoint) ||
|
||||
(additionalRect && CGRectContainsPoint(additionalRect, aPoint)) ||
|
||||
(buttonBarRect && CGRectContainsPoint(buttonBarRect, aPoint));
|
||||
return CGRectContainsPoint(effectiveRect, aPoint) || (additionalRect && CGRectContainsPoint(additionalRect, aPoint));
|
||||
}
|
||||
|
||||
- (CPView)hitTest:(CGPoint)aPoint
|
||||
@@ -312,7 +303,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
if ([self cursorAtPoint:point hitDividerAtIndex:i])
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
return [super hitTest:aPoint];
|
||||
}
|
||||
|
||||
@@ -329,13 +320,12 @@ var CPSplitViewHorizontalImage = nil,
|
||||
if (_currentDivider != CPNotFound)
|
||||
{
|
||||
_currentDivider = CPNotFound;
|
||||
[self _updateResizeCursor:anEvent];
|
||||
[self _postNotificationDidResize];
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (type == CPLeftMouseDown)
|
||||
{
|
||||
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
|
||||
@@ -352,7 +342,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
if ([anEvent clickCount] == 2 &&
|
||||
[_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)] &&
|
||||
[_delegate respondsToSelector:@selector(splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:)])
|
||||
{
|
||||
{
|
||||
var minPosition = [self minPossiblePositionOfDividerAtIndex:i],
|
||||
maxPosition = [self maxPossiblePositionOfDividerAtIndex:i];
|
||||
|
||||
@@ -384,16 +374,14 @@ var CPSplitViewHorizontalImage = nil,
|
||||
if (_currentDivider === CPNotFound)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
else if (type == CPLeftMouseDragged && _currentDivider != CPNotFound)
|
||||
{
|
||||
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
|
||||
|
||||
|
||||
[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];
|
||||
}
|
||||
|
||||
@@ -403,81 +391,13 @@ var CPSplitViewHorizontalImage = nil,
|
||||
[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
|
||||
{
|
||||
var frame = [_subviews[dividerIndex + 1] frame];
|
||||
|
||||
|
||||
if (dividerIndex + 1 < [_subviews count] - 1)
|
||||
return frame.origin[_originComponent] + frame.size[_sizeComponent] - [self dividerThickness];
|
||||
else
|
||||
else
|
||||
return [self frame].size[_sizeComponent] - [self dividerThickness];
|
||||
}
|
||||
|
||||
@@ -486,15 +406,17 @@ var CPSplitViewHorizontalImage = nil,
|
||||
if (dividerIndex > 0)
|
||||
{
|
||||
var frame = [_subviews[dividerIndex - 1] frame];
|
||||
|
||||
|
||||
return frame.origin[_originComponent] + frame.size[_sizeComponent] + [self dividerThickness];
|
||||
}
|
||||
else
|
||||
else
|
||||
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?
|
||||
if ([_delegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)])
|
||||
position = [_delegate splitView:self constrainSplitPosition:position ofSubviewAt:dividerIndex];
|
||||
@@ -503,56 +425,47 @@ var CPSplitViewHorizontalImage = nil,
|
||||
proposedMin = [self minPossiblePositionOfDividerAtIndex:dividerIndex],
|
||||
actualMax = proposedMax,
|
||||
actualMin = proposedMin;
|
||||
|
||||
|
||||
if([_delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)])
|
||||
actualMin = [_delegate splitView:self constrainMinCoordinate:proposedMin ofSubviewAt:dividerIndex];
|
||||
|
||||
|
||||
if([_delegate respondsToSelector:@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)])
|
||||
actualMax = [_delegate splitView:self constrainMaxCoordinate:proposedMax ofSubviewAt:dividerIndex];
|
||||
|
||||
var viewA = _subviews[dividerIndex],
|
||||
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;
|
||||
|
||||
return realPosition;
|
||||
}
|
||||
|
||||
- (void)setPosition:(float)position ofDividerAtIndex:(int)dividerIndex
|
||||
{
|
||||
[self _adjustSubviewsWithCalculatedSize];
|
||||
|
||||
var realPosition = [self _realPositionForPosition:position ofDividerAtIndex:dividerIndex];
|
||||
|
||||
var viewA = _subviews[dividerIndex],
|
||||
var frame = [self frame],
|
||||
viewA = _subviews[dividerIndex],
|
||||
frameA = [viewA frame],
|
||||
viewB = _subviews[dividerIndex + 1],
|
||||
frameB = [viewB frame];
|
||||
|
||||
var realPosition = MAX(MIN(position, actualMax), actualMin);
|
||||
|
||||
if (position < proposedMin + (actualMin - proposedMin) / 2)
|
||||
if ([_delegate respondsToSelector:@selector(splitView:canCollapseSubview:)])
|
||||
if ([_delegate splitView:self canCollapseSubview:viewA])
|
||||
realPosition = proposedMin;
|
||||
|
||||
frameA.size[_sizeComponent] = realPosition - frameA.origin[_originComponent];
|
||||
[_subviews[dividerIndex] setFrame:frameA];
|
||||
|
||||
|
||||
frameB.size[_sizeComponent] = frameB.origin[_originComponent] + frameB.size[_sizeComponent] - realPosition - [self dividerThickness];
|
||||
frameB.origin[_originComponent] = realPosition + [self dividerThickness];
|
||||
[_subviews[dividerIndex + 1] setFrame:frameB];
|
||||
|
||||
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (void)setFrameSize:(CGSize)aSize
|
||||
{
|
||||
[self _adjustSubviewsWithCalculatedSize];
|
||||
|
||||
|
||||
[super setFrameSize:aSize];
|
||||
|
||||
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (void)resizeSubviewsWithOldSize:(CPSize)oldSize
|
||||
{
|
||||
{
|
||||
if ([_delegate respondsToSelector:@selector(splitView:resizeSubviewsWithOldSize:)])
|
||||
{
|
||||
[_delegate splitView:self resizeSubviewsWithOldSize:oldSize];
|
||||
@@ -560,7 +473,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
}
|
||||
|
||||
[self _postNotificationWillResize];
|
||||
|
||||
|
||||
var index = 0,
|
||||
count = [_subviews count],
|
||||
bounds = [self bounds],
|
||||
@@ -611,7 +524,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
else if (totalSizableSpace && !isSizable)
|
||||
viewFrame.size[_sizeComponent] = [view frame].size[_sizeComponent];
|
||||
|
||||
bounds.origin[_originComponent] += viewFrame.size[_sizeComponent] + dividerThickness;
|
||||
bounds.origin[_originComponent] += viewFrame.size[_sizeComponent] + dividerThickness;
|
||||
|
||||
[view setFrame:viewFrame];
|
||||
}
|
||||
@@ -625,7 +538,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
[[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewDidResizeSubviewsNotification object:self];
|
||||
if ([_delegate respondsToSelector:@selector(splitViewWillResizeSubviews:)])
|
||||
[[CPNotificationCenter defaultCenter] removeObserver:_delegate name:CPSplitViewWillResizeSubviewsNotification object:self];
|
||||
|
||||
|
||||
_delegate = delegate;
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(splitViewDidResizeSubviews:)])
|
||||
@@ -640,47 +553,6 @@ var CPSplitViewHorizontalImage = nil,
|
||||
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
|
||||
{
|
||||
[[CPNotificationCenter defaultCenter] postNotificationName:CPSplitViewWillResizeSubviewsNotification object:self];
|
||||
@@ -695,8 +567,7 @@ var CPSplitViewHorizontalImage = nil,
|
||||
|
||||
var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
|
||||
CPSplitViewIsVerticalKey = "CPSplitViewIsVerticalKey",
|
||||
CPSplitViewIsPaneSplitterKey = "CPSplitViewIsPaneSplitterKey",
|
||||
CPSplitViewButtonBarsKey = "CPSplitViewButtonBarsKey";
|
||||
CPSplitViewIsPaneSplitterKey = "CPSplitViewIsPaneSplitterKey";
|
||||
|
||||
@implementation CPSplitView (CPCoding)
|
||||
|
||||
@@ -707,21 +578,19 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
|
||||
- (id)initWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
self = [super initWithCoder:aCoder];
|
||||
|
||||
|
||||
if (self)
|
||||
{
|
||||
_currentDivider = CPNotFound;
|
||||
|
||||
_DOMDividerElements = [];
|
||||
|
||||
_buttonBars = [aCoder decodeObjectForKey:CPSplitViewButtonBarsKey] || [];
|
||||
|
||||
_delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey];
|
||||
|
||||
_DOMDividerElements = [];
|
||||
|
||||
_delegate = [aCoder decodeObjectForKey:CPSplitViewDelegateKey];;
|
||||
|
||||
_isPaneSplitter = [aCoder decodeBoolForKey:CPSplitViewIsPaneSplitterKey];
|
||||
[self _setVertical:[aCoder decodeBoolForKey:CPSplitViewIsVerticalKey]];
|
||||
}
|
||||
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -732,12 +601,9 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
|
||||
- (void)encodeWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
[super encodeWithCoder:aCoder];
|
||||
|
||||
//FIXME how should we handle this?
|
||||
//[aCoder encodeObject:_buttonBars forKey:CPSplitViewButtonBarsKey];
|
||||
|
||||
|
||||
[aCoder encodeConditionalObject:_delegate forKey:CPSplitViewDelegateKey];
|
||||
|
||||
|
||||
[aCoder encodeBool:_isVertical forKey:CPSplitViewIsVerticalKey];
|
||||
[aCoder encodeBool:_isPaneSplitter forKey:CPSplitViewIsPaneSplitterKey];
|
||||
}
|
||||
|
||||
@@ -194,17 +194,15 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
SEL _doubleAction;
|
||||
unsigned _columnAutoResizingStyle;
|
||||
|
||||
int _lastTrackedRowIndex;
|
||||
CGPoint _originalMouseDownPoint;
|
||||
BOOL _verticalMotionCanDrag;
|
||||
unsigned _destinationDragStyle;
|
||||
BOOL _isSelectingSession;
|
||||
CPIndexSet _draggedRowIndexes;
|
||||
|
||||
_CPDropOperationDrawingView _dropOperationFeedbackView;
|
||||
CPDragOperation _dragOperationDefaultMask;
|
||||
int _retargetedDropRow;
|
||||
CPDragOperation _retargetedDropOperation;
|
||||
_dropOperationDrawingView _dropOperationFeedbackView;
|
||||
CPDragOperation _dragOperationDefaultMask;
|
||||
int _retargetedDropRow;
|
||||
CPDragOperation _retargetedDropOperation;
|
||||
|
||||
BOOL _disableAutomaticResizing @accessors(property=disableAutomaticResizing);
|
||||
BOOL _lastColumnShouldSnap;
|
||||
@@ -263,14 +261,14 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
[_headerView setTableView:self];
|
||||
|
||||
_cornerView = [[_CPCornerView alloc] initWithFrame:CGRectMake(0, 0, [CPScroller scrollerWidth], CGRectGetHeight([_headerView frame]))];
|
||||
|
||||
|
||||
_lastSelectedRow = -1;
|
||||
_selectedColumnIndexes = [CPIndexSet indexSet];
|
||||
_selectedRowIndexes = [CPIndexSet indexSet];
|
||||
_currentHighlightedTableColumn = nil;
|
||||
|
||||
|
||||
_sortDescriptors = [CPArray array];
|
||||
|
||||
|
||||
_draggedRowIndexes = [CPIndexSet indexSet];
|
||||
_verticalMotionCanDrag = YES;
|
||||
_isSelectingSession = NO;
|
||||
@@ -278,6 +276,10 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
_retargetedDropOperation = nil;
|
||||
_dragOperationDefaultMask = nil;
|
||||
_destinationDragStyle = CPTableViewDraggingDestinationFeedbackStyleRegular;
|
||||
_dropOperationFeedbackView = [[_dropOperationDrawingView alloc] initWithFrame:_CGRectMakeZero()];
|
||||
[self addSubview:_dropOperationFeedbackView];
|
||||
[_dropOperationFeedbackView setHidden:YES];
|
||||
[_dropOperationFeedbackView setTableView:self];
|
||||
|
||||
_tableDrawView = [[_CPTableDrawView alloc] initWithTableView:self];
|
||||
[_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.
|
||||
- (void)_init
|
||||
{
|
||||
_dropOperationFeedbackView = [[_CPDropOperationDrawingView alloc] initWithFrame:_CGRectMakeZero()];
|
||||
[_dropOperationFeedbackView setTableView:self];
|
||||
|
||||
_lastColumnShouldSnap = NO;
|
||||
_backgroundColor = [CPColor whiteColor];
|
||||
|
||||
@@ -1778,22 +1777,33 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
// We have to fetch all the data views for the selected rows and columns
|
||||
// After that we can copy these add them to a transparent drag view and use that drag view
|
||||
// to make it appear we are dragging images of those rows (as you would do in regular Cocoa)
|
||||
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--)
|
||||
{
|
||||
var tableColumn = [theTableColumns objectAtIndex:columnIndex],
|
||||
row = [theDraggedRows firstIndex];
|
||||
var column = columns[columnIndex],
|
||||
tableColumn = [_tableColumns objectAtIndex:column],
|
||||
rowIndex = [rows count];
|
||||
|
||||
while (row !== CPNotFound)
|
||||
while (rowIndex--)
|
||||
{
|
||||
var row = rows[rowIndex];
|
||||
var dataView = [self _newDataViewForRow:row tableColumn:tableColumn];
|
||||
|
||||
[dataView setFrame:[self frameOfDataViewAtColumn:columnIndex row:row]];
|
||||
[dataView setFrame:[self frameOfDataViewAtColumn:column row:row]];
|
||||
[dataView setObjectValue:[self _objectValueForTableColumn:tableColumn row:row]];
|
||||
|
||||
[view addSubview:dataView];
|
||||
|
||||
row = [theDraggedRows indexGreaterThanIndex:row];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2636,11 +2646,8 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
}
|
||||
|
||||
_isSelectingSession = YES;
|
||||
if(row >= 0 && row !== _lastTrackedRowIndex)
|
||||
{
|
||||
_lastTrackedRowIndex = row;
|
||||
if(row >= 0)
|
||||
[self _updateSelectionWithMouseAtRow:row];
|
||||
}
|
||||
|
||||
if ((_implementedDataSourceMethods & CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_)
|
||||
&& !_trackingPointMovedOutOfClickSlop)
|
||||
@@ -2750,7 +2757,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
*/
|
||||
- (void)draggingExited:(id)sender
|
||||
{
|
||||
[_dropOperationFeedbackView removeFromSuperview];
|
||||
[_dropOperationFeedbackView setHidden:YES];
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2766,7 +2773,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
_retargetedDropOperation = nil;
|
||||
_retargetedDropRow = nil;
|
||||
_draggedRowIndexes = [CPIndexSet indexSet];
|
||||
[_dropOperationFeedbackView removeFromSuperview];
|
||||
[_dropOperationFeedbackView setHidden:YES];
|
||||
}
|
||||
/*
|
||||
@ignore
|
||||
@@ -2899,7 +2906,7 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
|
||||
{
|
||||
// FIX ME: is there anything else that needs to happen here?
|
||||
// actual validation is called in dragginUpdated:
|
||||
[_dropOperationFeedbackView removeFromSuperview];
|
||||
[_dropOperationFeedbackView setHidden:YES];
|
||||
|
||||
return (_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_);
|
||||
}
|
||||
@@ -3316,7 +3323,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey",
|
||||
|
||||
@end
|
||||
|
||||
@implementation _CPDropOperationDrawingView : CPView
|
||||
@implementation _dropOperationDrawingView : CPView
|
||||
{
|
||||
unsigned dropOperation @accessors;
|
||||
CPTableView tableView @accessors;
|
||||
|
||||
@@ -243,11 +243,6 @@ var CPViewFlags = { },
|
||||
return [CPSet setWithObjects:@"boundsOrigin", @"boundsSize"];
|
||||
}
|
||||
|
||||
+ (CPMenu)defaultMenu
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
return [self initWithFrame:CGRectMakeZero()];
|
||||
@@ -1204,7 +1199,7 @@ var CPViewFlags = { },
|
||||
|
||||
if (CPFeatureIsCompatible(CPOpacityRequiresFilterFeature))
|
||||
{
|
||||
if (anAlphaValue === 1.0)
|
||||
if (anAlphaValue == 1.0)
|
||||
try { _DOMElement.style.removeAttribute("filter") } catch (anException) { }
|
||||
else
|
||||
_DOMElement.style.filter = "alpha(opacity=" + anAlphaValue * 100 + ")";
|
||||
@@ -1314,22 +1309,6 @@ var CPViewFlags = { },
|
||||
[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.
|
||||
@param aColor the new color for the receiver's background
|
||||
@@ -1338,72 +1317,56 @@ var CPViewFlags = { },
|
||||
{
|
||||
if (_backgroundColor == aColor)
|
||||
return;
|
||||
|
||||
|
||||
_backgroundColor = aColor;
|
||||
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
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;
|
||||
|
||||
|
||||
if ([patternImage isThreePartImage])
|
||||
{
|
||||
_backgroundType = [patternImage isVertical] ? BackgroundVerticalThreePartImage : BackgroundHorizontalThreePartImage;
|
||||
|
||||
amount = 3 - _DOMImageParts.length;
|
||||
}
|
||||
else if ([patternImage isNinePartImage])
|
||||
{
|
||||
_backgroundType = BackgroundNinePartImage;
|
||||
amount = 9 - _DOMImageParts.length;
|
||||
|
||||
amount = 9 - _DOMImageParts.length;
|
||||
}
|
||||
else
|
||||
{
|
||||
_backgroundType = BackgroundTrivialColor;
|
||||
amount = (colorNeedsDOMElement ? 1 : 0) - _DOMImageParts.length;
|
||||
|
||||
amount = 0 - _DOMImageParts.length;
|
||||
}
|
||||
|
||||
if (amount > 0)
|
||||
{
|
||||
while (amount--)
|
||||
{
|
||||
var DOMElement = DOMElementPrototype.cloneNode(false);
|
||||
|
||||
|
||||
DOMElement.style.zIndex = -1000;
|
||||
|
||||
|
||||
_DOMImageParts.push(DOMElement);
|
||||
_DOMElement.appendChild(DOMElement);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
amount = -amount;
|
||||
|
||||
while (amount--)
|
||||
_DOMElement.removeChild(_DOMImageParts.pop());
|
||||
}
|
||||
|
||||
if (_backgroundType === BackgroundTrivialColor)
|
||||
{
|
||||
var colorCSS = colorExists ? [_backgroundColor cssString] : "";
|
||||
|
||||
if (colorNeedsDOMElement)
|
||||
{
|
||||
_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;
|
||||
}
|
||||
|
||||
if (_backgroundType == BackgroundTrivialColor)
|
||||
|
||||
// Opera doesn't like DOM properties set to nil.
|
||||
// https://trac.280north.com/ticket/7
|
||||
_DOMElement.style.background = _backgroundColor ? [_backgroundColor cssString] : "";
|
||||
|
||||
else
|
||||
{
|
||||
var slices = [patternImage imageSlices],
|
||||
@@ -1414,31 +1377,23 @@ var CPViewFlags = { },
|
||||
{
|
||||
var image = slices[count],
|
||||
size = _DOMImageSizes[count] = image ? [image size] : _CGSizeMakeZero();
|
||||
|
||||
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[count], size.width, size.height);
|
||||
|
||||
_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)
|
||||
{
|
||||
var width = frameSize.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width,
|
||||
height = frameSize.height - _DOMImageSizes[0].height - _DOMImageSizes[6].height;
|
||||
|
||||
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], width, _DOMImageSizes[0].height);
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[3], _DOMImageSizes[3].width, height);
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[4], width, height);
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[5], _DOMImageSizes[5].width, height);
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[7], width, _DOMImageSizes[7].height);
|
||||
|
||||
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0);
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, _DOMImageSizes[0].width, 0.0);
|
||||
CPDOMDisplayServerSetStyleRightTop(_DOMImageParts[2], NULL, 0.0, 0.0);
|
||||
@@ -1452,7 +1407,7 @@ var CPViewFlags = { },
|
||||
else if (_backgroundType == BackgroundVerticalThreePartImage)
|
||||
{
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], frameSize.width, frameSize.height - _DOMImageSizes[0].height - _DOMImageSizes[2].height);
|
||||
|
||||
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0);
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, 0.0, _DOMImageSizes[0].height);
|
||||
CPDOMDisplayServerSetStyleLeftBottom(_DOMImageParts[2], NULL, 0.0, 0.0);
|
||||
@@ -1460,7 +1415,7 @@ var CPViewFlags = { },
|
||||
else if (_backgroundType == BackgroundHorizontalThreePartImage)
|
||||
{
|
||||
CPDOMDisplayServerSetStyleSize(_DOMImageParts[1], frameSize.width - _DOMImageSizes[0].width - _DOMImageSizes[2].width, frameSize.height);
|
||||
|
||||
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[0], NULL, 0.0, 0.0);
|
||||
CPDOMDisplayServerSetStyleLeftTop(_DOMImageParts[1], NULL, _DOMImageSizes[0].width, 0.0);
|
||||
CPDOMDisplayServerSetStyleRightTop(_DOMImageParts[2], NULL, 0.0, 0.0);
|
||||
|
||||
@@ -472,6 +472,9 @@ CPTexturedBackgroundWindowMask
|
||||
|
||||
- (void)awakeFromCib
|
||||
{
|
||||
if (_initialFirstResponder)
|
||||
[self makeFirstResponder:_initialFirstResponder];
|
||||
|
||||
_keyViewLoopIsDirty = ![self _hasKeyViewLoop];
|
||||
}
|
||||
|
||||
@@ -735,15 +738,6 @@ CPTexturedBackgroundWindowMask
|
||||
{
|
||||
[_platformWindow orderFront:self];
|
||||
[_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;
|
||||
}
|
||||
|
||||
- (id)initialFirstResponder
|
||||
{
|
||||
return _initialFirstResponder;
|
||||
}
|
||||
|
||||
- (void)setInitialFirstResponder:(id)aResponder
|
||||
{
|
||||
_initialFirstResponder = aResponder;
|
||||
}
|
||||
|
||||
/*!
|
||||
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
|
||||
@@ -1186,7 +1170,7 @@ CPTexturedBackgroundWindowMask
|
||||
*/
|
||||
- (BOOL)makeFirstResponder:(CPResponder)aResponder
|
||||
{
|
||||
if (_firstResponder === aResponder)
|
||||
if (_firstResponder == aResponder)
|
||||
return YES;
|
||||
|
||||
if(![_firstResponder resignFirstResponder])
|
||||
@@ -1347,58 +1331,44 @@ CPTexturedBackgroundWindowMask
|
||||
|
||||
case CPScrollWheel: return [[_windowView hitTest:point] scrollWheel:anEvent];
|
||||
|
||||
case CPLeftMouseUp:
|
||||
case CPRightMouseUp: var hitTestedView = _leftMouseDownView,
|
||||
selector = type == CPRightMouseUp ? @selector(rightMouseUp:) : @selector(mouseUp:);
|
||||
case CPLeftMouseUp: if (!_leftMouseDownView)
|
||||
return [[_windowView hitTest:point] mouseUp:anEvent];
|
||||
|
||||
if (!hitTestedView)
|
||||
hitTestedView = [_windowView hitTest:point];
|
||||
|
||||
[hitTestedView performSelector:selector withObject:anEvent];
|
||||
[_leftMouseDownView mouseUp:anEvent]
|
||||
|
||||
_leftMouseDownView = nil;
|
||||
|
||||
return;
|
||||
case CPLeftMouseDown:
|
||||
case CPRightMouseDown: _leftMouseDownView = [_windowView hitTest:point];
|
||||
case CPLeftMouseDown: _leftMouseDownView = [_windowView hitTest:point];
|
||||
|
||||
if (_leftMouseDownView != _firstResponder && [_leftMouseDownView acceptsFirstResponder])
|
||||
[self makeFirstResponder:_leftMouseDownView];
|
||||
|
||||
[CPApp activateIgnoringOtherApps:YES];
|
||||
|
||||
var theWindow = [anEvent window],
|
||||
selector = type == CPRightMouseDown ? @selector(rightMouseDown:) : @selector(mouseDown:);
|
||||
var theWindow = [anEvent window];
|
||||
|
||||
if ([theWindow isKeyWindow] || [theWindow becomesKeyOnlyIfNeeded] && ![_leftMouseDownView needsPanelToBecomeKey])
|
||||
return [_leftMouseDownView performSelector:selector withObject:anEvent];
|
||||
return [_leftMouseDownView mouseDown:anEvent];
|
||||
else
|
||||
{
|
||||
// FIXME: delayed ordering?
|
||||
[self makeKeyAndOrderFront:self];
|
||||
|
||||
if ([_leftMouseDownView acceptsFirstMouse:anEvent])
|
||||
return [_leftMouseDownView performSelector:selector withObject:anEvent];
|
||||
return [_leftMouseDownView mouseDown:anEvent]
|
||||
}
|
||||
break;
|
||||
|
||||
case CPLeftMouseDragged:
|
||||
case CPRightMouseDragged: if (!_leftMouseDownView)
|
||||
case CPLeftMouseDragged: if (!_leftMouseDownView)
|
||||
return [[_windowView hitTest:point] mouseDragged:anEvent];
|
||||
|
||||
var selector;
|
||||
if (type == CPRightMouseDragged)
|
||||
{
|
||||
selector = @selector(rightMouseDragged:)
|
||||
if (![_leftMouseDownView respondsToSelector:selector])
|
||||
selector = nil;
|
||||
}
|
||||
|
||||
if (!selector)
|
||||
selector = @selector(mouseDragged:)
|
||||
|
||||
return [_leftMouseDownView performSelector:selector withObject:anEvent];
|
||||
|
||||
return [_leftMouseDownView mouseDragged:anEvent];
|
||||
|
||||
case CPRightMouseUp: return [_rightMouseDownView mouseUp:anEvent];
|
||||
case CPRightMouseDown: _rightMouseDownView = [_windowView hitTest:point];
|
||||
return [_rightMouseDownView mouseDown:anEvent];
|
||||
case CPRightMouseDragged: return [_rightMouseDownView mouseDragged:anEvent];
|
||||
|
||||
case CPMouseMoved: if (!_acceptsMouseMovedEvents)
|
||||
return;
|
||||
|
||||
@@ -1524,7 +1494,7 @@ CPTexturedBackgroundWindowMask
|
||||
*/
|
||||
- (void)resignKeyWindow
|
||||
{
|
||||
if (_firstResponder !== self && [_firstResponder respondsToSelector:@selector(resignKeyWindow)])
|
||||
if (_firstResponder != self && [_firstResponder respondsToSelector:@selector(resignKeyWindow)])
|
||||
[_firstResponder resignKeyWindow];
|
||||
|
||||
if (CPApp._keyWindow === self)
|
||||
|
||||
@@ -171,17 +171,12 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
|
||||
- (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];
|
||||
}
|
||||
|
||||
- (void)connection:(CPURLConnection)aConnection didFailWithError:(CPError)anError
|
||||
{
|
||||
if ([_loadDelegate respondsToSelector:@selector(cibDidFailToLoad:)])
|
||||
[_loadDelegate cibDidFailToLoad:self];
|
||||
alert("cib: connection failed.");
|
||||
|
||||
_loadDelegate = nil;
|
||||
}
|
||||
|
||||
@@ -118,9 +118,4 @@ var CPCibOwner = @"CPCibOwner";
|
||||
[_loadDelegate cibDidFinishLoading:aCib];
|
||||
}
|
||||
|
||||
- (void)cibDidFailToLoad:(CPCib)aCib
|
||||
{
|
||||
[_loadDelegate cibDidFailToLoad:aCib];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -46,7 +46,6 @@ var PrimaryPlatformWindow = NULL;
|
||||
CPDictionary _windowLayers;
|
||||
|
||||
BOOL _mouseIsDown;
|
||||
BOOL _mouseDownIsRightClick;
|
||||
CPWindow _mouseDownWindow;
|
||||
CPTimeInterval _lastMouseUp;
|
||||
CPTimeInterval _lastMouseDown;
|
||||
|
||||
@@ -127,8 +127,7 @@ var PlatformWindows = [CPSet set];
|
||||
// Define up here so compressor knows about em.
|
||||
var CPDOMEventGetClickCount,
|
||||
CPDOMEventStop,
|
||||
StopDOMEventPropagation,
|
||||
StopContextMenuDOMEventPropagation;
|
||||
StopDOMEventPropagation;
|
||||
|
||||
var _DOMEventGuard;
|
||||
|
||||
@@ -313,10 +312,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
mouseEventImplementation = class_getMethodImplementation(theClass, mouseEventSelector),
|
||||
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:),
|
||||
scrollEventImplementation = class_getMethodImplementation(theClass, scrollEventSelector),
|
||||
scrollEventCallback = function (anEvent) { scrollEventImplementation(self, nil, anEvent); },
|
||||
@@ -340,7 +335,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
theDocument.addEventListener("mouseup", mouseEventCallback, NO);
|
||||
theDocument.addEventListener("mousedown", mouseEventCallback, NO);
|
||||
theDocument.addEventListener("mousemove", mouseEventCallback, NO);
|
||||
theDocument.addEventListener("contextmenu", contextMenuEventCallback, NO);
|
||||
|
||||
theDocument.addEventListener("beforecopy", copyEventCallback, NO);
|
||||
theDocument.addEventListener("beforecut", copyEventCallback, NO);
|
||||
@@ -368,7 +362,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
theDocument.removeEventListener("mouseup", mouseEventCallback, NO);
|
||||
theDocument.removeEventListener("mousedown", mouseEventCallback, NO);
|
||||
theDocument.removeEventListener("mousemove", mouseEventCallback, NO);
|
||||
theDocument.removeEventListener("contextmenu", contextMenuEventCallback, NO);
|
||||
|
||||
theDocument.removeEventListener("keyup", keyEventCallback, NO);
|
||||
theDocument.removeEventListener("keydown", keyEventCallback, NO);
|
||||
@@ -401,7 +394,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
theDocument.attachEvent("onmousedown", mouseEventCallback);
|
||||
theDocument.attachEvent("onmousemove", mouseEventCallback);
|
||||
theDocument.attachEvent("ondblclick", mouseEventCallback);
|
||||
theDocument.attachEvent("oncontextmenu", contextMenuEventCallback);
|
||||
|
||||
theDocument.attachEvent("onkeyup", keyEventCallback);
|
||||
theDocument.attachEvent("onkeydown", keyEventCallback);
|
||||
@@ -424,7 +416,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
theDocument.detachEvent("onmousedown", mouseEventCallback);
|
||||
theDocument.detachEvent("onmousemove", mouseEventCallback);
|
||||
theDocument.detachEvent("ondblclick", mouseEventCallback);
|
||||
theDocument.detachEvent("oncontextmenu", contextMenuEventCallback);
|
||||
|
||||
theDocument.detachEvent("onkeyup", keyEventCallback);
|
||||
theDocument.detachEvent("onkeydown", keyEventCallback);
|
||||
@@ -1055,12 +1046,11 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
{
|
||||
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;
|
||||
_lastMouseUp = event;
|
||||
_mouseDownWindow = nil;
|
||||
_mouseDownIsRightClick = NO;
|
||||
}
|
||||
|
||||
if(_DOMEventMode)
|
||||
@@ -1100,13 +1090,8 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
_DOMBodyElement.style["-khtml-user-drag"] = "element";
|
||||
}
|
||||
|
||||
var button = aDOMEvent.button;
|
||||
_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);
|
||||
|
||||
event = _CPEventFromNativeMouseEvent(aDOMEvent, CPLeftMouseDown, location, modifierFlags, timestamp, windowNumber, nil, -1, CPDOMEventGetClickCount(_lastMouseDown, timestamp, location), 0);
|
||||
|
||||
_mouseIsDown = YES;
|
||||
_lastMouseDown = event;
|
||||
}
|
||||
@@ -1116,7 +1101,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
if (_DOMEventMode)
|
||||
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];
|
||||
@@ -1137,14 +1122,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
|
||||
}
|
||||
|
||||
- (void)contextMenuEvent:(DOMEvent)aDOMEvent
|
||||
{
|
||||
if (StopContextMenuDOMEventPropagation)
|
||||
CPDOMEventStop(aDOMEvent, self);
|
||||
|
||||
return !StopContextMenuDOMEventPropagation;
|
||||
}
|
||||
|
||||
- (CPArray)orderedWindowsAtLevel:(int)aLevel
|
||||
{
|
||||
var layer = [self layerAtLevel:aLevel create:NO];
|
||||
@@ -1286,19 +1263,6 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop];
|
||||
return !StopDOMEventPropagation;
|
||||
}
|
||||
|
||||
- (void)_propagateContextMenuDOMEvent:(BOOL)aFlag
|
||||
{
|
||||
if (aFlag && CPBrowserIsEngine(CPGeckoBrowserEngine))
|
||||
StopDOMEventPropagation = !aFlag;
|
||||
|
||||
StopContextMenuDOMEventPropagation = !aFlag;
|
||||
}
|
||||
|
||||
- (BOOL)_willPropagateContextMenuDOMEvent
|
||||
{
|
||||
return StopContextMenuDOMEventPropagation;
|
||||
}
|
||||
|
||||
- (CPWindow)hitTest:(CPPoint)location
|
||||
{
|
||||
if (self._only)
|
||||
|
||||
|
Before Width: | Height: | Size: 304 B |
|
Before Width: | Height: | Size: 321 B |
|
Before Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 115 B |
|
Before Width: | Height: | Size: 159 B |
|
After Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 134 B |
|
Before Width: | Height: | Size: 120 B |
|
Before Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 134 B |
|
Before Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 187 B |
@@ -721,49 +721,17 @@
|
||||
|
||||
+ (CPButtonBar)themedButtonBar
|
||||
{
|
||||
var buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 140.0, 26.0)],
|
||||
color = [CPColor colorWithPatternImage:[_CPCibCustomResource imageResourceWithName:"buttonbar-bezel.png" size:CGSizeMake(1.0, 26.0)]];
|
||||
|
||||
[buttonBar setHasResizeControl:YES];
|
||||
|
||||
[buttonBar setValue:color forThemeAttribute:@"bezel-color"];
|
||||
|
||||
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)]
|
||||
]
|
||||
var buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 26.0)],
|
||||
color = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
|
||||
[
|
||||
[_CPCibCustomResource imageResourceWithName:"buttonbar-bezel.png" size:CGSizeMake(1.0, 26.0)],
|
||||
[_CPCibCustomResource imageResourceWithName:"buttonbar-bezel.png" size:CGSizeMake(1.0, 26.0)],
|
||||
[_CPCibCustomResource imageResourceWithName:"buttonbar-bezel-right.png" size:CGSizeMake(13.0, 26.0)]
|
||||
]
|
||||
isVertical:NO]];
|
||||
|
||||
[buttonBar setValue:buttonBezelColor forThemeAttribute:@"button-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]]];
|
||||
|
||||
[buttonBar setValue:color forThemeAttribute:@"bezel-color"];
|
||||
|
||||
return buttonBar;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,18 +5,13 @@
|
||||
{
|
||||
}
|
||||
|
||||
- (void)_init
|
||||
{
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]];
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)aFrame
|
||||
{
|
||||
if (self = [super initWithFrame:aFrame])
|
||||
{
|
||||
[self _init];
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]];
|
||||
}
|
||||
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -25,23 +20,16 @@
|
||||
var context = [[CPGraphicsContext currentContext] graphicsPort];
|
||||
|
||||
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 + aRect.size.height)
|
||||
];
|
||||
|
||||
|
||||
CGContextStrokeLineSegments(context, points, 2);
|
||||
}
|
||||
|
||||
- (id)initWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
self = [super initWithCoder:aCoder];
|
||||
{
|
||||
[self _init];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -574,8 +574,8 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
|
||||
_DOMImageElement.width = imageWidth;
|
||||
_DOMImageElement.height = imageHeight;
|
||||
imageStyle.width = MAX(imageWidth, 0) + "px";
|
||||
imageStyle.height = MAX(imageHeight, 0) + "px";
|
||||
imageStyle.width = imageWidth + "px";
|
||||
imageStyle.height = imageHeight + "px";
|
||||
|
||||
if (_imagePosition === CPImageBelow)
|
||||
{
|
||||
@@ -619,7 +619,7 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
textRectY = _CGRectGetMinY(textRect),
|
||||
textRectWidth = _CGRectGetWidth(textRect),
|
||||
textRectHeight = _CGRectGetHeight(textRect);
|
||||
|
||||
|
||||
if (_verticalAlignment !== CPTopVerticalTextAlignment)
|
||||
{
|
||||
if (!_textSize)
|
||||
@@ -646,8 +646,8 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
|
||||
textStyle.top = ROUND(textRectY) + "px";
|
||||
textStyle.left = ROUND(textRectX) + "px";
|
||||
textStyle.width = MAX(ROUND(textRectWidth), 0) + "px";
|
||||
textStyle.height = MAX(ROUND(textRectHeight), 0) + "px";
|
||||
textStyle.width = ROUND(textRectWidth) + "px";
|
||||
textStyle.height = ROUND(textRectHeight) + "px";
|
||||
|
||||
if (shadowStyle)
|
||||
{
|
||||
@@ -656,8 +656,8 @@ var HORIZONTAL_MARGIN = 3.0,
|
||||
|
||||
shadowStyle.top = ROUND(textRectY + _textShadowOffset.height) + "px";
|
||||
shadowStyle.left = ROUND(textRectX + _textShadowOffset.width) + "px";
|
||||
shadowStyle.width = MAX(ROUND(textRectWidth), 0) + "px";
|
||||
shadowStyle.height = MAX(ROUND(textRectHeight), 0) + "px";
|
||||
shadowStyle.width = ROUND(textRectWidth) + "px";
|
||||
shadowStyle.height = ROUND(textRectHeight) + "px";
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -105,11 +105,7 @@
|
||||
*/
|
||||
+ (id)alloc
|
||||
{
|
||||
var a = [];
|
||||
a._retainCount = 1;
|
||||
a._UID = objj_generateObjectUID();
|
||||
OBJJ_MEMORY_TABLE[a._UID] = a;
|
||||
return a;
|
||||
return [];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -117,7 +113,7 @@
|
||||
*/
|
||||
+ (id)array
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -127,7 +123,7 @@
|
||||
*/
|
||||
+ (id)arrayWithArray:(CPArray)anArray
|
||||
{
|
||||
return [[[self alloc] initWithArray:anArray] autorelease];
|
||||
return [[self alloc] initWithArray:anArray];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -137,7 +133,7 @@
|
||||
*/
|
||||
+ (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)
|
||||
array.push(argument);
|
||||
|
||||
return [array autorelease];
|
||||
return array;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -165,7 +161,7 @@
|
||||
*/
|
||||
+ (id)arrayWithObjects:(id)objects count:(unsigned)aCount
|
||||
{
|
||||
return [[[self alloc] initWithObjects:objects count:aCount] autorelease];
|
||||
return [[self alloc] initWithObjects:objects count:aCount];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -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
|
||||
@@ -72,7 +72,7 @@ var CPBundlesForURLStrings = { };
|
||||
if (self)
|
||||
{
|
||||
_bundle = new CFBundle(aURL);
|
||||
CPBundlesForURLStrings[URLString] = [self retain];
|
||||
CPBundlesForURLStrings[URLString] = self;
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
@@ -40,27 +40,27 @@
|
||||
|
||||
+ (CPData)data
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
+ (CPData)dataWithRawString:(CPString)aString
|
||||
{
|
||||
return [[[self alloc] initWithRawString:aString] autorelease];
|
||||
return [[self alloc] initWithRawString:aString];
|
||||
}
|
||||
|
||||
+ (CPData)dataWithPlistObject:(id)aPlistObject
|
||||
{
|
||||
return [[[self alloc] initWithPlistObject:aPlistObject] autorelease];
|
||||
return [[self alloc] initWithPlistObject:aPlistObject];
|
||||
}
|
||||
|
||||
+ (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
|
||||
{
|
||||
return [[[self alloc] initWithJSONObject:anObject] autorelease];
|
||||
return [[self alloc] initWithJSONObject:anObject];
|
||||
}
|
||||
|
||||
- (id)initWithRawString:(CPString)aString
|
||||
|
||||
@@ -24,13 +24,7 @@
|
||||
@import "CPString.j"
|
||||
|
||||
|
||||
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;
|
||||
};
|
||||
var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0));
|
||||
|
||||
/*!
|
||||
@class CPDate
|
||||
@@ -45,48 +39,48 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
|
||||
|
||||
+ (id)alloc
|
||||
{
|
||||
return _CPDateAllocator(new Date);
|
||||
return new Date;
|
||||
}
|
||||
|
||||
+ (id)date
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
+ (id)dateWithTimeIntervalSinceNow:(CPTimeInterval)seconds
|
||||
{
|
||||
return [[[CPDate alloc] initWithTimeIntervalSinceNow:seconds] autorelease];
|
||||
return [[CPDate alloc] initWithTimeIntervalSinceNow:seconds];
|
||||
}
|
||||
|
||||
+ (id)dateWithTimeIntervalSince1970:(CPTimeInterval)seconds
|
||||
{
|
||||
return [[[CPDate alloc] initWithTimeIntervalSince1970:seconds] autorelease];
|
||||
return [[CPDate alloc] initWithTimeIntervalSince1970:seconds];
|
||||
}
|
||||
|
||||
+ (id)dateWithTimeIntervalSinceReferenceDate:(CPTimeInterval)seconds
|
||||
{
|
||||
return [[[CPDate alloc] initWithTimeIntervalSinceReferenceDate:seconds] autorelease];
|
||||
return [[CPDate alloc] initWithTimeIntervalSinceReferenceDate:seconds];
|
||||
}
|
||||
|
||||
+ (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
|
||||
{
|
||||
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
|
||||
{
|
||||
self = _CPDateAllocator(new Date((new Date()).getTime() + seconds * 1000));
|
||||
self = new Date((new Date()).getTime() + seconds * 1000);
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithTimeIntervalSince1970:(CPTimeInterval)seconds
|
||||
{
|
||||
self = _CPDateAllocator(new Date(seconds * 1000));
|
||||
self = new Date(seconds * 1000);
|
||||
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
|
||||
{
|
||||
self = _CPDateAllocator(new Date(refDate.getTime() + seconds * 1000));
|
||||
self = new Date(refDate.getTime() + seconds * 1000);
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -123,7 +117,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
|
||||
date.setMinutes(d[5]);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -191,7 +185,7 @@ var CPDateReferenceDate = new Date(Date.UTC(2001,1,1,0,0,0,0)),
|
||||
|
||||
- (id)copy
|
||||
{
|
||||
return _CPDateAllocator(new Date(self.getTime()));
|
||||
return new Date(self.getTime());
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
*/
|
||||
+ (id)dictionary
|
||||
{
|
||||
return [[[self alloc] init] autorelease];;
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -102,7 +102,7 @@
|
||||
*/
|
||||
+ (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
|
||||
{
|
||||
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
|
||||
{
|
||||
return [[[self alloc] initWithObjects:objects forKeys:keys] autorelease];
|
||||
return [[self alloc] initWithObjects:objects forKeys:keys];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -135,7 +135,7 @@
|
||||
*/
|
||||
+ (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
|
||||
{
|
||||
var dictionary = [[[self alloc] init] autorelease];
|
||||
var dictionary = [[self alloc] init];
|
||||
|
||||
for (var key in object)
|
||||
{
|
||||
@@ -209,7 +209,7 @@
|
||||
arguments[0] = [self alloc];
|
||||
arguments[1] = @selector(initWithObjectsAndKeys:);
|
||||
|
||||
return [objj_msgSend.apply(this, arguments) autorelease];
|
||||
return objj_msgSend.apply(this, arguments);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
*/
|
||||
+ (id)indexSet
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -55,7 +55,7 @@
|
||||
*/
|
||||
+ (id)indexSetWithIndex:(int)anIndex
|
||||
{
|
||||
return [[[self alloc] initWithIndex:anIndex] autorelease];
|
||||
return [[self alloc] initWithIndex:anIndex];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -64,7 +64,7 @@
|
||||
*/
|
||||
+ (id)indexSetWithIndexesInRange:(CPRange)aRange
|
||||
{
|
||||
return [[[self alloc] initWithIndexesInRange:aRange] autorelease];
|
||||
return [[self alloc] initWithIndexesInRange:aRange];
|
||||
}
|
||||
|
||||
// Initializing and Index Set
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
*/
|
||||
+ (id)invocationWithMethodSignature:(CPMethodSignature)aMethodSignature
|
||||
{
|
||||
return [[[self alloc] initWithMethodSignature:aMethodSignature] autorelease];
|
||||
return [[self alloc] initWithMethodSignature:aMethodSignature];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -56,7 +56,7 @@ CPJSONPCallbackReplacementString = @"${JSONP_CALLBACK}";
|
||||
|
||||
+ (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
|
||||
|
||||
@@ -277,14 +277,5 @@ CPUnknownUserInfoKey = @"CPUnknownUserInfoKey";
|
||||
|
||||
@end
|
||||
|
||||
@implementation CPNull (KeyValueCoding)
|
||||
|
||||
- (id)valueForKey:(CPString)aKey
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@import "CPKeyValueObserving.j"
|
||||
@import "CPArray+KVO.j"
|
||||
|
||||
@@ -148,7 +148,7 @@ var _CPKeyedArchiverStringClass = Nil,
|
||||
+ (CPData)archivedDataWithRootObject:(id)anObject
|
||||
{
|
||||
var data = [CPData dataWithPlistObject:nil],
|
||||
archiver = [[[self alloc] initForWritingWithMutableData:data] autorelease];
|
||||
archiver = [[self alloc] initForWritingWithMutableData:data];
|
||||
|
||||
[archiver encodeObject:anObject forKey:@"root"];
|
||||
[archiver finishEncoding];
|
||||
|
||||
@@ -163,15 +163,9 @@ var CPArrayClass = Ni
|
||||
@param data the data from which to read the graph
|
||||
@return the unarchived object
|
||||
*/
|
||||
+ (id)unarchiveObjectWithData:(CPData)aData
|
||||
+ (id)unarchiveObjectWithData:(CPData)data
|
||||
{
|
||||
if (!aData)
|
||||
{
|
||||
CPLog.error("Null data passed to -[CPKeyedUnarchiver unarchiveObjectWithData:].");
|
||||
return nil;
|
||||
}
|
||||
|
||||
var unarchiver = [[[self alloc] initForReadingWithData:aData] autorelease],
|
||||
var unarchiver = [[self alloc] initForReadingWithData:data],
|
||||
object = [unarchiver decodeObjectForKey:@"root"];
|
||||
|
||||
[unarchiver finishDecoding];
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
*/
|
||||
+ (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
|
||||
{
|
||||
return [[[self alloc] initWithName:aNotificationName object:anObject userInfo:nil] autorelease];
|
||||
return [[self alloc] initWithName:aNotificationName object:anObject userInfo:nil];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -333,7 +333,4 @@ FIXME: Do we need this?
|
||||
|
||||
Number.prototype.isa = CPNumber;
|
||||
Boolean.prototype.isa = CPNumber;
|
||||
Number.prototype._retainCount = Infinity;
|
||||
Boolean.prototype._retainCount = Infinity;
|
||||
|
||||
[CPNumber initialize];
|
||||
|
||||
@@ -89,6 +89,7 @@ CPLog(@"Got some class: %@", inst);
|
||||
*/
|
||||
+ (id)alloc
|
||||
{
|
||||
// CPLog("calling alloc on " + self.name + ".");
|
||||
return class_createInstance(self);
|
||||
}
|
||||
|
||||
@@ -129,7 +130,6 @@ CPLog(@"Got some class: %@", inst);
|
||||
*/
|
||||
- (void)dealloc
|
||||
{
|
||||
delete OBJJ_MEMORY_TABLE[[self UID]];
|
||||
}
|
||||
|
||||
// Identifying classes
|
||||
@@ -464,7 +464,6 @@ CPLog(@"Got some class: %@", inst);
|
||||
*/
|
||||
- (id)autorelease
|
||||
{
|
||||
[CPAutoreleasePool addObject:self];
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -499,7 +498,6 @@ CPLog(@"Got some class: %@", inst);
|
||||
*/
|
||||
- (id)retain
|
||||
{
|
||||
_retainCount++;
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -508,11 +506,6 @@ CPLog(@"Got some class: %@", inst);
|
||||
*/
|
||||
- (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
|
||||
return String(this) + " (-description not implemented)";
|
||||
}
|
||||
|
||||
@import "CPAutoreleasePool.j"
|
||||
|
||||
@@ -73,7 +73,7 @@ var _CPRunLoopPerformPool = [],
|
||||
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
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
*/
|
||||
+ (id)set
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
return [[self alloc] init];
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -54,7 +54,7 @@
|
||||
*/
|
||||
+ (id)setWithArray:(CPArray)array
|
||||
{
|
||||
return [[[self alloc] initWithArray:array] autorelease];
|
||||
return [[self alloc] initWithArray:array];
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -63,7 +63,7 @@
|
||||
*/
|
||||
+ (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
|
||||
{
|
||||
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)
|
||||
[set addObject:argument];
|
||||
|
||||
return [set autorelease];
|
||||
return set;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -99,7 +99,7 @@
|
||||
*/
|
||||
+ (id)setWithSet:(CPSet)set
|
||||
{
|
||||
return [[[self alloc] initWithSet:set] autorelease];
|
||||
return [[self alloc] initWithSet:set];
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -78,7 +78,7 @@ CPOrderedDescending = 1;
|
||||
|
||||
+ (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];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -664,9 +664,6 @@ var CPStringRegexSpecialCharacters = [
|
||||
*/
|
||||
- (CPString)pathExtension
|
||||
{
|
||||
if (lastIndexOf('.') === CPNotFound)
|
||||
return "";
|
||||
|
||||
return substr(lastIndexOf('.') + 1);
|
||||
}
|
||||
|
||||
@@ -702,21 +699,6 @@ var CPStringRegexSpecialCharacters = [
|
||||
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
|
||||
{
|
||||
return objj_standardize_path(self);
|
||||
@@ -769,4 +751,3 @@ var CPStringRegexSpecialCharacters = [
|
||||
@end
|
||||
|
||||
String.prototype.isa = CPString;
|
||||
String.prototype._retainCount = Infinity;
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
*/
|
||||
+ (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
|
||||
[[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
|
||||
{
|
||||
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
|
||||
[[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
|
||||
@@ -74,7 +74,7 @@
|
||||
*/
|
||||
+ (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
|
||||
[[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
|
||||
@@ -87,7 +87,7 @@
|
||||
*/
|
||||
+ (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
|
||||
{
|
||||
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
|
||||
{
|
||||
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];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -55,7 +55,7 @@ CPURLCustomIconKey = @"CPURLCustomIconKey";
|
||||
|
||||
+ (id)URLWithString:(CPString)URLString
|
||||
{
|
||||
return [[[self alloc] initWithString:URLString] autorelease];
|
||||
return [[self alloc] initWithString:URLString];
|
||||
}
|
||||
|
||||
- (id)initWithString:(CPString)URLString relativeToURL:(CPURL)aBaseURL
|
||||
|
||||
@@ -128,7 +128,7 @@ var CPURLConnectionDelegate = nil;
|
||||
*/
|
||||
+ (CPURLConnection)connectionWithRequest:(CPURLRequest)aRequest delegate:(id)aDelegate
|
||||
{
|
||||
return [[[self alloc] initWithRequest:aRequest delegate:aDelegate] autorelease];
|
||||
return [[self alloc] initWithRequest:aRequest delegate:aDelegate];
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
*/
|
||||
+ (id)requestWithURL:(CPURL)aURL
|
||||
{
|
||||
return [[[CPURLRequest alloc] initWithURL:aURL] autorelease];
|
||||
return [[CPURLRequest alloc] initWithURL:aURL];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -71,7 +71,7 @@ var _CPUndoGroupingPool = [],
|
||||
return grouping;
|
||||
}
|
||||
|
||||
return [[[self alloc] initWithParent:anUndoGrouping] autorelease];
|
||||
return [[self alloc] initWithParent:anUndoGrouping];
|
||||
}
|
||||
|
||||
- (id)initWithParent:(_CPUndoGrouping)anUndoGrouping
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
*/
|
||||
+ (id)valueWithJSObject:(JSObject)aJSObject
|
||||
{
|
||||
return [[[self alloc] initWithJSObject:aJSObject] autorelease];
|
||||
return [[self alloc] initWithJSObject:aJSObject];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
@import "CPAutoreleasePool.j"
|
||||
@import "CPArray.j"
|
||||
@import "CPBundle.j"
|
||||
@import "CPCoder.j"
|
||||
|
||||
@@ -247,7 +247,7 @@ task ("demos", function()
|
||||
|
||||
// Testing
|
||||
|
||||
task("test", ["CommonJS", "test-only"]);
|
||||
task("test", ["build", "test-only"]);
|
||||
|
||||
task("test-only", function()
|
||||
{
|
||||
|
||||
@@ -57,10 +57,6 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL)
|
||||
this._infoDictionary = new CFDictionary();
|
||||
|
||||
this._eventDispatcher = new EventDispatcher(this);
|
||||
|
||||
this._UID = objj_generateObjectUID();
|
||||
this._retainCount = 1;
|
||||
OBJJ_MEMORY_TABLE[this._UID] = this;
|
||||
}
|
||||
|
||||
DISPLAY_NAME(CFBundle);
|
||||
|
||||
@@ -31,10 +31,6 @@ GLOBAL(CFData) = function()
|
||||
|
||||
this._bytes = NULL;
|
||||
this._base64 = NULL;
|
||||
|
||||
this._UID = objj_generateObjectUID();
|
||||
this._retainCount = 1;
|
||||
OBJJ_MEMORY_TABLE[this._UID] = this;
|
||||
}
|
||||
|
||||
CFData.prototype.propertyList = function()
|
||||
|
||||
@@ -26,8 +26,6 @@ GLOBAL(CFDictionary) = function(/*CFDictionary*/ aDictionary)
|
||||
this._count = 0;
|
||||
this._buckets = { };
|
||||
this._UID = objj_generateObjectUID();
|
||||
this._retainCount = 1;
|
||||
OBJJ_MEMORY_TABLE[this._UID] = this;
|
||||
}
|
||||
|
||||
var indexOf = Array.prototype.indexOf,
|
||||
|
||||
@@ -199,8 +199,6 @@ GLOBAL(CFURL) = function(/*CFURL|String*/ aURL, /*CFURL*/ aBaseURL)
|
||||
}
|
||||
|
||||
this._UID = objj_generateObjectUID();
|
||||
this._retainCount = 1;
|
||||
OBJJ_MEMORY_TABLE[this._UID] = this;
|
||||
|
||||
this._string = aURL;
|
||||
this._baseURL = aBaseURL;
|
||||
@@ -316,7 +314,7 @@ function resolveURL(aURL)
|
||||
resolvedPathComponents.splice(basePathComponents.length - 1, 1);
|
||||
|
||||
// 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);
|
||||
|
||||
resolvedParts.pathComponents = resolvedPathComponents;
|
||||
@@ -354,26 +352,19 @@ function standardizePathComponents(/*Array*/ pathComponents, /*BOOL*/ inPlace)
|
||||
var index = 0,
|
||||
resultIndex = 0,
|
||||
count = pathComponents.length,
|
||||
result = inPlace ? pathComponents : [],
|
||||
startsWithPeriod = NO;
|
||||
result = inPlace ? pathComponents : [];
|
||||
|
||||
for (; index < count; ++index)
|
||||
{
|
||||
var component = pathComponents[index];
|
||||
|
||||
if (component === "")
|
||||
if (component === "" || component === ".")
|
||||
continue;
|
||||
|
||||
if (component === ".")
|
||||
{
|
||||
startsWithPeriod = resultIndex === 0;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (component !== ".." || resultIndex === 0 || result[resultIndex - 1] === "..")
|
||||
{
|
||||
result[resultIndex] = component;
|
||||
//if (resultIndex !== index)
|
||||
result[resultIndex] = component;
|
||||
|
||||
resultIndex++;
|
||||
|
||||
@@ -384,9 +375,6 @@ function standardizePathComponents(/*Array*/ pathComponents, /*BOOL*/ inPlace)
|
||||
--resultIndex;
|
||||
}
|
||||
|
||||
if (startsWithPeriod && resultIndex === 0)
|
||||
result[resultIndex++] = ".";
|
||||
|
||||
result.length = resultIndex;
|
||||
|
||||
return result;
|
||||
@@ -517,11 +505,10 @@ CFURL.prototype.hasDirectoryPath = function()
|
||||
var lastPathComponent = this.lastPathComponent();
|
||||
|
||||
hasDirectoryPath = lastPathComponent === "." || lastPathComponent === "..";
|
||||
|
||||
this._hasDirectoryPath = hasDirectoryPath;
|
||||
}
|
||||
|
||||
return hasDirectoryPath;
|
||||
return this._hasDirectoryPath;
|
||||
}
|
||||
|
||||
DISPLAY_NAME(CFURL.prototype.hasDirectoryPath);
|
||||
@@ -659,14 +646,7 @@ CFURL.prototype.asDirectoryPathURL = function()
|
||||
if (this.hasDirectoryPath())
|
||||
return this;
|
||||
|
||||
var lastPathComponent = this.lastPathComponent();
|
||||
|
||||
// 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);
|
||||
return new CFURL(this.lastPathComponent() + "/", this);
|
||||
}
|
||||
|
||||
DISPLAY_NAME(CFURL.prototype.asDirectoryPathURL);
|
||||
|
||||
@@ -357,10 +357,3 @@ function _CPLogInitPopup(logWindow)
|
||||
}, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if COMMONJS
|
||||
CPLogDefault = CPLogPrint;
|
||||
#else
|
||||
CPLogDefault = (typeof window === "object" && window.console) ? CPLogConsole : CPLogPopup;
|
||||
#endif
|
||||
|
||||
@@ -16,7 +16,8 @@ var Task = Jake.Task,
|
||||
|
||||
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)
|
||||
@@ -349,6 +350,11 @@ BundleTask.prototype.packageType = function()
|
||||
return 1;
|
||||
}
|
||||
|
||||
function isDataResource(aFilename)
|
||||
{
|
||||
return FILE.isFile(aFilename) && isImage(aFilename);
|
||||
}
|
||||
|
||||
BundleTask.prototype.infoPlist = function()
|
||||
{
|
||||
var infoPlistPath = this.infoPlistPath();
|
||||
@@ -373,7 +379,7 @@ BundleTask.prototype.infoPlist = function()
|
||||
var environmentsWithImageSprites = this.environments().filter(
|
||||
function(anEnvironment)
|
||||
{
|
||||
return anEnvironment.spritesImages() && task(this.buildProductDataURLPathForEnvironment(anEnvironment)).prerequisites().filter(isImage).length > 0;
|
||||
return anEnvironment.spritesImages() && task(this.buildProductDataURLPathForEnvironment(anEnvironment)).prerequisites().filter(isDataResource).length > 0;
|
||||
}, this).map(function(anEnvironment)
|
||||
{
|
||||
return anEnvironment.name();
|
||||
@@ -601,7 +607,7 @@ BundleTask.prototype.defineSpritedImagesTask = function()
|
||||
|
||||
filedir (dataURLPath, function(aTask)
|
||||
{
|
||||
var prerequisites = aTask.prerequisites().filter(isImage);
|
||||
var prerequisites = aTask.prerequisites().filter(isDataResource);
|
||||
|
||||
if (!prerequisites.length)
|
||||
{
|
||||
@@ -639,7 +645,7 @@ BundleTask.prototype.defineSpritedImagesTask = function()
|
||||
|
||||
filedir (MHTMLPath, function(aTask)
|
||||
{
|
||||
var prerequisites = aTask.prerequisites().filter(isImage);
|
||||
var prerequisites = aTask.prerequisites().filter(isDataResource);
|
||||
|
||||
if (!prerequisites.length)
|
||||
{
|
||||
@@ -673,7 +679,7 @@ BundleTask.prototype.defineSpritedImagesTask = function()
|
||||
|
||||
filedir (MHTMLDataPath, function(aTask)
|
||||
{
|
||||
var prerequisites = aTask.prerequisites().filter(isImage);
|
||||
var prerequisites = aTask.prerequisites().filter(isDataResource);
|
||||
|
||||
if (!prerequisites.length)
|
||||
{
|
||||
|
||||
@@ -73,8 +73,3 @@ GLOBAL(PI_2) = Math.PI / 2.0;
|
||||
|
||||
GLOBAL(SQRT1_2) = Math.SQRT1_2;
|
||||
GLOBAL(SQRT2) = Math.SQRT2;
|
||||
|
||||
GLOBAL(OBJJ_MEMORY_TABLE) = [];
|
||||
|
||||
GLOBAL($) = function(pointer) { return OBJJ_MEMORY_TABLE[pointer]; }
|
||||
GLOBAL($$) = function(object) { return object._UID; }
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
CPLogRegister(CPLogDefault);
|
||||
|
||||
// formatting helpers
|
||||
|
||||
function objj_debug_object_format(aReceiver)
|
||||
@@ -217,6 +215,3 @@ GLOBAL(objj_debug_typecheck) = function(expectedType, object)
|
||||
|
||||
throw ("expected=" + expectedType + ", actual=" + actualType);
|
||||
}
|
||||
|
||||
if (typeof window.OBJJ_ZOMBIE_DETECTION === "undefined")
|
||||
OBJJ_ZOMBIE_DETECTION = false;
|
||||
|
||||
@@ -171,43 +171,9 @@ var Preprocessor = function(/*String*/ aString, /*CFURL|String*/ aURL, /*unsigne
|
||||
this._classMethod = false;
|
||||
this._executable = NULL;
|
||||
|
||||
this._classLookupTable = {};
|
||||
|
||||
this._classVars = {};
|
||||
|
||||
var classObject = new objj_class();
|
||||
for (var i in classObject)
|
||||
this._classVars[i] = 1;
|
||||
|
||||
this.preprocess(this._tokens, this._buffer);
|
||||
}
|
||||
|
||||
Preprocessor.prototype.setClassInfo = function(className, superClassName, ivars)
|
||||
{
|
||||
this._classLookupTable[className] = {superClassName:superClassName, ivars:ivars};
|
||||
}
|
||||
|
||||
Preprocessor.prototype.getClassInfo = function(className)
|
||||
{
|
||||
return this._classLookupTable[className];
|
||||
}
|
||||
|
||||
Preprocessor.prototype.allIvarNamesForClassName = function(className)
|
||||
{
|
||||
var names = {},
|
||||
classInfo = this.getClassInfo(className);
|
||||
|
||||
while (classInfo)
|
||||
{
|
||||
for (var i in classInfo.ivars)
|
||||
names[i] = 1;
|
||||
|
||||
classInfo = this.getClassInfo(classInfo.superClassName);
|
||||
}
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
exports.Preprocessor = Preprocessor;
|
||||
|
||||
Preprocessor.Flags = { };
|
||||
@@ -418,9 +384,9 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
// If we are at an opening curly brace ('{'), then we have an ivar declaration.
|
||||
if (token == TOKEN_OPEN_BRACE)
|
||||
{
|
||||
var ivar_names = {},
|
||||
ivar_count = 0,
|
||||
var ivar_count = 0,
|
||||
declaration = [],
|
||||
|
||||
attributes,
|
||||
accessors = {};
|
||||
|
||||
@@ -436,16 +402,15 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
}
|
||||
else if (token == TOKEN_SEMICOLON)
|
||||
{
|
||||
if (ivar_count++ === 0)
|
||||
if (ivar_count++ == 0)
|
||||
CONCAT(buffer, "class_addIvars(the_class, [");
|
||||
else
|
||||
CONCAT(buffer, ", ");
|
||||
|
||||
|
||||
var name = declaration[declaration.length - 1];
|
||||
|
||||
|
||||
CONCAT(buffer, "new objj_ivar(\"" + name + "\")");
|
||||
|
||||
ivar_names[name] = 1;
|
||||
declaration = [];
|
||||
|
||||
if (attributes)
|
||||
@@ -457,7 +422,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
else
|
||||
declaration.push(token);
|
||||
}
|
||||
|
||||
|
||||
// If we have objects in our declaration, the user forgot a ';'.
|
||||
if (declaration.length)
|
||||
throw new SyntaxError(this.error_message("*** Expected ';' in ivar declaration, found '}'."));
|
||||
@@ -468,11 +433,6 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
if (!token)
|
||||
throw new SyntaxError(this.error_message("*** Expected '}'"));
|
||||
|
||||
this.setClassInfo(class_name, superclass_name === "Nil" ? null : superclass_name, ivar_names);
|
||||
|
||||
// build up the list of illegal method param names
|
||||
var ivar_names = this.allIvarNamesForClassName(class_name);
|
||||
|
||||
for (ivar_name in accessors)
|
||||
{
|
||||
var accessor = accessors[ivar_name],
|
||||
@@ -485,7 +445,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
if (IS_NOT_EMPTY(instance_methods))
|
||||
CONCAT(instance_methods, ",\n");
|
||||
|
||||
CONCAT(instance_methods, this.method(new Lexer(getterCode), ivar_names));
|
||||
CONCAT(instance_methods, this.method(new Lexer(getterCode)));
|
||||
|
||||
// setter
|
||||
if (accessor["readonly"])
|
||||
@@ -509,7 +469,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
if (IS_NOT_EMPTY(instance_methods))
|
||||
CONCAT(instance_methods, ",\n");
|
||||
|
||||
CONCAT(instance_methods, this.method(new Lexer(setterCode), ivar_names));
|
||||
CONCAT(instance_methods, this.method(new Lexer(setterCode)));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -518,10 +478,7 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
// We must make a new class object for our class definition.
|
||||
CONCAT(buffer, "objj_registerClassPair(the_class);\n");
|
||||
}
|
||||
|
||||
if (!ivar_names)
|
||||
var ivar_names = this.allIvarNamesForClassName(class_name);
|
||||
|
||||
|
||||
while ((token = tokens.skip_whitespace()))
|
||||
{
|
||||
if (token == TOKEN_PLUS)
|
||||
@@ -530,9 +487,10 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
|
||||
if (IS_NOT_EMPTY(class_methods))
|
||||
CONCAT(class_methods, ", ");
|
||||
|
||||
CONCAT(class_methods, this.method(tokens, this._classVars));
|
||||
|
||||
CONCAT(class_methods, this.method(tokens));
|
||||
}
|
||||
|
||||
else if (token == TOKEN_MINUS)
|
||||
{
|
||||
this._classMethod = false;
|
||||
@@ -540,19 +498,19 @@ Preprocessor.prototype.implementation = function(tokens, /*StringBuffer*/ aStrin
|
||||
if (IS_NOT_EMPTY(instance_methods))
|
||||
CONCAT(instance_methods, ", ");
|
||||
|
||||
CONCAT(instance_methods, this.method(tokens, ivar_names));
|
||||
CONCAT(instance_methods, this.method(tokens));
|
||||
}
|
||||
|
||||
// Check if we've reached @end...
|
||||
else if (token == TOKEN_PREPROCESSOR)
|
||||
{
|
||||
// The only preprocessor directive we should ever encounter at this point is @end.
|
||||
if ((token = tokens.next()) == TOKEN_END)
|
||||
break;
|
||||
|
||||
else
|
||||
throw new SyntaxError(this.error_message("*** Expected \"@end\", found \"@" + token + "\"."));
|
||||
}
|
||||
//else
|
||||
// throw new SyntaxError(this.error_message("*** Expected a method declaration, or \"@end\", found \"" + token + "\"."));
|
||||
}
|
||||
|
||||
if (IS_NOT_EMPTY(instance_methods))
|
||||
@@ -602,17 +560,15 @@ Preprocessor.prototype._import = function(tokens)
|
||||
this._dependencies.push(new FileDependency(new CFURL(URLString), isQuoted));
|
||||
}
|
||||
|
||||
Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
|
||||
Preprocessor.prototype.method = function(/*Lexer*/ tokens)
|
||||
{
|
||||
var buffer = new StringBuffer(),
|
||||
token,
|
||||
selector = "",
|
||||
parameters = [],
|
||||
types = [null];
|
||||
|
||||
ivar_names = ivar_names || {};
|
||||
|
||||
while((token = tokens.skip_whitespace()) && token !== TOKEN_OPEN_BRACE && token !== TOKEN_SEMICOLON)
|
||||
|
||||
while((token = tokens.skip_whitespace()) && token != TOKEN_OPEN_BRACE)
|
||||
{
|
||||
if (token == TOKEN_COLON)
|
||||
{
|
||||
@@ -637,10 +593,8 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
|
||||
|
||||
// Since this follows a colon, this must be the parameter name.
|
||||
parameters[parameters.length] = token;
|
||||
|
||||
if (token in ivar_names)
|
||||
throw new SyntaxError(this.error_message("*** Method ( "+selector+" ) uses a parameter name that is already in use ( "+token+" )"));
|
||||
}
|
||||
|
||||
else if (token == TOKEN_OPEN_PARENTHESIS)
|
||||
{
|
||||
var type = "";
|
||||
@@ -652,6 +606,7 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
|
||||
// types[0] is the return argument
|
||||
types[0] = type || null;
|
||||
}
|
||||
|
||||
// Argument list ", ..."
|
||||
else if (token == TOKEN_COMMA)
|
||||
{
|
||||
@@ -661,21 +616,12 @@ Preprocessor.prototype.method = function(/*Lexer*/ tokens, ivar_names)
|
||||
|
||||
// FIXME: Shouldn't allow any more after this.
|
||||
}
|
||||
|
||||
// Build selector name.
|
||||
else
|
||||
selector += token;
|
||||
}
|
||||
|
||||
if (token === TOKEN_SEMICOLON)
|
||||
{
|
||||
token = tokens.skip_whitespace();
|
||||
if (token !== TOKEN_OPEN_BRACE)
|
||||
{
|
||||
throw new SyntaxError(this.error_message("Invalid semi-colon in method declaration. "+
|
||||
"Semi-colons are allowed only to terminate the method signature, before the open brace."));
|
||||
}
|
||||
}
|
||||
|
||||
var index = 0,
|
||||
count = parameters.length;
|
||||
|
||||
|
||||
@@ -392,8 +392,6 @@ GLOBAL(class_createInstance) = function(/*Class*/ aClass)
|
||||
|
||||
object.isa = aClass;
|
||||
object._UID = objj_generateObjectUID();
|
||||
object._retainCount = 1;
|
||||
OBJJ_MEMORY_TABLE[object._UID] = object;
|
||||
|
||||
return object;
|
||||
}
|
||||
@@ -516,9 +514,6 @@ GLOBAL(objj_msgSend) = function(/*id*/ aReceiver, /*SEL*/ aSelector)
|
||||
if (aReceiver == nil)
|
||||
return nil;
|
||||
|
||||
if (OBJJ_ZOMBIE_DETECTION && typeof aReceiver._retainCount !== "undefined" && aReceiver._retainCount < 1 && $($$(aReceiver)) !== aReceiver)
|
||||
throw ("Sending a message to a zombie object: "+$$(aReceiver));
|
||||
|
||||
var isa = aReceiver.isa;
|
||||
|
||||
CLASS_GET_METHOD_IMPLEMENTATION(var implementation, isa, aSelector);
|
||||
|
||||
@@ -143,14 +143,8 @@ StaticResource.resourceAtURL = function(/*CFURL|String*/ aURL, /*BOOL*/ resolveA
|
||||
resource = resource._children[name];
|
||||
|
||||
else if (resolveAsDirectoriesIfNecessary)
|
||||
{
|
||||
// We do this because on Windows the path may start with C: and be
|
||||
// misinterpreted as a scheme.
|
||||
if (name !== "/")
|
||||
name = "./" + name;
|
||||
|
||||
resource = new StaticResource(new CFURL(name, resource.URL()), resource, YES, YES);
|
||||
}
|
||||
|
||||
else
|
||||
throw new Error("Static Resource at " + aURL + " is not resolved (\"" + name + "\")");
|
||||
}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
|
||||
@import <AppKit/CPView.j>
|
||||
@import <AppKit/CPApplication.j>
|
||||
|
||||
[CPApplication sharedApplication]
|
||||
|
||||
@implementation CPViewTest : OJTestCase
|
||||
{
|
||||
CPView view;
|
||||
}
|
||||
|
||||
- (void)setUp
|
||||
{
|
||||
view = [[CPView alloc] initWithFrame:CGRectMakeZero()];
|
||||
[super setUp];
|
||||
}
|
||||
|
||||
- (void)testCanCreate
|
||||
{
|
||||
[self assertTrue:!!view];
|
||||
}
|
||||
|
||||
/*
|
||||
During the layout process for the view, _CPImageAndTextView.j throws
|
||||
a ReferenceError with the following:
|
||||
|
||||
"hasDOMImageElement" is not defined
|
||||
|
||||
The referenced variable is #if PLATFORM(DOM) excluded in all other
|
||||
instances. While not isolated to the behaviour of a CPView alone, the
|
||||
following test ensures that pending actions in the _CPDisplayServer can
|
||||
be flushed without touching unimplemented portions of the test platform
|
||||
(e.g. the DOM). There are times where we want to confirm that some setting
|
||||
requiring relayout (e.g. string truncation based on available space), the
|
||||
following test should help ensure those types of tests are safe to carry
|
||||
out with ojunit.
|
||||
|
||||
Demonstrates issue #562.
|
||||
*/
|
||||
- (void)testCanFlushPendingLayoutWork
|
||||
{
|
||||
[self assert:undefined same:[_CPDisplayServer run]];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -63,14 +63,12 @@
|
||||
- (void)testDescription
|
||||
{
|
||||
// Unfortunately the result will be different depending on the testing machine's timezone.
|
||||
var date = [CPDate dateWithTimeIntervalSince1970: 1234567890],
|
||||
expectedHour = 23,
|
||||
expectedMinute = 31,
|
||||
offsetHours = Math.floor(date.getTimezoneOffset() / 60),
|
||||
offsetMinutes = date.getTimezoneOffset() - offsetHours * 60,
|
||||
expectedString = [CPString stringWithFormat:"2009-02-13 %02d:%02d:30 +%02d%02d", expectedHour-offsetHours, expectedMinute-offsetMinutes, offsetHours, offsetMinutes];
|
||||
|
||||
[self assert:expectedString equals:[date description]];
|
||||
var expectedHour = 23
|
||||
var expectedMinute = 31;
|
||||
var offsetHours = Math.floor(new Date().getTimezoneOffset() / 60);
|
||||
var offsetMinutes = new Date().getTimezoneOffset() - offsetHours * 60;
|
||||
var expectedString = [CPString stringWithFormat:"2009-02-13 %02d:%02d:30 +%02d%02d", expectedHour-offsetHours, expectedMinute-offsetMinutes, offsetHours, offsetMinutes];
|
||||
[self assert:expectedString equals: [[CPDate dateWithTimeIntervalSince1970: 1234567890] description]];
|
||||
}
|
||||
|
||||
- (void)testCopy
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
* CPKeyValueCodingTest.j
|
||||
* Foundation
|
||||
*
|
||||
* Created by Alexander Ljungberg.
|
||||
* Copyright 2010, WireLoad, LLC.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
@implementation CPKeyValueCodingTest : OJTestCase
|
||||
{
|
||||
}
|
||||
|
||||
- (void)testCPNull
|
||||
{
|
||||
var nullObject = [CPNull null];
|
||||
[self assert:[CPNull null] equals:[nullObject valueForKey:@"a"] message:@"CPNull valueForKey:X returns nil"];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -259,35 +259,6 @@
|
||||
[self assert:testStrings[i][1] equals:[testStrings[i][0] lastPathComponent]];
|
||||
}
|
||||
|
||||
- (void)testPathExtension
|
||||
{
|
||||
var testStrings = [
|
||||
["/tmp/scratch.tiff", "tiff"],
|
||||
["scratch.png", "png"],
|
||||
["/tmp/scratch..tiff", "tiff"],
|
||||
["/tmp", ""],
|
||||
["scratch", ""],
|
||||
];
|
||||
|
||||
for (var i = 0; i < testStrings.length; i++)
|
||||
[self assert:testStrings[i][1] equals:[testStrings[i][0] pathExtension]];
|
||||
}
|
||||
|
||||
- (void)testStringByDeletingPathExtension
|
||||
{
|
||||
var testStrings = [
|
||||
["/tmp/scratch.tiff", "/tmp/scratch"],
|
||||
["scratch.png", "scratch"],
|
||||
["/tmp/scratch..tiff", "/tmp/scratch."],
|
||||
["/tmp", "/tmp"],
|
||||
[".tiff", ".tiff"],
|
||||
["/", "/"],
|
||||
];
|
||||
|
||||
for (var i = 0; i < testStrings.length; i++)
|
||||
[self assert:testStrings[i][1] equals:[testStrings[i][0] stringByDeletingPathExtension]];
|
||||
}
|
||||
|
||||
- (void)testHasPrefix
|
||||
{
|
||||
[self assertTrue: ["abc" hasPrefix:"a"]];
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
* AppController.j
|
||||
* CPBrowserTest
|
||||
*
|
||||
* Created by Ross Boucher on March 23, 2010.
|
||||
* Copyright 2010, Your Company All rights reserved.
|
||||
*/
|
||||
|
||||
@import <Foundation/CPObject.j>
|
||||
@import <AppKit/CPBrowser.j>
|
||||
|
||||
@implementation Node : CPObject
|
||||
{
|
||||
id value;
|
||||
}
|
||||
|
||||
+ (id)withValue:(id)aValue
|
||||
{
|
||||
var a = [[self alloc] init];
|
||||
a.value = aValue;
|
||||
return a;
|
||||
}
|
||||
|
||||
- (id)value
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
- (CPArray)children
|
||||
{
|
||||
return [[Node withValue:1],
|
||||
[Node withValue:2],
|
||||
[Node withValue:3],
|
||||
[Node withValue:4]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation AppController : CPObject
|
||||
{
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||
{
|
||||
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
|
||||
contentView = [theWindow contentView];
|
||||
|
||||
var box = [[CPBox alloc] initWithFrame:CGRectMake(0,0,500,300)];
|
||||
browser = [[CPBrowser alloc] initWithFrame:CGRectMake(0,0,500,300)];
|
||||
|
||||
[browser setWidth:300 ofColumn:1];
|
||||
[box setContentView:browser];
|
||||
[box setBorderType:CPBezelBorder];
|
||||
[box setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
|
||||
[box setCenter:[contentView center]];
|
||||
[contentView addSubview:box];
|
||||
|
||||
[theWindow orderFront:self];
|
||||
|
||||
[browser setDelegate:self];
|
||||
|
||||
[browser setTarget:self];
|
||||
[browser setAction:@selector(browserClicked:)];
|
||||
[browser setDoubleAction:@selector(dblClicked:)];
|
||||
[browser registerForDraggedTypes:["Type"]];
|
||||
|
||||
//[browser setAllowsMultipleSelection:NO];
|
||||
}
|
||||
|
||||
- (BOOL)browser:(CPBrowser)aBrowser writeRowsWithIndexes:(CPIndexSet)indexes inColumn:(int)column toPasteboard:(CPPasteboard)pboard
|
||||
{
|
||||
var encodedData = [CPKeyedArchiver archivedDataWithRootObject:"Foo"];
|
||||
[pboard declareTypes:["Type"] owner:self];
|
||||
[pboard setData:encodedData forType:"Type"];
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)browser:(id)aBrowser validateDrop:(id)info proposedRow:(int)row column:(int)column dropOperation:(id)op
|
||||
{
|
||||
return CPDragOperationMove;
|
||||
}
|
||||
- (BOOL)browser:(id)aBrowser acceptDrop:(id)info atRow:(int)row column:(int)column dropOperation:(id)op
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)browserClicked:(id)sender
|
||||
{
|
||||
console.log("selected column: "+[browser selectedColumn]+" row: "+[browser selectedRowInColumn:[browser selectedColumn]]);
|
||||
}
|
||||
|
||||
- (void)dblClicked:(id)sender
|
||||
{
|
||||
alert("DOUBLE");
|
||||
}
|
||||
|
||||
/*- (id)rootItemForBrowser:(id)aBrowser
|
||||
{
|
||||
return [Node withValue:0];
|
||||
}*/
|
||||
|
||||
- (id)browser:(id)aBrowser numberOfChildrenOfItem:(id)anItem
|
||||
{
|
||||
if (anItem === nil)
|
||||
return 4;
|
||||
return [[anItem children] count];
|
||||
}
|
||||
|
||||
- (id)browser:(id)aBrowser child:(int)index ofItem:(id)anItem
|
||||
{
|
||||
if (!anItem)
|
||||
return [[[Node withValue:0] children] objectAtIndex:index];
|
||||
|
||||
return [[anItem children] objectAtIndex:index];
|
||||
}
|
||||
|
||||
- (id)browser:(id)aBrowser imageValueForItem:(id)anItem
|
||||
{
|
||||
return [[CPImage alloc] initWithContentsOfFile:"http://cappuccino.org/images/favicon.png" size:CGSizeMake(16, 16)];
|
||||
}
|
||||
|
||||
- (id)browser:(id)aBrowser objectValueForItem:(id)anItem
|
||||
{
|
||||
return [anItem value];
|
||||
}
|
||||
|
||||
- (id)browser:(id)aBrowser isLeafItem:(id)anItem
|
||||
{
|
||||
return ![[anItem children] count] || [anItem value] === 4;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1 +0,0 @@
|
||||
../../../AppKit/CPBrowser.j
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CPApplicationDelegateClass</key>
|
||||
<string>AppController</string>
|
||||
<key>CPBundleName</key>
|
||||
<string>CPBrowserTest</string>
|
||||
<key>CPPrincipalClass</key>
|
||||
<string>CPApplication</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Jakefile
|
||||
* CPBrowserTest
|
||||
*
|
||||
* Created by Ross Boucher on March 23, 2010.
|
||||
* Copyright 2010, Your Company All rights reserved.
|
||||
*/
|
||||
|
||||
var ENV = require("system").env,
|
||||
FILE = require("file"),
|
||||
JAKE = require("jake"),
|
||||
task = JAKE.task,
|
||||
FileList = JAKE.FileList,
|
||||
app = require("cappuccino/jake").app,
|
||||
configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug",
|
||||
OS = require("os");
|
||||
|
||||
app ("CPBrowserTest", function(task)
|
||||
{
|
||||
task.setBuildIntermediatesPath(FILE.join("Build", "CPBrowserTest.build", configuration));
|
||||
task.setBuildPath(FILE.join("Build", configuration));
|
||||
|
||||
task.setProductName("CPBrowserTest");
|
||||
task.setIdentifier("com.yourcompany.CPBrowserTest");
|
||||
task.setVersion("1.0");
|
||||
task.setAuthor("Your Company");
|
||||
task.setEmail("feedback @nospam@ yourcompany.com");
|
||||
task.setSummary("CPBrowserTest");
|
||||
task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**")));
|
||||
task.setResources(new FileList("Resources/*"));
|
||||
task.setIndexFilePath("index.html");
|
||||
task.setInfoPlistPath("Info.plist");
|
||||
|
||||
if (configuration === "Debug")
|
||||
task.setCompilerFlags("-DDEBUG -g");
|
||||
else
|
||||
task.setCompilerFlags("-O");
|
||||
});
|
||||
|
||||
function printResults(configuration)
|
||||
{
|
||||
print("----------------------------");
|
||||
print(configuration+" app built at path: "+FILE.join("Build", configuration, "CPBrowserTest"));
|
||||
print("----------------------------");
|
||||
}
|
||||
|
||||
task ("default", ["CPBrowserTest"], function()
|
||||
{
|
||||
printResults(configuration);
|
||||
});
|
||||
|
||||
task ("build", ["default"]);
|
||||
|
||||
task ("debug", function()
|
||||
{
|
||||
ENV["CONFIGURATION"] = "Debug";
|
||||
JAKE.subjake(["."], "build", ENV);
|
||||
});
|
||||
|
||||
task ("release", function()
|
||||
{
|
||||
ENV["CONFIGURATION"] = "Release";
|
||||
JAKE.subjake(["."], "build", ENV);
|
||||
});
|
||||
|
||||
task ("run", ["debug"], function()
|
||||
{
|
||||
OS.system(["open", FILE.join("Build", "Debug", "CPBrowserTest", "index.html")]);
|
||||
});
|
||||
|
||||
task ("run-release", ["release"], function()
|
||||
{
|
||||
OS.system(["open", FILE.join("Build", "Release", "CPBrowserTest", "index.html")]);
|
||||
});
|
||||
|
||||
task ("deploy", ["release"], function()
|
||||
{
|
||||
FILE.mkdirs(FILE.join("Build", "Deployment", "CPBrowserTest"));
|
||||
OS.system(["press", "-f", FILE.join("Build", "Release", "CPBrowserTest"), FILE.join("Build", "Deployment", "CPBrowserTest")]);
|
||||
printResults("Deployment")
|
||||
});
|
||||
|
Before Width: | Height: | Size: 304 B |
|
Before Width: | Height: | Size: 321 B |
|
Before Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,86 +0,0 @@
|
||||
<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<!--
|
||||
index-debug.html
|
||||
CPBrowserTest
|
||||
|
||||
Created by Ross Boucher on March 23, 2010.
|
||||
Copyright 2010, Your Company All rights reserved.
|
||||
-->
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
|
||||
|
||||
<title>CPBrowserTest</title>
|
||||
|
||||
<script type="text/javascript">
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
OBJJ_INCLUDE_PATHS = ["Frameworks/Debug", "Frameworks", "SomethingElse"];
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Debug/Objective-J/Objective-J.js" type="text/javascript"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
objj_msgSend_reset();
|
||||
|
||||
// DEBUG OPTIONS:
|
||||
|
||||
// Uncomment to enable printing of backtraces on exceptions:
|
||||
//objj_msgSend_decorate(objj_backtrace_decorator);
|
||||
|
||||
// Uncomment to enable runtime type checking:
|
||||
//objj_msgSend_decorate(objj_typecheck_decorator);
|
||||
|
||||
// Uncomment (along with both above) to print backtraces on type check errors:
|
||||
//objj_typecheck_prints_backtrace = true;
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
#container {position: absolute; top:50%; left:50%;}
|
||||
#content {width:800px; text-align:center; margin-left: -400px; height:50px; margin-top:-25px; line-height: 50px;}
|
||||
#content {font-family: "Helvetica", "Arial", sans-serif; font-size: 18px; color: black; text-shadow: 0px 1px 0px white; }
|
||||
#loadgraphic {margin-right: 0.2em; margin-bottom:-2px;}
|
||||
</style>
|
||||
|
||||
<!--[if lt IE 7]>
|
||||
<STYLE type="text/css">
|
||||
#container { position: relative; top: 50%; }
|
||||
#content { position: relative;}
|
||||
</STYLE>
|
||||
<![endif]-->
|
||||
|
||||
</head>
|
||||
|
||||
<body style="">
|
||||
<div id="cappuccino-body">
|
||||
<div id="loadingcontainer" style="background-color: #eeeeee; overflow:hidden; width:100%; height:100%; position: absolute; top: 0; left: 0;">
|
||||
<script type = "text/javascript">
|
||||
document.write("<div id='container'><p id='content'>" +
|
||||
"<img id='loadgraphic' width='16' height='16' src='Resources/spinner.gif' /> " +
|
||||
"Loading CPBrowserTest...</p></div>");
|
||||
</script>
|
||||
|
||||
<noscript>
|
||||
<div id="container">
|
||||
<div style="width: 440px; padding: 10px 25px 20px 25px; font-family: sans-serif; background-color: #ffffff; position: relative; left: -245px; top: -120px; text-align: center; -moz-border-radius: 20px; -webkit-border-radius: 20px; color: #555555">
|
||||
<p style="line-height: 1.4em;">JavaScript is required for this site to work correctly but is either disabled or not supported by your browser.</p>
|
||||
<p style="font-size:120%; padding:10px;"><a href="http://cappuccino.org/noscript">Show me how to enable JavaScript</a></p>
|
||||
<p style="font-size:80%;">You may want to upgrade to a newer browser while you're at it:</p>
|
||||
<ul style="margin:0;padding:0; text-align: center; font-size:80%;" >
|
||||
<li style="display: inline;"><a href="http://www.apple.com/safari/download/">Safari</a></li>
|
||||
<li style="display: inline;"><a href="http://www.mozilla.com/en-US/firefox/">Firefox</a></li>
|
||||
<li style="display: inline;"><a href="http://www.google.com/chrome/">Chrome</a></li>
|
||||
<li style="display: inline;"><a href="http://www.opera.com/download/">Opera</a></li>
|
||||
<li style="display: inline;"><a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx">Internet Explorer</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</noscript>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,71 +0,0 @@
|
||||
<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<!--
|
||||
index.html
|
||||
CPBrowserTest
|
||||
|
||||
Created by Ross Boucher on March 23, 2010.
|
||||
Copyright 2010, Your Company All rights reserved.
|
||||
-->
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
|
||||
|
||||
<title>CPBrowserTest</title>
|
||||
|
||||
<script type="text/javascript">
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type = "text/javascript"></script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
#container {position: absolute; top:50%; left:50%;}
|
||||
#content {width:800px; text-align:center; margin-left: -400px; height:50px; margin-top:-25px; line-height: 50px;}
|
||||
#content {font-family: "Helvetica", "Arial", sans-serif; font-size: 18px; color: black; text-shadow: 0px 1px 0px white; }
|
||||
#loadgraphic {margin-right: 0.2em; margin-bottom:-2px;}
|
||||
</style>
|
||||
|
||||
<!--[if lt IE 7]>
|
||||
<STYLE type="text/css">
|
||||
#container { position: relative; top: 50%; }
|
||||
#content { position: relative;}
|
||||
</STYLE>
|
||||
<![endif]-->
|
||||
|
||||
</head>
|
||||
|
||||
<body style="">
|
||||
<div id="cappuccino-body">
|
||||
<div id="loadingcontainer" style="background-color: #eeeeee; overflow:hidden; width:100%; height:100%; position: absolute; top: 0; left: 0;">
|
||||
<script type = "text/javascript">
|
||||
document.write("<div id='container'><p id='content'>" +
|
||||
"<img id='loadgraphic' width='16' height='16' src='Resources/spinner.gif' /> " +
|
||||
"Loading CPBrowserTest...</p></div>");
|
||||
</script>
|
||||
|
||||
<noscript>
|
||||
<div id="container">
|
||||
<div style="width: 440px; padding: 10px 25px 20px 25px; font-family: sans-serif; background-color: #ffffff; position: relative; left: -245px; top: -120px; text-align: center; -moz-border-radius: 20px; -webkit-border-radius: 20px; color: #555555">
|
||||
<p style="line-height: 1.4em;">JavaScript is required for this site to work correctly but is either disabled or not supported by your browser.</p>
|
||||
<p style="font-size:120%; padding:10px;"><a href="http://cappuccino.org/noscript">Show me how to enable JavaScript</a></p>
|
||||
<p style="font-size:80%;">You may want to upgrade to a newer browser while you're at it:</p>
|
||||
<ul style="margin:0;padding:0; text-align: center; font-size:80%;" >
|
||||
<li style="display: inline;"><a href="http://www.apple.com/safari/download/">Safari</a></li>
|
||||
<li style="display: inline;"><a href="http://www.mozilla.com/en-US/firefox/">Firefox</a></li>
|
||||
<li style="display: inline;"><a href="http://www.google.com/chrome/">Chrome</a></li>
|
||||
<li style="display: inline;"><a href="http://www.opera.com/download/">Opera</a></li>
|
||||
<li style="display: inline;"><a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx">Internet Explorer</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</noscript>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
/*
|
||||
* AppController.j
|
||||
* CPBrowserTest
|
||||
*
|
||||
* Created by Ross Boucher on March 23, 2010.
|
||||
* Copyright 2010, Your Company All rights reserved.
|
||||
*/
|
||||
|
||||
@import <Foundation/Foundation.j>
|
||||
@import <AppKit/AppKit.j>
|
||||
|
||||
@import "AppController.j"
|
||||
|
||||
|
||||
function main(args, namedArgs)
|
||||
{
|
||||
CPApplicationMain(args, namedArgs);
|
||||
}
|
||||
@@ -60,33 +60,4 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testPeriods
|
||||
{
|
||||
var URLStrings =
|
||||
{
|
||||
"." : "./",
|
||||
"./" : "./",
|
||||
".//" : "./",
|
||||
"/." : "/",
|
||||
"/./" : "/",
|
||||
"/.//" : "/",
|
||||
"./a/" : "a/",
|
||||
"./a" : "a",
|
||||
".." : "../",
|
||||
"../" : "../",
|
||||
"..//" : "../",
|
||||
"/.." : "/",
|
||||
"/../" : "/",
|
||||
"/..//" : "/",
|
||||
"../a/" : "../a/",
|
||||
"../a" : "../a"
|
||||
};
|
||||
|
||||
var URLString;
|
||||
|
||||
for (URLString in URLStrings)
|
||||
if (URLStrings.hasOwnProperty(URLString))
|
||||
[self assert:new CFURL(URLString).absoluteString() equals:URLStrings[URLString]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -27,7 +27,7 @@ app ("__project.nameasidentifier__", function(task)
|
||||
task.setEmail("__organization.email__");
|
||||
task.setSummary("__project.name__");
|
||||
task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**")));
|
||||
task.setResources(new FileList("Resources/**"));
|
||||
task.setResources(new FileList("Resources/*"));
|
||||
task.setIndexFilePath("index.html");
|
||||
task.setInfoPlistPath("Info.plist");
|
||||
|
||||
|
||||
@@ -35,13 +35,6 @@
|
||||
|
||||
// Uncomment (along with both above) to print backtraces on type check errors:
|
||||
//objj_typecheck_prints_backtrace = true;
|
||||
|
||||
// Uncomment to disable the default logger (CPLogConsole if window.console exists, CPLogPopup otherwise):
|
||||
//CPLogUnregister(CPLogDefault);
|
||||
|
||||
// Uncomment to enable a specific logger:
|
||||
//CPLogRegister(CPLogConsole);
|
||||
//CPLogRegister(CPLogPopup);
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type="text/javascript"></script>
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type = "text/javascript"></script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
|
||||
@@ -27,7 +27,7 @@ app ("__project.nameasidentifier__", function(task)
|
||||
task.setEmail("__organization.email__");
|
||||
task.setSummary("__project.name__");
|
||||
task.setSources((new FileList("**/*.j")).exclude(FILE.join("Build", "**")));
|
||||
task.setResources(new FileList("Resources/**"));
|
||||
task.setResources(new FileList("Resources/*"));
|
||||
task.setIndexFilePath("index.html");
|
||||
task.setInfoPlistPath("Info.plist");
|
||||
task.setNib2CibFlags("-R Resources/");
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
OBJJ_INCLUDE_PATHS = ["Frameworks/Debug", "Frameworks", "SomethingElse"];
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Debug/Objective-J/Objective-J.js" type="text/javascript"></script>
|
||||
<script src="Frameworks/Debug/Objective-J/Objective-J.js" type = "text/javascript"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
objj_msgSend_reset();
|
||||
@@ -35,13 +35,6 @@
|
||||
|
||||
// Uncomment (along with both above) to print backtraces on type check errors:
|
||||
//objj_typecheck_prints_backtrace = true;
|
||||
|
||||
// Uncomment to disable the default logger (CPLogConsole if window.console exists, CPLogPopup otherwise):
|
||||
//CPLogUnregister(CPLogDefault);
|
||||
|
||||
// Uncomment to enable a specific logger:
|
||||
//CPLogRegister(CPLogConsole);
|
||||
//CPLogRegister(CPLogPopup);
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type="text/javascript"></script>
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type = "text/javascript"></script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
OBJJ_INCLUDE_PATHS = ["Frameworks/Debug", "Frameworks", "SomethingElse"];
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Debug/Objective-J/Objective-J.js" type="text/javascript"></script>
|
||||
<script src="Frameworks/Debug/Objective-J/Objective-J.js" type = "text/javascript"></script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
OBJJ_MAIN_FILE = "main.j";
|
||||
</script>
|
||||
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type="text/javascript"></script>
|
||||
<script src="Frameworks/Objective-J/Objective-J.js" type = "text/javascript"></script>
|
||||
|
||||
<style type="text/css">
|
||||
body{margin:0; padding:0;}
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
{
|
||||
self = [self NS_initWithCoder:aCoder];
|
||||
|
||||
[self _initWithFrame:[self frame]];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
self = [super NS_initWithCoder:aCoder];
|
||||
if (self)
|
||||
{
|
||||
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 23.0))]];
|
||||
|
||||
_frame.size.height = 23.0;
|
||||
_bounds.size.height = 23.0;
|
||||
}
|
||||
|
||||