joachim99@8
|
1 /***************************************************************************
|
joachim99@8
|
2 directorymergewindow.h
|
joachim99@8
|
3 -------------------
|
joachim99@8
|
4 begin : Sat Oct 19 2002
|
joachim99@58
|
5 copyright : (C) 2002-2004 by Joachim Eibl
|
joachim99@8
|
6 email : joachim.eibl@gmx.de
|
joachim99@8
|
7 ***************************************************************************/
|
joachim99@8
|
8
|
joachim99@8
|
9 /***************************************************************************
|
joachim99@8
|
10 * *
|
joachim99@8
|
11 * This program is free software; you can redistribute it and/or modify *
|
joachim99@8
|
12 * it under the terms of the GNU General Public License as published by *
|
joachim99@8
|
13 * the Free Software Foundation; either version 2 of the License, or *
|
joachim99@8
|
14 * (at your option) any later version. *
|
joachim99@8
|
15 * *
|
joachim99@8
|
16 ***************************************************************************/
|
joachim99@8
|
17
|
joachim99@8
|
18 #ifndef DIRECTORY_MERGE_WINDOW_H
|
joachim99@8
|
19 #define DIRECTORY_MERGE_WINDOW_H
|
joachim99@8
|
20
|
joachim99@8
|
21 #include <qfileinfo.h>
|
joachim99@8
|
22 #include <qlistview.h>
|
joachim99@8
|
23 #include <qtimer.h>
|
joachim99@8
|
24 #include <qdir.h>
|
joachim99@8
|
25 #include <list>
|
joachim99@8
|
26 #include <map>
|
joachim99@8
|
27 #include "common.h"
|
joachim99@8
|
28 #include "fileaccess.h"
|
joachim99@8
|
29
|
joachim99@8
|
30 class OptionDialog;
|
joachim99@8
|
31 class KIconLoader;
|
joachim99@8
|
32 class StatusMessageBox;
|
joachim99@8
|
33 class StatusInfo;
|
joachim99@8
|
34 class DirectoryMergeInfo;
|
joachim99@8
|
35 class OneDirectoryInfo;
|
joachim99@8
|
36 class QLabel;
|
joachim99@51
|
37 class KAction;
|
joachim99@51
|
38 class KToggleAction;
|
joachim99@51
|
39 class KActionCollection;
|
joachim99@8
|
40
|
joachim99@8
|
41 enum e_MergeOperation
|
joachim99@8
|
42 {
|
joachim99@8
|
43 eTitleId,
|
joachim99@8
|
44 eNoOperation,
|
joachim99@8
|
45 // Operations in sync mode (with only two directories):
|
joachim99@8
|
46 eCopyAToB, eCopyBToA, eDeleteA, eDeleteB, eDeleteAB, eMergeToA, eMergeToB, eMergeToAB,
|
joachim99@8
|
47
|
joachim99@8
|
48 // Operations in merge mode (with two or three directories)
|
joachim99@8
|
49 eCopyAToDest, eCopyBToDest, eCopyCToDest, eDeleteFromDest, eMergeABCToDest,
|
joachim99@8
|
50 eMergeABToDest,
|
joachim99@8
|
51 eConflictingFileTypes, // Error
|
joachim99@8
|
52 eConflictingAges // Equal age but files are not!
|
joachim99@8
|
53 };
|
joachim99@8
|
54
|
joachim99@8
|
55 class DirMergeItem;
|
joachim99@8
|
56
|
joachim99@8
|
57 enum e_Age { eNew, eMiddle, eOld, eNotThere, eAgeEnd };
|
joachim99@8
|
58
|
joachim99@8
|
59 class MergeFileInfos
|
joachim99@8
|
60 {
|
joachim99@8
|
61 public:
|
joachim99@8
|
62 MergeFileInfos(){ m_bEqualAB=false; m_bEqualAC=false; m_bEqualBC=false;
|
joachim99@8
|
63 m_pDMI=0; m_pParent=0;
|
joachim99@8
|
64 m_bExistsInA=false;m_bExistsInB=false;m_bExistsInC=false;
|
joachim99@8
|
65 m_bDirA=false; m_bDirB=false; m_bDirC=false;
|
joachim99@8
|
66 m_bLinkA=false; m_bLinkB=false; m_bLinkC=false;
|
joachim99@8
|
67 m_bOperationComplete=false; m_bSimOpComplete = false;
|
joachim99@8
|
68 m_eMergeOperation=eNoOperation;
|
joachim99@8
|
69 m_ageA = eNotThere; m_ageB=eNotThere; m_ageC=eNotThere;
|
joachim99@8
|
70 m_bConflictingAges=false; }
|
joachim99@8
|
71 bool operator>( const MergeFileInfos& );
|
joachim99@8
|
72 QString m_subPath;
|
joachim99@8
|
73
|
joachim99@8
|
74 bool m_bExistsInA;
|
joachim99@8
|
75 bool m_bExistsInB;
|
joachim99@8
|
76 bool m_bExistsInC;
|
joachim99@8
|
77 bool m_bEqualAB;
|
joachim99@8
|
78 bool m_bEqualAC;
|
joachim99@8
|
79 bool m_bEqualBC;
|
joachim99@8
|
80 DirMergeItem* m_pDMI;
|
joachim99@8
|
81 MergeFileInfos* m_pParent;
|
joachim99@8
|
82 e_MergeOperation m_eMergeOperation;
|
joachim99@8
|
83 void setMergeOperation( e_MergeOperation eMOp );
|
joachim99@8
|
84 bool m_bDirA;
|
joachim99@8
|
85 bool m_bDirB;
|
joachim99@8
|
86 bool m_bDirC;
|
joachim99@8
|
87 bool m_bLinkA;
|
joachim99@8
|
88 bool m_bLinkB;
|
joachim99@8
|
89 bool m_bLinkC;
|
joachim99@8
|
90 bool m_bOperationComplete;
|
joachim99@8
|
91 bool m_bSimOpComplete;
|
joachim99@8
|
92 e_Age m_ageA;
|
joachim99@8
|
93 e_Age m_ageB;
|
joachim99@8
|
94 e_Age m_ageC;
|
joachim99@8
|
95 bool m_bConflictingAges; // Equal age but files are not!
|
joachim99@8
|
96
|
joachim99@8
|
97 FileAccess m_fileInfoA;
|
joachim99@8
|
98 FileAccess m_fileInfoB;
|
joachim99@8
|
99 FileAccess m_fileInfoC;
|
joachim99@8
|
100 };
|
joachim99@8
|
101
|
joachim99@8
|
102 class DirMergeItem : public QListViewItem
|
joachim99@8
|
103 {
|
joachim99@8
|
104 public:
|
joachim99@8
|
105 DirMergeItem( QListView* pParent, const QString&, MergeFileInfos*);
|
joachim99@8
|
106 DirMergeItem( DirMergeItem* pParent, const QString&, MergeFileInfos*);
|
joachim99@8
|
107 ~DirMergeItem();
|
joachim99@8
|
108 MergeFileInfos* m_pMFI;
|
joachim99@8
|
109 #if QT_VERSION!=230
|
joachim99@8
|
110 virtual int compare(QListViewItem *i, int col, bool ascending) const
|
joachim99@8
|
111 {
|
joachim99@8
|
112 DirMergeItem* pDMI = static_cast<DirMergeItem*>(i);
|
joachim99@8
|
113 bool bDir1 = m_pMFI->m_bDirA || m_pMFI->m_bDirB || m_pMFI->m_bDirC;
|
joachim99@8
|
114 bool bDir2 = pDMI->m_pMFI->m_bDirA || pDMI->m_pMFI->m_bDirB || pDMI->m_pMFI->m_bDirC;
|
joachim99@8
|
115 if ( m_pMFI==0 || pDMI->m_pMFI==0 || bDir1 == bDir2 )
|
joachim99@8
|
116 return QListViewItem::compare( i, col, ascending );
|
joachim99@8
|
117 else
|
joachim99@8
|
118 return bDir1 ? -1 : 1;
|
joachim99@8
|
119 }
|
joachim99@8
|
120 #endif
|
joachim99@8
|
121 };
|
joachim99@8
|
122
|
joachim99@8
|
123 class DirectoryMergeWindow : public QListView
|
joachim99@8
|
124 {
|
joachim99@8
|
125 Q_OBJECT
|
joachim99@8
|
126 public:
|
joachim99@8
|
127 DirectoryMergeWindow( QWidget* pParent, OptionDialog* pOptions, KIconLoader* pIconLoader );
|
joachim99@8
|
128 ~DirectoryMergeWindow();
|
joachim99@8
|
129 void setDirectoryMergeInfo(DirectoryMergeInfo* p){ m_pDirectoryMergeInfo=p; }
|
joachim99@8
|
130 bool init(
|
joachim99@8
|
131 FileAccess& dirA,
|
joachim99@8
|
132 FileAccess& dirB,
|
joachim99@8
|
133 FileAccess& dirC,
|
joachim99@8
|
134 FileAccess& dirDest,
|
joachim99@8
|
135 bool bDirectoryMerge
|
joachim99@8
|
136 );
|
joachim99@8
|
137 bool isFileSelected();
|
joachim99@8
|
138 void allowResizeEvents(bool bAllowResizeEvents);
|
joachim99@8
|
139 bool isDirectoryMergeInProgress() { return m_bRealMergeStarted; }
|
joachim99@8
|
140 int totalColumnWidth();
|
joachim99@8
|
141 bool isSyncMode() { return m_bSyncMode; }
|
joachim99@51
|
142 void initDirectoryMergeActions( QObject* pKDiff3App, KActionCollection* ac );
|
joachim99@53
|
143 void updateAvailabilities( bool bDirCompare, bool bDiffWindowVisible,
|
joachim99@53
|
144 KToggleAction* chooseA, KToggleAction* chooseB, KToggleAction* chooseC );
|
joachim99@51
|
145
|
joachim99@51
|
146 virtual void keyPressEvent( QKeyEvent* e );
|
joachim99@53
|
147 virtual void focusInEvent( QFocusEvent* e );
|
joachim99@53
|
148 virtual void focusOutEvent( QFocusEvent* e );
|
joachim99@8
|
149
|
joachim99@8
|
150 public slots:
|
joachim99@8
|
151 void reload();
|
joachim99@8
|
152 void mergeCurrentFile();
|
joachim99@8
|
153 void compareCurrentFile();
|
joachim99@51
|
154 void slotRunOperationForAllItems();
|
joachim99@51
|
155 void slotRunOperationForCurrentItem();
|
joachim99@8
|
156 void mergeResultSaved(const QString& fileName);
|
joachim99@8
|
157 void slotChooseAEverywhere();
|
joachim99@8
|
158 void slotChooseBEverywhere();
|
joachim99@8
|
159 void slotChooseCEverywhere();
|
joachim99@8
|
160 void slotAutoChooseEverywhere();
|
joachim99@8
|
161 void slotNoOpEverywhere();
|
joachim99@8
|
162 void slotFoldAllSubdirs();
|
joachim99@8
|
163 void slotUnfoldAllSubdirs();
|
joachim99@51
|
164 // Merge current item (merge mode)
|
joachim99@51
|
165 void slotCurrentDoNothing();
|
joachim99@51
|
166 void slotCurrentChooseA();
|
joachim99@51
|
167 void slotCurrentChooseB();
|
joachim99@51
|
168 void slotCurrentChooseC();
|
joachim99@51
|
169 void slotCurrentMerge();
|
joachim99@51
|
170 void slotCurrentDelete();
|
joachim99@51
|
171 // Sync current item
|
joachim99@51
|
172 void slotCurrentCopyAToB();
|
joachim99@51
|
173 void slotCurrentCopyBToA();
|
joachim99@51
|
174 void slotCurrentDeleteA();
|
joachim99@51
|
175 void slotCurrentDeleteB();
|
joachim99@51
|
176 void slotCurrentDeleteAAndB();
|
joachim99@51
|
177 void slotCurrentMergeToA();
|
joachim99@51
|
178 void slotCurrentMergeToB();
|
joachim99@51
|
179 void slotCurrentMergeToAAndB();
|
joachim99@8
|
180
|
joachim99@8
|
181 protected:
|
joachim99@51
|
182 void mergeContinue( bool bStart, bool bVerbose );
|
joachim99@8
|
183 void resizeEvent(QResizeEvent* e);
|
joachim99@8
|
184 bool m_bAllowResizeEvents;
|
joachim99@8
|
185
|
joachim99@8
|
186 void prepareListView();
|
joachim99@8
|
187 void calcSuggestedOperation( MergeFileInfos& mfi, e_MergeOperation eDefaultOperation );
|
joachim99@8
|
188 void setAllMergeOperations( e_MergeOperation eDefaultOperation );
|
joachim99@8
|
189 friend class MergeFileInfos;
|
joachim99@8
|
190
|
joachim99@8
|
191 bool canContinue();
|
joachim99@51
|
192 void prepareMergeStart( QListViewItem* pBegin, QListViewItem* pEnd, bool bVerbose );
|
joachim99@51
|
193 bool executeMergeOperation( MergeFileInfos& mfi, bool& bSingleFileMerge );
|
joachim99@8
|
194
|
joachim99@8
|
195 void scanDirectory( const QString& dirName, t_DirectoryList& dirList );
|
joachim99@8
|
196 void scanLocalDirectory( const QString& dirName, t_DirectoryList& dirList );
|
joachim99@8
|
197 void fastFileComparison( FileAccess& fi1, FileAccess& fi2,
|
joachim99@8
|
198 bool& bEqual, bool& bError, QString& status );
|
joachim99@8
|
199 void compareFilesAndCalcAges( MergeFileInfos& mfi );
|
joachim99@8
|
200
|
joachim99@8
|
201 QString fullNameA( const MergeFileInfos& mfi )
|
joachim99@41
|
202 { return m_dirA.absFilePath() + "/" + mfi.m_subPath; }
|
joachim99@8
|
203 QString fullNameB( const MergeFileInfos& mfi )
|
joachim99@41
|
204 { return m_dirB.absFilePath() + "/" + mfi.m_subPath; }
|
joachim99@8
|
205 QString fullNameC( const MergeFileInfos& mfi )
|
joachim99@41
|
206 { return m_dirC.absFilePath() + "/" + mfi.m_subPath; }
|
joachim99@8
|
207 QString fullNameDest( const MergeFileInfos& mfi )
|
joachim99@8
|
208 { return m_dirDestInternal.absFilePath() + "/" + mfi.m_subPath; }
|
joachim99@8
|
209
|
joachim99@8
|
210 bool copyFLD( const QString& srcName, const QString& destName );
|
joachim99@8
|
211 bool deleteFLD( const QString& name, bool bCreateBackup );
|
joachim99@8
|
212 bool makeDir( const QString& name, bool bQuiet=false );
|
joachim99@8
|
213 bool renameFLD( const QString& srcName, const QString& destName );
|
joachim99@8
|
214 bool mergeFLD( const QString& nameA,const QString& nameB,const QString& nameC,
|
joachim99@8
|
215 const QString& nameDest, bool& bSingleFileMerge );
|
joachim99@8
|
216
|
joachim99@8
|
217 FileAccess m_dirA;
|
joachim99@8
|
218 FileAccess m_dirB;
|
joachim99@8
|
219 FileAccess m_dirC;
|
joachim99@8
|
220 FileAccess m_dirDest;
|
joachim99@8
|
221 FileAccess m_dirDestInternal;
|
joachim99@8
|
222
|
joachim99@8
|
223 std::map<QString, MergeFileInfos> m_fileMergeMap;
|
joachim99@8
|
224
|
joachim99@8
|
225 bool m_bFollowDirLinks;
|
joachim99@8
|
226 bool m_bFollowFileLinks;
|
joachim99@8
|
227 bool m_bSimulatedMergeStarted;
|
joachim99@8
|
228 bool m_bRealMergeStarted;
|
joachim99@8
|
229 bool m_bError;
|
joachim99@8
|
230 bool m_bSyncMode;
|
joachim99@8
|
231 bool m_bDirectoryMerge; // if true, then merge is the default operation, otherwise it's diff.
|
joachim99@8
|
232
|
joachim99@8
|
233 OptionDialog* m_pOptions;
|
joachim99@8
|
234 KIconLoader* m_pIconLoader;
|
joachim99@8
|
235 StatusMessageBox* m_pStatusMessageBox;
|
joachim99@8
|
236 DirectoryMergeInfo* m_pDirectoryMergeInfo;
|
joachim99@8
|
237 StatusInfo* m_pStatusInfo;
|
joachim99@51
|
238
|
joachim99@51
|
239 typedef std::list<DirMergeItem*> MergeItemList;
|
joachim99@51
|
240 MergeItemList m_mergeItemList;
|
joachim99@51
|
241 MergeItemList::iterator m_currentItemForOperation;
|
joachim99@51
|
242
|
joachim99@51
|
243 KAction* dirStartOperation;
|
joachim99@51
|
244 KAction* dirRunOperationForCurrentItem;
|
joachim99@51
|
245 KAction* dirCompareCurrent;
|
joachim99@51
|
246 KAction* dirMergeCurrent;
|
joachim99@51
|
247 KAction* dirRescan;
|
joachim99@51
|
248 KAction* dirChooseAEverywhere;
|
joachim99@51
|
249 KAction* dirChooseBEverywhere;
|
joachim99@51
|
250 KAction* dirChooseCEverywhere;
|
joachim99@51
|
251 KAction* dirAutoChoiceEverywhere;
|
joachim99@51
|
252 KAction* dirDoNothingEverywhere;
|
joachim99@51
|
253 KAction* dirFoldAll;
|
joachim99@51
|
254 KAction* dirUnfoldAll;
|
joachim99@51
|
255
|
joachim99@51
|
256 KAction* dirCurrentDoNothing;
|
joachim99@51
|
257 KAction* dirCurrentChooseA;
|
joachim99@51
|
258 KAction* dirCurrentChooseB;
|
joachim99@51
|
259 KAction* dirCurrentChooseC;
|
joachim99@51
|
260 KAction* dirCurrentMerge;
|
joachim99@51
|
261 KAction* dirCurrentDelete;
|
joachim99@51
|
262
|
joachim99@51
|
263 KAction* dirCurrentSyncDoNothing;
|
joachim99@51
|
264 KAction* dirCurrentSyncCopyAToB;
|
joachim99@51
|
265 KAction* dirCurrentSyncCopyBToA;
|
joachim99@51
|
266 KAction* dirCurrentSyncDeleteA;
|
joachim99@51
|
267 KAction* dirCurrentSyncDeleteB;
|
joachim99@51
|
268 KAction* dirCurrentSyncDeleteAAndB;
|
joachim99@51
|
269 KAction* dirCurrentSyncMergeToA;
|
joachim99@51
|
270 KAction* dirCurrentSyncMergeToB;
|
joachim99@51
|
271 KAction* dirCurrentSyncMergeToAAndB;
|
joachim99@8
|
272 signals:
|
joachim99@8
|
273 void startDiffMerge(QString fn1,QString fn2, QString fn3, QString ofn, QString,QString,QString);
|
joachim99@8
|
274 void checkIfCanContinue( bool* pbContinue );
|
joachim99@8
|
275 void updateAvailabilities();
|
joachim99@8
|
276 protected slots:
|
joachim99@8
|
277 void onDoubleClick( QListViewItem* lvi );
|
joachim99@8
|
278 void onClick( QListViewItem* lvi, const QPoint&, int c );
|
joachim99@8
|
279 void onSelectionChanged(QListViewItem* lvi);
|
joachim99@8
|
280 };
|
joachim99@8
|
281
|
joachim99@8
|
282 class DirectoryMergeInfo : public QFrame
|
joachim99@8
|
283 {
|
joachim99@53
|
284 Q_OBJECT
|
joachim99@8
|
285 public:
|
joachim99@8
|
286 DirectoryMergeInfo( QWidget* pParent );
|
joachim99@8
|
287 void setInfo(
|
joachim99@8
|
288 const FileAccess& APath,
|
joachim99@8
|
289 const FileAccess& BPath,
|
joachim99@8
|
290 const FileAccess& CPath,
|
joachim99@8
|
291 const FileAccess& DestPath,
|
joachim99@8
|
292 MergeFileInfos& mfi );
|
joachim99@8
|
293 QListView* getInfoList() {return m_pInfoList;}
|
joachim99@8
|
294 private:
|
joachim99@8
|
295 QLabel* m_pInfoA;
|
joachim99@8
|
296 QLabel* m_pInfoB;
|
joachim99@8
|
297 QLabel* m_pInfoC;
|
joachim99@8
|
298 QLabel* m_pInfoDest;
|
joachim99@8
|
299
|
joachim99@8
|
300 QLabel* m_pA;
|
joachim99@8
|
301 QLabel* m_pB;
|
joachim99@8
|
302 QLabel* m_pC;
|
joachim99@8
|
303 QLabel* m_pDest;
|
joachim99@8
|
304
|
joachim99@8
|
305 QListView* m_pInfoList;
|
joachim99@8
|
306 };
|
joachim99@8
|
307
|
joachim99@8
|
308
|
joachim99@8
|
309 #endif
|