From 1880029f77989fad55355bcbecb1b53fadf2ca56 Mon Sep 17 00:00:00 2001 From: Nicholas Shanks Date: Thu, 3 Apr 2003 15:38:42 +0000 Subject: [PATCH] Update for Uli --- Carbon/Classes/Application.cpp | 5 +- Carbon/Classes/FileWindow.cpp | 1 + Carbon/Generic.h | 15 +- Carbon/ResKnife.h | 7 +- Cocoa/Classes/ApplicationDelegate.h | 16 +- Cocoa/Classes/ApplicationDelegate.m | 28 +- Cocoa/Classes/InfoWindowController.m | 6 +- Cocoa/Classes/OpenFileDataSource.h | 19 + Cocoa/Classes/OpenFileDataSource.m | 113 ++ Cocoa/Classes/PasteboardDocument.h | 11 + Cocoa/Classes/PasteboardDocument.m | 43 + Cocoa/Classes/PasteboardWindowController.h | 9 + Cocoa/Classes/PasteboardWindowController.m | 20 + Cocoa/Classes/RKDocumentController.h | 6 + Cocoa/Classes/RKDocumentController.m | 29 + Cocoa/Classes/Resource.h | 6 + Cocoa/Classes/Resource.m | 12 + Cocoa/Classes/ResourceDocument.h | 1 + Cocoa/Classes/ResourceDocument.m | 67 +- Cocoa/Classes/ResourceNameCell.m | 18 +- .../English.lproj/Application.nib/classes.nib | 9 +- Cocoa/English.lproj/Application.nib/info.nib | 19 +- .../English.lproj/Application.nib/objects.nib | Bin 7017 -> 9098 bytes Cocoa/English.lproj/Localizable.strings | Bin 2846 -> 3052 bytes .../ResourceDocument.nib/info.nib | 4 +- .../ResourceDocument.nib/objects.nib | Bin 2846 -> 2848 bytes .../English.lproj/HexWindow.nib/info.nib | 2 +- .../English.lproj/HexWindow.nib/objects.nib | Bin 5909 -> 5909 bytes Cocoa/Plug-Ins/Hex Editor/HexTextView.m | 45 +- .../Plug-Ins/Hex Editor/HexWindowController.m | 20 +- .../English.lproj/PictWindow.nib/classes.nib | 12 + .../English.lproj/PictWindow.nib/info.nib | 16 + .../English.lproj/PictWindow.nib/objects.nib | Bin 0 -> 812 bytes .../PICT Editor/PictWindowController.h | 13 + .../PICT Editor/PictWindowController.m | 77 ++ .../Plug-Ins/PICT Editor/SupportedTypes.plist | 10 + .../English.lproj/TemplateWindow.nib/info.nib | 4 + .../TemplateWindow.nib/objects.nib | Bin 2401 -> 3608 bytes Hex Editor/Classes/HexUtility.cpp | 233 ++++ Hex Editor/Classes/HexUtility.h | 31 + HexEditor.graffle | 1065 ++++++++++++++++ ResKnife Cocoa.graffle | 1093 +++++++++-------- ResKnife.mcp | Bin 395583 -> 396641 bytes ResKnife.pbproj/project.pbxproj | 303 ++++- .../Classes/TemplateInitalisation.cpp | 113 ++ .../Classes/TemplateInitalisation.h | 1 + 46 files changed, 2923 insertions(+), 579 deletions(-) create mode 100644 Cocoa/Classes/OpenFileDataSource.h create mode 100644 Cocoa/Classes/OpenFileDataSource.m create mode 100644 Cocoa/Classes/PasteboardDocument.h create mode 100644 Cocoa/Classes/PasteboardDocument.m create mode 100644 Cocoa/Classes/PasteboardWindowController.h create mode 100644 Cocoa/Classes/PasteboardWindowController.m create mode 100644 Cocoa/Classes/RKDocumentController.h create mode 100644 Cocoa/Classes/RKDocumentController.m create mode 100644 Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/classes.nib create mode 100644 Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/info.nib create mode 100644 Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/objects.nib create mode 100644 Cocoa/Plug-Ins/PICT Editor/PictWindowController.h create mode 100644 Cocoa/Plug-Ins/PICT Editor/PictWindowController.m create mode 100644 Cocoa/Plug-Ins/PICT Editor/SupportedTypes.plist create mode 100644 Hex Editor/Classes/HexUtility.cpp create mode 100644 Hex Editor/Classes/HexUtility.h create mode 100644 HexEditor.graffle create mode 100644 Template Editor/Classes/TemplateInitalisation.cpp create mode 100644 Template Editor/Classes/TemplateInitalisation.h diff --git a/Carbon/Classes/Application.cpp b/Carbon/Classes/Application.cpp index 78587da..9f976f7 100644 --- a/Carbon/Classes/Application.cpp +++ b/Carbon/Classes/Application.cpp @@ -70,7 +70,6 @@ int main( int argc, char* argv[] ) ParseDialogEvents( null, &theEvent, null ); else ParseEvents( &theEvent ); } - QuitResKnife(); #endif #if __profile__ @@ -78,6 +77,10 @@ int main( int argc, char* argv[] ) ProfilerTerm(); #endif +#if !TARGET_API_MAC_CARBON + QuitResKnife(); +#endif + return error; } diff --git a/Carbon/Classes/FileWindow.cpp b/Carbon/Classes/FileWindow.cpp index 4db5a65..7c480a7 100644 --- a/Carbon/Classes/FileWindow.cpp +++ b/Carbon/Classes/FileWindow.cpp @@ -30,6 +30,7 @@ FileWindow::FileWindow( FSSpecPtr spec ) error = CreateWindowFromNib( nibRef, CFSTR("File Window"), &window ); if( error != noErr || window == null ) { + DisposeNibReference( nibRef ); DisplayError( "\pA file window could not be obtained from the nib file." ); return; } diff --git a/Carbon/Generic.h b/Carbon/Generic.h index 5682f9c..bc46fdc 100644 --- a/Carbon/Generic.h +++ b/Carbon/Generic.h @@ -1,6 +1,17 @@ // abbreviations -#define null NULL -#define qdb qd.screenBits.bounds +#define null NULL + +#if TARGET_API_MAC_CARBON + #define qdb ScreenBounds() + inline Rect ScreenBounds() + { + Rect rect; + GetAvailableWindowPositioningBounds( GetMainDevice(), &rect ); + return rect; + } +#else + #define qdb qd.screenBits.bounds +#endif // Easier API call names #define GetWindowRefCon( window ) (long) GetWRefCon( window ) diff --git a/Carbon/ResKnife.h b/Carbon/ResKnife.h index f651f7e..7defef7 100644 --- a/Carbon/ResKnife.h +++ b/Carbon/ResKnife.h @@ -112,12 +112,14 @@ struct prefs Boolean quitIfNoWindowsAreOpen; // silly name! - perhaps grandmaMode ? Boolean autoSave; UInt32 autoSaveInterval; // should be in units of time - Boolean warnOnDelete; // "Are you sure?" dialog, © Microsoft 1992-2000 + Boolean warnOnDelete; // "Are you sure?" dialog, © Microsoft 1986-2003 }; /*** CONSTANTS ***/ // Mac OS versions +const SInt32 kMacOS607 = 0x00000607; +const SInt32 kMacOS7 = 0x00000710; const SInt32 kMacOS71 = 0x00000710; const SInt32 kMacOS755 = 0x00000755; const SInt32 kMacOS8 = 0x00000800; @@ -129,6 +131,7 @@ const SInt32 kMacOS91 = 0x00000910; const SInt32 kMacOS921 = 0x00000921; const SInt32 kMacOS10 = 0x00001000; const SInt32 kMacOS101 = 0x00001010; +const SInt32 kMacOS102 = 0x00001020; const SInt32 kMacOSX = kMacOS10; // CarbonLib versions @@ -139,6 +142,8 @@ const SInt32 kCarbonLib125 = 0x00000125; const SInt32 kCarbonLib131 = 0x00000131; const SInt32 kCarbonLib14 = 0x00000140; const SInt32 kCarbonLib145 = 0x00000145; +const SInt32 kCarbonLib15 = 0x00000150; +const SInt32 kCarbonLib16 = 0x00000160; // ResKnife version & file types const UInt32 kCurrentVersion = 0x00040001; diff --git a/Cocoa/Classes/ApplicationDelegate.h b/Cocoa/Classes/ApplicationDelegate.h index e091fea..ef9bd40 100644 --- a/Cocoa/Classes/ApplicationDelegate.h +++ b/Cocoa/Classes/ApplicationDelegate.h @@ -10,7 +10,11 @@ @interface ApplicationDelegate : NSObject { -/*! @var icons A dictionary within which to cache icons. Keys are four-character NSStrings representing ResTypes. */ +/*! @var openAuxView Accessory view for NSOpenPanels. */ + IBOutlet NSView *openAuxView; +/*! @var forkTableView Table view inside openAuxView. */ + IBOutlet NSTableView *forkTableView; +/*! @var icons A dictionary within which to cache icons. Keys are four-character NSStrings representing ResTypes. */ NSMutableDictionary *icons; } @@ -39,6 +43,11 @@ */ - (IBAction)showInfo:(id)sender; +/*! @function showPasteboard: + * @discussion Displays the pasteboard document, a singleton instance of class PasteboardDocument + */ +- (IBAction)showPasteboard:(id)sender; + /*! @function showPrefs: * @discussion Displays the preferences panel stored in PrefsWindow.nib */ @@ -49,6 +58,11 @@ */ - (void)initUserDefaults; +/*! @function openAuxView + * @discussion Accessor method for the openAuxView instance variable. + */ +- (NSView *)openAuxView; + /*! @function icons * @discussion Accessor method for the icons instance variable. */ diff --git a/Cocoa/Classes/ApplicationDelegate.m b/Cocoa/Classes/ApplicationDelegate.m index 1fb3293..edef246 100644 --- a/Cocoa/Classes/ApplicationDelegate.m +++ b/Cocoa/Classes/ApplicationDelegate.m @@ -1,5 +1,7 @@ #import "ApplicationDelegate.h" +#import "RKDocumentController.h" #import "InfoWindowController.h" +#import "PasteboardWindowController.h" #import "PrefsWindowController.h" #import "CreateResourceSheetController.h" #import "ResourceDocument.h" @@ -16,6 +18,13 @@ return self; } +- (void)applicationWillFinishLaunching:(NSNotification *)notification +{ + // instanciate my own subclass of NSDocumentController so I can override the open dialog + RKDocumentController *docController = [[RKDocumentController alloc] init]; + #pragma unused( docController ) +} + - (void)awakeFromNib { // Part of my EvilPlanª to find out how many people use ResKnife and how often! @@ -28,6 +37,13 @@ [icons setObject:[[NSWorkspace sharedWorkspace] iconForFileType:@"PICT"] forKey:@"PICT"]; [icons setObject:[[NSWorkspace sharedWorkspace] iconForFileType:@"icns"] forKey:@"icns"]; + // set up open dialog's aux table view + NSTableColumn *tableColumn = [forkTableView tableColumnWithIdentifier:@"parse"]; + NSButtonCell *buttonCell = [[[NSButtonCell alloc] initTextCell:@""] autorelease]; + [buttonCell setEditable:YES]; + [buttonCell setButtonType:NSSwitchButton]; + [tableColumn setDataCell:buttonCell]; + [self initUserDefaults]; } @@ -41,7 +57,7 @@ { #pragma unused( sender ) NSString *launchAction = [[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchAction"]; - if( [launchAction isEqualToString:@"OpenUntitledFile"] ) + if( [launchAction isEqualToString:@"OpenUntitledFile"] ) return YES; else if( [launchAction isEqualToString:@"DisplayOpenPanel"] ) { @@ -91,6 +107,11 @@ [[InfoWindowController sharedInfoWindowController] showWindow:sender]; } +- (IBAction)showPasteboard:(id)sender +{ + [[PasteboardWindowController sharedPasteboardWindowController] showWindow:sender]; +} + - (IBAction)showPrefs:(id)sender { [[PrefsWindowController sharedPrefsWindowController] showWindow:sender]; @@ -133,6 +154,11 @@ [defaults synchronize]; } +- (NSView *)openAuxView +{ + return openAuxView; +} + - (NSDictionary *)icons { return icons; diff --git a/Cocoa/Classes/InfoWindowController.m b/Cocoa/Classes/InfoWindowController.m index dca700f..d33cb76 100644 --- a/Cocoa/Classes/InfoWindowController.m +++ b/Cocoa/Classes/InfoWindowController.m @@ -28,10 +28,8 @@ [(NSPanel *)[self window] setBecomesKeyOnlyIfNeeded:YES]; // retain views for swapping in and out - [documentView retain]; - [documentView removeFromSuperview]; - [resourceView retain]; - [resourceView removeFromSuperview]; + [[documentView retain] removeFromSuperview]; + [[resourceView retain] removeFromSuperview]; [self setMainWindow:[NSApp mainWindow]]; [self updateInfoWindow]; diff --git a/Cocoa/Classes/OpenFileDataSource.h b/Cocoa/Classes/OpenFileDataSource.h new file mode 100644 index 0000000..2b91bef --- /dev/null +++ b/Cocoa/Classes/OpenFileDataSource.h @@ -0,0 +1,19 @@ +/* OpenFileDataSource */ + +#import + +@interface OpenFileDataSource : NSObject +{ + IBOutlet NSTableView *forkTableView; +} +@end + +@interface OpenPanelDelegate : NSObject +{ + id originalDelegate; +} +@end + +@interface NSSavePanel (ResKnife) +- (NSBrowser *)browser; +@end \ No newline at end of file diff --git a/Cocoa/Classes/OpenFileDataSource.m b/Cocoa/Classes/OpenFileDataSource.m new file mode 100644 index 0000000..20008c2 --- /dev/null +++ b/Cocoa/Classes/OpenFileDataSource.m @@ -0,0 +1,113 @@ +#import "OpenFileDataSource.h" +#import +#import + +struct directoryinfo { +ÊÊ unsigned long length; +ÊÊ u_int32_t dirid; +}; + +struct dunnowhat +{ + unsigned long length; + u_int32_t data1; + u_int32_t data2; + u_int32_t data3; + u_int32_t data4; + u_int32_t data5; + u_int32_t data6; +}; + +@implementation OpenFileDataSource + +//get action method and target of browser, intercept (or re-route and call it myself) + +/* NSTableView data source protocol implementation */ +- (int)numberOfRowsInTableView:(NSTableView *)tableView +{ + NSBrowser *browser = [(NSOpenPanel *)[tableView window] browser]; + if( [[browser selectedCells] count] == 1 ) + { + // only one file is selected, parse it for forks +/* const char *path = [[browser path] cString]; + struct attrlist attributes; + struct directoryinfo fileinfo; + + NSLog( @"%s", path ); +// memset( &attributes, 0, sizeof(struct attrlist) ); + bzero( &attributes, sizeof(struct attrlist) ); + attributes.bitmapcount = ATTR_BIT_MAP_COUNT; +// attributes.fileattr = ATTR_FILE_FORKCOUNT; + attributes.commonattr = ATTR_CMN_OBJID; + int result = getattrlist( path, &attributes, &fileinfo, sizeof(struct directoryinfo), 0 ); + NSLog( @"%d", result ); + if( result != 0 ) return 0; + NSLog( @"%d", fileinfo.length ); + NSLog( @"%d", fileinfo.dirid ); +*/ + struct attrlist alist; + struct directoryinfo dirinfo; + char *path = [[browser path] cString]; + bzero(&alist, sizeof(alist)); + alist.bitmapcount = 5; + alist.commonattr = ATTR_CMN_OBJID; + int result = getattrlist(path, &alist, &dirinfo, sizeof(dirinfo), 0); + printf("result: %d; directory id: %lu; %s\n", result, dirinfo.dirid, path); + + return 3; + } + + // multiple/no selected files, return nothing + else return 0; +} + +- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row +{ + return nil; +} + +- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(int)row +{ + ; +} + +/* + NSLog( [browser path] ); + CatPositionRec forkIterator; + forkIterator.initialize = 0; + FSIterateForks( FSRef *ref, &forkIterator, NULL, NULL, NULL ); +*/ + +@end + +@implementation OpenPanelDelegate + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector +{ +/* NSMethodSignature *sig; + NS_DURING + sig = [super methodSignatureForSelector:selector]; + NS_HANDLER + sig = [originalDelegate methodSignatureForSelector:selector]; + NS_ENDHANDLER + return sig; */ + return [originalDelegate methodSignatureForSelector:selector]; +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + if( [originalDelegate respondsToSelector:[invocation selector]] ) + [invocation invokeWithTarget:originalDelegate]; + else [self doesNotRecognizeSelector:[invocation selector]]; +} + +@end + +@implementation NSSavePanel (ResKnife) + +- (NSBrowser *)browser +{ + return _browser; +} + +@end \ No newline at end of file diff --git a/Cocoa/Classes/PasteboardDocument.h b/Cocoa/Classes/PasteboardDocument.h new file mode 100644 index 0000000..c3c5714 --- /dev/null +++ b/Cocoa/Classes/PasteboardDocument.h @@ -0,0 +1,11 @@ +#import +#import "ResourceDocument.h" + +@interface PasteboardDocument : ResourceDocument +{ + unsigned long generalChangeCount; // change count for the general pasteboard +} + +- (void)readPasteboard:(NSString *)pbName; + +@end diff --git a/Cocoa/Classes/PasteboardDocument.m b/Cocoa/Classes/PasteboardDocument.m new file mode 100644 index 0000000..dcabc6d --- /dev/null +++ b/Cocoa/Classes/PasteboardDocument.m @@ -0,0 +1,43 @@ +#import "PasteboardDocument.h" +#import "Resource.h" + +@implementation PasteboardDocument + +- (id)init +{ + self = [super init]; + if( self ) + { + [self readPasteboard:NSGeneralPboard]; + } + return self; +} + +- (void)readPasteboard:(NSString *)pbName +{ + NSPasteboard *pb = [NSPasteboard pasteboardWithName:pbName]; + NSArray *types = [pb types]; + NSEnumerator *enumerator = [types objectEnumerator]; + NSString *currentType; + + [[self undoManager] disableUndoRegistration]; + while( currentType = [enumerator nextObject] ) + { + // create the resource & add it to the array + NSString *name = pbName; + NSString *type; + NS_DURING + type = [currentType substringToIndex:3]; + NS_HANDLER + type = currentType; + NS_ENDHANDLER + NSNumber *resID = [NSNumber numberWithShort:0]; + NSNumber *attributes = [NSNumber numberWithShort:0]; + NSData *data = [pb dataForType:type]; + Resource *resource = [Resource resourceOfType:type andID:resID withName:name andAttributes:attributes data:data]; + [resources addObject:resource]; // array retains resource + } + [[self undoManager] enableUndoRegistration]; +} + +@end diff --git a/Cocoa/Classes/PasteboardWindowController.h b/Cocoa/Classes/PasteboardWindowController.h new file mode 100644 index 0000000..9dfa4d9 --- /dev/null +++ b/Cocoa/Classes/PasteboardWindowController.h @@ -0,0 +1,9 @@ +#import + +@interface PasteboardWindowController : NSWindowController +{ +} + ++ (id)sharedPasteboardWindowController; + +@end \ No newline at end of file diff --git a/Cocoa/Classes/PasteboardWindowController.m b/Cocoa/Classes/PasteboardWindowController.m new file mode 100644 index 0000000..01ff53c --- /dev/null +++ b/Cocoa/Classes/PasteboardWindowController.m @@ -0,0 +1,20 @@ +#import "PasteboardWindowController.h" + +@implementation PasteboardWindowController + +- (id)init +{ + self = [self initWithWindowNibName:@"ResourceDocument"]; + if( self ) [self setWindowFrameAutosaveName:@"PasteboardWindow"]; + return self; +} + ++ (id)sharedPasteboardWindowController +{ + static PasteboardWindowController *sharedPasteboardWindowController = nil; + if( !sharedPasteboardWindowController ) + sharedPasteboardWindowController = [[PasteboardWindowController allocWithZone:[self zone]] init]; + return sharedPasteboardWindowController; +} + +@end \ No newline at end of file diff --git a/Cocoa/Classes/RKDocumentController.h b/Cocoa/Classes/RKDocumentController.h new file mode 100644 index 0000000..d5123f7 --- /dev/null +++ b/Cocoa/Classes/RKDocumentController.h @@ -0,0 +1,6 @@ +#import + +@interface RKDocumentController : NSDocumentController +{ +} +@end diff --git a/Cocoa/Classes/RKDocumentController.m b/Cocoa/Classes/RKDocumentController.m new file mode 100644 index 0000000..96bcb17 --- /dev/null +++ b/Cocoa/Classes/RKDocumentController.m @@ -0,0 +1,29 @@ +#import "RKDocumentController.h" +#import "ApplicationDelegate.h" +#import "OpenFileDataSource.h" + +@implementation RKDocumentController + +// because I swap the isa pointer I can't add instance variables, so use statics instead (there will only ever be one RKDocumentController) +static id oldDelegate = nil; + +- (id)init +{ + self = [super init]; + if( self ) + { + // for some reason calling -[super init] causes a new instance of self to be returned (which is not of my subclass) so to get my overridden methods called again, I have to do this... + isa = [RKDocumentController class]; + oldDelegate = [[NSOpenPanel openPanel] delegate]; + [[NSOpenPanel openPanel] setDelegate:[[[OpenPanelDelegate alloc] init] autorelease]]; + } + return self; +} + +- (int)runModalOpenPanel:(NSOpenPanel *)openPanel forTypes:(NSArray *)extensions +{ + [openPanel setAccessoryView:[(ApplicationDelegate *)[NSApp delegate] openAuxView]]; + return [super runModalOpenPanel:openPanel forTypes:extensions]; +} + +@end diff --git a/Cocoa/Classes/Resource.h b/Cocoa/Classes/Resource.h index bf24153..bf0909a 100644 --- a/Cocoa/Classes/Resource.h +++ b/Cocoa/Classes/Resource.h @@ -6,6 +6,7 @@ @private // flags BOOL dirty; + NSString *representedFork; // resource information NSString *name; @@ -17,12 +18,17 @@ NSData *data; } +// accessor methods not part of the protocol - (void)setDirty:(BOOL)newValue; +- (NSString *)representedFork; +- (void)setRepresentedFork:(NSString *)forkName; +// init methods - (id)initWithType:(NSString *)typeValue andID:(NSNumber *)resIDValue; - (id)initWithType:(NSString *)typeValue andID:(NSNumber *)resIDValue withName:(NSString *)nameValue andAttributes:(NSNumber *)attributesValue; - (id)initWithType:(NSString *)typeValue andID:(NSNumber *)resIDValue withName:(NSString *)nameValue andAttributes:(NSNumber *)attributesValue data:(NSData *)dataValue; +// autoreleased resource methods + (id)resourceOfType:(NSString *)typeValue andID:(NSNumber *)resIDValue; + (id)resourceOfType:(NSString *)typeValue andID:(NSNumber *)resIDValue withName:(NSString *)nameValue andAttributes:(NSNumber *)attributesValue; + (id)resourceOfType:(NSString *)typeValue andID:(NSNumber *)resIDValue withName:(NSString *)nameValue andAttributes:(NSNumber *)attributesValue data:(NSData *)dataValue; diff --git a/Cocoa/Classes/Resource.m b/Cocoa/Classes/Resource.m index 1acd289..6c0645a 100644 --- a/Cocoa/Classes/Resource.m +++ b/Cocoa/Classes/Resource.m @@ -30,6 +30,7 @@ NSString *RKResourcePboardType = @"RKResourcePboardType"; // sets values directly for speed reasons (less messaging overhead) self = [super init]; dirty = NO; + representedFork = nil; name = [nameValue copy]; type = [typeValue copy]; resID = [resIDValue copy]; @@ -122,6 +123,7 @@ NSString *RKResourcePboardType = @"RKResourcePboardType"; - (void)dealloc { + [representedFork release]; [name release]; [type release]; [resID release]; @@ -154,6 +156,16 @@ NSString *RKResourcePboardType = @"RKResourcePboardType"; [[NSNotificationCenter defaultCenter] postNotificationName:ResourceDidChangeNotification object:self]; } +- (NSString *)representedFork +{ + return representedFork; +} + +- (void)setRepresentedFork:(NSString *)forkName +{ + representedFork = [forkName copy]; +} + - (NSString *)name { return name; diff --git a/Cocoa/Classes/ResourceDocument.h b/Cocoa/Classes/ResourceDocument.h index 75e4610..283a077 100644 --- a/Cocoa/Classes/ResourceDocument.h +++ b/Cocoa/Classes/ResourceDocument.h @@ -42,6 +42,7 @@ - (void)resourceTypeWillChange:(NSNotification *)notification; - (void)resourceAttributesWillChange:(NSNotification *)notification; +- (BOOL)readFork:(NSString *)forkName asStreamFromFile:(NSString *)fileName; - (BOOL)readResourceMap:(SInt16)fileRefNum; - (BOOL)writeResourceMap:(SInt16)fileRefNum; diff --git a/Cocoa/Classes/ResourceDocument.m b/Cocoa/Classes/ResourceDocument.m index c276569..4142e61 100644 --- a/Cocoa/Classes/ResourceDocument.m +++ b/Cocoa/Classes/ResourceDocument.m @@ -288,9 +288,10 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh - (void)openResourceUsingEditor:(Resource *)resource { -#warning openResourceUsingEditor: shortcuts to NovaTools !! +// #warning openResourceUsingEditor: shortcuts to NovaTools !! // opens resource in template using TMPL resource with name templateName - NSBundle *editor = [NSBundle bundleWithPath:[[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:@"NovaTools.plugin"]]; +// NSBundle *editor = [NSBundle bundleWithPath:[[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:@"NovaTools.plugin"]]; + NSBundle *editor = [NSBundle bundleWithPath:[[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ Editor.plugin", [resource type]]]]; // open the resources, passing in the template to use if( editor /*&& [[editor principalClass] respondsToSelector:@selector(initWithResource:)]*/ ) @@ -339,6 +340,7 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh NSData *data = [(Resource *)[outlineView itemAtRow:[outlineView selectedRow]] data]; if( data && [data length] != 0 ) { + // bug: plays sound synchronously in main thread! SndListPtr sndPtr = (SndListPtr) [data bytes]; SndPlay( nil, &sndPtr, false ); } @@ -529,7 +531,11 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh NSLog( @"Opening Resource fork failed, trying data fork..." ); error = FSOpenResourceFile( fileRef, 0, nil, fsRdPerm, &fileRefNum); } - else fork = resourceForkName; + else + { + fork = resourceForkName; + [self readFork:@"" asStreamFromFile:fileName]; // bug: only reads data fork for now, need to scan file for other forks too + } SetResLoad( true ); // restore resource loading as soon as is possible // read the resources (without spawning thousands of undos for resource creation) @@ -551,19 +557,38 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh return succeeded; } +- (BOOL)readFork:(NSString *)forkName asStreamFromFile:(NSString *)fileName +{ + NSData *data = [NSData dataWithContentsOfFile:fileName]; + Resource *resource = [Resource resourceOfType:@"" andID:0 withName:NSLocalizedString(@"Data Fork", nil) andAttributes:0 data:data]; + if( data && resource ) + { + /* NTFS Note: When running SFM (Services for Macintosh) a Windows NT-based system (including 2000 & XP) serving NTFS-formatted drives stores Mac resource forks in a stream named "AFP_Resource". The finder info/attributes are stored in a stream called "Afp_AfpInfo". The default data fork stream is called "$DATA" and any of these can be accessed thus: "c:\filename.txt:forkname". + As a result, ResKnife prohibits creation of forks with the following names: "" (empty string, Mac data fork name), + "$DATA" (NTFS data fork name), + "AFP_Resource" and "Afp_AfpInfo". + It is perfectly legal in ResKnife to read in forks of these names when accessing a shared NTFS drive from a server running SFM. */ + + [resource setRepresentedFork:forkName]; + [resources insertObject:resource atIndex:0]; + return YES; + } + else return NO; +} + - (BOOL)readResourceMap:(SInt16)fileRefNum { OSStatus error = noErr; - unsigned short i, j, n; + unsigned short n; SInt16 oldResFile = CurResFile(); UseResFile( fileRefNum ); - for( i = 1; i <= Count1Types(); i++ ) + for( unsigned short i = 1; i <= Count1Types(); i++ ) { ResType resType; Get1IndType( &resType, i ); n = Count1Resources( resType ); - for( j = 1; j <= n; j++ ) + for( unsigned short j = 1; j <= n; j++ ) { Str255 nameStr; long sizeLong; @@ -586,15 +611,13 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh HLockHi( resourceHandle ); // create the resource & add it to the array - { - NSString *name = [NSString stringWithCString:&nameStr[1] length:nameStr[0]]; - NSString *type = [NSString stringWithCString:(char *) &resType length:4]; - NSNumber *resID = [NSNumber numberWithShort:resIDShort]; - NSNumber *attributes = [NSNumber numberWithShort:attrsShort]; - NSData *data = [NSData dataWithBytes:*resourceHandle length:sizeLong]; - Resource *resource = [Resource resourceOfType:type andID:resID withName:name andAttributes:attributes data:data]; - [resources addObject:resource]; // array retains resource - } + NSString *name = [NSString stringWithCString:&nameStr[1] length:nameStr[0]]; + NSString *type = [NSString stringWithCString:(char *) &resType length:4]; + NSNumber *resID = [NSNumber numberWithShort:resIDShort]; + NSNumber *attributes = [NSNumber numberWithShort:attrsShort]; + NSData *data = [NSData dataWithBytes:*resourceHandle length:sizeLong]; + Resource *resource = [Resource resourceOfType:type andID:resID withName:name andAttributes:attributes data:data]; + [resources addObject:resource]; // array retains resource HUnlock( resourceHandle ); ReleaseResource( resourceHandle ); @@ -624,6 +647,17 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh error = FSCreateResourceFile( parentRef, [[fileName lastPathComponent] length], (UniChar *) uniname, kFSCatInfoNone, nil, fork->length, (UniChar *) &fork->unicode, fileRef, fileSpec ); if( !error ) error = FSOpenResourceFile( fileRef, fork->length, (UniChar *) &fork->unicode, fsWrPerm, &fileRefNum); + + /* at some point make use of: + + FSCreateResourceFork( const FSRef * ref, + UniCharCount forkNameLength, + const UniChar * forkName, // can be NULL + UInt32 flags); + + Creates the named fork and initalises as a resource fork + + Mac OS 10.2 or later */ } else { @@ -654,12 +688,13 @@ static NSString *RKShowInfoItemIdentifier = @"com.nickshanks.resknife.toolbar.sh for( i = 0; i < [resources count]; i++ ) { Resource *resource = [resources objectAtIndex:i]; + if( [resource representedFork] != nil ) continue; Str255 nameStr; ResType resType; short resIDShort = [[resource resID] shortValue]; short attrsShort = [[resource attributes] shortValue]; - Handle resourceHandle = NewHandleClear( [[resource data] length] ); + Handle resourceHandle = NewHandleClear( [[resource data] length] ); nameStr[0] = [[resource name] cStringLength]; BlockMoveData( [[resource name] cString], &nameStr[1], nameStr[0] ); diff --git a/Cocoa/Classes/ResourceNameCell.m b/Cocoa/Classes/ResourceNameCell.m index 2d3528e..375fd3a 100644 --- a/Cocoa/Classes/ResourceNameCell.m +++ b/Cocoa/Classes/ResourceNameCell.m @@ -42,12 +42,15 @@ - (void)setImage:(NSImage *)newImage { - // save image and set to 16x16 pixels - id old = image; - image = [newImage retain]; - [image setScalesWhenResized:YES]; - [image setSize:NSMakeSize(16,16)]; - [old autorelease]; + if( image != newImage ) + { + // save image and set to 16x16 pixels + id old = image; + image = [newImage retain]; + [image setScalesWhenResized:YES]; + [image setSize:NSMakeSize(16,16)]; + [old release]; + } } - (NSRect)imageFrameForCellFrame:(NSRect)cellFrame @@ -104,7 +107,8 @@ // get image frame NSDivideRect( cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge ); - if( [self drawsBackground] ) +// NSLog( "drawing name cell with bg: %@ colour: %@", [self drawsBackground]? @"YES":@"NO", [self backgroundColor] ); + if( [self drawsBackground] && ![self isHighlighted] /* ![self cellAttribute:NSCellHighlighted] */ ) { [[self backgroundColor] set]; NSRectFill(imageFrame); diff --git a/Cocoa/English.lproj/Application.nib/classes.nib b/Cocoa/English.lproj/Application.nib/classes.nib index de7a0f3..1de604f 100644 --- a/Cocoa/English.lproj/Application.nib/classes.nib +++ b/Cocoa/English.lproj/Application.nib/classes.nib @@ -1,9 +1,10 @@ { IBClasses = ( { - ACTIONS = {showInfo = id; showPrefs = id; }; + ACTIONS = {showInfo = id; showPasteboard = id; showPrefs = id; }; CLASS = ApplicationDelegate; LANGUAGE = ObjC; + OUTLETS = {forkTableView = NSTableView; openAuxView = NSView; }; SUPERCLASS = NSObject; }, { @@ -29,6 +30,12 @@ CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; + }, + { + CLASS = OpenFileDataSource; + LANGUAGE = ObjC; + OUTLETS = {forkTableView = NSTableView; }; + SUPERCLASS = NSObject; } ); IBVersion = 1; diff --git a/Cocoa/English.lproj/Application.nib/info.nib b/Cocoa/English.lproj/Application.nib/info.nib index 0dbb5f7..d569ca4 100644 --- a/Cocoa/English.lproj/Application.nib/info.nib +++ b/Cocoa/English.lproj/Application.nib/info.nib @@ -1,17 +1,24 @@ - - + + IBDocumentLocation - 159 91 432 426 0 0 1152 848 + 535 90 432 426 0 0 1600 1002 IBEditorPositions + 246 + 630 582 340 222 0 0 1600 1002 29 - 59 443 347 44 0 0 1152 848 + 92 528 347 44 0 0 1600 1002 IBFramework Version - 263.2 + 286.0 + IBOpenObjects + + 29 + 246 + IBSystem Version - 5Q125 + 6G30 diff --git a/Cocoa/English.lproj/Application.nib/objects.nib b/Cocoa/English.lproj/Application.nib/objects.nib index 27ae40351eb294329fe6fc3544efb5c671472a7e..8f057250a2c80b9f7574c719dd1f5bdc0b2bb9de 100644 GIT binary patch literal 9098 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 s$cF2le2!I`6T#DC6c>b IBDocumentLocation - 75 336 486 325 0 0 1024 746 + 71 141 530 549 0 0 1600 1002 IBFramework Version 286.0 IBSystem Version - 6C115 + 6F21 IBUserGuides CreateResourceSheet diff --git a/Cocoa/English.lproj/ResourceDocument.nib/objects.nib b/Cocoa/English.lproj/ResourceDocument.nib/objects.nib index 361a6010a578666e76ec3dcd281e25077bdfbfb0..b543e90eb6b6e0fd48086a275e0653adbe8d93b0 100644 GIT binary patch literal 2848 zcma)8Z)_7~7=N#8%jnjv8-pNOU@8HJ#t0ZcEE{xxG9hXq7B%rtNO!%?lk45QUb79q zaP8as;1|thyQ~@w2m?2wO<15#62&07gfEh4Lin;6NsQBE&WULJ06x!qy|$xhY}4M| z^Zwr7^Y?w8^EPPXBSJi-sX{EN*ZoAfFr~C965Zc-VCW5j*9Kx*Oefz{S|5oz5|T3= zNPjw|DM?4zIYB*P+zPO$ri$_~H$k~aL(dB-C9U$pfWoJff~*-igK}b%1;}6|dMGv| z3H^$cPRc+~A5J6^;V{qBsVQ$tJSrFmyAJ}er3Bn3#NvY5FGx~5rOhA|#iIW(4nyBzE!@U4JT%v(;JelUE$uu!?IZ)FD!GSNWyj#__oJf#Uq11xBG-Ej#a2A!U+qn<>9;|#p_&zuHCvx7ia84*Lx z5`Y-=!{eE@op-{_sS|*$e@2v)VKoNSC-YlR{vRJs1;KW--w*bmX2v_2Igr*QQ5Iel zg;9>uhEfLbv4_&N=#{Lgiqy%1hhn$`6r_7Zks(WD0*fR7KuH|I^{zP-K#HO~?2}NW zlOI4hXXf&RHeya7{pa44mJmwkb|TN2MKCwVt<^p4I`=Li&J`n% zUn8GsJx0hmdNJ=a&zJ0Q)C#IjzCC9a^BGb?VB&JRr>Uh`=iVd)|IMPqL%kx;hoK5` zW|7t<5?v&_ci&16Z9E)TT)Hlndy{@y!^!DfM)w4p(Yj!>%Xz_}D+1Nn^bBwmd`8O|@TrU_bE~wF6LSL@nkNWUv@#V_ez&k1I zi}6Q>RV6LQs|qZ;cgO5mC^AsPfqigT4`a?%Sy0gyGFRg+gph1W4bg$@k#Zyo%%2wUhh@jPG6eK(D&ZQb|A-+f|2bX{P9u{Er*{(&;H+Y^!51M+I# zQ~$-w*)DIsWO5*;LEj%rYeLG%_ATtvvwd3pWjBzhsJ`Svptpkj7lq_RwG(A!Mx6(P z=yPf&k?ncs)y{0s!`A~?rlDLe^LO|daguGEDeo#+g`#z{V9i4vha%CJL^-aE9ukrx zQcM$c?ym_N6h&5q*o4A-lV_XGZE|`_W@HRH{nXTk7i3M;Bq846PPC3eQG)3KZP%s5 z2QMBEV?M`GFETb6!hQT4Wyx?*NamL+uYb6P*mlr4V%@C@oDVU1P z8S5rIKtHY;)=wH%0faEYs|+x#d<}3nc;pInxaq$fsMzB(rwM@)RG8Ln&k_@0&GqZ?3)yLf=Fj--x zR<=^Jv#MnF;OlhiAk4hX$^Qc*g`#F zaobz=&Gq)mM!RFoE(Gn(qxSM6_PpPIXx!d<)Xulr#YTJ6wN{Cl2c3+MMy5q5R~fgc1-BEi=1z?8HR^ zTlVeE&dz-E?d;5YYs|4>C6+V|C7Q6Rex_20Qd%F5^miW~cterR-l!S1$RefH;fRos ztSwY}Qb|)!2w~ee^@MOKs6|Xe)rO>TDm@x}UP0Yj0P>u*-xv$4{V4(GL|%z1cTugS>W!D z%EyNcJ*CCCKBFJbR#DI3VCLYSxp|2(h(ZF+2yzB7iJ*#(&xnBRJVUOIp-)2-z=)bG#qt7HmhpdYuzR3AnX|RVuGP3OjwKsGO`c& z**u=xNqw*Ee@cGM4|?0+clRE7mZXSGR1zam@-#8vUxTp%cBH|YSu!iZ4+91#?Qojl zORMBih#=e?>)8cz>6;ShqE_`YYFr;Oq6zkGQ4?@n{%(yEpP?lCdsn?kurbB;9*~#&SY@t8 zFeg~M%+|ZUTINnVyVjjIsh&{Sk&YugrgCrI2+oxI`{Dl>4nUx>wzEBAp*OehG7kT{U&+^k;#1YNssAz!fER78qhJ;EC^UwI?%2T+8PgoZNfP6hL3oi5aj39YVBX zfQv7MD4pBCIeBwZWJ~zRmAK_`kz{G~RC5*K?R@@IR%P&{TmMd1~S3oNeEA0qh zyL<6 IBSystem Version - 6C115 + 6F21 diff --git a/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/objects.nib b/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/objects.nib index 826e49a6c1ae92655fd93a7db9072d7e6acb1569..ef83cd0d578463d2589306a99a4a9626e3acf966 100644 GIT binary patch delta 982 zcmZuuOH30{6rI=7X_;XPbXu?iw&i0HzYt8c8VZU{5EQfojZq`k0VkFgX%i4)prq}_ zg-Ne7GA_)dk*ZDnrO~A^EM8(XvLG=ojSCmXPu#e0<(ru%#>BkE$vyYpbI-j`+9mCJ z>PFCjI^nCM8cv}OaPVDl3oXMC-(H)|WHJb)P&kD;D2gBqm~MmD!NE6^2ultZOqt!* z3W}n#Ikj}dTtudDKm25U@Po0zR;~%ITNrr3HCCJ$9SFfY%XWBQ-2lJXMsU$P^aSBU z&|^OcFYQh6kUml&Mq&vf(F|{ymJ)9@Ay{HO?b@?z*n0Q@2&i-^XF(I-ohEU z#O&6j;XB=C9ymO#`{CIsbExk$__$`vzC$Bnzs8z1Q_nbG#l*BYM~EX(Q`rXHmR5LD z6^FBotwdHpnlsBtf5_{H^HqCGckTO-?tD6yoYcC3tC@#+ySMb9W)8te69+pTVHh*l zgXG{nY3(@5GWCk0)bu?CMSV(9`CMj|%1ZLax?IT1>v?$% z=6P>VKvwe#BNvG@V@QvQ!faNS2vHRhqk=!-9iEK|Gg(K-(9GQtnqgqv07d&%1 zq0i|CaPlp|UU`F*uzzJbvvPni^eHiRDNaNcc(uJP{E^qe{}J&Kgs7{f*$Tj>R%6 zWt4*O!PUMPTq6qBDIt*kYq{87$nUci9E0xp_^ zb;lmy>1u6;qNr@~EiEJ1FngiLqzBeotG%7#rkml0wLyELHxzD$pSF7FF&kh<+XOy+ z4IF0L6{H6S`-!TZc=p3*rVsX-e8s3vgWwYhQiMp0DN9MdZR}KSJ-S9%(w4ZWX_oFC4JlrFyp#o1hC!GzH-g=6PJeelTI z4V&hts)jUw$yyMknd9)(Y}a4M_VA` z2*U%~?OWxS`6GNcui$dgNY29wWm(cg>ODo}GOr}WOJu)p*mcyx5VE0F_-gl{PI!*I zu!_uvEWg1QC5qpKW13bbC+70vHt1b-u;@IB=3v8lvZ;bfYksVu^)&S@P38IJH7YCa zY>S1w7!bs*yeJnWqnHEE)pktEtgIM=;Rt&-b&+EivZDW_C=kxv&&Am0WZl?8oSi3b zLYe-`;JM4=4G@mG#Kor)#8w~|YcL#+&L?6qC8?_`E6VV}HRK5>dHN|f#?DNn*ld>1 zj1~eiw7L&?{YoyAn4V6usnWo&6ryjkcgt59Zn+zV|0M;PXtWc_D94plf?8#vR7K6- z@sFt}l~FFE;D;~nmL>ldNzl!*$>hXLxshLKX^bY~Ddh*`&n3U|lqpWOGt4fk3sPxW zim90U|F|F})Ul8wZUgyDX)Wclg$yitswX8o&e`y`1^cx)ufwtf$J_9&796R93kXN+@zol9eh;3k!!wQe@?OmO O@WpC8cMyJg_WcHtWOq;i diff --git a/Cocoa/Plug-Ins/Hex Editor/HexTextView.m b/Cocoa/Plug-Ins/Hex Editor/HexTextView.m index 6f9e74e..d554a08 100644 --- a/Cocoa/Plug-Ins/Hex Editor/HexTextView.m +++ b/Cocoa/Plug-Ins/Hex Editor/HexTextView.m @@ -220,9 +220,11 @@ return charIndex; } -- (unsigned int)draggingSourceOperationMaskForLocal:(BOOL)isLocal +- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { - return NSDragOperationCopy | NSDragOperationMove | NSDragOperationGeneric; +/* if( isLocal ) return NSDragOperationEvery; + else return NSDragOperationCopy; +*/ return NSDragOperationCopy | NSDragOperationMove | NSDragOperationGeneric; } static NSRange draggedRange; @@ -234,16 +236,18 @@ static NSRange draggedRange; - (void)draggedImage:(NSImage *)image endedAt:(NSPoint)point operation:(NSDragOperation)operation { - if( operation == NSDragOperationMove ) +/* if( operation == NSDragOperationMove ) { NSRange selection = [self rangeForUserTextChange]; [self editData:[[[self window] windowController] data] replaceBytesInRange:draggedRange withData:[NSData data]]; // set the new selection/insertion point + selection.location -= draggedRange.length; + selection.length = draggedRange.length; if( selection.location > draggedRange.location ) selection.location -= draggedRange.length; [self setSelectedRange:selection]; - } + }*/ } - (NSDragOperation)draggingUpdated:(id )sender @@ -256,13 +260,44 @@ static NSRange draggedRange; - (BOOL)performDragOperation:(id )sender { + // get the insertion point location NSPasteboard *pb = [sender draggingPasteboard]; NSData *pastedData = [pb dataForType:NSStringPboardType]; int charIndex = [self _insertionGlyphIndexForDrag:sender]; - if( self == [[self delegate] hex] ) charIndex /= 3; + + // convert hex string to data if( [sender draggingSource] == [[self delegate] hex] ) pastedData = [[[self delegate] hexToAscii:pastedData] dataUsingEncoding:NSASCIIStringEncoding]; + + if( [sender draggingSource] == [[self delegate] hex] || [sender draggingSource] == [[self delegate] ascii] ) +// if( operation == NSDragOperationMove ) + { + NSRange deleteRange = draggedRange; + if( self == [[self delegate] hex] ) + { + deleteRange.location /= 3; + deleteRange.length += 1; + deleteRange.length /= 3; + } + + // if moving the data, remove the selection from the data + [self editData:[[[self window] windowController] data] replaceBytesInRange:deleteRange withData:[NSData data]]; + + // compensate for already removing the dragged data + if( charIndex > draggedRange.location ) + charIndex -= draggedRange.length; + } + + // insert data at insertion point + if( self == [[self delegate] hex] ) charIndex /= 3; [self editData:[[[self window] windowController] data] replaceBytesInRange:NSMakeRange(charIndex,0) withData:pastedData]; + + // set the new selection/insertion point + NSRange selection = [self rangeForUserTextChange]; + selection.location -= draggedRange.length; + selection.length = draggedRange.length; + [self setSelectedRange:selection]; + return YES; } diff --git a/Cocoa/Plug-Ins/Hex Editor/HexWindowController.m b/Cocoa/Plug-Ins/Hex Editor/HexWindowController.m index 46636b0..d2e11e9 100644 --- a/Cocoa/Plug-Ins/Hex Editor/HexWindowController.m +++ b/Cocoa/Plug-Ins/Hex Editor/HexWindowController.m @@ -2,6 +2,22 @@ #import "HexTextView.h" #import "FindSheetController.h" +/* +OSStatus Plug_InitInstance( Plug_PlugInRef plug, Plug_ResourceRef resource ) +{ + // init function called by carbon apps + if( NSApplicationLoad() ) + { + id newResource = [NSClassFromString(@"Resource") resourceOfType:[NSString stringWithCString:length:4] andID:[NSNumber numberWithInt:] withName:[NSString stringWithCString:length:] andAttributes:[NSNumber numberWithUnsignedShort:] data:[NSData dataWithBytes:length:]]; + if( !newResource ) return paramErr; + id windowController = [[HexWindowController alloc] initWithResource:newResource]; + if( !windowController ) return paramErr; + else return noErr; + } + else return paramErr; +} +*/ + @implementation HexWindowController - (id)initWithResource:(id)newResource @@ -33,14 +49,14 @@ - (id)initWithResources:(id)newResource, ... { - [undoManager release]; return nil; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; - [(id)resource release]; + [(id)resource autorelease]; + [undoManager release]; [super dealloc]; } diff --git a/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/classes.nib b/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/classes.nib new file mode 100644 index 0000000..e3749e8 --- /dev/null +++ b/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/classes.nib @@ -0,0 +1,12 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + CLASS = PictWindowController; + LANGUAGE = ObjC; + OUTLETS = {imageView = NSImageView; resource = id; }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/info.nib b/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/info.nib new file mode 100644 index 0000000..4e93136 --- /dev/null +++ b/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 445 178 356 240 0 0 1600 1002 + IBFramework Version + 286.0 + IBLockedObjects + + 8 + + IBSystem Version + 6F21 + + diff --git a/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/objects.nib b/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/objects.nib new file mode 100644 index 0000000000000000000000000000000000000000..42e2757e3334d583e6763b30fc5e9453a4f39f1e GIT binary patch literal 812 zcmZ8fF>ljA7`=uU54jj93E()D0htDTwD~Wsv zl%Z3)AYmlLFJNS1?}!+fnSk%&v`Cz#^Xd8Xd*Ao&<;&vqg!M)uVD>OHz5}fTz>aA( z4_n>m%n?VnutRbQP&BO!AyJ%_G{z(04>PbfgIrzzie;7vxHq6Pp!fIN+!0T?*YhV0 z-xGoFx-5{91j>yCRu@d`31^cUK-sh&vC)a|^;ke=aij=T>bUxwl}SDv3%l#GgCMX^ z3Ba~#WyhJKx+x@S4($QcoOc0ArnOP6y@{2Y-X?^+jiLxEE2g#KvY0@oEo>VP*mDz^ zlH`tQ9dnm?_K=O*UEdCR9rQ^`LPB~O(q~uiSjCZkAkQ7APAF1cchO+3i<9Au`gDK} zaXuyVHzAPMqhTiz7@Tu#3mtK&l!(yMe+p~<7(D~nHLc9d4jZ1hwqPOsHG`X+Ym>O< ztUEiokiHJ-myBil;3di>$=+j6aN)9E6Dx#3r z3OID39vVL`DCGM6kbDbC7)KYm_pi>*{`_2Ta + +#import "ResKnifePluginProtocol.h" +#import "ResKnifeResourceProtocol.h" + +@interface PictWindowController : NSWindowController +{ + IBOutlet NSImageView *imageView; + + id resource; +} + +@end diff --git a/Cocoa/Plug-Ins/PICT Editor/PictWindowController.m b/Cocoa/Plug-Ins/PICT Editor/PictWindowController.m new file mode 100644 index 0000000..a6f19aa --- /dev/null +++ b/Cocoa/Plug-Ins/PICT Editor/PictWindowController.m @@ -0,0 +1,77 @@ +#import "PictWindowController.h" +#import "Element.h" +#import + +@implementation PictWindowController + +- (id)initWithResource:(id)newResource +{ + self = [self initWithWindowNibName:@"PictWindow"]; + if( !self ) return nil; + + resource = [newResource retain]; + + // load the window from the nib + [self window]; + return self; +} + +- (id)initWithResources:(id)newResource, ... +{ + return nil; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [(id)resource autorelease]; + [super dealloc]; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + // set the window's title + if( ![[resource name] isEqualToString:@""] ) + { + [[self window] setTitle:[resource name]]; + SetWindowAlternateTitle( (WindowRef) [[self window] windowRef], (CFStringRef) [NSString stringWithFormat:@"%@ %@: Ò%@Ó", [resource type], [resource resID], [resource name]] ); + } + + NSImage *image = [[[NSImage alloc] initWithData:[resource data]] autorelease]; + if( image ) + { + // resize the window to the size of the image + [[self window] setContentSize:[image size]]; + + // update image view with PICT + [imageView setImage:image]; + } + + // we don't want this notification until we have a window! (Only register for notifications on the resource we're editing) + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resourceDataDidChange:) name:ResourceDataDidChangeNotification object:resource]; + + // finally, show the window + [self showWindow:self]; +} + +- (void)resourceDataDidChange:(NSNotification *)notification +{ + // ensure it's our resource which got changed (should always be true, we don't register for notifications on other resource objects) + if( [notification object] == (id)resource ) + { + // refresh image + NSImage *image = [[[NSImage alloc] initWithData:[resource data]] autorelease]; + if( image ) + { + // resize the window to the size of the image + [[self window] setContentSize:[image size]]; + + // update image view with PICT + [imageView setImage:image]; + } + } +} + +@end diff --git a/Cocoa/Plug-Ins/PICT Editor/SupportedTypes.plist b/Cocoa/Plug-Ins/PICT Editor/SupportedTypes.plist new file mode 100644 index 0000000..3858e0b --- /dev/null +++ b/Cocoa/Plug-Ins/PICT Editor/SupportedTypes.plist @@ -0,0 +1,10 @@ + + + + + SupportedTypes + + PICT + + + diff --git a/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/info.nib b/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/info.nib index 5693dad..e6318a9 100644 --- a/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/info.nib +++ b/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/info.nib @@ -23,6 +23,10 @@ 5 IBSystem Version +<<<<<<< info.nib + 6F21 +======= 6G30 +>>>>>>> 1.2 diff --git a/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/objects.nib b/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/objects.nib index 90568e522e2f811b870323bd7dfa91902a7d64ba..c3306346f40d2442c702c2cfd3eb1784edb3ff00 100644 GIT binary patch delta 736 zcmah{!E4h{9DXm&YFf%RXYt|=1;tSh(~4e(tItZThBcLmwiySobdCrsZ<4x$%-fjr*(zTfZr^5q>Z4VSam;>sDdM{2#> zS#4{z^o!@`=RAZ^vQjM@W(y)DRjRj@uBkmMB9y9BOGdkE8hU=)IwPPr+pn&aD8U%R zlm)+8a1(%db#VL;3Va6R<*Wq{EGToFuZ|z%NYv_e+5M5YdQX6i$5HSaO13BgfOe?h zFf-}cOi9)C{97bwnw@=ee8bMLX-Je=G0p?2qQ0SrJO zGM}t@4RC7|2~Bwgy&KsgJO;K10C@g^~M_6!O`d~l?>f5!OOrM!?X841_>tI+`4{Y?*k+RvHcW6g8x<;bCt*@{#RuZJB!jKzPC#~ z-#rrY^A@~ofx|d^`;vP)aq*##ArhOcSmsIDN_-FC)B;~EU^zGtrd$2~ub>HV9{^twC8?arbtm*1XCwHgUR!v6a89mV24Ws9_q;qh`b)-UnGT@DwCeN-D zUlyL;=gA=A_ac6LGUG#~hN`O@N>?T95YrSAWNiS$*<9!+Lz)hE=fnMl@Y7=WYL-M!029^&bN~PV diff --git a/Hex Editor/Classes/HexUtility.cpp b/Hex Editor/Classes/HexUtility.cpp new file mode 100644 index 0000000..145a3f7 --- /dev/null +++ b/Hex Editor/Classes/HexUtility.cpp @@ -0,0 +1,233 @@ +#include "HexUtility.h" + + /**********************/ + /* QUICKDRAW ROUTINES */ +/**********************/ + +/*** SET COLOUR ***/ +void SetColour( RGBColor *colour, UInt16 red, UInt16 green, UInt16 blue ) +{ + colour->red = red; + colour->green = green; + colour->blue = blue; +} + +/*** MAKE LOCAL ***/ +void MakeLocal( WindowRef window, Point globalPoint, Point *localPoint ) +{ + GrafPtr oldPort; + GetPort( &oldPort ); + SetPortWindowPort( window ); + + localPoint->h = globalPoint.h; + localPoint->v = globalPoint.v; + GlobalToLocal( localPoint ); + + SetPort( oldPort ); +} + +/*** MAKE GLOBAL ***/ +void MakeGlobal( WindowRef window, Point localPoint, Point *globalPoint ) +{ + GrafPtr oldPort; + GetPort( &oldPort ); + SetPortWindowPort( window ); + + globalPoint->h = localPoint.h; + globalPoint->v = localPoint.v; + LocalToGlobal( globalPoint ); + + SetPort( oldPort ); +} + + /*****************************/ + /* HEX <==> ASCII CONVERSION */ +/*****************************/ + +/*** ASCII TO TEXT ***/ +void AsciiToText( char *source, char *dest, unsigned long size ) +{ + char ascii = 0x00, text = 0x00; + unsigned long sourceOffset = 0, destOffset = 0; + while( sourceOffset < size ) + { + ascii = *(source + sourceOffset); + if( ascii < 0x20 || ascii >= 0x7F ) text = (char) 0x2E; // full stop + else if( ascii == 0x20 ) text = (char) 0xCA; // nbsp + else text = ascii; + *(dest + destOffset++) = text; + sourceOffset++; + } +} + +/*** ASCII TO HEX ***/ +void AsciiToHex( char *source, char *dest, unsigned long size ) +{ + char hex1 = 0x00, hex2 = 0x00; + unsigned long sourceOffset = 0, destOffset = 0; + while( sourceOffset < size ) + { + hex1 = *(source + sourceOffset); + hex2 = *(source + sourceOffset); + hex1 >>= 4; + hex1 &= 0x0F; + hex2 &= 0x0F; + hex1 += (hex1 < 10)? 0x30 : 0x37; + hex2 += (hex2 < 10)? 0x30 : 0x37; + + *(dest + destOffset++) = hex1; + *(dest + destOffset++) = hex2; + *(dest + destOffset++) = 0x20; + sourceOffset++; + } +} + +/*** HEX TO ASCII ***/ +void HexToAscii( char *source, char *dest, unsigned long size ) +{ + char currentByte = 0x00, newByte = 0x00, tempByte = 0x00; + unsigned long sourceOffset = 0, destOffset = 0; + while( sourceOffset < size ) + { + currentByte = *(source + sourceOffset); + if( currentByte >= 0x30 && currentByte <= 0x39 ) newByte = currentByte - 0x30; // 0 to 9 + else if( currentByte >= 0x41 && currentByte <= 0x46 ) newByte = currentByte - 0x37; // A to F + else if( currentByte >= 0x61 && currentByte <= 0x66 ) newByte = currentByte - 0x57; // a to f + else newByte = 0x00; + newByte <<= 4; + currentByte = *(source + sourceOffset +1); + if( currentByte >= 0x30 && currentByte <= 0x39 ) tempByte = currentByte - 0x30; // 0 to 9 + else if( currentByte >= 0x41 && currentByte <= 0x46 ) tempByte = currentByte - 0x37; // A to F + else if( currentByte >= 0x61 && currentByte <= 0x66 ) tempByte = currentByte - 0x57; // a to f + else tempByte = 0x00; + newByte += tempByte & 0x0F; + *(dest + destOffset++) = newByte; + sourceOffset += 3; + } +} + +/*** LONG TO HEX ***/ +void LongToHex( char *source, char *dest ) +{ + // copy of AsciiToHex but with changes as noted + char hex1 = 0x00, hex2 = 0x00; + unsigned long sourceOffset = 0, destOffset = 0; + while( sourceOffset < sizeof(unsigned long) ) // size is always four + { + hex1 = *(source + sourceOffset); + hex2 = *(source + sourceOffset); + hex1 >>= 4; + hex1 &= 0x0F; + hex2 &= 0x0F; + hex1 += (hex1 < 10)? 0x30 : 0x37; + hex2 += (hex2 < 10)? 0x30 : 0x37; + + *(dest + destOffset++) = hex1; + *(dest + destOffset++) = hex2; // no space inserted + sourceOffset++; + } +} + + /*******************/ + /* STRING ROUTINES */ +/*******************/ + +/*** C STRING LENGTH ***/ +unsigned long CStringLength( char *string ) +{ + unsigned long length; + Boolean end = false; + for( length = 0; end == false; length++ ) + if( *(string + length) == 0x00 ) end = true; + return length; +} + +/*** PASCAL STRING LENGTH ***/ +unsigned char PStringLength( unsigned char *string ) +{ + return *string; +} + +/*** TYPE TO C STRING ***/ +void TypeToCString( const OSType type, char *string ) +{ + BlockMoveData( &type, &string[0], sizeof(OSType) ); + string[sizeof(OSType)] = 0x00; +} + +/*** TYPE TO PASCAL STRING ***/ +void TypeToPString( const OSType type, Str255 string ) +{ + string[0] = sizeof(OSType); + BlockMoveData( &type, &string[1], sizeof(OSType) ); +} + +/*** TYPE TO CORE FOUNDATION STRING ***/ +void TypeToCFString( const OSType type, CFStringRef *string ) +{ + char cString[5]; + TypeToCString( type, (char *) &cString ); + *string = CFStringCreateWithCString( CFAllocatorGetDefault(), (char *) &cString, kCFStringEncodingMacRoman ); +} + +/*** COPY C STRING ***/ +void CopyCString( UInt8 *source, UInt8 *dest ) +{ +// #pragma warning off + while( *dest++ = *source++ ); +// #pragma warning reset +} + +/*** COPY PASCAL STRING ***/ +void CopyPString( UInt8 *source, UInt8 *dest ) +{ + UInt8 length = *source, count; + for( count = 0; count <= length; count++ ) + *dest++ = *source++; +} + +/*** EQUAL C STRINGS ***/ +Boolean EqualCStrings( UInt8 *source, UInt8 *dest ) +{ + while( *source != 0x00 ) + if( *source++ != *dest++ ) return false; + return true; +} + +/*** EQUAL PASCAL STRINGS ***/ +Boolean EqualPStrings( UInt8 *source, UInt8 *dest ) +{ + UInt8 length = *source, count; + for( count = 0; count <= length; count++ ) + if( *source++ != *dest++ ) return false; + return true; +} + +/*** APPEND ONE PASCAL STRING ONTO ANOTHER ***/ +void AppendPString( Str255 original, ConstStr255Param added ) +{ + short numberBytes = added[0]; // length of string to be added + short totalLength = added[0] + original[0]; + + if( totalLength > 255 ) // too long, adjust number of bytes to add + { + totalLength = 255; + numberBytes = totalLength - original[0]; + } + + BlockMoveData( &added[1], &original[totalLength-numberBytes + 1], numberBytes ); + original[0] = totalLength; // new length of original string + while( ++totalLength <= 255 ) + original[totalLength] = 0x00; // set rest of string to zero +} + + /*****************/ + /* MENU ROUTINES */ +/*****************/ + +/*** ENABLE MENU COMMAND ***/ +void EnableCommand( MenuRef menu, MenuCommand command, Boolean enable ) +{ + if( enable ) EnableMenuCommand( menu, command ); + else DisableMenuCommand( menu, command ); +} diff --git a/Hex Editor/Classes/HexUtility.h b/Hex Editor/Classes/HexUtility.h new file mode 100644 index 0000000..18dbaa1 --- /dev/null +++ b/Hex Editor/Classes/HexUtility.h @@ -0,0 +1,31 @@ +#include "Hex Editor.h" + +#ifndef _ResKnife_HexEditor_Utility_ +#define _ResKnife_HexEditor_Utility_ + +/* QuickDraw Routines */ +void SetColour( RGBColor *colour, UInt16 red, UInt16 green, UInt16 blue ); +void MakeLocal( WindowRef window, Point globalPoint, Point *localPoint ); +void MakeGlobal( WindowRef window, Point localPoint, Point *globalPoint ); + +/* ASCII <=> hex */ +void AsciiToText( char *source, char *dest, unsigned long size ); +void AsciiToHex( char *source, char *dest, unsigned long size ); +void HexToAscii( char *source, char *dest, unsigned long size ); +void LongToHex( char *source, char *dest ); + +/* strings */ +unsigned long CStringLength( char *string ); +unsigned char PStringLength( unsigned char *string ); +void TypeToCString( const OSType type, char *string ); +void TypeToPString( const OSType type, Str255 string ); +void TypeToCFString( const OSType type, CFStringRef *string ); +void CopyCString( UInt8 *source, UInt8 *dest ); +void CopyPString( UInt8 *source, UInt8 *dest ); +Boolean EqualCStrings( UInt8 *source, UInt8 *dest ); +Boolean EqualPStrings( UInt8 *source, UInt8 *dest ); +void AppendPString( Str255 original, ConstStr255Param added ); + +void EnableCommand( MenuRef menu, MenuCommand command, Boolean enable ); + +#endif \ No newline at end of file diff --git a/HexEditor.graffle b/HexEditor.graffle new file mode 100644 index 0000000..7b59199 --- /dev/null +++ b/HexEditor.graffle @@ -0,0 +1,1065 @@ + + + + + CanvasColor + + w + 1.000000e+00 + + ColumnAlign + 0 + ColumnSpacing + 3.600000e+01 + GraphDocumentVersion + 2 + GraphicsList + + + Class + LineGraphic + Head + + ID + 31 + + ID + 33 + Points + + {319.5, 504} + {279, 558} + + Style + + stroke + + HeadArrow + 0 + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 26 + + + + Class + LineGraphic + Head + + ID + 31 + + ID + 32 + Points + + {276.3, 504} + {279, 558} + + Style + + stroke + + HeadArrow + 0 + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 25 + + + + Class + LineGraphic + Head + + ID + 22 + + ID + 31 + Points + + {279, 558} + {432, 540} + {428.227, 373.977} + + Style + + stroke + + HeadArrow + Arrow + LineType + 1 + TailArrow + 0 + + + + + Class + LineGraphic + Head + + ID + 31 + + ID + 30 + Points + + {233.1, 504} + {279, 558} + + Style + + stroke + + HeadArrow + 0 + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 24 + + + + Class + LineGraphic + Head + + ID + 11 + + ID + 29 + Points + + {321.577, 432} + {284.192, 378} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 26 + + + + Class + LineGraphic + Head + + ID + 11 + + ID + 28 + Points + + {271.731, 432} + {267.577, 378} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 25 + + + + Class + LineGraphic + Head + + ID + 24 + + ID + 27 + Points + + {250.962, 378} + {221.885, 432} + + Style + + stroke + + HeadArrow + 0 + LineType + 1 + TailArrow + FilledArrow + + + Tail + + ID + 11 + + + + Bounds + {{315, 432}, {63, 72}} + Class + ShapedGraphic + ID + 26 + Shape + HorizontalBrackets + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Hex Text View (ASCII)} + + + + Bounds + {{243, 432}, {63, 72}} + Class + ShapedGraphic + ID + 25 + Shape + HorizontalBrackets + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Hex Text View (Hex)} + + + + Bounds + {{171, 432}, {63, 72}} + Class + ShapedGraphic + ID + 24 + Shape + HorizontalBrackets + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Hex Text View (Offset)} + + + + Class + LineGraphic + Head + + ID + 22 + + ID + 23 + Points + + {297.807, 236.054} + {394.189, 314.789} + + Style + + stroke + + HeadArrow + Arrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 9 + + + + Bounds + {{369, 306}, {117, 72}} + Class + ShapedGraphic + ID + 22 + Shape + Cloud + Style + + fill + + Color + + b + 1.000000e+00 + g + 8.490366e-01 + r + 9.965038e-01 + + + + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 HexEditor Delegate} + + + + Class + LineGraphic + Head + + ID + 11 + + ID + 21 + Points + + {144, 348.527} + {207, 349.809} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 17 + + + + Class + LineGraphic + Head + + ID + 17 + + ID + 20 + Points + + {100.788, 239.348} + {99.8262, 297} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + Arrow + + + Tail + + ID + 18 + + + + Class + LineGraphic + Head + + ID + 18 + + ID + 19 + Points + + {218.607, 211.5} + {146.807, 211.5} + + Style + + stroke + + HeadArrow + 0 + LineType + 1 + TailArrow + Arrow + + + Tail + + ID + 9 + + + + Bounds + {{40.5, 180}, {121.5, 63}} + Class + ShapedGraphic + ID + 18 + Shape + Cloud + Style + + fill + + Color + + b + 1.000000e+00 + g + 9.653430e-01 + r + 7.682484e-01 + + + + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Find Sheet Controller} + + + + Class + Group + Graphics + + + Bounds + {{99, 378}, {37, 12}} + Class + ShapedGraphic + ID + 16 + Shape + RoundRect + Style + + fill + + Color + + b + 1.000000e+00 + g + 7.482798e-01 + r + 4.663317e-01 + + + shadow + + Color + + a + 5.000000e-01 + b + 7.500000e-01 + g + 7.500000e-01 + r + 7.500000e-01 + + + stroke + + Draws + NO + + + + + Bounds + {{54, 297}, {90, 99}} + Class + ShapedGraphic + ID + 17 + Shape + Rectangle + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Find\ +Sheet} + + + + ID + 15 + + + Class + LineGraphic + Head + + ID + 12 + + ID + 14 + Points + + {267.14, 239.328} + {265.695, 306} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + Arrow + + + Tail + + ID + 9 + + + + Class + LineGraphic + Head + + ID + 9 + + ID + 13 + Points + + {266.062, 117} + {267.252, 183.589} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + FilledArrow + + + Tail + + ID + 7 + + + + Class + Group + Graphics + + + Bounds + {{207, 324}, {117, 54}} + Class + ShapedGraphic + ID + 11 + Shape + Rectangle + + + Bounds + {{207, 306}, {117, 18}} + Class + ShapedGraphic + ID + 12 + Shape + Rectangle + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 HexWindow} + + + + ID + 10 + + + Bounds + {{207, 180}, {121.5, 63}} + Class + ShapedGraphic + ID + 9 + Shape + Cloud + Style + + fill + + Color + + b + 1.000000e+00 + g + 9.653430e-01 + r + 7.682484e-01 + + + + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Hex Window Controller} + + + + Class + Group + Graphics + + + Bounds + {{225, 63}, {81, 45}} + Class + ShapedGraphic + ID + 6 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + DocumentShape + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs20 \cf0 Document} + + + + Bounds + {{198, 54}, {135, 63}} + Class + ShapedGraphic + ID + 7 + Shape + Rectangle + Style + + stroke + + Color + + b + 0.000000e+00 + g + 0.000000e+00 + r + 0.000000e+00 + + Width + 2.000000e+00 + + + + + Bounds + {{198, 36}, {135, 18}} + Class + ShapedGraphic + ID + 8 + Shape + Rectangle + Style + + shadow + + Color + + a + 5.000000e-01 + w + 3.333334e-01 + + + stroke + + Color + + b + 0.000000e+00 + g + 0.000000e+00 + r + 0.000000e+00 + + Width + 2.000000e+00 + + + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 ResourceDocument} + + + + ID + 5 + + + GridInfo + + ShowsGrid + NO + + HPages + 1 + ImageCounter + 1 + IsPalette + NO + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + AutoAdjust + YES + MagneticFieldCenter + {0, 0} + + MagnetsEnabled + YES + PageBreakColor + + w + 6.666667e-01 + + PageBreaks + YES + PageSetup + + BAt0eXBlZHN0cmVhbYED6IQBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVjdACFkoSE + hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpF5KEhIQITlNT + dHJpbmcBlIQBKw9OU1BhZ2VzUGVyU2hlZXSGkoSEhAhOU051bWJlcgCEhAdOU1ZhbHVl + AJSEASqEhAFznQGGkoSZmQ5OU0JvdHRvbU1hcmdpboaShJuchIQBZp4khpKEmZkPTlNQ + cmludEFsbFBhZ2VzhpKEm5ydnQCGkoSZmQ1OU0pvYkZlYXR1cmVzhpKElpcAhpKEmZkV + TlNIb3Jpem9uYWxQYWdpbmF0aW9uhpKEm5ydnQCGkoSZmRROU1ZlcnRpY2FsbHlDZW50 + ZXJlZIaShJucnZ0BhpKEmZkJTlNQcmludGVyhpKEhIQJTlNQcmludGVyAJSShJmZASCG + hpKEmZkPTlNTY2FsaW5nRmFjdG9yhpKEm5ygngGGkoSZmRJOU1JldmVyc2VQYWdlT3Jk + ZXKGkqKShJmZDE5TTGVmdE1hcmdpboaShJucoJ4khpKEmZkOTlNQTVBhZ2VGb3JtYXSG + koSEhAZOU0RhdGEAlJeBHyCEB1s3OTY4Y108P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29k + aW5nPSJVVEYtOCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21w + dXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERz + L1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0 + PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUhvcml6b250YWxSZXM8 + L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9y + PC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ + CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxh + cnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0 + LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJCQkJPHJlYWw+Ny4yMDAwMDAwMDAwMDAwMDBl + KzAxPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwv + a2V5PgoJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ + CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJ + PGRhdGU+MjAwMi0xMS0xN1QwMDoxNjowOVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBs + ZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRl + Z2VyPgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxl + LnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5PgoJPGRpY3Q+CgkJPGtl + eT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNv + bS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5w + cmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJ + CTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5 + PgoJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50 + LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5n + bWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1v + ZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDItMTEtMTdUMDA6MTY6MDlaPC9kYXRlPgoJ + CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJ + PGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+ + Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJ + PGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4K + CQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5 + PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJ + CQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2Fs + aW5nPC9rZXk+CgkJCQk8cmVhbD4xLjAwMDAwMDAwMDAwMDAwMGUrMDA8L3JlYWw+CgkJ + CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3Ry + aW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29t + LmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDAyLTEx + LTE3VDAwOjE2OjA5WjwvZGF0ZT4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl + dC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGlj + dD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZv + cm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5w + cmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50 + aW5nbWFuYWdlcjwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5p + dGVtQXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBw + bGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+CgkJCQk8cmVhbD43 + LjIwMDAwMDAwMDAwMDAwMGUrMDE8L3JlYWw+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmlu + dC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGlu + Z21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5t + b2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDAyLTExLTE3VDAwOjE2OjA5WjwvZGF0ZT4K + CQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJ + CTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0 + PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGlu + Zzwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0 + b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmlu + Zz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJ + PGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3Jt + YXQuUE1WZXJ0aWNhbFNjYWxpbmc8L2tleT4KCQkJCTxyZWFsPjEuMDAwMDAwMDAwMDAw + MDAwZSswMDwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGll + bnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3Ry + aW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4K + CQkJCTxkYXRlPjIwMDItMTEtMTdUMDA6MTY6MDlaPC9kYXRlPgoJCQkJPGtleT5jb20u + YXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwv + aW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5h + cHBsZS5wcmludC5zdWJUaWNrZXQucGFwZXJfaW5mb190aWNrZXQ8L2tleT4KCTxkaWN0 + PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhZ2VS + ZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5j + cmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwv + c3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9r + ZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50 + LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhZ2VSZWN0PC9rZXk+CgkJCQkJPGFycmF5PgoJ + CQkJCQk8cmVhbD4wLjAwMDAwMDAwMDAwMDAwMGUrMDA8L3JlYWw+CgkJCQkJCTxyZWFs + PjAuMDAwMDAwMDAwMDAwMDAwZSswMDwvcmVhbD4KCQkJCQkJPHJlYWw+Ny44MzAwMDAw + MDAwMDAwMDBlKzAyPC9yZWFsPgoJCQkJCQk8cmVhbD41LjU5MDAwMDAwMDAwMDAwMGUr + MDI8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50 + aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdt + YW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1v + ZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAyLTExLTE3VDAwOjE2OjA5WjwvZGF0ZT4K + CQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJ + CQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8 + L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVk + UGFwZXJSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp + Y2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFu + YWdlcjwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFy + cmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxl + LnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxh + cnJheT4KCQkJCQkJPHJlYWw+LTEuODAwMDAwMDAwMDAwMDAwZSswMTwvcmVhbD4KCQkJ + CQkJPHJlYWw+LTEuODAwMDAwMDAwMDAwMDAwZSswMTwvcmVhbD4KCQkJCQkJPHJlYWw+ + OC4yNDAwMDAwMDAwMDAwMDBlKzAyPC9yZWFsPgoJCQkJCQk8cmVhbD41Ljc3MDAwMDAw + MDAwMDAwMGUrMDI8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBs + ZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUu + cHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu + dGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAyLTExLTE3VDAwOjE2OjA5 + WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFn + PC9rZXk+CgkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9h + cnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBN + UGFwZXJOYW1lPC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp + Y2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LnBtLlBv + c3RTY3JpcHQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0 + ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5h + cHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5n + Pmlzby1hNDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5j + bGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludC5wbS5Qb3N0U2Ny + aXB0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERh + dGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAwLTA3LTI4VDIyOjU3OjA0WjwvZGF0ZT4KCQkJ + CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQkJ + PGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2Rp + Y3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBh + Z2VSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl + dC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LnBtLlBvc3RT + Y3JpcHQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1B + cnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBs + ZS5wcmludC5QYXBlckluZm8uUE1VbmFkanVzdGVkUGFnZVJlY3Q8L2tleT4KCQkJCQk8 + YXJyYXk+CgkJCQkJCTxyZWFsPjAuMDAwMDAwMDAwMDAwMDAwZSswMDwvcmVhbD4KCQkJ + CQkJPHJlYWw+MC4wMDAwMDAwMDAwMDAwMDBlKzAwPC9yZWFsPgoJCQkJCQk8cmVhbD43 + LjgzMDAwMDAwMDAwMDAwMGUrMDI8L3JlYWw+CgkJCQkJCTxyZWFsPjUuNTkwMDAwMDAw + MDAwMDAwZSswMjwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxl + LnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5w + cmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJp + bnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAwLTA3LTI4VDIyOjU3 + OjA0WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVG + bGFnPC9rZXk+CgkJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJ + PC9hcnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZv + LlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5h + cHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBs + ZS5wcmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFwcGxlLnBy + aW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJ + CQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVy + UmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw+LTEuODAwMDAwMDAwMDAw + MDAwZSswMTwvcmVhbD4KCQkJCQkJPHJlYWw+LTEuODAwMDAwMDAwMDAwMDAwZSswMTwv + cmVhbD4KCQkJCQkJPHJlYWw+OC4yNDAwMDAwMDAwMDAwMDBlKzAyPC9yZWFsPgoJCQkJ + CQk8cmVhbD41Ljc3MDAwMDAwMDAwMDAwMGUrMDI8L3JlYWw+CgkJCQkJPC9hcnJheT4K + CQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJ + PHN0cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQkJ + CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRh + dGU+MjAwMC0wNy0yOFQyMjo1NzowNFo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUu + cHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjE8L2ludGVn + ZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFw + cGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4K + CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0 + cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQk8a2V5 + PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4K + CQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQu + UE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPkE0PC9zdHJpbmc+CgkJCQkJPGtl + eT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJpbmc+ + Y29tLmFwcGxlLnByaW50LnBtLlBvc3RTY3JpcHQ8L3N0cmluZz4KCQkJCQk8a2V5PmNv + bS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDAt + MDctMjhUMjI6NTc6MDRaPC9kYXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp + Y2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJ + PC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmlu + dC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJCTxzdHJpbmc+MDAuMjA8L3N0cmluZz4K + CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQucHJpdmF0ZUxvY2s8L2tleT4KCQk8 + ZmFsc2UvPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk+CgkJ + PHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc+Cgk8 + L2RpY3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5 + PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlj + a2V0LnByaXZhdGVMb2NrPC9rZXk+Cgk8ZmFsc2UvPgoJPGtleT5jb20uYXBwbGUucHJp + bnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LlBhZ2VG + b3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0PgqGkoSZmRZOU0hvcml6 + b250YWxseUNlbnRlcmVkhpKokoSZmQ1OU1JpZ2h0TWFyZ2luhpKEm5ygniSGkoSZmRBO + U0pvYkRpc3Bvc2l0aW9uhpKEmZkPTlNQcmludFNwb29sSm9ihpKEmZkITlNDb3BpZXOG + koSbnISEAVOiAYaShJmZC05TUGFwZXJOYW1lhpKEmZkGaXNvLWE0hpKEmZkLTlNGaXJz + dFBhZ2WGkoSbnLyiAYaShJmZFE5TVmVydGljYWxQYWdpbmF0aW9uhpKEm5ydnQCGkoSZ + mQ1OU09yaWVudGF0aW9uhpKEm5ydnQCGkoSZmRlOU1ByaW50UmV2ZXJzZU9yaWVudGF0 + aW9uhpKikoSZmQpOU0xhc3RQYWdlhpKEm5yEl5eCf////4aShJmZC05TVG9wTWFyZ2lu + hpKEm5ygniSGkoSZmQtOU1BhcGVyU2l6ZYaShJychIQMe19OU1NpemU9ZmZ9o4ECU4ED + SoaGhg== + + RowAlign + 0 + RowSpacing + 3.600000e+01 + VPages + 1 + WindowInfo + + Frame + {{1998, 271}, {559, 717}} + VisibleRegion + {{-10, 0}, {544, 640}} + Zoom + 1 + + + diff --git a/ResKnife Cocoa.graffle b/ResKnife Cocoa.graffle index b254b1f..10c98aa 100644 --- a/ResKnife Cocoa.graffle +++ b/ResKnife Cocoa.graffle @@ -1,6 +1,6 @@ - - + + CanvasColor @@ -28,6 +28,119 @@ FitText Vertical ID + 55 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 Is dependent on} + + + + Class + LineGraphic + Head + + ID + 57 + + ID + 56 + Points + + {47, 620.832} + {72, 620.952} + + Style + + stroke + + HeadArrow + Ball + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 58 + + + + Bounds + {{72, 612}, {20, 18}} + Class + ShapedGraphic + FitText + YES + ID + 57 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\fs24 \cf0 B} + + + + Bounds + {{27, 612}, {20, 18}} + Class + ShapedGraphic + FitText + YES + ID 58 Shape Rectangle @@ -52,56 +165,23 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc -\f0\fs24 \cf0 Is dependent on} - - - - Class - LineGraphic - Head - - ID - 60 - - ID - 59 - Points - - {47, 621} - {72, 621} - - Style - - stroke - - HeadArrow - Ball - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 61 +\f0\fs24 \cf0 A} Bounds - {{72, 612}, {20, 18}} + {{99, 594}, {99, 18}} Class ShapedGraphic FitText - YES + Vertical ID - 60 + 59 Shape Rectangle Style @@ -125,17 +205,50 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc -\f0\fs24 \cf0 B} +\f0\fs24 \cf0 Reads data from} + + + + Class + LineGraphic + Head + + ID + 61 + + ID + 60 + Points + + {47, 602.832} + {72, 602.952} + + Style + + stroke + + HeadArrow + Arrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 62 Bounds - {{27, 612}, {20, 18}} + {{72, 594}, {20, 18}} Class ShapedGraphic FitText @@ -165,21 +278,21 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc -\f0\fs24 \cf0 A} +\f0\fs24 \cf0 B} Bounds - {{99, 594}, {99, 18}} + {{27, 594}, {20, 18}} Class ShapedGraphic FitText - Vertical + YES ID 62 Shape @@ -205,56 +318,23 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc -\f0\fs24 \cf0 Reads data from} - - - - Class - LineGraphic - Head - - ID - 64 - - ID - 63 - Points - - {47, 603} - {72, 603} - - Style - - stroke - - HeadArrow - Arrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 65 +\f0\fs24 \cf0 A} Bounds - {{72, 594}, {20, 18}} + {{99, 576}, {99, 18}} Class ShapedGraphic FitText - YES + Vertical ID - 64 + 63 Shape Rectangle Style @@ -278,17 +358,50 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc -\f0\fs24 \cf0 B} +\f0\fs24 \cf0 Sends data to} + + + + Class + LineGraphic + Head + + ID + 65 + + ID + 64 + Points + + {47, 584.832} + {72, 584.952} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + 0 + + + Tail + + ID + 66 Bounds - {{27, 594}, {20, 18}} + {{72, 576}, {20, 18}} Class ShapedGraphic FitText @@ -318,21 +431,21 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc -\f0\fs24 \cf0 A} +\f0\fs24 \cf0 B} Bounds - {{99, 576}, {99, 18}} + {{27, 576}, {20, 18}} Class ShapedGraphic FitText - Vertical + YES ID 66 Shape @@ -358,120 +471,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 -{\fonttbl\f0\fswiss\fcharset77 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc - -\f0\fs24 \cf0 Sends data to} - - - - Class - LineGraphic - Head - - ID - 68 - - ID - 67 - Points - - {47, 585} - {72, 585} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - 0 - - - Tail - - ID - 69 - - - - Bounds - {{72, 576}, {20, 18}} - Class - ShapedGraphic - FitText - YES - ID - 68 - Shape - Rectangle - Style - - fill - - Draws - NO - - shadow - - Draws - NO - - stroke - - Draws - NO - - - Text - - Text - {\rtf1\mac\ansicpg10000\cocoartf100 -{\fonttbl\f0\fswiss\fcharset77 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc - -\f0\fs24 \cf0 B} - - - - Bounds - {{27, 576}, {20, 18}} - Class - ShapedGraphic - FitText - YES - ID - 69 - Shape - Rectangle - Style - - fill - - Draws - NO - - shadow - - Draws - NO - - stroke - - Draws - NO - - - Text - - Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -485,7 +485,7 @@ Class ShapedGraphic ID - 70 + 67 Shape Rectangle @@ -495,13 +495,13 @@ Class ShapedGraphic ID - 71 + 68 Shape Rectangle Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -511,88 +511,22 @@ ID - 57 - - - Class - LineGraphic - Head - - ID - 53 - - ID - 56 - Points - - {263.375, 333} - {300.004, 434.435} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - Arrow - - - Tail - - ID - 46 - - - - Class - LineGraphic - Head - - ID - 51 - - ID - 55 - Points - - {251.284, 333} - {248.216, 468} - - Style - - stroke - - HeadArrow - FilledArrow - LineType - 1 - TailArrow - Arrow - - - Tail - - ID - 46 - - - - Class - LineGraphic - Head - - ID - 52 - - ID 54 + + + Class + LineGraphic + Head + + ID + 50 + + ID + 53 Points - {238.875, 333} - {194.996, 438.31} + {263.372, 333} + {300.004, 434.436} Style @@ -603,13 +537,79 @@ LineType 1 TailArrow - Arrow + FilledArrow Tail ID - 46 + 43 + + + + Class + LineGraphic + Head + + ID + 48 + + ID + 52 + Points + + {251.282, 333} + {248.215, 468} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + FilledArrow + + + Tail + + ID + 43 + + + + Class + LineGraphic + Head + + ID + 49 + + ID + 51 + Points + + {238.864, 333} + {194.996, 438.305} + + Style + + stroke + + HeadArrow + FilledArrow + LineType + 1 + TailArrow + FilledArrow + + + Tail + + ID + 43 @@ -618,7 +618,7 @@ Class ShapedGraphic ID - 53 + 50 Shape Cross Style @@ -639,7 +639,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -653,7 +653,7 @@ Class ShapedGraphic ID - 52 + 49 Shape Cross Style @@ -674,7 +674,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -688,7 +688,7 @@ Class ShapedGraphic ID - 51 + 48 Shape Cross Style @@ -709,7 +709,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -723,13 +723,13 @@ Head ID - 49 + 46 ID - 50 + 47 Points - {85.6875, 279} + {85.7143, 279} {86, 243} Style @@ -747,7 +747,7 @@ Tail ID - 27 + 24 @@ -756,7 +756,7 @@ Class ShapedGraphic ID - 49 + 46 Magnets {0, 1} @@ -769,7 +769,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -783,14 +783,14 @@ Head ID - 27 + 24 ID - 48 + 45 Points - {82.8333, 378} - {84.5, 333} + {82.2739, 378} + {84.2902, 333} Style @@ -807,7 +807,7 @@ Tail ID - 39 + 36 @@ -821,7 +821,7 @@ Class ShapedGraphic ID - 45 + 42 Magnets {0, 1} @@ -834,7 +834,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -848,21 +848,11 @@ Class ShapedGraphic ID - 46 + 43 Shape Rectangle Style - fill - - Color - - catalog - System - name - windowBackgroundColor - - stroke Color @@ -885,21 +875,11 @@ Class ShapedGraphic ID - 47 + 44 Shape Rectangle Style - fill - - Color - - catalog - System - name - windowBackgroundColor - - shadow Color @@ -928,7 +908,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -938,7 +918,7 @@ ID - 44 + 41 Class @@ -946,14 +926,14 @@ Head ID - 41 + 38 ID - 43 + 40 Points - {241.5, 270} - {212.281, 182.344} + {241.337, 270} + {212.259, 182.351} Style @@ -970,7 +950,7 @@ Tail ID - 46 + 43 @@ -979,10 +959,10 @@ Head ID - 41 + 38 ID - 42 + 39 Points {125.988, 81.2361} @@ -1004,7 +984,7 @@ Tail ID - 29 + 26 @@ -1013,13 +993,13 @@ Class ShapedGraphic ID - 41 + 38 Shape DocumentShape Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1033,14 +1013,14 @@ Head ID - 39 + 36 ID - 40 + 37 Points - {209.25, 333} - {126, 394.342} + {204.56, 333} + {126, 393.084} Style @@ -1057,7 +1037,7 @@ Tail ID - 46 + 43 @@ -1071,7 +1051,7 @@ Class ShapedGraphic ID - 38 + 35 Shape RoundRect Style @@ -1115,26 +1095,13 @@ Class ShapedGraphic ID - 39 + 36 Shape Rectangle - Style - - fill - - Color - - catalog - System - name - windowBackgroundColor - - - Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1144,7 +1111,7 @@ ID - 37 + 34 Class @@ -1152,21 +1119,21 @@ Head ID - 46 + 32 ID - 36 + 33 Points - {393.275, 413.796} - {291.629, 333} + {291.635, 333} + {393.277, 413.796} Style stroke HeadArrow - FilledArrow + Arrow LineType 1 TailArrow @@ -1176,7 +1143,7 @@ Tail ID - 35 + 43 @@ -1185,7 +1152,7 @@ Class ShapedGraphic ID - 35 + 32 Shape Cloud Style @@ -1206,7 +1173,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1220,14 +1187,14 @@ Head ID - 32 + 29 ID - 34 + 31 Points - {88.5731, 86.4848} - {89.7353, 126} + {88.3928, 86.4688} + {89.702, 126} Style @@ -1244,7 +1211,7 @@ Tail ID - 29 + 26 @@ -1253,14 +1220,14 @@ Head ID - 29 + 26 ID - 33 + 30 Points - {211.126, 61.8005} - {134.194, 59.7424} + {210.757, 61.0796} + {134.014, 59.4702} Style @@ -1277,7 +1244,7 @@ Tail ID - 12 + 9 @@ -1291,22 +1258,9 @@ Class ShapedGraphic ID - 31 + 28 Shape Rectangle - Style - - fill - - Color - - catalog - System - name - windowBackgroundColor - - - Bounds @@ -1314,26 +1268,13 @@ Class ShapedGraphic ID - 32 + 29 Shape Rectangle - Style - - fill - - Color - - catalog - System - name - windowBackgroundColor - - - Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1343,7 +1284,7 @@ ID - 30 + 27 Bounds @@ -1351,7 +1292,7 @@ Class ShapedGraphic ID - 29 + 26 Shape Cloud Style @@ -1372,7 +1313,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1386,14 +1327,14 @@ Head ID - 27 + 24 ID - 28 + 25 Points - {184.5, 303.324} - {130.5, 304.784} + {184.5, 300.66} + {130.5, 303.573} Style @@ -1410,7 +1351,7 @@ Tail ID - 46 + 43 @@ -1419,13 +1360,13 @@ Class ShapedGraphic ID - 27 + 24 Shape RoundedRectangle Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1439,10 +1380,10 @@ Head ID - 47 + 44 ID - 26 + 23 Points {387.675, 84.2599} @@ -1464,7 +1405,7 @@ Tail ID - 20 + 17 @@ -1473,14 +1414,14 @@ Head ID - 23 + 20 ID - 25 + 22 Points - {430.573, 86.485} - {431.735, 126} + {429.824, 86.4116} + {431.597, 126} Style @@ -1497,7 +1438,7 @@ Tail ID - 20 + 17 @@ -1506,14 +1447,14 @@ Head ID - 20 + 17 ID - 24 + 21 Points - {296.323, 61.955} - {382.181, 59.7318} + {296.151, 61.6421} + {382.017, 59.6226} Style @@ -1530,7 +1471,7 @@ Tail ID - 12 + 9 @@ -1544,22 +1485,9 @@ Class ShapedGraphic ID - 22 + 19 Shape Rectangle - Style - - fill - - Color - - catalog - System - name - windowBackgroundColor - - - Bounds @@ -1567,26 +1495,13 @@ Class ShapedGraphic ID - 23 + 20 Shape Rectangle - Style - - fill - - Color - - catalog - System - name - windowBackgroundColor - - - Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1596,7 +1511,7 @@ ID - 21 + 18 Bounds @@ -1604,7 +1519,7 @@ Class ShapedGraphic ID - 20 + 17 Shape Cloud Style @@ -1625,7 +1540,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1639,14 +1554,14 @@ Head ID - 16 + 13 ID - 19 + 16 Points - {319.5, 284.625} - {411.394, 261.651} + {319.5, 283.301} + {411.245, 261.295} Style @@ -1663,7 +1578,7 @@ Tail ID - 46 + 43 @@ -1672,14 +1587,14 @@ Head ID - 15 + 12 ID - 18 + 15 Points - {319.5, 303.034} - {409.516, 305.08} + {319.5, 302.128} + {409.527, 304.799} Style @@ -1696,7 +1611,7 @@ Tail ID - 46 + 43 @@ -1705,14 +1620,14 @@ Head ID - 14 + 11 ID - 17 + 14 Points - {319.5, 321.443} - {412.134, 348.812} + {319.5, 320.92} + {412.204, 348.682} Style @@ -1729,7 +1644,7 @@ Tail ID - 46 + 43 @@ -1738,7 +1653,7 @@ Class ShapedGraphic ID - 16 + 13 Shape RoundRect Style @@ -1759,7 +1674,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1773,7 +1688,7 @@ Class ShapedGraphic ID - 15 + 12 Shape RoundRect Style @@ -1794,7 +1709,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1808,7 +1723,7 @@ Class ShapedGraphic ID - 14 + 11 Shape RoundRect Style @@ -1829,7 +1744,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1843,14 +1758,14 @@ Head ID - 47 + 44 ID - 13 + 10 Points - {255.171, 102.703} - {252.18, 252} + {255.149, 102.698} + {252.179, 252} Style @@ -1867,7 +1782,7 @@ Tail ID - 12 + 9 @@ -1876,7 +1791,7 @@ Class ShapedGraphic ID - 12 + 9 Shape Cloud Style @@ -1897,7 +1812,7 @@ Text Text - {\rtf1\mac\ansicpg10000\cocoartf100 + {\rtf1\mac\ansicpg10000\cocoartf102 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc @@ -1964,21 +1879,179 @@ PageSetup BAt0eXBlZHN0cmVhbYED6IQBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVjdACFkoSE - hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpFZKEhIQITlNT + hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpF5KEhIQITlNT dHJpbmcBlIQBKw9OU1BhZ2VzUGVyU2hlZXSGkoSEhAhOU051bWJlcgCEhAdOU1ZhbHVl - AJSEASqEhAFznQGGkoSZmRBOU0pvYkRpc3Bvc2l0aW9uhpKEmZkPTlNQcmludFNwb29s - Sm9ihpKEmZkOTlNCb3R0b21NYXJnaW6GkoSbnISEAWaeJIaShJmZC05TUGFwZXJOYW1l - hpKEmZkCQTSGkoSZmQ9OU1ByaW50QWxsUGFnZXOGkoSbnJ2dAIaShJmZDU5TSm9iRmVh - dHVyZXOGkoSWlwCGkoSZmRVOU0hvcml6b25hbFBhZ2luYXRpb26GkoSbnJ2dAIaShJmZ - CE5TQ29waWVzhpKEm5yEhAFTnwGGkoSZmQ9OU1NjYWxpbmdGYWN0b3KGkoSbnISEAWSg - AYaShJmZC05TRmlyc3RQYWdlhpKEm5ytnwGGkoSZmRROU1ZlcnRpY2FsUGFnaW5hdGlv - boaShJucnZ0AhpKEmZkSTlNSZXZlcnNlUGFnZU9yZGVyhpKmkoSZmQ1OU1JpZ2h0TWFy - Z2luhpKEm5yiniSGkoSZmRZOU0hvcml6b250YWxseUNlbnRlcmVkhpKEm5ydnQGGkoSZ - mQxOU0xlZnRNYXJnaW6GkoSbnKKeJIaShJmZDU5TT3JpZW50YXRpb26GkoSbnJ2dAIaS - hJmZGU5TUHJpbnRSZXZlcnNlT3JpZW50YXRpb26GkqaShJmZCk5TTGFzdFBhZ2WGkoSb - nISXl4J/////hpKEmZkLTlNUb3BNYXJnaW6GkoSbnKKeJIaShJmZFE5TVmVydGljYWxs - eUNlbnRlcmVkhpK5koSZmQtOU1BhcGVyU2l6ZYaShJychIQGez89ZmZ9oYECU4EDSoaG - hg== + AJSEASqEhAFznQGGkoSZmQ5OU0JvdHRvbU1hcmdpboaShJuchIQBZp4khpKEmZkPTlNQ + cmludEFsbFBhZ2VzhpKEm5ydnQCGkoSZmQ1OU0pvYkZlYXR1cmVzhpKElpcAhpKEmZkV + TlNIb3Jpem9uYWxQYWdpbmF0aW9uhpKEm5ydnQCGkoSZmRROU1ZlcnRpY2FsbHlDZW50 + ZXJlZIaShJucnZ0BhpKEmZkJTlNQcmludGVyhpKEhIQJTlNQcmludGVyAJSShJmZASCG + hpKEmZkPTlNTY2FsaW5nRmFjdG9yhpKEm5ygngGGkoSZmRJOU1JldmVyc2VQYWdlT3Jk + ZXKGkqKShJmZDE5TTGVmdE1hcmdpboaShJucoJ4khpKEmZkOTlNQTVBhZ2VGb3JtYXSG + koSEhAZOU0RhdGEAlJeBHyCEB1s3OTY4Y108P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29k + aW5nPSJVVEYtOCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21w + dXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERz + L1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0 + PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUhvcml6b250YWxSZXM8 + L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9y + PC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ + CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxh + cnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0 + LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJCQkJPHJlYWw+Ny4yMDAwMDAwMDAwMDAwMDBl + KzAxPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwv + a2V5PgoJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+ + CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJ + PGRhdGU+MjAwMi0xMS0xN1QwMDoyMDo0Nlo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBs + ZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRl + Z2VyPgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxl + LnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5PgoJPGRpY3Q+CgkJPGtl + eT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNv + bS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5w + cmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJ + CTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5 + PgoJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50 + LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5n + bWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1v + ZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDItMTEtMTdUMDA6MjA6NDZaPC9kYXRlPgoJ + CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJ + PGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+ + Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJ + PGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4K + CQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5 + PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJ + CQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2Fs + aW5nPC9rZXk+CgkJCQk8cmVhbD4xLjAwMDAwMDAwMDAwMDAwMGUrMDA8L3JlYWw+CgkJ + CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3Ry + aW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29t + LmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDAyLTEx + LTE3VDAwOjIwOjQ2WjwvZGF0ZT4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl + dC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGlj + dD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZv + cm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5w + cmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50 + aW5nbWFuYWdlcjwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5p + dGVtQXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBw + bGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+CgkJCQk8cmVhbD43 + LjIwMDAwMDAwMDAwMDAwMGUrMDE8L3JlYWw+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmlu + dC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGlu + Z21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5t + b2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDAyLTExLTE3VDAwOjIwOjQ2WjwvZGF0ZT4K + CQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJ + CTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0 + PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGlu + Zzwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0 + b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmlu + Zz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJ + PGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3Jt + YXQuUE1WZXJ0aWNhbFNjYWxpbmc8L2tleT4KCQkJCTxyZWFsPjEuMDAwMDAwMDAwMDAw + MDAwZSswMDwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGll + bnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3Ry + aW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4K + CQkJCTxkYXRlPjIwMDItMTEtMTdUMDA6MjA6NDZaPC9kYXRlPgoJCQkJPGtleT5jb20u + YXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwv + aW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5h + cHBsZS5wcmludC5zdWJUaWNrZXQucGFwZXJfaW5mb190aWNrZXQ8L2tleT4KCTxkaWN0 + PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhZ2VS + ZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5j + cmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwv + c3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9r + ZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50 + LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhZ2VSZWN0PC9rZXk+CgkJCQkJPGFycmF5PgoJ + CQkJCQk8cmVhbD4wLjAwMDAwMDAwMDAwMDAwMGUrMDA8L3JlYWw+CgkJCQkJCTxyZWFs + PjAuMDAwMDAwMDAwMDAwMDAwZSswMDwvcmVhbD4KCQkJCQkJPHJlYWw+Ny44MzAwMDAw + MDAwMDAwMDBlKzAyPC9yZWFsPgoJCQkJCQk8cmVhbD41LjU5MDAwMDAwMDAwMDAwMGUr + MDI8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50 + aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdt + YW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1v + ZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAyLTExLTE3VDAwOjIyOjEyWjwvZGF0ZT4K + CQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJ + CQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8 + L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVk + UGFwZXJSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp + Y2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFu + YWdlcjwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFy + cmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxl + LnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxh + cnJheT4KCQkJCQkJPHJlYWw+LTEuODAwMDAwMDAwMDAwMDAwZSswMTwvcmVhbD4KCQkJ + CQkJPHJlYWw+LTEuODAwMDAwMDAwMDAwMDAwZSswMTwvcmVhbD4KCQkJCQkJPHJlYWw+ + OC4yNDAwMDAwMDAwMDAwMDBlKzAyPC9yZWFsPgoJCQkJCQk8cmVhbD41Ljc3MDAwMDAw + MDAwMDAwMGUrMDI8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBs + ZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUu + cHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu + dGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAyLTExLTE3VDAwOjIyOjEy + WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFn + PC9rZXk+CgkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9h + cnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBN + UGFwZXJOYW1lPC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp + Y2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LnBtLlBv + c3RTY3JpcHQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0 + ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5h + cHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5n + Pmlzby1hNDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5j + bGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludC5wbS5Qb3N0U2Ny + aXB0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERh + dGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAwLTA3LTI4VDIyOjU3OjA0WjwvZGF0ZT4KCQkJ + CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQkJ + PGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2Rp + Y3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBh + Z2VSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl + dC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LnBtLlBvc3RT + Y3JpcHQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1B + cnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBs + ZS5wcmludC5QYXBlckluZm8uUE1VbmFkanVzdGVkUGFnZVJlY3Q8L2tleT4KCQkJCQk8 + YXJyYXk+CgkJCQkJCTxyZWFsPjAuMDAwMDAwMDAwMDAwMDAwZSswMDwvcmVhbD4KCQkJ + CQkJPHJlYWw+MC4wMDAwMDAwMDAwMDAwMDBlKzAwPC9yZWFsPgoJCQkJCQk8cmVhbD43 + LjgzMDAwMDAwMDAwMDAwMGUrMDI8L3JlYWw+CgkJCQkJCTxyZWFsPjUuNTkwMDAwMDAw + MDAwMDAwZSswMjwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxl + LnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5w + cmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJp + bnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAwLTA3LTI4VDIyOjU3 + OjA0WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVG + bGFnPC9rZXk+CgkJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJ + PC9hcnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZv + LlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5h + cHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBs + ZS5wcmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFwcGxlLnBy + aW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJ + CQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVy + UmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw+LTEuODAwMDAwMDAwMDAw + MDAwZSswMTwvcmVhbD4KCQkJCQkJPHJlYWw+LTEuODAwMDAwMDAwMDAwMDAwZSswMTwv + cmVhbD4KCQkJCQkJPHJlYWw+OC4yNDAwMDAwMDAwMDAwMDBlKzAyPC9yZWFsPgoJCQkJ + CQk8cmVhbD41Ljc3MDAwMDAwMDAwMDAwMGUrMDI8L3JlYWw+CgkJCQkJPC9hcnJheT4K + CQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJ + PHN0cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQkJ + CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRh + dGU+MjAwMC0wNy0yOFQyMjo1NzowNFo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUu + cHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjE8L2ludGVn + ZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFw + cGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4K + CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0 + cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQk8a2V5 + PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4K + CQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQu + UE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPkE0PC9zdHJpbmc+CgkJCQkJPGtl + eT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJpbmc+ + Y29tLmFwcGxlLnByaW50LnBtLlBvc3RTY3JpcHQ8L3N0cmluZz4KCQkJCQk8a2V5PmNv + bS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDAt + MDctMjhUMjI6NTc6MDRaPC9kYXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp + Y2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJ + PC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmlu + dC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJCTxzdHJpbmc+MDAuMjA8L3N0cmluZz4K + CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQucHJpdmF0ZUxvY2s8L2tleT4KCQk8 + ZmFsc2UvPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk+CgkJ + PHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc+Cgk8 + L2RpY3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5 + PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlj + a2V0LnByaXZhdGVMb2NrPC9rZXk+Cgk8ZmFsc2UvPgoJPGtleT5jb20uYXBwbGUucHJp + bnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LlBhZ2VG + b3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0PgqGkoSZmRZOU0hvcml6 + b250YWxseUNlbnRlcmVkhpKokoSZmQ1OU1JpZ2h0TWFyZ2luhpKEm5ygniSGkoSZmRBO + U0pvYkRpc3Bvc2l0aW9uhpKEmZkPTlNQcmludFNwb29sSm9ihpKEmZkITlNDb3BpZXOG + koSbnISEAVOiAYaShJmZC05TUGFwZXJOYW1lhpKEmZkGaXNvLWE0hpKEmZkLTlNGaXJz + dFBhZ2WGkoSbnLyiAYaShJmZFE5TVmVydGljYWxQYWdpbmF0aW9uhpKEm5ydnQCGkoSZ + mQ1OU09yaWVudGF0aW9uhpKEm5ydnQCGkoSZmRlOU1ByaW50UmV2ZXJzZU9yaWVudGF0 + aW9uhpKikoSZmQpOU0xhc3RQYWdlhpKEm5yEl5eCf////4aShJmZC05TVG9wTWFyZ2lu + hpKEm5ygniSGkoSZmQtOU1BhcGVyU2l6ZYaShJychIQMe19OU1NpemU9ZmZ9o4ECU4ED + SoaGhg== RowAlign 1 @@ -1989,7 +2062,7 @@ WindowInfo Frame - {{42, 146}, {580, 614}} + {{640, 205}, {580, 614}} VisibleRegion {{-21, 0}, {565, 537}} Zoom diff --git a/ResKnife.mcp b/ResKnife.mcp index 044db8082aee9561ea5fb342fe341894810e3b79..deed8cb2777df92e9242187f2ddfb94dc16966e4 100644 GIT binary patch delta 8188 zcmZ{n33wF6w#U1=yJjYnWdd0UnE^sjf~)~V5ZM9cC>%uk78jA0EknA3)* zIfcnVQ8de2hxyXEi3Nrjna`>@7x*`|60vVp0}!LS;ZZWxh*vUbaOY=F zpLW#@pZcAm^$A8m{Z5n?VI&!TC6f&f2@5KQe3;Ybi+i0&#yw6#)pTuajME^HR+wu$ zIlh0)O*4I>{arlWxi&5#((s_g#DQ1YKb>7XK(;!Y{B@nFytz8Xes3%1WKx<(ox+Gr zkAA^&-r1Bcj~Rze8~HY`y!5VNRLhMF2qc+=Z*AFE)r4oHZ!n~Lq*u(B4jpIWiF_90q!yGPOU1w` z@Tbb>R+;-AwUnwjL=JRr2rFoNeJwHN=!#EkR`)M^Kz zrFUp_`}UhJ5!zC>VpYu!go^7`th${^=u-U(RB{FA788ein9-2|%Q<(WTG%OUZh_gz z*|VukjGAOGbPl|n>g?umk+#JiCR+7p`{dyxpKtYZH@>ZDS8y_}%u*jbEC7u;yPg>YA-_3lT#aQmOH%uRQ7p!9SIr9`|)e)Jm zSlnH7l&!F2gc3x!m*sJ{bzX=JiFj}Ye@EOsi4Q`N^*_Ul#2+hpic^$$ z3F**6gs1T8qIRKOzcShTbus;J?w8EZoT*2bBhoSM$vNyeb6+@V+5dHz?eiGyB*&K* zj=T7znarHkDe2NLVtyx9L%cuMj1||`u@r9G$a!%+$P=0Armtrs6Wq45S%O7=5d~xI zcz5wm=JB|P7TPhUsI*56TV;<^+z7KqxH&6>!S zQq#?BYkwH;l9wu?Szol9Y?g_mMXVG}$2~pXtWIext~Irj#f)}5T0HwPk9S*4G*7U| zoWw-t#LtM8mFBjbVpePA4w(Sg{PjQ^x0xG5@&Nl(J;;p`oUX~q?!_{5dRyjkkMuBA zc9&bbWMczm?UI?|`eZXym^;D^Y-1yo#c3Xu6BNht`udF(=8pT1M6Nj1q$rU)hYc6| zOIZ!~sh(DdiTBpA)=p-WEsM|H-^==RoZE4P-Ok723bSg7yg4jetZrep6wjAhOXKnY(US|D9l%8a&^z$kAOr{N6 zLxULEDiU(+vcCq#Jw4Sf4anuHFz-Mb<({~N+@IKf;gSq3Y@!Foqu5le0rJr+YOR3wd4@>r#Ugp$}>LLpI zvk8AmF6zYYp-g@;O1-Dtz-0S~_5ao|byuW)JaZe5<><)wX7jN%Mdsi6BKP{Ue3e(k zE$3blIL$q7^`qSK$j=3jTeQr^+9ogYzVTvNnVIP}dx(4SatMj|=dI4NscnDWTEN`d zGx&_Sa^+hht%(_keADQ0=HdYl`P}&BJkBGQl$p(F4eB%&?R+gu7GJEePr4I!V3ois z?!tm7k6Zs^ex|CMa*nrRma+U{xA*saB4f)$$$7pdyb{ssoHuIl5Fzn@s$ZQp4~h()zwK=cXvm&R~7pF~nmwgS|#P<442rr4!Gb4K`JAW86-p zXIkErFprEiW^B0@Bzu-$Th3;P>&$pEBAJ!C)I!wIAGBEjvu_<1x zzRVkk?c?~NZJ$3D^A%DHfBlY2O?99DQ=HpaDJg7B#f6^Z|5W;Gm89UZq*CcQPfDM? zCn@-gxWo_-$vsy~ikG4nmxXx=DkyVh*O5&CXK4S0cvAe&u+ z9XrtC4YjfGBemGz3&blw@WzAQL^sk=iG8{dy6sBO-j+uA=)POB`N+D(R)y7Yq0EUL zCinW3_#$-4zzJG^ZWP!K#SL$fh`xp>>_paB`o7wk(Cwo8_8^M9zPc}VbSxMSAxD)l zxRla{m)^9QYQc}a%Toadt+Fh|S0ZSw{%#4QarR%(|naU5~Cj~lKJQBx}O&<&D|1KK* z#9w@HOtGF$PSZQXI95QeHCZ0uFVjksUMXxvsk8$T%{LiJ?27LYpWU9sgRZxl8T%HBhv z4(|O93nr=s=5~B8SkxbbpLxJ1(T(2GkQDgPV0VV^7WgcM&8}g{#5@syi{}Nc21}u#6bt?+z5S+IWmJ7y z%)f;cYk0OI#eypfpchJSHABR8&kG*FC$a5SV zF2yj%Hg+7AtNf*MZa-o3{nNV((~00Mbvfo;w_T3Go!! z1avN%GMC^{4D<9QTy<(s+YXKb!mv(mz+5LMLrmGb#7`Z7L6m!;g~%he930QL&f(;` z2!fZOKeS%3gI1){cl&QE-{|ptL0GG`hBSk()8}vHd z&sHmJq->M_B!>t2lQ8z-tLbC*VW{U+60c1 zVA!hXQ8jsQC4v7y{ApC7t|sprEy1rTZZx?JN!8@t-3wg4_OQaswVFn4?rQ` zpHRGd6CR)k_%aYih6<5k|1ph^0BLh{SbIZH!dGK3`+pl+nq-yeBe+K+l z;xnaJD0#hmkhlz`jA74e1cRuWe6`?Z_B$w^Z@>8me$Xq$yXzq4_$_akixcZ=@{WU% z>`%pw0wkn9f%gX7%x-Ir1lQH%-8>fe5;ii^G0_IycnTaLmt*r*`FyG-@2WH?^c@+M z)#UA-4Q{FRY)%76swVFM#MMM8W7uz1L&)f4-kaUQQ5kZSOvQ!D-q(CTc$C7dMD90S zg)How6$6D|DeU>*<6G!5#qtBV+Jpz>D3N_ZZ!`uso45zV%9X8}Hu4Sq2s~DCduegy zK4LF;oZ@WVcu2iZ-Y4Jz_#eY6L0y+`^v)|#;GKbCul~4lqcGxXR#BX-TM9`VMR_y9 zp~J8vt8pcRqM{~%CllWQ50xLR!&-3s#$fBim9g~wF$anix?yXji+tlh1Fx?6$jXiK znuDh*ZbVOnq(&BZLB>8v>p$xYJVtpm&<{qNA>s!SVH!1scG3GmUtSX>cojNCv{kz-tpvTZR4Ol|gZb zE*W(UQ)VZOsf#9~J6YU$bTYG!;>Oku;;iXu6y^;PY~9HMt6su_y0l<3`nEyk6KIBG zn;DAp#&DT#7;#r*GSwsAyb~lfj6hop{4U~m<6hk`0$!P|^%Z9&aC!OHe<12fC>m%* zp;VA>+nfP!sJKy#=Aj!&;JGaDMw&N)jG?1{|0sB4#d+(dkkm*53(&4jxem6s{tZ`3 zroi9A*wjR(NyUBexz47*+?n8V1Mp70;UOyYK<)+bX2d%`hm%o#1_mSJO(c$7-|arE zC(p&5E&;!rc=m&slc9kH$Y`^LYE*{VwFef^iQ~RP%A5D78`!#?kn|o842uG9skl*c z08$(D(p>OXw7yi98#SK5K!nx2mv|?<<+O(a^=^W>u3OSwAh_-ydD#2@VmPGypH?|krfiklODfusXu-CqRWp4LC{7(Aq^ zA#7xgfqTpjqi<@Q#XGz49UHHJDXxFStxXtRDq~ z@EVlmlXdGhcxU3Tpk(x0Fe`fqc=&!&xYX;M=xB`s?@IhN4=8Sx%Fs2V2iIK#j+kSZ6O(b(p2&c4=0l3}@JyVr{KPNdRcCf1MWMV=8+2(r zc(&&6Rv47^50sK@CK!BPVWmOyWGHipFM0=38`?*$24Rqz{Fxd}O|vs}y`u zaiu|1p8|)q7<}p1xN3ubJP+QB_%bA=_E1*K{or^w247RB(x9^I;13gD-yBjKBtDd7 z(?=<+o^W-!i}KMn%}4YNgDVYMau)n=#6Lu?lpD0}I5=t_gMWxTC^zWI>EK8<$+zLe z8T@fjJfD9Cx0GAdH5!V(a=l^aoW@nh?B^5U{UpYElu&udTFMUi1o1scv~q)f z?EsFZhQaq@zw#X71Ht182sz^an&Ka8V~+7@e??tHt4>rKj%RK7h~|VI9a(t>*dK%B9dS9;;Icg Lkp+%?F^qo$-o$5$ delta 7376 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 diff --git a/ResKnife.pbproj/project.pbxproj b/ResKnife.pbproj/project.pbxproj index e98dcc4..042e85e 100644 --- a/ResKnife.pbproj/project.pbxproj +++ b/ResKnife.pbproj/project.pbxproj @@ -145,7 +145,6 @@ "; - shouldUseHeadermap = 0; }; F50DFE1F036C255E01A8010A = { isa = PBXBundleReference; @@ -188,21 +187,25 @@ refType = 4; }; F50DFE22036C258201A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = BoolTemplateField.cpp; refType = 4; }; F50DFE23036C258201A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = BoolTemplateField.h; refType = 4; }; F50DFE56036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = DividerTemplateField.cpp; refType = 4; }; F50DFE57036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = DividerTemplateField.h; refType = 4; @@ -217,77 +220,92 @@ refType = 4; }; F50DFE59036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; name = English; path = English.lproj/InfoPlist.strings; refType = 4; }; F50DFE5A036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = IntegerTemplateField.cpp; refType = 4; }; F50DFE5B036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = IntegerTemplateField.h; refType = 4; }; F50DFE5C036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = KHandleStream.cpp; refType = 4; }; F50DFE5D036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = KHandleStream.h; refType = 4; }; F50DFE5E036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = ListTemplateField.cpp; refType = 4; }; F50DFE5F036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = ListTemplateField.h; refType = 4; }; F50DFE60036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = LSTCTemplateField.cpp; refType = 4; }; F50DFE61036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = LSTCTemplateField.h; refType = 4; }; F50DFE62036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = main.cpp; refType = 4; }; F50DFE63036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = main.h; refType = 4; }; F50DFE64036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = main.r; refType = 4; }; F50DFE65036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = StringTemplateField.cpp; refType = 4; }; F50DFE66036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = StringTemplateField.h; refType = 4; }; F50DFE67036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = Templar.cpp; refType = 4; @@ -298,11 +316,13 @@ refType = 4; }; F50DFE6D036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateWindow.cpp; refType = 4; }; F50DFE6E036C258301A8010A = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateWindow.h; refType = 4; @@ -535,7 +555,6 @@ "; - shouldUseHeadermap = 0; }; F5354438022674B401A80001 = { buildActionMask = 2147483647; @@ -581,16 +600,19 @@ runOnlyForDeploymentPostprocessing = 0; }; F535443D0226752901A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = SupportedTypes.plist; refType = 4; }; F535443E0226752901A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateWindowController.h; refType = 4; }; F535443F0226752901A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateWindowController.m; refType = 4; @@ -636,11 +658,13 @@ }; }; F535444D0226B5F501A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = Element.h; refType = 4; }; F535444E0226B5F501A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = Element.m; refType = 4; @@ -676,11 +700,13 @@ }; }; F543AFDB027B2A5001A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = DataSource.h; refType = 4; }; F543AFDC027B2A5001A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = DataSource.m; refType = 4; @@ -825,7 +851,6 @@ productInstallPath = /usr/local/lib; productName = libResKnife; productReference = F546271002917D1501A8010C; - shouldUseHeadermap = 0; }; F546271002917D1501A8010C = { isa = PBXLibraryReference; @@ -1043,11 +1068,13 @@ }; }; F54E6220021B6A0801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FindSheetController.h; refType = 4; }; F54E6221021B6A0801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FindSheetController.m; refType = 4; @@ -1107,6 +1134,7 @@ }; }; F5502C4001C579FF01C57124 = { + fileEncoding = 30; isa = PBXFileReference; path = ResKnifePluginProtocol.h; refType = 4; @@ -1152,6 +1180,7 @@ }; }; F5730B930159528A01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = defaults.plist; refType = 4; @@ -1218,11 +1247,13 @@ }; }; F577A900021215C801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceNameCell.h; refType = 4; }; F577A901021215C801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceNameCell.m; refType = 4; @@ -1342,7 +1373,6 @@ "; - shouldUseHeadermap = 0; }; F57CEE0F0189C95101A8010B = { buildActionMask = 2147483647; @@ -1408,12 +1438,14 @@ refType = 4; }; F58A18400278355D01A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = DescSplitViewDelegate.m; path = desc/DescSplitViewDelegate.m; refType = 4; }; F58A18410278355D01A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = DescSplitViewDelegate.h; path = desc/DescSplitViewDelegate.h; @@ -1432,12 +1464,14 @@ }; }; F58F6B7E025BC3A501A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = BoomWindowController.h; path = boom/BoomWindowController.h; refType = 4; }; F58F6B7F025BC3A501A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = BoomWindowController.m; path = boom/BoomWindowController.m; @@ -1456,11 +1490,13 @@ }; }; F58F6B82025BC73001A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = NovaWindowController.h; refType = 4; }; F58F6B83025BC73001A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = NovaWindowController.m; refType = 4; @@ -1478,12 +1514,14 @@ }; }; F58F6B86025BC76D01A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = CharWindowController.h; path = char/CharWindowController.h; refType = 4; }; F58F6B87025BC76D01A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = CharWindowController.m; path = char/CharWindowController.m; @@ -1502,12 +1540,14 @@ }; }; F58F6B8A025BC7C001A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = ColrWindowController.h; path = colr/ColrWindowController.h; refType = 4; }; F58F6B8B025BC7C001A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = ColrWindowController.m; path = colr/ColrWindowController.m; @@ -1526,12 +1566,14 @@ }; }; F58F6B8E025BCF5901A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = CronWindowController.h; path = cron/CronWindowController.h; refType = 4; }; F58F6B8F025BCF5901A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = CronWindowController.m; path = cron/CronWindowController.m; @@ -1550,12 +1592,14 @@ }; }; F58F6B92025BD97701A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = DescWindowController.m; path = desc/DescWindowController.m; refType = 4; }; F58F6B93025BD97701A8010C = { + fileEncoding = 30; isa = PBXFileReference; name = DescWindowController.h; path = desc/DescWindowController.h; @@ -1628,12 +1672,62 @@ settings = { }; }; + F59481AD03D0776C01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = RKDocumentController.h; + refType = 4; + }; + F59481AE03D0776C01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = RKDocumentController.m; + refType = 4; + }; + F59481AF03D0776C01A8010A = { + fileRef = F59481AD03D0776C01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; + F59481B003D0776C01A8010A = { + fileRef = F59481AE03D0776C01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; + F59481B103D077DC01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = OpenFileDataSource.h; + refType = 4; + }; + F59481B203D077DC01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = OpenFileDataSource.m; + refType = 4; + }; + F59481B303D077DC01A8010A = { + fileRef = F59481B103D077DC01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; + F59481B403D077DC01A8010A = { + fileRef = F59481B203D077DC01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; F59D5DE40320DFF601A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = "NSString-FSSpec.h"; refType = 4; }; F59D5DE50320DFF601A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = "NSString-FSSpec.m"; refType = 4; @@ -1651,11 +1745,13 @@ }; }; F59D5DE8032106D201A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = "NSNumber-Range.h"; refType = 4; }; F59D5DE9032106D201A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = "NSNumber-Range.m"; refType = 4; @@ -1677,6 +1773,7 @@ F5EBF6B801573EC201000001, F5EBF6B901573EC201000001, ); + hasScannedForEncodings = 1; isa = PBXProject; mainGroup = F5B588100156D2A601000001; productRefGroup = F5B588110156D30301000001; @@ -1850,7 +1947,6 @@ "; - shouldUseHeadermap = 0; }; F5B588140156D30301000001 = { buildActionMask = 2147483647; @@ -1872,6 +1968,10 @@ F5D0CBD1022744C701A80001, F5DF1BFD0254AD8801A80001, F59D5DE60320DFF601A8010C, + F5F1071803CCC61E01A8010A, + F5F1071C03CCFAAC01A8010A, + F59481AF03D0776C01A8010A, + F59481B303D077DC01A8010A, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -1923,6 +2023,10 @@ F5DF1C070254AD8801A80001, F5C9ECD0027F474A01A8010C, F59D5DE70320DFF601A8010C, + F5F1071903CCC61E01A8010A, + F5F1071D03CCFAAC01A8010A, + F59481B003D0776C01A8010A, + F59481B403D077DC01A8010A, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -1956,6 +2060,7 @@ refType = 4; }; F5B5881B0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = main.c; refType = 4; @@ -1972,18 +2077,26 @@ F5B588260156D40B01000001, F5B588270156D40B01000001, F5B588280156D40B01000001, + F59481B103D077DC01A8010A, + F59481B203D077DC01A8010A, F5B588290156D40B01000001, F5B5882A0156D40B01000001, + F5F1071603CCC61E01A8010A, + F5F1071703CCC61E01A8010A, + F5F1071A03CCFAAC01A8010A, + F5F1071B03CCFAAC01A8010A, F5B5882B0156D40B01000001, F5B5882C0156D40B01000001, F5B5882D0156D40B01000001, F5B5882E0156D40B01000001, - F577A900021215C801A80001, - F577A901021215C801A80001, F5B5882F0156D40B01000001, F5B588300156D40B01000001, F5B588310156D40B01000001, F5B588320156D40B01000001, + F577A900021215C801A80001, + F577A901021215C801A80001, + F59481AD03D0776C01A8010A, + F59481AE03D0776C01A8010A, F5B588330156D40B01000001, F5B588340156D40B01000001, ); @@ -1992,111 +2105,133 @@ refType = 4; }; F5B5881D0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ApplicationDelegate.h; refType = 4; }; F5B5881E0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ApplicationDelegate.m; refType = 4; }; F5B5881F0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = AttributesFormatter.h; refType = 4; }; F5B588200156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = AttributesFormatter.m; refType = 4; }; F5B588210156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = CreateResourceSheetController.h; refType = 4; }; F5B588220156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = CreateResourceSheetController.m; refType = 4; }; F5B588250156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = InfoWindowController.h; refType = 4; }; F5B588260156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = InfoWindowController.m; refType = 4; }; F5B588270156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = NameFormatter.h; refType = 4; }; F5B588280156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = NameFormatter.m; refType = 4; }; F5B588290156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = OutlineViewDelegate.h; refType = 4; }; F5B5882A0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = OutlineViewDelegate.m; refType = 4; }; F5B5882B0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PrefsWindowController.h; refType = 4; }; F5B5882C0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PrefsWindowController.m; refType = 4; }; F5B5882D0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Resource.h; refType = 4; }; F5B5882E0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Resource.m; refType = 4; }; F5B5882F0156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceDataSource.h; refType = 4; }; F5B588300156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceDataSource.m; refType = 4; }; F5B588310156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceDocument.h; refType = 4; }; F5B588320156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceDocument.m; refType = 4; }; F5B588330156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = SizeFormatter.h; refType = 4; }; F5B588340156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; path = SizeFormatter.m; refType = 4; @@ -2213,6 +2348,7 @@ refType = 2; }; F5B588430156D40B01000001 = { + fileEncoding = 30; isa = PBXFileReference; name = English; path = English.lproj/InfoPlist.strings; @@ -2581,7 +2717,6 @@ "; - shouldUseHeadermap = 0; }; F5B588760156D5CB01000001 = { buildActionMask = 2147483647; @@ -2666,11 +2801,13 @@ refType = 4; }; F5B5887D0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = "Carbon Prefix.h"; refType = 4; }; F5B5887E0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = "Classic Prefix.h"; refType = 4; @@ -2691,16 +2828,19 @@ refType = 4; }; F5B588800156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Transfer.h; refType = 4; }; F5B588810156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResKnife.h; refType = 4; }; F5B588820156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Generic.h; refType = 4; @@ -2743,151 +2883,181 @@ refType = 4; }; F5B588840156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Application.h; refType = 4; }; F5B588850156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Application.cpp; refType = 4; }; F5B588860156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Asynchronous.h; refType = 4; }; F5B588870156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Asynchronous.cpp; refType = 4; }; F5B588880156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = DataBrowser.h; refType = 4; }; F5B588890156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = DataBrowser.cpp; refType = 4; }; F5B5888A0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = EditorWindow.h; refType = 4; }; F5B5888B0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = EditorWindow.cpp; refType = 4; }; F5B5888C0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Errors.h; refType = 4; }; F5B5888D0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Errors.cpp; refType = 4; }; F5B5888E0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Files.h; refType = 4; }; F5B5888F0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Files.cpp; refType = 4; }; F5B588900156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = FileWindow.h; refType = 4; }; F5B588910156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = FileWindow.cpp; refType = 4; }; F5B588920156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = HostCallbacks.h; refType = 4; }; F5B588930156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = HostCallbacks.cpp; refType = 4; }; F5B588940156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = InspectorWindow.h; refType = 4; }; F5B588950156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = InspectorWindow.cpp; refType = 4; }; F5B588960156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PickerWindow.h; refType = 4; }; F5B588970156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PickerWindow.cpp; refType = 4; }; F5B588980156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PlugObject.h; refType = 4; }; F5B588990156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PlugObject.cpp; refType = 4; }; F5B5889A0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PlugWindow.h; refType = 4; }; F5B5889B0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PlugWindow.cpp; refType = 4; }; F5B5889C0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceObject.h; refType = 4; }; F5B5889D0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResourceObject.cpp; refType = 4; }; F5B5889E0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Utility.h; refType = 4; }; F5B5889F0156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Utility.cpp; refType = 4; }; F5B588A00156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = WindowObject.h; refType = 4; }; F5B588A10156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = WindowObject.cpp; refType = 4; @@ -2905,11 +3075,13 @@ refType = 4; }; F5B588A30156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Carbon.r; refType = 4; }; F5B588A40156D6D901000001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResKnife.r; refType = 4; @@ -3191,7 +3363,6 @@ "; - shouldUseHeadermap = 0; }; F5B588D30156D78201000001 = { buildActionMask = 2147483647; @@ -3250,6 +3421,7 @@ refType = 2; }; F5B588D90156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = "Hex Editor.h"; refType = 4; @@ -3270,42 +3442,50 @@ refType = 4; }; F5B588DB0156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Events.h; refType = 4; }; F5B588DC0156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Events.cpp; refType = 4; }; F5B588DD0156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexWindow.h; refType = 4; }; F5B588DE0156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexWindow.cpp; refType = 4; }; F5B588DF0156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Initalisation.h; refType = 4; }; F5B588E00156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Initalisation.cpp; refType = 4; }; F5B588E10156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; name = Utility.h; path = HexUtility.h; refType = 4; }; F5B588E20156D9D401000001 = { + fileEncoding = 30; isa = PBXFileReference; name = Utility.cpp; path = HexUtility.cpp; @@ -3429,7 +3609,6 @@ "; - shouldUseHeadermap = 0; }; F5B588EF0156DAF301000001 = { buildActionMask = 2147483647; @@ -3483,6 +3662,7 @@ refType = 2; }; F5B588F50156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = "Template Editor.h"; refType = 4; @@ -3499,16 +3679,19 @@ refType = 4; }; F5B588F90156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateWindow.h; refType = 4; }; F5B588FA0156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateWindow.cpp; refType = 4; }; F5B588FB0156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = "Template Editor.r"; refType = 4; @@ -3523,6 +3706,7 @@ refType = 2; }; F5B588FD0156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = "PICT Editor.h"; refType = 4; @@ -3539,21 +3723,25 @@ refType = 4; }; F5B588FF0156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Initalisation.h; refType = 4; }; F5B589000156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Initalisation.cpp; refType = 4; }; F5B589010156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = Parser.h; refType = 4; }; F5B589020156DC2201000001 = { + fileEncoding = 30; isa = PBXFileReference; path = PictWindow.cpp; refType = 4; @@ -3646,7 +3834,6 @@ "; - shouldUseHeadermap = 0; }; F5B5890C0156DC2201000001 = { buildActionMask = 2147483647; @@ -3726,6 +3913,7 @@ runOnlyForDeploymentPostprocessing = 0; }; F5C9ECCE027F474A01A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = Notifications.m; refType = 4; @@ -3755,6 +3943,7 @@ }; }; F5C9ECD8027F562201A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = Structs.h; refType = 4; @@ -3766,6 +3955,7 @@ }; }; F5CDEBAB01FC893201A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = ResKnifeResourceProtocol.h; refType = 4; @@ -3793,11 +3983,13 @@ target = F57CEE0E0189C95101A8010B; }; F5D0CBCF022744C701A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = "NSOutlineView-SelectedItems.h"; refType = 4; }; F5D0CBD0022744C701A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = "NSOutlineView-SelectedItems.m"; refType = 4; @@ -3856,101 +4048,121 @@ refType = 4; }; F5DF1BDB0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = DirectoryCopy.c; refType = 4; }; F5DF1BDC0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = DirectoryCopy.h; refType = 4; }; F5DF1BDD0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FileCopy.c; refType = 4; }; F5DF1BDE0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FileCopy.h; refType = 4; }; F5DF1BDF0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FSpCompat.c; refType = 4; }; F5DF1BE00254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FSpCompat.h; refType = 4; }; F5DF1BE10254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FullPath.c; refType = 4; }; F5DF1BE20254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = FullPath.h; refType = 4; }; F5DF1BE30254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = IterateDirectory.c; refType = 4; }; F5DF1BE40254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = IterateDirectory.h; refType = 4; }; F5DF1BE50254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreDesktopMgr.c; refType = 4; }; F5DF1BE60254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreDesktopMgr.h; refType = 4; }; F5DF1BE70254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreFiles.c; refType = 4; }; F5DF1BE80254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreFiles.h; refType = 4; }; F5DF1BE90254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreFilesExtras.c; refType = 4; }; F5DF1BEA0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreFilesExtras.h; refType = 4; }; F5DF1BEB0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = Optimization.h; refType = 4; }; F5DF1BEC0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = OptimizationEnd.h; refType = 4; }; F5DF1BED0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = Search.c; refType = 4; }; F5DF1BEE0254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = Search.h; refType = 4; @@ -3965,11 +4177,13 @@ refType = 4; }; F5DF1BF00254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreFilesX.c; refType = 4; }; F5DF1BF10254AD8801A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = MoreFilesX.h; refType = 4; @@ -4049,7 +4263,6 @@ "; - shouldUseHeadermap = 0; }; F5DF1C0A0254C6BA01A80001 = { buildActionMask = 2147483647; @@ -4081,7 +4294,6 @@ F5EDC61D025BFB8E01A8010C, F5EDC620025BFBB501A8010C, F543AFF1027C716E01A8010C, - F7C028FE03BBB39D017A2919, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -4301,36 +4513,43 @@ refType = 4; }; F5EF83A0020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexEditorDelegate.h; refType = 4; }; F5EF83A1020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexEditorDelegate.m; refType = 4; }; F5EF83A2020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexTextView.h; refType = 4; }; F5EF83A3020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexTextView.m; refType = 4; }; F5EF83A7020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexWindowController.h; refType = 4; }; F5EF83A8020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = HexWindowController.m; refType = 4; }; F5EF83A9020C08E601A80001 = { + fileEncoding = 30; isa = PBXFileReference; path = SupportedTypes.plist; refType = 4; @@ -4398,12 +4617,62 @@ settings = { }; }; + F5F1071603CCC61E01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = PasteboardDocument.h; + refType = 4; + }; + F5F1071703CCC61E01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = PasteboardDocument.m; + refType = 4; + }; + F5F1071803CCC61E01A8010A = { + fileRef = F5F1071603CCC61E01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; + F5F1071903CCC61E01A8010A = { + fileRef = F5F1071703CCC61E01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; + F5F1071A03CCFAAC01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = PasteboardWindowController.h; + refType = 4; + }; + F5F1071B03CCFAAC01A8010A = { + fileEncoding = 30; + isa = PBXFileReference; + path = PasteboardWindowController.m; + refType = 4; + }; + F5F1071C03CCFAAC01A8010A = { + fileRef = F5F1071A03CCFAAC01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; + F5F1071D03CCFAAC01A8010A = { + fileRef = F5F1071B03CCFAAC01A8010A; + isa = PBXBuildFile; + settings = { + }; + }; F5F98D4502F0B06E01A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateInitalisation.h; refType = 4; }; F5F98D4602F0B06E01A8010C = { + fileEncoding = 30; isa = PBXFileReference; path = TemplateInitalisation.cpp; refType = 4; @@ -4425,16 +4694,11 @@ }; }; F7C028FD03BBB39D017A2919 = { + fileEncoding = 30; isa = PBXFileReference; path = novabible.html; refType = 4; }; - F7C028FE03BBB39D017A2919 = { - fileRef = F7C028FD03BBB39D017A2919; - isa = PBXBuildFile; - settings = { - }; - }; //F70 //F71 //F72 @@ -4446,6 +4710,7 @@ //FD3 //FD4 FDBB1C8E038062C0015E48C3 = { + fileEncoding = 30; isa = PBXFileReference; path = "C99 Prefix.h"; refType = 4; diff --git a/Template Editor/Classes/TemplateInitalisation.cpp b/Template Editor/Classes/TemplateInitalisation.cpp new file mode 100644 index 0000000..89582d9 --- /dev/null +++ b/Template Editor/Classes/TemplateInitalisation.cpp @@ -0,0 +1,113 @@ +#include "TemplateInitalisation.h" +#include "TemplateWindow.h" +globals g; + +/*** INITALISE NEW EDITOR INSTANCE ***/ +OSStatus Plug_InitInstance( Plug_PlugInRef plug, Plug_ResourceRef resource ) +{ + // get system version + OSStatus error = Gestalt( gestaltSystemVersion, &g.systemVersion ); + if( error ) return error; + + // check appearance availablilty +#if TARGET_API_MAC_CARBON + g.useAppearance = true; +#else + ProcessSerialNumber psn; + error = GetCurrentProcess( &psn ); + if( error ) g.useAppearance = false; + else g.useAppearance = IsAppearanceClient( &psn ); +#endif + + // get template for resource + ResType type = Host_GetResourceType( resource ); + Handle tmpl = Host_GetDefaultTemplate( type ); + SInt32 size = GetHandleSize( tmpl ); // cannot be less than 5 (string length of zero, four char code) + if( tmpl == null || size < 5 ) return paramErr; // not the best error to return for this situation + + // create window + Rect creationBounds; + WindowRef window; + SetRect( &creationBounds, 0, 0, kDefaultWindowWidth, kDefaultWindowHeight ); + OffsetRect( &creationBounds, 8, 48 ); + WindowAttributes attributes = kWindowStandardDocumentAttributes | kWindowStandardHandlerAttribute | kWindowInWindowMenuAttribute; + if( g.systemVersion >= kMacOSX ) attributes |= kWindowLiveResizeAttribute; + error = CreateNewWindow( kDocumentWindowClass, attributes, &creationBounds, &window ); + Plug_WindowRef plugWindow = Host_RegisterWindow( plug, resource, window ); + +#if TARGET_API_MAC_CARBON + // install window event handler + EventHandlerRef ref = null; + EventHandlerUPP handler = NewEventHandlerUPP( CarbonWindowEventHandler ); + EventTypeSpec events[] = { { kEventClassWindow, kEventWindowClose } }; + InstallWindowEventHandler( window, handler, GetEventTypeCount(events), events, plug, &ref ); +#else + ClassicEventHandlerUPP handler = NewClassicEventHandlerUPP( ClassicWindowEventHandler ); + Host_InstallClassicWindowEventHandler( plugWindow, handler ); +#endif + + // set window's background to default for theme + if( g.useAppearance ) + SetThemeWindowBackground( window, kThemeBrushModelessDialogBackgroundActive, false ); + + // cerate new template window class + TemplateWindowPtr templateWindow = new TemplateWindow( window ); + Host_SetWindowRefCon( plugWindow, (UInt32) templateWindow ); + + // parse the resource data + Handle data = Host_GetResourceData( resource ); + error = templateWindow->UseTemplate( tmpl ); // pass responsibility for disposing to the window + error = templateWindow->ParseData( data ); // parses the resource into an array of Elements + + // show window + ShowWindow( window ); + SelectWindow( window ); + return error; +} + +/*** ELEMENT CONSTRUCTOR ***/ +Element::Element( void ) +{ + BlockZero( this, sizeof(Element) ); +} + +/*** CARBON WINDOW EVENT HANDLER ***/ +pascal OSStatus CarbonWindowEventHandler( EventHandlerCallRef handler, EventRef event, void *userData ) +{ + #pragma unused( handler ) + OSStatus error = eventNotHandledErr; + Plug_PlugInRef plugRef = (Plug_PlugInRef) userData; + WindowRef window = GetUserFocusWindow(); // overridden below for window class events + + // get event type + UInt32 eventClass = GetEventClass( event ); + UInt32 eventKind = GetEventKind( event ); + + // get event parameters + if( eventClass == kEventClassWindow ) + GetEventParameter( event, kEventParamDirectObject, typeWindowRef, null, sizeof(WindowRef), null, &window ); + if( !window ) return error; + Plug_WindowRef plugWindow = Host_GetPlugWindowFromWindowRef( window ); + if( !plugWindow ) return error; + TemplateWindowPtr templateWindow = (TemplateWindowPtr) Host_GetWindowRefCon( plugWindow ); + if( !templateWindow ) return error; + + // get window rect + Rect windowBounds; + GetWindowPortBounds( window, &windowBounds ); + + // handle event + static EventHandlerRef resizeEventHandlerRef = null; + switch( eventClass ) + { + case kEventClassWindow: + switch( eventKind ) + { + case kEventWindowClose: + delete templateWindow; + break; + } + break; + } + return error; +} \ No newline at end of file diff --git a/Template Editor/Classes/TemplateInitalisation.h b/Template Editor/Classes/TemplateInitalisation.h new file mode 100644 index 0000000..5342c7c --- /dev/null +++ b/Template Editor/Classes/TemplateInitalisation.h @@ -0,0 +1 @@ +#include "Template Editor.h" pascal OSStatus CarbonWindowEventHandler( EventHandlerCallRef handler, EventRef event, void *userData ); \ No newline at end of file