2006-03-03 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / Spinneret.cpp
index a90045cd2a7f06fb46cede20a13fe413f58cd457..17d0b4065623aa1edb3b255359e431e53c2a0f44 100755 (executable)
-/*\r
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * 1. Redistributions of source code must retain the above copyright\r
- *    notice, this list of conditions and the following disclaimer.\r
- * 2. Redistributions in binary form must reproduce the above copyright\r
- *    notice, this list of conditions and the following disclaimer in the\r
- *    documentation and/or other materials provided with the distribution.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY\r
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR\r
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\r
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
- */\r
-\r
-#include "stdafx.h"\r
-#include "Spinneret.h"\r
-#include "WebView.h"\r
-\r
-#define MAX_LOADSTRING 100\r
-\r
-using namespace WebKit;\r
-\r
-// Global Variables:\r
-HINSTANCE hInst;                                // current instance\r
-HWND hMainWnd;\r
-WebView* gWebView = 0;\r
-TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text\r
-TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name\r
-\r
-// Forward declarations of functions included in this code module:\r
-ATOM                MyRegisterClass(HINSTANCE hInstance);\r
-BOOL                InitInstance(HINSTANCE, int);\r
-LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);\r
-INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);\r
-\r
-int APIENTRY _tWinMain(HINSTANCE hInstance,\r
-                     HINSTANCE hPrevInstance,\r
-                     LPTSTR    lpCmdLine,\r
-                     int       nCmdShow)\r
-{\r
-    UNREFERENCED_PARAMETER(hPrevInstance);\r
-    UNREFERENCED_PARAMETER(lpCmdLine);\r
-\r
-     // TODO: Place code here.\r
-    MSG msg;\r
-    HACCEL hAccelTable;\r
-\r
-    // Initialize global strings\r
-    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);\r
-    LoadString(hInstance, IDC_SPINNERET, szWindowClass, MAX_LOADSTRING);\r
-    MyRegisterClass(hInstance);\r
-\r
-    // Perform application initialization:\r
-    if (!InitInstance (hInstance, nCmdShow))\r
-        return FALSE;\r
-\r
-    gWebView = WebView::createWebView(hInstance, hMainWnd);\r
-    ShowWindow(gWebView->windowHandle(), nCmdShow);\r
-    UpdateWindow(gWebView->windowHandle());    \r
-\r
-    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SPINNERET));\r
-\r
-    // Main message loop:\r
-    while (GetMessage(&msg, NULL, 0, 0))\r
-    {\r
-        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))\r
-        {\r
-            TranslateMessage(&msg);\r
-            DispatchMessage(&msg);\r
-        }\r
-    }\r
-\r
-    return (int) msg.wParam;\r
-}\r
-\r
-\r
-\r
-//\r
-//  FUNCTION: MyRegisterClass()\r
-//\r
-//  PURPOSE: Registers the window class.\r
-//\r
-//  COMMENTS:\r
-//\r
-//    This function and its usage are only necessary if you want this code\r
-//    to be compatible with Win32 systems prior to the 'RegisterClassEx'\r
-//    function that was added to Windows 95. It is important to call this function\r
-//    so that the application will get 'well formed' small icons associated\r
-//    with it.\r
-//\r
-ATOM MyRegisterClass(HINSTANCE hInstance)\r
-{\r
-    WNDCLASSEX wcex;\r
-\r
-    wcex.cbSize = sizeof(WNDCLASSEX);\r
-\r
-    wcex.style            = CS_HREDRAW | CS_VREDRAW;\r
-    wcex.lpfnWndProc    = WndProc;\r
-    wcex.cbClsExtra        = 0;\r
-    wcex.cbWndExtra        = 0;\r
-    wcex.hInstance        = hInstance;\r
-    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPINNERET));\r
-    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);\r
-    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);\r
-    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_SPINNERET);\r
-    wcex.lpszClassName    = szWindowClass;\r
-    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));\r
-\r
-    return RegisterClassEx(&wcex);\r
-}\r
-\r
-//\r
-//   FUNCTION: InitInstance(HINSTANCE, int)\r
-//\r
-//   PURPOSE: Saves instance handle and creates main window\r
-//\r
-//   COMMENTS:\r
-//\r
-//        In this function, we save the instance handle in a global variable and\r
-//        create and display the main program window.\r
-//\r
-BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)\r
-{\r
-   hInst = hInstance; // Store instance handle in our global variable\r
-\r
-   hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,\r
-      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);\r
-\r
-   if (!hMainWnd)\r
-      return FALSE;\r
-\r
-   ShowWindow(hMainWnd, nCmdShow);\r
-   UpdateWindow(hMainWnd);\r
-\r
-   return TRUE;\r
-}\r
-\r
-//\r
-//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)\r
-//\r
-//  PURPOSE:  Processes messages for the main window.\r
-//\r
-//  WM_COMMAND    - process the application menu\r
-//  WM_PAINT    - Paint the main window\r
-//  WM_DESTROY    - post a quit message and return\r
-//\r
-//\r
-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
-    int wmId, wmEvent;\r
-    PAINTSTRUCT ps;\r
-    HDC hdc;\r
-\r
-    switch (message)\r
-    {\r
-    case WM_COMMAND:\r
-        wmId    = LOWORD(wParam);\r
-        wmEvent = HIWORD(wParam);\r
-        // Parse the menu selections:\r
-        switch (wmId)\r
-        {\r
-        case IDM_ABOUT:\r
-            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);\r
-            break;\r
-        case IDM_EXIT:\r
-            DestroyWindow(hWnd);\r
-            break;\r
-        default:\r
-            return DefWindowProc(hWnd, message, wParam, lParam);\r
-        }\r
-        break;\r
-    case WM_PAINT:\r
-        hdc = BeginPaint(hWnd, &ps);\r
-        // TODO: Add any drawing code here...\r
-        EndPaint(hWnd, &ps);\r
-        break;\r
-    case WM_DESTROY:\r
-        PostQuitMessage(0);\r
-        break;\r
-    case WM_SIZE:\r
-        if (!gWebView)\r
-            break;\r
-        // Get the dimensions of the main window's client \r
-        // area, and enumerate the child windows. Pass the \r
-        // dimensions to the child windows during enumeration. \r
-\r
-        RECT rcClient;\r
-        GetClientRect(hWnd, &rcClient); \r
-        MoveWindow(gWebView->windowHandle(), \r
-                   0, 0, rcClient.right, rcClient.bottom, \r
-                   TRUE);\r
-        ShowWindow(gWebView->windowHandle(), SW_SHOW); \r
-        break; \r
-    default:\r
-        return DefWindowProc(hWnd, message, wParam, lParam);\r
-    }\r
-    return 0;\r
-}\r
-\r
-// Message handler for about box.\r
-INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
-    UNREFERENCED_PARAMETER(lParam);\r
-    switch (message)\r
-    {\r
-    case WM_INITDIALOG:\r
-        return (INT_PTR)TRUE;\r
-\r
-    case WM_COMMAND:\r
-        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)\r
-        {\r
-            EndDialog(hDlg, LOWORD(wParam));\r
-            return (INT_PTR)TRUE;\r
-        }\r
-        break;\r
-    }\r
-    return (INT_PTR)FALSE;\r
-}\r
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "stdafx.h"
+#include "Spinneret.h"
+#include "WebView.h"
+#include "WebFrame.h"
+
+#include <commctrl.h>
+
+#define MAX_LOADSTRING 100
+#define URLBAR_HEIGHT  24
+
+using namespace WebKit;
+
+// Global Variables:
+HINSTANCE hInst;                                // current instance
+HWND hMainWnd;
+HWND hURLBarWnd;
+long DefEditProc;
+WebView* gWebView = 0;
+TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
+TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
+
+// Forward declarations of functions included in this code module:
+ATOM                MyRegisterClass(HINSTANCE hInstance);
+BOOL                InitInstance(HINSTANCE, int);
+LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
+INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
+LRESULT CALLBACK    MyEditProc(HWND, UINT, WPARAM, LPARAM);
+
+static void resizeSubViews()
+{
+    RECT rcClient;
+    GetClientRect(hMainWnd, &rcClient);
+    MoveWindow(hURLBarWnd, 0, 0, rcClient.right, URLBAR_HEIGHT, TRUE);
+    MoveWindow(gWebView->windowHandle(), 0, URLBAR_HEIGHT, rcClient.right, rcClient.bottom - URLBAR_HEIGHT, TRUE);
+}
+
+int APIENTRY _tWinMain(HINSTANCE hInstance,
+                     HINSTANCE hPrevInstance,
+                     LPTSTR    lpCmdLine,
+                     int       nCmdShow)
+{
+    UNREFERENCED_PARAMETER(hPrevInstance);
+    UNREFERENCED_PARAMETER(lpCmdLine);
+
+     // TODO: Place code here.
+    MSG msg;
+    HACCEL hAccelTable;
+
+    INITCOMMONCONTROLSEX InitCtrlEx;
+
+    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
+    InitCtrlEx.dwICC  = ICC_STANDARD_CLASSES;
+    InitCommonControlsEx(&InitCtrlEx);
+
+    // Initialize global strings
+    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+    LoadString(hInstance, IDC_SPINNERET, szWindowClass, MAX_LOADSTRING);
+    MyRegisterClass(hInstance);
+
+    // Perform application initialization:
+    if (!InitInstance (hInstance, nCmdShow))
+        return FALSE;
+
+    hURLBarWnd = CreateWindow(L"EDIT", 0,
+                        WS_CHILD | WS_VISIBLE  | ES_LEFT | ES_AUTOVSCROLL, 
+                        0, 0, 0, 0,
+                        hMainWnd,
+                        0,
+                        hInstance, 0);
+
+    DefEditProc = GetWindowLong(hURLBarWnd, GWL_WNDPROC);
+    SetWindowLong(hURLBarWnd, GWL_WNDPROC,(long)MyEditProc);
+
+    gWebView = WebView::createWebView(hInstance, hMainWnd);
+    resizeSubViews();
+    ShowWindow(gWebView->windowHandle(), nCmdShow);
+    UpdateWindow(gWebView->windowHandle());
+
+    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SPINNERET));
+
+    // Main message loop:
+    while (GetMessage(&msg, NULL, 0, 0))
+    {
+        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
+        {
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+    }
+
+    return (int) msg.wParam;
+}
+
+ATOM MyRegisterClass(HINSTANCE hInstance)
+{
+    WNDCLASSEX wcex;
+
+    wcex.cbSize = sizeof(WNDCLASSEX);
+
+    wcex.style            = CS_HREDRAW | CS_VREDRAW;
+    wcex.lpfnWndProc    = WndProc;
+    wcex.cbClsExtra        = 0;
+    wcex.cbWndExtra        = 0;
+    wcex.hInstance        = hInstance;
+    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPINNERET));
+    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
+    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
+    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_SPINNERET);
+    wcex.lpszClassName    = szWindowClass;
+    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
+
+    return RegisterClassEx(&wcex);
+}
+
+BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
+{
+   hInst = hInstance; // Store instance handle in our global variable
+
+   hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
+
+   if (!hMainWnd)
+      return FALSE;
+
+   ShowWindow(hMainWnd, nCmdShow);
+   UpdateWindow(hMainWnd);
+
+   return TRUE;
+}
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    int wmId, wmEvent;
+    PAINTSTRUCT ps;
+    HDC hdc;
+
+    switch (message)
+    {
+    case WM_COMMAND:
+        wmId    = LOWORD(wParam);
+        wmEvent = HIWORD(wParam);
+        // Parse the menu selections:
+        switch (wmId)
+        {
+        case IDM_ABOUT:
+            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
+            break;
+        case IDM_EXIT:
+            DestroyWindow(hWnd);
+            break;
+        default:
+            return DefWindowProc(hWnd, message, wParam, lParam);
+        }
+        break;
+    case WM_PAINT:
+        hdc = BeginPaint(hWnd, &ps);
+        // TODO: Add any drawing code here...
+        EndPaint(hWnd, &ps);
+        break;
+    case WM_DESTROY:
+        PostQuitMessage(0);
+        break;
+    case WM_SIZE:
+        if (!gWebView)
+            break;
+        resizeSubViews();
+        break; 
+    default:
+        return DefWindowProc(hWnd, message, wParam, lParam);
+    }
+    return 0;
+}
+
+
+#define MAX_URL_LENGTH  1024
+
+LRESULT CALLBACK MyEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    switch (message) {
+        case WM_CHAR:
+            if( wParam == 13 ) { // Enter Key
+                wchar_t strPtr[MAX_URL_LENGTH];
+                char    cstrPtr[MAX_URL_LENGTH];
+                *((LPWORD)strPtr) = MAX_URL_LENGTH; 
+                int strLen = SendMessage(hDlg, EM_GETLINE, 0, (LPARAM)strPtr);
+
+                MessageBox(hMainWnd, strPtr, L"Foo", MB_OK);
+
+                int x;
+                for(x = 0; x < strLen; x++)
+                    cstrPtr[x] = strPtr[x];
+                cstrPtr[x] = 0;
+    
+                gWebView->mainFrame()->loadFilePath(cstrPtr);            
+
+                return 0;
+            } else
+                return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
+            break;
+        default:
+             return (LRESULT)CallWindowProc((WNDPROC)DefEditProc,hDlg,message,wParam,lParam);
+        break;
+    }
+    return 0;
+}
+
+
+// Message handler for about box.
+INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    UNREFERENCED_PARAMETER(lParam);
+    switch (message)
+    {
+    case WM_INITDIALOG:
+        return (INT_PTR)TRUE;
+
+    case WM_COMMAND:
+        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
+        {
+            EndDialog(hDlg, LOWORD(wParam));
+            return (INT_PTR)TRUE;
+        }
+        break;
+    }
+    return (INT_PTR)FALSE;
+}