Работа с контроллером панели измерений (пример 1)

Требования к операционной системе: iOS 5.0 и выше.

Мобильное устройство: iPad.

Описание

В данном примере отображаются представление контроллера панели измерений и представление контроллера для выбора типа измерения. В консоли среды разработки выводится следующая информация:

Необходимые файлы

В базовый пример «Отображение экспресс-отчёта» необходимо добавить следующий файл:

Исходный код

Для выполнения примера необходимо разместить в теле метода executeExample класса ViewController (см. раздел «Отображение экспресс-отчёта») следующий код:

// Получаем контроллер для работы с аналитической панелью
MAExpressAnalysisReportViewController *contr = (MAExpressAnalysisReportViewController *)m_controller;
// Получаем делегат для работы с экспресс-отчётом
EAReportDelegateImpl *delegate = [contr delegate];
// Получаем объект, представляющий собой основу для построения таблиц с данными
SPPLPivot pivot = PPLPivot::pivot([delegate olapReport]);
// Создаём делегат панели измерений
MADimensionsPanelTableViewDelegate *panelDelegate = [[MADimensionsPanelTableViewDelegate alloc] initWithPivot: pivot];
// Создаём источник данных панели измерений
MADimensionsPanelTableViewDataSource *panelDataSource = [[MADimensionsPanelTableViewDataSource alloc] initWithPivot: [panelDelegate pivot]];
// Создаём контроллер для работы с панелью измерений
MADimensionsPanelTableViewController *tableViewCtrl = [MADimensionsPanelTableViewController new];
[tableViewCtrl setPanelDataSource: panelDataSource];
[tableViewCtrl setPanelDelegate: panelDelegate];
NSLog(@"Количество измерений: %d", [tableViewCtrl dimensionsCount]);
// Получаем таблицу, используемую для разметки представления
UITableView *tableView = [tableViewCtrl tableView];
if(tableView != nil) {
    NSLog(@"Высота строк у таблицы для разметки представления: %f", [tableView rowHeight]);
    } else {
    NSLog(@"Таблица разметки для представления не определена");
}
// Получаем измерение «Показатели»
MADimensionsPanelDimensionDescriptor *dimension = nil;
// Получаем количество измерений
NSUInteger dimensionsCount = [panelDataSource dimensionsPanelTableViewDimensionsCount: tableViewCtrl];
for (int i = 0; i < dimensionsCount; i++) {
    // Получаем описание первого измерения
    MADimensionsPanelDimensionDescriptor *dimDescriptor = [panelDataSource dimensionsPanelTableView: tableViewCtrl dimensionAtIndex:i];
    if ([[dimDescriptor title] isEqualToString:@"Indicators"]) {
        dimension = dimDescriptor;
    }
}
if (dimension == nil) {
    return;
}
NSLog(@"Ключ измерения: %lld", [dimension dimensionKey]);
NSLog(@"Идентификатор измерения: %@", [dimension dimensionId]);
NSLog(@"Заголовок измерения: %@", [dimension title]);
NSLog(@"Подзаголовок измерения: %@", [dimension subtitle]);
// Получаем измерение в виде объекта из библиотеки pplib++
PPLDimension *pplDimension = [dimension dimension];
NSLog(@"Количество элементов у данного измерения: %d", pplDimension->elements()->itemsCount());
// Устанавливаем данное измерение
[dimension setDimension: pplDimension];
// Определяем тип измерения
NSString *dimensionRole = [NSString string];
switch ([dimension role]) {
    case kDRNone:
    dimensionRole = @"нет типа";
    break;
    case kDRTopHeader:
    dimensionRole = @"верхний заголовок";
    break;
    case kDRLeftHeader:
    dimensionRole = @"левый заголовок";
    break;
    case kDRFixedHeader:
    dimensionRole = @"фиксированный заголовок";
    break;
    default:
    break;
}
NSLog(@"Тип измерения: %@", dimensionRole);
// Определяем тип отметки в измерении
NSString *selectionType = [NSString string];
switch ([dimension selectionType]) {
    case kDESTMultiSelect:
    selectionType = @"единичная отметка";
    break;
    case kDESTSingleSelect:
    selectionType = @"множественная отметка";
    break;
    default:
    break;
}
NSLog(@"Тип отметки в измерении: %@", selectionType);
NSString *elementName = @"Образование";
// Получаем количество элементов, содержащих текст «Образование»
NSUInteger number = [panelDataSource dimensionsPanelTableView: tableViewCtrl numberOfElementOfDimension:dimension satisfyingToSearchString: elementName];
NSLog(@"Количество элементов, содержащих текст «%@»: %d", elementName, number);
if (number > 0) {
    // Получаем описание первого элемента в измерении
    MADimensionsPanelDimensionElementDescriptor *elementDescriptor = [panelDataSource dimensionsPanelTableView: tableViewCtrl element:0 ofDimension:dimension satisfyingToSearchString: [panelDataSource searchString]];
    if (elementDescriptor == nil) {
        return;
    }
    NSLog(@"Ключ элемента: %lld", [elementDescriptor key]);
    NSLog(@"Заголовок элемента: %@", [elementDescriptor title]);
    // Определяем, выделен ли элемент
    if ([elementDescriptor selected]) {
        NSLog(@"Элемент выделен");
        } else {
        NSLog(@"Элемент не выделен");
    }
    // Получаем количество дочерних элементов первого измерения
    NSUInteger childElementsCount = [panelDataSource dimensionsPanelTableView:tableViewCtrl numberOfChildrenOfElement:elementDescriptor ofDimension:dimension];
    NSLog(@"Количество дочерних элементов первого измерения: %d", childElementsCount);
    if (childElementsCount > 0) {
        [elementDescriptor setHasChildren: YES];
        } else {
        [elementDescriptor setHasChildren: NO];
    }
    if ([elementDescriptor hasChildren]) {
        // Получаем первый дочерний элемент
        MADimensionsPanelDimensionElementDescriptor *childElement = [panelDataSource dimensionsPanelTableView:tableViewCtrl childElement:0 ofElement:elementDescriptor ofDimension:dimension];
        if (childElement) {
            NSLog(@"Ключ первого дочернего элемента: %lld", [childElement key]);
            NSLog(@"Заголовок первого дочернего элемента: %@", [childElement title]);
            // Получаем элемент измерения в виде объекта из библиотеки pplib++
            SPPLDimensionElement dimensionElement = [childElement dimensionElement];
            printf("Ключ родителя для первого дочернего элемента: %lld\n", dimensionElement->parentKey());
            // Устанавливаем элемент измерения
            [childElement setDimensionElement: dimensionElement];
            // Получаем родительский элемент измерения
            MADimensionsPanelDimensionElementDescriptor *parentDimensionElement = [childElement parentDimensionElement];
            NSLog(@"Заголовок родительского элемента: %@", [parentDimensionElement title]);
            // Устанавливаем родительский элемент измерения
            [childElement setParentDimensionElement: parentDimensionElement];
        }
        } else {
        NSLog(@"Измерение не содержит дочерних элементов");
    }
    // Получаем признак отображения индикатора загрузки данных при выделении элемента измерения
    bool isShowActivity = [panelDelegate dimensionsPanelTableViewShouldShowActivityIndicator: tableViewCtrl];
    if (isShowActivity) {
        NSLog(@"Индикатор загрузки данных при выборе элементов измерения отображается");
        } else {
        NSLog(@"Индикатор загрузки данных при выборе элементов измерения не отображается");
    }
    // Получаем признак отображения меню для выбранного элемента измерения
    bool isShowMenu = [panelDelegate dimensionsPanelTableView: tableViewCtrl shouldShowMenuForElement:elementDescriptor inDimension:dimension];
    if (isShowMenu) {
        NSLog(@"Меню для выбранного элемента измерения отображается");
        } else {
        NSLog(@"Меню для выбранного элемента измерения не отображается");
    }
    // Обновляем данные панели
    [tableViewCtrl reloadData];
    // Удаляем все дочерние представления окна
    NSArray *subviews = [self.view subviews];
    for (UIView *subView in subviews) {
        [subView removeFromSuperview];
    }
    // Отображаем представление контроллера
    UIView *view = [tableViewCtrl view];
    [view setFrame: CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height / 2)];
    [[self view] addSubview: view];
}

