2006-05-09 Steve Falkenburg <sfalken@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / Spinneret.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 "Spinneret.h"
28 #include "WebView.h"
29 #include "WebFrame.h"
30
31 #include <commctrl.h>
32
33 #define MAX_LOADSTRING 100
34 #define URLBAR_HEIGHT  24
35
36 using namespace WebKit;
37
38 // Global Variables:
39 HINSTANCE hInst;                                // current instance
40 HWND hMainWnd;
41 HWND hURLBarWnd;
42 long DefEditProc;
43 WebView* gWebView = 0;
44 WebHost* gWebHost = 0;
45 TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
46 TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
47
48 // Forward declarations of functions included in this code module:
49 ATOM                MyRegisterClass(HINSTANCE hInstance);
50 BOOL                InitInstance(HINSTANCE, int);
51 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
52 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
53 LRESULT CALLBACK    MyEditProc(HWND, UINT, WPARAM, LPARAM);
54
55 void SpinneretWebHost::updateLocationBar(const char* URL)
56 {
57     SendMessageA(hURLBarWnd, (UINT)WM_SETTEXT, 0, (LPARAM)URL);
58 }
59
60 void SpinneretWebHost::loadEnd(BOOL successful, DWORD error, LPCTSTR errorString)
61 {
62 }
63
64 static void resizeSubViews()
65 {
66     RECT rcClient;
67     GetClientRect(hMainWnd, &rcClient);
68     MoveWindow(hURLBarWnd, 0, 0, rcClient.right, URLBAR_HEIGHT, TRUE);
69     MoveWindow(gWebView->windowHandle(), 0, URLBAR_HEIGHT, rcClient.right, rcClient.bottom - URLBAR_HEIGHT, TRUE);
70 }
71
72 int APIENTRY _tWinMain(HINSTANCE hInstance,
73                      HINSTANCE hPrevInstance,
74                      LPTSTR    lpCmdLine,
75                      int       nCmdShow)
76 {
77 #ifdef _CRTDBG_MAP_ALLOC
78     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
79     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
80 #endif
81
82     UNREFERENCED_PARAMETER(hPrevInstance);
83     UNREFERENCED_PARAMETER(lpCmdLine);
84
85      // TODO: Place code here.
86     MSG msg;
87     HACCEL hAccelTable;
88
89     INITCOMMONCONTROLSEX InitCtrlEx;
90
91     InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
92     InitCtrlEx.dwICC  = ICC_STANDARD_CLASSES;
93     InitCommonControlsEx(&InitCtrlEx);
94
95     // Initialize global strings
96     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
97     LoadString(hInstance, IDC_SPINNERET, szWindowClass, MAX_LOADSTRING);
98     MyRegisterClass(hInstance);
99
100     // Perform application initialization:
101     if (!InitInstance (hInstance, nCmdShow))
102         return FALSE;
103
104     hURLBarWnd = CreateWindow(L"EDIT", 0,
105                         WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 
106                         0, 0, 0, 0,
107                         hMainWnd,
108                         0,
109                         hInstance, 0);
110
111     DefEditProc = GetWindowLong(hURLBarWnd, GWL_WNDPROC);
112     SetWindowLong(hURLBarWnd, GWL_WNDPROC,(long)MyEditProc);
113     SetFocus(hURLBarWnd);
114
115     gWebHost = new SpinneretWebHost();
116     gWebView = WebView::createWebView(hInstance, hMainWnd, gWebHost);
117     gWebView->mainFrame()->loadHTMLString("<p style=\"background-color: #00FF00\">Testing</p><img src=\"http://webkit.opendarwin.org/images/icon-gold.png\" alt=\"Face\"><div style=\"border: solid blue\" contenteditable=\"true\">div with blue border</div><ul><li>foo<li>bar<li>baz</ul>");
118
119     resizeSubViews();
120     ShowWindow(gWebView->windowHandle(), nCmdShow);
121     UpdateWindow(gWebView->windowHandle());
122
123     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SPINNERET));
124
125     // Main message loop:
126     while (GetMessage(&msg, NULL, 0, 0))
127     {
128         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
129         {
130             TranslateMessage(&msg);
131             DispatchMessage(&msg);
132         }
133     }
134
135     delete gWebView;
136 #ifdef _CRTDBG_MAP_ALLOC
137     _CrtDumpMemoryLeaks();
138 #endif
139
140     return (int) msg.wParam;
141 }
142
143 ATOM MyRegisterClass(HINSTANCE hInstance)
144 {
145     WNDCLASSEX wcex;
146
147     wcex.cbSize = sizeof(WNDCLASSEX);
148
149     wcex.style            = CS_HREDRAW | CS_VREDRAW;
150     wcex.lpfnWndProc    = WndProc;
151     wcex.cbClsExtra        = 0;
152     wcex.cbWndExtra        = 0;
153     wcex.hInstance        = hInstance;
154     wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPINNERET));
155     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
156     wcex.hbrBackground    = 0;
157     wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_SPINNERET);
158     wcex.lpszClassName    = szWindowClass;
159     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
160
161     return RegisterClassEx(&wcex);
162 }
163
164 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
165 {
166    hInst = hInstance; // Store instance handle in our global variable
167
168    hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
169       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
170
171    if (!hMainWnd)
172       return FALSE;
173
174    ShowWindow(hMainWnd, nCmdShow);
175    UpdateWindow(hMainWnd);
176
177    return TRUE;
178 }
179
180 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
181 {
182     int wmId, wmEvent;
183     PAINTSTRUCT ps;
184     HDC hdc;
185
186     switch (message)
187     {
188     case WM_COMMAND:
189         wmId    = LOWORD(wParam);
190         wmEvent = HIWORD(wParam);
191         // Parse the menu selections:
192         switch (wmId)
193         {
194         case IDM_ABOUT:
195             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
196             break;
197         case IDM_EXIT:
198             DestroyWindow(hWnd);
199             break;
200         default:
201             return DefWindowProc(hWnd, message, wParam, lParam);
202         }
203         break;
204     case WM_DESTROY:
205         PostQuitMessage(0);
206         break;
207     case WM_SIZE:
208         if (!gWebView)
209             break;
210         resizeSubViews();
211         break; 
212     default:
213         return DefWindowProc(hWnd, message, wParam, lParam);
214     }
215     return 0;
216 }
217
218
219 #define MAX_URL_LENGTH  1024
220
221 LRESULT CALLBACK MyEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
222 {
223     switch (message) {
224         case WM_CHAR:
225             if( wParam == 13 ) { // Enter Key
226                 wchar_t strPtr[MAX_URL_LENGTH];
227                 char    cstrPtr[MAX_URL_LENGTH];
228                 *((LPWORD)strPtr) = MAX_URL_LENGTH; 
229                 int strLen = SendMessage(hDlg, EM_GETLINE, 0, (LPARAM)strPtr);
230
231                 int x;
232                 for(x = 0; x < strLen; x++)
233                     cstrPtr[x] = strPtr[x];
234                 cstrPtr[x] = 0;
235
236                 gWebView->mainFrame()->loadURL(cstrPtr);
237                 SetFocus(gWebView->windowHandle());
238
239                 return 0;
240             } else
241                 return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
242             break;
243         default:
244              return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
245         break;
246     }
247     return 0;
248 }
249
250
251 // Message handler for about box.
252 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
253 {
254     UNREFERENCED_PARAMETER(lParam);
255     switch (message)
256     {
257     case WM_INITDIALOG:
258         return (INT_PTR)TRUE;
259
260     case WM_COMMAND:
261         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
262         {
263             EndDialog(hDlg, LOWORD(wParam));
264             return (INT_PTR)TRUE;
265         }
266         break;
267     }
268     return (INT_PTR)FALSE;
269 }