Rubber stamped by Hyatt.
[WebKit-https.git] / WebKit / WebInspector / WebInspectorPanel.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 "WebInspectorPanel.h"
30
31 #import <WebKit/WebView.h>
32 #import <WebKit/WebViewPrivate.h>
33 #import <WebKit/WebDashboardRegion.h>
34 #import <WebKit/DOMCore.h>
35 #import <WebKit/DOMHTML.h>
36 #import <WebKit/DOMCSS.h>
37
38 @implementation WebInspectorPanel
39 - (BOOL)canBecomeKeyWindow
40 {
41     return YES;
42 }
43
44 - (BOOL)canBecomeMainWindow
45 {
46     return YES;
47 }
48
49 - (void)moveWindow:(NSEvent *)event
50 {
51     NSPoint startLocation = [event locationInWindow];
52     NSPoint lastLocation = startLocation;
53     BOOL mouseUpOccurred = NO;
54
55     while (!mouseUpOccurred) {
56         // set mouseUp flag here, but process location of event before exiting from loop, leave mouseUp in queue
57         event = [self nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask) untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode dequeue:YES];
58
59         if ([event type] == NSLeftMouseUp)
60             mouseUpOccurred = YES;
61
62         NSPoint newLocation = [event locationInWindow];
63         if (NSEqualPoints(newLocation, lastLocation))
64             continue;
65
66         NSPoint origin = [self frame].origin;
67         [self setFrameOrigin:NSMakePoint(origin.x + newLocation.x - startLocation.x, origin.y + newLocation.y - startLocation.y)];
68         lastLocation = newLocation;
69     }
70 }
71
72 - (void)resizeWindow:(NSEvent *)event
73 {
74     NSRect startFrame = [self frame];
75     NSPoint startLocation = [self convertBaseToScreen:[event locationInWindow]];
76     NSPoint lastLocation = startLocation;
77     NSSize minSize = [self minSize];
78     NSSize maxSize = [self maxSize];
79     BOOL mouseUpOccurred = NO;
80
81     while (!mouseUpOccurred) {
82         // set mouseUp flag here, but process location of event before exiting from loop, leave mouseUp in queue
83         event = [self nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask) untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode dequeue:YES];
84
85         if ([event type] == NSLeftMouseUp)
86             mouseUpOccurred = YES;
87
88         NSPoint newLocation = [self convertBaseToScreen:[event locationInWindow]];
89         if (NSEqualPoints(newLocation, lastLocation))
90             continue;
91
92         NSRect proposedRect = startFrame;
93         proposedRect.size.width += newLocation.x - startLocation.x;;
94         proposedRect.size.height -= newLocation.y - startLocation.y;
95         proposedRect.origin.y += newLocation.y - startLocation.y;
96
97         if (proposedRect.size.width < minSize.width) {
98             proposedRect.size.width = minSize.width;
99         } else if (proposedRect.size.width > maxSize.width) {
100             proposedRect.size.width = maxSize.width;
101         }
102
103         if (proposedRect.size.height < minSize.height) {
104             proposedRect.origin.y -= minSize.height - proposedRect.size.height;
105             proposedRect.size.height = minSize.height;
106         } else if (proposedRect.size.height > maxSize.height) {
107             proposedRect.origin.y -= maxSize.height - proposedRect.size.height;
108             proposedRect.size.height = maxSize.height;
109         }
110
111         [self setFrame:proposedRect display:YES];
112         lastLocation = newLocation;
113     }
114 }
115
116 - (void)sendEvent:(NSEvent *)event
117 {
118     if (_mouseInRegion && [event type] == NSLeftMouseUp)
119         _mouseInRegion = NO;
120
121     if (([event type] == NSLeftMouseDown || [event type] == NSLeftMouseDragged) && !_mouseInRegion) {
122         NSPoint pointInView = [[[[(WebView *)[self contentView] mainFrame] frameView] documentView] convertPoint:[event locationInWindow] fromView:nil];
123         NSDictionary *regions = [(WebView *)[self contentView] _dashboardRegions];
124
125         WebDashboardRegion *region = [[regions objectForKey:@"resizeTop"] lastObject];
126         region = [[regions objectForKey:@"resize"] lastObject];
127         if (region) {
128             if (NSPointInRect(pointInView, [region dashboardRegionClip])) {
129                 // we are in a resize control region, resize the window now and eat the event
130                 [self resizeWindow:event];
131                 return;
132             }
133         }
134
135         NSArray *controlRegions = [regions objectForKey:@"control"];
136         NSEnumerator *enumerator = [controlRegions objectEnumerator];
137         while ((region = [enumerator nextObject])) {
138             if (NSPointInRect(pointInView, [region dashboardRegionClip])) {
139                 // we are in a control region, lets pass the event down
140                 _mouseInRegion = YES;
141                 [super sendEvent:event];
142                 return;
143             }
144         }
145
146         // if we are dragging and the mouse isn't in a control region move the window
147         if ([event type] == NSLeftMouseDragged) {
148             [self moveWindow:event];
149             return;
150         }
151     }
152
153     [super sendEvent:event];
154 }
155 @end