1 // Written by Christopher E. Miller
2 // See the included license.txt for copyright and license details.
3 
4 
5 /// Interfacing with the system clipboard for copy and paste operations.
6 module dfl.clipboard;
7 
8 private import dfl.base, dfl.internal.winapi, dfl.data, dfl.internal.wincom,
9         dfl.internal.dlib;
10 
11 
12 
13 class Clipboard { // docmain
14    private this() {}
15 
16 
17  static:
18 
19 
20    dfl.data.IDataObject getDataObject() {
21       dfl.internal.wincom.IDataObject comdobj;
22       if(S_OK != OleGetClipboard(&comdobj)) {
23          throw new DflException("Unable to obtain clipboard data object");
24       }
25       if(comdobj is comd) {
26          return dd;
27       }
28       //delete dd;
29       comd = comdobj;
30       return dd = new ComToDdataObject(comdobj);
31    }
32 
33    /// ditto
34    void setDataObject(Data obj, bool persist = false) {
35       comd = null;
36       /+
37       Object ddd;
38       ddd = cast(Object)dd;
39       delete ddd;
40       +/
41       dd = null;
42       objref = null;
43 
44       if(obj.info) {
45          if(cast(TypeInfo_Class)obj.info) {
46             Object foo;
47             foo = obj.getObject();
48 
49             /+
50             if(cast(Bitmap)foo) {
51                // ...
52             } else +/ if(cast(dfl.data.IDataObject)foo) {
53                dd = cast(dfl.data.IDataObject)foo;
54                objref = foo;
55             } else {
56                // Can't set any old class object.
57                throw new DflException("Unknown data object");
58             }
59          } else if(obj.info == typeid(dfl.data.IDataObject)) {
60             dd = obj.getValue!(dfl.data.IDataObject)();
61             objref = cast(Object)dd;
62          } else if(cast(TypeInfo_Interface)obj.info) {
63             // Can't set any old interface.
64             throw new DflException("Unknown data object");
65          } else {
66             DataObject foo = new DataObject;
67             dd = foo;
68             objref = foo;
69             dd.setData(obj);
70          }
71 
72          assert(!(dd is null));
73          comd = new DtoComDataObject(dd);
74          if(S_OK != OleSetClipboard(comd)) {
75             comd = null;
76             //delete dd;
77             dd = null;
78             goto err_set;
79          }
80 
81          if(persist) {
82             OleFlushClipboard();
83          }
84       } else {
85          dd = null;
86          if(S_OK != OleSetClipboard(null)) {
87             goto err_set;
88          }
89       }
90 
91       return;
92    err_set:
93       throw new DflException("Unable to set clipboard data");
94    }
95 
96    /// ditto
97    void setDataObject(dfl.data.IDataObject obj, bool persist = false) {
98       setDataObject(Data(obj), persist);
99    }
100 
101 
102 
103    void setString(Dstring str, bool persist = false) {
104       setDataObject(Data(str), persist);
105    }
106 
107    /// ditto
108    Dstring getString() {
109       dfl.data.IDataObject ido;
110       ido = getDataObject();
111       if(ido.getDataPresent(DataFormats.utf8)) {
112          return ido.getData(DataFormats.utf8).getString();
113       }
114       return null; // ?
115    }
116 
117 
118 
119    // ANSI text.
120    void setText(ubyte[] ansiText, bool persist = false) {
121       setDataObject(Data(ansiText), persist);
122    }
123 
124    /// ditto
125    ubyte[] getText() {
126       dfl.data.IDataObject ido;
127       ido = getDataObject();
128       if(ido.getDataPresent(DataFormats.text)) {
129          return ido.getData(DataFormats.text).getText();
130       }
131       return null; // ?
132    }
133 
134 
135  private:
136    dfl.internal.wincom.IDataObject comd;
137    dfl.data.IDataObject dd;
138    Object objref; // Prevent dd from being garbage collected!
139 
140 
141    /+
142    static ~this() {
143       Object ddd;
144       ddd = cast(Object)dd;
145       delete ddd;
146    }
147    +/
148 }