В результате выполнения примера в окне приложения было загружено представление контроллера панели измерений:

В консоли среды разработки выводится информация об измерении «Показатели», об элементе «Культура» и его первом дочернем элементе:

Количество измерений: 3

Высота строк у таблицы для разметки представления: 44.000000

Ключ измерения: 1557

Идентификатор измерения: FACTS_WDI_COPY_1557

Заголовок измерения: Показатели

Подзаголовок измерения: Валовой региональный продукт
Количество элементов у данного измерения: 1374

Тип измерения: фиксированный заголовок

Тип отметки в измерении: множественная отметка

Количество элементов, содержащих текст «Культура»: 42

Ключ элемента: 524


Заголовок элемента: Культура

Элемент не выделен

Количество дочерних элементов первого измерения: 4

Ключ первого дочернего элемента: 525

Заголовок дочернего элемента: Обеспеченность общедоступными библиотеками,

учрежд. на 100 тыс. населения
Ключ родителя для первого дочернего элемента: 524

Заголовок родительского элемента: Культура

Также была выведена информация о том, отображаются ли при выборе элементов измерения индикатор загрузки данных и меню:

Индикатор загрузки данных при выборе элементов измерения отображается

Меню для выбранного элемента измерения не отображается

Далее выделим все элементы измерения «Показатели» и снимем выделение только с элемента «Образование». Для этого добавим к примеру следующий код:

