123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #ifndef nsBaseDragService_h__
- #define nsBaseDragService_h__
- #include "nsIDragService.h"
- #include "nsIDragSession.h"
- #include "nsITransferable.h"
- #include "nsIDOMDocument.h"
- #include "nsIDOMDataTransfer.h"
- #include "nsCOMPtr.h"
- #include "nsRect.h"
- #include "nsPoint.h"
- #include "mozilla/RefPtr.h"
- #include "mozilla/dom/ContentParent.h"
- #include "mozilla/dom/HTMLCanvasElement.h"
- #include "nsTArray.h"
- #include "Units.h"
- // translucency level for drag images
- #define DRAG_TRANSLUCENCY 0.65
- class nsIContent;
- class nsIDOMNode;
- class nsPresContext;
- class nsIImageLoadingContent;
- namespace mozilla {
- namespace gfx {
- class SourceSurface;
- } // namespace gfx
- } // namespace mozilla
- /**
- * XP DragService wrapper base class
- */
- class nsBaseDragService : public nsIDragService,
- public nsIDragSession
- {
- public:
- typedef mozilla::gfx::SourceSurface SourceSurface;
- nsBaseDragService();
- //nsISupports
- NS_DECL_ISUPPORTS
- //nsIDragSession and nsIDragService
- NS_DECL_NSIDRAGSERVICE
- NS_DECL_NSIDRAGSESSION
- void SetDragEndPoint(nsIntPoint aEndDragPoint)
- {
- mEndDragPoint = mozilla::LayoutDeviceIntPoint::FromUnknownPoint(aEndDragPoint);
- }
- void SetDragEndPoint(mozilla::LayoutDeviceIntPoint aEndDragPoint)
- {
- mEndDragPoint = aEndDragPoint;
- }
- uint16_t GetInputSource() { return mInputSource; }
- int32_t TakeChildProcessDragAction();
- protected:
- virtual ~nsBaseDragService();
- /**
- * Called from nsBaseDragService to initiate a platform drag from a source
- * in this process. This is expected to ensure that StartDragSession() and
- * EndDragSession() get called if the platform drag is successfully invoked.
- */
- virtual nsresult InvokeDragSessionImpl(nsIArray* aTransferableArray,
- nsIScriptableRegion* aDragRgn,
- uint32_t aActionType) = 0;
- /**
- * Draw the drag image, if any, to a surface and return it. The drag image
- * is constructed from mImage if specified, or aDOMNode if mImage is null.
- *
- * aRegion may be used to draw only a subset of the element. This region
- * should be supplied using x and y coordinates measured in css pixels
- * that are relative to the upper-left corner of the window.
- *
- * aScreenPosition should be the screen coordinates of the mouse click
- * for the drag. These are in CSS pixels.
- *
- * On return, aScreenDragRect will contain the screen coordinates of the
- * area being dragged. This is used by the platform-specific part of the
- * drag service to determine the drag feedback. This rect will be in the
- * device pixels of the presContext.
- *
- * If there is no drag image, the returned surface will be null, but
- * aScreenDragRect will still be set to the drag area.
- *
- * aPresContext will be set to the nsPresContext used determined from
- * whichever of mImage or aDOMNode is used.
- */
- nsresult DrawDrag(nsIDOMNode* aDOMNode,
- nsIScriptableRegion* aRegion,
- mozilla::CSSIntPoint aScreenPosition,
- mozilla::LayoutDeviceIntRect* aScreenDragRect,
- RefPtr<SourceSurface>* aSurface,
- nsPresContext **aPresContext);
- /**
- * Draw a drag image for an image node specified by aImageLoader or aCanvas.
- * This is called by DrawDrag.
- */
- nsresult DrawDragForImage(nsPresContext *aPresContext,
- nsIImageLoadingContent* aImageLoader,
- mozilla::dom::HTMLCanvasElement* aCanvas,
- mozilla::LayoutDeviceIntRect* aScreenDragRect,
- RefPtr<SourceSurface>* aSurface);
- /**
- * Convert aScreenPosition from CSS pixels into unscaled device pixels.
- */
- mozilla::LayoutDeviceIntPoint
- ConvertToUnscaledDevPixels(nsPresContext* aPresContext,
- mozilla::CSSIntPoint aScreenPosition);
- /**
- * If the drag image is a popup, open the popup when the drag begins.
- */
- void OpenDragPopup();
- /**
- * Free resources contained in DataTransferItems that aren't needed by JS.
- */
- void DiscardInternalTransferData();
- // Returns true if a drag event was dispatched to a child process after
- // the previous TakeDragEventDispatchedToChildProcess() call.
- bool TakeDragEventDispatchedToChildProcess()
- {
- bool retval = mDragEventDispatchedToChildProcess;
- mDragEventDispatchedToChildProcess = false;
- return retval;
- }
- bool mCanDrop;
- bool mOnlyChromeDrop;
- bool mDoingDrag;
- // true if mImage should be used to set a drag image
- bool mHasImage;
- // true if the user cancelled the drag operation
- bool mUserCancelled;
- bool mDragEventDispatchedToChildProcess;
- uint32_t mDragAction;
- uint32_t mDragActionFromChildProcess;
- nsSize mTargetSize;
- nsCOMPtr<nsIDOMNode> mSourceNode;
- nsCOMPtr<nsIDOMDocument> mSourceDocument; // the document at the drag source. will be null
- // if it came from outside the app.
- nsContentPolicyType mContentPolicyType; // the contentpolicy type passed to the channel
- // when initiating the drag session
- nsCOMPtr<nsIDOMDataTransfer> mDataTransfer;
- // used to determine the image to appear on the cursor while dragging
- nsCOMPtr<nsIDOMNode> mImage;
- // offset of cursor within the image
- mozilla::CSSIntPoint mImageOffset;
- // set if a selection is being dragged
- nsCOMPtr<nsISelection> mSelection;
- // set if the image in mImage is a popup. If this case, the popup will be opened
- // and moved instead of using a drag image.
- nsCOMPtr<nsIContent> mDragPopup;
- // the screen position where drag gesture occurred, used for positioning the
- // drag image.
- mozilla::CSSIntPoint mScreenPosition;
- // the screen position where the drag ended
- mozilla::LayoutDeviceIntPoint mEndDragPoint;
- uint32_t mSuppressLevel;
- // The input source of the drag event. Possible values are from nsIDOMMouseEvent.
- uint16_t mInputSource;
- nsTArray<RefPtr<mozilla::dom::ContentParent>> mChildProcesses;
- };
- #endif // nsBaseDragService_h__
|