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

Требования к операционной системе: 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];
// Удаляем все дочерние представления окна
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];
// Получаем измерение «Социально-экономические показатели»
MADimensionsPanelDimensionDescriptor *dimension = nil;
// Получаем количество измерений
NSUInteger dimensionsCount = [panelDataSource dimensionsPanelTableViewDimensionsCount: tableViewCtrl];
for (int i = 0; i < dimensionsCount; i++) {
    // Получаем описание первого измерения
    MADimensionsPanelDimensionDescriptor *dimDescriptor = [panelDataSource dimensionsPanelTableView: tableViewCtrl dimensionAtIndex:i];
        NSString *title = [dimDescriptor title];       
        if ([title isEqualToString:@"World"] || [title isEqualToString:@"Countries"]) {
            dimension = dimDescriptor;
        }
}
if (dimension != nil) {
    // Сделаем измерение фиксированным
    [panelDelegate dimensionsPanelTableView: tableViewCtrl didChangeRoleOfDimension:dimension toRole:kDRFixedHeader];
    } else {
    return;
}
// Получаем первый корневой элемент измерения
SPPLCommonTree dimensionElementsTree = [(MADimensionsPanelDimensionDescriptor *)dimension dimension]->elements()->itemsTree();
SNArray rootNodes = dimensionElementsTree->rootNodes();
MADimensionsPanelDimensionElementDescriptor *rootNode = [panelDataSource dimensionsPanelTableView: tableViewCtrl childElement:0 ofElement:NULL ofDimension:dimension];
// Снимаем выделение с корневого элемента указанного измерения
[panelDelegate dimensionsPanelTableView: tableViewCtrl didDeselectAllChildrenOfElement:NULL inDimension:dimension];
// Снимаем выделение у всех потомков корневых элементов указанного измерения
[panelDelegate dimensionsPanelTableView: tableViewCtrl didDeselectAllChildrenOfChildrenOfElement: rootNode inDimension:dimension];
// Получаем источник данных пузырьковой диаграммы
BubbleDataViewDatasource *bubbleDatasource = (BubbleDataViewDatasource *)[delegate bubbleDatasource];
// Создаём контроллер для выбора способа использования метрик пузырьковой диаграммы
MAElementDataSourceRoleSelectorViewController *bubbleElementRoleSelector = [[MAElementDataSourceRoleSelectorViewController alloc] initWithBubbleDataSource: bubbleDatasource];
// Устанавливаем контроллер для выбора способа использования метрик пузырьковой диаграммой
[panelDelegate setRoleSelector: bubbleElementRoleSelector];
// Указываем ключ элемента метрики для контроллера выбора способа использования метрик пузырьковой диаграммой
[bubbleElementRoleSelector dimensionsPanelTableView:tableViewCtrl setMetricElementKey:[rootNode key]];
// Определяем, должно ли отображаться меню в измерении
bool isShouldShowMenuInDimension = [bubbleElementRoleSelector dimensionsPanelTableView: tableViewCtrl shouldShowMenuInDimension:dimension];
if (isShouldShowMenuInDimension) {
    // Получаем контроллер для меню элемента
    UIViewController *elementMenuController = [panelDelegate dimensionsPanelTableView: tableViewCtrl elementMenuViewControllerForElement:rootNode inDimension: dimension];
    [[self view] addSubview: [elementMenuController view]];
    } else {
    NSLog(@"Меню не должно отображаться в измерении %@", [dimension title]);
}

В результате выполнения примера на экране мобильного устройства была отображена панель измерений источника данных. Корневой элемент измерения «Мир» не выделен:

Не выделены также и дочерние элементы первого уровня у корневого элемента измерения:

В консоли среды разработки было выведено уведомление о том, что меню не должно отображаться для измерения «Мир».

Выделим теперь корневой элемент и его дочерние элементы. Для этого добавим к примеру следующий фрагмент кода:

// Выделяем корневые элементы указанного измерения
[panelDelegate dimensionsPanelTableView: tableViewCtrl didSelectAllChildrenOfElement: NULL inDimension: dimension];
// Выделяем все потомки корневых элементов указанного измерения
[panelDelegate dimensionsPanelTableView: tableViewCtrl didSelectAllChildrenOfChildrenOfElement: rootNode inDimension: dimension];

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

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

См. также:

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