// SimpleTable1nibless, nibless table demo
// Text-based table only.
// Note that the columns must be identified by identifier strings in IB!

{$mode objfpc}
{$modeswitch objectivec1}

program SimpleTable1nibless;
uses
	ctypes, MacOSAll, CocoaAll, TransSkel5, SkelViewUnit;

var
	table: NSTableView;
	tableData: array of AnsiString;
	tableScores: array of Longint;
	
type
  DataSource = objcclass(NSObject)
  public
// Data source methods
    function numberOfRowsInTableView(tableView: NSTableView): Longint; message 'numberOfRowsInTableView:';
    function tableView_objectValueForTableColumn_row(tableView: NSTableView; tableColumn: NSTableColumn; row: Longint): id; message 'tableView:objectValueForTableColumn:row:';
// Table view delegate methods
    procedure tableViewSelectionDidChange(notification: NSNotification); message 'tableViewSelectionDidChange:';
  end;

function DataSource.numberOfRowsInTableView(tableView: NSTableView): Longint;
begin
	WriteLn('numberOfRowsInTableView');
	result := Length(tableData);
end;

function DataSource.tableView_objectValueForTableColumn_row(tableView: NSTableView; tableColumn: NSTableColumn; row: Longint): id;
var
	ident, s: String;
begin
	result := nil;
	if tableColumn.identifier = nil then
		Exit(tableView_objectValueForTableColumn_row);
	ident := NSStringToString(tableColumn.identifier);
	if row <= High(tableData) then
	if row >= Low(tableData) then
	begin
		if ident = '#' then // Row number
		begin
			Str(row, s);
			result := StringToNSString(s);
		end;
		if ident = 'N' then // Name
			result := StringToNSString(tableData[row]);
		if ident = '1' then // Score
		begin
			Str(tableScores[row], s);
			result := StringToNSString(s);
		end;
	end;
end;

// Delegate method
procedure DataSource.tableViewSelectionDidChange(notification: NSNotification);
begin
	WriteLn('Selected row = ', table.selectedRow);
end;

var
	ds: DataSource;

procedure MakeWindow;
var
	w: NSWindow;
	
	container: NSScrollView;
	table: NSTableView;
	col1, col2, col3: NSTableColumn;
begin
	w := SkelNewWindow(50, 60, 500, 250, 'Nibless table', true);
	SkelViewSetColor(SkelView(GetWindowContentView(w)), 0.7, 0.8, 0.75);
	
	// Set up a scroll view
	container := NSScrollView.alloc.initWithFrame(NSMakeRect(10, 10, 480, 230));
	container.setHasVerticalScroller(true);
	container.setHasHorizontalScroller(true);
	GetWindowContentView(w).addSubview(container);
//	container.setAutoresizesSubviews(true);
	container.setAutoresizingMask(NSViewWidthSizable or NSViewHeightSizable);
	container.release;
	
	// Create the table, put in the scroll view
	table := NSTableView.alloc.initWithFrame(NSMakeRect(12, 11, 386, 153));
	table.setGridStyleMask(NSTableViewSolidVerticalGridLineMask+NSTableViewSolidHorizontalGridLineMask);
	container.setDocumentView(table);

	col1 := NSTableColumn.alloc.initWithIdentifier(NSSTR('#'));
	col1.setWidth(30);
	NSTableHeaderCell(col1.headerCell).setStringValue(NSSTR('Rank'));
	NSCell(col1.dataCell).setEditable(False);
	NSCell(col1.dataCell).setSelectable(True);
	table.addTableColumn(col1);
	
	col2 := NSTableColumn.alloc.initWithIdentifier(NSSTR('N'));
	col2.setWidth(150);
	NSTableHeaderCell(col2.headerCell).setStringValue(NSSTR('Name'));
	NSCell(col2.dataCell).setEditable(False);
	NSCell(col2.dataCell).setSelectable(True);
	table.addTableColumn(col2);
	
	col3 := NSTableColumn.alloc.initWithIdentifier(NSSTR('1'));
	col3.setWidth(75);
	NSTableHeaderCell(col3.headerCell).setStringValue(NSSTR('Score'));
	NSCell(col3.dataCell).setEditable(False);
	NSCell(col3.dataCell).setSelectable(True);
	table.addTableColumn(col3);
	
	SetLength(tableData, 2);
	tableData[0] := 'One item';
	tableData[1] := 'Another item';
	SetLength(tableScores, 2);
	tableScores[0] := 100;
	tableScores[1] := 200;
	
	// Create DataSource
	ds := DataSource.alloc;
	// Connect DataSource to table
	table.setDataSource(ds);
	table.setDelegate(ds);
end;

begin
	SkelInit;					{ initialize }
	SkelApple('About SimpleTable1nibless', nil); // App menu the easy way
	
	MakeWindow;
	
	SkelMain;					{ loop 'til Quit selected }
	SkelClobber;					{ clean up }
end.
