2006-03-03 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 "WebFrame.h"
30
31 #include "WebView.h"
32 #include "Resource.h"
33 #include "FrameView.h"
34 #include "MouseEvent.h"
35 #include "IntRect.h"
36
37 using namespace WebCore;
38
39 namespace WebKit {
40
41 // FIXME: we need to hang a pointer off the HWND
42 WebView* gSharedWebViewHack = 0;
43
44 class WebView::WebViewPrivate {
45 public:
46     WebViewPrivate() {}
47     ~WebViewPrivate()
48     {
49         delete mainFrame;
50     }
51
52     WebFrame* mainFrame;
53
54     HWND windowHandle;
55 };
56
57 const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";
58
59 LRESULT CALLBACK WebViewWndProc(HWND, UINT, WPARAM, LPARAM);
60
61 static ATOM registerWebViewWithInstance(HINSTANCE hInstance)
62 {
63     static bool haveRegisteredWindowClass = false;
64     if (haveRegisteredWindowClass)
65         return true;
66
67     WNDCLASSEX wcex;
68
69     wcex.cbSize = sizeof(WNDCLASSEX);
70
71     wcex.style          = CS_HREDRAW | CS_VREDRAW; // CS_DBLCLKS?
72     wcex.lpfnWndProc    = WebViewWndProc;
73     wcex.cbClsExtra     = 0;
74     wcex.cbWndExtra     = 0;
75     wcex.hInstance      = hInstance;
76     wcex.hIcon          = 0;
77     wcex.hCursor        = LoadCursor(0, IDC_ARROW);
78     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
79     wcex.lpszMenuName   = 0;
80     wcex.lpszClassName  = kWebViewWindowClassName;
81     wcex.hIconSm        = 0;
82
83     return RegisterClassEx(&wcex);
84 }
85
86 // FIXME: This should eventually just use the DLL instance, I think.
87 WebView* WebView::createWebView(HINSTANCE hInstance, HWND parent)
88 {
89    registerWebViewWithInstance(hInstance);
90
91    HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_BORDER,
92        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);
93    
94    if (!hWnd)
95       return 0;
96
97    gSharedWebViewHack = new WebView(hWnd);
98    return gSharedWebViewHack;
99 }
100
101 WebView::WebView(HWND hWnd)
102 {
103     d = new WebViewPrivate();
104     d->windowHandle = hWnd;
105     d->mainFrame = new WebFrame("dummy", this);
106     d->mainFrame->loadHTMLString("<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>");
107 }
108
109 WebView::~WebView()
110 {
111     delete d;
112 }
113
114 HWND WebView::windowHandle()
115 {
116     return d->windowHandle;
117 }
118
119 WebFrame* WebView::mainFrame()
120 {
121     return d->mainFrame;
122 }
123
124 void WebView::mouseMoved(HWND hWnd, WPARAM wParam, LPARAM lParam)
125 {
126     MouseEvent mouseEvent(hWnd, wParam, lParam, 0);
127     d->mainFrame->viewImpl()->viewportMouseMoveEvent(&mouseEvent);
128 }
129
130 void WebView::mouseDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
131 {
132     MouseEvent mouseEvent(hWnd, wParam, lParam, 1);
133     d->mainFrame->viewImpl()->viewportMousePressEvent(&mouseEvent);
134 }
135
136 void WebView::mouseUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
137 {
138     MouseEvent mouseEvent(hWnd, wParam, lParam, 1);
139     d->mainFrame->viewImpl()->viewportMouseReleaseEvent(&mouseEvent);
140 }
141
142 void WebView::mouseDoubleClick(HWND hWnd, WPARAM wParam, LPARAM lParam)
143 {
144     MouseEvent mouseEvent(hWnd, wParam, lParam, 2);
145     d->mainFrame->viewImpl()->viewportMouseReleaseEvent(&mouseEvent);
146 }
147
148 LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
149 {
150     int wmId, wmEvent;
151     switch (message)
152     {
153     case WM_PAINT:
154         gSharedWebViewHack->mainFrame()->paint();
155         break;
156     case WM_DESTROY:
157         // Do nothing?
158         break;
159     case WM_MOUSEMOVE:
160         gSharedWebViewHack->mouseMoved(hWnd, wParam, lParam);
161         break;
162     case WM_LBUTTONDOWN:
163     case WM_MBUTTONDOWN:
164     case WM_RBUTTONDOWN:
165         gSharedWebViewHack->mouseDown(hWnd, wParam, lParam);
166         break;
167     case WM_LBUTTONUP:
168     case WM_MBUTTONUP:
169     case WM_RBUTTONUP:
170         gSharedWebViewHack->mouseUp(hWnd, wParam, lParam);
171         break;
172     case WM_LBUTTONDBLCLK:
173     case WM_MBUTTONDBLCLK:
174     case WM_RBUTTONDBLCLK:
175         gSharedWebViewHack->mouseDoubleClick(hWnd, wParam, lParam);
176         break;
177     case WM_SIZE:
178         // FIXME: not sure if we need anything here...
179     default:
180         return DefWindowProc(hWnd, message, wParam, lParam);
181     }
182     return 0;
183 }
184
185
186 };