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 \r
113 WebView::~WebView()\r
114 {\r
115     \r
116 }\r
117 \r
118 void WebView::drawRect(const RECT& dirtyRect)\r
119 {\r
120     GraphicsContext context;\r
121     d->frame->paint(&context, dirtyRect);\r
122 }\r
123 \r
124 HWND WebView::windowHandle()\r
125 {\r
126     return d->windowHandle;\r
127 }\r
128 \r
129 //\r
130 //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)\r
131 //\r
132 //  PURPOSE:  Processes messages for the main window.\r
133 //\r
134 //  WM_COMMAND    - process the application menu\r
135 //  WM_PAINT    - Paint the main window\r
136 //  WM_DESTROY    - post a quit message and return\r
137 //\r
138 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
139 {\r
140     int wmId, wmEvent;\r
141     HDC hdc;\r
142 \r
143     switch (message)\r
144     {\r
145     case WM_COMMAND:\r
146         wmId    = LOWORD(wParam);\r
147         wmEvent = HIWORD(wParam);\r
148         // Parse the menu selections:\r
149         switch (wmId)\r
150         {\r
151         case IDM_EXIT:\r
152             DestroyWindow(hWnd);\r
153             break;\r
154         default:\r
155             return DefWindowProc(hWnd, message, wParam, lParam);\r
156         }\r
157         break;\r
158     case WM_PAINT:\r
159         PAINTSTRUCT ps;\r
160         hdc = BeginPaint(hWnd, &ps);\r
161         // TODO: Add any drawing code here...\r
162         gSharedWebViewHack->drawRect(ps.rcPaint);\r
163         EndPaint(hWnd, &ps);\r
164         break;\r
165     case WM_DESTROY:\r
166         // Do nothing?\r
167         break;\r
168     default:\r
169         return DefWindowProc(hWnd, message, wParam, lParam);\r
170     }\r
171     return 0;\r
172 }\r
173 \r
174 \r
175 };\r