joachim99@8
|
1 /***************************************************************************
|
joachim99@8
|
2 diff.h - description
|
joachim99@8
|
3 -------------------
|
joachim99@8
|
4 begin : Mon Mar 18 2002
|
joachim99@8
|
5 copyright : (C) 2002 by Joachim Eibl
|
joachim99@8
|
6 email : joachim.eibl@gmx.de
|
joachim99@8
|
7 ***************************************************************************/
|
joachim99@8
|
8
|
joachim99@8
|
9 /***************************************************************************
|
joachim99@8
|
10 * *
|
joachim99@8
|
11 * This program is free software; you can redistribute it and/or modify *
|
joachim99@8
|
12 * it under the terms of the GNU General Public License as published by *
|
joachim99@8
|
13 * the Free Software Foundation; either version 2 of the License, or *
|
joachim99@8
|
14 * (at your option) any later version. *
|
joachim99@8
|
15 * *
|
joachim99@8
|
16 ***************************************************************************/
|
joachim99@8
|
17
|
joachim99@8
|
18 #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@8
|
31
|
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@8
|
126 int width(); // Calcs width considering tabs.
|
joachim99@8
|
127 int occurances;
|
joachim99@8
|
128 bool whiteLine(){ return pFirstNonWhiteChar-pLine == size; }
|
joachim99@51
|
129 bool bContainsPureComment;
|
joachim99@8
|
130 };
|
joachim99@8
|
131
|
joachim99@8
|
132 void prepareOccurances( LineData* p, int size );
|
joachim99@8
|
133
|
joachim99@8
|
134
|
joachim99@8
|
135 class SourceData
|
joachim99@8
|
136 {
|
joachim99@8
|
137 public:
|
joachim99@8
|
138 SourceData(){ m_pBuf=0;m_size=0;m_vSize=0;m_bIsText=false;m_bPreserve=false; }
|
joachim99@8
|
139 const char* m_pBuf;
|
joachim99@8
|
140 int m_size;
|
joachim99@8
|
141 int m_vSize; // Nr of lines in m_pBuf1 and size of m_v1, m_dv12 and m_dv13
|
joachim99@8
|
142 std::vector<LineData> m_v;
|
joachim99@8
|
143 bool m_bIsText;
|
joachim99@8
|
144 bool m_bPreserve;
|
joachim99@8
|
145 void reset();
|
joachim99@8
|
146 void readPPFile( bool bPreserveCR, const QString& ppCmd, bool bUpCase );
|
joachim99@51
|
147 void readLMPPFile( SourceData* pOrigSource, const QString& ppCmd, bool bUpCase, bool bRemoveComments );
|
joachim99@8
|
148 void readFile(const QString& filename, bool bFollowLinks, bool bUpCase );
|
joachim99@8
|
149 void preprocess(bool bPreserveCR );
|
joachim99@51
|
150 void removeComments( LineData* pLD );
|
joachim99@8
|
151 void setData( const QString& data, bool bUpCase );
|
joachim99@8
|
152 void setFilename(const QString& filename);
|
joachim99@8
|
153 void setFileAccess( const FileAccess& fa );
|
joachim99@8
|
154 FileAccess& getFileAccess();
|
joachim99@8
|
155 QString getFilename();
|
joachim99@8
|
156 void setAliasName(const QString& a);
|
joachim99@8
|
157 QString getAliasName();
|
joachim99@8
|
158 bool isEmpty() { return getFilename().isEmpty(); }
|
joachim99@8
|
159 private:
|
joachim99@8
|
160 QString m_fileName;
|
joachim99@8
|
161 QString m_aliasName;
|
joachim99@8
|
162 FileAccess m_fileAccess;
|
joachim99@8
|
163 };
|
joachim99@8
|
164
|
joachim99@8
|
165 void calcDiff3LineListTrim( Diff3LineList& d3ll, LineData* pldA, LineData* pldB, LineData* pldC );
|
joachim99@8
|
166 void calcWhiteDiff3Lines( Diff3LineList& d3ll, LineData* pldA, LineData* pldB, LineData* pldC );
|
joachim99@8
|
167
|
joachim99@8
|
168 void calcDiff3LineVector( const Diff3LineList& d3ll, Diff3LineVector& d3lv );
|
joachim99@8
|
169
|
joachim99@8
|
170 void debugLineCheck( Diff3LineList& d3ll, int size, int idx );
|
joachim99@8
|
171
|
joachim99@8
|
172 class QStatusBar;
|
joachim99@8
|
173
|
joachim99@8
|
174
|
joachim99@8
|
175
|
joachim99@8
|
176 class Selection
|
joachim99@8
|
177 {
|
joachim99@8
|
178 public:
|
joachim99@8
|
179 Selection(){ reset(); oldLastLine=-1; lastLine=-1; oldFirstLine=-1; }
|
joachim99@8
|
180 int firstLine;
|
joachim99@8
|
181 int firstPos;
|
joachim99@8
|
182 int lastLine;
|
joachim99@8
|
183 int lastPos;
|
joachim99@8
|
184 int oldLastLine;
|
joachim99@8
|
185 int oldFirstLine;
|
joachim99@8
|
186 bool bSelectionContainsData;
|
joachim99@8
|
187 bool isEmpty() { return firstLine==-1 || (firstLine==lastLine && firstPos==lastPos) || bSelectionContainsData==false;}
|
joachim99@8
|
188 void reset(){
|
joachim99@8
|
189 oldFirstLine=firstLine;
|
joachim99@8
|
190 oldLastLine =lastLine;
|
joachim99@8
|
191 firstLine=-1;
|
joachim99@8
|
192 bSelectionContainsData = false;
|
joachim99@8
|
193 }
|
joachim99@8
|
194 void start( int l, int p ) { firstLine = l; firstPos = p; }
|
joachim99@8
|
195 void end( int l, int p ) {
|
joachim99@8
|
196 if ( oldLastLine == -1 )
|
joachim99@8
|
197 oldLastLine = lastLine;
|
joachim99@8
|
198 lastLine = l;
|
joachim99@8
|
199 lastPos = p;
|
joachim99@8
|
200 }
|
joachim99@8
|
201 bool within( int l, int p );
|
joachim99@8
|
202
|
joachim99@8
|
203 bool lineWithin( int l );
|
joachim99@8
|
204 int firstPosInLine(int l);
|
joachim99@8
|
205 int lastPosInLine(int l);
|
joachim99@8
|
206 int beginLine(){ return min2(firstLine,lastLine); }
|
joachim99@8
|
207 int endLine(){ return max2(firstLine,lastLine); }
|
joachim99@8
|
208 int beginPos() { return firstLine==lastLine ? min2(firstPos,lastPos) :
|
joachim99@8
|
209 firstLine<lastLine ? firstPos : lastPos; }
|
joachim99@8
|
210 int endPos() { return firstLine==lastLine ? max2(firstPos,lastPos) :
|
joachim99@8
|
211 firstLine<lastLine ? lastPos : firstPos; }
|
joachim99@8
|
212 };
|
joachim99@8
|
213
|
joachim99@8
|
214 class OptionDialog;
|
joachim99@8
|
215
|
joachim99@51
|
216 QString decodeString( const char*s , OptionDialog* );
|
joachim99@51
|
217
|
joachim99@8
|
218 class DiffTextWindow : public QWidget
|
joachim99@8
|
219 {
|
joachim99@8
|
220 Q_OBJECT
|
joachim99@8
|
221 public:
|
joachim99@8
|
222 DiffTextWindow(
|
joachim99@8
|
223 QWidget* pParent,
|
joachim99@8
|
224 QStatusBar* pStatusBar,
|
joachim99@8
|
225 OptionDialog* pOptionDialog
|
joachim99@8
|
226 );
|
joachim99@8
|
227 void init(
|
joachim99@8
|
228 const QString& fileName,
|
joachim99@8
|
229 LineData* pLineData,
|
joachim99@8
|
230 int size,
|
joachim99@8
|
231 const Diff3LineVector* pDiff3LineVector,
|
joachim99@8
|
232 int winIdx,
|
joachim99@8
|
233 bool bTriple
|
joachim99@8
|
234 );
|
joachim99@8
|
235 virtual void mousePressEvent ( QMouseEvent * );
|
joachim99@8
|
236 virtual void mouseReleaseEvent ( QMouseEvent * );
|
joachim99@8
|
237 virtual void mouseMoveEvent ( QMouseEvent * );
|
joachim99@8
|
238 virtual void mouseDoubleClickEvent ( QMouseEvent * e );
|
joachim99@8
|
239 void convertToLinePos( int x, int y, int& line, int& pos );
|
joachim99@8
|
240
|
joachim99@8
|
241 virtual void paintEvent( QPaintEvent* );
|
joachim99@8
|
242 virtual void dragEnterEvent( QDragEnterEvent* e );
|
joachim99@8
|
243 //void setData( const char* pText);
|
joachim99@8
|
244
|
joachim99@8
|
245 virtual void resizeEvent( QResizeEvent* );
|
joachim99@8
|
246
|
joachim99@8
|
247 QString getSelection();
|
joachim99@8
|
248 int getFirstLine() { return m_firstLine; }
|
joachim99@8
|
249
|
joachim99@8
|
250 int getNofColumns();
|
joachim99@8
|
251 int getNofLines();
|
joachim99@8
|
252 int getNofVisibleLines();
|
joachim99@8
|
253 int getNofVisibleColumns();
|
joachim99@8
|
254
|
joachim99@8
|
255 bool findString( const QCString& s, int& d3vLine, int& posInLine, bool bDirDown, bool bCaseSensitive );
|
joachim99@8
|
256 void setSelection( int firstLine, int startPos, int lastLine, int endPos );
|
joachim99@8
|
257
|
joachim99@8
|
258 void setPaintingAllowed( bool bAllowPainting );
|
joachim99@8
|
259 signals:
|
joachim99@8
|
260 void resizeSignal( int nofVisibleColumns, int nofVisibleLines );
|
joachim99@8
|
261 void scroll( int deltaX, int deltaY );
|
joachim99@8
|
262 void newSelection();
|
joachim99@8
|
263 void selectionEnd();
|
joachim99@8
|
264 void setFastSelectorLine( int line );
|
joachim99@8
|
265
|
joachim99@8
|
266 public slots:
|
joachim99@8
|
267 void setFirstLine( int line );
|
joachim99@8
|
268 void setFirstColumn( int col );
|
joachim99@8
|
269 void resetSelection();
|
joachim99@8
|
270 void setFastSelectorRange( int line1, int nofLines );
|
joachim99@8
|
271
|
joachim99@8
|
272 private:
|
joachim99@8
|
273 bool m_bPaintingAllowed;
|
joachim99@8
|
274 LineData* m_pLineData;
|
joachim99@8
|
275 int m_size;
|
joachim99@8
|
276 QString m_filename;
|
joachim99@8
|
277
|
joachim99@8
|
278 const Diff3LineVector* m_pDiff3LineVector;
|
joachim99@8
|
279
|
joachim99@8
|
280 OptionDialog* m_pOptionDialog;
|
joachim99@8
|
281 QColor m_cThis;
|
joachim99@8
|
282 QColor m_cDiff1;
|
joachim99@8
|
283 QColor m_cDiff2;
|
joachim99@8
|
284 QColor m_cDiffBoth;
|
joachim99@8
|
285
|
joachim99@8
|
286 int m_fastSelectorLine1;
|
joachim99@8
|
287 int m_fastSelectorNofLines;
|
joachim99@8
|
288
|
joachim99@8
|
289 bool m_bTriple;
|
joachim99@8
|
290 int m_winIdx;
|
joachim99@8
|
291 int m_firstLine;
|
joachim99@8
|
292 int m_oldFirstLine;
|
joachim99@8
|
293 int m_oldFirstColumn;
|
joachim99@8
|
294 int m_firstColumn;
|
joachim99@8
|
295 int m_lineNumberWidth;
|
joachim99@8
|
296
|
joachim99@8
|
297 void getLineInfo(
|
joachim99@8
|
298 const Diff3Line& d,
|
joachim99@8
|
299 int& lineIdx,
|
joachim99@8
|
300 DiffList*& pFineDiff1, DiffList*& pFineDiff2, // return values
|
joachim99@8
|
301 int& changed, int& changed2 );
|
joachim99@8
|
302
|
joachim99@8
|
303 QCString getString( int line );
|
joachim99@8
|
304
|
joachim99@8
|
305 void writeLine(
|
joachim99@8
|
306 QPainter& p, const LineData* pld,
|
joachim99@8
|
307 const DiffList* pLineDiff1, const DiffList* pLineDiff2, int line,
|
joachim99@8
|
308 int whatChanged, int whatChanged2, int srcLineNr );
|
joachim99@8
|
309
|
joachim99@8
|
310 QStatusBar* m_pStatusBar;
|
joachim99@8
|
311
|
joachim99@8
|
312 Selection selection;
|
joachim99@8
|
313
|
joachim99@8
|
314 int m_scrollDeltaX;
|
joachim99@8
|
315 int m_scrollDeltaY;
|
joachim99@8
|
316 virtual void timerEvent(QTimerEvent*);
|
joachim99@8
|
317 bool m_bMyUpdate;
|
joachim99@8
|
318 void myUpdate(int afterMilliSecs );
|
joachim99@8
|
319
|
joachim99@8
|
320 QRect m_invalidRect;
|
joachim99@8
|
321 };
|
joachim99@8
|
322
|
joachim99@8
|
323
|
joachim99@8
|
324
|
joachim99@8
|
325 class Overview : public QWidget
|
joachim99@8
|
326 {
|
joachim99@8
|
327 Q_OBJECT
|
joachim99@8
|
328 public:
|
joachim99@8
|
329 Overview( QWidget* pParent, OptionDialog* pOptions );
|
joachim99@8
|
330
|
joachim99@8
|
331 void init( Diff3LineList* pDiff3LineList, bool bTripleDiff );
|
joachim99@8
|
332 void setRange( int firstLine, int pageHeight );
|
joachim99@8
|
333 void setPaintingAllowed( bool bAllowPainting );
|
joachim99@8
|
334
|
joachim99@8
|
335 public slots:
|
joachim99@8
|
336 void setFirstLine(int firstLine);
|
joachim99@51
|
337 void slotRedraw();
|
joachim99@8
|
338 signals:
|
joachim99@8
|
339 void setLine(int);
|
joachim99@8
|
340 private:
|
joachim99@8
|
341 const Diff3LineList* m_pDiff3LineList;
|
joachim99@8
|
342 OptionDialog* m_pOptions;
|
joachim99@8
|
343 bool m_bTripleDiff;
|
joachim99@8
|
344 int m_firstLine;
|
joachim99@8
|
345 int m_pageHeight;
|
joachim99@8
|
346 QPixmap m_pixmap;
|
joachim99@8
|
347 bool m_bPaintingAllowed;
|
joachim99@8
|
348
|
joachim99@8
|
349 virtual void paintEvent( QPaintEvent* e );
|
joachim99@8
|
350 virtual void mousePressEvent( QMouseEvent* e );
|
joachim99@8
|
351 virtual void mouseMoveEvent( QMouseEvent* e );
|
joachim99@8
|
352 };
|
joachim99@8
|
353
|
joachim99@8
|
354
|
joachim99@8
|
355 enum e_MergeDetails
|
joachim99@8
|
356 {
|
joachim99@8
|
357 eDefault,
|
joachim99@8
|
358 eNoChange,
|
joachim99@8
|
359 eBChanged,
|
joachim99@8
|
360 eCChanged,
|
joachim99@8
|
361 eBCChanged, // conflict
|
joachim99@8
|
362 eBCChangedAndEqual, // possible conflict
|
joachim99@8
|
363 eBDeleted,
|
joachim99@8
|
364 eCDeleted,
|
joachim99@8
|
365 eBCDeleted, // possible conflict
|
joachim99@8
|
366
|
joachim99@8
|
367 eBChanged_CDeleted, // conflict
|
joachim99@8
|
368 eCChanged_BDeleted, // conflict
|
joachim99@8
|
369 eBAdded,
|
joachim99@8
|
370 eCAdded,
|
joachim99@8
|
371 eBCAdded, // conflict
|
joachim99@8
|
372 eBCAddedAndEqual // possible conflict
|
joachim99@8
|
373 };
|
joachim99@8
|
374
|
joachim99@8
|
375 void mergeOneLine( const Diff3Line& d, e_MergeDetails& mergeDetails, bool& bConflict, bool& bLineRemoved, int& src, bool bTwoInputs );
|
joachim99@8
|
376
|
joachim99@51
|
377 enum e_MergeSrcSelector
|
joachim99@51
|
378 {
|
joachim99@51
|
379 A=1,
|
joachim99@51
|
380 B=2,
|
joachim99@51
|
381 C=3
|
joachim99@51
|
382 };
|
joachim99@8
|
383
|
joachim99@8
|
384 class MergeResultWindow : public QWidget
|
joachim99@8
|
385 {
|
joachim99@8
|
386 Q_OBJECT
|
joachim99@8
|
387 public:
|
joachim99@8
|
388 MergeResultWindow(
|
joachim99@8
|
389 QWidget* pParent,
|
joachim99@8
|
390 OptionDialog* pOptionDialog
|
joachim99@8
|
391 );
|
joachim99@8
|
392
|
joachim99@8
|
393 void init(
|
joachim99@8
|
394 const LineData* pLineDataA,
|
joachim99@8
|
395 const LineData* pLineDataB,
|
joachim99@8
|
396 const LineData* pLineDataC,
|
joachim99@8
|
397 const Diff3LineList* pDiff3LineList,
|
joachim99@8
|
398 const TotalDiffStatus* pTotalDiffStatus,
|
joachim99@8
|
399 QString fileName
|
joachim99@8
|
400 );
|
joachim99@8
|
401
|
joachim99@8
|
402 bool saveDocument( const QString& fileName );
|
joachim99@8
|
403 int getNrOfUnsolvedConflicts();
|
joachim99@8
|
404 void choose(int selector);
|
joachim99@51
|
405 void chooseGlobal(int selector, bool bConflictsOnly, bool bWhiteSpaceOnly );
|
joachim99@8
|
406
|
joachim99@8
|
407 int getNofColumns();
|
joachim99@8
|
408 int getNofLines();
|
joachim99@8
|
409 int getNofVisibleColumns();
|
joachim99@8
|
410 int getNofVisibleLines();
|
joachim99@8
|
411 virtual void resizeEvent( QResizeEvent* e );
|
joachim99@8
|
412 virtual void keyPressEvent( QKeyEvent* e );
|
joachim99@8
|
413 virtual void wheelEvent( QWheelEvent* e );
|
joachim99@8
|
414 QString getSelection();
|
joachim99@8
|
415 void resetSelection();
|
joachim99@8
|
416 void showNrOfConflicts();
|
joachim99@8
|
417 bool isDeltaAboveCurrent();
|
joachim99@8
|
418 bool isDeltaBelowCurrent();
|
joachim99@8
|
419 bool isConflictAboveCurrent();
|
joachim99@8
|
420 bool isConflictBelowCurrent();
|
joachim99@8
|
421 bool isUnsolvedConflictAboveCurrent();
|
joachim99@8
|
422 bool isUnsolvedConflictBelowCurrent();
|
joachim99@8
|
423 bool findString( const QCString& s, int& d3vLine, int& posInLine, bool bDirDown, bool bCaseSensitive );
|
joachim99@8
|
424 void setSelection( int firstLine, int startPos, int lastLine, int endPos );
|
joachim99@8
|
425 public slots:
|
joachim99@8
|
426 void setFirstLine(int firstLine);
|
joachim99@8
|
427 void setFirstColumn(int firstCol);
|
joachim99@8
|
428
|
joachim99@8
|
429 void slotGoCurrent();
|
joachim99@8
|
430 void slotGoTop();
|
joachim99@8
|
431 void slotGoBottom();
|
joachim99@8
|
432 void slotGoPrevDelta();
|
joachim99@8
|
433 void slotGoNextDelta();
|
joachim99@8
|
434 void slotGoPrevUnsolvedConflict();
|
joachim99@8
|
435 void slotGoNextUnsolvedConflict();
|
joachim99@8
|
436 void slotGoPrevConflict();
|
joachim99@8
|
437 void slotGoNextConflict();
|
joachim99@8
|
438 void slotAutoSolve();
|
joachim99@8
|
439 void slotUnsolve();
|
joachim99@8
|
440 void slotSetFastSelectorLine(int);
|
joachim99@8
|
441
|
joachim99@8
|
442 signals:
|
joachim99@8
|
443 void scroll( int deltaX, int deltaY );
|
joachim99@8
|
444 void modified();
|
joachim99@8
|
445 void setFastSelectorRange( int line1, int nofLines );
|
joachim99@8
|
446 void sourceMask( int srcMask, int enabledMask );
|
joachim99@8
|
447 void resizeSignal();
|
joachim99@8
|
448 void selectionEnd();
|
joachim99@8
|
449 void newSelection();
|
joachim99@8
|
450 void updateAvailabilities();
|
joachim99@8
|
451 void showPopupMenu( const QPoint& point );
|
joachim99@8
|
452
|
joachim99@8
|
453 private:
|
joachim99@51
|
454 void merge(bool bAutoSolve, int defaultSelector, bool bConflictsOnly=false, bool bWhiteSpaceOnly=false );
|
joachim99@8
|
455 QCString getString( int lineIdx );
|
joachim99@8
|
456
|
joachim99@8
|
457 OptionDialog* m_pOptionDialog;
|
joachim99@8
|
458
|
joachim99@8
|
459 const LineData* m_pldA;
|
joachim99@8
|
460 const LineData* m_pldB;
|
joachim99@8
|
461 const LineData* m_pldC;
|
joachim99@8
|
462
|
joachim99@8
|
463 const Diff3LineList* m_pDiff3LineList;
|
joachim99@8
|
464 const TotalDiffStatus* m_pTotalDiffStatus;
|
joachim99@8
|
465
|
joachim99@8
|
466 private:
|
joachim99@8
|
467 class MergeEditLine
|
joachim99@8
|
468 {
|
joachim99@8
|
469 public:
|
joachim99@8
|
470 MergeEditLine(){ m_src=0; m_bLineRemoved=false; }
|
joachim99@8
|
471 void setConflict() { m_src=0; m_bLineRemoved=false; m_str=QCString(); }
|
joachim99@8
|
472 bool isConflict() { return m_src==0 && !m_bLineRemoved && m_str.isNull(); }
|
joachim99@8
|
473 void setRemoved(int src=0) { m_src=src; m_bLineRemoved=true; m_str=QCString(); }
|
joachim99@8
|
474 bool isRemoved() { return m_bLineRemoved; }
|
joachim99@8
|
475 bool isEditableText() { return !isConflict() && !isRemoved(); }
|
joachim99@8
|
476 void setString( const QCString& s ){ m_str=s; m_bLineRemoved=false; m_src=0; }
|
joachim99@8
|
477 const char* getString( const MergeResultWindow*, int& size );
|
joachim99@8
|
478 bool isModified() { return ! m_str.isNull() || (m_bLineRemoved && m_src==0); }
|
joachim99@8
|
479
|
joachim99@8
|
480 void setSource( int src, Diff3LineList::const_iterator i, bool bLineRemoved )
|
joachim99@8
|
481 {
|
joachim99@8
|
482 m_src=src; m_id3l=i; m_bLineRemoved =bLineRemoved;
|
joachim99@8
|
483 }
|
joachim99@8
|
484 int src() { return m_src; }
|
joachim99@8
|
485 Diff3LineList::const_iterator id3l(){return m_id3l;}
|
joachim99@8
|
486 // getString() is implemented as MergeResultWindow::getString()
|
joachim99@8
|
487 private:
|
joachim99@8
|
488 Diff3LineList::const_iterator m_id3l;
|
joachim99@8
|
489 int m_src; // 1, 2 or 3 for A, B or C respectively, or 0 when line is from neither source.
|
joachim99@8
|
490 QCString m_str; // String when modified by user or null-string when orig data is used.
|
joachim99@8
|
491 bool m_bLineRemoved;
|
joachim99@8
|
492 };
|
joachim99@8
|
493
|
joachim99@8
|
494 class MergeEditLineList : private std::list<MergeEditLine>
|
joachim99@8
|
495 { // I want to know the size immediately!
|
joachim99@8
|
496 private:
|
joachim99@8
|
497 typedef std::list<MergeEditLine> BASE;
|
joachim99@8
|
498 int m_size;
|
joachim99@8
|
499 public:
|
joachim99@8
|
500 typedef std::list<MergeEditLine>::iterator iterator;
|
joachim99@8
|
501 typedef std::list<MergeEditLine>::const_iterator const_iterator;
|
joachim99@8
|
502 MergeEditLineList(){m_size=0;}
|
joachim99@8
|
503 void clear() { m_size=0; BASE::clear(); }
|
joachim99@8
|
504 void push_back( const MergeEditLine& m) { ++m_size; BASE::push_back(m); }
|
joachim99@8
|
505 void push_front( const MergeEditLine& m) { ++m_size; BASE::push_front(m); }
|
joachim99@8
|
506 iterator erase( iterator i ) { --m_size; return BASE::erase(i); }
|
joachim99@8
|
507 iterator insert( iterator i, const MergeEditLine& m ) { ++m_size; return BASE::insert(i,m); }
|
joachim99@8
|
508 int size(){ /*assert(int(BASE::size())==m_size);*/ return m_size;}
|
joachim99@8
|
509 iterator begin(){return BASE::begin();}
|
joachim99@8
|
510 iterator end(){return BASE::end();}
|
joachim99@8
|
511 bool empty() { return m_size==0; }
|
joachim99@8
|
512 };
|
joachim99@8
|
513
|
joachim99@8
|
514 friend class MergeEditLine;
|
joachim99@8
|
515
|
joachim99@8
|
516 struct MergeLine
|
joachim99@8
|
517 {
|
joachim99@8
|
518 MergeLine()
|
joachim99@51
|
519 {
|
joachim99@51
|
520 srcSelect=0; mergeDetails=eDefault; d3lLineIdx = -1; srcRangeLength=0;
|
joachim99@51
|
521 bConflict=false; bDelta=false; bWhiteSpaceConflict=false;
|
joachim99@51
|
522 }
|
joachim99@8
|
523 Diff3LineList::const_iterator id3l;
|
joachim99@8
|
524 e_MergeDetails mergeDetails;
|
joachim99@8
|
525 int d3lLineIdx; // Needed to show the correct window pos.
|
joachim99@8
|
526 int srcRangeLength; // how many src-lines have this properties
|
joachim99@8
|
527 bool bConflict;
|
joachim99@51
|
528 bool bWhiteSpaceConflict;
|
joachim99@8
|
529 bool bDelta;
|
joachim99@8
|
530 int srcSelect;
|
joachim99@8
|
531 MergeEditLineList mergeEditLineList;
|
joachim99@8
|
532 };
|
joachim99@8
|
533
|
joachim99@8
|
534 private:
|
joachim99@8
|
535 static bool sameKindCheck( const MergeLine& ml1, const MergeLine& ml2 );
|
joachim99@8
|
536
|
joachim99@8
|
537 typedef std::list<MergeLine> MergeLineList;
|
joachim99@8
|
538 MergeLineList m_mergeLineList;
|
joachim99@8
|
539 MergeLineList::iterator m_currentMergeLineIt;
|
joachim99@8
|
540 int m_currentPos;
|
joachim99@8
|
541
|
joachim99@8
|
542 enum e_Direction { eUp, eDown };
|
joachim99@8
|
543 enum e_EndPoint { eDelta, eConflict, eUnsolvedConflict, eLine, eEnd };
|
joachim99@8
|
544 void go( e_Direction eDir, e_EndPoint eEndPoint );
|
joachim99@8
|
545 void calcIteratorFromLineNr(
|
joachim99@8
|
546 int line,
|
joachim99@8
|
547 MergeLineList::iterator& mlIt,
|
joachim99@8
|
548 MergeEditLineList::iterator& melIt
|
joachim99@8
|
549 );
|
joachim99@8
|
550
|
joachim99@8
|
551 virtual void paintEvent( QPaintEvent* e );
|
joachim99@8
|
552
|
joachim99@8
|
553
|
joachim99@8
|
554 void myUpdate(int afterMilliSecs);
|
joachim99@8
|
555 virtual void timerEvent(QTimerEvent*);
|
joachim99@8
|
556 void writeLine(
|
joachim99@8
|
557 QPainter& p, int line, const char* pStr, int size,
|
joachim99@8
|
558 int srcSelect, e_MergeDetails mergeDetails, int rangeMark, bool bUserModified, bool bLineRemoved
|
joachim99@8
|
559 );
|
joachim99@8
|
560 void setFastSelector(MergeLineList::iterator i);
|
joachim99@8
|
561 void convertToLinePos( int x, int y, int& line, int& pos );
|
joachim99@8
|
562 virtual void mousePressEvent ( QMouseEvent* e );
|
joachim99@8
|
563 virtual void mouseDoubleClickEvent ( QMouseEvent* e );
|
joachim99@8
|
564 virtual void mouseReleaseEvent ( QMouseEvent * );
|
joachim99@8
|
565 virtual void mouseMoveEvent ( QMouseEvent * );
|
joachim99@8
|
566
|
joachim99@8
|
567 QPixmap m_pixmap;
|
joachim99@8
|
568 int m_firstLine;
|
joachim99@8
|
569 int m_firstColumn;
|
joachim99@8
|
570 int m_nofColumns;
|
joachim99@8
|
571 int m_nofLines;
|
joachim99@8
|
572 bool m_bMyUpdate;
|
joachim99@8
|
573 bool m_bInsertMode;
|
joachim99@8
|
574 QString m_fileName;
|
joachim99@8
|
575 bool m_bModified;
|
joachim99@8
|
576 void setModified();
|
joachim99@8
|
577
|
joachim99@8
|
578 int m_scrollDeltaX;
|
joachim99@8
|
579 int m_scrollDeltaY;
|
joachim99@8
|
580 int m_cursorXPos;
|
joachim99@8
|
581 int m_cursorYPos;
|
joachim99@8
|
582 int m_cursorOldXPos;
|
joachim99@8
|
583 bool m_bCursorOn; // blinking on and off each second
|
joachim99@8
|
584 QTimer m_cursorTimer;
|
joachim99@8
|
585
|
joachim99@8
|
586 Selection m_selection;
|
joachim99@8
|
587
|
joachim99@8
|
588 bool deleteSelection2( const char*& ps, int& stringLength, int& x, int& y,
|
joachim99@8
|
589 MergeLineList::iterator& mlIt, MergeEditLineList::iterator& melIt );
|
joachim99@8
|
590 public slots:
|
joachim99@8
|
591 void deleteSelection();
|
joachim99@8
|
592 void pasteClipboard();
|
joachim99@8
|
593 private slots:
|
joachim99@8
|
594 void slotCursorUpdate();
|
joachim99@8
|
595 };
|
joachim99@8
|
596
|
joachim99@8
|
597 void fineDiff(
|
joachim99@8
|
598 Diff3LineList& diff3LineList,
|
joachim99@8
|
599 int selector,
|
joachim99@8
|
600 LineData* v1,
|
joachim99@8
|
601 LineData* v2,
|
joachim99@8
|
602 bool& bTextsTotalEqual
|
joachim99@8
|
603 );
|
joachim99@8
|
604
|
joachim99@8
|
605
|
joachim99@8
|
606 bool equal( const LineData& l1, const LineData& l2, bool bStrict );
|
joachim99@8
|
607
|
joachim99@8
|
608
|
joachim99@8
|
609
|
joachim99@8
|
610
|
joachim99@8
|
611 inline bool isWhite( char c )
|
joachim99@8
|
612 {
|
joachim99@8
|
613 return c==' ' || c=='\t' || c=='\r';
|
joachim99@8
|
614 }
|
joachim99@8
|
615
|
joachim99@8
|
616 /** Returns the number of equivalent spaces at position outPos.
|
joachim99@8
|
617 */
|
joachim99@8
|
618 inline int tabber( int outPos, int tabSize )
|
joachim99@8
|
619 {
|
joachim99@8
|
620 return tabSize - ( outPos % tabSize );
|
joachim99@8
|
621 }
|
joachim99@8
|
622
|
joachim99@8
|
623 /** Returns a line number where the linerange [line, line+nofLines] can
|
joachim99@8
|
624 be displayed best. If it fits into the currently visible range then
|
joachim99@8
|
625 the returned value is the current firstLine.
|
joachim99@8
|
626 */
|
joachim99@8
|
627 int getBestFirstLine( int line, int nofLines, int firstLine, int visibleLines );
|
joachim99@8
|
628
|
joachim99@8
|
629 extern int g_tabSize;
|
joachim99@8
|
630 extern bool g_bIgnoreWhiteSpace;
|
joachim99@8
|
631 extern bool g_bIgnoreTrivialMatches;
|
joachim99@8
|
632 extern int g_bAutoSolve;
|
joachim99@8
|
633
|
joachim99@8
|
634 // Cursor conversions that consider g_tabSize.
|
joachim99@8
|
635 int convertToPosInText( const char* p, int size, int posOnScreen );
|
joachim99@8
|
636 int convertToPosOnScreen( const char* p, int posInText );
|
joachim99@8
|
637 void calcTokenPos( const char* p, int size, int posOnScreen, int& pos1, int& pos2 );
|
joachim99@8
|
638 #endif
|
joachim99@8
|
639
|