mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 21:17:03 +00:00
281 lines
7.2 KiB
Plaintext
281 lines
7.2 KiB
Plaintext
/*
|
|
* AppController.j
|
|
* CPTableViewLionCibTest
|
|
*
|
|
* Created by You on March 8, 2012.
|
|
* Copyright 2012, Your Company All rights reserved.
|
|
*/
|
|
|
|
@import <Foundation/CPObject.j>
|
|
@import <AppKit/CPGraphicsContext.j>
|
|
|
|
var TABLE_DRAG_TYPE = @"TABLE_DRAG_TYPE";
|
|
|
|
CPLogRegister(CPLogConsole)
|
|
|
|
@implementation AppController : CPObject
|
|
{
|
|
CPWindow theWindow; //this "outlet" is connected automatically by the Cib
|
|
@outlet CPTableView tableView @accessors(getter=tableView);
|
|
|
|
CPArray content @accessors;
|
|
}
|
|
|
|
- (IBAction)reload:(id)sender
|
|
{
|
|
[tableView reloadData];
|
|
}
|
|
|
|
- (void)applicationDidFinishLaunching:(CPNotification)note
|
|
{
|
|
content = [CPArray new];
|
|
|
|
var path = [[CPBundle mainBundle] pathForResource:@"Data.plist"],
|
|
request = [CPURLRequest requestWithURL:path],
|
|
connection = [CPURLConnection connectionWithRequest:request delegate:self];
|
|
|
|
[tableView registerForDraggedTypes:[CPArray arrayWithObject:TABLE_DRAG_TYPE]];
|
|
}
|
|
|
|
- (void)awakeFromCib
|
|
{
|
|
[theWindow setFullPlatformWindow:YES];
|
|
}
|
|
|
|
- (void)connection:(CPURLConnection)connection didReceiveData:(CPString)dataString
|
|
{
|
|
if (!dataString)
|
|
return;
|
|
|
|
var data = [[CPData alloc] initWithRawString:dataString],
|
|
theRows = [CPPropertyListSerialization propertyListFromData:data format:CPPropertyListXMLFormat_v1_0];
|
|
|
|
[self setContent:theRows];
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TableViewDelegate : CPObject
|
|
{
|
|
@outlet CPView externalView;
|
|
@outlet CPView personView;
|
|
@outlet CPView placeView;
|
|
@outlet CPArrayController contentController;
|
|
|
|
@outlet CPTableCellView view;
|
|
@outlet CPImageView imageView;
|
|
@outlet CPTextField textField;
|
|
|
|
CPTableView tableView;
|
|
CPArray content;
|
|
CPArray images @accessors;
|
|
BOOL variableRowHeight @accessors;
|
|
}
|
|
|
|
- (id)init
|
|
{
|
|
self = [super init];
|
|
|
|
images = [
|
|
[CPDictionary dictionaryWithObjectsAndKeys:@"Brad", @"name", @"Resources/brad.jpg" ,@"path"],
|
|
[CPDictionary dictionaryWithObjectsAndKeys:@"George",@"name", @"Resources/george.jpg",@"path"],
|
|
[CPDictionary dictionaryWithObjectsAndKeys:@"John", @"name", @"Resources/john.jpg" ,@"path"]
|
|
];
|
|
|
|
variableRowHeight = NO;
|
|
|
|
return self;
|
|
}
|
|
|
|
- (CPView)makeOrangeView
|
|
{
|
|
var orangeView = [[CustomView alloc] initWithFrame:CGRectMakeZero()];
|
|
[orangeView setIdentifier:@"Orange"];
|
|
|
|
return orangeView;
|
|
}
|
|
|
|
- (CPArray)content
|
|
{
|
|
if (!content)
|
|
content = [[CPApp delegate] content];
|
|
|
|
return content;
|
|
}
|
|
|
|
- (CPTableView)tableView
|
|
{
|
|
if (!tableView)
|
|
tableView = [[CPApp delegate] tableView];
|
|
|
|
return tableView;
|
|
}
|
|
|
|
// DELEGATE METHODS FOR THE TABLE VIEW
|
|
- (void)tableView:(CPTableView)aTableView viewForTableColumn:(CPTableColumn)aTableColumn row:(CPInteger)aRow
|
|
{
|
|
var identifier = [aTableColumn identifier];
|
|
|
|
if (identifier == @"multiple")
|
|
identifier = [[[self content] objectAtIndex:aRow] objectForKey:@"identifier"];
|
|
|
|
var aView = [aTableView makeViewWithIdentifier:identifier owner:self];
|
|
|
|
if (identifier == "Orange")
|
|
{
|
|
if (aView == nil)
|
|
aView = [self makeOrangeView];
|
|
|
|
[[aView textField] setStringValue:aRow];
|
|
}
|
|
|
|
return aView;
|
|
}
|
|
|
|
- (BOOL)tableView:(CPTableView)aTableView writeRowsWithIndexes:(CPIndexSet)rowIndexes toPasteboard:(CPPasteboard)pboard
|
|
{
|
|
[pboard declareTypes:[CPArray arrayWithObject:TABLE_DRAG_TYPE] owner:self];
|
|
[pboard setData:rowIndexes forType:TABLE_DRAG_TYPE];
|
|
|
|
return YES;
|
|
}
|
|
|
|
- (CPDragOperation)tableView:(CPTableView)aTableView
|
|
validateDrop:(id)info
|
|
proposedRow:(CPInteger)row
|
|
proposedDropOperation:(CPTableViewDropOperation)operation
|
|
{
|
|
[aTableView setDropRow:row dropOperation:CPTableViewDropAbove];
|
|
|
|
return CPDragOperationMove;
|
|
}
|
|
|
|
- (BOOL)tableView:(CPTableView)aTableView acceptDrop:(id)info row:(CPInteger)row dropOperation:(CPTableViewDropOperation)operation
|
|
{
|
|
var pboard = [info draggingPasteboard],
|
|
sourceIndexes = [pboard dataForType:TABLE_DRAG_TYPE],
|
|
firstObject = [content objectAtIndex:[sourceIndexes firstIndex]];
|
|
|
|
[content moveIndexes:sourceIndexes toIndex:row];
|
|
[contentController rearrangeObjects];
|
|
|
|
// Select the rows we just moved.
|
|
var destinationRange = CPMakeRange([content indexOfObject:firstObject], [sourceIndexes count]),
|
|
selectIndexes = [CPIndexSet indexSetWithIndexesInRange:destinationRange];
|
|
|
|
[aTableView selectRowIndexes:selectIndexes byExtendingSelection:NO];
|
|
|
|
return YES;
|
|
}
|
|
|
|
- (int)tableView:(CPTableView)aTableView heightOfRow:(CPInteger)aRow
|
|
{
|
|
var height;
|
|
|
|
if (!variableRowHeight || !(height = [[[self content] objectAtIndex:aRow] objectForKey:@"slider"]))
|
|
return [aTableView rowHeight];
|
|
|
|
return [height intValue];
|
|
}
|
|
|
|
- (void)awakeFromCib
|
|
{
|
|
// self is the owner parameter specified in -makeViewWithIdentifier:owner:
|
|
// This method is called each time a cib containing a CPTableCellView is instantiated.
|
|
// Outlets are now connected and available.
|
|
// If the view has its own xib, only the view will be instantiated and connected to the owner.
|
|
if (externalView)
|
|
{
|
|
CPLog.debug(_cmd + " loaded externalView : " + externalView);
|
|
[[externalView textField] setTextColor:[CPColor greenColor]];
|
|
}
|
|
}
|
|
|
|
// CELL VIEWS ACTIONS
|
|
- (IBAction)_sliderAction:(id)sender
|
|
{
|
|
if (variableRowHeight)
|
|
{
|
|
var table = [self tableView],
|
|
row = [table rowForView:sender];
|
|
|
|
[table noteHeightOfRowsWithIndexesChanged:[CPIndexSet indexSetWithIndex:row]];
|
|
[table reloadData];
|
|
}
|
|
|
|
// Action sent from a cellView subview to its target.
|
|
CPLog.debug(_cmd + " value=" + [sender intValue]);
|
|
}
|
|
|
|
- (IBAction)_textFieldNotBezeledAction:(id)sender
|
|
{
|
|
CPLog.debug(_cmd + " value=" + [sender stringValue]);
|
|
}
|
|
|
|
- (IBAction)_textFieldBezeledAction:(id)sender
|
|
{
|
|
CPLog.debug(_cmd + " value=" + [sender stringValue]);
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation CustomView : CPView
|
|
{
|
|
id objectValue @accessors;
|
|
CPTextField textField @accessors;
|
|
}
|
|
|
|
- (id)initWithFrame:(CGRect)aFrame
|
|
{
|
|
self = [super initWithFrame:CGRectMake(0, 0, 50, 50)];
|
|
|
|
textField = [[CPTextField alloc] initWithFrame:CGRectMake(5, 5, 40, 40)];
|
|
[textField setFont:[CPFont systemFontOfSize:30]];
|
|
[textField setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin];
|
|
[self addSubview:textField];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)drawRect:(CGRect)aRect
|
|
{
|
|
[[CPColor orangeColor] set];
|
|
|
|
var ctx = [[CPGraphicsContext currentContext] graphicsPort];
|
|
CGContextFillRect(ctx, aRect);
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation CPArray (MoveIndexes)
|
|
|
|
- (void)moveIndexes:(CPIndexSet)indexes toIndex:(int)insertIndex
|
|
{
|
|
var aboveCount = 0,
|
|
object,
|
|
removeIndex,
|
|
index = [indexes lastIndex];
|
|
|
|
while (index != CPNotFound)
|
|
{
|
|
if (index >= insertIndex)
|
|
{
|
|
removeIndex = index + aboveCount;
|
|
aboveCount ++;
|
|
}
|
|
else
|
|
{
|
|
removeIndex = index;
|
|
insertIndex --;
|
|
}
|
|
|
|
object = [self objectAtIndex:removeIndex];
|
|
[self removeObjectAtIndex:removeIndex];
|
|
[self insertObject:object atIndex:insertIndex];
|
|
|
|
index = [indexes indexLessThanIndex:index];
|
|
}
|
|
}
|
|
|
|
@end
|