884bc1f4b6acd99420dc59a363b6cba8bced60cb
[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     [attachWindow makeKeyAndOrderFront:sender];
95 }
96
97 - (IBAction)attach:(id)sender
98 {
99     if ([[attachTable selectedRowIndexes] count] != 1)
100         return;
101
102     [attachWindow orderOut:sender];
103
104     unsigned int row = [[attachTable selectedRowIndexes] firstIndex];
105     NSString *key = [[knownServerNames allKeys] objectAtIndex:row];
106
107     // DebuggerDocument will release on close
108     DebuggerDocument *document = [[DebuggerDocument alloc] initWithServerName:key];
109     [document showWindow:sender];
110 }
111
112 #pragma mark -
113 #pragma mark Table View Delegate
114
115 - (int)numberOfRowsInTableView:(NSTableView *)tableView
116 {
117     return [knownServerNames count];
118 }
119
120 - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
121 {
122     return @"";
123 }
124
125 - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row
126 {
127     NSString *key = [[knownServerNames allKeys] objectAtIndex:row];
128     NSMutableDictionary *info = [knownServerNames objectForKey:key];
129     NSString *processName = [info objectForKey:WebScriptDebugServerProcessNameKey];
130     NSImage *icon = [info objectForKey:@"icon"];
131
132     if (!icon) {
133         NSString *path = [[NSWorkspace sharedWorkspace] fullPathForApplication:processName];
134         if (path) icon = [[NSWorkspace sharedWorkspace] iconForFile:path];
135         if (!icon) icon = [[NSWorkspace sharedWorkspace] iconForFileType:@"app"];
136         if (icon) [info setObject:icon forKey:@"icon"];
137         [icon setScalesWhenResized:YES];
138         [icon setSize:NSMakeSize(32, 32)];
139     }
140
141     [cell setImage:icon];
142     [cell setTitle:processName];
143 }
144
145 - (void)tableViewSelectionDidChange:(NSNotification *)notification
146 {
147     [attachButton setEnabled:([[attachTable selectedRowIndexes] count])];
148 }
149 @end