1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #import "SkUIView.h" 8 #include "SkCanvas.h" 9 #include "SkCGUtils.h" 10 @implementation SkUIView 11 12 @synthesize fWind, fTitleItem, fOptionsDelegate; 13 14 - (id)initWithDefaults { 15 fWind = NULL; 16 return self; 17 } 18 19 - (id)initWithCoder:(NSCoder*)coder { 20 if ((self = [super initWithCoder:coder])) { 21 self = [self initWithDefaults]; 22 [self setUpWindow]; 23 } 24 return self; 25 } 26 27 - (id)initWithFrame:(CGRect)frame { 28 if (self = [super initWithFrame:frame]) { 29 self = [self initWithDefaults]; 30 [self setUpWindow]; 31 } 32 return self; 33 } 34 35 - (void)setUpWindow { 36 if (NULL != fWind) { 37 fWind->setVisibleP(true); 38 fWind->resize(self.frame.size.width, self.frame.size.height); 39 } 40 } 41 42 - (void)dealloc { 43 delete fWind; 44 [fTitleItem release]; 45 [super dealloc]; 46 } 47 48 - (void)forceRedraw { 49 [self drawInRaster]; 50 } 51 52 - (void)drawInRaster { 53 SkCanvas canvas(fWind->getBitmap()); 54 fWind->draw(&canvas); 55 CGImageRef cgimage = SkCreateCGImageRef(fWind->getBitmap()); 56 self.layer.contents = (id)cgimage; 57 CGImageRelease(cgimage); 58 } 59 60 //Gesture Handlers 61 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 62 for (UITouch *touch in touches) { 63 CGPoint loc = [touch locationInView:self]; 64 fWind->handleClick(loc.x, loc.y, SkView::Click::kDown_State, touch); 65 } 66 } 67 68 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 69 for (UITouch *touch in touches) { 70 CGPoint loc = [touch locationInView:self]; 71 fWind->handleClick(loc.x, loc.y, SkView::Click::kMoved_State, touch); 72 } 73 } 74 75 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 76 for (UITouch *touch in touches) { 77 CGPoint loc = [touch locationInView:self]; 78 fWind->handleClick(loc.x, loc.y, SkView::Click::kUp_State, touch); 79 } 80 } 81 82 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 83 for (UITouch *touch in touches) { 84 CGPoint loc = [touch locationInView:self]; 85 fWind->handleClick(loc.x, loc.y, SkView::Click::kUp_State, touch); 86 } 87 } 88 89 /////////////////////////////////////////////////////////////////////////////// 90 91 - (void)setSkTitle:(const char *)title { 92 if (fTitleItem) { 93 fTitleItem.title = [NSString stringWithUTF8String:title]; 94 } 95 } 96 97 - (BOOL)onHandleEvent:(const SkEvent&)evt { 98 return false; 99 } 100 101 - (void)getAttachmentInfo:(SkOSWindow::AttachmentInfo*)info { 102 // we don't have a GL context. 103 info->fSampleCount = 0; 104 info->fStencilBits = 0; 105 } 106 107 #include "SkOSMenu.h" 108 - (void)onAddMenu:(const SkOSMenu*)menu { 109 [self.fOptionsDelegate view:self didAddMenu:menu]; 110 } 111 - (void)onUpdateMenu:(SkOSMenu*)menu { 112 [self.fOptionsDelegate view:self didUpdateMenu:menu]; 113 } 114 115 - (void)postInvalWithRect:(const SkIRect*)r { 116 [self performSelector:@selector(drawInRaster) withObject:nil afterDelay:0]; 117 [self setNeedsDisplay]; 118 } 119 120 @end 121