Description: creating a dashboard that uses cube as a data source.
#import <UIKit/UIKit.h> #include "PPLMetabase.h" #include "PPLDashboardReport.h" #include <MobileAnalysis/MABaseReportViewController.h> @interface ViewController : UIViewController { SPPLMetabaseRepositoryObjectDescriptor m_dashboardReportDescriptor; SPPLDashboardReport m_dashboardReport; MABaseReportViewController* m_controller; SPPLMetabase m_metabase; } // Executes custom example located in the body of this method - (void) executeExample; @end
#import "MABaseReportViewController.h" #import "MADashboardReportViewController.h" #import "MADashboardReportViewControllerDelegateImpl.h" #import "MADashboardReportViewControllerFactory.h" #import "UIColor+Name.h" #import "ViewController.h" #import <MobileAnalysis/APArea.h> #import <MobileAnalysis/APCompositeBlock.h> #import <MobileAnalysis/APGrid.h> #import <MobileAnalysis/APKap.h> #import <MobileAnalysis/APPanel.h> #import <MobileAnalysis/APSlideScroller.h> #import <MobileAnalysis/MAConditionalFormatting.h> #import <MobileAnalysis/MADimensionElementsTableViewController.h> #import <MobileAnalysis/MAImageDataViewController.h> #import <MobileAnalysis/MATextDataViewController.h> #import <MobileAnalysis/MAWebDataViewController.h> #import <MobileAnalysis/PPLPivot.h> #import <MobileAnalysis/SplitViewController.h> #include "NData.h" #include "NNotificationCenterExt.h" #include "PPLAccessRightsManager.h" #include "PPLDashboardReport.h" #include "PPLMetabase.h" #include "PPLMetabaseRepositoryWarehousePool.h" @interface ViewController() @property (retain) UIAlertView* waiterView; @property (assign) int signingAttempsCount; @end @implementation ViewController const int static delay = 3; const int maxSigningAttempsCount = 3; // Number of repository connection attempts NSString *host = @"nrspo-121.prognozcloud.ru/r7.2/mobile"; NSString *login = @"sa"; NSString *password = @"sa"; -(id)init { self = [super init]; if (self) { [self setSigningAttempsCount: 0]; // Set successful report download event handler NNotificationCenterExt::addObserver(self, @selector(repositoryDownloadingFinished:), didDownloadRepositoryDescriptorNotificationName, NULL); // Set unsuccessful report download event handler NNotificationCenterExt::addObserver(self, @selector(repositoryDownloadingFailed:), didFailDownloadingRepositoryDescriptorNotificationName, NULL); // Set authentication complete event handler NNotificationCenterExt::addObserver(self, @selector(authenticationCompleted:), didAuthenticationCompletedDescriptorNotificationName, NULL); [self showWaiterWithText: NSLocalizedString(@"Signing in...", nil)]; // Connect to repository [self connect]; } return self; } -(void) connect { // Create a metabase containing information on reports m_metabase = PPLMetabase::sharedMetabase(NString::stringWithNSString([NSString stringWithFormat:@"http://%@",host])); m_metabase->setHost(NString::stringWithNSString(host)); if (m_metabase->getHost() == nil) { m_metabase->setHost(NString::stringWithNSString(host)); } if (m_metabase->isHttpsEnabled()) { m_metabase->setHttpsEnabled(false); } [self updateRepository]; // Authenticate user [self authenticateUser]; } // Authenticates user -(void)authenticateUser { /* Set login and password for checking if specified user can access reports */ PPLAccessRightsManager::accessRightsManager()->setAuthenticatedUser(m_metabase->getLogin(), m_metabase->getPassword()); } // Updates repositrory state based on remote server data -(void)updateRepository { m_metabase->updateRemoteRepositoryContent(NString::stringWithNSString(login), NString::stringWithNSString(password)); } - (void)authenticationCompleted:(NNotification *)notification { SNNumber errorType = notification->userInfo()->objectForKey<NNumber>(errorNotificationTypeKey); if (errorType->intValue() != PPLMetabase::errSuccess) { _signingAttempsCount++; NSLog(@"Authorization error (attempt %d)", _signingAttempsCount); if (_signingAttempsCount < maxSigningAttempsCount) { [self connect]; } else { [self hideWaiter]; } } } - (void)repositoryDownloadingFinished:(NNotification *)notification { NSLog(@"Repository data is successfully obtained"); [self hideWaiter]; [self initObjectDescriptor]; } - (void)repositoryDownloadingFailed:(NNotification *)notification { NSLog(@"Error loading repository data"); } // Initializes repository object -(void)initObjectDescriptor { N_FOREACH(SPPLMetabaseRepositoryDescriptor, repositoryDescriptor, [self getRepositories]) { // Set repository as the current [self setCurrentRepository: repositoryDescriptor]; // Get dashboard SPPLMetabaseRepositoryObjectDescriptor dashboardObjectDescriptor = [self getObjectDescriptorWithType: PPLMetabaseRepositoryObjectDescriptor::kDashboard]; // Remove dashboard if ([self removeRepositoryObject: dashboardObjectDescriptor]) { return; }; // Load repository object description bool isDownloading = [self downloadRepositoryObject: dashboardObjectDescriptor]; if (isDownloading) { return; } } } // Sets current repository -(void)setCurrentRepository: (SPPLMetabaseRepositoryDescriptor) repositoryDescriptor { m_metabase = PPLMetabase::sharedMetabase(repositoryDescriptor); } // Returns array of repositories -(SNArray) getRepositories { SPPLMetabaseRepositoryWarehouse defaultWarehouse = PPLMetabaseRepositoryWarehousePool::sharedWarehousePool()->defaultWarehouse(); return defaultWarehouse->repositoriesList(); } // Returns description of specified type of repository object -(SPPLMetabaseRepositoryObjectDescriptor) getObjectDescriptorWithType: (PPLMetabaseRepositoryObjectDescriptor::Type) type { SPPLMetabaseRepositoryObjectDescriptor result = NULL; N_FOREACH(SPPLMetabaseRepositoryObjectDescriptor, objectDescriptor, m_metabase->allReportDescriptors()) { if(objectDescriptor->isReport()) { if(objectDescriptor->type() == type) { result = objectDescriptor; break; } } } return result; } // Removes specified repository object -(bool)removeRepositoryObject: (SPPLMetabaseRepositoryObjectDescriptor) objectDescriptor { if (objectDescriptor && objectDescriptor->isLocal()) { [self removeReport: objectDescriptor]; NSLog(@"Repository object is removed"); return true; } else { return false; } } // Loads specified repository object -(bool)downloadRepositoryObject: (SPPLMetabaseRepositoryObjectDescriptor) objectDescriptor { if (objectDescriptor && objectDescriptor->isRemote()) { [self downloadReport: objectDescriptor]; return true; } else { return false; } } -(void) downloadReport: (SPPLMetabaseRepositoryObjectDescriptor) objectDescriptor { [self addObjectDownloadObservers]; m_dashboardReportDescriptor = objectDescriptor; m_metabase->downloadReport(objectDescriptor); [self showWaiterWithText:NSLocalizedString(@"Downloading", nil)]; } - (void)reportDownloadingFinished:(NNotification *)notification { SNDictionary userInfo = notification->userInfo(); SNNumber isLastInQueue = userInfo->objectForKey<NNumber>(PPLNetDownloadManager::IS_LAST_IN_QUEUE_KEY); if (isLastInQueue && isLastInQueue->boolValue()) { [self initReport]; } } - (void)reportDownloadingFailed:(NNotification *)notification { [self removeObjectDownloadObservers]; } - (void)downloadProgressNotification:(NNotification *)notification { NSLog(@"%@",notification->userInfo()->description()->nsString()); } - (void)initReport { if (m_dashboardReportDescriptor->isLocal()) { NSLog(@"Report is successfully loaded"); [self hideWaiter]; [self showWaiterWithText: NSLocalizedString(@"Opening...", nil)]; [self removeObjectDownloadObservers]; // Open report [self openReport]; } } -(void)addObjectDownloadObservers { NNotificationCenterExt::addObserver(self, @selector(downloadProgressNotification:), downloadProgressNotificationName, NULL); NNotificationCenterExt::addObserver(self, @selector(reportDownloadingFinished:), downloadFinishedNotificationName, NULL); NNotificationCenterExt::addObserver(self, @selector(reportDownloadingFailed:), downloadFailedNotificationName, NULL); } -(void)removeObjectDownloadObservers { NNotificationCenterExt::removeObserver(self, downloadProgressNotificationName, NULL); NNotificationCenterExt::removeObserver(self, downloadFailedNotificationName, NULL); NNotificationCenterExt::removeObserver(self, downloadFinishedNotificationName, NULL); } // Displays busy indicator - (void)showWaiterWithText: (NSString *) text { self.waiterView = [[[UIAlertView alloc] initWithTitle:text message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil] autorelease]; UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; activityView.frame = CGRectMake(139.0f - 18.0f, 50.0f, 37.0f, 37.0f); [activityView startAnimating]; [[self waiterView] addSubview:activityView]; [[self waiterView] show]; [activityView release]; } // Remove busy indicator - (void)hideWaiter { [[self waiterView] dismissWithClickedButtonIndex:0 animated:NO]; [self setWaiterView: nil]; } // Removes specified repository object -(void)removeReport: (SPPLMetabaseRepositoryObjectDescriptor) objectDescriptor { m_metabase->removeObject(objectDescriptor); // Update repository state [self updateRepository]; } // Displays controller view in full-screen mode -(void) showViewControllerInFullScreen: (UIViewController *) viewController { [self showViewInFullScreen: [viewController view]]; } // Displays specified view in full-screen mode -(void) showViewInFullScreen: (UIView *) view { // Delete all window subviews NSArray *subviews = [self.view subviews]; for (UIView *subView in subviews) { [subView removeFromSuperview]; } // Displays controller view [[self view] addSubview: view]; } // Displays controller view in full-screen mode -(void) showViewControllerInNavigationController: (UIViewController *) viewController { UINavigationController *navigationCtrl = [[UINavigationController alloc] initWithRootViewController: viewController]; // Dsiplay controller view [self showViewControllerInFullScreen: navigationCtrl]; } // Displays view in full-screen mode -(void) showViewInNavigationController: (UIView *) view { UINavigationController *navigationCtrl = [UINavigationController new]; [[navigationCtrl view] addSubview: view]; // Display controller view [self showViewControllerInFullScreen: navigationCtrl]; } // Displays controller view in popup window -(void) showViewControllerInPopover: (UIViewController *) viewController { UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController: viewController]; [popover presentPopoverFromRect:[[viewController view] frame] inView:[self view] permittedArrowDirections:NULL animated:NO]; } // Opens report with dashboards -(void) openReport { // Create a report object with dashboards m_dashboardReport = PPLDashboardReport::dashboardReport(m_dashboardReportDescriptor); m_controller = [MADashboardReportViewControllerFactory createReport: m_dashboardReport metabase: m_metabase]; // Display report with dashboards [self showReport:m_controller]; [self hideWaiter]; // Execute custom example [self performSelector:@selector(executeExample) withObject:NULL afterDelay:delay]; } // Displays report with dashboards - (void)showReport:(UIViewController *)controller { [self showViewControllerInNavigationController: controller]; } - (void)viewDidLoad { [super viewDidLoad]; } // Executes custom example placed in the body of this method -(void)executeExample { } @end
See also: