| #import "SkUIDetailViewController.h" |
| #import "SkApplication.h" |
| #import "SkWindow.h" |
| #import "SkCGUtils.h" |
| |
| @implementation SkUIDetailViewController |
| @synthesize fNavigationBar, fPrintButton; |
| |
| - (void)viewDidLoad { |
| [super viewDidLoad]; |
| |
| fSkUIView = (SkUIView_shell*)self.view; |
| fSkUIView.fTitle = fNavigationBar.topItem; |
| |
| application_init(); |
| fWind = (SampleWindow*)create_sk_window(self.view); |
| CGSize s = self.view.bounds.size; |
| fWind->resize(s.width, s.height); |
| [fSkUIView setSkWindow:(SkOSWindow*)fWind]; |
| |
| [self initGestureRecognizers]; |
| [NSTimer scheduledTimerWithTimeInterval:0.001 target:self |
| selector:@selector(redraw) userInfo:nil |
| repeats:YES]; |
| } |
| |
| - (void)dealloc { |
| [fNavigationBar release]; |
| [fPrintButton release]; |
| application_term(); |
| delete fWind; |
| [super dealloc]; |
| } |
| |
| - (void)redraw { |
| [self.view setNeedsDisplay]; |
| } |
| |
| - (void)populateRoot:(SkUIRootViewController*)rootVC { |
| for (int i = 0; i < fWind->sampleCount(); ++i) { |
| [rootVC addItem:[NSString stringWithUTF8String:fWind->getSampleTitle(i).c_str()]]; |
| } |
| } |
| |
| - (void)goToItem:(NSUInteger)index { |
| fWind->goToSample(index); |
| } |
| |
| - (IBAction)printContent:(id)sender { |
| UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; |
| UIPrintInfo *printInfo = [UIPrintInfo printInfo]; |
| printInfo.jobName = @"Skia iOS SampleApp"; |
| printInfo.duplex = UIPrintInfoDuplexLongEdge; |
| |
| printInfo.outputType = UIPrintInfoOutputGeneral; |
| fWind->saveToPdf(); |
| [self.view drawRect:self.view.bounds]; |
| fData = fWind->getPDFData(); |
| NSData* data = [NSData dataWithBytesNoCopy:(void*)fData->data() length:fData->size()]; |
| controller.showsPageRange = YES; |
| controller.printInfo = printInfo; |
| controller.printingItem = data; |
| //Add ref because data pointer retains a pointer to data |
| fData->ref(); |
| |
| void (^SkCompletionHandler)(UIPrintInteractionController *, BOOL, NSError *) = |
| ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { |
| fData->unref(); |
| if (!completed && error) |
| NSLog(@"FAILED! due to error in domain %@ with error code %u", |
| error.domain, error.code); |
| }; |
| |
| if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
| [controller presentFromBarButtonItem:fPrintButton animated:YES |
| completionHandler:SkCompletionHandler]; |
| } else { |
| [controller presentAnimated:YES completionHandler:SkCompletionHandler]; |
| } |
| } |
| |
| #pragma mark - |
| #pragma mark Rotation support |
| |
| - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { |
| return YES; // Overriden to allow auto rotation for any direction |
| } |
| |
| #pragma mark - |
| #pragma mark Managing the popover |
| |
| - (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { |
| // Add the popover button to the left navigation item. |
| [fNavigationBar.topItem setLeftBarButtonItem:barButtonItem animated:NO]; |
| } |
| |
| |
| - (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { |
| // Remove the popover button. |
| [fNavigationBar.topItem setLeftBarButtonItem:nil animated:NO]; |
| } |
| |
| // Gestures |
| - (void)initGestureRecognizers { |
| UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] |
| initWithTarget:self |
| action:@selector(handleDoubleTapGesture:)]; |
| doubleTap.numberOfTapsRequired = 2; |
| [self.view addGestureRecognizer:doubleTap]; |
| [doubleTap release]; |
| |
| UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] |
| initWithTarget:self |
| action:@selector(handlePanGesture:)]; |
| [self.view addGestureRecognizer:pan]; |
| [pan release]; |
| |
| UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] |
| initWithTarget:self |
| action:@selector(handlePinchGesture:)]; |
| [self.view addGestureRecognizer:pinch]; |
| [pinch release]; |
| |
| UISwipeGestureRecognizer *lswipe = [[UISwipeGestureRecognizer alloc] |
| initWithTarget:self |
| action:@selector(handleSwipeGesture:)]; |
| lswipe.direction = UISwipeGestureRecognizerDirectionLeft; |
| [self.view addGestureRecognizer:lswipe]; |
| [lswipe release]; |
| |
| UISwipeGestureRecognizer *rswipe = [[UISwipeGestureRecognizer alloc] |
| initWithTarget:self |
| action:@selector(handleSwipeGesture:)]; |
| //Swipe direction default to right |
| [self.view addGestureRecognizer:rswipe]; |
| [rswipe release]; |
| |
| UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] |
| initWithTarget:self |
| action:@selector(handleRotationGesture:)]; |
| [self.view addGestureRecognizer:rotation]; |
| [rotation release]; |
| } |
| |
| - (void)handleDoubleTapGesture:(UIGestureRecognizer *)sender { |
| [fSkUIView resetTransformations]; |
| } |
| |
| - (void)handlePanGesture:(UIPanGestureRecognizer *)sender { |
| CGPoint translate = [sender translationInView:self.view]; |
| switch (sender.state) { |
| case UIGestureRecognizerStateBegan: |
| fInitialOffset = fSkUIView.fOffset; |
| fInitialCenter = fSkUIView.fCenter; |
| break; |
| |
| case UIGestureRecognizerStateChanged: |
| fSkUIView.fOffset = CGPointMake(fInitialOffset.x + translate.x, |
| fInitialOffset.y + translate.y); |
| fSkUIView.fCenter = CGPointMake(fInitialCenter.x - translate.x, |
| fInitialCenter.y - translate.y); |
| break; |
| case UIGestureRecognizerStateEnded: |
| case UIGestureRecognizerStateCancelled: |
| case UIGestureRecognizerStateFailed: |
| break; |
| default: |
| break; |
| } |
| } |
| |
| - (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender { |
| switch (sender.state) { |
| case UIGestureRecognizerStateBegan: |
| fInitialScale = fSkUIView.fScale; |
| break; |
| case UIGestureRecognizerStateChanged: |
| fSkUIView.fScale = fInitialScale * [sender scale]; |
| break; |
| case UIGestureRecognizerStateEnded: |
| case UIGestureRecognizerStateCancelled: |
| case UIGestureRecognizerStateFailed: |
| break; |
| default: |
| break; |
| } |
| } |
| |
| - (void)handleSwipeGesture:(UISwipeGestureRecognizer *)sender { |
| if (sender.direction == UISwipeGestureRecognizerDirectionLeft) { |
| fWind->previousSample(); |
| } |
| else { |
| fWind->nextSample(); |
| } |
| } |
| |
| - (void)handleRotationGesture:(UIRotationGestureRecognizer *)sender { |
| switch (sender.state) { |
| case UIGestureRecognizerStateBegan: |
| fInitialRotation = fSkUIView.fRotation; |
| break; |
| case UIGestureRecognizerStateChanged: |
| fSkUIView.fRotation = fInitialRotation + [sender rotation] * 50.0; |
| break; |
| case UIGestureRecognizerStateEnded: |
| case UIGestureRecognizerStateCancelled: |
| case UIGestureRecognizerStateFailed: |
| break; |
| default: |
| break; |
| } |
| } |
| |
| @end |