2006-03-02 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / WebView.cpp
index 168d6bd080486025c2641b0afbdbc1b55ee3eab8..85fdf50911626af3bd774b53a97c31566a20c07f 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 "config.h"\r
-\r
-#include "WebView.h"\r
-#include "Resource.h"\r
-\r
-#include "FrameWin.h"\r
-#include "FrameView.h"\r
-#include "Page.h"\r
-#include "render_frames.h"\r
-#include "GraphicsContext.h"\r
-\r
-\r
-using namespace WebCore;\r
-\r
-namespace WebKit {\r
-\r
-// FIXME: we need to hang a pointer off the HWND\r
-WebView* gSharedWebViewHack = 0;\r
-\r
-class WebView::WebViewPrivate {\r
-public:\r
-    WebViewPrivate() {}\r
-    ~WebViewPrivate()\r
-    {\r
-        delete frame;\r
-    }\r
-\r
-    FrameWin* frame;\r
-    HWND windowHandle;\r
-};\r
-\r
-const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";\r
-\r
-LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);\r
-\r
-static ATOM registerWebViewWithInstance(HINSTANCE hInstance)\r
-{\r
-    static bool haveRegisteredWindowClass = false;\r
-    if (haveRegisteredWindowClass)\r
-        return true;\r
-\r
-    WNDCLASSEX wcex;\r
-\r
-    wcex.cbSize = sizeof(WNDCLASSEX);\r
-\r
-    wcex.style            = CS_HREDRAW | CS_VREDRAW; // CS_DBLCLKS?\r
-    wcex.lpfnWndProc    = WndProc;\r
-    wcex.cbClsExtra        = 0;\r
-    wcex.cbWndExtra        = 0;\r
-    wcex.hInstance        = hInstance;\r
-    wcex.hIcon            = 0;\r
-    wcex.hCursor        = LoadCursor(0, IDC_ARROW);\r
-    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);\r
-    wcex.lpszMenuName    = 0;\r
-    wcex.lpszClassName    = kWebViewWindowClassName;\r
-    wcex.hIconSm        = 0;\r
-\r
-    return RegisterClassEx(&wcex);\r
-}\r
-\r
-// FIXME: This should eventually just use the DLL instance, I think.\r
-WebView* WebView::createWebView(HINSTANCE hInstance, HWND parent)\r
-{\r
-   registerWebViewWithInstance(hInstance);\r
-\r
-   HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_BORDER,\r
-       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);\r
-   \r
-   if (!hWnd)\r
-      return 0;\r
-\r
-   gSharedWebViewHack = new WebView(hWnd);\r
-   return gSharedWebViewHack;\r
-}\r
-\r
-WebView::WebView(HWND hWnd)\r
-{\r
-    d = new WebViewPrivate();\r
-    d->windowHandle = hWnd;\r
-\r
-    Page *page = new Page();\r
-    d->frame = new FrameWin(page, 0);\r
-    FrameView *frameView = new FrameView(d->frame);\r
-    d->frame->setView(frameView);\r
-}\r
-\r
-WebView::~WebView()\r
-{\r
-    \r
-}\r
-\r
-void WebView::drawRect(const RECT& dirtyRect)\r
-{\r
-    GraphicsContext context;\r
-    d->frame->paint(&context, dirtyRect);\r
-}\r
-\r
-HWND WebView::windowHandle()\r
-{\r
-    return d->windowHandle;\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
-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
-    int wmId, wmEvent;\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_EXIT:\r
-            DestroyWindow(hWnd);\r
-            break;\r
-        default:\r
-            return DefWindowProc(hWnd, message, wParam, lParam);\r
-        }\r
-        break;\r
-    case WM_PAINT:\r
-        PAINTSTRUCT ps;\r
-        hdc = BeginPaint(hWnd, &ps);\r
-        // TODO: Add any drawing code here...\r
-        gSharedWebViewHack->drawRect(ps.rcPaint);\r
-        EndPaint(hWnd, &ps);\r
-        break;\r
-    case WM_DESTROY:\r
-        // Do nothing?\r
-        break;\r
-    default:\r
-        return DefWindowProc(hWnd, message, wParam, lParam);\r
-    }\r
-    return 0;\r
-}\r
-\r
-\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 "config.h"
+
+#include "WebView.h"
+#include "Resource.h"
+
+#include "FrameView.h"
+#include "FrameWin.h"
+#include "GraphicsContext.h"
+#include "MouseEvent.h"
+#include "Page.h"
+#include "render_frames.h"
+
+
+using namespace WebCore;
+
+namespace WebKit {
+
+// FIXME: we need to hang a pointer off the HWND
+WebView* gSharedWebViewHack = 0;
+
+class WebView::WebViewPrivate {
+public:
+    WebViewPrivate() {}
+    ~WebViewPrivate()
+    {
+        delete frame;
+    }
+
+    FrameWin* frame;
+    FrameView* frameView;
+    HWND windowHandle;
+};
+
+const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";
+
+LRESULT CALLBACK WebViewWndProc(HWND, UINT, WPARAM, LPARAM);
+
+static ATOM registerWebViewWithInstance(HINSTANCE hInstance)
+{
+    static bool haveRegisteredWindowClass = false;
+    if (haveRegisteredWindowClass)
+        return true;
+
+    WNDCLASSEX wcex;
+
+    wcex.cbSize = sizeof(WNDCLASSEX);
+
+    wcex.style          = CS_HREDRAW | CS_VREDRAW; // CS_DBLCLKS?
+    wcex.lpfnWndProc    = WebViewWndProc;
+    wcex.cbClsExtra     = 0;
+    wcex.cbWndExtra     = 0;
+    wcex.hInstance      = hInstance;
+    wcex.hIcon          = 0;
+    wcex.hCursor        = LoadCursor(0, IDC_ARROW);
+    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
+    wcex.lpszMenuName   = 0;
+    wcex.lpszClassName  = kWebViewWindowClassName;
+    wcex.hIconSm        = 0;
+
+    return RegisterClassEx(&wcex);
+}
+
+// FIXME: This should eventually just use the DLL instance, I think.
+WebView* WebView::createWebView(HINSTANCE hInstance, HWND parent)
+{
+   registerWebViewWithInstance(hInstance);
+
+   HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_BORDER,
+       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);
+   
+   if (!hWnd)
+      return 0;
+
+   gSharedWebViewHack = new WebView(hWnd);
+   return gSharedWebViewHack;
+}
+
+WebView::WebView(HWND hWnd)
+{
+    d = new WebViewPrivate();
+    d->windowHandle = hWnd;
+
+    Page *page = new Page();
+    d->frame = new FrameWin(page, 0);
+    d->frameView = new FrameView(d->frame);
+    d->frame->setView(d->frameView);
+
+    d->frame->begin();
+    d->frame->write("<img src=\"data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7\" alt=\"Larry\"><div style=\"border: 1px black\">foo</div><ul><li>foo<li>bar<li>baz</ul>");
+    d->frame->end();
+}
+
+WebView::~WebView()
+{
+    delete d;
+}
+
+void WebView::drawRect(const PAINTSTRUCT& ps)
+{
+    GraphicsContext context(ps.hdc);
+    d->frame->paint(&context, ps.rcPaint);
+}
+
+HWND WebView::windowHandle()
+{
+    return d->windowHandle;
+}
+
+void WebView::mouseMoved(HWND hWnd, WPARAM wParam, LPARAM lParam)
+{
+    MouseEvent mouseEvent(hWnd, wParam, lParam, 0);
+    d->frameView->viewportMouseMoveEvent(&mouseEvent);
+}
+
+void WebView::mouseDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
+{
+    MouseEvent mouseEvent(hWnd, wParam, lParam, 1);
+    d->frameView->viewportMousePressEvent(&mouseEvent);
+}
+
+void WebView::mouseUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
+{
+    MouseEvent mouseEvent(hWnd, wParam, lParam, 1);
+    d->frameView->viewportMouseReleaseEvent(&mouseEvent);
+}
+
+void WebView::mouseDoubleClick(HWND hWnd, WPARAM wParam, LPARAM lParam)
+{
+    MouseEvent mouseEvent(hWnd, wParam, lParam, 2);
+    d->frameView->viewportMouseReleaseEvent(&mouseEvent);
+}
+
+LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    int wmId, wmEvent;
+    HDC hdc;
+
+    switch (message)
+    {
+    case WM_COMMAND:
+        wmId    = LOWORD(wParam);
+        wmEvent = HIWORD(wParam);
+        // Parse the menu selections:
+        switch (wmId)
+        {
+        case IDM_EXIT:
+            DestroyWindow(hWnd);
+            break;
+        default:
+            return DefWindowProc(hWnd, message, wParam, lParam);
+        }
+        break;
+    case WM_PAINT:
+        PAINTSTRUCT ps;
+        hdc = BeginPaint(hWnd, &ps);
+        gSharedWebViewHack->drawRect(ps);
+        EndPaint(hWnd, &ps);
+        break;
+    case WM_DESTROY:
+        // Do nothing?
+        break;
+    case WM_MOUSEMOVE:
+        gSharedWebViewHack->mouseMoved(hWnd, wParam, lParam);
+        break;
+    case WM_LBUTTONDOWN:
+    case WM_MBUTTONDOWN:
+    case WM_RBUTTONDOWN:
+        gSharedWebViewHack->mouseDown(hWnd, wParam, lParam);
+        break;
+    case WM_LBUTTONUP:
+    case WM_MBUTTONUP:
+    case WM_RBUTTONUP:
+        gSharedWebViewHack->mouseUp(hWnd, wParam, lParam);
+        break;
+    case WM_LBUTTONDBLCLK:
+    case WM_MBUTTONDBLCLK:
+    case WM_RBUTTONDBLCLK:
+        gSharedWebViewHack->mouseDoubleClick(hWnd, wParam, lParam);
+        break;
+    default:
+        return DefWindowProc(hWnd, message, wParam, lParam);
+    }
+    return 0;
+}
+
+
+};