gnustep-dev
[Top][All Lists]
Advanced

[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
 
 //

reply via email to

[Prev in Thread] Current Thread [Next in Thread]