[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: exception panel userInfo browser
From: |
Matt Rice |
Subject: |
Re: exception panel userInfo browser |
Date: |
Sun, 22 Oct 2006 14:34:14 -0700 (PDT) |
--- Matt Rice <address@hidden> wrote:
>
>
> --- Fred Kiefer <address@hidden> wrote:
>
> > Matt Rice schrieb:
> > > not sure if anyone is opposed to adding
> something
> > like
> > > this...
> > >
> > > it provides a userInfo browser to the exception
> > panel
> > > which gets shown when you click on the icon in
> the
> > > upper left hand corner.
> > >
> > > i find it very useful when doing key value
> coding
> > > stuff
> > > and you have dictionaries with arrays of
> > dictionaries
> > > and stuff
> > >
> > > it isn't the most polished looking but it does
> the
> > job.
> >
> >
> > Hi Matt,
> >
> > the idea of the panel itself seems nice, but why
> do
> > you add it via
> > getSomePanel(). As you did not change
> > NSReleaseAlertPanel() you wont
> > have a benefit from this. For me it would seem
> > easier, if you just
> > created the panel manually without caching. This
> > will reduce the size of
> > your patch.
> >
alright i did this stuff, and managed to get it
working in an external panel, so no more exception
panel resizing and ugly box hack
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
Index: Source/NSAlert.m
===================================================================
--- Source/NSAlert.m (revision 23944)
+++ Source/NSAlert.m (working copy)
@@ -1468,3 +1468,236 @@
}
@end
+
address@hidden GSExceptionPanel : GSAlertPanel
+{
+ NSBrowser *_browser;
+ NSDictionary *_userInfo;
+ NSPanel *_userInfoPanel;
+}
+- (void) setUserInfo:(NSDictionary *)userInfo;
+- (NSPanel *)userInfoPanel;
address@hidden
+
+int GSRunExceptionPanel(
+ NSString *title,
+ NSException *exception,
+ NSString *defaultButton,
+ NSString *alternateButton,
+ NSString *otherButton)
+{
+ NSString *message;
+ GSExceptionPanel *panel;
+ int result;
+
+ message = [NSString stringWithFormat:@"%@: %@",
+ [exception name],
+ [exception reason]];
+ if (defaultButton == nil)
+ {
+ defaultButton = @"OK";
+ }
+
+ panel = [[GSExceptionPanel alloc] init];
+
+ if (title == nil)
+ {
+ title = @"Exception";
+ }
+
+ [panel setTitle: title
+ message: message
+ def: defaultButton
+ alt: alternateButton
+ other: otherButton];
+ [panel setUserInfo: [exception userInfo]];
+ result = [panel runModal];
+ [[panel userInfoPanel] orderOut:nil];
+ [panel setUserInfo: nil];
+
+ RELEASE(panel);
+ return result;
+}
+
address@hidden GSExceptionPanel
+- (void) dealloc
+{
+ RELEASE(_userInfo);
+ RELEASE(_browser);
+ RELEASE(_userInfoPanel);
+ [super dealloc];
+}
+- (id) init
+{
+ if ((self = [super init]))
+ {
+ [icoButton setEnabled:YES];
+ [icoButton setTarget:self];
+ [icoButton setAction:@selector(_icoAction:)];
+ }
+
+ return self;
+}
+- (NSPanel *) userInfoPanel
+{
+ return _userInfoPanel;
+}
+
+- (void) setUserInfo:(NSDictionary *)userInfo;
+{
+ ASSIGN(_userInfo, userInfo);
+ [_browser reloadColumn:0];
+}
+
+- (void) _icoAction:(id)sender
+{
+ NSRect fr;
+
+ if (_userInfoPanel)
+ {
+ [_browser reloadColumn:0];
+ return;
+ }
+
+ fr = NSMakeRect(_frame.origin.x, _frame.origin.y + _frame.size.height + 15,
+ _frame.size.width, 108);
+ _userInfoPanel = [[NSPanel alloc] initWithContentRect:fr
+ styleMask:NSTitledWindowMask
+ | NSResizableWindowMask
+ backing:NSBackingStoreBuffered
+ defer:NO];
+ [_userInfoPanel setTitle:@"User Info Inspector"];
+ [_userInfoPanel setWorksWhenModal:YES];
+
+ fr = NSMakeRect(8, 8, _frame.size.width - 16, 100);
+ _browser = [[NSBrowser alloc] initWithFrame:fr];
+ [_browser setMaxVisibleColumns:2];
+ [_browser setDelegate:self];
+ [_browser setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
+ [_browser reloadColumn:0];
+ [[_userInfoPanel contentView] addSubview:_browser];
+ [_userInfoPanel makeKeyAndOrderFront:self];
+}
+
+- (int) browser:(id)browser
+numberOfRowsInColumn:(int)col
+{
+ if (col == 0)
+ return [[_userInfo allKeys] count];
+ else
+ {
+ id val = [[(NSCell *)[browser selectedCellInColumn:col - 1]
representedObject] description];
+ volatile id foo = nil;
+ NS_DURING
+ foo = [val propertyList];
+ val = foo;
+ NS_HANDLER
+ NS_ENDHANDLER
+
+ if ([val isKindOfClass:[NSArray class]])
+ return [val count];
+ else if ([val isKindOfClass:[NSDictionary class]])
+ return [[val allKeys] count];
+ else return val != nil;
+ }
+ return 0;
+}
+
+- (void) browser:(NSBrowser *)browser willDisplayCell:(NSBrowserCell *)cell
atRow:(int)row
+column:(int)column
+{
+ if (column == 0)
+ {
+ id key = [[_userInfo allKeys] objectAtIndex:row];
+ id val = [_userInfo objectForKey:key];
+
+ [cell setLeaf:NO];
+ [cell setStringValue:[key description]];
+ [cell setRepresentedObject: val];
+ }
+ else
+ {
+ volatile id val = [(NSCell *)[browser selectedCellInColumn:column - 1]
representedObject];
+ BOOL flag;
+
+ if (!([val isKindOfClass:[NSArray class]] || [val isKindOfClass:[NSArray
class]]))
+ {
+ volatile id foo = nil;
+ val = [val description];
+ NS_DURING
+ foo = [val propertyList];
+ val = foo;
+ NS_HANDLER
+ NS_ENDHANDLER
+ }
+ flag = (!([val isKindOfClass:[NSArray class]]
+ || [val isKindOfClass:[NSDictionary class]]));
+
+
+
+ [cell setLeaf:flag];
+
+ if ([val isKindOfClass:[NSArray class]])
+ {
+ volatile id obj = [val objectAtIndex:row];
+ if (!([obj isKindOfClass:[NSArray class]] || [obj
isKindOfClass:[NSArray class]]))
+ {
+ volatile id foo;
+ obj = [[obj description] propertyList];
+ NS_DURING
+ foo = [obj propertyList];
+ obj = foo;
+ NS_HANDLER
+ NS_ENDHANDLER
+ }
+
+ if ([obj isKindOfClass:[NSArray class]])
+ {
+ [cell setRepresentedObject:obj];
+ [cell setLeaf:NO];
+ [cell setStringValue:[NSString stringWithFormat:@"%@ %p", [obj
class], obj]];
+ }
+ else if ([obj isKindOfClass:[NSDictionary class]])
+ {
+ [cell setRepresentedObject:obj];
+ [cell setLeaf:NO];
+ [cell setStringValue:[NSString stringWithFormat:@"%@ %p", [obj
class], obj]];
+ }
+ else
+ {
+ [cell setLeaf:YES];
+ [cell setStringValue:[obj description]];
+ [cell setRepresentedObject:nil];
+ }
+ }
+ else if ([val isKindOfClass:[NSDictionary class]])
+ {
+ id key = [[val allKeys] objectAtIndex:row];
+ volatile id it = [(NSDictionary *)val objectForKey: key];
+ volatile id foo;
+ foo = [it description];
+ NS_DURING
+ foo = [it propertyList];
+ it = foo;
+ NS_HANDLER
+ NS_ENDHANDLER
+ [cell setStringValue:[key description]];
+ [cell setRepresentedObject:it];
+ }
+ else
+ {
+ [cell setLeaf:YES];
+ [cell setStringValue:[val description]];
+ }
+
+ }
+}
+- (id) browser:(NSBrowser *)browser titleOfColumn:(int)column
+{
+ if (column == 0) return @"userInfo";
+ id val = [(NSCell *)[browser selectedCellInColumn:column - 1]
representedObject];
+ NSString *title = [NSString stringWithFormat:@"%@ %p", [val class], val];
+ return title;
+}
address@hidden
+
Index: Source/NSApplication.m
===================================================================
--- Source/NSApplication.m (revision 23944)
+++ Source/NSApplication.m (working copy)
@@ -113,19 +113,17 @@
[exception raise];
}
- retVal = NSRunCriticalAlertPanel
+ retVal = GSRunExceptionPanel
([NSString stringWithFormat: _(@"Critical Error in %@"),
[[NSProcessInfo processInfo] processName]],
- @"%@: %@",
+ exception,
_(@"Abort"),
nil,
#ifdef DEBUG
- _(@"Debug"),
+ _(@"Debug"));
#else
- nil,
+ nil);
#endif
- [exception name],
- [exception reason]);
/* The user wants to abort */
if (retVal == NSAlertDefault)
Index: Headers/AppKit/NSPanel.h
===================================================================
--- Headers/AppKit/NSPanel.h (revision 23944)
+++ Headers/AppKit/NSPanel.h (working copy)
@@ -174,6 +174,12 @@
void *contextInfo,
NSString *msg, ...);
+APPKIT_EXPORT int GSRunExceptionPanel(NSString *title,
+ NSException *exception,
+ NSString *defaultButton,
+ NSString *alternateButton,
+ NSString *otherButton);
+
#endif
//