1998-12-08 22:28:02 +00:00
|
|
|
\section{Drag-and-drop and clipboard overview}\label{wxdndoverview}
|
|
|
|
|
1998-12-08 23:33:12 +00:00
|
|
|
Classes: \helpref{wxDataObject}{wxdataobject}
|
1998-12-08 22:28:02 +00:00
|
|
|
|
1998-12-08 23:33:12 +00:00
|
|
|
% \helpref{wxTextDataObject}{wxtextdataobject}
|
|
|
|
% \helpref{wxDropSource}{wxdropsource}
|
1998-12-08 22:28:02 +00:00
|
|
|
% \helpref{wxDropTarget}{wxdroptarget}
|
|
|
|
% \helpref{wxTextDropTarget}{wxtextdroptarget}
|
|
|
|
% \helpref{wxFileDropTarget}{wxfiledroptarget}
|
|
|
|
|
|
|
|
Samples: see the dnd sample.
|
|
|
|
|
1998-12-10 00:00:46 +00:00
|
|
|
Headers: <wx/dataobj.h>, <wx/dropsrc.h and <wx/droptgt.h>>
|
|
|
|
(note that wxUSE\_DRAG\_AND\_DROP must be defined in setup.h)
|
|
|
|
|
1998-12-08 22:28:02 +00:00
|
|
|
This overview describes wxWindows support for drag and drop and clipboard
|
|
|
|
operations. Both of these topics are discussed here because, in fact, they're
|
1998-12-23 09:58:02 +00:00
|
|
|
quite related. Drag and drop and clipboard are just two ways of passing the
|
1998-12-08 22:28:02 +00:00
|
|
|
data around and so the code required to implement both types of the operations
|
|
|
|
is almost the same.
|
|
|
|
|
1998-12-23 09:58:02 +00:00
|
|
|
Both operations involve passing some data from one program to another,
|
|
|
|
although the data can be received in the same program as the source. In the case
|
|
|
|
of clipboard transfer, the data is first placed on the clipboard and then
|
|
|
|
pasted into the destination program, while for a drag-and-drop operation the
|
1998-12-10 00:00:46 +00:00
|
|
|
data object is not stored anywhere but is created when the user starts
|
1998-12-23 09:58:02 +00:00
|
|
|
dragging and is destroyed as soon as he ends it, whether the operation was
|
|
|
|
ended successfully or cancelled.
|
1998-12-08 22:28:02 +00:00
|
|
|
|
1998-12-10 00:00:46 +00:00
|
|
|
To be a {\it drag source}, i.e. to provide the data which may be dragged by
|
1998-12-23 09:58:02 +00:00
|
|
|
user elsewhere, you should implement the following steps:
|
1998-12-08 23:33:12 +00:00
|
|
|
|
1998-12-08 22:28:02 +00:00
|
|
|
\begin{itemize}\itemsep=0pt
|
1998-12-10 00:00:46 +00:00
|
|
|
\item {\bf Preparation:} First of all, the data object must be created and
|
1998-12-23 09:58:02 +00:00
|
|
|
initialized with the data you wish to drag. For example:
|
1998-12-08 23:33:12 +00:00
|
|
|
|
1998-12-08 22:28:02 +00:00
|
|
|
\begin{verbatim}
|
|
|
|
wxTextDataObject data("This string will be dragged.");
|
1998-12-10 00:00:46 +00:00
|
|
|
\end{verbatim}
|
1998-12-08 23:33:12 +00:00
|
|
|
|
1998-12-10 00:00:46 +00:00
|
|
|
Of course, the data object may contain arbitrary data of any type, but for
|
1998-12-23 09:58:02 +00:00
|
|
|
this you should derive your own class from \helpref{wxDataObject}{wxdataobject} overriding all of its pure virtual
|
1998-12-10 00:00:46 +00:00
|
|
|
functions.
|
|
|
|
|
|
|
|
\item{\bf Drag start:} To start dragging process (typically in response to a
|
1998-12-23 09:58:02 +00:00
|
|
|
mouse click) you must call \helpref{DoDragDrop}{wxdropsourcedodragdrop} function
|
|
|
|
of wxDropSource object which should be constructed like this:
|
1998-12-08 23:33:12 +00:00
|
|
|
|
1998-12-08 22:28:02 +00:00
|
|
|
\begin{verbatim}
|
|
|
|
wxDropSource dragSource(data, this);
|
|
|
|
|
|
|
|
// or also:
|
1998-12-10 00:00:46 +00:00
|
|
|
|
1998-12-08 22:28:02 +00:00
|
|
|
wxDropSource dragSource(this);
|
|
|
|
dragSource.SetData(data);
|
1998-12-10 00:00:46 +00:00
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
\item {\bf Dragging:} The call to DoDragDrop() blocks until the user release the
|
|
|
|
mouse button (unless you override \helpref{GiveFeedback}{wxdropsourcegivefeedback} function
|
|
|
|
to do something special). When the mouse moves in a window of a program which understands the
|
|
|
|
same drag-and-drop protocol (any program under Windows or any program supporting XDnD protocol
|
|
|
|
under X Windows), the corresponding \helpref{wxDropTarget}{wxdroptarget} methods
|
|
|
|
are called - see below.
|
|
|
|
|
1998-12-23 09:58:02 +00:00
|
|
|
\item {\bf Processing the result:} DoDragDrop() returns an {\it effect code} which
|
|
|
|
is one of the values of \helpref{wxDragResult}{wxdragresult} enum. Codes
|
1998-12-10 00:00:46 +00:00
|
|
|
of wxDragError, wxDragNone and wxDragCancel have the obvious meaning and mean
|
|
|
|
that there is nothing to do on the sending end (except of possibly logging the
|
|
|
|
error in the first case). wxDragCopy means that the data has been successfully
|
|
|
|
copied and doesn't require any specific actions neither. But wxDragMove is
|
|
|
|
special because it means that the data must be deleted from where it was
|
|
|
|
copied. If it doesn't make sense (dragging selected text from a read-only
|
|
|
|
file) you should pass FALSE as parameter to DoDragDrop() in the previous step.
|
|
|
|
\end{itemize}
|
|
|
|
|
|
|
|
To be a {\it drop target}, i.e. to receive the data dropped by user you should
|
|
|
|
follow the instructions below:
|
|
|
|
|
|
|
|
\begin{itemize}\itemsep=0pt
|
|
|
|
\item {\bf Initialization:} For a window to be drop target, it needs to have
|
|
|
|
an associated \helpref{wxDropTarget}{wxdroptarget} object. Normally, you will
|
|
|
|
call wxWindow::\helpref{SetDropTarget}{wxwindowsetdroptarget} during window
|
|
|
|
creation associating you drop target with it. You must derive a class from
|
|
|
|
wxDropTarget and override its pure virtual methods. Alternatively, you may
|
|
|
|
derive from \helpref{wxTextDropTarget}{wxtextdroptarget} or
|
|
|
|
\helpref{wxFileDropTarget}{wxfiledroptarget} and override their OnDropText()
|
|
|
|
or OnDropFiles() method.
|
|
|
|
|
|
|
|
\item {\bf Drop:} When the user releases the mouse over a window, wxWindows
|
|
|
|
queries the associated wxDropTarget object if it accepts the data. For
|
1998-12-23 09:58:02 +00:00
|
|
|
this, \helpref{GetFormatCount}{wxdroptargetgetformatcount} and \helpref{GetFormat}{wxdroptargetgetformat} are
|
|
|
|
used and if the format is
|
1998-12-10 00:00:46 +00:00
|
|
|
supported (i.e. is one of returned by GetFormat()),
|
|
|
|
then \helpref{OnDrop}{wxdroptargetondrop} is called.
|
|
|
|
Otherwise, \helpref{wxDragNone}{stdformat} is returned by DoDragDrop() and
|
|
|
|
nothing happens.
|
|
|
|
|
|
|
|
\item {\bf The end:} After processing the data, DoDragDrop() returns either
|
|
|
|
wxDragCopy or wxDragMove depending on the state of the keys (<Ctrl>, <Shift>
|
|
|
|
and <Alt>) at the moment of drop. There is currently no way for the drop
|
|
|
|
target to change this return code.
|
1998-12-08 22:28:02 +00:00
|
|
|
\end{itemize}
|
|
|
|
|