]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/osx/carbon/clipbrd.cpp
Correct format specifiers used to show wxIPV4address.
[wxWidgets.git] / src / osx / carbon / clipbrd.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/osx/carbon/clipbrd.cpp
3// Purpose: Clipboard functionality
4// Author: Stefan Csomor;
5// Generalized clipboard implementation by Matthew Flatt
6// Modified by:
7// Created: 1998-01-01
8// RCS-ID: $Id$
9// Copyright: (c) Stefan Csomor
10// Licence: wxWindows licence
11/////////////////////////////////////////////////////////////////////////////
12
13#include "wx/wxprec.h"
14
15#if wxUSE_CLIPBOARD
16
17#include "wx/clipbrd.h"
18
19#ifndef WX_PRECOMP
20 #include "wx/intl.h"
21 #include "wx/log.h"
22 #include "wx/app.h"
23 #include "wx/utils.h"
24 #include "wx/frame.h"
25 #include "wx/bitmap.h"
26#endif
27
28#include "wx/metafile.h"
29
30#include "wx/osx/private.h"
31
32#define wxUSE_DATAOBJ 1
33
34#include <string.h>
35
36// the trace mask we use with wxLogTrace() - call
37// wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here
38// (there will be a *lot* of them!)
39#define TRACE_CLIPBOARD wxT("clipboard")
40
41IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject)
42
43wxClipboard::wxClipboard()
44{
45 m_open = false;
46 m_data = NULL ;
47 PasteboardRef clipboard = 0;
48 OSStatus err = PasteboardCreate( kPasteboardClipboard, &clipboard );
49 if (err != noErr)
50 {
51 wxLogSysError( wxT("Failed to create the clipboard.") );
52 }
53 m_pasteboard.reset(clipboard);
54}
55
56wxClipboard::~wxClipboard()
57{
58 m_pasteboard.reset((PasteboardRef)0);
59 delete m_data;
60}
61
62void wxClipboard::Clear()
63{
64 wxDELETE(m_data);
65
66 OSStatus err = PasteboardClear( m_pasteboard );
67 if (err != noErr)
68 {
69 wxLogSysError( wxT("Failed to empty the clipboard.") );
70 }
71}
72
73bool wxClipboard::Flush()
74{
75 return false;
76}
77
78bool wxClipboard::Open()
79{
80 wxCHECK_MSG( !m_open, false, wxT("clipboard already open") );
81
82 m_open = true;
83
84 return true;
85}
86
87bool wxClipboard::IsOpened() const
88{
89 return m_open;
90}
91
92bool wxClipboard::SetData( wxDataObject *data )
93{
94 if ( IsUsingPrimarySelection() )
95 return false;
96
97 wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
98 wxCHECK_MSG( data, false, wxT("data is invalid") );
99
100 Clear();
101
102 // as we can only store one wxDataObject,
103 // this is the same in this implementation
104 return AddData( data );
105}
106
107bool wxClipboard::AddData( wxDataObject *data )
108{
109 if ( IsUsingPrimarySelection() )
110 return false;
111
112 wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
113 wxCHECK_MSG( data, false, wxT("data is invalid") );
114
115 // we can only store one wxDataObject
116 Clear();
117
118 PasteboardSyncFlags syncFlags = PasteboardSynchronize( m_pasteboard );
119 wxCHECK_MSG( !(syncFlags&kPasteboardModified), false, wxT("clipboard modified after clear") );
120 wxCHECK_MSG( (syncFlags&kPasteboardClientIsOwner), false, wxT("client couldn't own clipboard") );
121
122 m_data = data;
123
124 data->AddToPasteboard( m_pasteboard, 1 );
125
126 return true;
127}
128
129void wxClipboard::Close()
130{
131 wxCHECK_RET( m_open, wxT("clipboard not open") );
132
133 m_open = false;
134
135 // Get rid of cached object.
136 // If this is not done, copying data from
137 // another application will only work once
138 wxDELETE(m_data);
139}
140
141bool wxClipboard::IsSupported( const wxDataFormat &dataFormat )
142{
143 wxLogTrace(TRACE_CLIPBOARD, wxT("Checking if format %s is available"),
144 dataFormat.GetId().c_str());
145
146 if ( m_data )
147 return m_data->IsSupported( dataFormat );
148 return wxDataObject::IsFormatInPasteboard( m_pasteboard, dataFormat );
149}
150
151bool wxClipboard::GetData( wxDataObject& data )
152{
153 if ( IsUsingPrimarySelection() )
154 return false;
155
156 wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
157
158 size_t formatcount = data.GetFormatCount() + 1;
159 wxDataFormat *array = new wxDataFormat[ formatcount ];
160 array[0] = data.GetPreferredFormat();
161 data.GetAllFormats( &array[1] );
162
163 bool transferred = false;
164
165 if ( m_data )
166 {
167 for (size_t i = 0; !transferred && i < formatcount; i++)
168 {
169 wxDataFormat format = array[ i ];
170 if ( m_data->IsSupported( format ) )
171 {
172 int dataSize = m_data->GetDataSize( format );
173 transferred = true;
174
175 if (dataSize == 0)
176 {
177 data.SetData( format, 0, 0 );
178 }
179 else
180 {
181 char *d = new char[ dataSize ];
182 m_data->GetDataHere( format, (void*)d );
183 data.SetData( format, dataSize, d );
184 delete [] d;
185 }
186 }
187 }
188 }
189
190 // get formats from wxDataObjects
191 if ( !transferred )
192 {
193 transferred = data.GetFromPasteboard( m_pasteboard ) ;
194 }
195
196 delete [] array;
197
198 return transferred;
199}
200
201#endif