annotate kdiff3/src/directorymergewindow.h @ 41:311175668b79

Bugfix for Syncmode.
author joachim99
date Tue, 14 Oct 2003 20:51:45 +0000
parents 86d21651c8db
children c59d5a3a8ff3
rev   line source
joachim99@8 1 /***************************************************************************
joachim99@8 2 directorymergewindow.h
joachim99@8 3 -------------------
joachim99@8 4 begin : Sat Oct 19 2002
joachim99@8 5 copyright : (C) 2002 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 /***************************************************************************
joachim99@8 19 * $Log$
joachim99@41 20 * Revision 1.2 2003/10/14 20:51:45 joachim99
joachim99@41 21 * Bugfix for Syncmode.
joachim99@41 22 *
joachim99@8 23 * Revision 1.1 2003/10/06 18:38:48 joachim99
joachim99@8 24 * KDiff3 version 0.9.70
joachim99@8 25 * *
joachim99@8 26 ***************************************************************************/
joachim99@8 27
joachim99@8 28 #ifndef DIRECTORY_MERGE_WINDOW_H
joachim99@8 29 #define DIRECTORY_MERGE_WINDOW_H
joachim99@8 30
joachim99@8 31 #include <qfileinfo.h>
joachim99@8 32 #include <qlistview.h>
joachim99@8 33 #include <qtimer.h>
joachim99@8 34 #include <qdir.h>
joachim99@8 35 #include <list>
joachim99@8 36 #include <map>
joachim99@8 37 #include "common.h"
joachim99@8 38 #include "fileaccess.h"
joachim99@8 39
joachim99@8 40 class OptionDialog;
joachim99@8 41 class KIconLoader;
joachim99@8 42 class StatusMessageBox;
joachim99@8 43 class StatusInfo;
joachim99@8 44 class DirectoryMergeInfo;
joachim99@8 45 class OneDirectoryInfo;
joachim99@8 46 class QLabel;
joachim99@8 47
joachim99@8 48 enum e_MergeOperation
joachim99@8 49 {
joachim99@8 50 eTitleId,
joachim99@8 51 eNoOperation,
joachim99@8 52 // Operations in sync mode (with only two directories):
joachim99@8 53 eCopyAToB, eCopyBToA, eDeleteA, eDeleteB, eDeleteAB, eMergeToA, eMergeToB, eMergeToAB,
joachim99@8 54
joachim99@8 55 // Operations in merge mode (with two or three directories)
joachim99@8 56 eCopyAToDest, eCopyBToDest, eCopyCToDest, eDeleteFromDest, eMergeABCToDest,
joachim99@8 57 eMergeABToDest,
joachim99@8 58 eConflictingFileTypes, // Error
joachim99@8 59 eConflictingAges // Equal age but files are not!
joachim99@8 60 };
joachim99@8 61
joachim99@8 62 class DirMergeItem;
joachim99@8 63
joachim99@8 64 enum e_Age { eNew, eMiddle, eOld, eNotThere, eAgeEnd };
joachim99@8 65
joachim99@8 66 class MergeFileInfos
joachim99@8 67 {
joachim99@8 68 public:
joachim99@8 69 MergeFileInfos(){ m_bEqualAB=false; m_bEqualAC=false; m_bEqualBC=false;
joachim99@8 70 m_pDMI=0; m_pParent=0;
joachim99@8 71 m_bExistsInA=false;m_bExistsInB=false;m_bExistsInC=false;
joachim99@8 72 m_bDirA=false; m_bDirB=false; m_bDirC=false;
joachim99@8 73 m_bLinkA=false; m_bLinkB=false; m_bLinkC=false;
joachim99@8 74 m_bOperationComplete=false; m_bSimOpComplete = false;
joachim99@8 75 m_eMergeOperation=eNoOperation;
joachim99@8 76 m_ageA = eNotThere; m_ageB=eNotThere; m_ageC=eNotThere;
joachim99@8 77 m_bConflictingAges=false; }
joachim99@8 78 bool operator>( const MergeFileInfos& );
joachim99@8 79 QString m_subPath;
joachim99@8 80
joachim99@8 81 bool m_bExistsInA;
joachim99@8 82 bool m_bExistsInB;
joachim99@8 83 bool m_bExistsInC;
joachim99@8 84 bool m_bEqualAB;
joachim99@8 85 bool m_bEqualAC;
joachim99@8 86 bool m_bEqualBC;
joachim99@8 87 DirMergeItem* m_pDMI;
joachim99@8 88 MergeFileInfos* m_pParent;
joachim99@8 89 e_MergeOperation m_eMergeOperation;
joachim99@8 90 void setMergeOperation( e_MergeOperation eMOp );
joachim99@8 91 bool m_bDirA;
joachim99@8 92 bool m_bDirB;
joachim99@8 93 bool m_bDirC;
joachim99@8 94 bool m_bLinkA;
joachim99@8 95 bool m_bLinkB;
joachim99@8 96 bool m_bLinkC;
joachim99@8 97 bool m_bOperationComplete;
joachim99@8 98 bool m_bSimOpComplete;
joachim99@8 99 e_Age m_ageA;
joachim99@8 100 e_Age m_ageB;
joachim99@8 101 e_Age m_ageC;
joachim99@8 102 bool m_bConflictingAges; // Equal age but files are not!
joachim99@8 103
joachim99@8 104 FileAccess m_fileInfoA;
joachim99@8 105 FileAccess m_fileInfoB;
joachim99@8 106 FileAccess m_fileInfoC;
joachim99@8 107 };
joachim99@8 108
joachim99@8 109 class DirMergeItem : public QListViewItem
joachim99@8 110 {
joachim99@8 111 public:
joachim99@8 112 DirMergeItem( QListView* pParent, const QString&, MergeFileInfos*);
joachim99@8 113 DirMergeItem( DirMergeItem* pParent, const QString&, MergeFileInfos*);
joachim99@8 114 ~DirMergeItem();
joachim99@8 115 MergeFileInfos* m_pMFI;
joachim99@8 116 #if QT_VERSION!=230
joachim99@8 117 virtual int compare(QListViewItem *i, int col, bool ascending) const
joachim99@8 118 {
joachim99@8 119 DirMergeItem* pDMI = static_cast<DirMergeItem*>(i);
joachim99@8 120 bool bDir1 = m_pMFI->m_bDirA || m_pMFI->m_bDirB || m_pMFI->m_bDirC;
joachim99@8 121 bool bDir2 = pDMI->m_pMFI->m_bDirA || pDMI->m_pMFI->m_bDirB || pDMI->m_pMFI->m_bDirC;
joachim99@8 122 if ( m_pMFI==0 || pDMI->m_pMFI==0 || bDir1 == bDir2 )
joachim99@8 123 return QListViewItem::compare( i, col, ascending );
joachim99@8 124 else
joachim99@8 125 return bDir1 ? -1 : 1;
joachim99@8 126 }
joachim99@8 127 #endif
joachim99@8 128 };
joachim99@8 129
joachim99@8 130 class DirectoryMergeWindow : public QListView
joachim99@8 131 {
joachim99@8 132 Q_OBJECT
joachim99@8 133 public:
joachim99@8 134 DirectoryMergeWindow( QWidget* pParent, OptionDialog* pOptions, KIconLoader* pIconLoader );
joachim99@8 135 ~DirectoryMergeWindow();
joachim99@8 136 void setDirectoryMergeInfo(DirectoryMergeInfo* p){ m_pDirectoryMergeInfo=p; }
joachim99@8 137 bool init(
joachim99@8 138 FileAccess& dirA,
joachim99@8 139 FileAccess& dirB,
joachim99@8 140 FileAccess& dirC,
joachim99@8 141 FileAccess& dirDest,
joachim99@8 142 bool bDirectoryMerge
joachim99@8 143 );
joachim99@8 144 bool isFileSelected();
joachim99@8 145 void allowResizeEvents(bool bAllowResizeEvents);
joachim99@8 146 bool isDirectoryMergeInProgress() { return m_bRealMergeStarted; }
joachim99@8 147 int totalColumnWidth();
joachim99@8 148 bool isSyncMode() { return m_bSyncMode; }
joachim99@8 149
joachim99@8 150 public slots:
joachim99@8 151 void mergeContinue();
joachim99@8 152 void reload();
joachim99@8 153 void mergeCurrentFile();
joachim99@8 154 void compareCurrentFile();
joachim99@8 155 void mergeResultSaved(const QString& fileName);
joachim99@8 156 void slotChooseAEverywhere();
joachim99@8 157 void slotChooseBEverywhere();
joachim99@8 158 void slotChooseCEverywhere();
joachim99@8 159 void slotAutoChooseEverywhere();
joachim99@8 160 void slotNoOpEverywhere();
joachim99@8 161 void slotFoldAllSubdirs();
joachim99@8 162 void slotUnfoldAllSubdirs();
joachim99@8 163
joachim99@8 164 protected:
joachim99@8 165 void resizeEvent(QResizeEvent* e);
joachim99@8 166 bool m_bAllowResizeEvents;
joachim99@8 167
joachim99@8 168 void prepareListView();
joachim99@8 169 void calcSuggestedOperation( MergeFileInfos& mfi, e_MergeOperation eDefaultOperation );
joachim99@8 170 void setAllMergeOperations( e_MergeOperation eDefaultOperation );
joachim99@8 171 friend class MergeFileInfos;
joachim99@8 172
joachim99@8 173 bool canContinue();
joachim99@8 174
joachim99@8 175 void scanDirectory( const QString& dirName, t_DirectoryList& dirList );
joachim99@8 176 void scanLocalDirectory( const QString& dirName, t_DirectoryList& dirList );
joachim99@8 177 void fastFileComparison( FileAccess& fi1, FileAccess& fi2,
joachim99@8 178 bool& bEqual, bool& bError, QString& status );
joachim99@8 179 void compareFilesAndCalcAges( MergeFileInfos& mfi );
joachim99@8 180
joachim99@8 181 QString fullNameA( const MergeFileInfos& mfi )
joachim99@41 182 { return m_dirA.absFilePath() + "/" + mfi.m_subPath; }
joachim99@8 183 QString fullNameB( const MergeFileInfos& mfi )
joachim99@41 184 { return m_dirB.absFilePath() + "/" + mfi.m_subPath; }
joachim99@8 185 QString fullNameC( const MergeFileInfos& mfi )
joachim99@41 186 { return m_dirC.absFilePath() + "/" + mfi.m_subPath; }
joachim99@8 187 QString fullNameDest( const MergeFileInfos& mfi )
joachim99@8 188 { return m_dirDestInternal.absFilePath() + "/" + mfi.m_subPath; }
joachim99@8 189
joachim99@8 190 bool copyFLD( const QString& srcName, const QString& destName );
joachim99@8 191 bool deleteFLD( const QString& name, bool bCreateBackup );
joachim99@8 192 bool makeDir( const QString& name, bool bQuiet=false );
joachim99@8 193 bool renameFLD( const QString& srcName, const QString& destName );
joachim99@8 194 bool mergeFLD( const QString& nameA,const QString& nameB,const QString& nameC,
joachim99@8 195 const QString& nameDest, bool& bSingleFileMerge );
joachim99@8 196
joachim99@8 197 FileAccess m_dirA;
joachim99@8 198 FileAccess m_dirB;
joachim99@8 199 FileAccess m_dirC;
joachim99@8 200 FileAccess m_dirDest;
joachim99@8 201 FileAccess m_dirDestInternal;
joachim99@8 202
joachim99@8 203 std::map<QString, MergeFileInfos> m_fileMergeMap;
joachim99@8 204
joachim99@8 205 bool m_bFollowDirLinks;
joachim99@8 206 bool m_bFollowFileLinks;
joachim99@8 207 bool m_bSimulatedMergeStarted;
joachim99@8 208 bool m_bRealMergeStarted;
joachim99@8 209 bool m_bSingleFileOperationStarted;
joachim99@8 210 bool m_bError;
joachim99@8 211 bool m_bSyncMode;
joachim99@8 212 bool m_bDirectoryMerge; // if true, then merge is the default operation, otherwise it's diff.
joachim99@8 213
joachim99@8 214 OptionDialog* m_pOptions;
joachim99@8 215 KIconLoader* m_pIconLoader;
joachim99@8 216 DirMergeItem* m_pCurrentItemForOperation;
joachim99@8 217 StatusMessageBox* m_pStatusMessageBox;
joachim99@8 218 DirectoryMergeInfo* m_pDirectoryMergeInfo;
joachim99@8 219 StatusInfo* m_pStatusInfo;
joachim99@8 220 signals:
joachim99@8 221 void startDiffMerge(QString fn1,QString fn2, QString fn3, QString ofn, QString,QString,QString);
joachim99@8 222 void checkIfCanContinue( bool* pbContinue );
joachim99@8 223 void updateAvailabilities();
joachim99@8 224 protected slots:
joachim99@8 225 void onDoubleClick( QListViewItem* lvi );
joachim99@8 226 void onClick( QListViewItem* lvi, const QPoint&, int c );
joachim99@8 227 void onSelectionChanged(QListViewItem* lvi);
joachim99@8 228 };
joachim99@8 229
joachim99@8 230 class DirectoryMergeInfo : public QFrame
joachim99@8 231 {
joachim99@8 232 public:
joachim99@8 233 DirectoryMergeInfo( QWidget* pParent );
joachim99@8 234 void setInfo(
joachim99@8 235 const FileAccess& APath,
joachim99@8 236 const FileAccess& BPath,
joachim99@8 237 const FileAccess& CPath,
joachim99@8 238 const FileAccess& DestPath,
joachim99@8 239 MergeFileInfos& mfi );
joachim99@8 240 QListView* getInfoList() {return m_pInfoList;}
joachim99@8 241 private:
joachim99@8 242 QLabel* m_pInfoA;
joachim99@8 243 QLabel* m_pInfoB;
joachim99@8 244 QLabel* m_pInfoC;
joachim99@8 245 QLabel* m_pInfoDest;
joachim99@8 246
joachim99@8 247 QLabel* m_pA;
joachim99@8 248 QLabel* m_pB;
joachim99@8 249 QLabel* m_pC;
joachim99@8 250 QLabel* m_pDest;
joachim99@8 251
joachim99@8 252 QListView* m_pInfoList;
joachim99@8 253 };
joachim99@8 254
joachim99@8 255
joachim99@8 256 #endif