Источник данных для простой электронной таблицы

Описание: создание источника данных для электронной таблицы.

Файл «DataSource.h»

#import <NuGridView/NuGridView.h>
#import <NuGridView/NuTextGridCell.h>
#import <NuGridView/NuGridDataSource.h>
@interface DataSource : NSObject<NuGridDataSource> {
    NSMutableArray *rowHeader; // Заголовки строк
    NSMutableArray *columnHeader; // Заголовки столбцов
    NSMutableArray *observers; // Массив наблюдателей
}
@property(assign) NSMutableArray *data; // Массив данных
- (id) init;
// Сворачивает указанный диапазон в таблице
- (void)collapseRangeFromCell:(NuGridCell*)fromCell ToCell:(NuGridCell*) toCell;
// Разворачивает указанный диапазон в таблице
- (void)expandRangeFromCell:(NuGridCell*)fromCell ToCell:(NuGridCell*) toCell;
@end

Файл «DataSource.m»

#import "DataSource.h"
#import <NuGridView/NuGridCell.h>
#import <NuGridView/NuGridImageTextCell.h>
#import "CustomCell.h"
#import "SparklineCell.h"
#import <NuGridView/NuGridCellWithSparkline.h>
#import <NuGridView/NuGridExpandableCell.h>
@implementation DataSource
@synthesize data = _data;
- (id) init {
    if (self=[super init])
    {
        // Инициализируем массивы
        observers = [NSMutableArray new];
        _data = [NSMutableArray new];
        rowHeader = [NSMutableArray new];
        columnHeader = [NSMutableArray new];
        // Устанавливаем заголовки для строк
        for (int i=0; i<5; i++) {
            NSString* rowStr = [NSString stringWithFormat:@"%d", i];
            [rowHeader addObject:rowStr];
        };
        // Устанавливаем заголовки для столбцов
        for (int i=0; i<5; i++) {
            NSString* columnStr = [NSString stringWithFormat:@"%c", 65 + i];
            [columnHeader addObject:columnStr];
        };
        // Создаём даннные для таблицы
        NSMutableArray* temp;
        for (int i=0; i<5; i++) {
            temp = [NSMutableArray new];
            for (int j=0; j<5; j++) {
                [temp addObject:[NSNumber numberWithInt:(i+j)]];
            }
            [_data addObject:temp];
            [temp release];
        }
        return self;
    }
    return nil;
}
// Возвращает ячейку по строке заголовка с установкой данных
- (NuGridCell *)gridView:(NuGridView *)gridView headerForRow:(NSInteger)row number:(NSInteger)number {
    // Создаём ячейку с идентификатором
    NuTextGridCell *cell = [[CustomCell alloc] initWithReuseIdentifier:@"row_header"];
    // Получаем значение для ячейки
    NSObject *value = [self gridView:gridView valueForHeaderForRow:row number:number];
    // Устанавливаем значение в ячейке
    cell.value = value;
    // Устанавливаем отображаемое значение в ячейке
    cell.text = [NSString stringWithFormat:@"%@", value];
    // Указываем номер строки
    cell.rowNumber = row;
    // Указываем номер столбца
    cell.columnNumber = number;
    // Устанавливаем индекс ячейки для столбца
    cell.columnIndex = 0;
    // Устанавливаем индекс ячейки для строки
    cell.rowIndex = 0;
    // Указываем, что ячейка не является заголовком столбца
    cell.isColumnHeader = NO;
    // Указываем, что ячейка не является заголовком строки
    cell.isRowHeader = YES;
    // Привязываем ячейку к таблице, в которой она будет находиться
    cell.parentGrid = gridView;
    return cell;
}
// Возвращает ячейку по столбцу заголовка с установкой данных
- (NuGridCell *)gridView:(NuGridView *)gridView headerForColumn:(NSInteger)column number:(NSInteger)number
{
    NuTextGridCell *cell = [[CustomCell alloc] initWithReuseIdentifier:@"column_header"];
    NSObject *value = [self gridView:gridView valueForHeaderForColumn:column number:number];
    cell.value = value;
    cell.text = [NSString stringWithFormat:@"%@", value];
    cell.rowNumber = number;
    cell.columnNumber = column;
    cell.columnIndex = 0;
    cell.rowIndex = 0;
    cell.isColumnHeader = YES;
    cell.isRowHeader = NO;
    cell.parentGrid = gridView;
    return cell;
}
// Возвращает ячейку по столбцу и строке с установкой данных
- (NuGridCell *)gridView:(NuGridView *)gridView cellInRow:(NSInteger)row inColumn:(NSInteger)column
{
    NuGridExpandableCell *cell = [[CustomCell alloc] initWithReuseIdentifier:@"row"];
    NSObject *value = [self gridView:gridView valueForCellInRow:row inColumn:column];
    cell.value = value;
    cell.text = [NSString stringWithFormat:@"%@", value];
    cell.rowNumber = row;
    cell.columnNumber = column;
    cell.columnIndex = 0;
    cell.rowIndex = 0;
    cell.isColumnHeader = NO;
    cell.isRowHeader = NO;
    cell.parentGrid = gridView;
    return cell;
}
// Возвращает количество строк в таблице
- (NSInteger)gridViewRowCount:(NuGridView *)gridView
{
    return [_data count];
}
// Возвращает количество столбцов в таблице
- (NSInteger)gridViewColumnCount:(NuGridView *)gridView
{
    return [[_data objectAtIndex:0] count];
    
}
// Определяет, есть ли в таблице строки с заголовками
- (BOOL)gridViewHasRowHeader:(NuGridView *)gridView
{
    return YES;
}
// Определяет, есть ли в таблице столбцы с заголовками
- (BOOL)gridViewHasColumnHeader:(NuGridView *)gridView
{
    return YES;
}
// Возвращает количество строк заголовка
-(NSInteger)gridViewRowHeaderCount:(NuGridView *)gridView
{
    return 1;
}
// Возвращает количество столбцов заголовка
-(NSInteger)gridViewColumnHeaderCount:(NuGridView *)gridView
{
    return 1;
}
// Возвращает значение, хранимое в заголовке строки таблицы
- (NSObject *)gridView:(NuGridView *)gridView valueForHeaderForRow:(NSInteger)row number:(NSInteger)number
{
    if (row < [_data count]) {
        return [rowHeader objectAtIndex:row];
    }
    else
    return nil;
}
// Возвращает значение, хранимое в заголовке столбца таблицы
- (NSObject *)gridView:(NuGridView *)gridView valueForHeaderForColumn:(NSInteger)column number:(NSInteger)number
{
    return [columnHeader objectAtIndex:column];
}
// Возвращает значение, хранимое в ячейке таблицы
- (NSObject *)gridView:(NuGridView *)gridView valueForCellInRow:(NSInteger)row inColumn:(NSInteger)column
{
    if (row < [_data count]) {
        return [[_data objectAtIndex:row] objectAtIndex:column];
        
    }
    else
    return nil;
}
// Возвращает левую верхнюю ячейку таблицы
- (NuGridCell *) gridView:(NuGridView *) gridView cornerCellInRowNumber:(NSInteger)rowNumber inColumnNumber:(NSInteger)columnNumber
{
    SparklineCell *cell = [[SparklineCell alloc] initWithReuseIdentifier:@"corner"];
    cell.value = [self gridView:gridView valueForCornerCellInRowNumber:rowNumber inColumnNumber:columnNumber];
    cell.rowNumber = rowNumber;
    cell.columnNumber = columnNumber;
    cell.rowIndex = -1;
    cell.columnIndex = -1;
    cell.isRowHeader = YES;
    cell.isColumnHeader = YES;
    cell.parentGrid = gridView;
    return cell;
}
// Возвращает значение, хранимое в левой верхней ячейке таблицы
- (NSObject *)gridView:(NuGridView *)gridView valueForCornerCellInRowNumber:(NSInteger)rowNumber inColumnNumber:(NSInteger)columnNumber {
    return @"Grid";
}
// Добавляет наблюдателя в соответствующий массив наблюдателей
- (void)addObserver:(id<NuGridUpdateObserver>)observer
{
    [observers addObject:observer];
}
// Удаляет наблюдателя из соответствующего массива наблюдателей
- (void)removeObserver:(id<NuGridUpdateObserver>)observer
{
    [observers removeObject:observer];
}
// Сворачивает указанный диапазон в таблице
-(void)collapseRangeFromCell:(NuGridCell*)fromCell ToCell:(NuGridCell*) toCell {
    bool isColumnHeaderExpanded = true;
    for (int i = ([_data count] - 1); i >= 0; i--) {
        NSMutableArray* columnData = [_data objectAtIndex:i];
        for (int j = ([columnData count] -1); j >= 0; j--) {
            if((j > [fromCell columnNumber]) & (j <= [toCell columnNumber])) {
                [columnData removeObjectAtIndex:j];
                if (isColumnHeaderExpanded) {
                    [columnHeader removeObjectAtIndex:j];
                }
            }
        }
        if((i > [fromCell rowNumber]) & (i <= [toCell rowNumber])) {
            [_data removeObjectAtIndex:i];
            [rowHeader removeObjectAtIndex:i];
        }
        isColumnHeaderExpanded = false;
    }
}
// Разворачивает указанный диапазон в таблице
-(void)expandRangeFromCell:(NuGridCell*)fromCell ToCell:(NuGridCell*) toCell {
    bool isColumnHeaderCollapsed = true;
    for (int i = 0; i < [_data count]; i++) {
        NSMutableArray* columnData = [_data objectAtIndex:i];
        for (int j = 0; j < columnData.count; j++) {
            if((j > [fromCell columnNumber]) & (j <= [toCell columnNumber])) {
                [columnData insertObject:[NSNumber numberWithInt:(i+j)] atIndex:j];
                if (isColumnHeaderCollapsed) {
                    [columnHeader insertObject:[NSString stringWithFormat:@"%c", 65 + j] atIndex:j];
                }
            }
        }
        if((i > [fromCell rowNumber]) & (i <= [toCell rowNumber])) {
            columnData = [[NSMutableArray new] autorelease];
            for (int j = 0; j < columnHeader.count; j++) {
                [columnData addObject:[NSNumber numberWithInt:(i+j)]];
            }
            [_data insertObject:columnData atIndex:i];
            [rowHeader insertObject:[NSString stringWithFormat:@"%d", i] atIndex:i];
        }
        isColumnHeaderCollapsed = false;
    }
}
@end

См. также:

Создание простой электронной таблицы