2008-06-19 01:52:37 -07:00
//
// DecoderViewController . m
// ZXing
//
// Created by Christian Brunschen on 22 / 05 / 2008.
/ *
2008-06-19 13:56:24 -07:00
* Copyright 2008 ZXing authors
2008-06-19 01:52:37 -07:00
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : // www . apache . org / licenses / LICENSE -2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
# import "DecoderViewController.h"
# import "Decoder.h"
# import "NSString+HTML.h"
2008-06-25 06:17:06 -07:00
# import "ResultParser.h"
2008-06-19 01:52:37 -07:00
# import "ParsedResult.h"
# import "ResultAction.h"
# import "Database.h"
# import "ArchiveController.h"
2008-08-14 04:00:48 -07:00
# import "MessageViewController.h"
2008-06-19 01:52:37 -07:00
# import "Scan.h"
# import "TwoDDecoderResult.h"
@ implementation DecoderViewController
@ synthesize cameraBarItem ;
@ synthesize libraryBarItem ;
@ synthesize savedPhotosBarItem ;
@ synthesize archiveBarItem ;
@ synthesize actionBarItem ;
@ synthesize messageView ;
2008-08-01 06:04:23 -07:00
@ synthesize messageTextView ;
@ synthesize messageHelpButton ;
2008-06-19 01:52:37 -07:00
@ synthesize imageView ;
@ synthesize toolbar ;
@ synthesize decoder ;
@ synthesize result ;
@ synthesize actions ;
2008-07-02 07:22:23 -07:00
@ synthesize resultPointViews ;
2008-06-19 01:52:37 -07:00
- ( id ) initWithNibName : ( NSString * ) nibNameOrNil bundle : ( NSBundle * ) nibBundleOrNil {
if ( self = [ super initWithNibName : nibNameOrNil bundle : nibBundleOrNil ] ) {
// Initialization code
2008-08-14 04:00:48 -07:00
self . title = NSLocalizedString ( @ "DecoderViewController AppTitle" , @ "Barcode Scanner" ) ;
2008-06-19 01:52:37 -07:00
Decoder * d = [ [ Decoder alloc ] init ] ;
self . decoder = d ;
d . delegate = self ;
[ d release ] ;
2008-07-02 07:22:23 -07:00
resultPointViews = [ [ NSMutableArray alloc ] init ] ;
2008-06-19 01:52:37 -07:00
}
return self ;
}
2008-08-14 04:00:48 -07:00
- ( void ) messageReady : ( id ) sender {
MessageViewController * messageController = sender ;
[ [ self navigationController ] pushViewController : messageController animated : true ] ;
[ messageController release ] ;
2008-08-01 06:04:23 -07:00
}
2008-08-14 04:00:48 -07:00
- ( void ) messageFailed : ( id ) sender {
MessageViewController * messageController = sender ;
NSLog ( @ "Failed to load message!" ) ;
[ messageController release ] ;
2008-08-01 06:04:23 -07:00
}
- ( void ) showHints : ( id ) sender {
NSLog ( @ "Showing Hints!" ) ;
2008-08-14 04:00:48 -07:00
MessageViewController * hintsController =
[ [ MessageViewController alloc ] initWithMessageFilename : @ "Hints"
target : self
onSuccess : @ selector ( messageReady : )
onFailure : @ selector ( messageFailed : ) ] ;
hintsController . title = NSLocalizedString ( @ "DecoderViewController Hints MessageViewController title" , @ "Hints" ) ;
2008-08-01 06:04:23 -07:00
hintsController . view ;
}
2008-08-14 04:00:48 -07:00
- ( void ) showAbout : ( id ) sender {
NSLog ( @ "Showing About!" ) ;
MessageViewController * aboutController =
[ [ MessageViewController alloc ] initWithMessageFilename : @ "About"
target : self
onSuccess : @ selector ( messageReady : )
onFailure : @ selector ( messageFailed : ) ] ;
aboutController . title = NSLocalizedString ( @ "DecoderViewController About MessageViewController title" , @ "About" ) ;
aboutController . view ;
}
2008-08-01 06:04:23 -07:00
# define HELP_BUTTON _WIDTH ( 44.0 )
# define HELP_BUTTON _HEIGHT ( 55.0 )
2008-07-02 07:22:23 -07:00
# define FONT_NAME @ "TimesNewRomanPSMT"
# define FONT_SIZE 16.0
2008-06-19 01:52:37 -07:00
2008-08-01 06:04:23 -07:00
- ( void ) reset {
self . result = nil ;
[ self clearImageView ] ;
[ self updateToolbar ] ;
[ self showMessage : NSLocalizedString ( @ "DecoderViewController take or choose picture" , @ "Please take or choose a picture containing a barcode" ) helpButton : YES ] ;
}
2008-06-19 01:52:37 -07:00
// Implement loadView if you want to create a view hierarchy programmatically
- ( void ) loadView {
[ super loadView ] ;
2008-07-02 07:22:23 -07:00
CGRect messageViewFrame = imageView . frame ;
2008-08-01 06:04:23 -07:00
UIView * mView = [ [ UIView alloc ] initWithFrame : messageViewFrame ] ;
2008-07-02 07:22:23 -07:00
mView . backgroundColor = [ UIColor darkGrayColor ] ;
mView . alpha = 0.9 ;
2008-06-19 01:52:37 -07:00
mView . autoresizingMask = UIViewAutoresizingFlexibleHeight |
2008-08-01 06:04:23 -07:00
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleTopMargin ;
UITextView * mTextView = [ [ UITextView alloc ] initWithFrame : messageViewFrame ] ;
mTextView . autoresizingMask = UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleWidth ;
mTextView . editable = false ;
mTextView . scrollEnabled = true ;
mTextView . font = [ UIFont fontWithName : FONT_NAME size : FONT_SIZE ] ;
mTextView . textColor = [ UIColor whiteColor ] ;
mTextView . backgroundColor = [ [ UIColor lightGrayColor ] colorWithAlphaComponent : 0.0 ] ;
mTextView . textAlignment = UITextAlignmentLeft ;
mTextView . alpha = 1.0 ;
[ mView addSubview : mTextView ] ;
UIButton * mHelpButton = [ [ UIButton buttonWithType : UIButtonTypeInfoLight ] retain ] ;
mHelpButton . frame = CGRectMake ( messageViewFrame . size . width - HELP_BUTTON _WIDTH , 0.0 , HELP_BUTTON _WIDTH , HELP_BUTTON _HEIGHT ) ;
mHelpButton . backgroundColor = [ UIColor clearColor ] ;
[ mHelpButton setUserInteractionEnabled : YES ] ;
[ mHelpButton addTarget : self action : @ selector ( showHints : ) forControlEvents : UIControlEventTouchUpInside ] ;
self . messageHelpButton = mHelpButton ;
[ mHelpButton release ] ;
self . messageTextView = mTextView ;
[ mTextView release ] ;
2008-06-19 01:52:37 -07:00
self . messageView = mView ;
[ mView release ] ;
2008-07-02 07:22:23 -07:00
[ self . view addSubview : self . messageView ] ;
2008-08-01 06:04:23 -07:00
2008-08-14 04:00:48 -07:00
// add the ' About ' button at the top - right of the navigation bar
UIBarButtonItem * aboutButton =
[ [ UIBarButtonItem alloc ] initWithTitle : NSLocalizedString ( @ "DecoderViewController about button title" , @ "About" )
style : UIBarButtonItemStyleBordered
target : self
action : @ selector ( showAbout : ) ] ;
self . navigationItem . rightBarButtonItem = aboutButton ;
[ aboutButton release ] ;
2008-08-01 06:04:23 -07:00
[ self reset ] ;
2008-06-19 01:52:37 -07:00
}
- ( void ) updateToolbar {
self . cameraBarItem . enabled = [ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypeCamera ] ;
self . savedPhotosBarItem . enabled = [ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypeSavedPhotosAlbum ] ;
self . libraryBarItem . enabled = [ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypePhotoLibrary ] ;
self . archiveBarItem . enabled = true ;
self . actionBarItem . enabled = ( self . result ! = nil ) && ( [ self . result actions ] ! = nil ) && ( [ self . result actions ] . count > 0 ) ;
}
// If you need to do additional setup after loading the view , override viewDidLoad .
- ( void ) viewDidLoad {
[ super viewDidLoad ] ;
}
2008-06-25 06:17:06 -07:00
- ( void ) clearImageView {
imageView . image = nil ;
2008-07-02 07:22:23 -07:00
for ( UIView * view in resultPointViews ) {
2008-06-25 06:17:06 -07:00
[ view removeFromSuperview ] ;
}
2008-07-02 07:22:23 -07:00
[ resultPointViews removeAllObjects ] ;
2008-06-25 06:17:06 -07:00
}
2008-06-19 01:52:37 -07:00
- ( void ) pickAndDecodeFromSource : ( UIImagePickerControllerSourceType ) sourceType {
2008-08-01 06:04:23 -07:00
[ self reset ] ;
\
2008-06-19 01:52:37 -07:00
// Create the Image Picker
if ( [ UIImagePickerController isSourceTypeAvailable : sourceType ] ) {
UIImagePickerController * picker = [ [ UIImagePickerController alloc ] init ] ;
picker . sourceType = sourceType ;
picker . delegate = self ;
2008-07-02 07:22:23 -07:00
picker . allowsImageEditing = YES ; // [ [ NSUserDefaults standardUserDefaults ] boolForKey : @ "allowEditing" ] ;
2008-06-19 01:52:37 -07:00
// Picker is displayed asynchronously .
[ self presentModalViewController : picker animated : YES ] ;
} else {
NSLog ( @ "Attempted to pick an image with illegal source type '%d'" , sourceType ) ;
}
}
- ( IBAction ) pickAndDecode : ( id ) sender {
UIImagePickerControllerSourceType sourceType ;
int i = [ sender tag ] ;
switch ( i ) {
case 0 : sourceType = UIImagePickerControllerSourceTypeCamera ; break ;
case 1 : sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum ; break ;
case 2 : sourceType = UIImagePickerControllerSourceTypePhotoLibrary ; break ;
default : sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum ;
}
[ self pickAndDecodeFromSource : sourceType ] ;
}
- ( BOOL ) shouldAutorotateToInterfaceOrientation : ( UIInterfaceOrientation ) interfaceOrientation {
2008-10-01 13:19:55 -07:00
// Return YES for supported orientations
return ( interfaceOrientation = = UIInterfaceOrientationPortrait ) ;
2008-06-19 01:52:37 -07:00
}
- ( void ) didReceiveMemoryWarning {
2008-10-01 13:19:55 -07:00
[ super didReceiveMemoryWarning ] ; // Releases the view if it doesn ' t have a superview
// Release anything that ' s not essential , such as cached data
2008-06-19 01:52:37 -07:00
}
- ( void ) dealloc {
[ decoder release ] ;
2008-06-25 06:17:06 -07:00
[ self clearImageView ] ;
2008-06-19 01:52:37 -07:00
[ imageView release ] ;
[ actionBarItem release ] ;
[ cameraBarItem release ] ;
[ libraryBarItem release ] ;
[ savedPhotosBarItem release ] ;
[ archiveBarItem release ] ;
[ toolbar release ] ;
2008-07-02 07:22:23 -07:00
[ actions dealloc ] ;
[ resultPointViews dealloc ] ;
2008-06-19 01:52:37 -07:00
[ super dealloc ] ;
}
2008-08-01 06:04:23 -07:00
- ( void ) showMessage : ( NSString * ) message helpButton : ( BOOL ) showHelpButton {
2008-06-24 09:24:36 -07:00
# ifdef DEBUG
2008-08-01 06:04:23 -07:00
NSLog ( @ "Showing message '%@' %@ help Button" , message , showHelpButton ? @ "with" : @ "without" ) ;
2008-06-24 09:24:36 -07:00
# endif
2008-07-02 07:22:23 -07:00
CGSize maxSize = imageView . bounds . size ;
2008-08-01 06:04:23 -07:00
if ( showHelpButton ) {
maxSize . width - = messageHelpButton . frame . size . width ;
}
CGSize size = [ message sizeWithFont : messageTextView . font constrainedToSize : maxSize lineBreakMode : UILineBreakModeWordWrap ] ;
2008-07-02 07:22:23 -07:00
float height = 20.0 + fmin ( 100.0 , size . height ) ;
2008-08-01 06:04:23 -07:00
if ( showHelpButton ) {
height = fmax ( HELP_BUTTON _HEIGHT , height ) ;
}
2008-07-02 07:22:23 -07:00
CGRect messageFrame = imageView . bounds ;
messageFrame . origin . y = CGRectGetMaxY ( messageFrame ) - height ;
messageFrame . size . height = height ;
[ self . messageView setFrame : messageFrame ] ;
2008-08-07 08:03:21 -07:00
messageView . autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth ;
2008-08-01 06:04:23 -07:00
CGRect messageViewBounds = [ messageView bounds ] ;
self . messageTextView . text = message ;
2008-08-07 08:03:21 -07:00
messageTextView . autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ;
2008-08-01 06:04:23 -07:00
if ( showHelpButton ) {
CGRect textViewFrame ;
CGRect helpButtonFrame ;
CGRectDivide ( messageViewBounds , & helpButtonFrame , & textViewFrame , HELP_BUTTON _WIDTH , CGRectMaxXEdge ) ;
[ self . messageTextView setFrame : textViewFrame ] ;
[ messageHelpButton setFrame : helpButtonFrame ] ;
messageHelpButton . alpha = 1.0 ;
messageHelpButton . enabled = YES ;
2008-08-07 08:03:21 -07:00
messageHelpButton . autoresizingMask =
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleTopMargin ;
2008-08-01 06:04:23 -07:00
[ messageView addSubview : messageHelpButton ] ;
} else {
[ messageHelpButton removeFromSuperview ] ;
messageHelpButton . alpha = 0.0 ;
messageHelpButton . enabled = NO ;
[ self . messageTextView setFrame : messageViewBounds ] ;
}
2008-06-19 01:52:37 -07:00
}
// DecoderDelegate methods
- ( void ) decoder : ( Decoder * ) decoder willDecodeImage : ( UIImage * ) image {
2008-06-25 06:17:06 -07:00
[ self clearImageView ] ;
2008-06-19 01:52:37 -07:00
[ self . imageView setImage : image ] ;
2008-08-01 06:04:23 -07:00
[ self showMessage : [ NSString stringWithFormat : NSLocalizedString ( @ "DecoderViewController MessageWhileDecodingWithDimensions" , @ "Decoding image (%.0fx%.0f) ..." ) , image . size . width , image . size . height ]
helpButton : NO ] ;
2008-06-19 01:52:37 -07:00
}
- ( void ) decoder : ( Decoder * ) decoder
decodingImage : ( UIImage * ) image
usingSubset : ( UIImage * ) subset
progress : ( NSString * ) message {
2008-06-25 06:17:06 -07:00
[ self clearImageView ] ;
2008-06-19 01:52:37 -07:00
[ self . imageView setImage : subset ] ;
2008-08-01 06:04:23 -07:00
[ self showMessage : message helpButton : NO ] ;
2008-06-19 01:52:37 -07:00
}
- ( void ) presentResultForString : ( NSString * ) resultString {
2008-06-25 06:17:06 -07:00
self . result = [ ResultParser parsedResultForString : resultString ] ;
2008-08-01 06:04:23 -07:00
[ self showMessage : [ self . result stringForDisplay ] helpButton : NO ] ;
2008-06-19 01:52:37 -07:00
self . actions = self . result . actions ;
2008-06-24 09:24:36 -07:00
# ifdef DEBUG
2008-06-19 01:52:37 -07:00
NSLog ( @ "result has %d actions" , actions ? 0 : actions . count ) ;
2008-06-24 09:24:36 -07:00
# endif
2008-06-19 01:52:37 -07:00
[ self updateToolbar ] ;
2008-06-25 06:17:06 -07:00
}
- ( void ) presentResultPoints : ( NSArray * ) resultPoints
forImage : ( UIImage * ) image
usingSubset : ( UIImage * ) subset {
2008-07-02 07:22:23 -07:00
// simply add the points to the image view
imageView . image = subset ;
2008-06-25 06:17:06 -07:00
for ( NSValue * pointValue in resultPoints ) {
2008-07-02 07:22:23 -07:00
[ imageView addResultPoint : [ pointValue CGPointValue ] ] ;
2008-06-25 06:17:06 -07:00
}
}
2008-06-19 01:52:37 -07:00
2008-06-25 06:17:06 -07:00
- ( void ) decoder : ( Decoder * ) decoder didDecodeImage : ( UIImage * ) image usingSubset : ( UIImage * ) subset withResult : ( TwoDDecoderResult * ) twoDResult {
2008-06-19 01:52:37 -07:00
[ self presentResultForString : twoDResult . text ] ;
2008-06-25 06:17:06 -07:00
[ self presentResultPoints : twoDResult . points forImage : image usingSubset : subset ] ;
2008-06-19 01:52:37 -07:00
// save the scan to the shared database
[ [ Database sharedDatabase ] addScanWithText : twoDResult . text ] ;
[ self performResultAction : self ] ;
}
2008-06-25 06:17:06 -07:00
- ( void ) decoder : ( Decoder * ) decoder failedToDecodeImage : ( UIImage * ) image usingSubset : ( UIImage * ) subset reason : ( NSString * ) reason {
2008-08-01 06:04:23 -07:00
[ self showMessage : reason helpButton : YES ] ;
2008-06-19 01:52:37 -07:00
[ self updateToolbar ] ;
}
2008-07-02 07:22:23 -07:00
- ( void ) willAnimateFirstHalfOfRotationToInterfaceOrientation : ( UIInterfaceOrientation ) toInterfaceOrientation duration : ( NSTimeInterval ) duration {
[ super willAnimateFirstHalfOfRotationToInterfaceOrientation : toInterfaceOrientation duration : duration ] ;
if ( imageView . image ) {
/ *
CGRect viewBounds = imageView . bounds ;
CGSize imageSize = imageView . image . size ;
float scale = fmin ( viewBounds . size . width / imageSize . width ,
viewBounds . size . height / imageSize . height ) ;
float xOffset = ( viewBounds . size . width - scale * imageSize . width ) / 2.0 ;
float yOffset = ( viewBounds . size . height - scale * imageSize . height ) / 2.0 ;
* /
for ( UIView * view in resultPointViews ) {
view . alpha = 0.0 ;
}
}
}
- ( void ) willAnimateSecondHalfOfRotationFromInterfaceOrientation : ( UIInterfaceOrientation ) fromInterfaceOrientation duration : ( NSTimeInterval ) duration {
[ super willAnimateSecondHalfOfRotationFromInterfaceOrientation : fromInterfaceOrientation duration : duration ] ;
if ( imageView . image ) {
/ *
CGRect viewBounds = imageView . bounds ;
CGSize imageSize = imageView . image . size ;
float scale = fmin ( viewBounds . size . width / imageSize . width ,
viewBounds . size . height / imageSize . height ) ;
float xOffset = ( viewBounds . size . width - scale * imageSize . width ) / 2.0 ;
float yOffset = ( viewBounds . size . height - scale * imageSize . height ) / 2.0 ;
* /
for ( UIView * view in resultPointViews ) {
view . alpha = 1.0 ;
}
}
}
2008-06-19 01:52:37 -07:00
// UIImagePickerControllerDelegate methods
- ( void ) imagePickerController : ( UIImagePickerController * ) picker
didFinishPickingImage : ( UIImage * ) image
editingInfo : ( NSDictionary * ) editingInfo
{
2008-06-25 06:17:06 -07:00
UIImage * imageToDecode = image ;
2008-06-24 09:24:36 -07:00
# ifdef DEBUG
2008-06-19 01:52:37 -07:00
NSLog ( @ "picked image size = (%f, %f)" , image . size . width , image . size . height ) ;
2008-06-25 06:17:06 -07:00
# endif
2008-06-19 01:52:37 -07:00
if ( editingInfo ) {
UIImage * originalImage = [ editingInfo objectForKey : UIImagePickerControllerOriginalImage ] ;
if ( originalImage ) {
2008-06-25 06:17:06 -07:00
# ifdef DEBUG
2008-06-19 01:52:37 -07:00
NSLog ( @ "original image size = (%f, %f)" , originalImage . size . width , originalImage . size . height ) ;
2008-06-25 06:17:06 -07:00
# endif
NSValue * cropRectValue = [ editingInfo objectForKey : UIImagePickerControllerCropRect ] ;
if ( cropRectValue ) {
CGRect cropRect = [ cropRectValue CGRectValue ] ;
# ifdef DEBUG
NSLog ( @ "crop rect = (%f, %f) x (%f, %f)" , CGRectGetMinX ( cropRect ) , CGRectGetMinY ( cropRect ) , CGRectGetWidth ( cropRect ) , CGRectGetHeight ( cropRect ) ) ;
# endif
UIGraphicsBeginImageContext ( cropRect . size ) ;
[ originalImage drawAtPoint : CGPointMake ( - CGRectGetMinX ( cropRect ) ,
- CGRectGetMinY ( cropRect ) ) ] ;
imageToDecode = UIGraphicsGetImageFromCurrentImageContext ( ) ;
UIGraphicsEndImageContext ( ) ;
}
2008-06-19 01:52:37 -07:00
}
}
[ [ picker parentViewController ] dismissModalViewControllerAnimated : YES ] ;
2008-06-25 06:17:06 -07:00
[ imageToDecode retain ] ;
2008-06-19 01:52:37 -07:00
[ picker release ] ;
2008-06-25 06:17:06 -07:00
[ self . decoder decodeImage : imageToDecode ] ;
[ imageToDecode release ] ;
2008-06-19 01:52:37 -07:00
[ self updateToolbar ] ;
}
- ( void ) imagePickerControllerDidCancel : ( UIImagePickerController * ) picker
{
[ picker dismissModalViewControllerAnimated : YES ] ;
[ picker release ] ;
[ self updateToolbar ] ;
}
- ( void ) navigationController : ( UINavigationController * ) navigationController
didShowViewController : ( UIViewController * ) viewController
animated : ( BOOL ) animated {
// no - op
}
- ( void ) navigationController : ( UINavigationController * ) navigationController
willShowViewController : ( UIViewController * ) viewController
animated : ( BOOL ) animated {
// no - op
}
2008-06-24 07:18:11 -07:00
- ( void ) performAction : ( ResultAction * ) action {
[ action performActionWithController : self shouldConfirm : NO ] ;
}
- ( void ) confirmAndPerformAction : ( ResultAction * ) action {
[ action performActionWithController : self shouldConfirm : YES ] ;
}
2008-06-19 01:52:37 -07:00
- ( IBAction ) performResultAction : ( id ) sender {
if ( self . result = = nil ) {
NSLog ( @ "no result to perform an action on!" ) ;
return ;
}
if ( self . actions = = nil || self . actions . count = = 0 ) {
NSLog ( @ "result has no actions to perform!" ) ;
return ;
}
if ( self . actions . count = = 1 ) {
ResultAction * action = [ self . actions lastObject ] ;
2008-06-24 09:24:36 -07:00
# ifdef DEBUG
2008-06-19 01:52:37 -07:00
NSLog ( @ "Result has the single action, (%@) '%@', performing it" ,
NSStringFromClass ( [ action class ] ) , [ action title ] ) ;
2008-06-24 09:24:36 -07:00
# endif
2008-06-24 07:18:11 -07:00
[ self performSelector : @ selector ( confirmAndPerformAction : )
withObject : action
2008-06-19 01:52:37 -07:00
afterDelay : 0.0 ] ;
} else {
2008-06-24 09:24:36 -07:00
# ifdef DEBUG
2008-06-19 01:52:37 -07:00
NSLog ( @ "Result has multiple actions, popping up an action sheet" ) ;
2008-06-24 09:24:36 -07:00
# endif
2008-06-19 01:52:37 -07:00
UIActionSheet * actionSheet = [ [ UIActionSheet alloc ] initWithFrame : self . view . bounds ] ;
for ( ResultAction * action in self . actions ) {
[ actionSheet addButtonWithTitle : [ action title ] ] ;
}
2008-08-01 06:04:23 -07:00
int cancelIndex = [ actionSheet addButtonWithTitle : NSLocalizedString ( @ "DecoderViewController cancel button title" , @ "Cancel" ) ] ;
2008-06-19 01:52:37 -07:00
actionSheet . cancelButtonIndex = cancelIndex ;
actionSheet . delegate = self ;
[ actionSheet showFromToolbar : self . toolbar ] ;
}
}
- ( void ) actionSheet : ( UIActionSheet * ) actionSheet clickedButtonAtIndex : ( NSInteger ) buttonIndex {
if ( buttonIndex < self . actions . count ) {
int actionIndex = buttonIndex ;
ResultAction * action = [ self . actions objectAtIndex : actionIndex ] ;
2008-06-24 07:18:11 -07:00
[ self performSelector : @ selector ( performAction : )
withObject : action
2008-06-19 01:52:37 -07:00
afterDelay : 0.0 ] ;
}
}
- ( IBAction ) showArchive : ( id ) sender {
ArchiveController * archiveController = [ [ ArchiveController alloc ] initWithDecoderViewController : self ] ;
[ [ self navigationController ] pushViewController : archiveController animated : true ] ;
[ archiveController release ] ;
}
- ( void ) showScan : ( Scan * ) scan {
2008-06-25 06:17:06 -07:00
[ self clearImageView ] ;
2008-06-19 01:52:37 -07:00
[ self presentResultForString : scan . text ] ;
2008-06-24 03:04:08 -07:00
[ [ self navigationController ] popToViewController : self animated : YES ] ;
2008-06-19 01:52:37 -07:00
}
@ end