DragDropInteractionState.h [plain text]
#pragma once
#if ENABLE(DRAG_SUPPORT) && PLATFORM(IOS_FAMILY)
#import "UIKitSPI.h"
#import <WebCore/DragActions.h>
#import <WebCore/DragData.h>
#import <WebCore/Path.h>
#import <WebCore/TextIndicator.h>
#import <WebCore/WebItemProviderPasteboard.h>
#import <wtf/BlockPtr.h>
#import <wtf/RetainPtr.h>
#import <wtf/URL.h>
#import <wtf/Vector.h>
namespace WebCore {
struct DragItem;
struct TextIndicatorData;
}
namespace WebKit {
struct DragSourceState {
WebCore::DragSourceAction action { WebCore::DragSourceActionNone };
CGPoint adjustedOrigin { CGPointZero };
CGRect dragPreviewFrameInRootViewCoordinates { CGRectZero };
RetainPtr<UIImage> image;
Optional<WebCore::TextIndicatorData> indicatorData;
Optional<WebCore::Path> visiblePath;
String linkTitle;
URL linkURL;
bool possiblyNeedsDragPreviewUpdate { true };
NSInteger itemIdentifier { 0 };
};
struct ItemAndPreview {
RetainPtr<UIDragItem> item;
RetainPtr<UITargetedDragPreview> preview;
};
struct ItemAndPreviewProvider {
RetainPtr<UIDragItem> item;
BlockPtr<void(UITargetedDragPreview *)> provider;
};
class DragDropInteractionState {
public:
bool anyActiveDragSourceIs(WebCore::DragSourceAction) const;
void prepareForDragSession(id <UIDragSession>, dispatch_block_t completionHandler);
void dragSessionWillBegin();
void stageDragItem(const WebCore::DragItem&, UIImage *);
bool hasStagedDragSource() const;
const DragSourceState& stagedDragSource() const { return m_stagedDragSource.value(); }
enum class DidBecomeActive { No, Yes };
void clearStagedDragSource(DidBecomeActive = DidBecomeActive::No);
UITargetedDragPreview *previewForDragItem(UIDragItem *, UIView *contentView, UIView *previewContainer) const;
void dragSessionWillDelaySetDownAnimation(dispatch_block_t completion);
bool shouldRequestAdditionalItemForDragSession(id <UIDragSession>) const;
void dragSessionWillRequestAdditionalItem(void (^completion)(NSArray <UIDragItem *> *));
void dropSessionDidEnterOrUpdate(id <UIDropSession>, const WebCore::DragData&);
void dropSessionDidExit() { m_dropSession = nil; }
void dropSessionWillPerformDrop() { m_isPerformingDrop = true; }
void dragAndDropSessionsDidEnd();
CGPoint adjustedPositionForDragEnd() const { return m_adjustedPositionForDragEnd; }
bool didBeginDragging() const { return m_didBeginDragging; }
bool isPerformingDrop() const { return m_isPerformingDrop; }
id<UIDragSession> dragSession() const { return m_dragSession.get(); }
id<UIDropSession> dropSession() const { return m_dropSession.get(); }
BlockPtr<void()> takeDragStartCompletionBlock() { return WTFMove(m_dragStartCompletionBlock); }
BlockPtr<void()> takeDragCancelSetDownBlock() { return WTFMove(m_dragCancelSetDownBlock); }
BlockPtr<void(NSArray<UIDragItem *> *)> takeAddDragItemCompletionBlock() { return WTFMove(m_addDragItemCompletionBlock); }
void setDefaultDropPreview(UIDragItem *, UITargetedDragPreview *);
void prepareForDelayedDropPreview(UIDragItem *, void(^provider)(UITargetedDragPreview *preview));
void deliverDelayedDropPreview(UIView *contentView, UIView *previewContainer, const WebCore::TextIndicatorData&);
void deliverDelayedDropPreview(UIView *contentView, CGRect unobscuredContentRect, NSArray<UIDragItem *> *, const Vector<WebCore::IntRect>& placeholderRects);
void clearAllDelayedItemPreviewProviders();
private:
void updatePreviewsForActiveDragSources();
Optional<DragSourceState> activeDragSourceForItem(UIDragItem *) const;
UITargetedDragPreview *defaultDropPreview(UIDragItem *) const;
BlockPtr<void(UITargetedDragPreview *)> dropPreviewProvider(UIDragItem *);
CGPoint m_lastGlobalPosition { CGPointZero };
CGPoint m_adjustedPositionForDragEnd { CGPointZero };
bool m_didBeginDragging { false };
bool m_isPerformingDrop { false };
RetainPtr<id <UIDragSession>> m_dragSession;
RetainPtr<id <UIDropSession>> m_dropSession;
BlockPtr<void()> m_dragStartCompletionBlock;
BlockPtr<void()> m_dragCancelSetDownBlock;
BlockPtr<void(NSArray<UIDragItem *> *)> m_addDragItemCompletionBlock;
Optional<DragSourceState> m_stagedDragSource;
Vector<DragSourceState> m_activeDragSources;
Vector<ItemAndPreviewProvider> m_delayedItemPreviewProviders;
Vector<ItemAndPreview> m_defaultDropPreviews;
};
}
#endif // ENABLE(DRAG_SUPPORT) && PLATFORM(IOS_FAMILY)