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 }