]>
Commit | Line | Data |
---|---|---|
c18ecb11 VZ |
1 | \section{Drag-and-drop and clipboard overview}\label{wxdndoverview} |
2 | ||
dface61c JS |
3 | Classes: \helpref{wxDataObject}{wxdataobject}, |
4 | \helpref{wxTextDataObject}{wxtextdataobject}, | |
5 | \helpref{wxDropSource}{wxdropsource}, | |
6 | \helpref{wxDropTarget}{wxdroptarget}, | |
7 | \helpref{wxTextDropTarget}{wxtextdroptarget}, | |
8 | \helpref{wxFileDropTarget}{wxfiledroptarget} | |
c18ecb11 | 9 | |
ab272c0b RR |
10 | Note that wxUSE\_DRAG\_AND\_DROP must be defined in setup.h in order |
11 | to use Drag'n'Drop in wxWindows. | |
ad20983b | 12 | |
c18ecb11 VZ |
13 | This overview describes wxWindows support for drag and drop and clipboard |
14 | operations. Both of these topics are discussed here because, in fact, they're | |
f60d0f94 | 15 | quite related. Drag and drop and clipboard are just two ways of passing the |
c18ecb11 VZ |
16 | data around and so the code required to implement both types of the operations |
17 | is almost the same. | |
18 | ||
f60d0f94 JS |
19 | Both operations involve passing some data from one program to another, |
20 | although the data can be received in the same program as the source. In the case | |
21 | of clipboard transfer, the data is first placed on the clipboard and then | |
22 | pasted into the destination program, while for a drag-and-drop operation the | |
ad20983b | 23 | data object is not stored anywhere but is created when the user starts |
f60d0f94 JS |
24 | dragging and is destroyed as soon as he ends it, whether the operation was |
25 | ended successfully or cancelled. | |
c18ecb11 | 26 | |
ad20983b | 27 | To be a {\it drag source}, i.e. to provide the data which may be dragged by |
f60d0f94 | 28 | user elsewhere, you should implement the following steps: |
b1327f57 | 29 | |
c18ecb11 | 30 | \begin{itemize}\itemsep=0pt |
ad20983b | 31 | \item {\bf Preparation:} First of all, the data object must be created and |
f60d0f94 | 32 | initialized with the data you wish to drag. For example: |
b1327f57 | 33 | |
c18ecb11 | 34 | \begin{verbatim} |
ab272c0b | 35 | wxDataObject *my_data = new wxTextDataObject data("This string will be dragged."); |
ad20983b | 36 | \end{verbatim} |
ad20983b | 37 | \item{\bf Drag start:} To start dragging process (typically in response to a |
f60d0f94 JS |
38 | mouse click) you must call \helpref{DoDragDrop}{wxdropsourcedodragdrop} function |
39 | of wxDropSource object which should be constructed like this: | |
b1327f57 | 40 | |
c18ecb11 | 41 | \begin{verbatim} |
ab272c0b RR |
42 | wxDropSource dragSource( this ); |
43 | dragSource.SetData( my_data ); | |
ad20983b | 44 | \end{verbatim} |
ad20983b VZ |
45 | \item {\bf Dragging:} The call to DoDragDrop() blocks until the user release the |
46 | mouse button (unless you override \helpref{GiveFeedback}{wxdropsourcegivefeedback} function | |
47 | to do something special). When the mouse moves in a window of a program which understands the | |
330d6fd0 RR |
48 | same drag-and-drop protocol (any program under Windows or any program supporting the |
49 | XDnD protocol under X Windows), the corresponding \helpref{wxDropTarget}{wxdroptarget} methods | |
ad20983b | 50 | are called - see below. |
f60d0f94 | 51 | \item {\bf Processing the result:} DoDragDrop() returns an {\it effect code} which |
dface61c | 52 | is one of the values of \helpref{wxDragResult}{wxdropsource} enum. Codes |
ad20983b VZ |
53 | of wxDragError, wxDragNone and wxDragCancel have the obvious meaning and mean |
54 | that there is nothing to do on the sending end (except of possibly logging the | |
55 | error in the first case). wxDragCopy means that the data has been successfully | |
56 | copied and doesn't require any specific actions neither. But wxDragMove is | |
57 | special because it means that the data must be deleted from where it was | |
58 | copied. If it doesn't make sense (dragging selected text from a read-only | |
59 | file) you should pass FALSE as parameter to DoDragDrop() in the previous step. | |
ad20983b VZ |
60 | \end{itemize} |
61 | ||
ad20983b VZ |
62 | To be a {\it drop target}, i.e. to receive the data dropped by user you should |
63 | follow the instructions below: | |
64 | ||
65 | \begin{itemize}\itemsep=0pt | |
66 | \item {\bf Initialization:} For a window to be drop target, it needs to have | |
67 | an associated \helpref{wxDropTarget}{wxdroptarget} object. Normally, you will | |
62448488 | 68 | call \helpref{wxWindow::SetDropTarget}{wxwindowsetdroptarget} during window |
ad20983b VZ |
69 | creation associating you drop target with it. You must derive a class from |
70 | wxDropTarget and override its pure virtual methods. Alternatively, you may | |
71 | derive from \helpref{wxTextDropTarget}{wxtextdroptarget} or | |
72 | \helpref{wxFileDropTarget}{wxfiledroptarget} and override their OnDropText() | |
73 | or OnDropFiles() method. | |
ad20983b | 74 | \item {\bf Drop:} When the user releases the mouse over a window, wxWindows |
330d6fd0 RR |
75 | queries the associated wxDropTarget object if it accepts the data. For this, |
76 | a \helpref{wxDataObject}{wxdataobject} must be associated with the drop target | |
77 | and this data object will be responsible for the format negotiation between | |
78 | the drag source and the drop target. If all goes well, then \helpref{OnData}{wxdroptargetondata} | |
79 | will get called and the wxDataObject belonging to the drop target can get | |
80 | filled with data. | |
ad20983b VZ |
81 | \item {\bf The end:} After processing the data, DoDragDrop() returns either |
82 | wxDragCopy or wxDragMove depending on the state of the keys (<Ctrl>, <Shift> | |
83 | and <Alt>) at the moment of drop. There is currently no way for the drop | |
84 | target to change this return code. | |
c18ecb11 VZ |
85 | \end{itemize} |
86 |