summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/debugger/osx/devicesviewer.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/debugger/osx/devicesviewer.m')
-rw-r--r--src/osd/modules/debugger/osx/devicesviewer.m210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/osd/modules/debugger/osx/devicesviewer.m b/src/osd/modules/debugger/osx/devicesviewer.m
new file mode 100644
index 00000000000..29910c57c40
--- /dev/null
+++ b/src/osd/modules/debugger/osx/devicesviewer.m
@@ -0,0 +1,210 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+//============================================================
+//
+// devicesviewer.m - MacOS X Cocoa debug window handling
+//
+// Copyright (c) 1996-2015, Nicola Salmoria and the MAME Team.
+// Visit http://mamedev.org for licensing and usage restrictions.
+//
+//============================================================
+
+#import "devicesviewer.h"
+
+
+@interface MAMEDeviceWrapper : NSObject
+{
+ running_machine *machine;
+ device_t *device;
+ NSArray *children;
+}
+
+- (id)initWithMachine:(running_machine &)m device:(device_t &)d;
+
+- (running_machine &)machine;
+- (device_t &)device;
+- (NSString *)tag;
+- (NSString *)name;
+- (NSUInteger)children;
+- (MAMEDeviceWrapper *)childAtIndex:(NSUInteger)index;
+
+@end
+
+
+@implementation MAMEDeviceWrapper
+
+- (void)wrapChildren {
+ NSMutableArray *const tmp = [[NSMutableArray alloc] init];
+ for (device_t *child = device->first_subdevice(); child != NULL; child = child->next())
+ {
+ MAMEDeviceWrapper *const wrap = [[MAMEDeviceWrapper alloc] initWithMachine:*machine
+ device:*child];
+ [tmp addObject:wrap];
+ [wrap release];
+ }
+ children = [[NSArray alloc] initWithArray:tmp];
+ [tmp release];
+}
+
+
+- (id)initWithMachine:(running_machine &)m device:(device_t &)d {
+ if (!(self = [super init]))
+ return nil;
+ machine = &m;
+ device = &d;
+ children = nil;
+ return self;
+}
+
+
+- (void)dealloc {
+ if (children != nil)
+ [children release];
+ [super dealloc];
+}
+
+
+- (running_machine &)machine {
+ return *machine;
+}
+
+
+- (device_t &)device {
+ return *device;
+}
+
+
+- (NSString *)tag {
+ return (device == &machine->root_device()) ? @"<root>"
+ : [NSString stringWithUTF8String:device->basetag()];
+}
+
+
+- (NSString *)name {
+ return [NSString stringWithUTF8String:device->name()];
+}
+
+
+- (NSUInteger)children {
+ if (children == nil)
+ [self wrapChildren];
+ return [children count];
+}
+
+
+- (MAMEDeviceWrapper *)childAtIndex:(NSUInteger)index {
+ if (children == nil)
+ [self wrapChildren];
+ return (index < [children count]) ? [children objectAtIndex:index] : nil;
+}
+
+@end
+
+
+@implementation MAMEDevicesViewer
+
+- (id)initWithMachine:(running_machine &)m console:(MAMEDebugConsole *)c {
+ NSScrollView *devicesScroll;
+ NSTableColumn *tagColumn, *nameColumn;
+
+ if (!(self = [super initWithMachine:m title:@"All Devices" console:c]))
+ return nil;
+ root = [[MAMEDeviceWrapper alloc] initWithMachine:m device:m.root_device()];
+
+ // create the devices view
+ devicesView = [[NSOutlineView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
+ [devicesView setUsesAlternatingRowBackgroundColors:YES];
+ [devicesView setAllowsColumnReordering:YES];
+ [devicesView setAllowsColumnResizing:YES];
+ [devicesView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle];
+ [devicesView setAllowsEmptySelection:YES];
+ [devicesView setAllowsMultipleSelection:NO];
+ [devicesView setAllowsColumnSelection:NO];
+ tagColumn = [[NSTableColumn alloc] initWithIdentifier:@"tag"];
+ [[tagColumn headerCell] setStringValue:@"Tag"];
+ [tagColumn setEditable:NO];
+ [tagColumn setMinWidth:100];
+ [tagColumn setWidth:120];
+ [tagColumn setResizingMask:(NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask)];
+ [devicesView addTableColumn:tagColumn];
+ [tagColumn release];
+ nameColumn = [[NSTableColumn alloc] initWithIdentifier:@"name"];
+ [[nameColumn headerCell] setStringValue:@"Name"];
+ [nameColumn setEditable:NO];
+ [nameColumn setMinWidth:100];
+ [nameColumn setMinWidth:360];
+ [nameColumn setResizingMask:(NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask)];
+ [devicesView addTableColumn:nameColumn];
+ [nameColumn release];
+ [devicesView setOutlineTableColumn:tagColumn];
+ [devicesView setAutoresizesOutlineColumn:YES];
+ [devicesView setDataSource:self];
+ devicesScroll = [[NSScrollView alloc] initWithFrame:[[window contentView] bounds]];
+ [devicesScroll setDrawsBackground:YES];
+ [devicesScroll setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
+ [devicesScroll setHasHorizontalScroller:YES];
+ [devicesScroll setHasVerticalScroller:YES];
+ [devicesScroll setAutohidesScrollers:YES];
+ [devicesScroll setBorderType:NSNoBorder];
+ [devicesScroll setDocumentView:devicesView];
+ [devicesView release];
+ [[window contentView] addSubview:devicesScroll];
+ [devicesScroll release];
+
+ // set default state
+ [devicesView expandItem:root expandChildren:YES];
+ [window makeFirstResponder:devicesView];
+ [window setTitle:[NSString stringWithFormat:@"All Devices"]];
+
+ // calculate the optimal size for everything
+ NSSize const desired = [NSScrollView frameSizeForContentSize:NSMakeSize(480, 320)
+ hasHorizontalScroller:YES
+ hasVerticalScroller:YES
+ borderType:[devicesScroll borderType]];
+ [self cascadeWindowWithDesiredSize:desired forView:devicesScroll];
+
+ // don't forget the result
+ return self;
+}
+
+
+- (void)dealloc {
+ if (root != nil)
+ [root release];
+ [super dealloc];
+}
+
+
+- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
+ return [(MAMEDeviceWrapper *)item children] > 0;
+}
+
+
+- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
+ if (item != nil)
+ return [(MAMEDeviceWrapper *)item children];
+ else
+ return 1;
+}
+
+
+- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
+ if (item != nil)
+ return [(MAMEDeviceWrapper *)item childAtIndex:index];
+ else if (index == 0)
+ return root;
+ else
+ return nil;
+}
+
+
+- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
+ if ([[tableColumn identifier] isEqualToString:@"tag"])
+ return [(MAMEDeviceWrapper *)item tag];
+ else if ([[tableColumn identifier] isEqualToString:@"name"])
+ return [(MAMEDeviceWrapper *)item name];
+ else
+ return nil;
+}
+
+@end