diff --git a/ChangeLog b/ChangeLog index 45ec92f..045e9cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2008-12-28 02:23-EST Gregory John Casamento + + * Framework/PCEditorManager.m: Remove log. + * Modules/Debuggers/ProjectCenter/GNUmakefile: Added new images + to resource list. + * Modules/Debuggers/ProjectCenter/PCDebugger.[hm]: Added setStatus: + method to manage status field. + * Modules/Debuggers/ProjectCenter/PCDebuggerView.m: Added code + to handle the toolbar. + * Modules/Debuggers/ProjectCenter/PTYView.[hm]: Added method called + "terminate" so that subclasses can override how the process is + terminated. + * Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm: Added + status line. + * Modules/Debuggers/ProjectCenter/Resources/go_button.png + * Modules/Debuggers/ProjectCenter/Resources/next_button.png + * Modules/Debuggers/ProjectCenter/Resources/pause_button.png + * Modules/Debuggers/ProjectCenter/Resources/restart_button.png + * Modules/Debuggers/ProjectCenter/Resources/stepin_button.png + * Modules/Debuggers/ProjectCenter/Resources/stepout_button.png: + Images for debugger toolbar. + 2008-12-27 00:47-EST Gregory John Casamento * Framework/PCEditorManager.m: Changed code to use the filePath diff --git a/Framework/PCEditorManager.m b/Framework/PCEditorManager.m index 068c396..75628cb 100644 --- a/Framework/PCEditorManager.m +++ b/Framework/PCEditorManager.m @@ -398,7 +398,7 @@ NSString *PCEditorDidResignActiveNotification = editable: YES windowed: NO]; [editor scrollToLineNumber: [line intValue]]; - NSLog(@"object = %@", [aNotif object]); + // NSLog(@"object = %@", [aNotif object]); } @end diff --git a/Modules/Debuggers/ProjectCenter/GNUmakefile b/Modules/Debuggers/ProjectCenter/GNUmakefile index fae6769..661aad0 100644 --- a/Modules/Debuggers/ProjectCenter/GNUmakefile +++ b/Modules/Debuggers/ProjectCenter/GNUmakefile @@ -21,7 +21,14 @@ ProjectCenter_LIBRARIES_DEPEND_UPON += # ProjectCenter_RESOURCE_FILES= \ Resources/PCDebugger.gorm \ - Resources/Info.table + Resources/Info.table \ + Resources/go_button.png \ + Resources/pause_button.png \ + Resources/restart_button.png \ + Resources/next_button.png \ + Resources/stepin_button.png \ + Resources/stepout_button.png + # # Header files # diff --git a/Modules/Debuggers/ProjectCenter/PCDebugger.h b/Modules/Debuggers/ProjectCenter/PCDebugger.h index a85abcf..1d583fc 100644 --- a/Modules/Debuggers/ProjectCenter/PCDebugger.h +++ b/Modules/Debuggers/ProjectCenter/PCDebugger.h @@ -31,10 +31,11 @@ { id debuggerView; id debuggerWindow; + id statusField; NSString *path; NSString *debuggerPath; - // BOOL _isLogging; - // BOOL _isErrorLogging; - // FILE *std_input; } + +- (void) setStatus: (NSString *) status; +- (NSString *) status; @end diff --git a/Modules/Debuggers/ProjectCenter/PCDebugger.m b/Modules/Debuggers/ProjectCenter/PCDebugger.m index ff6f761..45c5c62 100644 --- a/Modules/Debuggers/ProjectCenter/PCDebugger.m +++ b/Modules/Debuggers/ProjectCenter/PCDebugger.m @@ -28,7 +28,55 @@ #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter] #endif +static NSImage *goImage = nil; +static NSImage *pauseImage = nil; +static NSImage *restartImage = nil; +static NSImage *nextImage = nil; +static NSImage *stepInImage = nil; +static NSImage *stepOutImage = nil; + @implementation PCDebugger ++ (void) initialize +{ + if (self == [PCDebugger class]) + { + NSBundle *bundle; + NSString *path; + + bundle = [NSBundle bundleForClass: self]; + path = [bundle pathForImageResource: @"go_button"]; + if (path != nil) + { + goImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"pause_button"]; + if (path != nil) + { + pauseImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"restart_button"]; + if (path != nil) + { + restartImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"next_button"]; + if (path != nil) + { + nextImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"stepin_button"]; + if (path != nil) + { + stepInImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"stepout_button"]; + if (path != nil) + { + stepOutImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + } +} + - (id) init { if((self = [super init]) != nil) @@ -69,8 +117,16 @@ - (void) awakeFromNib { + NSToolbar *toolbar = [(NSToolbar *)[NSToolbar alloc] initWithIdentifier: @"PCDebuggerToolbar"]; + [toolbar setAllowsUserCustomization: NO]; + [toolbar setDelegate: self]; + [debuggerWindow setToolbar: toolbar]; + RELEASE(toolbar); + + [toolbar setUsesStandardBackgroundColor: YES]; [debuggerView setFont: [NSFont userFixedPitchFontOfSize: 0]]; [debuggerWindow setFrameAutosaveName: @"PCDebuggerWindow"]; + [self setStatus: @"Idle."]; } - (NSWindow *)debuggerWindow @@ -102,4 +158,145 @@ { ASSIGN(path,p); } + +// action methods for toolbar... +- (void) go: (id) sender +{ + [self setStatus: @"Running..."]; + [debuggerView putString: @"run\n"]; +} + +- (void) pause: (id) sender +{ +} + +- (void) restart: (id) sender +{ + [self setStatus: @"Running..."]; + [debuggerView putString: @"run\n"]; +} + +- (void) next: (id) sender +{ + [self setStatus: @"Going to next line."]; + [debuggerView putString: @"next\n"]; +} + +- (void) stepInto: (id) sender +{ + [self setStatus: @"Stepping into method."]; + [debuggerView putString: @"step\n"]; +} + +- (void) stepOut: (id) sender +{ + [self setStatus: @"Finishing method."]; + [debuggerView putString: @"finish\n"]; +} + +// Status.. +- (void) setStatus: (NSString *) status +{ + [statusField setStringValue: status]; +} + +- (NSString *) status +{ + return [statusField stringValue]; +} +@end + +@implementation PCDebugger (NSToolbarDelegate) + +- (NSToolbarItem*)toolbar: (NSToolbar*)toolbar + itemForItemIdentifier: (NSString*)itemIdentifier +willBeInsertedIntoToolbar: (BOOL)flag +{ + NSToolbarItem *toolbarItem = AUTORELEASE([[NSToolbarItem alloc] + initWithItemIdentifier: itemIdentifier]); + + if([itemIdentifier isEqual: @"GoItem"]) + { + [toolbarItem setLabel: @"Go"]; + [toolbarItem setImage: goImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(go:)]; + [toolbarItem setTag: 0]; + } + else if([itemIdentifier isEqual: @"PauseItem"]) + { + [toolbarItem setLabel: @"Pause"]; + [toolbarItem setImage: pauseImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(pause:)]; + [toolbarItem setTag: 1]; + } + else if([itemIdentifier isEqual: @"RestartItem"]) + { + [toolbarItem setLabel: @"Restart"]; + [toolbarItem setImage: restartImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(restart:)]; + [toolbarItem setTag: 1]; + } + else if([itemIdentifier isEqual: @"NextItem"]) + { + [toolbarItem setLabel: @"Next"]; + [toolbarItem setImage: nextImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(next:)]; + [toolbarItem setTag: 2]; + } + else if([itemIdentifier isEqual: @"StepIntoItem"]) + { + [toolbarItem setLabel: @"Step Into"]; + [toolbarItem setImage: stepInImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(stepInto:)]; + [toolbarItem setTag: 3]; + } + else if([itemIdentifier isEqual: @"StepOutItem"]) + { + [toolbarItem setLabel: @"Step Out"]; + [toolbarItem setImage: stepOutImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(stepOut:)]; + [toolbarItem setTag: 4]; + } + + return toolbarItem; +} + +- (NSArray*) toolbarAllowedItemIdentifiers: (NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects: @"GoItem", + @"PauseItem", + @"RestartItem", + @"NextItem", + @"StepIntoItem", + @"StepOutItem", + nil]; +} + +- (NSArray*) toolbarDefaultItemIdentifiers: (NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects: @"GoItem", + @"PauseItem", + @"RestartItem", + @"NextItem", + @"StepIntoItem", + @"StepOutItem", + nil]; +} + +- (NSArray*) toolbarSelectableItemIdentifiers: (NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects: @"GoItem", + @"PauseItem", + @"RestartItem", + @"NextItem", + @"StepIntoItem", + @"StepOutItem", + nil]; +} @end diff --git a/Modules/Debuggers/ProjectCenter/PCDebuggerView.m b/Modules/Debuggers/ProjectCenter/PCDebuggerView.m index 2414f7f..6841a36 100644 --- a/Modules/Debuggers/ProjectCenter/PCDebuggerView.m +++ b/Modules/Debuggers/ProjectCenter/PCDebuggerView.m @@ -21,27 +21,19 @@ */ #include "PCDebuggerView.h" +#include "PCDebugger.h" + #include #include +#include +#include + #ifndef NOTIFICATION_CENTER #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter] #endif @implementation PCDebuggerView -/* -- (void) runProgram: (NSString *)path - inCurrentDirectory: (NSString *)directory - withArguments: (NSArray *)array - logStandardError: (BOOL)logError -{ - [super runProgram: path - inCurrentDirectory: directory - withArguments: array - logStandardError: logError]; - [self putString: @"set annotate 3\n"]; -} -*/ -(void)setDebugger:(PCDebugger *)theDebugger { @@ -87,7 +79,9 @@ NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: file, @"file", line, @"line", nil]; - NSLog(@"dict = %@", dict); + NSString *statusString = [NSString stringWithFormat: @"Stopped, %@:%@",file,line]; + + [debugger setStatus: statusString]; [NOTIFICATION_CENTER postNotificationName: PCProjectBreakpointNotification object: dict]; @@ -121,4 +115,48 @@ { return currentFile; } + +/** + * lookup the process id. + */ +/* +- (int) lookupProcessId +{ + int task_pid = [task processIdentifier]; + int child_pid = 0; + NSArray *entries = [[NSFileManager defaultManager] directoryContentsAtPath: @"/proc"]; + NSEnumerator *en = [entries objectEnumerator]; + NSString *entry = nil; + + // FIXME: I'm looking for a generic way to do this, what we have here is very /proc specific. + // which I don't like since it ties this functionality to systems which have /proc. + while((entry = [en nextObject]) != nil) + { + int pid = [entry intValue]; + if (pid != 0) + { + int ppid = getppid(pid); + if (ppid == task_pid) + { + child_pid = pid; + break; + } + } + } + + return child_pid; +} + +- (void) interrupt +{ + int pid = [self lookupProcessId]; + kill(pid,SIGINT); +} +*/ + +- (void) terminate +{ + [super terminate]; + [debugger setStatus: @"Process ended."]; +} @end diff --git a/Modules/Debuggers/ProjectCenter/PTYView.h b/Modules/Debuggers/ProjectCenter/PTYView.h index 05023ea..0f26b26 100644 --- a/Modules/Debuggers/ProjectCenter/PTYView.h +++ b/Modules/Debuggers/ProjectCenter/PTYView.h @@ -58,6 +58,8 @@ - (void) terminate; +- (void) interrupt; + - (void) putString: (NSString *)string; - (void) putChar:(unichar)ch; diff --git a/Modules/Debuggers/ProjectCenter/PTYView.m b/Modules/Debuggers/ProjectCenter/PTYView.m index 62b1fb1..d542edc 100644 --- a/Modules/Debuggers/ProjectCenter/PTYView.m +++ b/Modules/Debuggers/ProjectCenter/PTYView.m @@ -25,6 +25,7 @@ #include #include #include +#include #ifndef NOTIFICATION_CENTER #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter] @@ -115,8 +116,8 @@ // // Is it backspace? If so, remove one character from the terminal to reflect - // the deletion. For some reason backspace sends "\b \b", so I have to remove - // four characters in order to appropriately delete from the buffer. + // the deletion. For some reason backspace sends multiple characters, so I have to remove + // one more character than what is sent in order to appropriately delete from the buffer. // range = [str rangeOfString: @"\b"]; if (range.location != NSNotFound) @@ -332,6 +333,11 @@ [master_handle writeData: data]; } +- (void) interrupt +{ + [task interrupt]; +} + /** * Respond to key events and pipe them down to the debugger */ @@ -347,7 +353,7 @@ if (c == 3) // ETX, Control-C { - [task interrupt]; // send the interrupt signal to the subtask + [self interrupt]; // send the interrupt signal to the subtask } else { diff --git a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes index 8fad690..ef27407 100644 --- a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes +++ b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes @@ -5,7 +5,8 @@ ); Outlets = ( debuggerView, - debuggerWindow + debuggerWindow, + statusField ); Super = NSObject; }; diff --git a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.info b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.info index 3bc8f05..3364249 100644 Binary files a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.info and b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.info differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/objects.gorm b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/objects.gorm index a656ac5..9cd3b1b 100644 Binary files a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/objects.gorm and b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/objects.gorm differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/go_button.png b/Modules/Debuggers/ProjectCenter/Resources/go_button.png new file mode 100644 index 0000000..b5edab8 Binary files /dev/null and b/Modules/Debuggers/ProjectCenter/Resources/go_button.png differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/next_button.png b/Modules/Debuggers/ProjectCenter/Resources/next_button.png new file mode 100644 index 0000000..31fc001 Binary files /dev/null and b/Modules/Debuggers/ProjectCenter/Resources/next_button.png differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/pause_button.png b/Modules/Debuggers/ProjectCenter/Resources/pause_button.png new file mode 100644 index 0000000..0c762b8 Binary files /dev/null and b/Modules/Debuggers/ProjectCenter/Resources/pause_button.png differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/restart_button.png b/Modules/Debuggers/ProjectCenter/Resources/restart_button.png new file mode 100644 index 0000000..cf5ae5d Binary files /dev/null and b/Modules/Debuggers/ProjectCenter/Resources/restart_button.png differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/stepin_button.png b/Modules/Debuggers/ProjectCenter/Resources/stepin_button.png new file mode 100644 index 0000000..1ecd259 Binary files /dev/null and b/Modules/Debuggers/ProjectCenter/Resources/stepin_button.png differ diff --git a/Modules/Debuggers/ProjectCenter/Resources/stepout_button.png b/Modules/Debuggers/ProjectCenter/Resources/stepout_button.png new file mode 100644 index 0000000..5db157f Binary files /dev/null and b/Modules/Debuggers/ProjectCenter/Resources/stepout_button.png differ