2006-03-02 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / WebView.cpp
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  * 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 COMPUTER, 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 COMPUTER, 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 #include "stdafx.h"
27 #include "config.h"
28
29 #include "WebView.h"
30 #include "Resource.h"
31
32 #include "FrameView.h"
33 #include "FrameWin.h"
34 #include "GraphicsContext.h"
35 #include "MouseEvent.h"
36 #include "Page.h"
37 #include "render_frames.h"
38
39
40 using namespace WebCore;
41
42 namespace WebKit {
43
44 // FIXME: we need to hang a pointer off the HWND
45 WebView* gSharedWebViewHack = 0;
46
47 class WebView::WebViewPrivate {
48 public:
49     WebViewPrivate() {}
50     ~WebViewPrivate()
51     {
52         delete frame;
53     }
54
55     FrameWin* frame;
56     FrameView* frameView;
57     HWND windowHandle;
58 };
59
60 const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";
61
62 LRESULT CALLBACK WebViewWndProc(HWND, UINT, WPARAM, LPARAM);
63
64 static ATOM registerWebViewWithInstance(HINSTANCE hInstance)
65 {
66     static bool haveRegisteredWindowClass = false;
67     if (haveRegisteredWindowClass)
68         return true;
69
70     WNDCLASSEX wcex;
71
72     wcex.cbSize = sizeof(WNDCLASSEX);
73
74     wcex.style          = CS_HREDRAW | CS_VREDRAW; // CS_DBLCLKS?
75     wcex.lpfnWndProc    = WebViewWndProc;
76     wcex.cbClsExtra     = 0;
77     wcex.cbWndExtra     = 0;
78     wcex.hInstance      = hInstance;
79     wcex.hIcon          = 0;
80     wcex.hCursor        = LoadCursor(0, IDC_ARROW);
81     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
82     wcex.lpszMenuName   = 0;
83     wcex.lpszClassName  = kWebViewWindowClassName;
84     wcex.hIconSm        = 0;
85
86     return RegisterClassEx(&wcex);
87 }
88
89 // FIXME: This should eventually just use the DLL instance, I think.
90 WebView* WebView::createWebView(HINSTANCE hInstance, HWND parent)
91 {
92    registerWebViewWithInstance(hInstance);
93
94    HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_BORDER,
95        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);
96    
97    if (!hWnd)
98       return 0;
99
100    gSharedWebViewHack = new WebView(hWnd);
101    return gSharedWebViewHack;
102 }
103
104 WebView::WebView(HWND hWnd)
105 {
106     d = new WebViewPrivate();
107     d->windowHandle = hWnd;
108
109     Page *page = new Page();
110     d->frame = new FrameWin(page, 0);
111     d->frameView = new FrameView(d->frame);
112     d->frame->setView(d->frameView);
113
114     d->frame->begin();
115     d->frame->write("<img src=\"data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7\" alt=\"Larry\"><div style=\"border: 1px black\">foo</div><ul><li>foo<li>bar<li>baz</ul>");
116     d->frame->end();
117 }
118
119 WebView::~WebView()
120 {
121     delete d;
122 }
123
124 void WebView::drawRect(const PAINTSTRUCT& ps)
125 {
126     GraphicsContext context(ps.hdc);
127     d->frame->paint(&context, ps.rcPaint);
128 }
129
130 HWND WebView::windowHandle()
131 {
132     return d->windowHandle;
133 }
134
135 void WebView::mouseMoved(HWND hWnd, WPARAM wParam, LPARAM lParam)
136 {
137     MouseEvent mouseEvent(hWnd, wParam, lParam, 0);
138     d->frameView->viewportMouseMoveEvent(&mouseEvent);
139 }
140
141 void WebView::mouseDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
142 {
143     MouseEvent mouseEvent(hWnd, wParam, lParam, 1);
144     d->frameView->viewportMousePressEvent(&mouseEvent);
145 }
146
147 void WebView::mouseUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
148 {
149     MouseEvent mouseEvent(hWnd, wParam, lParam, 1);
150     d->frameView->viewportMouseReleaseEvent(&mouseEvent);
151 }
152
153 void WebView::mouseDoubleClick(HWND hWnd, WPARAM wParam, LPARAM lParam)
154 {
155     MouseEvent mouseEvent(hWnd, wParam, lParam, 2);
156     d->frameView->viewportMouseReleaseEvent(&mouseEvent);
157 }
158
159 LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
160 {
161     int wmId, wmEvent;
162     HDC hdc;
163
164     switch (message)
165     {
166     case WM_COMMAND:
167         wmId    = LOWORD(wParam);
168         wmEvent = HIWORD(wParam);
169         // Parse the menu selections:
170         switch (wmId)
171         {
172         case IDM_EXIT:
173             DestroyWindow(hWnd);
174             break;
175         default:
176             return DefWindowProc(hWnd, message, wParam, lParam);
177         }
178         break;
179     case WM_PAINT:
180         PAINTSTRUCT ps;
181         hdc = BeginPaint(hWnd, &ps);
182         gSharedWebViewHack->drawRect(ps);
183         EndPaint(hWnd, &ps);
184         break;
185     case WM_DESTROY:
186         // Do nothing?
187         break;
188     case WM_MOUSEMOVE:
189         gSharedWebViewHack->mouseMoved(hWnd, wParam, lParam);
190         break;
191     case WM_LBUTTONDOWN:
192     case WM_MBUTTONDOWN:
193     case WM_RBUTTONDOWN:
194         gSharedWebViewHack->mouseDown(hWnd, wParam, lParam);
195         break;
196     case WM_LBUTTONUP:
197     case WM_MBUTTONUP:
198     case WM_RBUTTONUP:
199         gSharedWebViewHack->mouseUp(hWnd, wParam, lParam);
200         break;
201     case WM_LBUTTONDBLCLK:
202     case WM_MBUTTONDBLCLK:
203     case WM_RBUTTONDBLCLK:
204         gSharedWebViewHack->mouseDoubleClick(hWnd, wParam, lParam);
205         break;
206     default:
207         return DefWindowProc(hWnd, message, wParam, lParam);
208     }
209     return 0;
210 }
211
212
213 };