OSDN Git Service

Use pre increments if possible.
[xkeymacs/xkeymacs.git] / xkeymacsdll / ClipboardSnap.cpp
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
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 #include "stdafx.h"\r
6 #include "ClipboardSnap.h"\r
7 #include "Utils.h"\r
8 \r
9 #ifdef _DEBUG\r
10 #undef THIS_FILE\r
11 static char THIS_FILE[]=__FILE__;\r
12 #define new DEBUG_NEW\r
13 #endif\r
14 \r
15 //////////////////////////////////////////////////////////////////////\r
16 // \8d\\92z/\8fÁ\96Å\r
17 //////////////////////////////////////////////////////////////////////\r
18 \r
19 CClipboardSnap::CClipboardSnap() :  m_oFormatSnaps()\r
20 {\r
21         m_pNext = NULL;\r
22 }\r
23 \r
24 CClipboardSnap::~CClipboardSnap()\r
25 {\r
26         ClearFormatSnaps();\r
27 }\r
28 \r
29 //////////////////////////////////////////////////////////////////////\r
30 // \83R\83s\81[\r
31 //////////////////////////////////////////////////////////////////////\r
32 \r
33 CClipboardSnap::CClipboardSnap( const CClipboardSnap& rhs ) : m_oFormatSnaps()\r
34 {\r
35         m_pNext = NULL;\r
36         int nLen = rhs.m_oFormatSnaps.GetSize();\r
37         ClearFormatSnaps();\r
38         m_oFormatSnaps.SetSize( nLen );\r
39 \r
40         for( int i = 0; i < nLen; ++i )\r
41         {\r
42                 try {\r
43                         m_oFormatSnaps[ i ]  = new CClipboardFormatSnap;\r
44                         if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];\r
45                 }\r
46                 catch (CMemoryException* e) {\r
47                         e->Delete();\r
48 //                      CUtils::Log("CClipboardSnap::CClipboardSnap: 'new' threw an exception");\r
49                 }\r
50         }\r
51 \r
52         if( m_pNext ) m_pNext->ClearFormatSnaps();\r
53         m_pNext = rhs.m_pNext;\r
54 }\r
55 \r
56 const BOOL CClipboardSnap::operator==( const CClipboardSnap& rhs )\r
57 {\r
58         if( m_oFormatSnaps.GetSize() != rhs.m_oFormatSnaps.GetSize() ) return FALSE;\r
59 \r
60         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
61         {\r
62                 if ( *m_oFormatSnaps[ i ] != *rhs.m_oFormatSnaps[ i ] ) return FALSE;\r
63         }\r
64 \r
65         return TRUE;\r
66 }\r
67 \r
68 const BOOL CClipboardSnap::operator!=( const CClipboardSnap& rhs )\r
69 {\r
70         return !( *this == rhs );\r
71 }\r
72 \r
73 const CClipboardSnap& CClipboardSnap::operator=( const CClipboardSnap& rhs )\r
74 {\r
75         int nLen = rhs.m_oFormatSnaps.GetSize();\r
76         ClearFormatSnaps();\r
77         m_oFormatSnaps.SetSize( nLen );\r
78 \r
79         for( int i = 0; i < nLen; ++i )\r
80         {\r
81                 try {\r
82                         m_oFormatSnaps[ i ]  = new CClipboardFormatSnap;\r
83                         if( m_oFormatSnaps[ i ] ) *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ i ];\r
84                 }\r
85                 catch (CMemoryException* e) {\r
86                         e->Delete();\r
87 //                      CUtils::Log("CClipboardSnap::operator=: 'new' threw an exception");\r
88                 }\r
89         }\r
90 \r
91         if( m_pNext ) m_pNext->ClearFormatSnaps();\r
92         m_pNext = rhs.m_pNext;\r
93 \r
94         return *this;\r
95 }\r
96 \r
97 const CClipboardSnap& CClipboardSnap::operator+=( const CClipboardSnap& rhs )\r
98 {\r
99         const CClipboardSnap lhs = *this;\r
100 \r
101         // count the number of mergeable clipboard format\r
102         int nMergeableClipboardFormatNumber = 0;\r
103         struct MergeableClipboardFormatPosition\r
104         {\r
105                 int m_nLHS;\r
106                 int m_nRHS;\r
107         };\r
108 \r
109         const int nMergeableClipboardFormatPosition = lhs.m_oFormatSnaps.GetSize() + rhs.m_oFormatSnaps.GetSize();\r
110         try {\r
111                 MergeableClipboardFormatPosition *const pMergeableClipboardFormatPosition = new MergeableClipboardFormatPosition[ nMergeableClipboardFormatPosition ];\r
112                 if( !pMergeableClipboardFormatPosition ) return *this;\r
113 \r
114                 memset( pMergeableClipboardFormatPosition, -1, sizeof(MergeableClipboardFormatPosition) * nMergeableClipboardFormatPosition );\r
115 \r
116                 for( int nLHS = 0; nLHS < lhs.m_oFormatSnaps.GetSize(); ++nLHS )        // LHS: Left Hand Side\r
117                 {\r
118                         if( lhs.m_oFormatSnaps[ nLHS ]->IsMergeableFormat() )\r
119                         {\r
120                                 ( pMergeableClipboardFormatPosition + nMergeableClipboardFormatNumber )->m_nLHS = nLHS;\r
121                                 ++nMergeableClipboardFormatNumber;\r
122                         }\r
123                 }\r
124                 for( int nRHS = 0; nRHS < rhs.m_oFormatSnaps.GetSize(); ++nRHS )        // RHS: Right Hand Side\r
125                 {\r
126                         if( rhs.m_oFormatSnaps[ nRHS ]->IsMergeableFormat() )\r
127                         {\r
128                                 int i;\r
129                                 for( i = 0; i < nMergeableClipboardFormatNumber; ++i )\r
130                                 {\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
133                                 }\r
134 \r
135                                 ( pMergeableClipboardFormatPosition + i )->m_nRHS = nRHS;\r
136                                 if( i ==  nMergeableClipboardFormatNumber )\r
137                                 {\r
138                                         ++nMergeableClipboardFormatNumber;\r
139                                 }\r
140                         }\r
141                 }\r
142 \r
143                 // clear current data\r
144                 m_oFormatSnaps.RemoveAll();\r
145                 m_oFormatSnaps.SetSize( nMergeableClipboardFormatNumber );\r
146 \r
147                 // set data\r
148                 for( int i = 0; i < nMergeableClipboardFormatNumber; ++i )\r
149                 {\r
150                         CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;\r
151                         if( pFormatSnap )\r
152                         {\r
153                                 m_oFormatSnaps[ i ] = pFormatSnap;\r
154                                 if( ( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 ) &&\r
155                                         ( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 ) )\r
156                                 {\r
157                                         ASSERT( 0 );\r
158                                 }\r
159                                 else if( ( pMergeableClipboardFormatPosition + i )->m_nLHS < 0 )\r
160                                 {\r
161                                         *m_oFormatSnaps[ i ] = *rhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nRHS ];\r
162                                 }\r
163                                 else if( ( pMergeableClipboardFormatPosition + i )->m_nRHS < 0 )\r
164                                 {\r
165                                         *m_oFormatSnaps[ i ] = *lhs.m_oFormatSnaps[ ( pMergeableClipboardFormatPosition + i )->m_nLHS ];\r
166                                 }\r
167                                 else\r
168                                 {\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
175                                 }\r
176                         }\r
177                 }\r
178         }\r
179         catch (CMemoryException* e) {\r
180                 e->Delete();\r
181 //              CUtils::Log("CClipboardSnap::operator+=: 'new' threw an exception");\r
182         }\r
183 \r
184         return *this;\r
185 }\r
186 \r
187 //////////////////////////////////////////////////////////////////////\r
188 // \91\80\8dì\r
189 //////////////////////////////////////////////////////////////////////\r
190 \r
191 BOOL CClipboardSnap::Capture( const BOOL bTextOnly )\r
192 {\r
193 //      CUtils::Log( "CClipboardSnap::Capture(): start" );\r
194 \r
195         ClearFormatSnaps();\r
196         if( !CUtils::OpenClipboard() ) return FALSE;\r
197 \r
198         int nFormat = 0;\r
199         int nFormatCount = CountClipboardFormats();\r
200 \r
201         for( int i = 0; i < nFormatCount; ++i )\r
202         {\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
206 \r
207                 if( bTextOnly && !CClipboardFormatSnap::IsMergeableFormat( nFormat ) ) continue;\r
208 \r
209                 // for Microsoft Word\r
210                 if( i && nFormat == 49163 ) continue;\r
211                 if( i && nFormat == 49156 ) continue;\r
212 \r
213                 try {\r
214                         CClipboardFormatSnap *pFormatSnap = new CClipboardFormatSnap;\r
215 \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
219                         } else {\r
220 //                              CUtils::Log( "CClipboardSnap::Capture(): add start" );\r
221                                 m_oFormatSnaps.Add( pFormatSnap );\r
222 //                              CUtils::Log( "CClipboardSnap::Capture(): add end" );\r
223                         }\r
224                 }\r
225                 catch (CMemoryException* e) {\r
226                         e->Delete();\r
227 //                      CUtils::Log("CClipboardSnap::Capture: 'new' threw an exception");\r
228                 }\r
229         }\r
230 \r
231         CloseClipboard();\r
232 //      CUtils::Log( "CClipboardSnap::Capture(): end" );\r
233         return TRUE;\r
234 }\r
235 \r
236 BOOL CClipboardSnap::Restore()\r
237 {\r
238         if( !CUtils::OpenClipboard() ) return FALSE;\r
239         EmptyClipboard();\r
240 \r
241         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
242         {\r
243                 m_oFormatSnaps[ i ]->Restore();\r
244         }\r
245 \r
246         CloseClipboard();\r
247         return TRUE;\r
248 }\r
249 \r
250 void CClipboardSnap::ClearFormatSnaps()\r
251 {\r
252         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
253         {\r
254                 delete m_oFormatSnaps[ i ];\r
255         }\r
256         m_oFormatSnaps.RemoveAll();\r
257 \r
258         if( m_pNext ) m_pNext->ClearFormatSnaps();\r
259         m_pNext = NULL;\r
260 }\r
261 \r
262 int CClipboardSnap::FindReturn()\r
263 {\r
264         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
265         {\r
266                 int rc = m_oFormatSnaps[ i ]->FindReturn();\r
267                 if( rc != -1 ) return rc;\r
268         }\r
269         return -1;\r
270 }\r
271 \r
272 BOOL CClipboardSnap::IsEmpty()\r
273 {\r
274         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
275         {\r
276                 if( !m_oFormatSnaps[ i ]->IsEmpty() ) return FALSE;\r
277         }\r
278         return TRUE;\r
279 }\r
280 \r
281 void CClipboardSnap::Add( const char *const pAddedString, const BOOL bTop )\r
282 {\r
283         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
284         {\r
285                 m_oFormatSnaps[ i ]->Add( pAddedString, bTop );\r
286         }\r
287 }\r
288 \r
289 void CClipboardSnap::DeleteLastReturn()\r
290 {\r
291         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
292         {\r
293                 m_oFormatSnaps[ i ]->DeleteLastReturn();\r
294         }\r
295 }\r
296 \r
297 void CClipboardSnap::SetNext( CClipboardSnap* pNext )\r
298 {\r
299         if( m_pNext ) m_pNext->ClearFormatSnaps();\r
300         m_pNext = pNext;\r
301 }\r
302 \r
303 CClipboardSnap* CClipboardSnap::GetNext()\r
304 {\r
305         return m_pNext;\r
306 }\r
307 \r
308 BOOL CClipboardSnap::IsAllMergeableFormat()\r
309 {\r
310         for( int i = 0; i < m_oFormatSnaps.GetSize(); ++i )\r
311         {\r
312                 if( !m_oFormatSnaps[ i ]->IsMergeableFormat() ) return FALSE;\r
313         }\r
314         return TRUE;\r
315 }\r
316 \r
317 int CClipboardSnap::GetCount()\r
318 {\r
319         int nCount = 1;\r
320         for( CClipboardSnap* pSnap = this; pSnap->GetNext(); pSnap = pSnap->GetNext() ) ++nCount;\r
321         return ++nCount;\r
322 }\r