]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/clipbrd.cpp
wxMac (debug) builds and runs wxMinimal again
[wxWidgets.git] / src / mac / carbon / clipbrd.cpp
CommitLineData
e9576ca5
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: clipbrd.cpp
3// Purpose: Clipboard functionality
4// Author: AUTHOR
5// Modified by:
6// Created: ??/??/98
7// RCS-ID: $Id$
8// Copyright: (c) AUTHOR
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation
14#pragma implementation "clipbrd.h"
15#endif
16
17#include "wx/app.h"
18#include "wx/frame.h"
19#include "wx/bitmap.h"
20#include "wx/utils.h"
21#include "wx/metafile.h"
22#include "wx/clipbrd.h"
23
24#include <string.h>
25
e9576ca5
SC
26bool wxOpenClipboard()
27{
519cb848 28 return TRUE;
e9576ca5
SC
29}
30
31bool wxCloseClipboard()
32{
e9576ca5
SC
33 return FALSE;
34}
35
36bool wxEmptyClipboard()
37{
519cb848 38 ZeroScrap() ;
e9576ca5
SC
39 return FALSE;
40}
41
42bool wxClipboardOpen()
43{
44 // TODO
45 return FALSE;
46}
47
48bool wxIsClipboardFormatAvailable(int dataFormat)
49{
50 // TODO
51 return FALSE;
52}
53
54bool wxSetClipboardData(int dataFormat, wxObject *obj, int width, int height)
55{
56 // TODO
57 return FALSE;
58}
59
60wxObject *wxGetClipboardData(int dataFormat, long *len)
61{
62 // TODO
63 return NULL;
64}
65
66int wxEnumClipboardFormats(int dataFormat)
67{
68 // TODO
69 return 0;
70}
71
72int wxRegisterClipboardFormat(char *formatName)
73{
74 // TODO
75 return 0;
76}
77
78bool wxGetClipboardFormatName(int dataFormat, char *formatName, int maxCount)
79{
80 // TODO
81 return FALSE;
82}
83
84/*
85 * Generalized clipboard implementation by Matthew Flatt
86 */
87
e7549107
SC
88wxClipboard::wxClipboard()
89{
90 m_clearOnExit = FALSE;
91}
e9576ca5 92
e7549107 93wxClipboard::~wxClipboard()
e9576ca5 94{
e7549107
SC
95 if ( m_clearOnExit )
96 {
97 Clear();
98 }
e9576ca5
SC
99}
100
e7549107 101void wxClipboard::Clear()
e9576ca5 102{
e9576ca5
SC
103}
104
e7549107 105bool wxClipboard::Flush()
e9576ca5 106{
e7549107
SC
107 return FALSE;
108}
109
110bool wxClipboard::Open()
111{
112 return wxOpenClipboard();
113}
114
115bool wxClipboard::IsOpened() const
116{
117 return wxIsClipboardOpened();
e9576ca5
SC
118}
119
120static int FormatStringToID(char *str)
121{
122 if (!strcmp(str, "TEXT"))
123 return wxDF_TEXT;
124
125 return wxRegisterClipboardFormat(str);
126}
127
e7549107
SC
128bool wxClipboard::SetData( wxDataObject *data )
129{
130 (void)wxEmptyClipboard();
131
132 if ( data )
133 return AddData(data);
134 else
135 return TRUE;
136}
137
138bool wxClipboard::AddData( wxDataObject *data )
139{
140 wxCHECK_MSG( data, FALSE, wxT("data is invalid") );
141
142#if wxUSE_DATAOBJ
143 wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") );
144
145 wxDataFormat format = data->GetFormat();
146
147 switch ( format )
148 {
149 case wxDF_TEXT:
150 case wxDF_OEMTEXT:
151 {
152 wxTextDataObject* textDataObject = (wxTextDataObject*) data;
153 wxString str(textDataObject->GetText());
154 return wxSetClipboardData(format, str.c_str());
155 }
156
157 case wxDF_BITMAP:
158 case wxDF_DIB:
159 {
160 wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data;
161 wxBitmap bitmap(bitmapDataObject->GetBitmap());
162 return wxSetClipboardData(data->GetFormat(), &bitmap);
163 }
164
165#if wxUSE_METAFILE
166 case wxDF_METAFILE:
167 {
168 wxMetafileDataObject* metaFileDataObject =
169 (wxMetafileDataObject*) data;
170 wxMetafile metaFile = metaFileDataObject->GetMetafile();
171 return wxSetClipboardData(wxDF_METAFILE, &metaFile,
172 metaFileDataObject->GetWidth(),
173 metaFileDataObject->GetHeight());
174 }
175#endif // wxUSE_METAFILE
176
177 default:
178 return wxSetClipboardData(data);
179 }
180#else // !wxUSE_DATAOBJ
181 return FALSE;
182#endif
183}
184
185void wxClipboard::Close()
186{
187 wxCloseClipboard();
188}
189
190bool wxClipboard::IsSupported( wxDataFormat format )
191{
192 return wxIsClipboardFormatAvailable(format);
193}
194
195bool wxClipboard::GetData( wxDataObject& data )
196{
197#if wxUSE_DATAOBJ
198 wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") );
199
200 wxDataFormat format = data.GetFormat();
201 switch ( format )
202 {
203 case wxDF_TEXT:
204 case wxDF_OEMTEXT:
205 {
206 wxTextDataObject& textDataObject = (wxTextDataObject &)data;
207 char* s = (char*)wxGetClipboardData(format);
208 if ( !s )
209 return FALSE;
210
211 textDataObject.SetText(s);
212 delete [] s;
213
214 return TRUE;
215 }
216
217 case wxDF_BITMAP:
218 case wxDF_DIB:
219 {
220 wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data;
221 wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data->GetFormat());
222 if ( !bitmap )
223 return FALSE;
224
225 bitmapDataObject.SetBitmap(*bitmap);
226 delete bitmap;
227
228 return TRUE;
229 }
230#if wxUSE_METAFILE
231 case wxDF_METAFILE:
232 {
233 wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
234 wxMetafile* metaFile = (wxMetafile *)wxGetClipboardData(wxDF_METAFILE);
235 if ( !metaFile )
236 return FALSE;
237
238 metaFileDataObject.SetMetafile(*metaFile);
239 delete metaFile;
240
241 return TRUE;
242 }
243#endif // wxUSE_METAFILE
244 }
245#else // !wxUSE_DATAOBJ
246 wxFAIL_MSG( wxT("no clipboard implementation") );
247#endif
248 return FALSE;
249}
250/*
e9576ca5
SC
251void wxClipboard::SetClipboardClient(wxClipboardClient *client, long time)
252{
253 bool got_selection;
254
255 if (clipOwner)
256 clipOwner->BeingReplaced();
257 clipOwner = client;
258 if (cbString) {
259 delete[] cbString;
260 cbString = NULL;
261 }
262
263 if (wxOpenClipboard()) {
264 char **formats, *data;
265 int i;
266 int ftype;
267 long size;
268
269 formats = clipOwner->formats.ListToArray(FALSE);
270 for (i = clipOwner->formats.Number(); i--; ) {
271 ftype = FormatStringToID(formats[i]);
272 data = clipOwner->GetData(formats[i], &size);
273 if (!wxSetClipboardData(ftype, (wxObject *)data, size, 1)) {
274 got_selection = FALSE;
275 break;
276 }
277 }
278
279 if (i < 0)
280 got_selection = wxCloseClipboard();
281 } else
282 got_selection = FALSE;
283
284 got_selection = FALSE; // Assume another process takes over
285
286 if (!got_selection) {
287 clipOwner->BeingReplaced();
288 clipOwner = NULL;
289 }
290}
291
292wxClipboardClient *wxClipboard::GetClipboardClient()
293{
294 return clipOwner;
295}
296
297void wxClipboard::SetClipboardString(char *str, long time)
e7549107 298{
e9576ca5
SC
299 bool got_selection;
300
301 if (clipOwner) {
302 clipOwner->BeingReplaced();
303 clipOwner = NULL;
304 }
305 if (cbString)
306 delete[] cbString;
307
308 cbString = str;
309
310 if (wxOpenClipboard()) {
311 if (!wxSetClipboardData(wxDF_TEXT, (wxObject *)str))
312 got_selection = FALSE;
313 else
314 got_selection = wxCloseClipboard();
315 } else
316 got_selection = FALSE;
317
318 got_selection = FALSE; // Assume another process takes over
319
320 if (!got_selection) {
321 delete[] cbString;
322 cbString = NULL;
323 }
324}
e9576ca5
SC
325char *wxClipboard::GetClipboardString(long time)
326{
327 char *str;
328 long length;
329
330 str = GetClipboardData("TEXT", &length, time);
331 if (!str) {
332 str = new char[1];
333 *str = 0;
334 }
335
336 return str;
337}
338
e7549107 339
e9576ca5
SC
340char *wxClipboard::GetClipboardData(char *format, long *length, long time)
341{
342 if (clipOwner) {
343 if (clipOwner->formats.Member(format))
344 return clipOwner->GetData(format, length);
345 else
346 return NULL;
347 } else if (cbString) {
348 if (!strcmp(format, "TEXT"))
349 return copystring(cbString);
350 else
351 return NULL;
352 } else {
353 if (wxOpenClipboard()) {
354 receivedString = (char *)wxGetClipboardData(FormatStringToID(format),
355 length);
356 wxCloseClipboard();
357 } else
358 receivedString = NULL;
359
360 return receivedString;
361 }
362}
e7549107 363*/
e9576ca5 364