///////////////////////////////////////////////////////////////////////////// // Name: clipbrd.cpp // Purpose: Clipboard functionality // Author: AUTHOR // Modified by: // Created: ??/??/98 // RCS-ID: $Id$ // Copyright: (c) AUTHOR // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation #pragma implementation "clipbrd.h" #endif #include "wx/app.h" #include "wx/frame.h" #include "wx/bitmap.h" #include "wx/utils.h" #include "wx/metafile.h" #include "wx/clipbrd.h" #include #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxClipboardClient, wxObject) #endif bool wxOpenClipboard() { // TODO return FALSE; } bool wxCloseClipboard() { // TODO return FALSE; } bool wxEmptyClipboard() { // TODO return FALSE; } bool wxClipboardOpen() { // TODO return FALSE; } bool wxIsClipboardFormatAvailable(int dataFormat) { // TODO return FALSE; } bool wxSetClipboardData(int dataFormat, wxObject *obj, int width, int height) { // TODO return FALSE; } wxObject *wxGetClipboardData(int dataFormat, long *len) { // TODO return NULL; } int wxEnumClipboardFormats(int dataFormat) { // TODO return 0; } int wxRegisterClipboardFormat(char *formatName) { // TODO return 0; } bool wxGetClipboardFormatName(int dataFormat, char *formatName, int maxCount) { // TODO return FALSE; } /* * Generalized clipboard implementation by Matthew Flatt */ wxClipboard *wxTheClipboard = NULL; void wxInitClipboard() { if (!wxTheClipboard) wxTheClipboard = new wxClipboard; } wxClipboard::wxClipboard() { clipOwner = NULL; cbString = NULL; } wxClipboard::~wxClipboard() { if (clipOwner) clipOwner->BeingReplaced(); if (cbString) delete[] cbString; } static int FormatStringToID(char *str) { if (!strcmp(str, "TEXT")) return wxDF_TEXT; return wxRegisterClipboardFormat(str); } void wxClipboard::SetClipboardClient(wxClipboardClient *client, long time) { bool got_selection; if (clipOwner) clipOwner->BeingReplaced(); clipOwner = client; if (cbString) { delete[] cbString; cbString = NULL; } if (wxOpenClipboard()) { char **formats, *data; int i; int ftype; long size; formats = clipOwner->formats.ListToArray(FALSE); for (i = clipOwner->formats.Number(); i--; ) { ftype = FormatStringToID(formats[i]); data = clipOwner->GetData(formats[i], &size); if (!wxSetClipboardData(ftype, (wxObject *)data, size, 1)) { got_selection = FALSE; break; } } if (i < 0) got_selection = wxCloseClipboard(); } else got_selection = FALSE; got_selection = FALSE; // Assume another process takes over if (!got_selection) { clipOwner->BeingReplaced(); clipOwner = NULL; } } wxClipboardClient *wxClipboard::GetClipboardClient() { return clipOwner; } void wxClipboard::SetClipboardString(char *str, long time) { bool got_selection; if (clipOwner) { clipOwner->BeingReplaced(); clipOwner = NULL; } if (cbString) delete[] cbString; cbString = str; if (wxOpenClipboard()) { if (!wxSetClipboardData(wxDF_TEXT, (wxObject *)str)) got_selection = FALSE; else got_selection = wxCloseClipboard(); } else got_selection = FALSE; got_selection = FALSE; // Assume another process takes over if (!got_selection) { delete[] cbString; cbString = NULL; } } char *wxClipboard::GetClipboardString(long time) { char *str; long length; str = GetClipboardData("TEXT", &length, time); if (!str) { str = new char[1]; *str = 0; } return str; } char *wxClipboard::GetClipboardData(char *format, long *length, long time) { if (clipOwner) { if (clipOwner->formats.Member(format)) return clipOwner->GetData(format, length); else return NULL; } else if (cbString) { if (!strcmp(format, "TEXT")) return copystring(cbString); else return NULL; } else { if (wxOpenClipboard()) { receivedString = (char *)wxGetClipboardData(FormatStringToID(format), length); wxCloseClipboard(); } else receivedString = NULL; return receivedString; } }