OSDN Git Service

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