From 628a4db746abeb96052bca3b1153a72c66822296 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 24 Jan 2013 23:41:25 -0800 Subject: [PATCH] Improve errors reporting Errors are now displayed in a data view showing: - the file - the error message - A button that allows you to open the errored file in the default system editor --- Tools/XcodeCapp/AppController.h | 4 +- Tools/XcodeCapp/AppController.m | 55 +-- .../English.lproj/MainMenu.nib/designable.nib | 320 ++++++++++++++---- .../MainMenu.nib/keyedobjects.nib | Bin 20890 -> 22880 bytes Tools/XcodeCapp/TNErrorDataView.h | 34 ++ Tools/XcodeCapp/TNErrorDataView.m | 75 ++++ Tools/XcodeCapp/TNXCodeCapp.m | 8 +- .../XcodeCapp.xcodeproj/project.pbxproj | 6 + 8 files changed, 414 insertions(+), 88 deletions(-) create mode 100644 Tools/XcodeCapp/TNErrorDataView.h create mode 100644 Tools/XcodeCapp/TNErrorDataView.m diff --git a/Tools/XcodeCapp/AppController.h b/Tools/XcodeCapp/AppController.h index 5f0eb52cc..08b48ebe3 100644 --- a/Tools/XcodeCapp/AppController.h +++ b/Tools/XcodeCapp/AppController.h @@ -20,6 +20,7 @@ #import #import "PRHEmptyGrowlDelegate.h" #import "TNXCodeCapp.h" +#import "TNErrorDataView.h" @interface AppController : NSObject { @@ -38,12 +39,14 @@ IBOutlet TNXCodeCapp *xcc; IBOutlet NSWindow *windowDebug; IBOutlet NSMenuItem *menuDebug; + IBOutlet TNErrorDataView *dataViewError; NSImage *_iconActive; NSImage *_iconInactive; NSImage *_iconWorking; NSStatusItem *_statusItem; PRHEmptyGrowlDelegate *growlDelegateRef; + NSData *_archivedDataView; } @property BOOL supportsFileModeListening; @@ -53,7 +56,6 @@ - (BOOL)validateMenuItem:(NSMenuItem*)menuItem; - (void)registerDefaults; -- (void)updateErrorTable; - (void)growlWithTitle:(NSString *)aTitle message:(NSString *)aMessage; - (void)openCenteredWindow:(NSWindow *)aWindow; diff --git a/Tools/XcodeCapp/AppController.m b/Tools/XcodeCapp/AppController.m index 453bba7d2..176e90624 100644 --- a/Tools/XcodeCapp/AppController.m +++ b/Tools/XcodeCapp/AppController.m @@ -25,6 +25,20 @@ AppController *SharedAppControllerInstance = nil; +float heightForStringDrawing(NSString *myString, NSFont *myFont, float myWidth) +{ + NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:myString] autorelease]; + NSTextContainer *textContainer = [[[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)] autorelease]; + NSLayoutManager *layoutManager = [[[NSLayoutManager alloc] init] autorelease]; + + [layoutManager addTextContainer:textContainer]; + [textStorage addLayoutManager:layoutManager]; + [textStorage addAttribute:NSFontAttributeName value:myFont range:NSMakeRange(0, [textStorage length])]; + [textContainer setLineFragmentPadding:0.0]; + + (void) [layoutManager glyphRangeForTextContainer:textContainer]; + return [layoutManager usedRectForTextContainer:textContainer].size.height; +} @implementation AppController @@ -46,6 +60,8 @@ AppController *SharedAppControllerInstance = nil; { SharedAppControllerInstance = self; + _archivedDataView = [NSKeyedArchiver archivedDataWithRootObject:dataViewError]; + if (!growlDelegateRef) growlDelegateRef = [[[PRHEmptyGrowlDelegate alloc] init] autorelease]; @@ -152,6 +168,9 @@ AppController *SharedAppControllerInstance = nil; - (void)XCodeCappConversionDidStop:(NSNotification *)aNotification { [_statusItem setImage:_iconActive]; + + if ([errorsPanel isVisible]) + [errorsTable reloadData]; } /*! @@ -262,17 +281,6 @@ AppController *SharedAppControllerInstance = nil; system([[NSString stringWithFormat:@"open \"%@\"", [[xcc XCodeSupportProject] path]] UTF8String]); } -/*! - reload error table data and show it - @param aSender the sender of the action - */ -- (void)updateErrorTable -{ - [errorsTable reloadData]; - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; - [errorsPanel orderFront:self]; -} - /*! Open the errors window @param aSender the sender of the action @@ -357,24 +365,21 @@ AppController *SharedAppControllerInstance = nil; - (void)tableViewColumnDidResize:(NSNotification *)tableView { [errorsTable noteHeightOfRowsWithIndexesChanged: - [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[xcc errorList] count])]]; + [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[xcc errorList] count])]]; +} + +- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row +{ + return [NSKeyedUnarchiver unarchiveObjectWithData:_archivedDataView]; } - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)aRow { - // Get column you want - first in this case: - NSTableColumn *tabCol = [[tableView tableColumns] objectAtIndex:0]; - float width = [tabCol width]; - NSRect r = NSMakeRect(0,0,width,1000.0); - NSCell *cell = [tabCol dataCellForRow:aRow]; - NSString *content = [[xcc errorList] objectAtIndex:aRow]; - [cell setObjectValue:content]; - float height = [cell cellSizeForBounds:r].height; - - if (height <= 0) - height = 16.0; // Ensure miniumum height is 16.0 - - return height; + NSString *content = [[[xcc errorList] objectAtIndex:aRow] objectForKey:@"message"]; + NSFont *currentFont = [[dataViewError fieldMessage] font]; + float height = heightForStringDrawing(content, currentFont, [tableView frame].size.width); + + return height + 25; } @end diff --git a/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib b/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib index b8987770e..db4db42b2 100644 --- a/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib +++ b/Tools/XcodeCapp/English.lproj/MainMenu.nib/designable.nib @@ -2,32 +2,33 @@ 1050 - 11C74 - 1938 - 1138.23 - 567.00 + 12D54 + 2844 + 1187.37 + 626.00 com.apple.InterfaceBuilder.CocoaPlugin - 1938 + 2844 - NSPopUpButtonCell - NSUserDefaultsController - NSScroller - NSPopUpButton - NSMenuItem - NSMenu - NSScrollView - NSTextFieldCell NSButton NSButtonCell - NSTableView NSCustomObject + NSCustomView + NSMenu + NSMenuItem + NSPopUpButton + NSPopUpButtonCell + NSScrollView + NSScroller + NSTableColumn + NSTableView + NSTextField + NSTextFieldCell NSTextView + NSUserDefaultsController NSView NSWindowTemplate - NSTextField - NSTableColumn com.apple.InterfaceBuilder.CocoaPlugin @@ -59,7 +60,7 @@ - + 256 @@ -70,7 +71,7 @@ YES - 68288064 + 68157504 138544128 WGNvZGVDYXBwIGRldmVsb3BlZCBieSBBbnRvaW5lIE1lcmNhZGFsCnByaW1hbG1vdGlvbkBhcmNoaXBl bHByb2plY3Qub3JnCgp3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBBcGFyYWppdGEgRmlzaG1hbgphcGFy @@ -95,15 +96,17 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ MQA + NO 269 {{108, 20}, {158, 14}} + YES - 68288064 + 68157504 138544128 LABEL VERSION @@ -111,12 +114,14 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ + NO {375, 153} + - {{0, 0}, {2560, 1418}} + {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} YES @@ -202,14 +207,14 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ 95 2 - {{987, 547}, {512, 285}} + {{462, 324}, {512, 285}} 1685585920 Errors and Warnings NSPanel - + 256 @@ -227,6 +232,8 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ YES + NO + YES -2147483392 @@ -240,7 +247,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ 40 1000 - 75628096 + 75497536 2048 Error @@ -259,7 +266,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ - 337772032 + 337641472 0 Text Cell @@ -318,6 +325,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ {{413, 17}, {15, 166}} + NO _doScroller: 0.99494949494949492 @@ -328,6 +336,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ {{1, 183}, {427, 15}} + NO 1 _doScroller: @@ -342,6 +351,9 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ QSAAAEEgAABBmAAAQZgAAA + 0.25 + 4 + 1 @@ -351,7 +363,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ YES - -2080244224 + -2080374784 134217728 Clear @@ -360,39 +372,43 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ 16 - -2038152961 + -2038153216 164 400 75 + NO 289 {{407, 8}, {85, 19}} + YES - -2080244224 + -2080374784 134217728 Close - -2038152961 + -2038153216 164 400 75 + NO {512, 285} + - {{0, 0}, {2560, 1418}} + {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} YES @@ -420,9 +436,9 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ 2322 - {716, 14} + {716, 571} - + @@ -434,7 +450,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ - 134 + 166 @@ -442,7 +458,7 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ 1 - 67120389 + 11525 0 @@ -478,7 +494,6 @@ YWppdGFAYXBhcmFqaXRhLmNvbQ 6 {716, 10000000} - {238, 0} @@ -516,9 +531,9 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 256 - {{702, 1}, {15, 571}} + {{701, 1}, {16, 571}} - + NO _doScroller: 1 @@ -530,6 +545,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA {{-100, -100}, {87, 18}} + NO 1 _doScroller: @@ -539,18 +555,21 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA {{-1, -1}, {718, 573}} - + 133138 + 0.25 + 4 + 1 {716, 571} - {{0, 0}, {2560, 1418}} + {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} YES @@ -564,7 +583,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA - + 256 @@ -575,12 +594,12 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - -2080244224 + -2080374784 0 Inode meta information changes - 1211912703 + 1211912448 2 NSImage @@ -594,6 +613,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 200 25 + NO @@ -603,11 +623,11 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - -2076049856 + -2076180416 2048 - 109199615 + 109199360 129 @@ -660,6 +680,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES 2 + NO @@ -669,7 +690,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - 68288064 + 68157504 272630784 React To: @@ -677,6 +698,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA + NO @@ -686,7 +708,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - 68288064 + 68157504 272630784 API Mode: @@ -694,6 +716,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA + NO @@ -703,7 +726,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - 68288064 + 68157504 272630784 Current API Mode @@ -711,16 +734,16 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA + NO 268 {{103, 16}, {284, 17}} - YES - 68288064 + 68157504 272630784 In "File level" API mode, react to touch, chown, etc. @@ -735,6 +758,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA + NO @@ -744,12 +768,12 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - -2080244224 + -2080374784 0 Listen to the most recent project - 1211912703 + 1211912448 2 @@ -758,6 +782,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 200 25 + NO @@ -767,7 +792,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - 68288064 + 68157504 272630784 On Launch: @@ -775,6 +800,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA + NO @@ -784,7 +810,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA YES - 68288064 + 68157504 272630784 RmlsZSBtb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggT1MgWCAxMC42LgpVbmxlc3MgeW91IGtub3cg d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 @@ -796,13 +822,13 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 MC4zNDU1Mjg0ODM0IDAuMzQ1NTI4NDgzNCAwLjM0NTUyODQ4MzQAA + NO {435, 199} - - {{0, 0}, {2560, 1418}} + {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} xcc-prefs YES @@ -820,6 +846,85 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 + + + 268 + + + + 297 + {{281, 18}, {18, 19}} + + + YES + + -2080374784 + 134217728 + + + + -2033958912 + 164 + + NSImage + NSFollowLinkFreestandingTemplate + + + + 400 + 75 + + NO + + + + 274 + {{7, 12}, {265, 18}} + + + YES + + 67108864 + 272629760 + Label + + + + + + NO + + + + 266 + {{7, 30}, {265, 17}} + + + YES + + 67108928 + 272632320 + Label + + LucidaGrande-Bold + 13 + 2072 + + + + + 1 + MC43NzU1OTkzNjA1IDAuMjQ2OTMyOTIzOCAwLjIxOTQ4OTQ4NQA + + + NO + + + {308, 56} + + + TNErrorDataView + @@ -1031,6 +1136,14 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 660 + + + dataViewError + + + + 682 + performClose: @@ -1201,6 +1314,38 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 657 + + + fieldFileName + + + + 678 + + + + fieldMessage + + + + 681 + + + + openFile: + + + + 689 + + + + buttonOpenFile + + + + 690 + @@ -1641,6 +1786,55 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 + + 675 + + + + + + + + + + 676 + + + + + + + + 677 + + + + + 679 + + + + + + + + 680 + + + + + 687 + + + + + + + + 688 + + + @@ -1716,12 +1910,19 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - 674 + 690 0 @@ -1730,15 +1931,12 @@ d2hhdCB5b3UgYXJlIGRvaW5nLCBsZWF2ZSB0aGlzIG9uICJBdXRvIi4 com.apple.InterfaceBuilder.CocoaPlugin.macosx - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - YES 3 - {9, 8} - {7, 2} + {10, 10} + {11, 11} + {10, 3} {15, 15} diff --git a/Tools/XcodeCapp/English.lproj/MainMenu.nib/keyedobjects.nib b/Tools/XcodeCapp/English.lproj/MainMenu.nib/keyedobjects.nib index 7509b08c1035aca1d0bf0e09013bb4a4d07271a0..d5521dd50918bd1c9b6fcb60b64c4c943bca615a 100644 GIT binary patch literal 22880 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 A&;S4c diff --git a/Tools/XcodeCapp/TNErrorDataView.h b/Tools/XcodeCapp/TNErrorDataView.h new file mode 100644 index 000000000..b988f3578 --- /dev/null +++ b/Tools/XcodeCapp/TNErrorDataView.h @@ -0,0 +1,34 @@ +/* + * This file is a part of program XcodeCapp + * Copyright (C) 2013 Antoine Mercadal () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#import + +@interface TNErrorDataView : NSView +{ + IBOutlet NSTextField *fieldFileName; + IBOutlet NSTextField *fieldMessage; + IBOutlet NSButton *buttonOpenFile; + + NSString *_fullPath; +} + +@property (assign) NSTextField *fieldMessage; + +- (IBAction)openFile:(id)aSender; + +@end diff --git a/Tools/XcodeCapp/TNErrorDataView.m b/Tools/XcodeCapp/TNErrorDataView.m new file mode 100644 index 000000000..a8a49d31f --- /dev/null +++ b/Tools/XcodeCapp/TNErrorDataView.m @@ -0,0 +1,75 @@ +/* + * This file is a part of program XcodeCapp + * Copyright (C) 2013 Antoine Mercadal () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#import "TNErrorDataView.h" + +@implementation TNErrorDataView + +@synthesize fieldMessage; + +/*! + Set the data view's object value + @param aValue the dictionary representing the error + */ +- (void)setObjectValue:(NSDictionary *)aValue +{ + [fieldMessage setStringValue:[aValue valueForKey:@"message"]]; + [fieldFileName setStringValue:[aValue valueForKey:@"file"]]; + _fullPath = [aValue valueForKey:@"path"]; +} + + +#pragma - +#pragma Actions + +/*! + Open the errored file in default editor + @param aSender the sender of the action + */ +- (IBAction)openFile:(id)aSender +{ + NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; + [workspace openFile:_fullPath]; +} + + +#pragma - +#pragma CPCoding + +- (id)initWithCoder:(NSCoder*)aCoder +{ + if (self = [super initWithCoder:aCoder]) + { + fieldFileName = [aCoder decodeObjectForKey:@"fieldFileName"]; + fieldMessage = [aCoder decodeObjectForKey:@"fieldMessage"]; + buttonOpenFile = [aCoder decodeObjectForKey:@"buttonOpenFile"]; + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder*)aCoder +{ + [super encodeWithCoder:aCoder]; + + [aCoder encodeObject:fieldFileName forKey:@"fieldFileName"]; + [aCoder encodeObject:fieldMessage forKey:@"fieldMessage"]; + [aCoder encodeObject:buttonOpenFile forKey:@"buttonOpenFile"]; +} + +@end diff --git a/Tools/XcodeCapp/TNXCodeCapp.m b/Tools/XcodeCapp/TNXCodeCapp.m index 06c3a1ac2..a440498d7 100644 --- a/Tools/XcodeCapp/TNXCodeCapp.m +++ b/Tools/XcodeCapp/TNXCodeCapp.m @@ -545,7 +545,13 @@ NSString * const XCCListeningStartNotification = @"XCCListeningStartNotification else if (![status intValue] == 0) { if (response) - [errorList addObject:response]; + { + NSDictionary *errorDictionary = [NSDictionary dictionaryWithObjectsAndKeys:response, @"message", + splitPath, @"file", + fullPath, @"path", nil]; + + [errorList addObject:errorDictionary]; + } [delegate performSelector:@selector(growlWithTitle:message:) withObject:@"Error processing file" withObject:splitPath]; } diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index 7e0c5e38e..b99ab8bb7 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 02998CEB1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = 02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */; }; 02998CF71369C339006C73DB /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02998CF61369C339006C73DB /* Growl.framework */; }; 02998CF91369C38A006C73DB /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 02998CF61369C339006C73DB /* Growl.framework */; }; + 02B1C8D816B25C74003C6E82 /* TNErrorDataView.m in Sources */ = {isa = PBXBuildFile; fileRef = 02B1C8D716B25C74003C6E82 /* TNErrorDataView.m */; }; 4E2D0D01154840B400475C01 /* help.rtfd in Resources */ = {isa = PBXBuildFile; fileRef = 4E2D0D00154840B400475C01 /* help.rtfd */; }; 4E2D0D03154840BC00475C01 /* help.rtfd in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4E2D0D00154840B400475C01 /* help.rtfd */; }; 651DAE1F13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 651DAE1D13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m */; }; @@ -62,6 +63,8 @@ 0294F09215D345A500840547 /* mod_pbxproj.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mod_pbxproj.py; sourceTree = ""; }; 02998CEA1369BF7D006C73DB /* Growl Registration Ticket.growlRegDict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Growl Registration Ticket.growlRegDict"; sourceTree = ""; }; 02998CF61369C339006C73DB /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Growl.framework; sourceTree = ""; }; + 02B1C8D616B25C74003C6E82 /* TNErrorDataView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TNErrorDataView.h; sourceTree = ""; }; + 02B1C8D716B25C74003C6E82 /* TNErrorDataView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TNErrorDataView.m; sourceTree = ""; }; 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; @@ -98,6 +101,8 @@ children = ( 651DAE1C13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.h */, 651DAE1D13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m */, + 02B1C8D616B25C74003C6E82 /* TNErrorDataView.h */, + 02B1C8D716B25C74003C6E82 /* TNErrorDataView.m */, 8E01A91D0DE9EED20008BB35 /* AppController.h */, 8E01A91E0DE9EED20008BB35 /* AppController.m */, 027FE49B1462D74C00B1AB92 /* TNXCodeCapp.h */, @@ -285,6 +290,7 @@ 651DAE1F13B0CAB900ECA3F0 /* PRHEmptyGrowlDelegate.m in Sources */, 027FE49D1462D74C00B1AB92 /* TNXCodeCapp.m in Sources */, 027FE4BD1462F7EB00B1AB92 /* FSEventCallback.m in Sources */, + 02B1C8D816B25C74003C6E82 /* TNErrorDataView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };