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 27ae403..8f05725 100644 Binary files a/Cocoa/English.lproj/Application.nib/objects.nib and b/Cocoa/English.lproj/Application.nib/objects.nib differ diff --git a/Cocoa/English.lproj/Localizable.strings b/Cocoa/English.lproj/Localizable.strings index 6891127..dd8f764 100644 Binary files a/Cocoa/English.lproj/Localizable.strings and b/Cocoa/English.lproj/Localizable.strings differ diff --git a/Cocoa/English.lproj/ResourceDocument.nib/info.nib b/Cocoa/English.lproj/ResourceDocument.nib/info.nib index 56fe40c..bccdc20 100644 --- a/Cocoa/English.lproj/ResourceDocument.nib/info.nib +++ b/Cocoa/English.lproj/ResourceDocument.nib/info.nib @@ -3,11 +3,11 @@ 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 361a601..b543e90 100644 Binary files a/Cocoa/English.lproj/ResourceDocument.nib/objects.nib and b/Cocoa/English.lproj/ResourceDocument.nib/objects.nib differ diff --git a/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/info.nib b/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/info.nib index 2380e24..b13ed8d 100644 --- a/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/info.nib +++ b/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/info.nib @@ -11,6 +11,6 @@ 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 826e49a..ef83cd0 100644 Binary files a/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/objects.nib and b/Cocoa/Plug-Ins/Hex Editor/English.lproj/HexWindow.nib/objects.nib differ 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 0000000..42e2757 Binary files /dev/null and b/Cocoa/Plug-Ins/PICT Editor/English.lproj/PictWindow.nib/objects.nib differ diff --git a/Cocoa/Plug-Ins/PICT Editor/PictWindowController.h b/Cocoa/Plug-Ins/PICT Editor/PictWindowController.h new file mode 100644 index 0000000..6118af9 --- /dev/null +++ b/Cocoa/Plug-Ins/PICT Editor/PictWindowController.h @@ -0,0 +1,13 @@ +#import + +#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 90568e5..c330634 100644 Binary files a/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/objects.nib and b/Cocoa/Plug-Ins/Template Editor/English.lproj/TemplateWindow.nib/objects.nib differ 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 044db80..deed8cb 100644 Binary files a/ResKnife.mcp and b/ResKnife.mcp differ 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