1 /* $Header: /cvsroot/lesstif/lesstif/test/Xm/drag_help/import_bitmap.c,v 1.3 2001/05/23 13:42:30 amai Exp $ */
2
3 #include <Xm/Xm.h>
4 #include <Xm/DragDrop.h>
5 #include <Xm/MessageB.h>
6
7 extern void transfer_bitmap();
8 void import_bitmap();
9 extern Widget appshell;
10
11 static Widget help_dialog;
12 static Widget help_drop_site;
13 static XmDropProcCallbackStruct help_drop_data;
14
15 void
drop_from_help(w,client_data,call_data)16 drop_from_help(w, client_data, call_data)
17 Widget w;
18 XtPointer client_data;
19 XtPointer call_data;
20 {
21 /* Proceed with drop - modify client_data and pass to dropProc */
22 XmDropProcCallback drop_data = (XmDropProcCallback) client_data;
23 drop_data->dropAction = XmDROP;
24 XtDestroyWidget(help_dialog);
25 import_bitmap(help_drop_site, NULL, client_data);
26 }
27
28 void
cancel_from_help(w,client_data,call_data)29 cancel_from_help(w, client_data, call_data)
30 Widget w;
31 XtPointer client_data;
32 XtPointer call_data;
33 {
34 /* Cancel drop - modify client_data and pass to dropProc */
35 XmDropProcCallback drop_data = (XmDropProcCallback) client_data;
36 drop_data->dropAction = XmDROP_CANCEL;
37 XtDestroyWidget(help_dialog);
38 import_bitmap(help_drop_site, NULL, client_data);
39 }
40
41
42 void
import_bitmap(w,client_data,call_data)43 import_bitmap(w, client_data, call_data)
44 Widget w;
45 XtPointer client_data, call_data;
46 {
47 XmDropProcCallback drop_data;
48 XmDropTransferEntryRec transfer_entries[1];
49 Arg al[5];
50 int ac;
51
52 drop_data = (XmDropProcCallback) call_data;
53 ac = 0;
54 if (drop_data->dropAction == XmDROP_HELP) {
55 XmString s = XmStringCreateLocalized("Drop it here");
56 XtSetArg(al[ac], XmNmessageString, s); ac++;
57 help_dialog = XmCreateInformationDialog(appshell, "help_dialog", al,
58 ac);
59 help_drop_site = w;
60 ac = 0;
61 memcpy(&help_drop_data, drop_data, sizeof
62 (XmDropProcCallbackStruct));
63 XtAddCallback(help_dialog, XmNokCallback, drop_from_help,
64 (XtPointer) & help_drop_data);
65 XtAddCallback(help_dialog, XmNcancelCallback, cancel_from_help,
66 (XtPointer) & help_drop_data);
67 XtManageChild(help_dialog);
68 return;
69 }
70 if (drop_data->dropAction != XmDROP || drop_data->operation !=
71 XmDROP_COPY) {
72 XtSetArg(al[ac], XmNtransferStatus, XmTRANSFER_FAILURE); ac++;
73 } else {
74 Atom *export_list;
75 int export_count, i;
76 Boolean got_pixmap = False;
77 Boolean got_string = False;
78
79 XtVaGetValues(drop_data->dragContext, XmNexportTargets,
80 &export_list, XmNnumExportTargets, &export_count,
81 NULL);
82 for (i = 0; i < export_count; i++)
83 if (export_list[i] == XA_STRING)
84 got_string = True;
85 else if (export_list[i] == XA_PIXMAP)
86 got_pixmap = True;
87 /* Favour pixmap over string */
88 if (got_pixmap || got_string) {
89 if (got_pixmap)
90 transfer_entries[0].target = XA_PIXMAP;
91 else
92 transfer_entries[0].target = XA_STRING;
93 transfer_entries[0].client_data = (XtPointer) w;
94 XtSetArg(al[ac], XmNdropTransfers, transfer_entries); ac++;
95 XtSetArg(al[ac], XmNnumDropTransfers, 1); ac++;
96 XtSetArg(al[ac], XmNtransferProc, transfer_bitmap); ac++;
97 drop_data->operation = XmDROP_COPY;
98 } else {
99 XtSetArg(al[ac], XmNtransferStatus, XmTRANSFER_FAILURE); ac++;
100 }
101 }
102 XmDropTransferStart(drop_data->dragContext, al, ac);
103 }
104