1 // ClipboardSnap.cpp: CClipboardSnap
\83N
\83\89\83X
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93\r
3 //////////////////////////////////////////////////////////////////////
\r
6 #include "ClipboardSnap.h"
\r
11 static char THIS_FILE[]=__FILE__;
\r
12 #define new DEBUG_NEW
\r
15 //////////////////////////////////////////////////////////////////////
\r
16 //
\8d\
\92z/
\8fÁ
\96Å
\r
17 //////////////////////////////////////////////////////////////////////
\r
19 CClipboardSnap::CClipboardSnap() : m_oFormatSnaps()
\r
24 CClipboardSnap::~CClipboardSnap()
\r
29 //////////////////////////////////////////////////////////////////////
\r
31 //////////////////////////////////////////////////////////////////////
\r
33 CClipboardSnap::CClipboardSnap( const CClipboardSnap& rhs ) : m_oFormatSnaps()
\r
36 int nLen = rhs.m_oFormatSnaps.GetSize();
\r
38 m_oFormatSnaps.SetSize( nLen );
\r
40 for( int i = 0; i < nLen; ++i )
\r
43 m_oFormatSnaps[ i ] = new CClipboardFormatSnap;
\r
44 if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];
\r
46 catch (CMemoryException* e) {
\r
48 // CUtils::Log("CClipboardSnap::CClipboardSnap: 'new' threw an exception");
\r
52 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
53 m_pNext = rhs.m_pNext;
\r
56 const BOOL CClipboardSnap::operator==( const CClipboardSnap& rhs )
\r
58 if( m_oFormatSnaps.GetSize() != rhs.m_oFormatSnaps.GetSize() ) return FALSE;
\r
60 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
62 if ( *m_oFormatSnaps[ i ] != *rhs.m_oFormatSnaps[ i ] ) return FALSE;
\r
68 const BOOL CClipboardSnap::operator!=( const CClipboardSnap& rhs )
\r
70 return !( *this == rhs );
\r
73 const CClipboardSnap& CClipboardSnap::operator=( const CClipboardSnap& rhs )
\r
75 int nLen = rhs.m_oFormatSnaps.GetSize();
\r
77 m_oFormatSnaps.SetSize( nLen );
\r
79 for( int i = 0; i < nLen; ++i )
\r
82 m_oFormatSnaps[ i ] = new CClipboardFormatSnap;
\r
83 if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];
\r
85 catch (CMemoryException* e) {
\r
87 // CUtils::Log("CClipboardSnap::operator=: 'new' threw an exception");
\r
91 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
92 m_pNext = rhs.m_pNext;
\r
97 const CClipboardSnap& CClipboardSnap::operator+=( const CClipboardSnap& rhs )
\r
99 const CClipboardSnap lhs = *this;
\r
101 // count the number of mergeable clipboard format
\r
102 int nMergeableClipboardFormatNumber = 0;
\r
103 struct MergeableClipboardFormatPosition
\r
109 const int nMergeableClipboardFormatPosition = lhs.m_oFormatSnaps.GetSize() + rhs.m_oFormatSnaps.GetSize();
\r
111 MergeableClipboardFormatPosition *const pMergeableClipboardFormatPosition = new MergeableClipboardFormatPosition[ nMergeableClipboardFormatPosition ];
\r
112 if( !pMergeableClipboardFormatPosition ) return *this;
\r
114 memset( pMergeableClipboardFormatPosition, -1, sizeof(MergeableClipboardFormatPosition) * nMergeableClipboardFormatPosition );
\r
116 for( int nLHS = 0; nLHS < lhs.m_oFormatSnaps.GetSize(); ++nLHS ) // LHS: Left Hand Side
\r
118 if( lhs.m_oFormatSnaps[ nLHS ]->IsMergeableFormat() )
\r
120 ( pMergeableClipboardFormatPosition + nMergeableClipboardFormatNumber )->m_nLHS = nLHS;
\r
121 ++nMergeableClipboardFormatNumber;
\r
124 for( int nRHS = 0; nRHS < rhs.m_oFormatSnaps.GetSize(); ++nRHS ) // RHS: Right Hand Side
\r
126 if( rhs.m_oFormatSnaps[ nRHS ]->IsMergeableFormat() )
\r
129 for( i = 0; i < nMergeableClipboardFormatNumber; ++i )
\r
131 if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) continue;
\r
132 if( rhs.m_oFormatSnaps[ nRHS ]->IsSameFormat( lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] ) ) break;
\r
135 ( pMergeableClipboardFormatPosition + i )->m_nRHS = nRHS;
\r
136 if( i == nMergeableClipboardFormatNumber )
\r
138 ++nMergeableClipboardFormatNumber;
\r
143 // clear current data
\r
144 m_oFormatSnaps.RemoveAll();
\r
145 m_oFormatSnaps.SetSize( nMergeableClipboardFormatNumber );
\r
148 for( int i = 0; i < nMergeableClipboardFormatNumber; ++i )
\r
150 CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;
\r
153 m_oFormatSnaps[ i ] = pFormatSnap;
\r
154 if( ( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) &&
\r
155 ( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 ) )
\r
159 else if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 )
\r
161 *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];
\r
163 else if( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 )
\r
165 *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];
\r
169 // *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] += *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];
\r
170 // *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];
\r
171 *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] +
\r
172 *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];
\r
173 // m_oFormatSnaps[ i ]->Merge( *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ],
\r
174 // *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ] );
\r
179 catch (CMemoryException* e) {
\r
181 // CUtils::Log("CClipboardSnap::operator+=: 'new' threw an exception");
\r
187 //////////////////////////////////////////////////////////////////////
\r
189 //////////////////////////////////////////////////////////////////////
\r
191 BOOL CClipboardSnap::Capture( const BOOL bTextOnly )
\r
193 // CUtils::Log( "CClipboardSnap::Capture(): start" );
\r
195 ClearFormatSnaps();
\r
196 if( !CUtils::OpenClipboard() ) return FALSE;
\r
199 int nFormatCount = CountClipboardFormats();
\r
201 for( int i = 0; i < nFormatCount; ++i )
\r
203 nFormat = EnumClipboardFormats( nFormat );
\r
204 if( nFormat == 0 ) break;
\r
205 // CUtils::Log("CClipboardSnap::Capture(): i = %d, nFormat = %d (%s)", i, nFormat, GetFormatName(nFormat));
\r
207 if( bTextOnly && !CClipboardFormatSnap::IsMergeableFormat( nFormat ) ) continue;
\r
209 // for Microsoft Word
\r
210 if( i && nFormat == 49163 ) continue;
\r
211 if( i && nFormat == 49156 ) continue;
\r
214 CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;
\r
216 if( pFormatSnap && !pFormatSnap->Capture( nFormat ) ) {
\r
217 // AfxMessageBox( _T("Capture Ignored or Failed:\n") + GetFormatName(nFormat) );
\r
218 // CUtils::Log( "CClipboardSnap::Capture(): Capture Ignored or Failed" );
\r
220 // CUtils::Log( "CClipboardSnap::Capture(): add start" );
\r
221 m_oFormatSnaps.Add( pFormatSnap );
\r
222 // CUtils::Log( "CClipboardSnap::Capture(): add end" );
\r
225 catch (CMemoryException* e) {
\r
227 // CUtils::Log("CClipboardSnap::Capture: 'new' threw an exception");
\r
232 // CUtils::Log( "CClipboardSnap::Capture(): end" );
\r
236 BOOL CClipboardSnap::Restore()
\r
238 if( !CUtils::OpenClipboard() ) return FALSE;
\r
241 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
243 m_oFormatSnaps[ i ]->Restore();
\r
250 void CClipboardSnap::ClearFormatSnaps()
\r
252 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
254 delete m_oFormatSnaps[ i ];
\r
256 m_oFormatSnaps.RemoveAll();
\r
258 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
262 int CClipboardSnap::FindReturn()
\r
264 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
266 int rc = m_oFormatSnaps[ i ]->FindReturn();
\r
267 if( rc != -1 ) return rc;
\r
272 BOOL CClipboardSnap::IsEmpty()
\r
274 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
276 if( !m_oFormatSnaps[ i ]->IsEmpty() ) return FALSE;
\r
281 void CClipboardSnap::Add( const char *const pAddedString, const BOOL bTop )
\r
283 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
285 m_oFormatSnaps[ i ]->Add( pAddedString, bTop );
\r
289 void CClipboardSnap::DeleteLastReturn()
\r
291 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
293 m_oFormatSnaps[ i ]->DeleteLastReturn();
\r
297 void CClipboardSnap::SetNext( CClipboardSnap* pNext )
\r
299 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
303 CClipboardSnap* CClipboardSnap::GetNext()
\r
308 BOOL CClipboardSnap::IsAllMergeableFormat()
\r
310 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
312 if( !m_oFormatSnaps[ i ]->IsMergeableFormat() ) return FALSE;
\r
317 int CClipboardSnap::GetCount()
\r
320 for( CClipboardSnap* pSnap = this; pSnap->GetNext(); pSnap = pSnap->GetNext() ) ++nCount;
\r