diff options
Diffstat (limited to 'src/osd/modules/debugger/osx/memoryviewer.mm')
-rw-r--r-- | src/osd/modules/debugger/osx/memoryviewer.mm | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/src/osd/modules/debugger/osx/memoryviewer.mm b/src/osd/modules/debugger/osx/memoryviewer.mm new file mode 100644 index 00000000000..dae0c245bfd --- /dev/null +++ b/src/osd/modules/debugger/osx/memoryviewer.mm @@ -0,0 +1,173 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +//============================================================ +// +// memoryviewer.m - MacOS X Cocoa debug window handling +// +//============================================================ + +#import "memoryviewer.h" + +#import "debugconsole.h" +#import "debugview.h" +#import "memoryview.h" + +#include "debug/debugcpu.h" +#include "debug/dvmemory.h" + + +@implementation MAMEMemoryViewer + +- (id)initWithMachine:(running_machine &)m console:(MAMEDebugConsole *)c { + NSScrollView *memoryScroll; + NSView *expressionContainer; + NSPopUpButton *actionButton; + NSRect expressionFrame; + + if (!(self = [super initWithMachine:m title:@"Memory" console:c])) + return nil; + NSRect const contentBounds = [[window contentView] bounds]; + NSFont *const defaultFont = [[MAMEDebugView class] defaultFontForMachine:m]; + + // create the expression field + expressionField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 19)]; + [expressionField setAutoresizingMask:(NSViewWidthSizable | NSViewMaxXMargin | NSViewMinYMargin)]; + [expressionField setFont:defaultFont]; + [expressionField setFocusRingType:NSFocusRingTypeNone]; + [expressionField setTarget:self]; + [expressionField setAction:@selector(doExpression:)]; + [expressionField setDelegate:self]; + [expressionField sizeToFit]; + + // create the subview popup + subviewButton = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(0, 0, 100, 19)]; + [subviewButton setAutoresizingMask:(NSViewWidthSizable | NSViewMinXMargin | NSViewMinYMargin)]; + [subviewButton setBezelStyle:NSShadowlessSquareBezelStyle]; + [subviewButton setFocusRingType:NSFocusRingTypeNone]; + [subviewButton setFont:defaultFont]; + [subviewButton setTarget:self]; + [subviewButton setAction:@selector(changeSubview:)]; + [[subviewButton cell] setArrowPosition:NSPopUpArrowAtBottom]; + [subviewButton sizeToFit]; + + // adjust sizes to make it fit nicely + expressionFrame = [expressionField frame]; + expressionFrame.size.height = MAX(expressionFrame.size.height, [subviewButton frame].size.height); + expressionFrame.size.width = (contentBounds.size.width - expressionFrame.size.height) / 2; + [expressionField setFrame:expressionFrame]; + expressionFrame.origin.x = expressionFrame.size.width; + expressionFrame.size.width = contentBounds.size.width - expressionFrame.size.height - expressionFrame.origin.x; + [subviewButton setFrame:expressionFrame]; + + // create a container for the expression field and subview popup + expressionFrame = NSMakeRect(expressionFrame.size.height, + contentBounds.size.height - expressionFrame.size.height, + contentBounds.size.width - expressionFrame.size.height, + expressionFrame.size.height); + expressionContainer = [[NSView alloc] initWithFrame:expressionFrame]; + [expressionContainer setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; + [expressionContainer addSubview:expressionField]; + [expressionField release]; + [expressionContainer addSubview:subviewButton]; + [subviewButton release]; + [[window contentView] addSubview:expressionContainer]; + [expressionContainer release]; + + // create the memory view + memoryView = [[MAMEMemoryView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) + machine:*machine]; + [memoryView insertSubviewItemsInMenu:[subviewButton menu] atIndex:0]; + memoryScroll = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, + 0, + contentBounds.size.width, + expressionFrame.origin.y)]; + [memoryScroll setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; + [memoryScroll setHasHorizontalScroller:YES]; + [memoryScroll setHasVerticalScroller:YES]; + [memoryScroll setAutohidesScrollers:YES]; + [memoryScroll setBorderType:NSNoBorder]; + [memoryScroll setDocumentView:memoryView]; + [memoryView release]; + [[window contentView] addSubview:memoryScroll]; + [memoryScroll release]; + + // create the action popup + actionButton = [[self class] newActionButtonWithFrame:NSMakeRect(0, + expressionFrame.origin.y, + expressionFrame.size.height, + expressionFrame.size.height)]; + [actionButton setAutoresizingMask:(NSViewMaxXMargin | NSViewMinYMargin)]; + [actionButton setFont:[NSFont systemFontOfSize:[defaultFont pointSize]]]; + [memoryView insertActionItemsInMenu:[actionButton menu] atIndex:1]; + [[window contentView] addSubview:actionButton]; + [actionButton release]; + + // set default state + [memoryView selectSubviewForDevice:debug_cpu_get_visible_cpu(*machine)]; + [memoryView setExpression:@"0"]; + [expressionField setStringValue:@"0"]; + [expressionField selectText:self]; + [subviewButton selectItemAtIndex:[subviewButton indexOfItemWithTag:[memoryView selectedSubviewIndex]]]; + [window makeFirstResponder:expressionField]; + [window setTitle:[NSString stringWithFormat:@"Memory: %@", [memoryView selectedSubviewName]]]; + + // calculate the optimal size for everything + NSSize const desired = [NSScrollView frameSizeForContentSize:[memoryView maximumFrameSize] + hasHorizontalScroller:YES + hasVerticalScroller:YES + borderType:[memoryScroll borderType]]; + [self cascadeWindowWithDesiredSize:desired forView:memoryScroll]; + + // don't forget the result + return self; +} + + +- (void)dealloc { + [super dealloc]; +} + + +- (id <MAMEDebugViewExpressionSupport>)documentView { + return memoryView; +} + + +- (IBAction)debugNewMemoryWindow:(id)sender { + debug_view_memory_source const *source = [memoryView source]; + [console debugNewMemoryWindowForSpace:source->space() + device:source->device() + expression:[memoryView expression]]; +} + + +- (IBAction)debugNewDisassemblyWindow:(id)sender { + debug_view_memory_source const *source = [memoryView source]; + [console debugNewDisassemblyWindowForSpace:source->space() + device:source->device() + expression:[memoryView expression]]; +} + + +- (BOOL)selectSubviewForDevice:(device_t *)device { + BOOL const result = [memoryView selectSubviewForDevice:device]; + [subviewButton selectItemAtIndex:[subviewButton indexOfItemWithTag:[memoryView selectedSubviewIndex]]]; + [window setTitle:[NSString stringWithFormat:@"Memory: %@", [memoryView selectedSubviewName]]]; + return result; +} + + +- (BOOL)selectSubviewForSpace:(address_space *)space { + BOOL const result = [memoryView selectSubviewForSpace:space]; + [subviewButton selectItemAtIndex:[subviewButton indexOfItemWithTag:[memoryView selectedSubviewIndex]]]; + [window setTitle:[NSString stringWithFormat:@"Memory: %@", [memoryView selectedSubviewName]]]; + return result; +} + + +- (IBAction)changeSubview:(id)sender { + [memoryView selectSubviewAtIndex:[[sender selectedItem] tag]]; + [window setTitle:[NSString stringWithFormat:@"Memory: %@", [memoryView selectedSubviewName]]]; +} + +@end |