Работа с представлением данных в виде пузырькового дерева

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

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

Описание

В данном примере описываются некоторые приемы работы с представлением данных в виде пузырькового дерева. После запуска примера выполняются следующие операции:

Исходный код

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

-(void)executeExample {
    // Удаляем все дочерние представления окна
    NSArray *subviews = [self.view subviews];
    for(UIView *subView in subviews) {
        [subView removeFromSuperview];
    }
    // Получаем размеры окна мобильного устройства
    CGRect windowFrame = [[self view] frame];
    
    // Создаём контроллер для работы с пузырьковым деревом
    MABubbleTreeDataViewController *bubbleTreeController = [self createBubbleTreeDataViewController];
    // Устанавливаем размеры пузырькового дерева
    UIView *bubbleTreeView = [bubbleTreeController view];
    [bubbleTreeView setFrame: windowFrame];
    // Отображаем пузырьковое дерево
    [self.view addSubview: [bubbleTreeController view]];
}
-(MABubbleTreeDataViewController *)createBubbleTreeDataViewController {
    // Получаем контроллер для работы с экспресс-отчётом
    MAExpressAnalysisReportViewController *contr = (MAExpressAnalysisReportViewController *)m_controller;
    // Получаем делегат для работы с экспресс-отчётом 
    EAReportDelegateImpl *delegate = [contr delegate];
    
    // Создаём источник данных пузырькового дерева
    SPPLPivot bubbleTreePivot = PPLPivot::pivot(m_olapReport);
    SPPLPivotTable bubbleTreePivotTable = PPLPivotTable::pivotTable(bubbleTreePivot);
    BubbleTreeDataViewDataSource *bubbleTreeDatasource = [[BubbleTreeDataViewDataSource alloc] initWithPivotTable:bubbleTreePivotTable];
    
    // Создаём контроллер для работы с пузырьковым деревом
    MABubbleTreeDataViewController *bubbleTreeController = [[MABubbleTreeDataViewController alloc] initWithDataSource: bubbleTreeDatasource];
    [bubbleTreeController setDelegate: contr];
    [bubbleTreeController setTag: kViewModeBubbleTree];
    [bubbleTreeController setIsDataViewTitleVisible: YES];
    
    SNString plistPath = PPLFileManager::getReportPlistPath(m_olapReport->descriptor());
    NSString* correctPath = plistPath?plistPath->nsString():NULL;
    if (correctPath) {
        correctPath = [correctPath stringByDeletingLastPathComponent];
        [bubbleTreeController setPathToDirReport:correctPath];
        NSLog(@"Путь к папке с отчётом: %@", correctPath);
    }
    // Получаем настройки отчёта
    SNDictionary sett = m_olapReport->settings();
    SNDictionary treeMapSett = NULL; // Настройки пузырькового дерева
    SNDictionary selectDict = m_olapReport->selectionDictionary();
    if (sett) {
        SNID treeMap = sett->objectForKey(NStr("treemap"));
        // Получаем настройки пузырькового дерева
        treeMapSett = (treeMap?treeMap->qClass<NDictionary>():NULL);
        if (treeMapSett) {
            // Загружаем и применяем настройки пузырькового дерева
            [bubbleTreeDatasource loadSettings:treeMapSett withSelection:selectDict];
            [bubbleTreeController setXmlNameSettingFromDic:(NSDictionary *)treeMapSett->nsObject()];
            } else {
            // Устанавливаем настройки дерева
            [bubbleTreeController setXmlNameSetting];
        }
    }
    // Скрываем легенду размера
    [bubbleTreeController setIsSetSizeIndicator: NO];
    [bubbleTreeController setIsSizeIndicator: [bubbleTreeController isSetSizeIndicator]];     // Скрываем легенду цвета     [bubbleTreeController setIsSetColorIndicator: NO];     MADataViewType oldMode = kViewModeTable;     MADataViewType newMode = (MADataViewType)[bubbleTreeController tag];     // Синхронизируем измерения между старым и новым представлениями данных     bool isNeedRefresh = [self syncDimensionsOldMode:oldMode newMode:newMode];     if (isNeedRefresh) {         // Обновляем данные дерева         [delegate controllerViewDidLoaded];     }     return bubbleTreeController; } // Синхронизирует измерения между старым и новым представлениями данных - (BOOL)syncDimensionsOldMode:(MADataViewType)oldMode newMode:(MADataViewType)newMode {     bool result = NO;     if (oldMode == newMode) {         return NO;         } else {         result = YES;     };     DataViewDatasource *src = [self datasourceByViewType: oldMode];     DataViewDatasource *dst = [self datasourceByViewType: newMode];     if ([src conformsToProtocol:@protocol(DataViewDatasourceSyncSelection)] && [dst conformsToProtocol:@protocol(DataViewDatasourceSyncSelection)]) {         id <DataViewDatasourceSyncSelection> source = (id<DataViewDatasourceSyncSelection>)src;         id <DataViewDatasourceSyncSelection> dest = (id<DataViewDatasourceSyncSelection>)dst;         DataViewDatasourceDimensionsInfo info;         [source copyDatasourceDimensionsInfo:&info];         result = [dest applyDatasourceDimensionsInfo:&info];     }     return result; } - (DataViewDatasource *)datasourceByViewType:(MADataViewType)type {     // Получаем контроллер для работы с экспресс-отчётом     MAExpressAnalysisReportViewController *contr = (MAExpressAnalysisReportViewController *)m_controller;     // Получаем делегат для работы с экспресс-отчётом     EAReportDelegateImpl *delegate = [contr delegate];     switch (type) {         case kViewModeTable: return delegate.gridDatasource;         case kViewModeChart: return delegate.chartDatasource;         case kViewModeMap: return [delegate mapDatasource];         case kViewModeBubble: return [delegate bubbleDatasource];         case kViewModeBubbleTree: return [delegate bubbleTreeDatasource];         case kViewModeTreeMap: return [delegate treeMapDatasource];         default: return nil;     } }

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

В консоли среды разработки был выведен путь к папке с экспресс-отчётом, на основе данных которого было создано пузырьковое дерево:

Путь к папке с отчётом: /Users/sea/Library/Application Support/iPhone Simulator/7.1/Applications/AC4804D8-C173-4008-B14D-4A2401B0B49D/Documents/repositories/910419CE79EA52E95F2F8FE76E7C24DE/OBJ21110

См. также:

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