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