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