webengine/osswebengine/WebKitTools/Drosera/mac/DebuggerApplication.mm
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebKitTools/Drosera/mac/DebuggerApplication.mm	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "DebuggerApplication.h"
+
+#import "DebuggerClient.h"
+#import <WebKit/WebCoreStatistics.h>
+
+@implementation DebuggerApplication
+- (void)awakeFromNib
+{
+    NSTableColumn *column = [attachTable tableColumnWithIdentifier:@"name"];
+    NSBrowserCell *cell = [[NSBrowserCell alloc] init];
+    [cell setLeaf:YES];
+    [column setDataCell:cell];
+    [cell release];
+}
+
+- (void)applicationDidFinishLaunching:(NSNotification *)notification
+{
+    [WebCoreStatistics setShouldPrintExceptions:YES];
+
+    knownServerNames = [[NSMutableDictionary alloc] init];
+
+    [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverLoaded:) name:WebScriptDebugServerDidLoadNotification object:nil];
+    [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverLoaded:) name:WebScriptDebugServerQueryReplyNotification object:nil];
+    [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverUnloaded:) name:WebScriptDebugServerWillUnloadNotification object:nil];
+    [[NSDistributedNotificationCenter defaultCenter] postNotificationName:WebScriptDebugServerQueryNotification object:nil];
+
+    [self showAttachPanel:nil];
+}
+
+#pragma mark -
+#pragma mark Server Detection Callbacks
+
+- (void)serverLoaded:(NSNotification *)notification
+{
+    int processId = [[[notification userInfo] objectForKey:WebScriptDebugServerProcessIdentifierKey] intValue];
+    if (processId == [[NSProcessInfo processInfo] processIdentifier])
+        return;
+
+    NSMutableDictionary *info = [[notification userInfo] mutableCopy];
+    if (!info)
+        return;
+    [knownServerNames setObject:info forKey:[notification object]];
+    [info release];
+
+    [attachTable reloadData];
+}
+
+- (void)serverUnloaded:(NSNotification *)notification
+{
+    [knownServerNames removeObjectForKey:[notification object]];
+    [attachTable reloadData];
+}
+
+- (NSDictionary *)knownServers
+{
+    return knownServerNames;
+}
+
+#pragma mark -
+#pragma mark Attach Panel Actions
+
+- (IBAction)showAttachPanel:(id)sender
+{
+    if (![attachWindow isVisible])
+        [attachWindow center];
+    [attachTable reloadData];
+    [attachTable setTarget:self];
+    [attachTable setDoubleAction:@selector(attach:)];
+    [attachWindow makeKeyAndOrderFront:sender];
+}
+
+- (IBAction)attach:(id)sender
+{
+    if ([[attachTable selectedRowIndexes] count] != 1)
+        return;
+
+    [attachWindow orderOut:sender];
+
+    unsigned int row = [[attachTable selectedRowIndexes] firstIndex];
+    NSString *key = [[knownServerNames allKeys] objectAtIndex:row];
+
+    // DebuggerClient will release on close
+    DebuggerClient *document = [[DebuggerClient alloc] initWithServerName:key];
+    [document showWindow:sender];
+}
+
+#pragma mark -
+#pragma mark Table View Delegate
+
+- (int)numberOfRowsInTableView:(NSTableView *)tableView
+{
+    return [knownServerNames count];
+}
+
+- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
+{
+    return @"";
+}
+
+- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row
+{
+    NSString *key = [[knownServerNames allKeys] objectAtIndex:row];
+    NSMutableDictionary *info = [knownServerNames objectForKey:key];
+    NSString *processName = [info objectForKey:WebScriptDebugServerProcessNameKey];
+    NSImage *icon = [info objectForKey:@"icon"];
+
+    if (!icon) {
+        NSString *path = [[NSWorkspace sharedWorkspace] fullPathForApplication:processName];
+        if (path) icon = [[NSWorkspace sharedWorkspace] iconForFile:path];
+        if (!icon) icon = [[NSWorkspace sharedWorkspace] iconForFileType:@"app"];
+        if (icon) [info setObject:icon forKey:@"icon"];
+        [icon setScalesWhenResized:YES];
+        [icon setSize:NSMakeSize(32, 32)];
+    }
+
+    [cell setImage:icon];
+    [cell setTitle:processName];
+}
+
+- (void)tableViewSelectionDidChange:(NSNotification *)notification
+{
+    [attachButton setEnabled:([[attachTable selectedRowIndexes] count])];
+}
+@end