Whenever some other window requests the clipboard's contents (e.g.
as a result of a "paste" operation) FOX will send a
SEL_CLIPBOARD_REQUEST message to the current
clipboard owner. Remember, the clipboard owner is the window that called
acquireClipboard(). For our example, the main
window is acting as the clipboard owner and so it needs to handle the
SEL_CLIPBOARD_REQUEST message:
# Handle clipboard request self.connect(SEL_CLIPBOARD_REQUEST) do setDNDData(FROM_CLIPBOARD, FXWindow.stringType, Fox.fxencodeStringData(@clippedCustomer.to_s)) end
The setDNDData() method takes three
arguments. The first argument tells FOX which kind of data transfer we're
trying to accomplish; as it turns out, this method can be used for
drag-and-drop (FROM_DRAGNDROP) and X11 selection
(FROM_SELECTION) data transfer as well. The second
argument to setDNDData() is the drag type for the
data and the last argument is the data itself, a binary string.
If you're wondering why we need to call the
fxencodeStringData() module method to preprocess
the string returned by the call to Customer#to_s,
that's a reasonable thing to wonder about. In order for FOX to play nice
with other clipboard-aware applications, it must be able to store string
data on the clipboard in the format expected by those applications.
Unfortunately, that expected format is platform-dependent and does not
always correspond directly to the format that Ruby uses internally to
store its string data. The fxencodeStringData()
method (and the corresponding
fxdecodeStringData() method) provide you with a
platform-independent way of sending (or receiving) string data with the
stringType drag type.
If you run the program as it currently stands, you should now be able to select a customer from the list, click the "Copy" button and then paste the selected customer data (as a string) into some other application. For example, if you're trying this tutorial on a Windows machine, try pasting into a copy of Notepad or Microsoft Word. The pasted text should look something like:
#<struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345>