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
5 #include "ClipboardSnap.h"
\r
10 static char THIS_FILE[]=__FILE__;
\r
11 #define new DEBUG_NEW
\r
14 //////////////////////////////////////////////////////////////////////
\r
15 //
\8d\
\92z/
\8fÁ
\96Å
\r
16 //////////////////////////////////////////////////////////////////////
\r
18 CClipboardSnap::CClipboardSnap() : m_oFormatSnaps()
\r
23 CClipboardSnap::~CClipboardSnap()
\r
28 //////////////////////////////////////////////////////////////////////
\r
30 //////////////////////////////////////////////////////////////////////
\r
32 CClipboardSnap::CClipboardSnap( const CClipboardSnap& rhs ) : m_oFormatSnaps()
\r
35 int nLen = rhs.m_oFormatSnaps.GetSize();
\r
37 m_oFormatSnaps.SetSize( nLen );
\r
39 for( int i = 0; i < nLen; ++i )
\r
42 m_oFormatSnaps[ i ] = new CClipboardFormatSnap;
\r
43 if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];
\r
45 catch (CMemoryException* e) {
\r
47 // CUtils::Log("CClipboardSnap::CClipboardSnap: 'new' threw an exception");
\r
51 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
52 m_pNext = rhs.m_pNext;
\r
55 const BOOL CClipboardSnap::operator==( const CClipboardSnap& rhs )
\r
57 if( m_oFormatSnaps.GetSize() != rhs.m_oFormatSnaps.GetSize() ) return FALSE;
\r
59 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
61 if ( *m_oFormatSnaps[ i ] != *rhs.m_oFormatSnaps[ i ] ) return FALSE;
\r
67 const BOOL CClipboardSnap::operator!=( const CClipboardSnap& rhs )
\r
69 return !( *this == rhs );
\r
72 const CClipboardSnap& CClipboardSnap::operator=( const CClipboardSnap& rhs )
\r
74 int nLen = rhs.m_oFormatSnaps.GetSize();
\r
76 m_oFormatSnaps.SetSize( nLen );
\r
78 for( int i = 0; i < nLen; ++i )
\r
81 m_oFormatSnaps[ i ] = new CClipboardFormatSnap;
\r
82 if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];
\r
84 catch (CMemoryException* e) {
\r
86 // CUtils::Log("CClipboardSnap::operator=: 'new' threw an exception");
\r
90 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
91 m_pNext = rhs.m_pNext;
\r
96 const CClipboardSnap& CClipboardSnap::operator+=( const CClipboardSnap& rhs )
\r
98 const CClipboardSnap lhs = *this;
\r
100 // count the number of mergeable clipboard format
\r
101 int nMergeableClipboardFormatNumber = 0;
\r
102 struct MergeableClipboardFormatPosition
\r
108 const int nMergeableClipboardFormatPosition = lhs.m_oFormatSnaps.GetSize() + rhs.m_oFormatSnaps.GetSize();
\r
110 MergeableClipboardFormatPosition *const pMergeableClipboardFormatPosition = new MergeableClipboardFormatPosition[ nMergeableClipboardFormatPosition ];
\r
111 if( !pMergeableClipboardFormatPosition ) return *this;
\r
113 memset( pMergeableClipboardFormatPosition, -1, sizeof(MergeableClipboardFormatPosition) * nMergeableClipboardFormatPosition );
\r
115 for( int nLHS = 0; nLHS < lhs.m_oFormatSnaps.GetSize(); ++nLHS ) // LHS: Left Hand Side
\r
117 if( lhs.m_oFormatSnaps[ nLHS ]->IsMergeableFormat() )
\r
119 ( pMergeableClipboardFormatPosition + nMergeableClipboardFormatNumber )->m_nLHS = nLHS;
\r
120 ++nMergeableClipboardFormatNumber;
\r
123 for( int nRHS = 0; nRHS < rhs.m_oFormatSnaps.GetSize(); ++nRHS ) // RHS: Right Hand Side
\r
125 if( rhs.m_oFormatSnaps[ nRHS ]->IsMergeableFormat() )
\r
128 for( i = 0; i < nMergeableClipboardFormatNumber; ++i )
\r
130 if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) continue;
\r
131 if( rhs.m_oFormatSnaps[ nRHS ]->IsSameFormat( lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] ) ) break;
\r
134 ( pMergeableClipboardFormatPosition + i )->m_nRHS = nRHS;
\r
135 if( i == nMergeableClipboardFormatNumber )
\r
137 ++nMergeableClipboardFormatNumber;
\r
142 // clear current data
\r
143 m_oFormatSnaps.RemoveAll();
\r
144 m_oFormatSnaps.SetSize( nMergeableClipboardFormatNumber );
\r
147 for( int i = 0; i < nMergeableClipboardFormatNumber; ++i )
\r
149 CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;
\r
152 m_oFormatSnaps[ i ] = pFormatSnap;
\r
153 if( ( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) &&
\r
154 ( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 ) )
\r
158 else if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 )
\r
160 *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];
\r
162 else if( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 )
\r
164 *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];
\r
168 // *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] += *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];
\r
169 // *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];
\r
170 *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ] +
\r
171 *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];
\r
172 // m_oFormatSnaps[ i ]->Merge( *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ],
\r
173 // *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ] );
\r
178 catch (CMemoryException* e) {
\r
180 // CUtils::Log("CClipboardSnap::operator+=: 'new' threw an exception");
\r
186 //////////////////////////////////////////////////////////////////////
\r
188 //////////////////////////////////////////////////////////////////////
\r
190 BOOL CClipboardSnap::Capture( const BOOL bTextOnly )
\r
192 // CUtils::Log( "CClipboardSnap::Capture(): start" );
\r
194 ClearFormatSnaps();
\r
195 if( !CUtils::OpenClipboard() ) return FALSE;
\r
198 int nFormatCount = CountClipboardFormats();
\r
200 for( int i = 0; i < nFormatCount; ++i )
\r
202 nFormat = EnumClipboardFormats( nFormat );
\r
203 if( nFormat == 0 ) break;
\r
204 // CUtils::Log("CClipboardSnap::Capture(): i = %d, nFormat = %d (%s)", i, nFormat, GetFormatName(nFormat));
\r
206 if( bTextOnly && !CClipboardFormatSnap::IsMergeableFormat( nFormat ) ) continue;
\r
208 // for Microsoft Word
\r
209 if( i && nFormat == 49163 ) continue;
\r
210 if( i && nFormat == 49156 ) continue;
\r
213 CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;
\r
215 if( pFormatSnap && !pFormatSnap->Capture( nFormat ) ) {
\r
216 // AfxMessageBox( _T("Capture Ignored or Failed:\n") + GetFormatName(nFormat) );
\r
217 // CUtils::Log( "CClipboardSnap::Capture(): Capture Ignored or Failed" );
\r
219 // CUtils::Log( "CClipboardSnap::Capture(): add start" );
\r
220 m_oFormatSnaps.Add( pFormatSnap );
\r
221 // CUtils::Log( "CClipboardSnap::Capture(): add end" );
\r
224 catch (CMemoryException* e) {
\r
226 // CUtils::Log("CClipboardSnap::Capture: 'new' threw an exception");
\r
231 // CUtils::Log( "CClipboardSnap::Capture(): end" );
\r
235 BOOL CClipboardSnap::Restore()
\r
237 if( !CUtils::OpenClipboard() ) return FALSE;
\r
240 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
242 m_oFormatSnaps[ i ]->Restore();
\r
249 void CClipboardSnap::ClearFormatSnaps()
\r
251 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
253 delete m_oFormatSnaps[ i ];
\r
255 m_oFormatSnaps.RemoveAll();
\r
257 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
261 int CClipboardSnap::FindReturn()
\r
263 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
265 int rc = m_oFormatSnaps[ i ]->FindReturn();
\r
266 if( rc != -1 ) return rc;
\r
271 BOOL CClipboardSnap::IsEmpty()
\r
273 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
275 if( !m_oFormatSnaps[ i ]->IsEmpty() ) return FALSE;
\r
280 void CClipboardSnap::Add( const char *const pAddedString, const BOOL bTop )
\r
282 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
284 m_oFormatSnaps[ i ]->Add( pAddedString, bTop );
\r
288 void CClipboardSnap::DeleteLastReturn()
\r
290 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
292 m_oFormatSnaps[ i ]->DeleteLastReturn();
\r
296 void CClipboardSnap::SetNext( CClipboardSnap* pNext )
\r
298 if( m_pNext ) m_pNext->ClearFormatSnaps();
\r
302 CClipboardSnap* CClipboardSnap::GetNext()
\r
307 BOOL CClipboardSnap::IsAllMergeableFormat()
\r
309 for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )
\r
311 if( !m_oFormatSnaps[ i ]->IsMergeableFormat() ) return FALSE;
\r
316 int CClipboardSnap::GetCount()
\r
319 for( CClipboardSnap* pSnap = this; pSnap->GetNext(); pSnap = pSnap->GetNext() ) ++nCount;
\r