2006-03-03 Eric Seidel <eseidel@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 TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
45 TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
46
47 // Forward declarations of functions included in this code module:
48 ATOM                MyRegisterClass(HINSTANCE hInstance);
49 BOOL                InitInstance(HINSTANCE, int);
50 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
51 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
52 LRESULT CALLBACK    MyEditProc(HWND, UINT, WPARAM, LPARAM);
53
54 static void resizeSubViews()
55 {
56     RECT rcClient;
57     GetClientRect(hMainWnd, &rcClient);
58     MoveWindow(hURLBarWnd, 0, 0, rcClient.right, URLBAR_HEIGHT, TRUE);
59     MoveWindow(gWebView->windowHandle(), 0, URLBAR_HEIGHT, rcClient.right, rcClient.bottom - URLBAR_HEIGHT, TRUE);
60 }
61
62 int APIENTRY _tWinMain(HINSTANCE hInstance,
63                      HINSTANCE hPrevInstance,
64                      LPTSTR    lpCmdLine,
65                      int       nCmdShow)
66 {
67     UNREFERENCED_PARAMETER(hPrevInstance);
68     UNREFERENCED_PARAMETER(lpCmdLine);
69
70      // TODO: Place code here.
71     MSG msg;
72     HACCEL hAccelTable;
73
74     INITCOMMONCONTROLSEX InitCtrlEx;
75
76     InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
77     InitCtrlEx.dwICC  = ICC_STANDARD_CLASSES;
78     InitCommonControlsEx(&InitCtrlEx);
79
80     // Initialize global strings
81     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
82     LoadString(hInstance, IDC_SPINNERET, szWindowClass, MAX_LOADSTRING);
83     MyRegisterClass(hInstance);
84
85     // Perform application initialization:
86     if (!InitInstance (hInstance, nCmdShow))
87         return FALSE;
88
89     hURLBarWnd = CreateWindow(L"EDIT", 0,
90                         WS_CHILD | WS_VISIBLE  | ES_LEFT | ES_AUTOVSCROLL, 
91                         0, 0, 0, 0,
92                         hMainWnd,
93                         0,
94                         hInstance, 0);
95
96     DefEditProc = GetWindowLong(hURLBarWnd, GWL_WNDPROC);
97     SetWindowLong(hURLBarWnd, GWL_WNDPROC,(long)MyEditProc);
98
99     gWebView = WebView::createWebView(hInstance, hMainWnd);
100     resizeSubViews();
101     ShowWindow(gWebView->windowHandle(), nCmdShow);
102     UpdateWindow(gWebView->windowHandle());
103
104     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SPINNERET));
105
106     // Main message loop:
107     while (GetMessage(&msg, NULL, 0, 0))
108     {
109         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
110         {
111             TranslateMessage(&msg);
112             DispatchMessage(&msg);
113         }
114     }
115
116     return (int) msg.wParam;
117 }
118
119 ATOM MyRegisterClass(HINSTANCE hInstance)
120 {
121     WNDCLASSEX wcex;
122
123     wcex.cbSize = sizeof(WNDCLASSEX);
124
125     wcex.style            = CS_HREDRAW | CS_VREDRAW;
126     wcex.lpfnWndProc    = WndProc;
127     wcex.cbClsExtra        = 0;
128     wcex.cbWndExtra        = 0;
129     wcex.hInstance        = hInstance;
130     wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPINNERET));
131     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
132     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
133     wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_SPINNERET);
134     wcex.lpszClassName    = szWindowClass;
135     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
136
137     return RegisterClassEx(&wcex);
138 }
139
140 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
141 {
142    hInst = hInstance; // Store instance handle in our global variable
143
144    hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
145       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
146
147    if (!hMainWnd)
148       return FALSE;
149
150    ShowWindow(hMainWnd, nCmdShow);
151    UpdateWindow(hMainWnd);
152
153    return TRUE;
154 }
155
156 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
157 {
158     int wmId, wmEvent;
159     PAINTSTRUCT ps;
160     HDC hdc;
161
162     switch (message)
163     {
164     case WM_COMMAND:
165         wmId    = LOWORD(wParam);
166         wmEvent = HIWORD(wParam);
167         // Parse the menu selections:
168         switch (wmId)
169         {
170         case IDM_ABOUT:
171             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
172             break;
173         case IDM_EXIT:
174             DestroyWindow(hWnd);
175             break;
176         default:
177             return DefWindowProc(hWnd, message, wParam, lParam);
178         }
179         break;
180     case WM_PAINT:
181         hdc = BeginPaint(hWnd, &ps);
182         // TODO: Add any drawing code here...
183         EndPaint(hWnd, &ps);
184         break;
185     case WM_DESTROY:
186         PostQuitMessage(0);
187         break;
188     case WM_SIZE:
189         if (!gWebView)
190             break;
191         resizeSubViews();
192         break; 
193     default:
194         return DefWindowProc(hWnd, message, wParam, lParam);
195     }
196     return 0;
197 }
198
199
200 #define MAX_URL_LENGTH  1024
201
202 LRESULT CALLBACK MyEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
203 {
204     switch (message) {
205         case WM_CHAR:
206             if( wParam == 13 ) { // Enter Key
207                 wchar_t strPtr[MAX_URL_LENGTH];
208                 char    cstrPtr[MAX_URL_LENGTH];
209                 *((LPWORD)strPtr) = MAX_URL_LENGTH; 
210                 int strLen = SendMessage(hDlg, EM_GETLINE, 0, (LPARAM)strPtr);
211
212                 MessageBox(hMainWnd, strPtr, L"Foo", MB_OK);
213
214                 int x;
215                 for(x = 0; x < strLen; x++)
216                     cstrPtr[x] = strPtr[x];
217                 cstrPtr[x] = 0;
218     
219                 gWebView->mainFrame()->loadFilePath(cstrPtr);            
220
221                 return 0;
222             } else
223                 return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
224             break;
225         default:
226              return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
227         break;
228     }
229     return 0;
230 }
231
232
233 // Message handler for about box.
234 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
235 {
236     UNREFERENCED_PARAMETER(lParam);
237     switch (message)
238     {
239     case WM_INITDIALOG:
240         return (INT_PTR)TRUE;
241
242     case WM_COMMAND:
243         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
244         {
245             EndDialog(hDlg, LOWORD(wParam));
246             return (INT_PTR)TRUE;
247         }
248         break;
249     }
250     return (INT_PTR)FALSE;
251 }