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