WebCore:
[WebKit-https.git] / WebKit / mac / Plugins / WebNetscapePluginEventHandlerCocoa.mm
1 /*
2  * Copyright (C) 2008 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #if ENABLE(NETSCAPE_PLUGIN_API)
27
28 #import "WebNetscapePluginEventHandlerCocoa.h"
29
30 #import "WebBaseNetscapePluginViewInternal.h"
31
32 WebNetscapePluginEventHandlerCocoa::WebNetscapePluginEventHandlerCocoa(WebBaseNetscapePluginView* pluginView)
33     : WebNetscapePluginEventHandler(pluginView)
34 {
35 }
36
37 void WebNetscapePluginEventHandlerCocoa::drawRect(const NSRect& rect)
38 {
39     NPCocoaEvent event;
40     
41     event.type = NPCocoaEventDrawRect;
42     event.event.draw.x = rect.origin.x;
43     event.event.draw.y = rect.origin.y;
44     event.event.draw.width = rect.size.width;
45     event.event.draw.height = rect.size.height;
46     
47     sendEvent(&event);
48 }
49
50 void WebNetscapePluginEventHandlerCocoa::mouseDown(NSEvent *event)
51 {
52     sendMouseEvent(event, NPCocoaEventMouseDown);
53 }
54
55 void WebNetscapePluginEventHandlerCocoa::mouseDragged(NSEvent *event)
56 {
57     sendMouseEvent(event, NPCocoaEventMouseDragged);
58 }
59
60 void WebNetscapePluginEventHandlerCocoa::mouseEntered(NSEvent *event)
61 {
62     sendMouseEvent(event, NPCocoaEventMouseEntered);
63 }
64
65 void WebNetscapePluginEventHandlerCocoa::mouseExited(NSEvent *event)
66 {
67     sendMouseEvent(event, NPCocoaEventMouseExited);
68 }
69
70 void WebNetscapePluginEventHandlerCocoa::mouseMoved(NSEvent *event)
71 {
72     sendMouseEvent(event, NPCocoaEventMouseMoved);
73 }
74
75 void WebNetscapePluginEventHandlerCocoa::mouseUp(NSEvent *event)
76 {
77     sendMouseEvent(event, NPCocoaEventMouseUp);
78 }
79
80 bool WebNetscapePluginEventHandlerCocoa::scrollWheel(NSEvent* event)
81 {
82     return sendMouseEvent(event, NPCocoaEventScrollWheel);
83 }
84
85 bool WebNetscapePluginEventHandlerCocoa::sendMouseEvent(NSEvent *nsEvent, NPCocoaEventType type)
86 {
87     NPCocoaEvent event;
88     
89     NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil];
90     
91     event.type = type;
92     event.event.mouse.modifierFlags = [nsEvent modifierFlags];
93     event.event.mouse.buttonNumber = [nsEvent buttonNumber];
94     event.event.mouse.pluginX = point.x;
95     event.event.mouse.pluginY = point.y;
96     event.event.mouse.deltaX = [nsEvent deltaX];
97     event.event.mouse.deltaY = [nsEvent deltaY];
98     event.event.mouse.deltaZ = [nsEvent deltaZ];
99     
100     return sendEvent(&event);
101 }
102
103 void WebNetscapePluginEventHandlerCocoa::keyDown(NSEvent *event)
104 {
105     sendKeyEvent(event, NPCocoaEventKeyDown);
106 }
107
108 void WebNetscapePluginEventHandlerCocoa::keyUp(NSEvent *event)
109 {
110     sendKeyEvent(event, NPCocoaEventKeyUp);
111 }
112
113 void WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent)
114 {
115     NPCocoaEvent event;
116     
117     NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil];
118     
119     event.type = NPCocoaEventFlagsChanged;
120     event.event.key.modifierFlags = [nsEvent modifierFlags];
121     event.event.key.pluginX = point.x;
122     event.event.key.pluginY = point.y;
123     event.event.key.keyCode = [nsEvent keyCode];
124     event.event.key.isARepeat = false;
125     event.event.key.characters = 0;
126     event.event.key.charactersIgnoringModifiers = 0;
127     
128     sendEvent(&event);
129 }
130
131 void WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type)
132 {
133     NPCocoaEvent event;
134     
135     NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil];
136     
137     event.type = type;
138     event.event.key.modifierFlags = [nsEvent modifierFlags];
139     event.event.key.pluginX = point.x;
140     event.event.key.pluginY = point.y;
141     event.event.key.keyCode = [nsEvent keyCode];
142     event.event.key.isARepeat = [nsEvent isARepeat];
143     event.event.key.characters = (NPNSString *)[nsEvent characters];
144     event.event.key.charactersIgnoringModifiers = (NPNSString *)[nsEvent charactersIgnoringModifiers];
145      
146     sendEvent(&event);
147 }
148
149 void WebNetscapePluginEventHandlerCocoa::windowFocusChanged(bool hasFocus)
150 {
151     NPCocoaEvent event;
152     
153     event.type = NPCocoaEventWindowFocusChanged;
154     event.event.focus.hasFocus = hasFocus;
155     
156     sendEvent(&event);
157 }
158
159 void WebNetscapePluginEventHandlerCocoa::focusChanged(bool hasFocus)
160 {
161     NPCocoaEvent event;
162     
163     event.type = NPCocoaEventFocusChanged;
164     event.event.focus.hasFocus = hasFocus;
165     
166     sendEvent(&event);
167 }
168
169 void* WebNetscapePluginEventHandlerCocoa::platformWindow(NSWindow* window)
170 {
171     return window;
172 }
173
174 bool WebNetscapePluginEventHandlerCocoa::sendEvent(NPCocoaEvent* event)
175 {
176     switch (event->type) {
177         case NPCocoaEventMouseDown:
178         case NPCocoaEventMouseUp:
179         case NPCocoaEventMouseDragged:
180         case NPCocoaEventKeyDown:
181         case NPCocoaEventKeyUp:
182         case NPCocoaEventFlagsChanged:
183         case NPCocoaEventScrollWheel:
184             m_currentEventIsUserGesture = true;
185             break;
186         default:
187             m_currentEventIsUserGesture = false;
188     }
189             
190     bool result = [m_pluginView sendEvent:event isDrawRect:event->type == NPCocoaEventDrawRect];
191     
192     m_currentEventIsUserGesture = false;
193     return result;
194 }
195
196 #endif // ENABLE(NETSCAPE_PLUGIN_API)