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
|