From 57dcd70c756bd1e8501aabeff67e7b765e6307d2 Mon Sep 17 00:00:00 2001 From: rpechayr Date: Mon, 15 Nov 2010 17:07:03 +0000 Subject: [PATCH] [iphone/barcodes] integration of archive barcodes view in progress. Default images added, including version suitable for iPhone 4 git-svn-id: https://zxing.googlecode.com/svn/trunk@1654 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../Barcodes.xcodeproj/project.pbxproj | 82 ++++++ iphone/Barcodes/Classes/ArchiveController.h | 41 +++ iphone/Barcodes/Classes/ArchiveController.m | 160 +++++++++++ iphone/Barcodes/Classes/Database.h | 41 +++ iphone/Barcodes/Classes/Database.m | 115 ++++++++ iphone/Barcodes/Classes/Scan.h | 37 +++ iphone/Barcodes/Classes/Scan.m | 40 +++ iphone/Barcodes/Classes/ScanCell.h | 42 +++ iphone/Barcodes/Classes/ScanCell.m | 175 ++++++++++++ iphone/Barcodes/Classes/ScanViewController.h | 39 +++ iphone/Barcodes/Classes/ScanViewController.m | 255 ++++++++++++++++++ .../Barcodes/Classes/ZXMainViewController.h | 1 + .../Barcodes/Classes/ZXMainViewController.mm | 11 + .../Barcodes/Classes/ZXMainViewController.xib | 67 ++++- iphone/Barcodes/images/Default.png | Bin 0 -> 38209 bytes iphone/Barcodes/images/Default@2x.png | Bin 0 -> 56162 bytes iphone/Barcodes/images/business-card.png | Bin 0 -> 334 bytes iphone/Barcodes/images/email.png | Bin 0 -> 608 bytes iphone/Barcodes/images/filmroll-2.png | Bin 0 -> 326 bytes iphone/Barcodes/images/link1.png | Bin 0 -> 578 bytes iphone/Barcodes/images/link2.png | Bin 0 -> 340 bytes iphone/Barcodes/images/map-pin.png | Bin 0 -> 515 bytes iphone/Barcodes/images/phone.png | Bin 0 -> 417 bytes iphone/Barcodes/images/photolib.png | Bin 0 -> 204 bytes iphone/Barcodes/images/sms.png | Bin 0 -> 657 bytes iphone/Barcodes/images/text.png | Bin 0 -> 376 bytes iphone/Barcodes/scans.db | Bin 0 -> 2048 bytes 27 files changed, 1096 insertions(+), 10 deletions(-) create mode 100644 iphone/Barcodes/Classes/ArchiveController.h create mode 100644 iphone/Barcodes/Classes/ArchiveController.m create mode 100644 iphone/Barcodes/Classes/Database.h create mode 100644 iphone/Barcodes/Classes/Database.m create mode 100644 iphone/Barcodes/Classes/Scan.h create mode 100644 iphone/Barcodes/Classes/Scan.m create mode 100644 iphone/Barcodes/Classes/ScanCell.h create mode 100644 iphone/Barcodes/Classes/ScanCell.m create mode 100644 iphone/Barcodes/Classes/ScanViewController.h create mode 100644 iphone/Barcodes/Classes/ScanViewController.m create mode 100644 iphone/Barcodes/images/Default.png create mode 100644 iphone/Barcodes/images/Default@2x.png create mode 100644 iphone/Barcodes/images/business-card.png create mode 100644 iphone/Barcodes/images/email.png create mode 100644 iphone/Barcodes/images/filmroll-2.png create mode 100644 iphone/Barcodes/images/link1.png create mode 100644 iphone/Barcodes/images/link2.png create mode 100644 iphone/Barcodes/images/map-pin.png create mode 100644 iphone/Barcodes/images/phone.png create mode 100644 iphone/Barcodes/images/photolib.png create mode 100644 iphone/Barcodes/images/sms.png create mode 100644 iphone/Barcodes/images/text.png create mode 100644 iphone/Barcodes/scans.db diff --git a/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj b/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj index 905ad23ee..d6dea7234 100755 --- a/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj +++ b/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj @@ -33,6 +33,24 @@ 1FB432881290295C002D63E8 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4327F1290295C002D63E8 /* MainWindow.xib */; }; 1FB432891290295C002D63E8 /* Message.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB432811290295C002D63E8 /* Message.xib */; }; 1FB4352E12904F56002D63E8 /* MessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4352D12904F56002D63E8 /* MessageViewController.m */; }; + 1FB4365712918DA9002D63E8 /* ArchiveController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4365412918DA9002D63E8 /* ArchiveController.m */; }; + 1FB4365812918DA9002D63E8 /* Database.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4365612918DA9002D63E8 /* Database.m */; }; + 1FB4366512918E90002D63E8 /* business-card.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365A12918E90002D63E8 /* business-card.png */; }; + 1FB4366612918E90002D63E8 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365B12918E90002D63E8 /* Default.png */; }; + 1FB4366712918E90002D63E8 /* email.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365C12918E90002D63E8 /* email.png */; }; + 1FB4366812918E90002D63E8 /* filmroll-2.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365D12918E90002D63E8 /* filmroll-2.png */; }; + 1FB4366912918E90002D63E8 /* link1.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365E12918E90002D63E8 /* link1.png */; }; + 1FB4366A12918E90002D63E8 /* link2.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365F12918E90002D63E8 /* link2.png */; }; + 1FB4366B12918E90002D63E8 /* map-pin.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366012918E90002D63E8 /* map-pin.png */; }; + 1FB4366C12918E90002D63E8 /* phone.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366112918E90002D63E8 /* phone.png */; }; + 1FB4366D12918E90002D63E8 /* photolib.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366212918E90002D63E8 /* photolib.png */; }; + 1FB4366E12918E90002D63E8 /* sms.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366312918E90002D63E8 /* sms.png */; }; + 1FB4366F12918E90002D63E8 /* text.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366412918E90002D63E8 /* text.png */; }; + 1FB4367512918F63002D63E8 /* Scan.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4367412918F63002D63E8 /* Scan.m */; }; + 1FB4367D12918FAF002D63E8 /* ScanCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4367C12918FAF002D63E8 /* ScanCell.m */; }; + 1FB4369612918FF0002D63E8 /* ScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4369512918FF0002D63E8 /* ScanViewController.m */; }; + 1FB4369A12919014002D63E8 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB4369912919014002D63E8 /* libsqlite3.dylib */; }; + 1FB436DF129194E7002D63E8 /* scans.db in Resources */ = {isa = PBXBuildFile; fileRef = 1FB436DE129194E7002D63E8 /* scans.db */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; /* End PBXBuildFile section */ @@ -98,6 +116,29 @@ 1FB4329712902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/Message.xib; sourceTree = ""; }; 1FB4352C12904F56002D63E8 /* MessageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageViewController.h; sourceTree = ""; }; 1FB4352D12904F56002D63E8 /* MessageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageViewController.m; sourceTree = ""; }; + 1FB4365312918DA9002D63E8 /* ArchiveController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArchiveController.h; sourceTree = ""; }; + 1FB4365412918DA9002D63E8 /* ArchiveController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ArchiveController.m; sourceTree = ""; }; + 1FB4365512918DA9002D63E8 /* Database.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Database.h; sourceTree = ""; }; + 1FB4365612918DA9002D63E8 /* Database.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Database.m; sourceTree = ""; }; + 1FB4365A12918E90002D63E8 /* business-card.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "business-card.png"; path = "images/business-card.png"; sourceTree = ""; }; + 1FB4365B12918E90002D63E8 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = images/Default.png; sourceTree = ""; }; + 1FB4365C12918E90002D63E8 /* email.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = email.png; path = images/email.png; sourceTree = ""; }; + 1FB4365D12918E90002D63E8 /* filmroll-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "filmroll-2.png"; path = "images/filmroll-2.png"; sourceTree = ""; }; + 1FB4365E12918E90002D63E8 /* link1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = link1.png; path = images/link1.png; sourceTree = ""; }; + 1FB4365F12918E90002D63E8 /* link2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = link2.png; path = images/link2.png; sourceTree = ""; }; + 1FB4366012918E90002D63E8 /* map-pin.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "map-pin.png"; path = "images/map-pin.png"; sourceTree = ""; }; + 1FB4366112918E90002D63E8 /* phone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = phone.png; path = images/phone.png; sourceTree = ""; }; + 1FB4366212918E90002D63E8 /* photolib.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = photolib.png; path = images/photolib.png; sourceTree = ""; }; + 1FB4366312918E90002D63E8 /* sms.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sms.png; path = images/sms.png; sourceTree = ""; }; + 1FB4366412918E90002D63E8 /* text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = text.png; path = images/text.png; sourceTree = ""; }; + 1FB4367312918F63002D63E8 /* Scan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scan.h; sourceTree = ""; }; + 1FB4367412918F63002D63E8 /* Scan.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Scan.m; sourceTree = ""; }; + 1FB4367B12918FAF002D63E8 /* ScanCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanCell.h; sourceTree = ""; }; + 1FB4367C12918FAF002D63E8 /* ScanCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScanCell.m; sourceTree = ""; }; + 1FB4369412918FF0002D63E8 /* ScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanViewController.h; sourceTree = ""; }; + 1FB4369512918FF0002D63E8 /* ScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScanViewController.m; sourceTree = ""; }; + 1FB4369912919014002D63E8 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; + 1FB436DE129194E7002D63E8 /* scans.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = scans.db; sourceTree = ""; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; @@ -121,6 +162,7 @@ 1FB43100129008B9002D63E8 /* CoreMedia.framework in Frameworks */, 1FB431AB12901D7D002D63E8 /* AddressBook.framework in Frameworks */, 1FB431B112901D8C002D63E8 /* AddressBookUI.framework in Frameworks */, + 1FB4369A12919014002D63E8 /* libsqlite3.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -130,6 +172,16 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 1FB4369412918FF0002D63E8 /* ScanViewController.h */, + 1FB4369512918FF0002D63E8 /* ScanViewController.m */, + 1FB4367B12918FAF002D63E8 /* ScanCell.h */, + 1FB4367C12918FAF002D63E8 /* ScanCell.m */, + 1FB4367312918F63002D63E8 /* Scan.h */, + 1FB4367412918F63002D63E8 /* Scan.m */, + 1FB4365312918DA9002D63E8 /* ArchiveController.h */, + 1FB4365412918DA9002D63E8 /* ArchiveController.m */, + 1FB4365512918DA9002D63E8 /* Database.h */, + 1FB4365612918DA9002D63E8 /* Database.m */, 1FB4352C12904F56002D63E8 /* MessageViewController.h */, 1FB4352D12904F56002D63E8 /* MessageViewController.m */, 1D3623240D0F684500981E51 /* BarcodesAppDelegate.h */, @@ -168,6 +220,17 @@ 1FB4302D128FFF46002D63E8 /* images */ = { isa = PBXGroup; children = ( + 1FB4365A12918E90002D63E8 /* business-card.png */, + 1FB4365B12918E90002D63E8 /* Default.png */, + 1FB4365C12918E90002D63E8 /* email.png */, + 1FB4365D12918E90002D63E8 /* filmroll-2.png */, + 1FB4365E12918E90002D63E8 /* link1.png */, + 1FB4365F12918E90002D63E8 /* link2.png */, + 1FB4366012918E90002D63E8 /* map-pin.png */, + 1FB4366112918E90002D63E8 /* phone.png */, + 1FB4366212918E90002D63E8 /* photolib.png */, + 1FB4366312918E90002D63E8 /* sms.png */, + 1FB4366412918E90002D63E8 /* text.png */, 1FB4303A129000B4002D63E8 /* ZxingLarge.png */, 1FB4302E128FFF56002D63E8 /* icon.png */, 1FB4302F128FFF56002D63E8 /* icon@2x.png */, @@ -200,6 +263,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 1FB436DE129194E7002D63E8 /* scans.db */, 1FB432751290295C002D63E8 /* About.html */, 1FB432771290295C002D63E8 /* DecoderView.xib */, 1FB432791290295C002D63E8 /* Hints.html */, @@ -228,6 +292,7 @@ 1FB430FF129008B9002D63E8 /* CoreMedia.framework */, 1FB431AA12901D7D002D63E8 /* AddressBook.framework */, 1FB431B012901D8C002D63E8 /* AddressBookUI.framework */, + 1FB4369912919014002D63E8 /* libsqlite3.dylib */, ); name = Frameworks; sourceTree = ""; @@ -314,6 +379,18 @@ 1FB432871290295C002D63E8 /* Localizable.strings in Resources */, 1FB432881290295C002D63E8 /* MainWindow.xib in Resources */, 1FB432891290295C002D63E8 /* Message.xib in Resources */, + 1FB4366512918E90002D63E8 /* business-card.png in Resources */, + 1FB4366612918E90002D63E8 /* Default.png in Resources */, + 1FB4366712918E90002D63E8 /* email.png in Resources */, + 1FB4366812918E90002D63E8 /* filmroll-2.png in Resources */, + 1FB4366912918E90002D63E8 /* link1.png in Resources */, + 1FB4366A12918E90002D63E8 /* link2.png in Resources */, + 1FB4366B12918E90002D63E8 /* map-pin.png in Resources */, + 1FB4366C12918E90002D63E8 /* phone.png in Resources */, + 1FB4366D12918E90002D63E8 /* photolib.png in Resources */, + 1FB4366E12918E90002D63E8 /* sms.png in Resources */, + 1FB4366F12918E90002D63E8 /* text.png in Resources */, + 1FB436DF129194E7002D63E8 /* scans.db in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -328,6 +405,11 @@ 1D3623260D0F684500981E51 /* BarcodesAppDelegate.m in Sources */, 1FB430371290002C002D63E8 /* ZXMainViewController.mm in Sources */, 1FB4352E12904F56002D63E8 /* MessageViewController.m in Sources */, + 1FB4365712918DA9002D63E8 /* ArchiveController.m in Sources */, + 1FB4365812918DA9002D63E8 /* Database.m in Sources */, + 1FB4367512918F63002D63E8 /* Scan.m in Sources */, + 1FB4367D12918FAF002D63E8 /* ScanCell.m in Sources */, + 1FB4369612918FF0002D63E8 /* ScanViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iphone/Barcodes/Classes/ArchiveController.h b/iphone/Barcodes/Classes/ArchiveController.h new file mode 100644 index 000000000..c8ee5e5df --- /dev/null +++ b/iphone/Barcodes/Classes/ArchiveController.h @@ -0,0 +1,41 @@ +// +// ArchiveController.h +// UIShowcase +// +// Created by Christian Brunschen on 29/05/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 + +//@class DecoderViewController; + +@interface ArchiveController : UITableViewController { + NSMutableArray *scans; + NSMutableArray *results; +// DecoderViewController *decoderViewController; + NSDateFormatter *dateFormatter; +} + +@property (nonatomic, retain) NSMutableArray *scans; +@property (nonatomic, retain) NSMutableArray *results; +//@property (nonatomic, retain) DecoderViewController *decoderViewController; +@property (nonatomic, retain) NSDateFormatter *dateFormatter; + +- (NSInteger)scanIndexForRow:(NSInteger)row; +- (id)init; + +@end diff --git a/iphone/Barcodes/Classes/ArchiveController.m b/iphone/Barcodes/Classes/ArchiveController.m new file mode 100644 index 000000000..eafab1ccd --- /dev/null +++ b/iphone/Barcodes/Classes/ArchiveController.m @@ -0,0 +1,160 @@ +// +// ArchiveController.m +// UIShowcase +// +// Created by Christian Brunschen on 29/05/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 "ArchiveController.h" +#import "Database.h" +#import "Scan.h" +#import "ResultParser.h" +#import "ParsedResult.h" +//#import "DecoderViewController.h" +#import "ScanViewController.h" +#import "ScanCell.h" + +@implementation ArchiveController + +@synthesize scans; +@synthesize results; +//@synthesize decoderViewController; +@synthesize dateFormatter; + +- (id)init { + if ((self = [super initWithStyle:UITableViewStylePlain])) { + scans = [[NSMutableArray alloc] init]; + results = [[NSMutableArray alloc] init]; + dateFormatter = [[NSDateFormatter alloc] init]; + } + return self; +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [scans count]; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return 44.0; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *ScanIdentifier = @"ScanIdentifier"; + + ScanCell *cell = (ScanCell *)[tableView dequeueReusableCellWithIdentifier:ScanIdentifier]; + if (cell == nil) { + cell = [[[ScanCell alloc] initWithFrame:CGRectZero reuseIdentifier:ScanIdentifier] autorelease]; + } + + // Configure the cell + int idx = [self scanIndexForRow:indexPath.row]; + Scan *scan = [scans objectAtIndex:idx]; + [cell setScan:scan]; + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + //[decoderViewController showScan:[scans objectAtIndex:[self scanIndexForRow:indexPath.row]]]; + int idx = [self scanIndexForRow:indexPath.row]; + Scan *scan = [scans objectAtIndex:idx]; + ParsedResult *result = [results objectAtIndex:idx]; + ScanViewController *scanViewController = [[ScanViewController alloc] initWithResult:result forScan:scan]; + [self.navigationController pushViewController:scanViewController animated:YES]; + [scanViewController release]; +} + +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + if (editingStyle == UITableViewCellEditingStyleDelete) { + int idx = [self scanIndexForRow:indexPath.row]; + Scan *scan = [self.scans objectAtIndex:idx]; + // delete the scan from the database ... + [[Database sharedDatabase] deleteScan:scan]; + // ... delete the scan from our in-memory cache of the database ... + [scans removeObjectAtIndex:idx]; + // ... delete the corresponding result from our in-memory cache ... + [results removeObjectAtIndex:idx]; + // ... and remove the row from the table view. + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + // [tableView reloadData]; + } else if (editingStyle == UITableViewCellEditingStyleInsert) { + // no insertions! + } +} + +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + return YES; +} + +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { +} + +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + return NO; +} + + +- (void)dealloc { + [scans release]; + [results release]; + //[decoderViewController release]; + [dateFormatter release]; + [super dealloc]; +} + + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = NSLocalizedString(@"ScanArchiveTitle", @"Scan Archive"); + self.navigationItem.rightBarButtonItem = [self editButtonItem]; +} + + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + self.scans = [NSMutableArray arrayWithArray:[[Database sharedDatabase] scans]]; + self.results = [NSMutableArray arrayWithCapacity:self.scans.count]; + for (Scan *scan in scans) { + [results addObject:[ResultParser parsedResultForString:scan.text]]; + } +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated { + self.scans = nil; + self.results = nil; +} + +- (void)viewDidDisappear:(BOOL)animated { +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +- (NSInteger)scanIndexForRow:(NSInteger)row { + return scans.count - 1 - row; +} + +@end + diff --git a/iphone/Barcodes/Classes/Database.h b/iphone/Barcodes/Classes/Database.h new file mode 100644 index 000000000..38ec771dc --- /dev/null +++ b/iphone/Barcodes/Classes/Database.h @@ -0,0 +1,41 @@ +// +// Database.h +// ZXing +// +// Created by Christian Brunschen on 29/05/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 +#import + +@class Scan; + +@interface Database : NSObject { + sqlite3 *connection; + int nextScanIdent; +} + +@property sqlite3 *connection; +@property int nextScanIdent; + ++ (id)sharedDatabase; + +- (void)addScanWithText:(NSString *)text; +- (NSArray *)scans; +- (void)deleteScan:(Scan *)scan; + +@end diff --git a/iphone/Barcodes/Classes/Database.m b/iphone/Barcodes/Classes/Database.m new file mode 100644 index 000000000..cd4897c63 --- /dev/null +++ b/iphone/Barcodes/Classes/Database.m @@ -0,0 +1,115 @@ +// +// Database.m +// ZXing +// +// Created by Christian Brunschen on 29/05/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 "Database.h" +#import "Scan.h" + +@implementation Database + +static sqlite3_stmt *maxIdStatement; +static sqlite3_stmt *selectAllStatement; +static sqlite3_stmt *insertStatement; +static sqlite3_stmt *deleteStatement; + +@synthesize connection; +@synthesize nextScanIdent; + +static Database *sharedDatabase = nil; + ++ (id)sharedDatabase { + if (!sharedDatabase) { + sharedDatabase = [[self alloc] init]; + + BOOL success; + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"scans.db"]; + success = [fileManager fileExistsAtPath:writableDBPath]; + if (!success) { + // The writable database does not exist, so copy the default to the appropriate location. + NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"scans.db"]; + success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; + if (!success) { + NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); + } + } + + sqlite3 *connection; + sqlite3_open([writableDBPath UTF8String], &connection); + sharedDatabase.connection = connection; + + static const char *maxIdSql = "SELECT MAX(id) FROM SCAN"; + sqlite3_prepare_v2(connection, maxIdSql, -1, &maxIdStatement, NULL); + + static const char *selectAllSql = "SELECT id, text, stamp FROM SCAN ORDER BY id"; + sqlite3_prepare_v2(connection, selectAllSql, -1, &selectAllStatement, NULL); + + static const char *insertSql = + "INSERT INTO SCAN (id, text, stamp) VALUES (?, ?, ?)"; + sqlite3_prepare_v2(connection, insertSql, -1, &insertStatement, NULL); + + static const char *deleteSql = "DELETE FROM SCAN WHERE id = ?"; + sqlite3_prepare_v2(connection, deleteSql, -1, &deleteStatement, NULL); + + if (SQLITE_ROW == sqlite3_step(maxIdStatement)) { + int maxId = sqlite3_column_int(maxIdStatement, 0); + sharedDatabase.nextScanIdent = maxId + 1; + sqlite3_reset(maxIdStatement); + } else { + NSLog(@"failed to read max ID from database\n"); + } + + } + return sharedDatabase; +} + +- (void)addScanWithText:(NSString *)text { + sqlite3_bind_int(insertStatement, 1, nextScanIdent++); + sqlite3_bind_text(insertStatement, 2, [text UTF8String], -1, SQLITE_TRANSIENT); + sqlite3_bind_double(insertStatement, 3, [[NSDate date] timeIntervalSince1970]); + sqlite3_step(insertStatement); + sqlite3_reset(insertStatement); +} + +- (NSArray *)scans { + NSMutableArray *scans = [NSMutableArray array]; + while (SQLITE_ROW == sqlite3_step(selectAllStatement)) { + int ident = sqlite3_column_int(selectAllStatement, 0); + NSString *text = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectAllStatement, 1)]; + NSDate *stamp = [NSDate dateWithTimeIntervalSince1970:sqlite3_column_double(selectAllStatement, 2)]; + Scan *scan = [[Scan alloc] initWithIdent:ident text:text stamp:stamp]; + [scans addObject:scan]; + [scan release]; + } + sqlite3_reset(selectAllStatement); + return scans; +} + +- (void)deleteScan:(Scan *)scan { + sqlite3_bind_int(deleteStatement, 1, [scan ident]); + sqlite3_step(deleteStatement); + sqlite3_reset(deleteStatement); +} + + +@end diff --git a/iphone/Barcodes/Classes/Scan.h b/iphone/Barcodes/Classes/Scan.h new file mode 100644 index 000000000..b96d9c95a --- /dev/null +++ b/iphone/Barcodes/Classes/Scan.h @@ -0,0 +1,37 @@ +// +// Scan.h +// ZXing +// +// Created by Christian Brunschen on 29/05/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 + + +@interface Scan : NSObject { + NSInteger ident; + NSString *text; + NSDate *stamp; +} + +@property NSInteger ident; +@property (nonatomic, copy) NSString *text; +@property (nonatomic, retain) NSDate *stamp; + +- (id)initWithIdent:(int)i text:(NSString *)t stamp:(NSDate *)s; + +@end diff --git a/iphone/Barcodes/Classes/Scan.m b/iphone/Barcodes/Classes/Scan.m new file mode 100644 index 000000000..6d7b29bf4 --- /dev/null +++ b/iphone/Barcodes/Classes/Scan.m @@ -0,0 +1,40 @@ +// +// Scan.m +// ZXing +// +// Created by Christian Brunschen on 29/05/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 "Scan.h" + + +@implementation Scan + +@synthesize ident; +@synthesize text; +@synthesize stamp; + +- (id)initWithIdent:(int)i text:(NSString *)t stamp:(NSDate *)s { + if ((self = [super init]) != nil) { + self.ident = i; + self.text = t; + self.stamp = s; + } + return self; +} + +@end diff --git a/iphone/Barcodes/Classes/ScanCell.h b/iphone/Barcodes/Classes/ScanCell.h new file mode 100644 index 000000000..0860c446c --- /dev/null +++ b/iphone/Barcodes/Classes/ScanCell.h @@ -0,0 +1,42 @@ +// +// ScanCell.h +// ZXing +// +// Created by Christian Brunschen on 30/06/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 + +@class Scan; +@class ParsedResult; + +@interface ScanCell : UITableViewCell { + Scan *scan; + ParsedResult *result; + UIImageView *imageView; + UILabel *textView; + UILabel *dateView; + UILabel *timeView; +} + +@property (nonatomic, retain) Scan *scan; +@property (nonatomic, retain) UIImageView *imageView; +@property (nonatomic, retain) UILabel *textView; +@property (nonatomic, retain) UILabel *dateView; +@property (nonatomic, retain) UILabel *timeView; + +@end diff --git a/iphone/Barcodes/Classes/ScanCell.m b/iphone/Barcodes/Classes/ScanCell.m new file mode 100644 index 000000000..33eac8690 --- /dev/null +++ b/iphone/Barcodes/Classes/ScanCell.m @@ -0,0 +1,175 @@ +// +// ScanCell.m +// ZXing +// +// Created by Christian Brunschen on 30/06/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 "ScanCell.h" +#import "Scan.h" +#import "ParsedResult.h" +#import "ResultParser.h" + +static NSDateFormatter *_makeDateFormatter(NSDateFormatterStyle dateStyle, + NSDateFormatterStyle timeStyle) { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateStyle:dateStyle]; + [dateFormatter setTimeStyle:timeStyle]; + return dateFormatter; +} + +static NSString *_dateString(NSDate *date) { + static NSDateFormatter *dateFormatter = nil; + if (!dateFormatter) { + dateFormatter = + _makeDateFormatter(NSDateFormatterShortStyle, NSDateFormatterNoStyle); + } + return [dateFormatter stringFromDate:date]; +} + +static NSString *_timeString(NSDate *date) { + static NSDateFormatter *timeFormatter = nil; + if (!timeFormatter) { + timeFormatter = + + _makeDateFormatter(NSDateFormatterNoStyle, NSDateFormatterShortStyle); + } + return [timeFormatter stringFromDate:date]; +} + +#define VIEW_PADDING 2.0 +#define IMAGE_SIZE 40.0 +#define EDITING_INSET 10.0 +#define CONTENT_HEIGHT (IMAGE_SIZE + 2.0 * VIEW_PADDING) +#define DATE_TIME_WIDTH 50.0 + +@implementation ScanCell + +@synthesize imageView; +@synthesize textView; +@synthesize dateView; +@synthesize timeView; + + +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { + imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; + imageView.contentMode = UIViewContentModeCenter; + [self.contentView addSubview:imageView]; + + textView = [[UILabel alloc] initWithFrame:CGRectZero]; + textView.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]]; + textView.textAlignment = UITextAlignmentLeft; + textView.textColor = [UIColor blackColor]; + [self.contentView addSubview:textView]; + + dateView = [[UILabel alloc] initWithFrame:CGRectZero]; + dateView.font = [UIFont systemFontOfSize:(2 * [UIFont systemFontSize]) / 3]; + dateView.textAlignment = UITextAlignmentRight; + dateView.textColor = [UIColor grayColor]; + [self.contentView addSubview:dateView]; + + timeView = [[UILabel alloc] initWithFrame:CGRectZero]; + timeView.font = [UIFont systemFontOfSize:(2 * [UIFont systemFontSize]) / 3]; + timeView.textAlignment = UITextAlignmentRight; + timeView.textColor = [UIColor grayColor]; + [self.contentView addSubview:timeView]; + } + return self; +} + +- (CGRect) _imageViewFrame { + CGRect frame = CGRectMake(VIEW_PADDING, VIEW_PADDING, IMAGE_SIZE, IMAGE_SIZE); + if (self.editing) { + frame.origin.x += EDITING_INSET; + } + return frame; +} + +- (CGRect) _textViewFrame { + CGRect frame = CGRectMake(2 * VIEW_PADDING + IMAGE_SIZE, VIEW_PADDING, self.contentView.bounds.size.width - IMAGE_SIZE - DATE_TIME_WIDTH - 3 * VIEW_PADDING, CONTENT_HEIGHT - 2 * VIEW_PADDING); + if (self.editing) { + frame.origin.x += EDITING_INSET; + frame.size.width += DATE_TIME_WIDTH + VIEW_PADDING - EDITING_INSET; + } + return frame; +} + +- (CGRect) _timeViewFrame { + float x = CGRectGetMaxX(self.contentView.bounds) - DATE_TIME_WIDTH - VIEW_PADDING; + CGRect frame = CGRectMake(x, VIEW_PADDING, DATE_TIME_WIDTH, (CONTENT_HEIGHT - 2 * VIEW_PADDING) / 2); + return frame; +} + +- (CGRect) _dateViewFrame { + float x = CGRectGetMaxX(self.contentView.bounds) - DATE_TIME_WIDTH - VIEW_PADDING; + CGRect frame = CGRectMake(x, (CONTENT_HEIGHT - 2 * VIEW_PADDING) / 2, DATE_TIME_WIDTH, (CONTENT_HEIGHT - 2 * VIEW_PADDING) / 2); + return frame; +} + + +- (void)layoutSubviews { + [super layoutSubviews]; + + [imageView setFrame:[self _imageViewFrame]]; + [textView setFrame:[self _textViewFrame]]; + [dateView setFrame:[self _dateViewFrame]]; + [timeView setFrame:[self _timeViewFrame]]; + if (self.editing) { + dateView.alpha = 0.0; + timeView.alpha = 0.0; + } else { + dateView.alpha = 1.0; + timeView.alpha = 1.0; + } +} + + + +- (void)setScan:(Scan *)newScan { + if (newScan != scan) { + [newScan retain]; + [scan release]; + scan = newScan; + [result release]; + result = [[ResultParser parsedResultForString:[scan text]] retain]; + + imageView.image = [result icon]; + textView.text = [result stringForDisplay]; + + NSDate *date = [scan stamp]; + dateView.text = _dateString(date); + timeView.text = _timeString(date); + } +} + +- (Scan *)scan { + return scan; +} + +- (void)dealloc { + [imageView release]; + [textView release]; + [dateView release]; + [timeView release]; + [scan release]; + [result release]; + [super dealloc]; +} + + +@end diff --git a/iphone/Barcodes/Classes/ScanViewController.h b/iphone/Barcodes/Classes/ScanViewController.h new file mode 100644 index 000000000..7a8eaafe4 --- /dev/null +++ b/iphone/Barcodes/Classes/ScanViewController.h @@ -0,0 +1,39 @@ +// +// ScanViewController.h +// ZXing +// +// Created by Christian Brunschen on 24/06/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 +#import "Scan.h" +#import "ParsedResult.h" + +@interface ScanViewController : UITableViewController { + IBOutlet ParsedResult *result; + IBOutlet Scan *scan; + UIFont *bodyFont; + NSDateFormatter *dateFormatter; +} + +@property (nonatomic, retain) ParsedResult *result; +@property (nonatomic, retain) Scan *scan; +@property (nonatomic, retain) NSDateFormatter *dateFormatter; + +- (id)initWithResult:(ParsedResult *)r forScan:(Scan *)s; + +@end diff --git a/iphone/Barcodes/Classes/ScanViewController.m b/iphone/Barcodes/Classes/ScanViewController.m new file mode 100644 index 000000000..ee40cc92d --- /dev/null +++ b/iphone/Barcodes/Classes/ScanViewController.m @@ -0,0 +1,255 @@ +// +// ScanViewController.m +// ZXing +// +// Created by Christian Brunschen on 24/06/2008. +/* + * Copyright 2008 ZXing authors + * + * 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 "ScanViewController.h" +#import "ResultAction.h" + + +#define TEXT_VIEW_TAG 0x17 +#define DATETIME_VIEW_TAG 0x18 +#define BUTTON_LABEL_TAG 0x19 +#define TITLE_HEIGHT 44 +#define BODY_HEIGHT 88 + +@implementation ScanViewController + +@synthesize result; +@synthesize scan; +@synthesize dateFormatter; + +#define FONT_NAME @"TimesNewRomanPSMT" +#define FONT_SIZE 16 + +- (id)initWithResult:(ParsedResult *)r forScan:(Scan *)s { + if ((self = [super initWithStyle:UITableViewStyleGrouped])) { + self.result = r; + self.scan = s; + self.title = NSLocalizedString(@"ScanViewController title", @"Scan"); + dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateStyle:NSDateFormatterLongStyle]; + [dateFormatter setTimeStyle:NSDateFormatterLongStyle]; + bodyFont = [[UIFont fontWithName:FONT_NAME size:FONT_SIZE] retain]; + } + return self; +} + + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return [[result actions] count] ? 2 : 1; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + switch (section) { + case 0: + return 3; + case 1: + return [[result actions] count]; + default: + return 0; + } +} + +- (UITableViewCell *)cellWithIdentifier:(NSString *)identifier inTableView:(UITableView *)tableView { + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:identifier] autorelease]; + } + return cell; +} + +- (UITableViewCell *)titleCellInTableView:(UITableView *)tableView { + static NSString *TitleIdentifier = @"ScanViewTitleIdentifier"; + return [self cellWithIdentifier:TitleIdentifier inTableView:tableView]; +} + +- (UITableViewCell *)datetimeCellInTableView:(UITableView *)tableView { + static NSString *DatetimeIdentifier = @"ScanViewDatetimeIdentifier"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DatetimeIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 34) reuseIdentifier:DatetimeIdentifier] autorelease]; + UILabel *label = [cell textLabel]; + label.font = [UIFont systemFontOfSize:[UIFont systemFontSize] * 2.0 / 3.0]; + label.textColor = [UIColor grayColor]; + label.textAlignment = UITextAlignmentCenter; + } + return cell; +} + +- (UITableViewCell *)bodyCellInTableView:(UITableView *)tableView { + static NSString *BodyIdentifier = @"ScanViewBodyIdentifier"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:BodyIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, BODY_HEIGHT) reuseIdentifier:BodyIdentifier] autorelease]; + UITextView *textView = [[UITextView alloc] initWithFrame:CGRectInset(cell.contentView.bounds, 6, 6)]; + textView.font = bodyFont; + [textView setTag:TEXT_VIEW_TAG]; + textView.editable = NO; + [textView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [cell.contentView addSubview:textView]; + [textView release]; + } + return cell; +} + +- (UITableViewCell *)buttonCellInTableView:(UITableView *)tableView { + static NSString *ButtonIdentifier = @"ScanViewButtonIdentifier"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ButtonIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 44) reuseIdentifier:ButtonIdentifier] autorelease]; + UILabel *label = [[UILabel alloc] initWithFrame:CGRectInset(cell.contentView.bounds, 6, 6)]; + label.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]]; + [label setTag:BUTTON_LABEL_TAG]; + label.lineBreakMode = UILineBreakModeMiddleTruncation; + label.textColor = [UIColor grayColor]; + label.textAlignment = UITextAlignmentCenter; + [label setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [cell.contentView addSubview:label]; + [label release]; + } + return cell; +} + +#define TEXT_VIEW_HEIGHT 330.0 + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section == 0) { + if (indexPath.row == 0) { + return TITLE_HEIGHT; + } else if (indexPath.row == 1) { + CGSize size = [[result stringForDisplay] sizeWithFont:bodyFont constrainedToSize:CGSizeMake(280.0, TEXT_VIEW_HEIGHT) lineBreakMode:UILineBreakModeWordWrap]; +#ifdef DEBUG + NSLog(@"text size = %f", size.height); +#endif + return fminf(TEXT_VIEW_HEIGHT, fmaxf(44, size.height + 24)); + } else if (indexPath.row == 2) { + return 24.0; + } + } + return tableView.rowHeight; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell; + + if (indexPath.section == 0) { + if (indexPath.row == 0) { + cell = [self titleCellInTableView:tableView]; + UIImageView *imageView = cell.imageView; + imageView.image = [result icon]; + UILabel *textLabel = cell.textLabel; + textLabel.text = [[result class] typeName]; + } else if (indexPath.row == 1) { + cell = [self bodyCellInTableView:tableView]; + UITextView *textView = (UITextView *)[cell viewWithTag:TEXT_VIEW_TAG]; + textView.text = [result stringForDisplay]; + } else if (indexPath.row == 2) { + cell = [self datetimeCellInTableView:tableView]; + UILabel *textLabel = cell.textLabel; + textLabel.text = [dateFormatter stringFromDate:[scan stamp]]; + } + } else if (indexPath.section == 1) { + cell = [self buttonCellInTableView:tableView]; + ResultAction *action = [[result actions] objectAtIndex:indexPath.row]; + UILabel *label = (UILabel *)[cell viewWithTag:BUTTON_LABEL_TAG]; + label.text = [action title]; + } + + return cell; +} + +- (void)performAction:(ResultAction *)action { + [action performActionWithController:self shouldConfirm:NO]; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section == 1) { + ResultAction *action = [[result actions] objectAtIndex:indexPath.row]; + [self performSelector:@selector(performAction:) withObject:action afterDelay:0.0]; + } +} + +/* +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + + if (editingStyle == UITableViewCellEditingStyleDelete) { + } + if (editingStyle == UITableViewCellEditingStyleInsert) { + } +} +*/ + +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + return NO; +} + +/* +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { +} +*/ + +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + return NO; +} + +- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section != 1) { + return nil; + } + return indexPath; +} + + +- (void)dealloc { + [result release]; + [scan release]; + [bodyFont release]; + [dateFormatter release]; + [super dealloc]; +} + + +- (void)viewDidLoad { + [super viewDidLoad]; +} + + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated { +} + +- (void)viewDidDisappear:(BOOL)animated { +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + + +@end + diff --git a/iphone/Barcodes/Classes/ZXMainViewController.h b/iphone/Barcodes/Classes/ZXMainViewController.h index cf948a345..5caac0c7a 100644 --- a/iphone/Barcodes/Classes/ZXMainViewController.h +++ b/iphone/Barcodes/Classes/ZXMainViewController.h @@ -26,6 +26,7 @@ - (IBAction)scan:(id)sender; - (IBAction)info:(id)sender; +- (IBAction)showArchive:(id)sender; - (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result; - (void)zxingControllerDidCancel:(ZXingWidgetController*)controller; diff --git a/iphone/Barcodes/Classes/ZXMainViewController.mm b/iphone/Barcodes/Classes/ZXMainViewController.mm index 3c2a5f408..cb2f911ea 100644 --- a/iphone/Barcodes/Classes/ZXMainViewController.mm +++ b/iphone/Barcodes/Classes/ZXMainViewController.mm @@ -11,6 +11,8 @@ #import #import #import +#import "ArchiveController.h" +#import "Database.h" @implementation ZXMainViewController @synthesize resultParser; @@ -84,6 +86,14 @@ [aboutController release]; } +- (IBAction)showArchive:(id)sender { + ArchiveController *archiveController = [[ArchiveController alloc] init]; + UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:archiveController]; + [self presentModalViewController:navController animated:YES]; + [navController release]; + [archiveController release]; +} + - (void)messageViewControllerWantsToBeDispissed:(MessageViewController *)controller { [self dismissModalViewControllerAnimated:YES]; } @@ -120,6 +130,7 @@ #ifdef DEBUG NSLog(@"result has %d actions", actions ? 0 : actions.count); #endif + [[Database sharedDatabase] addScanWithText:resultString]; [self performResultAction]; } diff --git a/iphone/Barcodes/Classes/ZXMainViewController.xib b/iphone/Barcodes/Classes/ZXMainViewController.xib index eb37f1fc6..43a5b8523 100644 --- a/iphone/Barcodes/Classes/ZXMainViewController.xib +++ b/iphone/Barcodes/Classes/ZXMainViewController.xib @@ -107,6 +107,25 @@ MC41AA + + + 292 + {{96, 412}, {128, 28}} + + NO + IBCocoaTouchFramework + 0 + 0 + + 1 + Archives + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 292 @@ -166,6 +185,15 @@ 9 + + + showArchive: + + + 7 + + 14 + @@ -182,9 +210,10 @@ YES - - + + + @@ -205,8 +234,13 @@ - 5 - + 8 + + + + + 10 + @@ -215,8 +249,8 @@ - 8 - + 5 + @@ -229,6 +263,8 @@ -2.CustomClassName 1.IBEditorWindowLastContentRect 1.IBPluginDependency + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform 4.IBPluginDependency 4.IBViewBoundsToFrameTransform 5.IBPluginDependency @@ -242,19 +278,23 @@ YES ZXMainViewController UIResponder - {{184, 249}, {320, 480}} + {{298, 248}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AULAAABDzgAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin P4AAAL+AAABCoAAAwzYAAA com.apple.InterfaceBuilder.IBCocoaTouchPlugin - P4AAAL+AAABCzAAAwgAAAA + AUKIAABB8AAAA com.apple.InterfaceBuilder.IBCocoaTouchPlugin - P4AAAL+AAABC+AAAw5CAAA + AULAAABDcAAAA com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -278,7 +318,7 @@ - 9 + 14 @@ -292,11 +332,13 @@ YES info: scan: + showArchive: YES id id + id @@ -305,6 +347,7 @@ YES info: scan: + showArchive: YES @@ -316,6 +359,10 @@ scan: id + + showArchive: + id + diff --git a/iphone/Barcodes/images/Default.png b/iphone/Barcodes/images/Default.png new file mode 100644 index 0000000000000000000000000000000000000000..11cc0db55a0f33078d921f6ffdc636b3f63f37e8 GIT binary patch literal 38209 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℘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 E0f?PLegFUf literal 0 HcmV?d00001 diff --git a/iphone/Barcodes/images/business-card.png b/iphone/Barcodes/images/business-card.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf65fcbf73a3acbc9d9b527e1f5394df784c476 GIT binary patch literal 334 zcmV-U0kQsxP);lA+>Ky2XYV z<)jE`aVh#@&yIi_KY3_R7da;s5{u literal 0 HcmV?d00001 diff --git a/iphone/Barcodes/images/email.png b/iphone/Barcodes/images/email.png new file mode 100644 index 0000000000000000000000000000000000000000..5043c64d8ee650d085a141da4364493f903e4443 GIT binary patch literal 608 zcmV-m0-ybfP)U_M7=~$dn$Vxd+H&vED~c6DN9*mS<2W*BW00I)VVo7U#I(T z|9|-W=fCHid(J)Qo^#!<{xm_z5XyuX!Z$$u9}(sW9+yL!A(X_1y-*`0>}>2MWHlRf z_!LD#o=~@NwA*j2i(=%R)ZH#askL z2tJmp?={$8ps|Xw3c>@ChFqTl=U6u;)}!Vo30V9hj6l>i8#f4}tze4XyqE-qW5N^j zdxTMt?Gt7RlZ10ve+T{q_^Cl=;;?wg-!Neg*0%}k@c#__2k;NT8|nlGr^2KwNSjHY z>;TDc;ouePryPWYVG~YZ(k(l&>chASq{5RA&9dh`Oa5=nb zaQ(}!u#e#=_d=7f1LqELBsMg0wABCkS1#Z2e{o{C!n3ARyOSoqXHR0wkx0|yUh2qD zuE}?RqdTRjxkH58flW@~;72Bh9EL3q7y{ncE1dN>!6fjQ@yeujk7<$)FS!kz8zbaj zIZxo1Sy(0A_=e3%YyuabLSzGvRKug*Eoazyx17ijUeKA$w6^FIOTq@5B}-XZ5A2x0 ze(_633R}dcrIm^1QYR0aPm(ssGRbgU?y$&Fd_t`E5t;Pz+6eFFmF`aU-Y$ zG~9Y49D4#r=mup1!~}5d2{uTWpkV^S09DcnNGE7*WJ^!(52A_;~l{pbe(g+6tIIxcQU|tmxJO$lOXHg|>R!aU} zi5GvYCy$CX@w)`znhdnaI2kJs_)O+Z0K;x(Y!>31Af}V9$l*cJX}AXGh-_-;qS{Q{ zwej8R>(=>$bAtg+U(MTn6vblP6K1*h*Ftf05&_lJXQL065PMAxfda%>EkmGM=9`<-)a5o6YC#uU*2_AAUA8Ly=BELp)G z`9c0429`DmkDm%ad%uU|LtxPR_B_UGT@c4;RjChJcBK^yfg!-)>FVdQ&MBb@0MZC}mjD0& literal 0 HcmV?d00001 diff --git a/iphone/Barcodes/images/map-pin.png b/iphone/Barcodes/images/map-pin.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf2b82070682f850c2562ece1ed2180b0586df3 GIT binary patch literal 515 zcmV+e0{s1nP)Ou>!GzqysG=8A%6pK;Aif&d!B{!}w-)4)NXY-TM)=ZL8RVAh&)j85b~KUZ-P*{tr09mq#Pvx@(qz_f<3uC3uYuf z*CJj54^gZ`alq!IAmcDt;oAuwafsA3a^)w2xT^4fV(s&4v;*o}+pCbSJNjTvrFj&eX;-7Ua*$EX zS3;Ip78Li`)r`GWB%2zlmK38wpPnb{5`I^eskV1|o>^5> zqq?r{19J;A3Ub^c?W>w=I(bVCwW0T=k3i7(MWd=YSskkf;oSBcQ>L!wQyqiw-yu@? z{whjtbyESOF2g1oES!*NwRlixHNtR7y#&~)EYcIvb6vJ002ovPDHLk FV1k8+;qm|g literal 0 HcmV?d00001 diff --git a/iphone/Barcodes/images/phone.png b/iphone/Barcodes/images/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..b473d8fb0620a4e635ac97f369e244e0f773442d GIT binary patch literal 417 zcmV;S0bc%zP) z5dQ(<|4@9JnwHoA@oFG;1>z@2mTU)NW=ahQ8E_tI;3Xh71L9XmmIP92K{%3OFiX6V zf~$pGgPEXo0-Crk5L*KAGAREJrNQ$7%?JOXV)j71g&Gmug2e(5&IDpMYFGeDif_>j z|3mG3kdMU&RJ8yU7st>nsGxRE)&k<6NEUnsVs&a;l8hx!@KD>5`Dm8xrB-T!0Zt%3 ziDt72~CtGSJ5ySj3h=<#4jSkl2_15YdfhHz(6KiX2gcSLBszo zxhYH+OEN~spkPv=MgjR2i{a;?bqQ4fKM>bJE!qgJzu}DpfB*vkYAuxI@W?+;00000 LNkvXXu0mjfwP2sy literal 0 HcmV?d00001 diff --git a/iphone/Barcodes/images/photolib.png b/iphone/Barcodes/images/photolib.png new file mode 100644 index 0000000000000000000000000000000000000000..6f330c5cbebaf81d35e7332cb1126d4071366d9f GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X@;qG}Ln>~)nHtD-K!L}(_sc)=i`Heor!0((ygdJ+gJYM# z>~^lu+?lUVSKV1EpFM|XgO7kL>+WS0=2AxdYArJ!rhX7lS0{2 zCnPTry?8PqP2#{0BhCK1``JuR`sC1QJtNj>(u?CbUt`xdE}&Co+6irAOET2@S=lyZsIFp=TgbB>w2 zb4Pdgws$)G<~zU{;)+R#j3|hP2nU+kC!6n{C0s}J6QYlyn`8c& zD2d#iA?)PN)HrDw#CV3dg<)zvuq&6u?MbdIaWA5}C~l#e+Hhk9{eHjbcDq7VRk2#F zM6p=pxS}XR(=_gvB#Hf2tHpiQYE>*23x;A|uh*W0wE0uxKsuck^ZA_pNF>6-?K&iosyO%cT;L1%p8ri^t0w_7d;m4*D}a>;F_ zQURP4_=jR(|rbCk=IZC>3n*k=y&8J5`9eQ#fjJ}WRCc4v2REP`DKg!L=OM+FaGSf ra&N#ziy<523lfJ5nB=zLZvh4XF6{MLl+l`)00000NkvXXu0mjf;@&=I literal 0 HcmV?d00001 diff --git a/iphone/Barcodes/images/text.png b/iphone/Barcodes/images/text.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9a8b7cc88ddc60f2edf8630b04fea92480a981 GIT binary patch literal 376 zcmV-;0f+vHP)0kq3 z0@#43q#_$68vqkTOaM#}O1g-SjxYhx(LD~jM}Jt1b5<$V2pDPg0=F$11t~|pMom|1)dgbXF0eF`7aRr zSP8OrEC*uIr$TCi6denoRAhsATkl$sDj*6wY%EB+bk)_sZW%EMhbsH)qI^I zgN956J#b?cJHk+eXmEyv?sN-*s@$}YY2AzpWyM$<-6XP#4&Bp%+=I-$zeS0WXQGT} ziVE8MrilGfTYkENjo_#0C7 zy1ND`1O$2dItE25c)La_`1yw@_=WoT=qQw=R+K1&xJCf^aIxZ&#M}Y}pkY1=F0O8l bp*|rB26_gXpu7pp^rK)j1V%$(1cm?rwe}|9 literal 0 HcmV?d00001