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