Enables drag-and-drop behaviour for a component and all its sub-components. More...
#include <juce_DragAndDropContainer.h>
Public Member Functions | |
DragAndDropContainer () | |
Creates a DragAndDropContainer. More... | |
virtual | ~DragAndDropContainer () |
Destructor. More... | |
var | getCurrentDragDescription () const |
Returns the description of the thing that's currently being dragged. More... | |
bool | isDragAndDropActive () const |
Returns true if something is currently being dragged. More... | |
void | setCurrentDragImage (const Image &newImage) |
If a drag is in progress, this allows the image being shown to be dynamically updated. More... | |
void | startDragging (const var &sourceDescription, Component *sourceComponent, Image dragImage=Image(), bool allowDraggingToOtherJuceWindows=false, const Point< int > *imageOffsetFromMouse=nullptr) |
Begins a drag-and-drop operation. More... | |
Static Public Member Functions | |
static DragAndDropContainer * | findParentDragContainerFor (Component *childComponent) |
Utility to find the DragAndDropContainer for a given Component. More... | |
static bool | performExternalDragDropOfFiles (const StringArray &files, bool canMoveFiles, Component *sourceComponent=nullptr) |
This performs a synchronous drag-and-drop of a set of files to some external application. More... | |
static bool | performExternalDragDropOfText (const String &text, Component *sourceComponent=nullptr) |
This performs a synchronous drag-and-drop of a block of text to some external application. More... | |
Protected Member Functions | |
virtual void | dragOperationEnded (const DragAndDropTarget::SourceDetails &) |
Subclasses can override this to be told when a drag finishes. More... | |
virtual void | dragOperationStarted (const DragAndDropTarget::SourceDetails &) |
Subclasses can override this to be told when a drag starts. More... | |
virtual bool | shouldDropFilesWhenDraggedExternally (const DragAndDropTarget::SourceDetails &sourceDetails, StringArray &files, bool &canMoveFiles) |
Override this if you want to be able to perform an external drag of a set of files when the user drags outside of this container component. More... | |
virtual bool | shouldDropTextWhenDraggedExternally (const DragAndDropTarget::SourceDetails &sourceDetails, String &text) |
Override this if you want to be able to perform an external drag of text when the user drags outside of this container component. More... | |
Private Attributes | |
ScopedPointer< DragImageComponent > | dragImageComponent |
Friends | |
struct | ContainerDeletePolicy< DragImageComponent > |
class | DragImageComponent |
Enables drag-and-drop behaviour for a component and all its sub-components.
For a component to be able to make or receive drag-and-drop events, one of its parent components must derive from this class. It's probably best for the top-level component to implement it.
Then to start a drag operation, any sub-component can just call the startDragging() method, and this object will take over, tracking the mouse and sending appropriate callbacks to any child components derived from DragAndDropTarget which the mouse moves over.
Note: If all that you need to do is to respond to files being drag-and-dropped from the operating system onto your component, you don't need any of these classes: you can do this simply by overriding FileDragAndDropTarget::filesDropped().
DragAndDropContainer::DragAndDropContainer | ( | ) |
Creates a DragAndDropContainer.
The object that derives from this class must also be a Component.
|
virtual |
Destructor.
|
protectedvirtual |
Subclasses can override this to be told when a drag finishes.
|
protectedvirtual |
Subclasses can override this to be told when a drag starts.
|
static |
Utility to find the DragAndDropContainer for a given Component.
This will search up this component's parent hierarchy looking for the first parent component which is a DragAndDropContainer.
It's useful when a component wants to call startDragging but doesn't know the DragAndDropContainer it should to use.
Obviously this may return nullptr if it doesn't find a suitable component.
var DragAndDropContainer::getCurrentDragDescription | ( | ) | const |
Returns the description of the thing that's currently being dragged.
If nothing's being dragged, this will return a null var, otherwise it'll return the var that was passed into startDragging().
bool DragAndDropContainer::isDragAndDropActive | ( | ) | const |
Returns true if something is currently being dragged.
|
static |
This performs a synchronous drag-and-drop of a set of files to some external application.
You can call this function in response to a mouseDrag callback, and it will block, running its own internal message loop and tracking the mouse, while it uses a native operating system drag-and-drop operation to move or copy some files to another application.
files | a list of filenames to drag |
canMoveFiles | if true, the app that receives the files is allowed to move the files to a new location (if this is appropriate). If false, the receiver is expected to make a copy of them. |
sourceComponent | Normally, JUCE will assume that the component under the mouse is the source component of the drag, but you can use this parameter to override this. |
|
static |
This performs a synchronous drag-and-drop of a block of text to some external application.
You can call this function in response to a mouseDrag callback, and it will block, running its own internal message loop and tracking the mouse, while it uses a native operating system drag-and-drop operation to move or copy some text to another application.
text | the text to copy |
sourceComponent | Normally, JUCE will assume that the component under the mouse is the source component of the drag, but you can use this parameter to override this. |
void DragAndDropContainer::setCurrentDragImage | ( | const Image & | newImage | ) |
If a drag is in progress, this allows the image being shown to be dynamically updated.
|
protectedvirtual |
Override this if you want to be able to perform an external drag of a set of files when the user drags outside of this container component.
This method will be called when a drag operation moves outside the JUCE window, and if you want it to then perform a file drag-and-drop, add the filenames you want to the array passed in, and return true.
sourceDetails | information about the source of the drag operation |
files | on return, the filenames you want to drag |
canMoveFiles | on return, true if it's ok for the receiver to move the files; false if it must make a copy of them (see the performExternalDragDropOfFiles() method) |
|
protectedvirtual |
Override this if you want to be able to perform an external drag of text when the user drags outside of this container component.
This method will be called when a drag operation moves outside the JUCE window, and if you want it to then perform a text drag-and-drop, copy the text you want to be dragged into the argument provided and return true.
sourceDetails | information about the source of the drag operation |
text | on return, the text you want to drag |
void DragAndDropContainer::startDragging | ( | const var & | sourceDescription, |
Component * | sourceComponent, | ||
Image | dragImage = Image() , |
||
bool | allowDraggingToOtherJuceWindows = false , |
||
const Point< int > * | imageOffsetFromMouse = nullptr |
||
) |
Begins a drag-and-drop operation.
This starts a drag-and-drop operation - call it when the user drags the mouse in your drag-source component, and this object will track mouse movements until the user lets go of the mouse button, and will send appropriate messages to DragAndDropTarget objects that the mouse moves over.
findParentDragContainerFor() is a handy method to call to find the drag container to use for a component.
sourceDescription | a string or value to use as the description of the thing being dragged - this will be passed to the objects that might be dropped-onto so they can decide whether they want to handle it |
sourceComponent | the component that is being dragged |
dragImage | the image to drag around underneath the mouse. If this is a null image, a snapshot of the sourceComponent will be used instead. |
allowDraggingToOtherJuceWindows | if true, the dragged component will appear as a desktop window, and can be dragged to DragAndDropTargets that are the children of components other than this one. |
imageOffsetFromMouse | if an image has been passed-in, this specifies the offset at which the image should be drawn from the mouse. If it isn't specified, then the image will be centred around the mouse. If an image hasn't been passed-in, this will be ignored. |
|
friend |
|
friend |
|
private |