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