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@69
|
6 email : joachim.eibl at 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@70
|
24 #include <q3frame.h>
|
joachim99@68
|
25 #include <qtextstream.h>
|
joachim99@68
|
26 #include <qpainter.h>
|
joachim99@70
|
27 //Added by qt3to4:
|
joachim99@70
|
28 #include <Q3CString>
|
joachim99@8
|
29 #include <list>
|
joachim99@8
|
30 #include <vector>
|
joachim99@8
|
31 #include <assert.h>
|
joachim99@8
|
32 #include "common.h"
|
joachim99@8
|
33 #include "fileaccess.h"
|
joachim99@68
|
34 #include "optiondialog.h"
|
joachim99@8
|
35
|
joachim99@8
|
36
|
joachim99@8
|
37 // Each range with matching elements is followed by a range with differences on either side.
|
joachim99@8
|
38 // Then again range of matching elements should follow.
|
joachim99@8
|
39 struct Diff
|
joachim99@8
|
40 {
|
joachim99@8
|
41 int nofEquals;
|
joachim99@8
|
42
|
joachim99@8
|
43 int diff1;
|
joachim99@8
|
44 int diff2;
|
joachim99@8
|
45
|
joachim99@8
|
46 Diff(int eq, int d1, int d2){nofEquals=eq; diff1=d1; diff2=d2; }
|
joachim99@8
|
47 };
|
joachim99@8
|
48
|
joachim99@8
|
49 typedef std::list<Diff> DiffList;
|
joachim99@8
|
50
|
joachim99@69
|
51 struct LineData
|
joachim99@69
|
52 {
|
joachim99@69
|
53 const QChar* pLine;
|
joachim99@69
|
54 const QChar* pFirstNonWhiteChar;
|
joachim99@69
|
55 int size;
|
joachim99@69
|
56
|
joachim99@69
|
57 LineData(){ pLine=0; pFirstNonWhiteChar=0; size=0; /*occurances=0;*/ bContainsPureComment=false; }
|
joachim99@69
|
58 int width(int tabSize) const; // Calcs width considering tabs.
|
joachim99@69
|
59 //int occurances;
|
joachim99@69
|
60 bool whiteLine() const { return pFirstNonWhiteChar-pLine == size; }
|
joachim99@69
|
61 bool bContainsPureComment;
|
joachim99@69
|
62 };
|
joachim99@69
|
63
|
joachim99@69
|
64 class Diff3LineList;
|
joachim99@69
|
65 class Diff3LineVector;
|
joachim99@69
|
66
|
joachim99@69
|
67 struct DiffBufferInfo
|
joachim99@69
|
68 {
|
joachim99@69
|
69 const LineData* m_pLineDataA;
|
joachim99@69
|
70 const LineData* m_pLineDataB;
|
joachim99@69
|
71 const LineData* m_pLineDataC;
|
joachim99@69
|
72 int m_sizeA;
|
joachim99@69
|
73 int m_sizeB;
|
joachim99@69
|
74 int m_sizeC;
|
joachim99@69
|
75 const Diff3LineList* m_pDiff3LineList;
|
joachim99@69
|
76 const Diff3LineVector* m_pDiff3LineVector;
|
joachim99@69
|
77 void init( Diff3LineList* d3ll, const Diff3LineVector* d3lv,
|
joachim99@69
|
78 const LineData* pldA, int sizeA, const LineData* pldB, int sizeB, const LineData* pldC, int sizeC );
|
joachim99@69
|
79 };
|
joachim99@69
|
80
|
joachim99@8
|
81 struct Diff3Line
|
joachim99@8
|
82 {
|
joachim99@8
|
83 int lineA;
|
joachim99@8
|
84 int lineB;
|
joachim99@8
|
85 int lineC;
|
joachim99@8
|
86
|
joachim99@69
|
87 bool bAEqC : 1; // These are true if equal or only white-space changes exist.
|
joachim99@69
|
88 bool bBEqC : 1;
|
joachim99@69
|
89 bool bAEqB : 1;
|
joachim99@8
|
90
|
joachim99@69
|
91 bool bWhiteLineA : 1;
|
joachim99@69
|
92 bool bWhiteLineB : 1;
|
joachim99@69
|
93 bool bWhiteLineC : 1;
|
joachim99@69
|
94
|
joachim99@69
|
95 DiffList* pFineAB; // These are 0 only if completely equal or if either source doesn't exist.
|
joachim99@8
|
96 DiffList* pFineBC;
|
joachim99@8
|
97 DiffList* pFineCA;
|
joachim99@8
|
98
|
joachim99@66
|
99 int linesNeededForDisplay; // Due to wordwrap
|
joachim99@66
|
100 int sumLinesNeededForDisplay; // For fast conversion to m_diff3WrapLineVector
|
joachim99@69
|
101
|
joachim99@69
|
102 DiffBufferInfo* m_pDiffBufferInfo; // For convenience
|
joachim99@69
|
103
|
joachim99@8
|
104 Diff3Line()
|
joachim99@8
|
105 {
|
joachim99@8
|
106 lineA=-1; lineB=-1; lineC=-1;
|
joachim99@8
|
107 bAEqC=false; bAEqB=false; bBEqC=false;
|
joachim99@8
|
108 pFineAB=0; pFineBC=0; pFineCA=0;
|
joachim99@66
|
109 linesNeededForDisplay=1;
|
joachim99@69
|
110 sumLinesNeededForDisplay=0;
|
joachim99@69
|
111 bWhiteLineA=false; bWhiteLineB=false; bWhiteLineC=false;
|
joachim99@69
|
112 m_pDiffBufferInfo=0;
|
joachim99@8
|
113 }
|
joachim99@8
|
114
|
joachim99@8
|
115 ~Diff3Line()
|
joachim99@8
|
116 {
|
joachim99@8
|
117 if (pFineAB!=0) delete pFineAB;
|
joachim99@8
|
118 if (pFineBC!=0) delete pFineBC;
|
joachim99@8
|
119 if (pFineCA!=0) delete pFineCA;
|
joachim99@8
|
120 pFineAB=0; pFineBC=0; pFineCA=0;
|
joachim99@8
|
121 }
|
joachim99@8
|
122
|
joachim99@8
|
123 bool operator==( const Diff3Line& d3l )
|
joachim99@8
|
124 {
|
joachim99@8
|
125 return lineA == d3l.lineA && lineB == d3l.lineB && lineC == d3l.lineC
|
joachim99@8
|
126 && bAEqB == d3l.bAEqB && bAEqC == d3l.bAEqC && bBEqC == d3l.bBEqC;
|
joachim99@8
|
127 }
|
joachim99@69
|
128
|
joachim99@69
|
129 const LineData* getLineData( int src ) const
|
joachim99@69
|
130 {
|
joachim99@69
|
131 assert( m_pDiffBufferInfo!=0 );
|
joachim99@69
|
132 if ( src == 1 && lineA >= 0 ) return &m_pDiffBufferInfo->m_pLineDataA[lineA];
|
joachim99@69
|
133 if ( src == 2 && lineB >= 0 ) return &m_pDiffBufferInfo->m_pLineDataB[lineB];
|
joachim99@69
|
134 if ( src == 3 && lineC >= 0 ) return &m_pDiffBufferInfo->m_pLineDataC[lineC];
|
joachim99@69
|
135 return 0;
|
joachim99@69
|
136 }
|
joachim99@69
|
137 QString getString( int src ) const
|
joachim99@69
|
138 {
|
joachim99@69
|
139 const LineData* pld = getLineData(src);
|
joachim99@69
|
140 if ( pld )
|
joachim99@69
|
141 return QString( pld->pLine, pld->size);
|
joachim99@69
|
142 else
|
joachim99@69
|
143 return QString();
|
joachim99@69
|
144 }
|
joachim99@69
|
145 int getLineInFile( int src ) const
|
joachim99@69
|
146 {
|
joachim99@69
|
147 if ( src == 1 ) return lineA;
|
joachim99@69
|
148 if ( src == 2 ) return lineB;
|
joachim99@69
|
149 if ( src == 3 ) return lineC;
|
joachim99@69
|
150 return -1;
|
joachim99@69
|
151 }
|
joachim99@8
|
152 };
|
joachim99@8
|
153
|
joachim99@66
|
154
|
joachim99@69
|
155 class Diff3LineList : public std::list<Diff3Line>
|
joachim99@69
|
156 {
|
joachim99@69
|
157 };
|
joachim99@69
|
158 class Diff3LineVector : public std::vector<Diff3Line*>
|
joachim99@69
|
159 {
|
joachim99@69
|
160 };
|
joachim99@66
|
161
|
joachim99@66
|
162 class Diff3WrapLine
|
joachim99@66
|
163 {
|
joachim99@66
|
164 public:
|
joachim99@66
|
165 Diff3Line* pD3L;
|
joachim99@66
|
166 int diff3LineIndex;
|
joachim99@66
|
167 int wrapLineOffset;
|
joachim99@69
|
168 int wrapLineLength;
|
joachim99@66
|
169 };
|
joachim99@66
|
170
|
joachim99@66
|
171 typedef std::vector<Diff3WrapLine> Diff3WrapLineVector;
|
joachim99@66
|
172
|
joachim99@8
|
173
|
joachim99@8
|
174 class TotalDiffStatus
|
joachim99@8
|
175 {
|
joachim99@8
|
176 public:
|
joachim99@66
|
177 TotalDiffStatus(){ reset(); }
|
joachim99@8
|
178 void reset() {bBinaryAEqC=false; bBinaryBEqC=false; bBinaryAEqB=false;
|
joachim99@66
|
179 bTextAEqC=false; bTextBEqC=false; bTextAEqB=false;
|
joachim99@66
|
180 nofUnsolvedConflicts=0; nofSolvedConflicts=0;
|
joachim99@69
|
181 nofWhitespaceConflicts=0;
|
joachim99@66
|
182 }
|
joachim99@8
|
183 bool bBinaryAEqC;
|
joachim99@8
|
184 bool bBinaryBEqC;
|
joachim99@8
|
185 bool bBinaryAEqB;
|
joachim99@8
|
186
|
joachim99@8
|
187 bool bTextAEqC;
|
joachim99@8
|
188 bool bTextBEqC;
|
joachim99@8
|
189 bool bTextAEqB;
|
joachim99@69
|
190
|
joachim99@66
|
191 int nofUnsolvedConflicts;
|
joachim99@66
|
192 int nofSolvedConflicts;
|
joachim99@66
|
193 int nofWhitespaceConflicts;
|
joachim99@8
|
194 };
|
joachim99@8
|
195
|
joachim99@69
|
196 // Three corresponding ranges. (Minimum size of a valid range is one line.)
|
joachim99@69
|
197 class ManualDiffHelpEntry
|
joachim99@69
|
198 {
|
joachim99@69
|
199 public:
|
joachim99@69
|
200 ManualDiffHelpEntry() { lineA1=-1; lineA2=-1;
|
joachim99@69
|
201 lineB1=-1; lineB2=-1;
|
joachim99@69
|
202 lineC1=-1; lineC2=-1; }
|
joachim99@69
|
203 int lineA1;
|
joachim99@69
|
204 int lineA2;
|
joachim99@69
|
205 int lineB1;
|
joachim99@69
|
206 int lineB2;
|
joachim99@69
|
207 int lineC1;
|
joachim99@69
|
208 int lineC2;
|
joachim99@69
|
209 int& firstLine( int winIdx )
|
joachim99@69
|
210 {
|
joachim99@69
|
211 return winIdx==1 ? lineA1 : (winIdx==2 ? lineB1 : lineC1 );
|
joachim99@69
|
212 }
|
joachim99@69
|
213 int& lastLine( int winIdx )
|
joachim99@69
|
214 {
|
joachim99@69
|
215 return winIdx==1 ? lineA2 : (winIdx==2 ? lineB2 : lineC2 );
|
joachim99@69
|
216 }
|
joachim99@69
|
217 bool isLineInRange( int line, int winIdx )
|
joachim99@69
|
218 {
|
joachim99@69
|
219 return line>=0 && line>=firstLine(winIdx) && line<=lastLine(winIdx);
|
joachim99@69
|
220 }
|
joachim99@69
|
221 bool operator==(const ManualDiffHelpEntry& r) const
|
joachim99@69
|
222 {
|
joachim99@69
|
223 return lineA1 == r.lineA1 && lineB1 == r.lineB1 && lineC1 == r.lineC1 &&
|
joachim99@69
|
224 lineA2 == r.lineA2 && lineB2 == r.lineB2 && lineC2 == r.lineC2;
|
joachim99@69
|
225 }
|
joachim99@69
|
226 };
|
joachim99@69
|
227
|
joachim99@69
|
228 // A list of corresponding ranges
|
joachim99@69
|
229 typedef std::list<ManualDiffHelpEntry> ManualDiffHelpList;
|
joachim99@69
|
230
|
joachim99@51
|
231 void calcDiff3LineListUsingAB(
|
joachim99@8
|
232 const DiffList* pDiffListAB,
|
joachim99@8
|
233 Diff3LineList& d3ll
|
joachim99@8
|
234 );
|
joachim99@8
|
235
|
joachim99@8
|
236 void calcDiff3LineListUsingAC(
|
joachim99@8
|
237 const DiffList* pDiffListBC,
|
joachim99@8
|
238 Diff3LineList& d3ll
|
joachim99@8
|
239 );
|
joachim99@8
|
240
|
joachim99@68
|
241 void calcDiff3LineListUsingBC(
|
joachim99@8
|
242 const DiffList* pDiffListBC,
|
joachim99@8
|
243 Diff3LineList& d3ll
|
joachim99@8
|
244 );
|
joachim99@8
|
245
|
joachim99@69
|
246 void correctManualDiffAlignment( Diff3LineList& d3ll, ManualDiffHelpList* pManualDiffHelpList );
|
joachim99@8
|
247
|
joachim99@8
|
248 class SourceData
|
joachim99@8
|
249 {
|
joachim99@8
|
250 public:
|
joachim99@58
|
251 SourceData();
|
joachim99@58
|
252 ~SourceData();
|
joachim99@68
|
253
|
joachim99@58
|
254 void setOptionDialog( OptionDialog* pOptionDialog );
|
joachim99@68
|
255
|
joachim99@58
|
256 int getSizeLines() const;
|
joachim99@58
|
257 int getSizeBytes() const;
|
joachim99@58
|
258 const char* getBuf() const;
|
joachim99@58
|
259 const LineData* getLineDataForDisplay() const;
|
joachim99@58
|
260 const LineData* getLineDataForDiff() const;
|
joachim99@58
|
261
|
joachim99@8
|
262 void setFilename(const QString& filename);
|
joachim99@8
|
263 void setFileAccess( const FileAccess& fa );
|
joachim99@8
|
264 FileAccess& getFileAccess();
|
joachim99@8
|
265 QString getFilename();
|
joachim99@8
|
266 void setAliasName(const QString& a);
|
joachim99@8
|
267 QString getAliasName();
|
joachim99@58
|
268 bool isEmpty(); // File was set
|
joachim99@58
|
269 bool hasData(); // Data was readable
|
joachim99@58
|
270 bool isText(); // is it pure text (vs. binary data)
|
joachim99@58
|
271 bool isFromBuffer(); // was it set via setData() (vs. setFileAccess() or setFilename())
|
joachim99@58
|
272 void setData( const QString& data );
|
joachim99@66
|
273 bool isValid(); // Either no file is specified or reading was successful
|
joachim99@68
|
274
|
joachim99@68
|
275 void readAndPreprocess(QTextCodec* pEncoding);
|
joachim99@58
|
276 bool saveNormalDataAs( const QString& fileName );
|
joachim99@68
|
277
|
joachim99@58
|
278 bool isBinaryEqualWith( const SourceData& other ) const;
|
joachim99@68
|
279
|
joachim99@58
|
280 void reset();
|
joachim99@58
|
281
|
joachim99@68
|
282 private:
|
joachim99@8
|
283 QString m_aliasName;
|
joachim99@8
|
284 FileAccess m_fileAccess;
|
joachim99@58
|
285 OptionDialog* m_pOptionDialog;
|
joachim99@58
|
286 QString m_tempInputFileName;
|
joachim99@58
|
287
|
joachim99@58
|
288 struct FileData
|
joachim99@68
|
289 {
|
joachim99@69
|
290 FileData(){ m_pBuf=0; m_size=0; m_vSize=0; m_bIsText=false; }
|
joachim99@58
|
291 ~FileData(){ reset(); }
|
joachim99@58
|
292 const char* m_pBuf;
|
joachim99@58
|
293 int m_size;
|
joachim99@58
|
294 int m_vSize; // Nr of lines in m_pBuf1 and size of m_v1, m_dv12 and m_dv13
|
joachim99@68
|
295 QString m_unicodeBuf;
|
joachim99@58
|
296 std::vector<LineData> m_v;
|
joachim99@58
|
297 bool m_bIsText;
|
joachim99@58
|
298 bool readFile( const QString& filename );
|
joachim99@58
|
299 bool writeFile( const QString& filename );
|
joachim99@68
|
300 void preprocess(bool bPreserveCR, QTextCodec* pEncoding );
|
joachim99@58
|
301 void reset();
|
joachim99@58
|
302 void removeComments();
|
joachim99@58
|
303 void copyBufFrom( const FileData& src );
|
joachim99@58
|
304 };
|
joachim99@58
|
305 FileData m_normalData;
|
joachim99@68
|
306 FileData m_lmppData;
|
joachim99@68
|
307 QTextCodec* m_pEncoding;
|
joachim99@8
|
308 };
|
joachim99@8
|
309
|
joachim99@69
|
310 void calcDiff3LineListTrim( Diff3LineList& d3ll, const LineData* pldA, const LineData* pldB, const LineData* pldC, ManualDiffHelpList* pManualDiffHelpList );
|
joachim99@58
|
311 void calcWhiteDiff3Lines( Diff3LineList& d3ll, const LineData* pldA, const LineData* pldB, const LineData* pldC );
|
joachim99@8
|
312
|
joachim99@66
|
313 void calcDiff3LineVector( Diff3LineList& d3ll, Diff3LineVector& d3lv );
|
joachim99@8
|
314
|
joachim99@8
|
315 void debugLineCheck( Diff3LineList& d3ll, int size, int idx );
|
joachim99@8
|
316
|
joachim99@8
|
317 class QStatusBar;
|
joachim99@8
|
318
|
joachim99@8
|
319
|
joachim99@8
|
320 class Selection
|
joachim99@8
|
321 {
|
joachim99@8
|
322 public:
|
joachim99@8
|
323 Selection(){ reset(); oldLastLine=-1; lastLine=-1; oldFirstLine=-1; }
|
joachim99@8
|
324 int firstLine;
|
joachim99@8
|
325 int firstPos;
|
joachim99@8
|
326 int lastLine;
|
joachim99@8
|
327 int lastPos;
|
joachim99@8
|
328 int oldLastLine;
|
joachim99@8
|
329 int oldFirstLine;
|
joachim99@8
|
330 bool bSelectionContainsData;
|
joachim99@8
|
331 bool isEmpty() { return firstLine==-1 || (firstLine==lastLine && firstPos==lastPos) || bSelectionContainsData==false;}
|
joachim99@8
|
332 void reset(){
|
joachim99@8
|
333 oldFirstLine=firstLine;
|
joachim99@8
|
334 oldLastLine =lastLine;
|
joachim99@8
|
335 firstLine=-1;
|
joachim99@69
|
336 lastLine=-1;
|
joachim99@8
|
337 bSelectionContainsData = false;
|
joachim99@8
|
338 }
|
joachim99@8
|
339 void start( int l, int p ) { firstLine = l; firstPos = p; }
|
joachim99@8
|
340 void end( int l, int p ) {
|
joachim99@8
|
341 if ( oldLastLine == -1 )
|
joachim99@8
|
342 oldLastLine = lastLine;
|
joachim99@8
|
343 lastLine = l;
|
joachim99@8
|
344 lastPos = p;
|
joachim99@8
|
345 }
|
joachim99@8
|
346 bool within( int l, int p );
|
joachim99@8
|
347
|
joachim99@8
|
348 bool lineWithin( int l );
|
joachim99@8
|
349 int firstPosInLine(int l);
|
joachim99@8
|
350 int lastPosInLine(int l);
|
joachim99@69
|
351 int beginLine(){
|
joachim99@69
|
352 if (firstLine<0 && lastLine<0) return -1;
|
joachim99@69
|
353 return max2(0,min2(firstLine,lastLine));
|
joachim99@69
|
354 }
|
joachim99@69
|
355 int endLine(){
|
joachim99@69
|
356 if (firstLine<0 && lastLine<0) return -1;
|
joachim99@69
|
357 return max2(firstLine,lastLine);
|
joachim99@69
|
358 }
|
joachim99@8
|
359 int beginPos() { return firstLine==lastLine ? min2(firstPos,lastPos) :
|
joachim99@69
|
360 firstLine<lastLine ? (firstLine<0?0:firstPos) : (lastLine<0?0:lastPos); }
|
joachim99@8
|
361 int endPos() { return firstLine==lastLine ? max2(firstPos,lastPos) :
|
joachim99@8
|
362 firstLine<lastLine ? lastPos : firstPos; }
|
joachim99@8
|
363 };
|
joachim99@8
|
364
|
joachim99@8
|
365 class OptionDialog;
|
joachim99@8
|
366
|
joachim99@70
|
367 Q3CString encodeString( const QString& s );
|
joachim99@68
|
368
|
joachim99@68
|
369
|
joachim99@68
|
370 // Helper class that swaps left and right for some commands.
|
joachim99@68
|
371 class MyPainter : public QPainter
|
joachim99@68
|
372 {
|
joachim99@68
|
373 int m_factor;
|
joachim99@68
|
374 int m_xOffset;
|
joachim99@68
|
375 int m_fontWidth;
|
joachim99@68
|
376 public:
|
joachim99@70
|
377 MyPainter(QPaintDevice* pd, bool bRTL, int width, int fontWidth)
|
joachim99@69
|
378 : QPainter(pd)
|
joachim99@68
|
379 {
|
joachim99@68
|
380 if (bRTL)
|
joachim99@68
|
381 {
|
joachim99@68
|
382 m_fontWidth = fontWidth;
|
joachim99@68
|
383 m_factor = -1;
|
joachim99@68
|
384 m_xOffset = width-1;
|
joachim99@68
|
385 }
|
joachim99@68
|
386 else
|
joachim99@68
|
387 {
|
joachim99@68
|
388 m_fontWidth = 0;
|
joachim99@68
|
389 m_factor = 1;
|
joachim99@68
|
390 m_xOffset = 0;
|
joachim99@68
|
391 }
|
joachim99@68
|
392 }
|
joachim99@68
|
393
|
joachim99@68
|
394 void fillRect( int x, int y, int w, int h, const QBrush& b )
|
joachim99@68
|
395 {
|
joachim99@69
|
396 if (m_factor==1)
|
joachim99@69
|
397 QPainter::fillRect( m_xOffset + x , y, w, h, b );
|
joachim99@69
|
398 else
|
joachim99@69
|
399 QPainter::fillRect( m_xOffset - x - w, y, w, h, b );
|
joachim99@68
|
400 }
|
joachim99@68
|
401
|
joachim99@68
|
402 void drawText( int x, int y, const QString& s, bool bAdapt=false )
|
joachim99@68
|
403 {
|
joachim99@70
|
404 Qt::LayoutDirection ld = (m_factor==1 || bAdapt == false) ? Qt::LeftToRight : Qt::RightToLeft;
|
joachim99@70
|
405 QPainter::setLayoutDirection( ld );
|
joachim99@70
|
406 QPainter::drawText( m_xOffset-m_fontWidth*s.length() + m_factor*x, y, s, -1 );
|
joachim99@68
|
407 }
|
joachim99@68
|
408
|
joachim99@68
|
409 void drawLine( int x1, int y1, int x2, int y2 )
|
joachim99@68
|
410 {
|
joachim99@68
|
411 QPainter::drawLine( m_xOffset + m_factor*x1, y1, m_xOffset + m_factor*x2, y2 );
|
joachim99@68
|
412 }
|
joachim99@68
|
413 };
|
joachim99@51
|
414
|
joachim99@8
|
415 void fineDiff(
|
joachim99@8
|
416 Diff3LineList& diff3LineList,
|
joachim99@8
|
417 int selector,
|
joachim99@58
|
418 const LineData* v1,
|
joachim99@58
|
419 const LineData* v2,
|
joachim99@8
|
420 bool& bTextsTotalEqual
|
joachim99@8
|
421 );
|
joachim99@8
|
422
|
joachim99@8
|
423
|
joachim99@8
|
424 bool equal( const LineData& l1, const LineData& l2, bool bStrict );
|
joachim99@8
|
425
|
joachim99@8
|
426
|
joachim99@8
|
427
|
joachim99@8
|
428
|
joachim99@68
|
429 inline bool isWhite( QChar c )
|
joachim99@8
|
430 {
|
joachim99@8
|
431 return c==' ' || c=='\t' || c=='\r';
|
joachim99@8
|
432 }
|
joachim99@8
|
433
|
joachim99@8
|
434 /** Returns the number of equivalent spaces at position outPos.
|
joachim99@8
|
435 */
|
joachim99@8
|
436 inline int tabber( int outPos, int tabSize )
|
joachim99@8
|
437 {
|
joachim99@8
|
438 return tabSize - ( outPos % tabSize );
|
joachim99@8
|
439 }
|
joachim99@8
|
440
|
joachim99@8
|
441 /** Returns a line number where the linerange [line, line+nofLines] can
|
joachim99@8
|
442 be displayed best. If it fits into the currently visible range then
|
joachim99@8
|
443 the returned value is the current firstLine.
|
joachim99@8
|
444 */
|
joachim99@8
|
445 int getBestFirstLine( int line, int nofLines, int firstLine, int visibleLines );
|
joachim99@8
|
446
|
joachim99@8
|
447 extern bool g_bIgnoreWhiteSpace;
|
joachim99@8
|
448 extern bool g_bIgnoreTrivialMatches;
|
joachim99@8
|
449 extern int g_bAutoSolve;
|
joachim99@8
|
450
|
joachim99@8
|
451 // Cursor conversions that consider g_tabSize.
|
joachim99@69
|
452 int convertToPosInText( const QString& s, int posOnScreen, int tabSize );
|
joachim99@69
|
453 int convertToPosOnScreen( const QString& s, int posInText, int tabSize );
|
joachim99@69
|
454
|
joachim99@69
|
455 enum e_CoordType { eFileCoords, eD3LLineCoords, eWrapCoords };
|
joachim99@69
|
456
|
joachim99@69
|
457 void calcTokenPos( const QString&, int posOnScreen, int& pos1, int& pos2, int tabSize );
|
joachim99@69
|
458
|
joachim99@69
|
459 QString calcHistorySortKey( const QString& keyOrder, QRegExp& matchedRegExpr, const QStringList& parenthesesGroupList );
|
joachim99@69
|
460 bool findParenthesesGroups( const QString& s, QStringList& sl );
|
joachim99@8
|
461 #endif
|
joachim99@8
|
462
|