// Выделяем все элементы измерения
[panelDelegate dimensionsPanelTableView: tableViewCtrl didSelectAllElementsInDimension:dimension];
// Снимаем выделение с элемента «Образование»
[panelDelegate dimensionsPanelTableView: tableViewCtrl didDeselectElement:elementDescriptor inDimension:dimension];

После выполнения примера будут выделены все элементы измерения «Индикаторы» кроме элемента «Образование»:

Теперь инвертируем выделение элементов измерения, добавив к примеру следующий фрагмент кода:

// Снимаем выделение в измерении
[panelDelegate dimensionsPanelTableView: tableViewCtrl didDeselectAllElementsInDimension:dimension];
// Выделяем первый элемент измерения
[panelDelegate dimensionsPanelTableView: tableViewCtrl didSelectElement:elementDescriptor inDimension:dimension];

В результате выполнения примера выделен будет только один элемент измерения «Показатели»:

Отобразим представление контроллера для выбора типа измерения, добавив к примеру следующий код:

// Получаем контроллер для выбора типа измерения
MADimensionsPanelRoleSelectorViewController *roleSelectorViewCtrl = (MADimensionsPanelRoleSelectorViewController*)[panelDelegate dimensionsPanelTableView: tableViewCtrl roleSelectorViewControllerForDimension:dimension withCurrentDimensionElement:elementDescriptor];
// Создаём всплывающее окно, отображающее представление
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController: roleSelectorViewCtrl];
[popover presentPopoverFromRect:CGRectMake(0, 0, 200, 500) inView:[tableViewCtrl view] permittedArrowDirections:NULL animated: YES];
// Создаём делегат для установки типа измерения
MADimensionRoleAcceptorProtocolImpl *acceptorProtocolImpl = [[MADimensionRoleAcceptorProtocolImpl new] autorelease];
// Устанавливаем данный делегат
[roleSelectorViewCtrl setRoleAcceptorDelegate: acceptorProtocolImpl];

После выполнения примера было отображено представление контроллера для выбора типа измерения:

См. также:

Примеры использования компонентов