2006-11-03 David Smith <catfish.man@gmail.com>
[WebKit-https.git] / WebKitTools / Drosera / DebuggerApplication.m
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import "DebuggerApplication.h"
30 #import "DebuggerDocument.h"
31 #import <WebKit/WebCoreStatistics.h>
32
33 @implementation DebuggerApplication
34 - (void)awakeFromNib
35 {
36     NSTableColumn *column = [attachTable tableColumnWithIdentifier:@"name"];
37     NSBrowserCell *cell = [[NSBrowserCell alloc] init];
38     [cell setLeaf:YES];
39     [column setDataCell:cell];
40     [cell release];
41 }
42
43 - (void)applicationDidFinishLaunching:(NSNotification *)notification
44 {
45     [WebCoreStatistics setShouldPrintExceptions:YES];
46
47     knownServerNames = [[NSMutableDictionary alloc] init];
48
49     [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverLoaded:) name:WebScriptDebugServerDidLoadNotification object:nil];
50     [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverLoaded:) name:WebScriptDebugServerQueryReplyNotification object:nil];
51     [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverUnloaded:) name:WebScriptDebugServerWillUnloadNotification object:nil];
52     [[NSDistributedNotificationCenter defaultCenter] postNotificationName:WebScriptDebugServerQueryNotification object:nil];
53
54     [self showAttachPanel:nil];
55 }
56
57 #pragma mark -
58 #pragma mark Server Detection Callbacks
59
60 - (void)serverLoaded:(NSNotification *)notification
61 {
62     int processId = [[[notification userInfo] objectForKey:WebScriptDebugServerProcessIdentifierKey] intValue];
63     if (processId == [[NSProcessInfo processInfo] processIdentifier])
64         return;
65
66     NSMutableDictionary *info = [[notification userInfo] mutableCopy];
67     if (!info)
68         return;
69     [knownServerNames setObject:info forKey:[notification object]];
70     [info release];
71
72     [attachTable reloadData];
73 }
74
75 - (void)serverUnloaded:(NSNotification *)notification
76 {
77     [knownServerNames removeObjectForKey:[notification object]];
78     [attachTable reloadData];
79 }
80
81 - (NSDictionary *)knownServers
82 {
83     return knownServerNames;
84 }
85
86 #pragma mark -
87 #pragma mark Attach Panel Actions
88
89 - (IBAction)showAttachPanel:(id)sender
90 {
91     if (![attachWindow isVisible])
92         [attachWindow center];
93     [attachTable reloadData];
94     [attachTable setTarget:self];
95     [attachTable setDoubleAction:@selector(attach:)];
96     [attachWindow makeKeyAndOrderFront:sender];
97 }
98
99 - (IBAction)attach:(id)sender
100 {
101     if ([[attachTable selectedRowIndexes] count] != 1)
102         return;
103
104     [attachWindow orderOut:sender];
105
106     unsigned int row = [[attachTable selectedRowIndexes] firstIndex];
107     NSString *key = [[knownServerNames allKeys] objectAtIndex:row];
108
109     // DebuggerDocument will release on close
110     DebuggerDocument *document = [[DebuggerDocument alloc] initWithServerName:key];
111     [document showWindow:sender];
112 }
113
114 #pragma mark -
115 #pragma mark Table View Delegate
116
117 - (int)numberOfRowsInTableView:(NSTableView *)tableView
118 {
119     return [knownServerNames count];
120 }
121
122 - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
123 {
124     return @"";
125 }
126
127 - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row
128 {
129     NSString *key = [[knownServerNames allKeys] objectAtIndex:row];
130     NSMutableDictionary *info = [knownServerNames objectForKey:key];
131     NSString *processName = [info objectForKey:WebScriptDebugServerProcessNameKey];
132     NSImage *icon = [info objectForKey:@"icon"];
133
134     if (!icon) {
135         NSString *path = [[NSWorkspace sharedWorkspace] fullPathForApplication:processName];
136         if (path) icon = [[NSWorkspace sharedWorkspace] iconForFile:path];
137         if (!icon) icon = [[NSWorkspace sharedWorkspace] iconForFileType:@"app"];
138         if (icon) [info setObject:icon forKey:@"icon"];
139         [icon setScalesWhenResized:YES];
140         [icon setSize:NSMakeSize(32, 32)];
141     }
142
143     [cell setImage:icon];
144     [cell setTitle:processName];
145 }
146
147 - (void)tableViewSelectionDidChange:(NSNotification *)notification
148 {
149     [attachButton setEnabled:([[attachTable selectedRowIndexes] count])];
150 }
151 @end