1/* 2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 3 * Copyright (C) 2006 Nefaur Khandker <nefaurk@gmail.com> All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#import "TestController.h" 28#import "SVGTest.h" 29#import "TestViewerSplitView.h" 30#import "ScalingImageView.h" 31#import "DrawTestView.h" 32 33#import <WebKit/WebView.h> 34 35@interface NSArray (TestControllerAdditions) 36- (id)firstObject; 37@end 38 39@implementation NSArray (TestControllerAdditions) 40- (id)firstObject 41{ 42 if ([self count]) 43 return [self objectAtIndex:0]; 44 return nil; 45} 46@end 47 48static TestController *__sharedInstance = nil; 49 50@implementation TestController 51 52- (id)init 53{ 54 if (self = [super init]) { 55 NSString *path = [[NSUserDefaults standardUserDefaults] objectForKey:@"TestDirectory"]; 56 BOOL isDirectory = NO; 57 if (![[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory] || !isDirectory) { 58 path = [@"~" stringByStandardizingPath]; 59 } 60 [self setCurrentPath:path]; 61 } 62 return self; 63} 64 65+ (void)initialize 66{ 67 [self setKeys:[NSArray arrayWithObject:@"currentPath"] triggerChangeNotificationsForDependentKey:@"directoryHierarchy"]; 68 [self setKeys:[NSArray arrayWithObject:@"currentPath"] triggerChangeNotificationsForDependentKey:@"tests"]; 69} 70 71+ (id)sharedController 72{ 73 if (!__sharedInstance) { 74 __sharedInstance = [[self alloc] init]; 75 } 76 return __sharedInstance; 77} 78 79- (void)loadNibIfNecessary 80{ 81 if (!_testPanel) { 82 [NSBundle loadNibNamed:@"TestViewer" owner:self]; 83 } 84} 85 86- (void)awakeFromNib 87{ 88 [_testsTableView setTarget:self]; 89 [_testsTableView setDoubleAction:@selector(openTestViewerForSelection:)]; 90 _drawView = [[DrawTestView alloc] initWithFrame:NSZeroRect]; 91 _imageView = [[ScalingImageView alloc] initWithFrame:NSZeroRect]; 92 [_splitView addSubview:_drawView]; 93 [_splitView addSubview:_imageView]; 94} 95 96- (IBAction)showTestsPanel:(id)sender 97{ 98 [self loadNibIfNecessary]; 99 [_testPanel makeKeyAndOrderFront:sender]; 100} 101 102- (IBAction)showTestWindow:(id)sender 103{ 104 [self loadNibIfNecessary]; 105 [_testWindow makeKeyAndOrderFront:sender]; 106} 107 108- (IBAction)showCompositeWindow:(id)sender 109{ 110 [self loadNibIfNecessary]; 111 NSLog(@"showCompositeWindow: %@", _compositeWindow); 112 [_compositeWindow makeKeyAndOrderFront:sender]; 113} 114 115- (IBAction)browse:(id)sender 116{ 117 NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 118 [openPanel setCanChooseDirectories:YES]; 119 [openPanel setCanChooseFiles:NO]; 120 [openPanel beginSheetForDirectory:nil file:nil modalForWindow:_testPanel modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:NULL]; 121} 122 123- (void)openPanelDidEnd:(NSOpenPanel *)openPanel returnCode:(int)returnCode contextInfo:(void *)contextInfo 124{ 125 if (returnCode == NSOKButton) { 126 NSArray *folders = [openPanel filenames]; 127 NSString *selectedFolder = [folders firstObject]; 128 [self setCurrentPath:selectedFolder]; 129 } 130} 131 132- (IBAction)jumpToParentDirectory:(id)sender 133{ 134 int index = [_parentDirectoryPopup indexOfSelectedItem]; 135 NSArray *components = [_currentPath pathComponents]; 136 NSArray *newComponents = [components subarrayWithRange:NSMakeRange(0, [components count] - index)]; 137 NSString *newPath = [NSString pathWithComponents:newComponents]; 138 [self setCurrentPath:newPath]; 139} 140 141- (void)setSelectedTest:(SVGTest *)selectedTest 142{ 143 id oldTest = _selectedTest; 144 _selectedTest = [selectedTest retain]; 145 [oldTest release]; 146 147 if ([_testWindow isVisible]) { 148 [_testWindow setTitle:[NSString stringWithFormat:@"Test Viewer - %@", [_selectedTest name]]]; 149 [_drawView setDocument:[NSURL fileURLWithPath:[_selectedTest svgPath]]]; 150 [_imageView setImage:[_selectedTest image]]; 151 if ([_compositeWindow isVisible]) 152 [_compositeImageView setImage:[_selectedTest compositeImage]]; 153 } 154} 155 156- (void)tableViewSelectionDidChange:(NSNotification *)aNotification 157{ 158 [self setSelectedTest:[[_testsArrayController selectedObjects] firstObject]]; 159} 160 161- (IBAction)openTestViewerForSelection:(id)sender 162{ 163 [self showTestWindow:sender]; 164 [_drawView setDocument:[NSURL fileURLWithPath:[_selectedTest svgPath]]]; 165 [_imageView setImage:[_selectedTest image]]; 166} 167 168- (IBAction)openSourceForSelection:(id)sender 169{ 170 [[NSWorkspace sharedWorkspace] openFile:[_selectedTest svgPath] withApplication:@"TextEdit"]; 171} 172 173- (IBAction)openSelectionInViewer:(id)sender 174{ 175 [[NSWorkspace sharedWorkspace] openFile:[_selectedTest svgPath]]; 176} 177 178- (NSString *)imagePathForSVGPath:(NSString *)svgPath 179{ 180 // eventually this code will build an array instead... 181 182 NSString *currentDirectory = [self currentPath]; 183 NSString *parentDirectory = [currentDirectory stringByDeletingLastPathComponent]; 184 185 NSString *testName = [[svgPath lastPathComponent] stringByDeletingPathExtension]; 186 NSString *imageName, *imageDirectory, *imagePath; 187 188 // first look in ../png/test.png -- SVG 1.1 baselines 189 // The SVG 1.1 spec has various different pngs, we should allow the 190 // tester to choose... 191 imageName = [[@"full-" stringByAppendingString:testName] stringByAppendingPathExtension:@"png"]; 192 imageDirectory = [parentDirectory stringByAppendingPathComponent:@"png"]; 193 imagePath = [imageDirectory stringByAppendingPathComponent:imageName]; 194 if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) return imagePath; 195 196 // then look for ../name.png -- openclipart.org 197 imageName = [testName stringByAppendingPathExtension:@"png"]; 198 imageDirectory = parentDirectory; 199 imagePath = [imageDirectory stringByAppendingPathComponent:imageName]; 200 if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) return imagePath; 201 202 // then look for ./name-w3c.png -- WebCore tests 203 imageName = [[testName stringByAppendingString:@"-w3c"] stringByAppendingPathExtension:@"png"]; 204 imageDirectory = currentDirectory; 205 imagePath = [imageDirectory stringByAppendingPathComponent:imageName]; 206 if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) return imagePath; 207 208 // finally try name-baseline.png -- ksvg regression baselines 209 imageName = [[testName stringByAppendingString:@"-baseline"] stringByAppendingPathExtension:@"png"]; 210 imageDirectory = currentDirectory; 211 imagePath = [imageDirectory stringByAppendingPathComponent:imageName]; 212 if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) return imagePath; 213 214 return nil; 215} 216 217- (NSArray *)tests 218{ 219 if (!_tests) { 220 NSMutableArray *newTests = [[NSMutableArray alloc] init]; 221 NSArray *files = [[NSFileManager defaultManager] directoryContentsAtPath:[self currentPath]]; 222 NSString *file = nil; 223 foreacharray(file, files) { 224 if ([[file pathExtension] isEqualToString:@"svg"]) { 225 NSString *svgPath = [[self currentPath] stringByAppendingPathComponent:file]; 226 NSString *imagePath = [self imagePathForSVGPath:svgPath]; 227 [newTests addObject:[SVGTest testWithSVGPath:svgPath imagePath:imagePath]]; 228 } 229 } 230 [self setValue:newTests forKey:@"tests"]; 231 } 232 return _tests; 233} 234 235- (NSArray *)directoryHierarchy 236{ 237 // A hackish way to reverse an array. 238 return [[[_currentPath pathComponents] reverseObjectEnumerator] allObjects]; 239} 240 241- (NSString *)currentPath 242{ 243 return _currentPath; 244} 245 246- (void)setCurrentPath:(NSString *)newPath 247{ 248 if (![newPath isEqualToString:_currentPath]) { 249 [_currentPath release]; 250 _currentPath = [newPath copy]; 251 [self setValue:nil forKey:@"tests"]; 252 } 253 254 [[NSUserDefaults standardUserDefaults] setObject:_currentPath forKey:@"TestDirectory"]; 255} 256 257- (IBAction)toggleViewersScaleRule:(id)sender 258{ 259#if 0 260 if ([_drawView imageScaling] == NSScaleProportionally) { 261 [_drawView setImageScaling:NSScaleNone]; 262 [_imageView setImageScaling:NSScaleNone]; 263 } else { 264 [_drawView setImageScaling:NSScaleProportionally]; 265 [_imageView setImageScaling:NSScaleProportionally]; 266 } 267#endif 268} 269 270@end 271