1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
//
// MQBinaryViewer.m
// MySQL QueryBrowser
//
// Created by Alfredo Kojima on 4/28/05.
// Copyright 2005 MySQL AB. All rights reserved.
//
#import "MQBinaryViewer.h"
@interface MQBVDataSource : NSObject
{
NSData *_data;
}
- (void)setData:(NSData*)data;
@end
@implementation MQBVDataSource
- (void)setData:(NSData*)data
{
if (_data != data)
{
[_data release];
_data= [data retain];
}
}
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
return ([_data length] + 15) / 16;
}
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex
{
if ([[aTableColumn identifier] isEqualTo:@"offset"])
return [NSString stringWithFormat:@"%08x", rowIndex*16];
else
{
int index= [[aTableColumn identifier] intValue];
char *ptr= (char*)[_data bytes];
if (index < 100)
{
if (rowIndex*16 + index < [_data length])
return [NSString stringWithFormat:@"%02x", (unsigned char)ptr[rowIndex*16+index]];
else
return @"";
}
else
{
index-= 100;
if (rowIndex*16 + index*4 < [_data length])
{
int i;
char buffer[5];
for (i= 0; i < 4; i++)
buffer[i]= isprint(ptr[rowIndex*16+index*4+i])?ptr[rowIndex*16+index*4+i]:'.';
buffer[4]= 0;
return [NSString stringWithFormat:@"%s", buffer];
}
else
return @"";
}
}
}
@end
@implementation MQBinaryViewer
- (id)initWithData:(NSData*)data
{
self= [super init];
if (self)
{
unsigned int i;
NSTableColumn *column;
NSFont *font;
NSColor *color1, *color2;
_sview= [[NSScrollView alloc] initWithFrame:NSMakeRect(0,0,200,200)];
[_sview setHasHorizontalScroller:NO];
[_sview setHasVerticalScroller:YES];
[_sview setBorderType: NSGrooveBorder];
[_sview setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin|NSViewHeightSizable];
[[_sview contentView] setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
[[_sview contentView] setAutoresizesSubviews:YES];
_table= [[NSTableView alloc] initWithFrame:[[_sview contentView] frame]];
// [_table setDrawsGrid:YES];
[_table setHeaderView:nil];
[_table setRowHeight:14];
[_table setIntercellSpacing:NSMakeSize(0,0)];
[_sview setDocumentView:_table];
_dataSource= [[MQBVDataSource alloc] init];
[_dataSource setData:data];
[_table setDataSource:_dataSource];
[_table reloadData];
font= [NSFont fontWithName:@"Courier" size:11.0];
column= [[[NSTableColumn alloc] initWithIdentifier:@"offset"] autorelease];
[column setWidth:[font widthOfString:@"00000000"]+10];
[[column dataCell] setFont:font];
[_table addTableColumn:column];
[column setEditable:NO];
color1= [NSColor colorWithDeviceRed:0.9 green:1.0 blue:0.9 alpha:1.0];
color2= [NSColor colorWithDeviceRed:0.9 green:0.9 blue:1.0 alpha:1.0];
for (i= 0; i < 16; i++)
{
column= [[[NSTableColumn alloc] initWithIdentifier:[NSNumber numberWithInt:i]] autorelease];
[column setWidth:[font widthOfString:@"00"]+((i==15)?10:4)];
[column setEditable:NO];
[_table addTableColumn:column];
if ((i / 4) & 1)
[[column dataCell] setBackgroundColor:color1];
else
[[column dataCell] setBackgroundColor:color2];
[[column dataCell] setDrawsBackground:YES];
[[column dataCell] setFont:font];
}
for (i= 0; i < 4; i++)
{
column= [[[NSTableColumn alloc] initWithIdentifier:[NSNumber numberWithInt:100+i]] autorelease];
[column setWidth:[font widthOfString:@"XXXX"]+4];
[column setEditable:NO];
[_table addTableColumn:column];
if (i & 1)
[[column dataCell] setBackgroundColor:color1];
else
[[column dataCell] setBackgroundColor:color2];
[[column dataCell] setDrawsBackground:YES];
[[column dataCell] setFont:font];
[[column dataCell] setWraps:NO];
}
}
return self;
}
- (void)setData:(NSData*)data
{
[_dataSource setData:data];
[_table reloadData];
}
- (NSString*)label
{
return @"Binary";
}
- (NSView*)view
{
return _sview;
}
- (void)setEditable:(BOOL)flag
{
}
@end
|