Sample App ported to an universal iOS app with airprint enabled


git-svn-id: http://skia.googlecode.com/svn/trunk@1703 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/iOSSampleApp/SkUIDetailViewController.mm b/experimental/iOSSampleApp/SkUIDetailViewController.mm
new file mode 100644
index 0000000..fdaa215
--- /dev/null
+++ b/experimental/iOSSampleApp/SkUIDetailViewController.mm
@@ -0,0 +1,215 @@
+#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