annotate kdiff3/src/diff.h @ 68:d7cafcda8c99

KDiff3 0.9.87
author joachim99
date Mon, 31 Jan 2005 22:30:47 +0000
parents efe33e938730
children 8febbfb1148c
rev   line source
joachim99@8 1 /***************************************************************************
joachim99@8 2 diff.h - description
joachim99@8 3 -------------------
joachim99@8 4 begin : Mon Mar 18 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 DIFF_H
joachim99@8 19 #define DIFF_H
joachim99@8 20
joachim99@8 21 #include <qwidget.h>
joachim99@8 22 #include <qpixmap.h>
joachim99@8 23 #include <qtimer.h>
joachim99@8 24 #include <qframe.h>
joachim99@68 25 #include <qtextstream.h>
joachim99@68 26 #include <qpainter.h>
joachim99@8 27 #include <list>
joachim99@8 28 #include <vector>
joachim99@8 29 #include <assert.h>
joachim99@8 30 #include "common.h"
joachim99@8 31 #include "fileaccess.h"
joachim99@68 32 #include "optiondialog.h"
joachim99@8 33
joachim99@8 34
joachim99@8 35 // Each range with matching elements is followed by a range with differences on either side.
joachim99@8 36 // Then again range of matching elements should follow.
joachim99@8 37 struct Diff
joachim99@8 38 {
joachim99@8 39 int nofEquals;
joachim99@8 40
joachim99@8 41 int diff1;
joachim99@8 42 int diff2;
joachim99@8 43
joachim99@8 44 Diff(int eq, int d1, int d2){nofEquals=eq; diff1=d1; diff2=d2; }
joachim99@8 45 };
joachim99@8 46
joachim99@8 47 typedef std::list<Diff> DiffList;
joachim99@8 48
joachim99@8 49 struct Diff3Line
joachim99@8 50 {
joachim99@8 51 int lineA;
joachim99@8 52 int lineB;
joachim99@8 53 int lineC;
joachim99@8 54
joachim99@8 55 bool bAEqC; // These are true if equal or only white-space changes exist.
joachim99@8 56 bool bBEqC;
joachim99@8 57 bool bAEqB;
joachim99@8 58
joachim99@8 59 DiffList* pFineAB; // These are 0 only if completely equal.
joachim99@8 60 DiffList* pFineBC;
joachim99@8 61 DiffList* pFineCA;
joachim99@8 62
joachim99@8 63 bool bWhiteLineA;
joachim99@8 64 bool bWhiteLineB;
joachim99@8 65 bool bWhiteLineC;
joachim99@8 66
joachim99@66 67 int linesNeededForDisplay; // Due to wordwrap
joachim99@66 68 int sumLinesNeededForDisplay; // For fast conversion to m_diff3WrapLineVector
joachim99@66 69
joachim99@8 70 Diff3Line()
joachim99@8 71 {
joachim99@8 72 lineA=-1; lineB=-1; lineC=-1;
joachim99@8 73 bAEqC=false; bAEqB=false; bBEqC=false;
joachim99@8 74 pFineAB=0; pFineBC=0; pFineCA=0;
joachim99@66 75 linesNeededForDisplay=1;
joachim99@8 76 }
joachim99@8 77
joachim99@8 78 ~Diff3Line()
joachim99@8 79 {
joachim99@8 80 if (pFineAB!=0) delete pFineAB;
joachim99@8 81 if (pFineBC!=0) delete pFineBC;
joachim99@8 82 if (pFineCA!=0) delete pFineCA;
joachim99@8 83 pFineAB=0; pFineBC=0; pFineCA=0;
joachim99@8 84 }
joachim99@8 85
joachim99@8 86 bool operator==( const Diff3Line& d3l )
joachim99@8 87 {
joachim99@8 88 return lineA == d3l.lineA && lineB == d3l.lineB && lineC == d3l.lineC
joachim99@8 89 && bAEqB == d3l.bAEqB && bAEqC == d3l.bAEqC && bBEqC == d3l.bBEqC;
joachim99@8 90 }
joachim99@8 91 };
joachim99@8 92
joachim99@66 93
joachim99@8 94 typedef std::list<Diff3Line> Diff3LineList;
joachim99@66 95 typedef std::vector<Diff3Line*> Diff3LineVector;
joachim99@66 96
joachim99@66 97 class Diff3WrapLine
joachim99@66 98 {
joachim99@66 99 public:
joachim99@66 100 Diff3Line* pD3L;
joachim99@66 101 int diff3LineIndex;
joachim99@66 102 int wrapLineOffset;
joachim99@66 103 int wrapLineLength;
joachim99@66 104 };
joachim99@66 105
joachim99@66 106 typedef std::vector<Diff3WrapLine> Diff3WrapLineVector;
joachim99@66 107
joachim99@8 108
joachim99@8 109 class TotalDiffStatus
joachim99@8 110 {
joachim99@8 111 public:
joachim99@66 112 TotalDiffStatus(){ reset(); }
joachim99@8 113 void reset() {bBinaryAEqC=false; bBinaryBEqC=false; bBinaryAEqB=false;
joachim99@66 114 bTextAEqC=false; bTextBEqC=false; bTextAEqB=false;
joachim99@66 115 nofUnsolvedConflicts=0; nofSolvedConflicts=0;
joachim99@66 116 nofWhitespaceConflicts=0;
joachim99@66 117 }
joachim99@8 118 bool bBinaryAEqC;
joachim99@8 119 bool bBinaryBEqC;
joachim99@8 120 bool bBinaryAEqB;
joachim99@8 121
joachim99@8 122 bool bTextAEqC;
joachim99@8 123 bool bTextBEqC;
joachim99@8 124 bool bTextAEqB;
joachim99@66 125
joachim99@66 126 int nofUnsolvedConflicts;
joachim99@66 127 int nofSolvedConflicts;
joachim99@66 128 int nofWhitespaceConflicts;
joachim99@8 129 };
joachim99@8 130
joachim99@51 131 void calcDiff3LineListUsingAB(
joachim99@8 132 const DiffList* pDiffListAB,
joachim99@8 133 Diff3LineList& d3ll
joachim99@8 134 );
joachim99@8 135
joachim99@8 136 void calcDiff3LineListUsingAC(
joachim99@8 137 const DiffList* pDiffListBC,
joachim99@8 138 Diff3LineList& d3ll
joachim99@8 139 );
joachim99@8 140
joachim99@68 141 void calcDiff3LineListUsingBC(
joachim99@8 142 const DiffList* pDiffListBC,
joachim99@8 143 Diff3LineList& d3ll
joachim99@8 144 );
joachim99@8 145
joachim99@8 146 struct LineData
joachim99@8 147 {
joachim99@68 148 const QChar* pLine;
joachim99@68 149 const QChar* pFirstNonWhiteChar;
joachim99@8 150 int size;
joachim99@8 151
joachim99@51 152 LineData(){ pLine=0; size=0; occurances=0; bContainsPureComment=false; }
joachim99@58 153 int width() const; // Calcs width considering tabs.
joachim99@8 154 int occurances;
joachim99@58 155 bool whiteLine() const { return pFirstNonWhiteChar-pLine == size; }
joachim99@51 156 bool bContainsPureComment;
joachim99@8 157 };
joachim99@8 158
joachim99@8 159
joachim99@8 160 class SourceData
joachim99@8 161 {
joachim99@8 162 public:
joachim99@58 163 SourceData();
joachim99@58 164 ~SourceData();
joachim99@68 165
joachim99@58 166 void setOptionDialog( OptionDialog* pOptionDialog );
joachim99@68 167
joachim99@58 168 int getSizeLines() const;
joachim99@58 169 int getSizeBytes() const;
joachim99@58 170 const char* getBuf() const;
joachim99@58 171 const LineData* getLineDataForDisplay() const;
joachim99@58 172 const LineData* getLineDataForDiff() const;
joachim99@58 173
joachim99@8 174 void setFilename(const QString& filename);
joachim99@8 175 void setFileAccess( const FileAccess& fa );
joachim99@8 176 FileAccess& getFileAccess();
joachim99@8 177 QString getFilename();
joachim99@8 178 void setAliasName(const QString& a);
joachim99@8 179 QString getAliasName();
joachim99@58 180 bool isEmpty(); // File was set
joachim99@58 181 bool hasData(); // Data was readable
joachim99@58 182 bool isText(); // is it pure text (vs. binary data)
joachim99@58 183 bool isFromBuffer(); // was it set via setData() (vs. setFileAccess() or setFilename())
joachim99@58 184 void setData( const QString& data );
joachim99@66 185 bool isValid(); // Either no file is specified or reading was successful
joachim99@68 186
joachim99@68 187 void readAndPreprocess(QTextCodec* pEncoding);
joachim99@58 188 bool saveNormalDataAs( const QString& fileName );
joachim99@68 189
joachim99@58 190 bool isBinaryEqualWith( const SourceData& other ) const;
joachim99@68 191
joachim99@58 192 void reset();
joachim99@58 193
joachim99@68 194 private:
joachim99@8 195 QString m_aliasName;
joachim99@8 196 FileAccess m_fileAccess;
joachim99@58 197 OptionDialog* m_pOptionDialog;
joachim99@58 198 QString m_tempInputFileName;
joachim99@58 199
joachim99@58 200 struct FileData
joachim99@68 201 {
joachim99@58 202 FileData(){ m_pBuf=0; m_size=0; }
joachim99@58 203 ~FileData(){ reset(); }
joachim99@58 204 const char* m_pBuf;
joachim99@58 205 int m_size;
joachim99@58 206 int m_vSize; // Nr of lines in m_pBuf1 and size of m_v1, m_dv12 and m_dv13
joachim99@68 207 QString m_unicodeBuf;
joachim99@58 208 std::vector<LineData> m_v;
joachim99@58 209 bool m_bIsText;
joachim99@58 210 bool readFile( const QString& filename );
joachim99@58 211 bool writeFile( const QString& filename );
joachim99@68 212 void preprocess(bool bPreserveCR, QTextCodec* pEncoding );
joachim99@58 213 void reset();
joachim99@58 214 void removeComments();
joachim99@58 215 void copyBufFrom( const FileData& src );
joachim99@58 216 };
joachim99@58 217 FileData m_normalData;
joachim99@68 218 FileData m_lmppData;
joachim99@68 219 QTextCodec* m_pEncoding;
joachim99@8 220 };
joachim99@8 221
joachim99@58 222 void calcDiff3LineListTrim( Diff3LineList& d3ll, const LineData* pldA, const LineData* pldB, const LineData* pldC );
joachim99@58 223 void calcWhiteDiff3Lines( Diff3LineList& d3ll, const LineData* pldA, const LineData* pldB, const LineData* pldC );
joachim99@8 224
joachim99@66 225 void calcDiff3LineVector( Diff3LineList& d3ll, Diff3LineVector& d3lv );
joachim99@8 226
joachim99@8 227 void debugLineCheck( Diff3LineList& d3ll, int size, int idx );
joachim99@8 228
joachim99@8 229 class QStatusBar;
joachim99@8 230
joachim99@8 231
joachim99@8 232 class Selection
joachim99@8 233 {
joachim99@8 234 public:
joachim99@8 235 Selection(){ reset(); oldLastLine=-1; lastLine=-1; oldFirstLine=-1; }
joachim99@8 236 int firstLine;
joachim99@8 237 int firstPos;
joachim99@8 238 int lastLine;
joachim99@8 239 int lastPos;
joachim99@8 240 int oldLastLine;
joachim99@8 241 int oldFirstLine;
joachim99@8 242 bool bSelectionContainsData;
joachim99@8 243 bool isEmpty() { return firstLine==-1 || (firstLine==lastLine && firstPos==lastPos) || bSelectionContainsData==false;}
joachim99@8 244 void reset(){
joachim99@8 245 oldFirstLine=firstLine;
joachim99@8 246 oldLastLine =lastLine;
joachim99@8 247 firstLine=-1;
joachim99@8 248 bSelectionContainsData = false;
joachim99@8 249 }
joachim99@8 250 void start( int l, int p ) { firstLine = l; firstPos = p; }
joachim99@8 251 void end( int l, int p ) {
joachim99@8 252 if ( oldLastLine == -1 )
joachim99@8 253 oldLastLine = lastLine;
joachim99@8 254 lastLine = l;
joachim99@8 255 lastPos = p;
joachim99@8 256 }
joachim99@8 257 bool within( int l, int p );
joachim99@8 258
joachim99@8 259 bool lineWithin( int l );
joachim99@8 260 int firstPosInLine(int l);
joachim99@8 261 int lastPosInLine(int l);
joachim99@8 262 int beginLine(){ return min2(firstLine,lastLine); }
joachim99@8 263 int endLine(){ return max2(firstLine,lastLine); }
joachim99@8 264 int beginPos() { return firstLine==lastLine ? min2(firstPos,lastPos) :
joachim99@8 265 firstLine<lastLine ? firstPos : lastPos; }
joachim99@8 266 int endPos() { return firstLine==lastLine ? max2(firstPos,lastPos) :
joachim99@8 267 firstLine<lastLine ? lastPos : firstPos; }
joachim99@8 268 };
joachim99@8 269
joachim99@8 270 class OptionDialog;
joachim99@8 271
joachim99@68 272 QCString encodeString( const QString& s );
joachim99@68 273
joachim99@68 274
joachim99@68 275 // Helper class that swaps left and right for some commands.
joachim99@68 276 class MyPainter : public QPainter
joachim99@68 277 {
joachim99@68 278 int m_factor;
joachim99@68 279 int m_xOffset;
joachim99@68 280 int m_fontWidth;
joachim99@68 281 public:
joachim99@68 282 MyPainter(const QPaintDevice* pd, bool bRTL, int width, int fontWidth)
joachim99@68 283 : QPainter(pd)
joachim99@68 284 {
joachim99@68 285 if (bRTL)
joachim99@68 286 {
joachim99@68 287 m_fontWidth = fontWidth;
joachim99@68 288 m_factor = -1;
joachim99@68 289 m_xOffset = width-1;
joachim99@68 290 }
joachim99@68 291 else
joachim99@68 292 {
joachim99@68 293 m_fontWidth = 0;
joachim99@68 294 m_factor = 1;
joachim99@68 295 m_xOffset = 0;
joachim99@68 296 }
joachim99@68 297 }
joachim99@68 298
joachim99@68 299 void fillRect( int x, int y, int w, int h, const QBrush& b )
joachim99@68 300 {
joachim99@68 301 QPainter::fillRect( m_xOffset + m_factor*x, y, m_factor*w, h, b );
joachim99@68 302 }
joachim99@68 303
joachim99@68 304 void drawText( int x, int y, const QString& s, bool bAdapt=false )
joachim99@68 305 {
joachim99@68 306 TextDirection td = (m_factor==1 || bAdapt == false) ? LTR : RTL;
joachim99@68 307 QPainter::drawText( m_xOffset-m_fontWidth*s.length() + m_factor*x, y, s, -1, td );
joachim99@68 308 }
joachim99@68 309
joachim99@68 310 void drawLine( int x1, int y1, int x2, int y2 )
joachim99@68 311 {
joachim99@68 312 QPainter::drawLine( m_xOffset + m_factor*x1, y1, m_xOffset + m_factor*x2, y2 );
joachim99@68 313 }
joachim99@68 314 };
joachim99@51 315
joachim99@8 316 class DiffTextWindow : public QWidget
joachim99@8 317 {
joachim99@8 318 Q_OBJECT
joachim99@8 319 public:
joachim99@8 320 DiffTextWindow(
joachim99@8 321 QWidget* pParent,
joachim99@8 322 QStatusBar* pStatusBar,
joachim99@8 323 OptionDialog* pOptionDialog
joachim99@8 324 );
joachim99@8 325 void init(
joachim99@8 326 const QString& fileName,
joachim99@58 327 const LineData* pLineData,
joachim99@8 328 int size,
joachim99@8 329 const Diff3LineVector* pDiff3LineVector,
joachim99@8 330 int winIdx,
joachim99@8 331 bool bTriple
joachim99@8 332 );
joachim99@8 333 virtual void mousePressEvent ( QMouseEvent * );
joachim99@8 334 virtual void mouseReleaseEvent ( QMouseEvent * );
joachim99@8 335 virtual void mouseMoveEvent ( QMouseEvent * );
joachim99@8 336 virtual void mouseDoubleClickEvent ( QMouseEvent * e );
joachim99@8 337 void convertToLinePos( int x, int y, int& line, int& pos );
joachim99@8 338
joachim99@8 339 virtual void paintEvent( QPaintEvent* );
joachim99@8 340 virtual void dragEnterEvent( QDragEnterEvent* e );
joachim99@66 341 virtual void focusInEvent( QFocusEvent* e );
joachim99@8 342 //void setData( const char* pText);
joachim99@8 343
joachim99@8 344 virtual void resizeEvent( QResizeEvent* );
joachim99@8 345
joachim99@8 346 QString getSelection();
joachim99@8 347 int getFirstLine() { return m_firstLine; }
joachim99@8 348
joachim99@8 349 int getNofColumns();
joachim99@8 350 int getNofLines();
joachim99@8 351 int getNofVisibleLines();
joachim99@8 352 int getNofVisibleColumns();
joachim99@66 353
joachim99@66 354 int convertLineToDiff3LineIdx( int line );
joachim99@66 355 int convertDiff3LineIdxToLine( int d3lIdx );
joachim99@66 356
joachim99@66 357 void convertD3LCoordsToLineCoords( int d3LIdx, int d3LPos, int& line, int& pos );
joachim99@66 358 void convertLineCoordsToD3LCoords( int line, int pos, int& d3LIdx, int& d3LPos );
joachim99@8 359
joachim99@66 360 void convertSelectionToD3LCoords();
joachim99@66 361
joachim99@68 362 bool findString( const QString& s, int& d3vLine, int& posInLine, bool bDirDown, bool bCaseSensitive );
joachim99@66 363 void setSelection( int firstLine, int startPos, int lastLine, int endPos, int& l, int& p );
joachim99@8 364
joachim99@8 365 void setPaintingAllowed( bool bAllowPainting );
joachim99@66 366 void recalcWordWrap( bool bWordWrap, int wrapLineVectorSize );
joachim99@8 367 signals:
joachim99@8 368 void resizeSignal( int nofVisibleColumns, int nofVisibleLines );
joachim99@8 369 void scroll( int deltaX, int deltaY );
joachim99@8 370 void newSelection();
joachim99@8 371 void selectionEnd();
joachim99@8 372 void setFastSelectorLine( int line );
joachim99@66 373 void gotFocus();
joachim99@8 374
joachim99@8 375 public slots:
joachim99@8 376 void setFirstLine( int line );
joachim99@8 377 void setFirstColumn( int col );
joachim99@8 378 void resetSelection();
joachim99@8 379 void setFastSelectorRange( int line1, int nofLines );
joachim99@8 380
joachim99@8 381 private:
joachim99@8 382 bool m_bPaintingAllowed;
joachim99@58 383 const LineData* m_pLineData;
joachim99@8 384 int m_size;
joachim99@8 385 QString m_filename;
joachim99@66 386 bool m_bWordWrap;
joachim99@8 387
joachim99@8 388 const Diff3LineVector* m_pDiff3LineVector;
joachim99@66 389 Diff3WrapLineVector m_diff3WrapLineVector;
joachim99@8 390
joachim99@8 391 OptionDialog* m_pOptionDialog;
joachim99@8 392 QColor m_cThis;
joachim99@8 393 QColor m_cDiff1;
joachim99@8 394 QColor m_cDiff2;
joachim99@8 395 QColor m_cDiffBoth;
joachim99@8 396
joachim99@8 397 int m_fastSelectorLine1;
joachim99@8 398 int m_fastSelectorNofLines;
joachim99@8 399
joachim99@8 400 bool m_bTriple;
joachim99@8 401 int m_winIdx;
joachim99@8 402 int m_firstLine;
joachim99@8 403 int m_oldFirstLine;
joachim99@8 404 int m_oldFirstColumn;
joachim99@8 405 int m_firstColumn;
joachim99@8 406 int m_lineNumberWidth;
joachim99@8 407
joachim99@8 408 void getLineInfo(
joachim99@8 409 const Diff3Line& d,
joachim99@8 410 int& lineIdx,
joachim99@8 411 DiffList*& pFineDiff1, DiffList*& pFineDiff2, // return values
joachim99@8 412 int& changed, int& changed2 );
joachim99@8 413
joachim99@68 414 QString getString( int d3lIdx );
joachim99@68 415 QString getLineString( int line );
joachim99@8 416
joachim99@8 417 void writeLine(
joachim99@68 418 MyPainter& p, const LineData* pld,
joachim99@8 419 const DiffList* pLineDiff1, const DiffList* pLineDiff2, int line,
joachim99@66 420 int whatChanged, int whatChanged2, int srcLineNr,
joachim99@66 421 int wrapLineOffset, int wrapLineLength, bool bWrapLine );
joachim99@8 422
joachim99@8 423 QStatusBar* m_pStatusBar;
joachim99@8 424
joachim99@8 425 Selection selection;
joachim99@8 426
joachim99@8 427 int m_scrollDeltaX;
joachim99@8 428 int m_scrollDeltaY;
joachim99@8 429 virtual void timerEvent(QTimerEvent*);
joachim99@8 430 bool m_bMyUpdate;
joachim99@8 431 void myUpdate(int afterMilliSecs );
joachim99@68 432
joachim99@66 433 void showStatusLine( int line );
joachim99@68 434
joachim99@8 435 QRect m_invalidRect;
joachim99@8 436 };
joachim99@8 437
joachim99@8 438
joachim99@8 439
joachim99@8 440 class Overview : public QWidget
joachim99@8 441 {
joachim99@8 442 Q_OBJECT
joachim99@8 443 public:
joachim99@8 444 Overview( QWidget* pParent, OptionDialog* pOptions );
joachim99@8 445
joachim99@8 446 void init( Diff3LineList* pDiff3LineList, bool bTripleDiff );
joachim99@8 447 void setRange( int firstLine, int pageHeight );
joachim99@8 448 void setPaintingAllowed( bool bAllowPainting );
joachim99@66 449
joachim99@66 450 enum e_OverviewMode { eOMNormal, eOMAvsB, eOMAvsC, eOMBvsC };
joachim99@66 451 void setOverviewMode( e_OverviewMode eOverviewMode );
joachim99@66 452 e_OverviewMode getOverviewMode();
joachim99@8 453
joachim99@8 454 public slots:
joachim99@8 455 void setFirstLine(int firstLine);
joachim99@51 456 void slotRedraw();
joachim99@8 457 signals:
joachim99@8 458 void setLine(int);
joachim99@8 459 private:
joachim99@8 460 const Diff3LineList* m_pDiff3LineList;
joachim99@8 461 OptionDialog* m_pOptions;
joachim99@8 462 bool m_bTripleDiff;
joachim99@8 463 int m_firstLine;
joachim99@8 464 int m_pageHeight;
joachim99@8 465 QPixmap m_pixmap;
joachim99@8 466 bool m_bPaintingAllowed;
joachim99@66 467 e_OverviewMode m_eOverviewMode;
joachim99@66 468 int m_nofLines;
joachim99@8 469
joachim99@8 470 virtual void paintEvent( QPaintEvent* e );
joachim99@8 471 virtual void mousePressEvent( QMouseEvent* e );
joachim99@8 472 virtual void mouseMoveEvent( QMouseEvent* e );
joachim99@66 473 void drawColumn( QPainter& p, e_OverviewMode eOverviewMode, int x, int w, int h, int nofLines );
joachim99@8 474 };
joachim99@8 475
joachim99@8 476
joachim99@8 477 enum e_MergeDetails
joachim99@8 478 {
joachim99@8 479 eDefault,
joachim99@8 480 eNoChange,
joachim99@8 481 eBChanged,
joachim99@8 482 eCChanged,
joachim99@8 483 eBCChanged, // conflict
joachim99@8 484 eBCChangedAndEqual, // possible conflict
joachim99@8 485 eBDeleted,
joachim99@8 486 eCDeleted,
joachim99@8 487 eBCDeleted, // possible conflict
joachim99@8 488
joachim99@8 489 eBChanged_CDeleted, // conflict
joachim99@8 490 eCChanged_BDeleted, // conflict
joachim99@8 491 eBAdded,
joachim99@8 492 eCAdded,
joachim99@8 493 eBCAdded, // conflict
joachim99@8 494 eBCAddedAndEqual // possible conflict
joachim99@8 495 };
joachim99@8 496
joachim99@8 497 void mergeOneLine( const Diff3Line& d, e_MergeDetails& mergeDetails, bool& bConflict, bool& bLineRemoved, int& src, bool bTwoInputs );
joachim99@8 498
joachim99@51 499 enum e_MergeSrcSelector
joachim99@51 500 {
joachim99@51 501 A=1,
joachim99@51 502 B=2,
joachim99@51 503 C=3
joachim99@51 504 };
joachim99@8 505
joachim99@8 506 class MergeResultWindow : public QWidget
joachim99@8 507 {
joachim99@8 508 Q_OBJECT
joachim99@8 509 public:
joachim99@8 510 MergeResultWindow(
joachim99@8 511 QWidget* pParent,
joachim99@66 512 OptionDialog* pOptionDialog,
joachim99@66 513 QStatusBar* pStatusBar
joachim99@8 514 );
joachim99@8 515
joachim99@8 516 void init(
joachim99@8 517 const LineData* pLineDataA,
joachim99@8 518 const LineData* pLineDataB,
joachim99@8 519 const LineData* pLineDataC,
joachim99@8 520 const Diff3LineList* pDiff3LineList,
joachim99@66 521 TotalDiffStatus* pTotalDiffStatus,
joachim99@8 522 QString fileName
joachim99@8 523 );
joachim99@8 524
joachim99@8 525 bool saveDocument( const QString& fileName );
joachim99@68 526 int getNrOfUnsolvedConflicts(int* pNrOfWhiteSpaceConflicts=0);
joachim99@8 527 void choose(int selector);
joachim99@51 528 void chooseGlobal(int selector, bool bConflictsOnly, bool bWhiteSpaceOnly );
joachim99@8 529
joachim99@8 530 int getNofColumns();
joachim99@8 531 int getNofLines();
joachim99@8 532 int getNofVisibleColumns();
joachim99@8 533 int getNofVisibleLines();
joachim99@8 534 QString getSelection();
joachim99@8 535 void resetSelection();
joachim99@8 536 void showNrOfConflicts();
joachim99@8 537 bool isDeltaAboveCurrent();
joachim99@8 538 bool isDeltaBelowCurrent();
joachim99@8 539 bool isConflictAboveCurrent();
joachim99@8 540 bool isConflictBelowCurrent();
joachim99@8 541 bool isUnsolvedConflictAboveCurrent();
joachim99@8 542 bool isUnsolvedConflictBelowCurrent();
joachim99@68 543 bool findString( const QString& s, int& d3vLine, int& posInLine, bool bDirDown, bool bCaseSensitive );
joachim99@8 544 void setSelection( int firstLine, int startPos, int lastLine, int endPos );
joachim99@8 545 public slots:
joachim99@8 546 void setFirstLine(int firstLine);
joachim99@8 547 void setFirstColumn(int firstCol);
joachim99@8 548
joachim99@8 549 void slotGoCurrent();
joachim99@8 550 void slotGoTop();
joachim99@8 551 void slotGoBottom();
joachim99@8 552 void slotGoPrevDelta();
joachim99@8 553 void slotGoNextDelta();
joachim99@8 554 void slotGoPrevUnsolvedConflict();
joachim99@8 555 void slotGoNextUnsolvedConflict();
joachim99@8 556 void slotGoPrevConflict();
joachim99@8 557 void slotGoNextConflict();
joachim99@8 558 void slotAutoSolve();
joachim99@8 559 void slotUnsolve();
joachim99@8 560 void slotSetFastSelectorLine(int);
joachim99@58 561 void setPaintingAllowed(bool);
joachim99@66 562 void updateSourceMask();
joachim99@8 563
joachim99@8 564 signals:
joachim99@8 565 void scroll( int deltaX, int deltaY );
joachim99@8 566 void modified();
joachim99@8 567 void setFastSelectorRange( int line1, int nofLines );
joachim99@66 568 void sourceMask( int srcMask, int enabledMask );
joachim99@8 569 void resizeSignal();
joachim99@8 570 void selectionEnd();
joachim99@8 571 void newSelection();
joachim99@8 572 void updateAvailabilities();
joachim99@8 573 void showPopupMenu( const QPoint& point );
joachim99@8 574
joachim99@8 575 private:
joachim99@51 576 void merge(bool bAutoSolve, int defaultSelector, bool bConflictsOnly=false, bool bWhiteSpaceOnly=false );
joachim99@68 577 QString getString( int lineIdx );
joachim99@8 578
joachim99@8 579 OptionDialog* m_pOptionDialog;
joachim99@8 580
joachim99@8 581 const LineData* m_pldA;
joachim99@8 582 const LineData* m_pldB;
joachim99@8 583 const LineData* m_pldC;
joachim99@8 584
joachim99@8 585 const Diff3LineList* m_pDiff3LineList;
joachim99@66 586 TotalDiffStatus* m_pTotalDiffStatus;
joachim99@8 587
joachim99@58 588 bool m_bPaintingAllowed;
joachim99@58 589
joachim99@8 590 private:
joachim99@8 591 class MergeEditLine
joachim99@8 592 {
joachim99@8 593 public:
joachim99@8 594 MergeEditLine(){ m_src=0; m_bLineRemoved=false; }
joachim99@68 595 void setConflict() { m_src=0; m_bLineRemoved=false; m_str=QString(); }
joachim99@8 596 bool isConflict() { return m_src==0 && !m_bLineRemoved && m_str.isNull(); }
joachim99@68 597 void setRemoved(int src=0) { m_src=src; m_bLineRemoved=true; m_str=QString(); }
joachim99@8 598 bool isRemoved() { return m_bLineRemoved; }
joachim99@8 599 bool isEditableText() { return !isConflict() && !isRemoved(); }
joachim99@68 600 void setString( const QString& s ){ m_str=s; m_bLineRemoved=false; m_src=0; }
joachim99@68 601 QString getString( const MergeResultWindow* );
joachim99@8 602 bool isModified() { return ! m_str.isNull() || (m_bLineRemoved && m_src==0); }
joachim99@8 603
joachim99@8 604 void setSource( int src, Diff3LineList::const_iterator i, bool bLineRemoved )
joachim99@8 605 {
joachim99@8 606 m_src=src; m_id3l=i; m_bLineRemoved =bLineRemoved;
joachim99@8 607 }
joachim99@8 608 int src() { return m_src; }
joachim99@8 609 Diff3LineList::const_iterator id3l(){return m_id3l;}
joachim99@8 610 // getString() is implemented as MergeResultWindow::getString()
joachim99@8 611 private:
joachim99@8 612 Diff3LineList::const_iterator m_id3l;
joachim99@8 613 int m_src; // 1, 2 or 3 for A, B or C respectively, or 0 when line is from neither source.
joachim99@68 614 QString m_str; // String when modified by user or null-string when orig data is used.
joachim99@8 615 bool m_bLineRemoved;
joachim99@8 616 };
joachim99@8 617
joachim99@8 618 class MergeEditLineList : private std::list<MergeEditLine>
joachim99@8 619 { // I want to know the size immediately!
joachim99@8 620 private:
joachim99@8 621 typedef std::list<MergeEditLine> BASE;
joachim99@8 622 int m_size;
joachim99@58 623 int* m_pTotalSize;
joachim99@8 624 public:
joachim99@8 625 typedef std::list<MergeEditLine>::iterator iterator;
joachim99@8 626 typedef std::list<MergeEditLine>::const_iterator const_iterator;
joachim99@58 627 MergeEditLineList(){m_size=0; m_pTotalSize=0; }
joachim99@58 628 void clear() { ds(-m_size); BASE::clear(); }
joachim99@58 629 void push_back( const MergeEditLine& m) { ds(+1); BASE::push_back(m); }
joachim99@58 630 void push_front( const MergeEditLine& m) { ds(+1); BASE::push_front(m); }
joachim99@58 631 iterator erase( iterator i ) { ds(-1); return BASE::erase(i); }
joachim99@58 632 iterator insert( iterator i, const MergeEditLine& m ) { ds(+1); return BASE::insert(i,m); }
joachim99@8 633 int size(){ /*assert(int(BASE::size())==m_size);*/ return m_size;}
joachim99@8 634 iterator begin(){return BASE::begin();}
joachim99@8 635 iterator end(){return BASE::end();}
joachim99@8 636 bool empty() { return m_size==0; }
joachim99@68 637
joachim99@58 638 void setTotalSizePtr(int* pTotalSize)
joachim99@58 639 {
joachim99@58 640 m_pTotalSize = pTotalSize;
joachim99@58 641 *m_pTotalSize += m_size;
joachim99@58 642 }
joachim99@68 643
joachim99@58 644 private:
joachim99@58 645 void ds(int deltaSize)
joachim99@68 646 {
joachim99@58 647 m_size+=deltaSize;
joachim99@58 648 if (m_pTotalSize!=0) *m_pTotalSize+=deltaSize;
joachim99@58 649 }
joachim99@8 650 };
joachim99@8 651
joachim99@8 652 friend class MergeEditLine;
joachim99@8 653
joachim99@8 654 struct MergeLine
joachim99@8 655 {
joachim99@8 656 MergeLine()
joachim99@51 657 {
joachim99@51 658 srcSelect=0; mergeDetails=eDefault; d3lLineIdx = -1; srcRangeLength=0;
joachim99@51 659 bConflict=false; bDelta=false; bWhiteSpaceConflict=false;
joachim99@51 660 }
joachim99@8 661 Diff3LineList::const_iterator id3l;
joachim99@8 662 e_MergeDetails mergeDetails;
joachim99@8 663 int d3lLineIdx; // Needed to show the correct window pos.
joachim99@8 664 int srcRangeLength; // how many src-lines have this properties
joachim99@8 665 bool bConflict;
joachim99@51 666 bool bWhiteSpaceConflict;
joachim99@8 667 bool bDelta;
joachim99@8 668 int srcSelect;
joachim99@8 669 MergeEditLineList mergeEditLineList;
joachim99@8 670 };
joachim99@8 671
joachim99@8 672 private:
joachim99@8 673 static bool sameKindCheck( const MergeLine& ml1, const MergeLine& ml2 );
joachim99@8 674
joachim99@8 675 typedef std::list<MergeLine> MergeLineList;
joachim99@8 676 MergeLineList m_mergeLineList;
joachim99@8 677 MergeLineList::iterator m_currentMergeLineIt;
joachim99@8 678 int m_currentPos;
joachim99@8 679
joachim99@8 680 enum e_Direction { eUp, eDown };
joachim99@8 681 enum e_EndPoint { eDelta, eConflict, eUnsolvedConflict, eLine, eEnd };
joachim99@8 682 void go( e_Direction eDir, e_EndPoint eEndPoint );
joachim99@8 683 void calcIteratorFromLineNr(
joachim99@8 684 int line,
joachim99@8 685 MergeLineList::iterator& mlIt,
joachim99@8 686 MergeEditLineList::iterator& melIt
joachim99@8 687 );
joachim99@8 688
joachim99@8 689 virtual void paintEvent( QPaintEvent* e );
joachim99@8 690
joachim99@8 691
joachim99@8 692 void myUpdate(int afterMilliSecs);
joachim99@8 693 virtual void timerEvent(QTimerEvent*);
joachim99@8 694 void writeLine(
joachim99@68 695 MyPainter& p, int line, const QString& str,
joachim99@68 696 int srcSelect, e_MergeDetails mergeDetails, int rangeMark, bool bUserModified, bool bLineRemoved, bool bWhiteSpaceConflict
joachim99@8 697 );
joachim99@8 698 void setFastSelector(MergeLineList::iterator i);
joachim99@8 699 void convertToLinePos( int x, int y, int& line, int& pos );
joachim99@8 700 virtual void mousePressEvent ( QMouseEvent* e );
joachim99@8 701 virtual void mouseDoubleClickEvent ( QMouseEvent* e );
joachim99@8 702 virtual void mouseReleaseEvent ( QMouseEvent * );
joachim99@8 703 virtual void mouseMoveEvent ( QMouseEvent * );
joachim99@66 704 virtual void resizeEvent( QResizeEvent* e );
joachim99@66 705 virtual void keyPressEvent( QKeyEvent* e );
joachim99@66 706 virtual void wheelEvent( QWheelEvent* e );
joachim99@66 707 virtual void focusInEvent( QFocusEvent* e );
joachim99@8 708
joachim99@8 709 QPixmap m_pixmap;
joachim99@8 710 int m_firstLine;
joachim99@8 711 int m_firstColumn;
joachim99@8 712 int m_nofColumns;
joachim99@8 713 int m_nofLines;
joachim99@58 714 int m_totalSize; //Same as m_nofLines, but calculated differently
joachim99@8 715 bool m_bMyUpdate;
joachim99@8 716 bool m_bInsertMode;
joachim99@8 717 QString m_fileName;
joachim99@8 718 bool m_bModified;
joachim99@8 719 void setModified();
joachim99@8 720
joachim99@8 721 int m_scrollDeltaX;
joachim99@8 722 int m_scrollDeltaY;
joachim99@8 723 int m_cursorXPos;
joachim99@8 724 int m_cursorYPos;
joachim99@8 725 int m_cursorOldXPos;
joachim99@8 726 bool m_bCursorOn; // blinking on and off each second
joachim99@8 727 QTimer m_cursorTimer;
joachim99@66 728 QStatusBar* m_pStatusBar;
joachim99@68 729
joachim99@8 730 Selection m_selection;
joachim99@8 731
joachim99@68 732 bool deleteSelection2( QString& str, int& x, int& y,
joachim99@8 733 MergeLineList::iterator& mlIt, MergeEditLineList::iterator& melIt );
joachim99@8 734 public slots:
joachim99@8 735 void deleteSelection();
joachim99@66 736 void pasteClipboard(bool bFromSelection);
joachim99@8 737 private slots:
joachim99@8 738 void slotCursorUpdate();
joachim99@8 739 };
joachim99@8 740
joachim99@8 741 void fineDiff(
joachim99@8 742 Diff3LineList& diff3LineList,
joachim99@8 743 int selector,
joachim99@58 744 const LineData* v1,
joachim99@58 745 const LineData* v2,
joachim99@8 746 bool& bTextsTotalEqual
joachim99@8 747 );
joachim99@8 748
joachim99@8 749
joachim99@8 750 bool equal( const LineData& l1, const LineData& l2, bool bStrict );
joachim99@8 751
joachim99@8 752
joachim99@8 753
joachim99@8 754
joachim99@68 755 inline bool isWhite( QChar c )
joachim99@8 756 {
joachim99@8 757 return c==' ' || c=='\t' || c=='\r';
joachim99@8 758 }
joachim99@8 759
joachim99@8 760 /** Returns the number of equivalent spaces at position outPos.
joachim99@8 761 */
joachim99@8 762 inline int tabber( int outPos, int tabSize )
joachim99@8 763 {
joachim99@8 764 return tabSize - ( outPos % tabSize );
joachim99@8 765 }
joachim99@8 766
joachim99@8 767 /** Returns a line number where the linerange [line, line+nofLines] can
joachim99@8 768 be displayed best. If it fits into the currently visible range then
joachim99@8 769 the returned value is the current firstLine.
joachim99@8 770 */
joachim99@8 771 int getBestFirstLine( int line, int nofLines, int firstLine, int visibleLines );
joachim99@8 772
joachim99@8 773 extern int g_tabSize;
joachim99@8 774 extern bool g_bIgnoreWhiteSpace;
joachim99@8 775 extern bool g_bIgnoreTrivialMatches;
joachim99@8 776 extern int g_bAutoSolve;
joachim99@8 777
joachim99@8 778 // Cursor conversions that consider g_tabSize.
joachim99@68 779 int convertToPosInText( const QString& s, int posOnScreen );
joachim99@68 780 int convertToPosOnScreen( const QString& s, int posInText );
joachim99@68 781 void calcTokenPos( const QString&, int posOnScreen, int& pos1, int& pos2 );
joachim99@8 782 #endif
joachim99@8 783