2006-03-01 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / Spinneret.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 "Spinneret.h"\r
28 #include "WebView.h"\r
29 \r
30 #define MAX_LOADSTRING 100\r
31 \r
32 using namespace WebKit;\r
33 \r
34 // Global Variables:\r
35 HINSTANCE hInst;                                // current instance\r
36 HWND hMainWnd;\r
37 WebView* gWebView = 0;\r
38 TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text\r
39 TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name\r
40 \r
41 // Forward declarations of functions included in this code module:\r
42 ATOM                MyRegisterClass(HINSTANCE hInstance);\r
43 BOOL                InitInstance(HINSTANCE, int);\r
44 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);\r
45 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);\r
46 \r
47 int APIENTRY _tWinMain(HINSTANCE hInstance,\r
48                      HINSTANCE hPrevInstance,\r
49                      LPTSTR    lpCmdLine,\r
50                      int       nCmdShow)\r
51 {\r
52     UNREFERENCED_PARAMETER(hPrevInstance);\r
53     UNREFERENCED_PARAMETER(lpCmdLine);\r
54 \r
55      // TODO: Place code here.\r
56     MSG msg;\r
57     HACCEL hAccelTable;\r
58 \r
59     // Initialize global strings\r
60     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);\r
61     LoadString(hInstance, IDC_SPINNERET, szWindowClass, MAX_LOADSTRING);\r
62     MyRegisterClass(hInstance);\r
63 \r
64     // Perform application initialization:\r
65     if (!InitInstance (hInstance, nCmdShow))\r
66         return FALSE;\r
67 \r
68     gWebView = WebView::createWebView(hInstance, hMainWnd);\r
69     ShowWindow(gWebView->windowHandle(), nCmdShow);\r
70     UpdateWindow(gWebView->windowHandle());    \r
71 \r
72     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SPINNERET));\r
73 \r
74     // Main message loop:\r
75     while (GetMessage(&msg, NULL, 0, 0))\r
76     {\r
77         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))\r
78         {\r
79             TranslateMessage(&msg);\r
80             DispatchMessage(&msg);\r
81         }\r
82     }\r
83 \r
84     return (int) msg.wParam;\r
85 }\r
86 \r
87 \r
88 \r
89 //\r
90 //  FUNCTION: MyRegisterClass()\r
91 //\r
92 //  PURPOSE: Registers the window class.\r
93 //\r
94 //  COMMENTS:\r
95 //\r
96 //    This function and its usage are only necessary if you want this code\r
97 //    to be compatible with Win32 systems prior to the 'RegisterClassEx'\r
98 //    function that was added to Windows 95. It is important to call this function\r
99 //    so that the application will get 'well formed' small icons associated\r
100 //    with it.\r
101 //\r
102 ATOM MyRegisterClass(HINSTANCE hInstance)\r
103 {\r
104     WNDCLASSEX wcex;\r
105 \r
106     wcex.cbSize = sizeof(WNDCLASSEX);\r
107 \r
108     wcex.style            = CS_HREDRAW | CS_VREDRAW;\r
109     wcex.lpfnWndProc    = WndProc;\r
110     wcex.cbClsExtra        = 0;\r
111     wcex.cbWndExtra        = 0;\r
112     wcex.hInstance        = hInstance;\r
113     wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPINNERET));\r
114     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);\r
115     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);\r
116     wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_SPINNERET);\r
117     wcex.lpszClassName    = szWindowClass;\r
118     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));\r
119 \r
120     return RegisterClassEx(&wcex);\r
121 }\r
122 \r
123 //\r
124 //   FUNCTION: InitInstance(HINSTANCE, int)\r
125 //\r
126 //   PURPOSE: Saves instance handle and creates main window\r
127 //\r
128 //   COMMENTS:\r
129 //\r
130 //        In this function, we save the instance handle in a global variable and\r
131 //        create and display the main program window.\r
132 //\r
133 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)\r
134 {\r
135    hInst = hInstance; // Store instance handle in our global variable\r
136 \r
137    hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,\r
138       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);\r
139 \r
140    if (!hMainWnd)\r
141       return FALSE;\r
142 \r
143    ShowWindow(hMainWnd, nCmdShow);\r
144    UpdateWindow(hMainWnd);\r
145 \r
146    return TRUE;\r
147 }\r
148 \r
149 //\r
150 //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)\r
151 //\r
152 //  PURPOSE:  Processes messages for the main window.\r
153 //\r
154 //  WM_COMMAND    - process the application menu\r
155 //  WM_PAINT    - Paint the main window\r
156 //  WM_DESTROY    - post a quit message and return\r
157 //\r
158 //\r
159 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
160 {\r
161     int wmId, wmEvent;\r
162     PAINTSTRUCT ps;\r
163     HDC hdc;\r
164 \r
165     switch (message)\r
166     {\r
167     case WM_COMMAND:\r
168         wmId    = LOWORD(wParam);\r
169         wmEvent = HIWORD(wParam);\r
170         // Parse the menu selections:\r
171         switch (wmId)\r
172         {\r
173         case IDM_ABOUT:\r
174             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);\r
175             break;\r
176         case IDM_EXIT:\r
177             DestroyWindow(hWnd);\r
178             break;\r
179         default:\r
180             return DefWindowProc(hWnd, message, wParam, lParam);\r
181         }\r
182         break;\r
183     case WM_PAINT:\r
184         hdc = BeginPaint(hWnd, &ps);\r
185         // TODO: Add any drawing code here...\r
186         EndPaint(hWnd, &ps);\r
187         break;\r
188     case WM_DESTROY:\r
189         PostQuitMessage(0);\r
190         break;\r
191     case WM_SIZE:\r
192         if (!gWebView)\r
193             break;\r
194         // Get the dimensions of the main window's client \r
195         // area, and enumerate the child windows. Pass the \r
196         // dimensions to the child windows during enumeration. \r
197 \r
198         RECT rcClient;\r
199         GetClientRect(hWnd, &rcClient); \r
200         MoveWindow(gWebView->windowHandle(), \r
201                    0, 0, rcClient.right, rcClient.bottom, \r
202                    TRUE);\r
203         ShowWindow(gWebView->windowHandle(), SW_SHOW); \r
204         break; \r
205     default:\r
206         return DefWindowProc(hWnd, message, wParam, lParam);\r
207     }\r
208     return 0;\r
209 }\r
210 \r
211 // Message handler for about box.\r
212 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
213 {\r
214     UNREFERENCED_PARAMETER(lParam);\r
215     switch (message)\r
216     {\r
217     case WM_INITDIALOG:\r
218         return (INT_PTR)TRUE;\r
219 \r
220     case WM_COMMAND:\r
221         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)\r
222         {\r
223             EndDialog(hDlg, LOWORD(wParam));\r
224             return (INT_PTR)TRUE;\r
225         }\r
226         break;\r
227     }\r
228     return (INT_PTR)FALSE;\r
229 }\r