2006-03-01 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / WebView.cpp
1 /*\r
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.\r
3  *\r
4  * Redistribution and use in source and binary forms, with or without\r
5  * modification, are permitted provided that the following conditions\r
6  * are met:\r
7  * 1. Redistributions of source code must retain the above copyright\r
8  *    notice, this list of conditions and the following disclaimer.\r
9  * 2. Redistributions in binary form must reproduce the above copyright\r
10  *    notice, this list of conditions and the following disclaimer in the\r
11  *    documentation and/or other materials provided with the distribution.\r
12  *\r
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY\r
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR\r
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\r
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
24  */\r
25 \r
26 #include "stdafx.h"\r
27 #include "config.h"\r
28 \r
29 #include "WebView.h"\r
30 #include "Resource.h"\r
31 \r
32 #include "FrameWin.h"\r
33 #include "FrameView.h"\r
34 #include "Page.h"\r
35 #include "render_frames.h"\r
36 #include "GraphicsContext.h"\r
37 \r
38 \r
39 using namespace WebCore;\r
40 \r
41 namespace WebKit {\r
42 \r
43 // FIXME: we need to hang a pointer off the HWND\r
44 WebView* gSharedWebViewHack = 0;\r
45 \r
46 class WebView::WebViewPrivate {\r
47 public:\r
48     WebViewPrivate() {}\r
49     ~WebViewPrivate()\r
50     {\r
51         delete frame;\r
52     }\r
53 \r
54     FrameWin* frame;\r
55     HWND windowHandle;\r
56 };\r
57 \r
58 const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";\r
59 \r
60 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);\r
61 \r
62 static ATOM registerWebViewWithInstance(HINSTANCE hInstance)\r
63 {\r
64     static bool haveRegisteredWindowClass = false;\r
65     if (haveRegisteredWindowClass)\r
66         return true;\r
67 \r
68     WNDCLASSEX wcex;\r
69 \r
70     wcex.cbSize = sizeof(WNDCLASSEX);\r
71 \r
72     wcex.style          = CS_HREDRAW | CS_VREDRAW; // CS_DBLCLKS?\r
73     wcex.lpfnWndProc    = WndProc;\r
74     wcex.cbClsExtra     = 0;\r
75     wcex.cbWndExtra     = 0;\r
76     wcex.hInstance      = hInstance;\r
77     wcex.hIcon          = 0;\r
78     wcex.hCursor        = LoadCursor(0, IDC_ARROW);\r
79     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);\r
80     wcex.lpszMenuName   = 0;\r
81     wcex.lpszClassName  = kWebViewWindowClassName;\r
82     wcex.hIconSm        = 0;\r
83 \r
84     return RegisterClassEx(&wcex);\r
85 }\r
86 \r
87 // FIXME: This should eventually just use the DLL instance, I think.\r
88 WebView* WebView::createWebView(HINSTANCE hInstance, HWND parent)\r
89 {\r
90    registerWebViewWithInstance(hInstance);\r
91 \r
92    HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_BORDER,\r
93        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);\r
94    \r
95    if (!hWnd)\r
96       return 0;\r
97 \r
98    gSharedWebViewHack = new WebView(hWnd);\r
99    return gSharedWebViewHack;\r
100 }\r
101 \r
102 WebView::WebView(HWND hWnd)\r
103 {\r
104     d = new WebViewPrivate();\r
105     d->windowHandle = hWnd;\r
106 \r
107     Page *page = new Page();\r
108     d->frame = new FrameWin(page, 0);\r
109     FrameView *frameView = new FrameView(d->frame);\r
110     d->frame->setView(frameView);\r
111 \r
112     d->frame->begin();\r
113     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>");\r
114     d->frame->end();\r
115 }\r
116 \r
117 WebView::~WebView()\r
118 {\r
119     delete d;\r
120 }\r
121 \r
122 void WebView::drawRect(const PAINTSTRUCT& ps)\r
123 {\r
124     GraphicsContext context(ps.hdc);\r
125     d->frame->paint(&context, ps.rcPaint);\r
126 }\r
127 \r
128 HWND WebView::windowHandle()\r
129 {\r
130     return d->windowHandle;\r
131 }\r
132 \r
133 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
134 {\r
135     int wmId, wmEvent;\r
136     HDC hdc;\r
137 \r
138     switch (message)\r
139     {\r
140     case WM_COMMAND:\r
141         wmId    = LOWORD(wParam);\r
142         wmEvent = HIWORD(wParam);\r
143         // Parse the menu selections:\r
144         switch (wmId)\r
145         {\r
146         case IDM_EXIT:\r
147             DestroyWindow(hWnd);\r
148             break;\r
149         default:\r
150             return DefWindowProc(hWnd, message, wParam, lParam);\r
151         }\r
152         break;\r
153     case WM_PAINT:\r
154         PAINTSTRUCT ps;\r
155         hdc = BeginPaint(hWnd, &ps);\r
156         // TODO: Add any drawing code here...\r
157         gSharedWebViewHack->drawRect(ps);\r
158         EndPaint(hWnd, &ps);\r
159         break;\r
160     case WM_DESTROY:\r
161         // Do nothing?\r
162         break;\r
163     default:\r
164         return DefWindowProc(hWnd, message, wParam, lParam);\r
165     }\r
166     return 0;\r
167 }\r
168 \r
169 \r
170 };\r