annotate kdiff3/src/directorymergewindow.h @ 66:efe33e938730

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