123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- * Copyright (C) 2007 Apple 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 "config.h"
- #include "WebDropSource.h"
- #include "WebKitDLL.h"
- #include "WebView.h"
- #include <WebCore/Cursor.h>
- #include <WebCore/DragActions.h>
- #include <WebCore/EventHandler.h>
- #include <WebCore/Frame.h>
- #include <WebCore/FrameView.h>
- #include <WebCore/Page.h>
- #include <WebCore/PlatformMouseEvent.h>
- #include <wtf/CurrentTime.h>
- #include <Windows.h>
- using namespace WebCore;
- HRESULT WebDropSource::createInstance(WebView* webView, IDropSource** result)
- {
- if (!webView || !result)
- return E_INVALIDARG;
- *result = new WebDropSource(webView);
- return S_OK;
- }
- WebDropSource::WebDropSource(WebView* webView)
- : m_ref(1)
- , m_dropped(false)
- , m_webView(webView)
- {
- gClassCount++;
- gClassNameCount.add("WebDropSource");
- }
- WebDropSource::~WebDropSource()
- {
- gClassCount--;
- gClassNameCount.remove("WebDropSource");
- }
- STDMETHODIMP WebDropSource::QueryInterface(REFIID riid, void** ppvObject)
- {
- *ppvObject = 0;
- if (IsEqualIID(riid, IID_IUnknown) ||
- IsEqualIID(riid, IID_IDropSource)) {
- *ppvObject = this;
- AddRef();
- return S_OK;
- }
- return E_NOINTERFACE;
- }
- STDMETHODIMP_(ULONG) WebDropSource::AddRef(void)
- {
- return InterlockedIncrement(&m_ref);
- }
- STDMETHODIMP_(ULONG) WebDropSource::Release(void)
- {
- long c = InterlockedDecrement(&m_ref);
- if (c == 0)
- delete this;
- return c;
- }
- PlatformMouseEvent generateMouseEvent(WebView* webView, bool isDrag)
- {
- POINTL pt;
- ::GetCursorPos((LPPOINT)&pt);
- POINTL localpt = pt;
- HWND viewWindow;
- if (SUCCEEDED(webView->viewWindow((OLE_HANDLE*)&viewWindow)))
- ::ScreenToClient(viewWindow, (LPPOINT)&localpt);
- return PlatformMouseEvent(IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y),
- isDrag ? LeftButton : NoButton, PlatformEvent::MouseMoved, 0, false, false, false, false, currentTime());
- }
- STDMETHODIMP WebDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
- {
- if (fEscapePressed || !(grfKeyState & (MK_LBUTTON|MK_RBUTTON))) {
- m_dropped = !fEscapePressed;
- return fEscapePressed? DRAGDROP_S_CANCEL : DRAGDROP_S_DROP;
- }
- return S_OK;
- }
- STDMETHODIMP WebDropSource::GiveFeedback(DWORD dwEffect)
- {
- BOOL showCustomCursors;
- if (FAILED(WebPreferences::sharedStandardPreferences()->customDragCursorsEnabled(&showCustomCursors)))
- return DRAGDROP_S_USEDEFAULTCURSORS;
- // If we don't want to hide the stop icon, let Windows select the cursor.
- if (!showCustomCursors)
- return DRAGDROP_S_USEDEFAULTCURSORS;
- // If we are going to show something other than the not allowed arrow, then let Windows
- // show the cursor.
- if (dwEffect != DROPEFFECT_NONE)
- return DRAGDROP_S_USEDEFAULTCURSORS;
-
- HWND viewWindow;
- if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow))))
- return DRAGDROP_S_USEDEFAULTCURSORS;
- RECT webViewRect;
- GetWindowRect(viewWindow, &webViewRect);
- POINT cursorPoint;
- GetCursorPos(&cursorPoint);
- if (!PtInRect(&webViewRect, cursorPoint)) {
- // If our cursor is outside the bounds of the webView, we want to let Windows select the cursor.
- return DRAGDROP_S_USEDEFAULTCURSORS;
- }
- FrameView* view = m_webView->page()->mainFrame()->view();
- if (!view)
- return DRAGDROP_S_USEDEFAULTCURSORS;
- // When dragging inside a WebView and the drag is not allowed, don't show the not allowed icon,
- // instead, show the pointer cursor.
- // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and drop (default to pointer).
- view->setCursor(pointerCursor());
- return S_OK;
- }
|