diff options
Diffstat (limited to 'WebKit/win/WebCoreSupport/WebDragClient.cpp')
-rw-r--r-- | WebKit/win/WebCoreSupport/WebDragClient.cpp | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/WebKit/win/WebCoreSupport/WebDragClient.cpp b/WebKit/win/WebCoreSupport/WebDragClient.cpp deleted file mode 100644 index 5a09529..0000000 --- a/WebKit/win/WebCoreSupport/WebDragClient.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * 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 "WebDragClient.h" -#include "WebDropSource.h" -#include "WebKitGraphics.h" -#include "WebView.h" - -#include <shlobj.h> -#include <CoreGraphics/CoreGraphics.h> - -#pragma warning(push, 0) -#include <WebCore/ClipboardWin.h> -#include <WebCore/DragData.h> -#include <WebCore/Font.h> -#include <WebCore/FontDescription.h> -#include <WebCore/FontSelector.h> -#include <WebCore/FrameView.h> -#include <WebCore/GraphicsContext.h> -#include <WebCore/Page.h> -#include <WebCore/StringTruncator.h> -#include <WebCore/WebCoreTextRenderer.h> -#pragma warning(pop) - -namespace WebCore { - HBITMAP allocImage(HDC dc, IntSize size, CGContextRef *targetRef); -} - - -#define DRAG_LABEL_BORDER_X 4 -// Keep border_y in synch with DragController::LinkDragBorderInset -#define DRAG_LABEL_BORDER_Y 2 -#define DRAG_LABEL_RADIUS 5 -#define DRAG_LABEL_BORDER_Y_OFFSET 2 - -#define MIN_DRAG_LABEL_WIDTH_BEFORE_CLIP 120 - -// Observation says max size is 200x200 -#define MAX_DRAG_LABEL_WIDTH 200 -#define MAX_DRAG_LABEL_STRING_WIDTH (MAX_DRAG_LABEL_WIDTH - 2 * DRAG_LABEL_BORDER_X) - -#define DRAG_LINK_LABEL_FONT_SIZE 11 -#define DRAG_LINK_URL_FONT_SIZE 10 - -using namespace WebCore; - -WebDragClient::WebDragClient(WebView* webView) - : m_webView(webView) -{ - ASSERT(webView); -} - -DragDestinationAction WebDragClient::actionMaskForDrag(DragData* dragData) -{ - COMPtr<IWebUIDelegate> delegateRef = 0; - //Default behaviour (eg. no delegate, or callback not implemented) is to allow - //any action - WebDragDestinationAction mask = WebDragDestinationActionAny; - if (SUCCEEDED(m_webView->uiDelegate(&delegateRef))) - delegateRef->dragDestinationActionMaskForDraggingInfo(m_webView, dragData->platformData(), &mask); - - return (DragDestinationAction)mask; -} - -void WebDragClient::willPerformDragDestinationAction(DragDestinationAction action, DragData* dragData) -{ - //Default delegate for willPerformDragDestinationAction has no side effects - //so we just call the delegate, and don't worry about whether it's implemented - COMPtr<IWebUIDelegate> delegateRef = 0; - if (SUCCEEDED(m_webView->uiDelegate(&delegateRef))) - delegateRef->willPerformDragDestinationAction(m_webView, (WebDragDestinationAction)action, dragData->platformData()); -} - -DragSourceAction WebDragClient::dragSourceActionMaskForPoint(const IntPoint& windowPoint) -{ - COMPtr<IWebUIDelegate> delegateRef = 0; - WebDragSourceAction action = WebDragSourceActionAny; - POINT localpt = core(m_webView)->mainFrame()->view()->windowToContents(windowPoint); - if (SUCCEEDED(m_webView->uiDelegate(&delegateRef))) - delegateRef->dragSourceActionMaskForPoint(m_webView, &localpt, &action); - return (DragSourceAction)action; -} - -void WebDragClient::willPerformDragSourceAction(DragSourceAction, const IntPoint&, Clipboard*) -{ -} - -void WebDragClient::startDrag(DragImageRef image, const IntPoint& imageOrigin, const IntPoint& dragPoint, Clipboard* clipboard, Frame* frame, bool isLink) -{ - //FIXME: Allow UIDelegate to override behaviour <rdar://problem/5015953> - - //We liberally protect everything, to protect against a load occurring mid-drag - RefPtr<Frame> frameProtector = frame; - COMPtr<IDragSourceHelper> helper; - COMPtr<IDataObject> dataObject; - COMPtr<WebView> viewProtector = m_webView; - COMPtr<IDropSource> source; - if (FAILED(WebDropSource::createInstance(m_webView, &source))) - return; - - dataObject = static_cast<ClipboardWin*>(clipboard)->dataObject(); - if (source && (image || dataObject)) { - if (image) { - if(SUCCEEDED(CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, - IID_IDragSourceHelper,(LPVOID*)&helper))) { - BITMAP b; - GetObject(image, sizeof(BITMAP), &b); - SHDRAGIMAGE sdi; - sdi.sizeDragImage.cx = b.bmWidth; - sdi.sizeDragImage.cy = b.bmHeight; - sdi.crColorKey = 0xffffffff; - sdi.hbmpDragImage = image; - sdi.ptOffset.x = dragPoint.x() - imageOrigin.x(); - sdi.ptOffset.y = dragPoint.y() - imageOrigin.y(); - if (isLink) - sdi.ptOffset.y = b.bmHeight - sdi.ptOffset.y; - - helper->InitializeFromBitmap(&sdi, dataObject.get()); - } - } - - //FIXME: Ensure correct drag ops are available <rdar://problem/5015957> - DWORD okEffect = DROPEFFECT_COPY | DROPEFFECT_LINK | DROPEFFECT_MOVE; - DWORD effect; - COMPtr<IWebUIDelegate> ui; - if (SUCCEEDED(m_webView->uiDelegate(&ui))) { - COMPtr<IWebUIDelegatePrivate> uiPrivate; - if (SUCCEEDED(ui->QueryInterface(IID_IWebUIDelegatePrivate, (void**)&uiPrivate))) - if (SUCCEEDED(uiPrivate->doDragDrop(m_webView, dataObject.get(), source.get(), okEffect, &effect))) - return; - } - - DoDragDrop(dataObject.get(), source.get(), okEffect, &effect); - } -} - -static Font dragLabelFont(int size, bool bold) -{ - FontDescription desc; - desc.setBold(bold); - FontFamily family; - family.setFamily("Lucida Grande"); - desc.setFamily(family); - desc.setSpecifiedSize((float)size); - desc.setComputedSize((float)size); - Font result = Font(desc, 0, 0); - result.update(0); - return result; -} - -DragImageRef WebDragClient::createDragImageForLink(KURL& url, const String& inLabel, Frame*) -{ - //This is more or less an exact match for the MacOS code - static const Font labelFont = dragLabelFont(DRAG_LINK_LABEL_FONT_SIZE, true); - static const Font urlFont = dragLabelFont(DRAG_LINK_URL_FONT_SIZE, false); - bool drawURLString = true; - bool clipURLString = false; - bool clipLabelString = false; - - String urlString = url.string(); - String label = inLabel; - if (label.isEmpty()) { - drawURLString = false; - label = urlString; - } - - //First step in drawing the link drag image width - TextRun labelRun(label.impl()); - TextRun urlRun(urlString.impl()); - IntSize labelSize(labelFont.width(labelRun), labelFont.ascent() + labelFont.descent()); - - if (labelSize.width() > MAX_DRAG_LABEL_STRING_WIDTH){ - labelSize.setWidth(MAX_DRAG_LABEL_STRING_WIDTH); - clipLabelString = true; - } - - IntSize urlStringSize; - IntSize imageSize(labelSize.width() + DRAG_LABEL_BORDER_X * 2, - labelSize.height() + DRAG_LABEL_BORDER_Y * 2); - - if (drawURLString) { - urlStringSize.setWidth(urlFont.width(urlRun)); - urlStringSize.setHeight(urlFont.ascent() + urlFont.descent()); - imageSize.setHeight(imageSize.height() + urlStringSize.height()); - if (urlStringSize.width() > MAX_DRAG_LABEL_STRING_WIDTH) { - imageSize.setWidth(MAX_DRAG_LABEL_WIDTH); - clipURLString = true; - } else { - imageSize.setWidth(std::max(labelSize.width(), urlStringSize.width()) + DRAG_LABEL_BORDER_X * 2); - } - } - - // We now know how big the image needs to be, so we create and - // fill the background - HBITMAP image = 0; - HDC dc = GetDC(0); - HDC workingDC = CreateCompatibleDC(dc); - if (!workingDC) { - ReleaseDC(0, dc); - return 0; - } - - CGContextRef contextRef; - image = allocImage(workingDC, imageSize, &contextRef); - if (!image) { - DeleteDC(workingDC); - ReleaseDC(0, dc); - return 0; - } - - ::SelectObject(workingDC, image); - GraphicsContext context(contextRef); - // On Mac alpha is {0.7, 0.7, 0.7, 0.8}, however we can't control alpha - // for drag images on win, so we use 1 - static const Color backgroundColor(140, 140, 140); - static const IntSize radii(DRAG_LABEL_RADIUS, DRAG_LABEL_RADIUS); - context.setFont(labelFont); - IntRect rect(0, 0, imageSize.width(), imageSize.height()); - context.fillRoundedRect(rect, radii, radii, radii, radii, backgroundColor); - - // Draw the text - static const Color topColor(0, 0, 0, 255); //original alpha = 0.75 - static const Color bottomColor(255, 255, 255, 127); //original alpha = 0.5 - if (drawURLString) { - if (clipURLString) - urlString = StringTruncator::rightTruncate(urlString, imageSize.width() - (DRAG_LABEL_BORDER_X * 2.0f), urlFont, false); - IntPoint textPos(DRAG_LABEL_BORDER_X, imageSize.height() - (DRAG_LABEL_BORDER_Y_OFFSET + urlFont.descent())); - WebCoreDrawDoubledTextAtPoint(context, urlString, textPos, urlFont, topColor, bottomColor); - } - - if (clipLabelString) - label = StringTruncator::rightTruncate(label, imageSize.width() - (DRAG_LABEL_BORDER_X * 2.0f), labelFont, false); - - IntPoint textPos(DRAG_LABEL_BORDER_X, DRAG_LABEL_BORDER_Y + labelFont.pixelSize()); - WebCoreDrawDoubledTextAtPoint(context, label, textPos, labelFont, topColor, bottomColor); - - CGContextRelease(contextRef); - DeleteDC(workingDC); - ReleaseDC(0, dc); - return image; -} - -void WebDragClient::dragControllerDestroyed() -{ - delete this; -} |