annotate kdiff3/src/difftextwindow.cpp @ 73:f7dad0aa6146

KDiff3-0.9.90-Qt4
author joachim99
date Sun, 14 May 2006 20:09:06 +0000
parents 5bbfe4784324
children
rev   line source
joachim99@8 1 /***************************************************************************
joachim99@8 2 difftextwindow.cpp - description
joachim99@8 3 -------------------
joachim99@8 4 begin : Mon Apr 8 2002
joachim99@69 5 copyright : (C) 2002-2006 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@69 18 #include "difftextwindow.h"
joachim99@8 19 #include "merger.h"
joachim99@8 20 #include <qpainter.h>
joachim99@70 21 //Added by qt3to4:
joachim99@70 22 #include <QPaintEvent>
joachim99@70 23 #include <QResizeEvent>
joachim99@70 24 #include <QMouseEvent>
joachim99@70 25 #include <QFocusEvent>
joachim99@70 26 #include <Q3VBoxLayout>
joachim99@70 27 #include <QTimerEvent>
joachim99@70 28 #include <QEvent>
joachim99@70 29 #include <Q3CString>
joachim99@70 30 #include <QDropEvent>
joachim99@70 31 #include <QDragEnterEvent>
joachim99@70 32 #include <Q3HBoxLayout>
joachim99@8 33 #include <assert.h>
joachim99@8 34 #include <qpixmap.h>
joachim99@8 35 #include <qstatusbar.h>
joachim99@8 36 #include <qapplication.h>
joachim99@8 37 #include <qtooltip.h>
joachim99@8 38 #include <qfont.h>
joachim99@66 39 #include <qstringlist.h>
joachim99@69 40 #include <qlineedit.h>
joachim99@69 41 #include <qlabel.h>
joachim99@69 42 #include <qpushbutton.h>
joachim99@69 43 #include <qlayout.h>
joachim99@69 44 #include <qtextcodec.h>
joachim99@8 45 #include <optiondialog.h>
joachim99@8 46 #include <math.h>
joachim99@70 47 #include <q3dragobject.h>
joachim99@51 48 #include <klocale.h>
joachim99@69 49 #include <kfiledialog.h>
joachim99@8 50
joachim99@69 51 class DiffTextWindowData
joachim99@69 52 {
joachim99@69 53 public:
joachim99@69 54 DiffTextWindowData( DiffTextWindow* p )
joachim99@69 55 {
joachim99@69 56 m_pDiffTextWindow = p;
joachim99@69 57 m_bPaintingAllowed = false;
joachim99@69 58 m_pLineData = 0;
joachim99@69 59 m_size = 0;
joachim99@69 60 m_bWordWrap = false;
joachim99@69 61 m_delayedDrawTimer = 0;
joachim99@69 62 m_pDiff3LineVector = 0;
joachim99@69 63 m_pManualDiffHelpList = 0;
joachim99@69 64 m_pOptionDialog = 0;
joachim99@69 65 m_fastSelectorLine1 = 0;
joachim99@69 66 m_fastSelectorNofLines = 0;
joachim99@69 67 m_bTriple = 0;
joachim99@69 68 m_winIdx = 0;
joachim99@69 69 m_firstLine = 0;
joachim99@69 70 m_oldFirstLine = 0;
joachim99@69 71 m_oldFirstColumn = 0;
joachim99@69 72 m_firstColumn = 0;
joachim99@69 73 m_lineNumberWidth = 0;
joachim99@69 74 m_pStatusBar = 0;
joachim99@69 75 m_scrollDeltaX = 0;
joachim99@69 76 m_scrollDeltaY = 0;
joachim99@69 77 m_bMyUpdate = false;
joachim99@69 78 m_bSelectionInProgress = false;
joachim99@69 79 }
joachim99@69 80 DiffTextWindow* m_pDiffTextWindow;
joachim99@69 81 DiffTextWindowFrame* m_pDiffTextWindowFrame;
joachim99@8 82
joachim99@69 83 bool m_bPaintingAllowed;
joachim99@69 84 const LineData* m_pLineData;
joachim99@69 85 int m_size;
joachim99@69 86 QString m_filename;
joachim99@69 87 bool m_bWordWrap;
joachim99@69 88 int m_delayedDrawTimer;
joachim99@69 89
joachim99@69 90 const Diff3LineVector* m_pDiff3LineVector;
joachim99@69 91 Diff3WrapLineVector m_diff3WrapLineVector;
joachim99@69 92 const ManualDiffHelpList* m_pManualDiffHelpList;
joachim99@69 93
joachim99@69 94 OptionDialog* m_pOptionDialog;
joachim99@69 95 QColor m_cThis;
joachim99@69 96 QColor m_cDiff1;
joachim99@69 97 QColor m_cDiff2;
joachim99@69 98 QColor m_cDiffBoth;
joachim99@69 99
joachim99@69 100 int m_fastSelectorLine1;
joachim99@69 101 int m_fastSelectorNofLines;
joachim99@69 102
joachim99@69 103 bool m_bTriple;
joachim99@69 104 int m_winIdx;
joachim99@69 105 int m_firstLine;
joachim99@69 106 int m_oldFirstLine;
joachim99@69 107 int m_oldFirstColumn;
joachim99@69 108 int m_firstColumn;
joachim99@69 109 int m_lineNumberWidth;
joachim99@69 110
joachim99@69 111 void getLineInfo(
joachim99@69 112 const Diff3Line& d,
joachim99@69 113 int& lineIdx,
joachim99@69 114 DiffList*& pFineDiff1, DiffList*& pFineDiff2, // return values
joachim99@69 115 int& changed, int& changed2 );
joachim99@69 116
joachim99@69 117 QString getString( int d3lIdx );
joachim99@69 118 QString getLineString( int line );
joachim99@69 119
joachim99@69 120 void writeLine(
joachim99@69 121 MyPainter& p, const LineData* pld,
joachim99@69 122 const DiffList* pLineDiff1, const DiffList* pLineDiff2, int line,
joachim99@69 123 int whatChanged, int whatChanged2, int srcLineIdx,
joachim99@69 124 int wrapLineOffset, int wrapLineLength, bool bWrapLine, const QRect& invalidRect, int deviceWidth
joachim99@69 125 );
joachim99@69 126
joachim99@69 127 void draw( MyPainter& p, const QRect& invalidRect, int deviceWidth, int beginLine, int endLine );
joachim99@69 128
joachim99@69 129 QStatusBar* m_pStatusBar;
joachim99@69 130
joachim99@69 131 Selection m_selection;
joachim99@69 132
joachim99@69 133 int m_scrollDeltaX;
joachim99@69 134 int m_scrollDeltaY;
joachim99@69 135
joachim99@69 136 bool m_bMyUpdate;
joachim99@69 137 void myUpdate(int afterMilliSecs );
joachim99@69 138
joachim99@69 139 int leftInfoWidth() { return 4+m_lineNumberWidth; } // Nr of information columns on left side
joachim99@69 140 int convertLineOnScreenToLineInSource( int lineOnScreen, e_CoordType coordType, bool bFirstLine );
joachim99@69 141
joachim99@69 142 bool m_bSelectionInProgress;
joachim99@69 143 QPoint m_lastKnownMousePos;
joachim99@69 144 };
joachim99@8 145
joachim99@8 146 DiffTextWindow::DiffTextWindow(
joachim99@69 147 DiffTextWindowFrame* pParent,
joachim99@8 148 QStatusBar* pStatusBar,
joachim99@69 149 OptionDialog* pOptionDialog,
joachim99@69 150 int winIdx
joachim99@8 151 )
joachim99@73 152 : QWidget(pParent, 0, Qt::WNoAutoErase )
joachim99@8 153 {
joachim99@69 154 d = new DiffTextWindowData(this);
joachim99@69 155 d->m_pDiffTextWindowFrame = pParent;
joachim99@70 156 setFocusPolicy( Qt::ClickFocus );
joachim99@8 157 setAcceptDrops( true );
joachim99@8 158
joachim99@69 159 d->m_pOptionDialog = pOptionDialog;
joachim99@8 160 init( 0, 0, 0, 0, 0, false );
joachim99@8 161
joachim99@8 162 setMinimumSize(QSize(20,20));
joachim99@8 163
joachim99@69 164 d->m_pStatusBar = pStatusBar;
joachim99@69 165 d->m_bPaintingAllowed = true;
joachim99@69 166 d->m_bWordWrap = false;
joachim99@69 167 d->m_winIdx = winIdx;
joachim99@27 168
joachim99@69 169 setFont(d->m_pOptionDialog->m_font);
joachim99@70 170 setAutoFillBackground( true );
joachim99@8 171 }
joachim99@8 172
joachim99@69 173 DiffTextWindow::~DiffTextWindow()
joachim99@69 174 {
joachim99@69 175 delete d;
joachim99@69 176 }
joachim99@8 177
joachim99@8 178 void DiffTextWindow::init(
joachim99@8 179 const QString& filename,
joachim99@58 180 const LineData* pLineData,
joachim99@8 181 int size,
joachim99@8 182 const Diff3LineVector* pDiff3LineVector,
joachim99@69 183 const ManualDiffHelpList* pManualDiffHelpList,
joachim99@8 184 bool bTriple
joachim99@8 185 )
joachim99@8 186 {
joachim99@69 187 d->m_filename = filename;
joachim99@69 188 d->m_pLineData = pLineData;
joachim99@69 189 d->m_size = size;
joachim99@69 190 d->m_pDiff3LineVector = pDiff3LineVector;
joachim99@69 191 d->m_diff3WrapLineVector.clear();
joachim99@69 192 d->m_pManualDiffHelpList = pManualDiffHelpList;
joachim99@8 193
joachim99@69 194 d->m_firstLine = 0;
joachim99@69 195 d->m_oldFirstLine = -1;
joachim99@69 196 d->m_firstColumn = 0;
joachim99@69 197 d->m_oldFirstColumn = -1;
joachim99@69 198 d->m_bTriple = bTriple;
joachim99@69 199 d->m_scrollDeltaX=0;
joachim99@69 200 d->m_scrollDeltaY=0;
joachim99@69 201 d->m_bMyUpdate = false;
joachim99@69 202 d->m_fastSelectorLine1 = 0;
joachim99@69 203 d->m_fastSelectorNofLines = 0;
joachim99@69 204 d->m_lineNumberWidth = 0;
joachim99@69 205 d->m_selection.reset();
joachim99@69 206 d->m_selection.oldFirstLine = -1; // reset is not enough here.
joachim99@69 207 d->m_selection.oldLastLine = -1;
joachim99@69 208 d->m_selection.lastLine = -1;
joachim99@8 209
joachim99@8 210 update();
joachim99@69 211 d->m_pDiffTextWindowFrame->init();
joachim99@69 212 }
joachim99@69 213
joachim99@69 214 void DiffTextWindow::reset()
joachim99@69 215 {
joachim99@69 216 d->m_pLineData=0;
joachim99@69 217 d->m_size=0;
joachim99@69 218 d->m_pDiff3LineVector=0;
joachim99@69 219 d->m_filename="";
joachim99@69 220 d->m_diff3WrapLineVector.clear();
joachim99@8 221 }
joachim99@8 222
joachim99@8 223 void DiffTextWindow::setPaintingAllowed( bool bAllowPainting )
joachim99@8 224 {
joachim99@69 225 if (d->m_bPaintingAllowed != bAllowPainting)
joachim99@8 226 {
joachim99@69 227 d->m_bPaintingAllowed = bAllowPainting;
joachim99@69 228 if ( d->m_bPaintingAllowed ) update();
joachim99@69 229 else reset();
joachim99@8 230 }
joachim99@8 231 }
joachim99@8 232
joachim99@8 233 void DiffTextWindow::dragEnterEvent( QDragEnterEvent* e )
joachim99@8 234 {
joachim99@70 235 e->accept( Q3UriDrag::canDecode(e) || Q3TextDrag::canDecode(e) );
joachim99@8 236 // Note that the corresponding drop is handled in KDiff3App::eventFilter().
joachim99@8 237 }
joachim99@8 238
joachim99@69 239
joachim99@8 240 void DiffTextWindow::setFirstLine(int firstLine)
joachim99@8 241 {
joachim99@66 242 int fontHeight = fontMetrics().height();
joachim99@69 243
joachim99@66 244 int newFirstLine = max2(0,firstLine);
joachim99@66 245
joachim99@69 246 int deltaY = fontHeight * ( d->m_firstLine - newFirstLine );
joachim99@69 247
joachim99@69 248 d->m_firstLine = newFirstLine;
joachim99@69 249
joachim99@69 250 if ( d->m_bSelectionInProgress && d->m_selection.firstLine != -1 )
joachim99@66 251 {
joachim99@69 252 int line, pos;
joachim99@69 253 convertToLinePos( d->m_lastKnownMousePos.x(), d->m_lastKnownMousePos.y(), line, pos );
joachim99@69 254 d->m_selection.end( line, pos );
joachim99@69 255 update();
joachim99@66 256 }
joachim99@66 257 else
joachim99@66 258 {
joachim99@69 259 QWidget::scroll( 0, deltaY );
joachim99@66 260 }
joachim99@69 261 d->m_pDiffTextWindowFrame->setFirstLine( d->m_firstLine );
joachim99@69 262 }
joachim99@69 263
joachim99@69 264 int DiffTextWindow::getFirstLine()
joachim99@69 265 {
joachim99@69 266 return d->m_firstLine;
joachim99@8 267 }
joachim99@8 268
joachim99@8 269 void DiffTextWindow::setFirstColumn(int firstCol)
joachim99@8 270 {
joachim99@66 271 int fontWidth = fontMetrics().width('W');
joachim99@69 272 int xOffset = d->leftInfoWidth() * fontWidth;
joachim99@69 273
joachim99@66 274 int newFirstColumn = max2(0,firstCol);
joachim99@66 275
joachim99@69 276 int deltaX = fontWidth * ( d->m_firstColumn - newFirstColumn );
joachim99@66 277
joachim99@69 278 d->m_firstColumn = newFirstColumn;
joachim99@68 279
joachim99@69 280 QRect r( xOffset, 0, width()-xOffset, height() );
joachim99@69 281
joachim99@69 282 if ( d->m_pOptionDialog->m_bRightToLeftLanguage )
joachim99@68 283 {
joachim99@68 284 deltaX = -deltaX;
joachim99@69 285 r = QRect( width()-1-xOffset, 0, -(width()-xOffset), height() ).normalize();
joachim99@68 286 }
joachim99@68 287
joachim99@69 288 if ( d->m_bSelectionInProgress && d->m_selection.firstLine != -1 )
joachim99@69 289 {
joachim99@69 290 int line, pos;
joachim99@69 291 convertToLinePos( d->m_lastKnownMousePos.x(), d->m_lastKnownMousePos.y(), line, pos );
joachim99@69 292 d->m_selection.end( line, pos );
joachim99@69 293 update();
joachim99@69 294 }
joachim99@69 295 else
joachim99@69 296 {
joachim99@69 297 QWidget::scroll( deltaX, 0, r );
joachim99@69 298 }
joachim99@8 299 }
joachim99@8 300
joachim99@8 301 int DiffTextWindow::getNofColumns()
joachim99@8 302 {
joachim99@69 303 if (d->m_bWordWrap)
joachim99@8 304 {
joachim99@66 305 return getNofVisibleColumns();
joachim99@8 306 }
joachim99@66 307 else
joachim99@66 308 {
joachim99@66 309 int nofColumns = 0;
joachim99@69 310 for( int i = 0; i< d->m_size; ++i )
joachim99@66 311 {
joachim99@69 312 if ( d->m_pLineData[i].width( d->m_pOptionDialog->m_tabSize ) > nofColumns )
joachim99@69 313 nofColumns = d->m_pLineData[i].width( d->m_pOptionDialog->m_tabSize );
joachim99@66 314 }
joachim99@66 315 return nofColumns;
joachim99@66 316 }
joachim99@8 317 }
joachim99@8 318
joachim99@8 319 int DiffTextWindow::getNofLines()
joachim99@8 320 {
joachim99@69 321 return d->m_bWordWrap ? d->m_diff3WrapLineVector.size() :
joachim99@69 322 d->m_pDiff3LineVector->size();
joachim99@66 323 }
joachim99@66 324
joachim99@66 325
joachim99@66 326 int DiffTextWindow::convertLineToDiff3LineIdx( int line )
joachim99@66 327 {
joachim99@69 328 if ( d->m_bWordWrap && d->m_diff3WrapLineVector.size()>0 )
joachim99@69 329 return d->m_diff3WrapLineVector[ min2( line, (int)d->m_diff3WrapLineVector.size()-1 ) ].diff3LineIndex;
joachim99@66 330 else
joachim99@66 331 return line;
joachim99@66 332 }
joachim99@66 333
joachim99@66 334 int DiffTextWindow::convertDiff3LineIdxToLine( int d3lIdx )
joachim99@66 335 {
joachim99@69 336 if ( d->m_bWordWrap && d->m_pDiff3LineVector!=0 && d->m_pDiff3LineVector->size()>0 )
joachim99@69 337 return (*d->m_pDiff3LineVector)[ min2( d3lIdx, (int)d->m_pDiff3LineVector->size()-1 ) ]->sumLinesNeededForDisplay;
joachim99@66 338 else
joachim99@66 339 return d3lIdx;
joachim99@8 340 }
joachim99@8 341
joachim99@8 342 /** Returns a line number where the linerange [line, line+nofLines] can
joachim99@8 343 be displayed best. If it fits into the currently visible range then
joachim99@8 344 the returned value is the current firstLine.
joachim99@8 345 */
joachim99@8 346 int getBestFirstLine( int line, int nofLines, int firstLine, int visibleLines )
joachim99@8 347 {
joachim99@8 348 int newFirstLine = firstLine;
joachim99@8 349 if ( line < firstLine || line + nofLines + 2 > firstLine + visibleLines )
joachim99@8 350 {
joachim99@8 351 if ( nofLines > visibleLines || nofLines <= ( 2*visibleLines / 3 - 1) )
joachim99@8 352 newFirstLine = line - visibleLines/3;
joachim99@8 353 else
joachim99@8 354 newFirstLine = line - (visibleLines - nofLines);
joachim99@8 355 }
joachim99@8 356
joachim99@8 357 return newFirstLine;
joachim99@8 358 }
joachim99@8 359
joachim99@8 360
joachim99@8 361 void DiffTextWindow::setFastSelectorRange( int line1, int nofLines )
joachim99@69 362 {
joachim99@69 363 d->m_fastSelectorLine1 = line1;
joachim99@69 364 d->m_fastSelectorNofLines = nofLines;
joachim99@8 365 if ( isVisible() )
joachim99@8 366 {
joachim99@66 367 int newFirstLine = getBestFirstLine(
joachim99@69 368 convertDiff3LineIdxToLine(d->m_fastSelectorLine1),
joachim99@69 369 convertDiff3LineIdxToLine(d->m_fastSelectorLine1+d->m_fastSelectorNofLines)-convertDiff3LineIdxToLine(d->m_fastSelectorLine1),
joachim99@69 370 d->m_firstLine,
joachim99@66 371 getNofVisibleLines()
joachim99@66 372 );
joachim99@69 373 if ( newFirstLine != d->m_firstLine )
joachim99@8 374 {
joachim99@69 375 scroll( 0, newFirstLine - d->m_firstLine );
joachim99@8 376 }
joachim99@8 377
joachim99@8 378 update();
joachim99@8 379 }
joachim99@8 380 }
joachim99@8 381
joachim99@8 382
joachim99@66 383 void DiffTextWindow::showStatusLine(int line )
joachim99@8 384 {
joachim99@66 385 int d3lIdx = convertLineToDiff3LineIdx( line );
joachim99@69 386 if(d3lIdx >= 0 && d3lIdx<(int)d->m_pDiff3LineVector->size() )
joachim99@8 387 {
joachim99@69 388 const Diff3Line* pD3l = (*d->m_pDiff3LineVector)[d3lIdx];
joachim99@69 389 if ( pD3l != 0 )
joachim99@69 390 {
joachim99@69 391 int l = pD3l->getLineInFile( d->m_winIdx );
joachim99@8 392
joachim99@69 393 QString s;
joachim99@69 394 if ( l!=-1 )
joachim99@69 395 s.sprintf("File %s: Line %d", d->m_filename.ascii(), l+1 );
joachim99@69 396 else
joachim99@69 397 s.sprintf("File %s: Line not available", d->m_filename.ascii() );
joachim99@69 398 if (d->m_pStatusBar!=0) d->m_pStatusBar->message(s);
joachim99@69 399
joachim99@69 400 emit lineClicked( d->m_winIdx, l );
joachim99@69 401 }
joachim99@8 402 }
joachim99@8 403 }
joachim99@8 404
joachim99@66 405 void DiffTextWindow::focusInEvent(QFocusEvent* e)
joachim99@66 406 {
joachim99@66 407 emit gotFocus();
joachim99@66 408 QWidget::focusInEvent(e);
joachim99@66 409 }
joachim99@8 410
joachim99@8 411 void DiffTextWindow::mousePressEvent ( QMouseEvent* e )
joachim99@8 412 {
joachim99@69 413 if ( e->button() == Qt::LeftButton )
joachim99@8 414 {
joachim99@8 415 int line;
joachim99@8 416 int pos;
joachim99@8 417 convertToLinePos( e->x(), e->y(), line, pos );
joachim99@69 418 if ( pos < d->m_firstColumn )
joachim99@8 419 {
joachim99@66 420 emit setFastSelectorLine( convertLineToDiff3LineIdx(line) );
joachim99@69 421 d->m_selection.firstLine = -1; // Disable current d->m_selection
joachim99@8 422 }
joachim99@8 423 else
joachim99@8 424 { // Selection
joachim99@8 425 resetSelection();
joachim99@69 426 d->m_selection.start( line, pos );
joachim99@69 427 d->m_selection.end( line, pos );
joachim99@69 428 d->m_bSelectionInProgress = true;
joachim99@69 429 d->m_lastKnownMousePos = e->pos();
joachim99@8 430
joachim99@66 431 showStatusLine( line );
joachim99@8 432 }
joachim99@8 433 }
joachim99@8 434 }
joachim99@8 435
joachim99@68 436 bool isCTokenChar( QChar c )
joachim99@8 437 {
joachim99@8 438 return (c=='_') ||
joachim99@8 439 ( c>='A' && c<='Z' ) || ( c>='a' && c<='z' ) ||
joachim99@8 440 (c>='0' && c<='9');
joachim99@8 441 }
joachim99@8 442
joachim99@8 443 /// Calculate where a token starts and ends, given the x-position on screen.
joachim99@69 444 void calcTokenPos( const QString& s, int posOnScreen, int& pos1, int& pos2, int tabSize )
joachim99@8 445 {
joachim99@8 446 // Cursor conversions that consider g_tabSize
joachim99@69 447 int pos = convertToPosInText( s, max2( 0, posOnScreen ), tabSize );
joachim99@68 448 if ( pos>=(int)s.length() )
joachim99@8 449 {
joachim99@68 450 pos1=s.length();
joachim99@68 451 pos2=s.length();
joachim99@8 452 return;
joachim99@8 453 }
joachim99@8 454
joachim99@8 455 pos1 = pos;
joachim99@8 456 pos2 = pos+1;
joachim99@8 457
joachim99@68 458 if( isCTokenChar( s[pos1] ) )
joachim99@8 459 {
joachim99@68 460 while( pos1>=0 && isCTokenChar( s[pos1] ) )
joachim99@8 461 --pos1;
joachim99@8 462 ++pos1;
joachim99@8 463
joachim99@68 464 while( pos2<(int)s.length() && isCTokenChar( s[pos2] ) )
joachim99@8 465 ++pos2;
joachim99@8 466 }
joachim99@8 467 }
joachim99@8 468
joachim99@8 469 void DiffTextWindow::mouseDoubleClickEvent( QMouseEvent* e )
joachim99@8 470 {
joachim99@69 471 d->m_bSelectionInProgress = false;
joachim99@69 472 d->m_lastKnownMousePos = e->pos();
joachim99@69 473 if ( e->button() == Qt::LeftButton )
joachim99@8 474 {
joachim99@8 475 int line;
joachim99@8 476 int pos;
joachim99@8 477 convertToLinePos( e->x(), e->y(), line, pos );
joachim99@8 478
joachim99@8 479 // Get the string data of the current line
joachim99@68 480 QString s;
joachim99@69 481 if ( d->m_bWordWrap )
joachim99@66 482 {
joachim99@69 483 const Diff3WrapLine& d3wl = d->m_diff3WrapLineVector[line];
joachim99@69 484 s = d->getString( d3wl.diff3LineIndex ).mid( d3wl.wrapLineOffset, d3wl.wrapLineLength );
joachim99@66 485 }
joachim99@66 486 else
joachim99@66 487 {
joachim99@69 488 s = d->getString( line );
joachim99@66 489 }
joachim99@69 490
joachim99@8 491 if ( ! s.isEmpty() )
joachim99@8 492 {
joachim99@8 493 int pos1, pos2;
joachim99@69 494 calcTokenPos( s, pos, pos1, pos2, d->m_pOptionDialog->m_tabSize );
joachim99@8 495
joachim99@8 496 resetSelection();
joachim99@69 497 d->m_selection.start( line, convertToPosOnScreen( s, pos1, d->m_pOptionDialog->m_tabSize ) );
joachim99@69 498 d->m_selection.end( line, convertToPosOnScreen( s, pos2, d->m_pOptionDialog->m_tabSize ) );
joachim99@8 499 update();
joachim99@69 500 // emit d->m_selectionEnd() happens in the mouseReleaseEvent.
joachim99@66 501 showStatusLine( line );
joachim99@8 502 }
joachim99@8 503 }
joachim99@8 504 }
joachim99@8 505
joachim99@69 506 void DiffTextWindow::mouseReleaseEvent ( QMouseEvent* e )
joachim99@8 507 {
joachim99@69 508 d->m_bSelectionInProgress = false;
joachim99@69 509 d->m_lastKnownMousePos = e->pos();
joachim99@8 510 //if ( e->button() == LeftButton )
joachim99@8 511 {
joachim99@69 512 killTimer(d->m_delayedDrawTimer);
joachim99@69 513 d->m_delayedDrawTimer = 0;
joachim99@69 514 if (d->m_selection.firstLine != -1 )
joachim99@8 515 {
joachim99@8 516 emit selectionEnd();
joachim99@8 517 }
joachim99@8 518 }
joachim99@69 519 d->m_scrollDeltaX=0;
joachim99@69 520 d->m_scrollDeltaY=0;
joachim99@8 521 }
joachim99@8 522
joachim99@69 523 inline int sqr(int x){return x*x;}
joachim99@69 524
joachim99@8 525 void DiffTextWindow::mouseMoveEvent ( QMouseEvent * e )
joachim99@8 526 {
joachim99@8 527 int line;
joachim99@8 528 int pos;
joachim99@8 529 convertToLinePos( e->x(), e->y(), line, pos );
joachim99@69 530 d->m_lastKnownMousePos = e->pos();
joachim99@69 531
joachim99@69 532 if (d->m_selection.firstLine != -1 )
joachim99@8 533 {
joachim99@69 534 d->m_selection.end( line, pos );
joachim99@8 535
joachim99@66 536 showStatusLine( line );
joachim99@8 537
joachim99@8 538 // Scroll because mouse moved out of the window
joachim99@8 539 const QFontMetrics& fm = fontMetrics();
joachim99@8 540 int fontWidth = fm.width('W');
joachim99@8 541 int deltaX=0;
joachim99@8 542 int deltaY=0;
joachim99@69 543 if ( ! d->m_pOptionDialog->m_bRightToLeftLanguage )
joachim99@68 544 {
joachim99@69 545 if ( e->x() < d->leftInfoWidth()*fontWidth ) deltaX = -1 - abs(e->x()-d->leftInfoWidth()*fontWidth)/fontWidth;
joachim99@69 546 if ( e->x() > width() ) deltaX = +1 + abs(e->x()-width())/fontWidth;
joachim99@68 547 }
joachim99@68 548 else
joachim99@68 549 {
joachim99@69 550 if ( e->x() > width()-1-d->leftInfoWidth()*fontWidth ) deltaX=+1+ abs(e->x() - (width()-1-d->leftInfoWidth()*fontWidth)) / fontWidth;
joachim99@69 551 if ( e->x() < fontWidth ) deltaX=-1- abs(e->x()-fontWidth)/fontWidth;
joachim99@68 552 }
joachim99@69 553 if ( e->y() < 0 ) deltaY = -1 - sqr( e->y() ) / sqr(fm.height());
joachim99@69 554 if ( e->y() > height() ) deltaY = +1 + sqr( e->y() - height() ) / sqr(fm.height());
joachim99@69 555 if ( deltaX != 0 && d->m_scrollDeltaX!=deltaX || deltaY!= 0 && d->m_scrollDeltaY!=deltaY )
joachim99@8 556 {
joachim99@69 557 d->m_scrollDeltaX = deltaX;
joachim99@69 558 d->m_scrollDeltaY = deltaY;
joachim99@8 559 emit scroll( deltaX, deltaY );
joachim99@69 560 killTimer( d->m_delayedDrawTimer );
joachim99@69 561 d->m_delayedDrawTimer = startTimer(50);
joachim99@66 562 }
joachim99@66 563 else
joachim99@66 564 {
joachim99@69 565 d->m_scrollDeltaX = deltaX;
joachim99@69 566 d->m_scrollDeltaY = deltaY;
joachim99@69 567 d->myUpdate(0);
joachim99@8 568 }
joachim99@8 569 }
joachim99@8 570 }
joachim99@8 571
joachim99@8 572
joachim99@69 573 void DiffTextWindowData::myUpdate(int afterMilliSecs)
joachim99@8 574 {
joachim99@69 575 m_pDiffTextWindow->killTimer( m_delayedDrawTimer );
joachim99@8 576 m_bMyUpdate = true;
joachim99@69 577 m_delayedDrawTimer = m_pDiffTextWindow->startTimer( afterMilliSecs );
joachim99@8 578 }
joachim99@8 579
joachim99@8 580 void DiffTextWindow::timerEvent(QTimerEvent*)
joachim99@8 581 {
joachim99@69 582 killTimer(d->m_delayedDrawTimer);
joachim99@69 583 d->m_delayedDrawTimer = 0;
joachim99@8 584
joachim99@69 585 if ( d->m_bMyUpdate )
joachim99@8 586 {
joachim99@69 587 int fontHeight = fontMetrics().height();
joachim99@69 588
joachim99@69 589 if ( d->m_selection.oldLastLine != -1 )
joachim99@69 590 {
joachim99@69 591 int lastLine;
joachim99@69 592 int firstLine;
joachim99@69 593 if ( d->m_selection.oldFirstLine != -1 )
joachim99@69 594 {
joachim99@69 595 firstLine = min3( d->m_selection.oldFirstLine, d->m_selection.lastLine, d->m_selection.oldLastLine );
joachim99@69 596 lastLine = max3( d->m_selection.oldFirstLine, d->m_selection.lastLine, d->m_selection.oldLastLine );
joachim99@69 597 }
joachim99@69 598 else
joachim99@69 599 {
joachim99@69 600 firstLine = min2( d->m_selection.lastLine, d->m_selection.oldLastLine );
joachim99@69 601 lastLine = max2( d->m_selection.lastLine, d->m_selection.oldLastLine );
joachim99@69 602 }
joachim99@69 603 int y1 = ( firstLine - d->m_firstLine ) * fontHeight;
joachim99@69 604 int y2 = min2( height(), ( lastLine - d->m_firstLine + 1 ) * fontHeight );
joachim99@69 605
joachim99@69 606 if ( y1<height() && y2>0 )
joachim99@69 607 {
joachim99@69 608 QRect invalidRect = QRect( 0, y1, width(), y2-y1 );
joachim99@69 609 update( invalidRect );
joachim99@69 610 }
joachim99@69 611 }
joachim99@69 612
joachim99@69 613 d->m_bMyUpdate = false;
joachim99@8 614 }
joachim99@8 615
joachim99@69 616 if ( d->m_scrollDeltaX != 0 || d->m_scrollDeltaY != 0 )
joachim99@8 617 {
joachim99@69 618 d->m_selection.end( d->m_selection.lastLine + d->m_scrollDeltaY, d->m_selection.lastPos + d->m_scrollDeltaX );
joachim99@69 619 emit scroll( d->m_scrollDeltaX, d->m_scrollDeltaY );
joachim99@69 620 killTimer(d->m_delayedDrawTimer);
joachim99@69 621 d->m_delayedDrawTimer = startTimer(50);
joachim99@8 622 }
joachim99@8 623 }
joachim99@8 624
joachim99@8 625 void DiffTextWindow::resetSelection()
joachim99@8 626 {
joachim99@69 627 d->m_selection.reset();
joachim99@8 628 update();
joachim99@8 629 }
joachim99@8 630
joachim99@8 631 void DiffTextWindow::convertToLinePos( int x, int y, int& line, int& pos )
joachim99@8 632 {
joachim99@8 633 const QFontMetrics& fm = fontMetrics();
joachim99@8 634 int fontHeight = fm.height();
joachim99@8 635 int fontWidth = fm.width('W');
joachim99@69 636 int xOffset = ( d->leftInfoWidth() - d->m_firstColumn ) * fontWidth;
joachim99@8 637
joachim99@69 638 int yOffset = - d->m_firstLine * fontHeight;
joachim99@8 639
joachim99@8 640 line = ( y - yOffset ) / fontHeight;
joachim99@69 641 if ( ! d->m_pOptionDialog->m_bRightToLeftLanguage )
joachim99@68 642 pos = ( x - xOffset ) / fontWidth;
joachim99@68 643 else
joachim99@68 644 pos = ( (width() - 1 - x) - xOffset ) / fontWidth;
joachim99@8 645 }
joachim99@8 646
joachim99@8 647 int Selection::firstPosInLine(int l)
joachim99@8 648 {
joachim99@8 649 assert( firstLine != -1 );
joachim99@8 650
joachim99@8 651 int l1 = firstLine;
joachim99@8 652 int l2 = lastLine;
joachim99@8 653 int p1 = firstPos;
joachim99@8 654 int p2 = lastPos;
joachim99@8 655 if ( l1>l2 ){ std::swap(l1,l2); std::swap(p1,p2); }
joachim99@8 656 if ( l1==l2 && p1>p2 ){ std::swap(p1,p2); }
joachim99@8 657
joachim99@8 658 if ( l==l1 )
joachim99@8 659 return p1;
joachim99@8 660 return 0;
joachim99@8 661 }
joachim99@8 662
joachim99@8 663 int Selection::lastPosInLine(int l)
joachim99@8 664 {
joachim99@8 665 assert( firstLine != -1 );
joachim99@8 666
joachim99@8 667 int l1 = firstLine;
joachim99@8 668 int l2 = lastLine;
joachim99@8 669 int p1 = firstPos;
joachim99@8 670 int p2 = lastPos;
joachim99@8 671
joachim99@8 672 if ( l1>l2 ){ std::swap(l1,l2); std::swap(p1,p2); }
joachim99@8 673 if ( l1==l2 && p1>p2 ){ std::swap(p1,p2); }
joachim99@8 674
joachim99@8 675 if ( l==l2 )
joachim99@8 676 return p2;
joachim99@8 677 return INT_MAX;
joachim99@8 678 }
joachim99@8 679
joachim99@8 680 bool Selection::within( int l, int p )
joachim99@8 681 {
joachim99@8 682 if ( firstLine == -1 ) return false;
joachim99@8 683 int l1 = firstLine;
joachim99@8 684 int l2 = lastLine;
joachim99@8 685 int p1 = firstPos;
joachim99@8 686 int p2 = lastPos;
joachim99@8 687 if ( l1>l2 ){ std::swap(l1,l2); std::swap(p1,p2); }
joachim99@8 688 if ( l1==l2 && p1>p2 ){ std::swap(p1,p2); }
joachim99@8 689 if( l1 <= l && l <= l2 )
joachim99@8 690 {
joachim99@8 691 if ( l1==l2 )
joachim99@8 692 return p>=p1 && p<p2;
joachim99@8 693 if ( l==l1 )
joachim99@8 694 return p>=p1;
joachim99@8 695 if ( l==l2 )
joachim99@8 696 return p<p2;
joachim99@8 697 return true;
joachim99@8 698 }
joachim99@8 699 return false;
joachim99@8 700 }
joachim99@8 701
joachim99@8 702 bool Selection::lineWithin( int l )
joachim99@8 703 {
joachim99@8 704 if ( firstLine == -1 ) return false;
joachim99@8 705 int l1 = firstLine;
joachim99@8 706 int l2 = lastLine;
joachim99@8 707
joachim99@8 708 if ( l1>l2 ){ std::swap(l1,l2); }
joachim99@8 709
joachim99@8 710 return ( l1 <= l && l <= l2 );
joachim99@8 711 }
joachim99@8 712
joachim99@68 713
joachim99@69 714 void DiffTextWindowData::writeLine(
joachim99@68 715 MyPainter& p,
joachim99@8 716 const LineData* pld,
joachim99@8 717 const DiffList* pLineDiff1,
joachim99@8 718 const DiffList* pLineDiff2,
joachim99@8 719 int line,
joachim99@8 720 int whatChanged,
joachim99@8 721 int whatChanged2,
joachim99@69 722 int srcLineIdx,
joachim99@66 723 int wrapLineOffset,
joachim99@66 724 int wrapLineLength,
joachim99@69 725 bool bWrapLine,
joachim99@69 726 const QRect& invalidRect,
joachim99@69 727 int deviceWidth
joachim99@8 728 )
joachim99@8 729 {
joachim99@69 730 QFont normalFont = p.font();
joachim99@8 731 QFont diffFont = normalFont;
joachim99@8 732 diffFont.setItalic( m_pOptionDialog->m_bItalicForDeltas );
joachim99@69 733 const QFontMetrics& fm = p.fontMetrics();
joachim99@8 734 int fontHeight = fm.height();
joachim99@8 735 int fontAscent = fm.ascent();
joachim99@8 736 int fontDescent = fm.descent();
joachim99@8 737 int fontWidth = fm.width('W');
joachim99@8 738
joachim99@69 739 int xOffset = (leftInfoWidth() - m_firstColumn)*fontWidth;
joachim99@69 740 int yOffset = (line-m_firstLine) * fontHeight;
joachim99@8 741
joachim99@69 742 QRect lineRect( 0, yOffset, deviceWidth, fontHeight );
joachim99@69 743 if ( ! invalidRect.intersects( lineRect ) )
joachim99@69 744 {
joachim99@8 745 return;
joachim99@69 746 }
joachim99@8 747
joachim99@69 748 int fastSelectorLine1 = m_pDiffTextWindow->convertDiff3LineIdxToLine(m_fastSelectorLine1);
joachim99@69 749 int fastSelectorLine2 = m_pDiffTextWindow->convertDiff3LineIdxToLine(m_fastSelectorLine1+m_fastSelectorNofLines)-1;
joachim99@69 750
joachim99@66 751 bool bFastSelectionRange = (line>=fastSelectorLine1 && line<= fastSelectorLine2 );
joachim99@8 752 QColor bgColor = m_pOptionDialog->m_bgColor;
joachim99@8 753 QColor diffBgColor = m_pOptionDialog->m_diffBgColor;
joachim99@8 754
joachim99@8 755 if ( bFastSelectionRange )
joachim99@8 756 {
joachim99@8 757 bgColor = m_pOptionDialog->m_currentRangeBgColor;
joachim99@8 758 diffBgColor = m_pOptionDialog->m_currentRangeDiffBgColor;
joachim99@8 759 }
joachim99@8 760
joachim99@69 761 if ( yOffset+fontHeight<invalidRect.top() || invalidRect.bottom() < yOffset-fontHeight )
joachim99@8 762 return;
joachim99@8 763
joachim99@8 764 int changed = whatChanged;
joachim99@8 765 if ( pLineDiff1 != 0 ) changed |= 1;
joachim99@8 766 if ( pLineDiff2 != 0 ) changed |= 2;
joachim99@8 767
joachim99@8 768 QColor c = m_pOptionDialog->m_fgColor;
joachim99@8 769 if ( changed == 2 ) {
joachim99@8 770 c = m_cDiff2;
joachim99@8 771 } else if ( changed == 1 ) {
joachim99@8 772 c = m_cDiff1;
joachim99@8 773 } else if ( changed == 3 ) {
joachim99@8 774 c = m_cDiffBoth;
joachim99@8 775 }
joachim99@8 776
joachim99@69 777 p.fillRect( leftInfoWidth()*fontWidth, yOffset, deviceWidth, fontHeight, bgColor );
joachim99@51 778
joachim99@8 779 if (pld!=0)
joachim99@8 780 {
joachim99@8 781 // First calculate the "changed" information for each character.
joachim99@8 782 int i=0;
joachim99@8 783 std::vector<UINT8> charChanged( pld->size );
joachim99@8 784 if ( pLineDiff1!=0 || pLineDiff2 != 0 )
joachim99@8 785 {
joachim99@8 786 Merger merger( pLineDiff1, pLineDiff2 );
joachim99@8 787 while( ! merger.isEndReached() && i<pld->size )
joachim99@8 788 {
joachim99@8 789 if ( i < pld->size )
joachim99@8 790 {
joachim99@8 791 charChanged[i] = merger.whatChanged();
joachim99@8 792 ++i;
joachim99@8 793 }
joachim99@8 794 merger.next();
joachim99@8 795 }
joachim99@8 796 }
joachim99@8 797
joachim99@68 798 QString s=" ";
joachim99@8 799 // Convert tabs
joachim99@8 800 int outPos = 0;
joachim99@69 801
joachim99@68 802 QString lineString( pld->pLine, pld->size );
joachim99@68 803 int lineLength = m_bWordWrap ? wrapLineOffset+wrapLineLength : lineString.length();
joachim99@69 804
joachim99@66 805 for( i=wrapLineOffset; i<lineLength; ++i )
joachim99@8 806 {
joachim99@8 807 int spaces = 1;
joachim99@8 808
joachim99@68 809 if ( lineString[i]=='\t' )
joachim99@8 810 {
joachim99@69 811 spaces = tabber( outPos, m_pOptionDialog->m_tabSize );
joachim99@8 812 s[0] = ' ';
joachim99@8 813 }
joachim99@8 814 else
joachim99@8 815 {
joachim99@68 816 s[0] = lineString[i];
joachim99@8 817 }
joachim99@8 818
joachim99@8 819 QColor c = m_pOptionDialog->m_fgColor;
joachim99@8 820 int cchanged = charChanged[i] | whatChanged;
joachim99@8 821
joachim99@8 822 if ( cchanged == 2 ) {
joachim99@8 823 c = m_cDiff2;
joachim99@8 824 } else if ( cchanged == 1 ) {
joachim99@8 825 c = m_cDiff1;
joachim99@8 826 } else if ( cchanged == 3 ) {
joachim99@8 827 c = m_cDiffBoth;
joachim99@8 828 }
joachim99@8 829
joachim99@51 830 if ( c!=m_pOptionDialog->m_fgColor && whatChanged2==0 && !m_pOptionDialog->m_bShowWhiteSpace )
joachim99@51 831 {
joachim99@51 832 // The user doesn't want to see highlighted white space.
joachim99@51 833 c = m_pOptionDialog->m_fgColor;
joachim99@51 834 }
joachim99@51 835
joachim99@8 836 QRect outRect( xOffset + fontWidth*outPos, yOffset, fontWidth*spaces, fontHeight );
joachim99@68 837 if ( m_pOptionDialog->m_bRightToLeftLanguage )
joachim99@69 838 outRect = QRect( deviceWidth-1-(xOffset + fontWidth*outPos), yOffset, -fontWidth*spaces, fontHeight ).normalize();
joachim99@69 839 if ( invalidRect.intersects( outRect ) )
joachim99@8 840 {
joachim99@69 841 if( !m_selection.within( line, outPos ) )
joachim99@8 842 {
joachim99@51 843
joachim99@8 844 if( c!=m_pOptionDialog->m_fgColor )
joachim99@8 845 {
joachim99@8 846 QColor lightc = diffBgColor;
joachim99@8 847 p.fillRect( xOffset + fontWidth*outPos, yOffset,
joachim99@8 848 fontWidth*spaces, fontHeight, lightc );
joachim99@8 849 p.setFont(diffFont);
joachim99@8 850 }
joachim99@8 851
joachim99@8 852 p.setPen( c );
joachim99@8 853 if ( s[0]==' ' && c!=m_pOptionDialog->m_fgColor && charChanged[i]!=0 )
joachim99@8 854 {
joachim99@51 855 if ( m_pOptionDialog->m_bShowWhiteSpaceCharacters && m_pOptionDialog->m_bShowWhiteSpace)
joachim99@8 856 {
joachim99@8 857 p.fillRect( xOffset + fontWidth*outPos, yOffset+fontAscent,
joachim99@69 858 fontWidth*spaces-1, fontDescent, c ); // QT3
joachim99@69 859 //fontWidth*spaces-1, fontDescent, c ); // QT4
joachim99@8 860 }
joachim99@8 861 }
joachim99@8 862 else
joachim99@8 863 {
joachim99@68 864 p.drawText( xOffset + fontWidth*outPos, yOffset + fontAscent, s );
joachim99@8 865 }
joachim99@8 866 p.setFont(normalFont);
joachim99@8 867 }
joachim99@8 868 else
joachim99@8 869 {
joachim99@8 870 p.fillRect( xOffset + fontWidth*outPos, yOffset,
joachim99@69 871 fontWidth*(spaces), fontHeight, m_pDiffTextWindow->colorGroup().highlight() );
joachim99@8 872
joachim99@69 873 p.setPen( m_pDiffTextWindow->colorGroup().highlightedText() );
joachim99@68 874 p.drawText( xOffset + fontWidth*outPos, yOffset + fontAscent, s );
joachim99@8 875
joachim99@69 876 m_selection.bSelectionContainsData = true;
joachim99@8 877 }
joachim99@8 878 }
joachim99@8 879
joachim99@8 880 outPos += spaces;
joachim99@8 881 }
joachim99@8 882
joachim99@69 883 if( m_selection.lineWithin( line ) && m_selection.lineWithin( line+1 ) )
joachim99@8 884 {
joachim99@8 885 p.fillRect( xOffset + fontWidth*outPos, yOffset,
joachim99@69 886 deviceWidth, fontHeight, m_pDiffTextWindow->colorGroup().highlight() );
joachim99@8 887 }
joachim99@8 888 }
joachim99@8 889
joachim99@69 890 p.fillRect( 0, yOffset, leftInfoWidth()*fontWidth, fontHeight, m_pOptionDialog->m_bgColor );
joachim99@8 891
joachim99@8 892 xOffset = (m_lineNumberWidth+2)*fontWidth;
joachim99@8 893 int xLeft = m_lineNumberWidth*fontWidth;
joachim99@8 894 p.setPen( m_pOptionDialog->m_fgColor );
joachim99@8 895 if ( pld!=0 )
joachim99@8 896 {
joachim99@66 897 if ( m_pOptionDialog->m_bShowLineNumbers && !bWrapLine )
joachim99@8 898 {
joachim99@8 899 QString num;
joachim99@69 900 num.sprintf( "%0*d", m_lineNumberWidth, srcLineIdx+1);
joachim99@8 901 p.drawText( 0, yOffset + fontAscent, num );
joachim99@8 902 //p.drawLine( xLeft -1, yOffset, xLeft -1, yOffset+fontHeight-1 );
joachim99@8 903 }
joachim99@66 904 if ( !bWrapLine || wrapLineLength>0 )
joachim99@66 905 {
joachim99@69 906 p.setPen( QPen( m_pOptionDialog->m_fgColor, 0, bWrapLine ? Qt::DotLine : Qt::SolidLine) );
joachim99@66 907 p.drawLine( xOffset +1, yOffset, xOffset +1, yOffset+fontHeight-1 );
joachim99@69 908 p.setPen( QPen( m_pOptionDialog->m_fgColor, 0, Qt::SolidLine) );
joachim99@66 909 }
joachim99@8 910 }
joachim99@8 911 if ( c!=m_pOptionDialog->m_fgColor && whatChanged2==0 )//&& whatChanged==0 )
joachim99@8 912 {
joachim99@51 913 if ( m_pOptionDialog->m_bShowWhiteSpace )
joachim99@51 914 {
joachim99@51 915 p.setBrushOrigin(0,0);
joachim99@69 916 p.fillRect( xLeft, yOffset, fontWidth*2-1, fontHeight, QBrush(c,Qt::Dense5Pattern) );
joachim99@51 917 }
joachim99@8 918 }
joachim99@8 919 else
joachim99@8 920 {
joachim99@8 921 p.fillRect( xLeft, yOffset, fontWidth*2-1, fontHeight, c==m_pOptionDialog->m_fgColor ? bgColor : c );
joachim99@8 922 }
joachim99@8 923
joachim99@8 924 if ( bFastSelectionRange )
joachim99@8 925 {
joachim99@8 926 p.fillRect( xOffset + fontWidth-1, yOffset, 3, fontHeight, m_pOptionDialog->m_fgColor );
joachim99@8 927 }
joachim99@69 928
joachim99@69 929 // Check if line needs a manual diff help mark
joachim99@69 930 ManualDiffHelpList::const_iterator ci;
joachim99@69 931 for( ci = m_pManualDiffHelpList->begin(); ci!=m_pManualDiffHelpList->end(); ++ci)
joachim99@69 932 {
joachim99@69 933 const ManualDiffHelpEntry& mdhe=*ci;
joachim99@69 934 int rangeLine1 = -1;
joachim99@69 935 int rangeLine2 = -1;
joachim99@69 936 if (m_winIdx==1 ) { rangeLine1 = mdhe.lineA1; rangeLine2= mdhe.lineA2; }
joachim99@69 937 if (m_winIdx==2 ) { rangeLine1 = mdhe.lineB1; rangeLine2= mdhe.lineB2; }
joachim99@69 938 if (m_winIdx==3 ) { rangeLine1 = mdhe.lineC1; rangeLine2= mdhe.lineC2; }
joachim99@69 939 if ( rangeLine1>=0 && rangeLine2>=0 && srcLineIdx >= rangeLine1 && srcLineIdx <= rangeLine2 )
joachim99@69 940 {
joachim99@69 941 p.fillRect( xOffset - fontWidth, yOffset, fontWidth-1, fontHeight, m_pOptionDialog->m_manualHelpRangeColor );
joachim99@69 942 break;
joachim99@69 943 }
joachim99@69 944 }
joachim99@8 945 }
joachim99@8 946
joachim99@8 947 void DiffTextWindow::paintEvent( QPaintEvent* e )
joachim99@8 948 {
joachim99@69 949 if ( d->m_pDiff3LineVector==0 || ! d->m_bPaintingAllowed ||
joachim99@69 950 ( d->m_diff3WrapLineVector.empty() && d->m_bWordWrap ) )
joachim99@66 951 return;
joachim99@8 952
joachim99@69 953 QRect invalidRect = e->rect();
joachim99@69 954 if ( invalidRect.isEmpty() )
joachim99@69 955 return;
joachim99@69 956
joachim99@69 957 bool bOldSelectionContainsData = d->m_selection.bSelectionContainsData;
joachim99@69 958 d->m_selection.bSelectionContainsData = false;
joachim99@69 959
joachim99@69 960 int endLine = min2( d->m_firstLine + getNofVisibleLines()+2, getNofLines() );
joachim99@69 961
joachim99@69 962 //if ( invalidRect.size()==size() )
joachim99@69 963 { // double buffering, obsolete with Qt4
joachim99@70 964 //QPainter painter(this); // Remove for Qt4
joachim99@70 965 //QPixmap pixmap( invalidRect.size() );// Remove for Qt4
joachim99@69 966
joachim99@70 967 MyPainter p( this, d->m_pOptionDialog->m_bRightToLeftLanguage, width(), fontMetrics().width('W') ); // For Qt4 change pixmap to this
joachim99@69 968
joachim99@70 969 //p.translate( -invalidRect.x(), -invalidRect.y() );// Remove for Qt4
joachim99@69 970
joachim99@69 971 p.setFont( font() );
joachim99@69 972 p.QPainter::fillRect( invalidRect, d->m_pOptionDialog->m_bgColor );
joachim99@69 973
joachim99@69 974 d->draw( p, invalidRect, width(), d->m_firstLine, endLine );
joachim99@69 975 // p.drawLine( m_invalidRect.x(), m_invalidRect.y(), m_invalidRect.right(), m_invalidRect.bottom() ); // For test only
joachim99@69 976 p.end();
joachim99@69 977
joachim99@70 978 //painter.drawPixmap( invalidRect.x(), invalidRect.y(), pixmap );// Remove for Qt4
joachim99@69 979 }
joachim99@69 980 // else
joachim99@69 981 // { // no double buffering
joachim99@69 982 // MyPainter p( this, d->m_pOptionDialog->m_bRightToLeftLanguage, width(), fontMetrics().width('W') );
joachim99@69 983 // p.setFont( font() );
joachim99@69 984 // p.QPainter::fillRect( invalidRect, d->m_pOptionDialog->m_bgColor );
joachim99@69 985 // d->draw( p, invalidRect, width(), d->m_firstLine, endLine );
joachim99@69 986 // }
joachim99@69 987
joachim99@69 988
joachim99@69 989 d->m_oldFirstLine = d->m_firstLine;
joachim99@69 990 d->m_oldFirstColumn = d->m_firstColumn;
joachim99@69 991 d->m_selection.oldLastLine = -1;
joachim99@69 992 if ( d->m_selection.oldFirstLine !=-1 )
joachim99@69 993 d->m_selection.oldFirstLine = -1;
joachim99@69 994
joachim99@69 995 if( !bOldSelectionContainsData && d->m_selection.bSelectionContainsData )
joachim99@69 996 emit newSelection();
joachim99@69 997 }
joachim99@69 998
joachim99@69 999 void DiffTextWindow::print( MyPainter& p, const QRect&, int firstLine, int nofLinesPerPage )
joachim99@69 1000 {
joachim99@69 1001 if ( d->m_pDiff3LineVector==0 || ! d->m_bPaintingAllowed ||
joachim99@69 1002 ( d->m_diff3WrapLineVector.empty() && d->m_bWordWrap ) )
joachim99@69 1003 return;
joachim99@69 1004 resetSelection();
joachim99@69 1005 // MyPainter p( this, d->m_pOptionDialog->m_bRightToLeftLanguage, width(), fontMetrics().width('W') );
joachim99@69 1006 int oldFirstLine = d->m_firstLine;
joachim99@69 1007 d->m_firstLine = firstLine;
joachim99@69 1008 QRect invalidRect = QRect(0,0,QCOORD_MAX,QCOORD_MAX);
joachim99@69 1009 QColor bgColor = d->m_pOptionDialog->m_bgColor;
joachim99@69 1010 d->m_pOptionDialog->m_bgColor = Qt::white;
joachim99@69 1011 d->draw( p, invalidRect, p.window().width(), firstLine, min2(firstLine+nofLinesPerPage,getNofLines()) );
joachim99@69 1012 d->m_pOptionDialog->m_bgColor = bgColor;
joachim99@69 1013 d->m_firstLine = oldFirstLine;
joachim99@69 1014 }
joachim99@69 1015
joachim99@69 1016 void DiffTextWindowData::draw( MyPainter& p, const QRect& invalidRect, int deviceWidth, int beginLine, int endLine )
joachim99@69 1017 {
joachim99@8 1018 m_lineNumberWidth = m_pOptionDialog->m_bShowLineNumbers ? (int)log10((double)m_size)+1 : 0;
joachim99@8 1019
joachim99@8 1020 if ( m_winIdx==1 )
joachim99@8 1021 {
joachim99@8 1022 m_cThis = m_pOptionDialog->m_colorA;
joachim99@8 1023 m_cDiff1 = m_pOptionDialog->m_colorB;
joachim99@8 1024 m_cDiff2 = m_pOptionDialog->m_colorC;
joachim99@8 1025 }
joachim99@8 1026 if ( m_winIdx==2 )
joachim99@8 1027 {
joachim99@8 1028 m_cThis = m_pOptionDialog->m_colorB;
joachim99@8 1029 m_cDiff1 = m_pOptionDialog->m_colorC;
joachim99@8 1030 m_cDiff2 = m_pOptionDialog->m_colorA;
joachim99@8 1031 }
joachim99@8 1032 if ( m_winIdx==3 )
joachim99@8 1033 {
joachim99@8 1034 m_cThis = m_pOptionDialog->m_colorC;
joachim99@8 1035 m_cDiff1 = m_pOptionDialog->m_colorA;
joachim99@8 1036 m_cDiff2 = m_pOptionDialog->m_colorB;
joachim99@8 1037 }
joachim99@8 1038 m_cDiffBoth = m_pOptionDialog->m_colorForConflict; // Conflict color
joachim99@8 1039
joachim99@69 1040 p.setPen( m_cThis );
joachim99@8 1041
joachim99@69 1042 for ( int line = beginLine; line<endLine; ++line )
joachim99@8 1043 {
joachim99@66 1044 int wrapLineOffset=0;
joachim99@66 1045 int wrapLineLength=0;
joachim99@66 1046 const Diff3Line* d3l =0;
joachim99@66 1047 bool bWrapLine = false;
joachim99@66 1048 if (m_bWordWrap)
joachim99@66 1049 {
joachim99@66 1050 Diff3WrapLine& d3wl = m_diff3WrapLineVector[line];
joachim99@66 1051 wrapLineOffset = d3wl.wrapLineOffset;
joachim99@66 1052 wrapLineLength = d3wl.wrapLineLength;
joachim99@66 1053 d3l = d3wl.pD3L;
joachim99@66 1054 bWrapLine = line > 0 && m_diff3WrapLineVector[line-1].pD3L == d3l;
joachim99@66 1055 }
joachim99@66 1056 else
joachim99@66 1057 {
joachim99@66 1058 d3l = (*m_pDiff3LineVector)[line];
joachim99@66 1059 }
joachim99@8 1060 DiffList* pFineDiff1;
joachim99@8 1061 DiffList* pFineDiff2;
joachim99@8 1062 int changed=0;
joachim99@8 1063 int changed2=0;
joachim99@8 1064
joachim99@69 1065 int srcLineIdx=-1;
joachim99@69 1066 getLineInfo( *d3l, srcLineIdx, pFineDiff1, pFineDiff2, changed, changed2 );
joachim99@8 1067
joachim99@8 1068 writeLine(
joachim99@8 1069 p, // QPainter
joachim99@69 1070 srcLineIdx == -1 ? 0 : &m_pLineData[srcLineIdx], // Text in this line
joachim99@8 1071 pFineDiff1,
joachim99@8 1072 pFineDiff2,
joachim99@8 1073 line, // Line on the screen
joachim99@8 1074 changed,
joachim99@8 1075 changed2,
joachim99@69 1076 srcLineIdx,
joachim99@66 1077 wrapLineOffset,
joachim99@66 1078 wrapLineLength,
joachim99@69 1079 bWrapLine,
joachim99@69 1080 invalidRect,
joachim99@69 1081 deviceWidth
joachim99@8 1082 );
joachim99@8 1083 }
joachim99@8 1084 }
joachim99@8 1085
joachim99@69 1086 QString DiffTextWindowData::getString( int d3lIdx )
joachim99@8 1087 {
joachim99@66 1088 const Diff3Line* d3l = (*m_pDiff3LineVector)[d3lIdx];
joachim99@8 1089 DiffList* pFineDiff1;
joachim99@8 1090 DiffList* pFineDiff2;
joachim99@8 1091 int changed=0;
joachim99@8 1092 int changed2=0;
joachim99@8 1093 int lineIdx;
joachim99@8 1094 getLineInfo( *d3l, lineIdx, pFineDiff1, pFineDiff2, changed, changed2 );
joachim99@8 1095
joachim99@68 1096 if (lineIdx==-1) return QString();
joachim99@8 1097 else
joachim99@8 1098 {
joachim99@58 1099 const LineData* ld = &m_pLineData[lineIdx];
joachim99@68 1100 return QString( ld->pLine, ld->size );
joachim99@8 1101 }
joachim99@68 1102 return QString();
joachim99@8 1103 }
joachim99@8 1104
joachim99@69 1105 QString DiffTextWindowData::getLineString( int line )
joachim99@66 1106 {
joachim99@66 1107 if ( m_bWordWrap )
joachim99@66 1108 {
joachim99@69 1109 int d3LIdx = m_pDiffTextWindow->convertLineToDiff3LineIdx(line);
joachim99@66 1110 return getString( d3LIdx ).mid( m_diff3WrapLineVector[line].wrapLineOffset, m_diff3WrapLineVector[line].wrapLineLength );
joachim99@66 1111 }
joachim99@66 1112 else
joachim99@66 1113 {
joachim99@66 1114 return getString( line );
joachim99@66 1115 }
joachim99@66 1116 }
joachim99@8 1117
joachim99@69 1118 void DiffTextWindowData::getLineInfo(
joachim99@69 1119 const Diff3Line& d3l,
joachim99@8 1120 int& lineIdx,
joachim99@8 1121 DiffList*& pFineDiff1, DiffList*& pFineDiff2, // return values
joachim99@8 1122 int& changed, int& changed2
joachim99@8 1123 )
joachim99@8 1124 {
joachim99@8 1125 changed=0;
joachim99@8 1126 changed2=0;
joachim99@69 1127 bool bAEqB = d3l.bAEqB || ( d3l.bWhiteLineA && d3l.bWhiteLineB );
joachim99@69 1128 bool bAEqC = d3l.bAEqC || ( d3l.bWhiteLineA && d3l.bWhiteLineC );
joachim99@69 1129 bool bBEqC = d3l.bBEqC || ( d3l.bWhiteLineB && d3l.bWhiteLineC );
joachim99@8 1130 if ( m_winIdx == 1 ) {
joachim99@69 1131 lineIdx=d3l.lineA;
joachim99@69 1132 pFineDiff1=d3l.pFineAB;
joachim99@69 1133 pFineDiff2=d3l.pFineCA;
joachim99@69 1134 changed |= ((d3l.lineB==-1)!=(lineIdx==-1) ? 1 : 0) +
joachim99@69 1135 ((d3l.lineC==-1)!=(lineIdx==-1) && m_bTriple ? 2 : 0);
joachim99@8 1136 changed2 |= ( bAEqB ? 0 : 1 ) + (bAEqC || !m_bTriple ? 0 : 2);
joachim99@8 1137 }
joachim99@8 1138 else if ( m_winIdx == 2 ) {
joachim99@69 1139 lineIdx=d3l.lineB;
joachim99@69 1140 pFineDiff1=d3l.pFineBC;
joachim99@69 1141 pFineDiff2=d3l.pFineAB;
joachim99@69 1142 changed |= ((d3l.lineC==-1)!=(lineIdx==-1) && m_bTriple ? 1 : 0) +
joachim99@69 1143 ((d3l.lineA==-1)!=(lineIdx==-1) ? 2 : 0);
joachim99@8 1144 changed2 |= ( bBEqC || !m_bTriple ? 0 : 1 ) + (bAEqB ? 0 : 2);
joachim99@8 1145 }
joachim99@8 1146 else if ( m_winIdx == 3 ) {
joachim99@69 1147 lineIdx=d3l.lineC;
joachim99@69 1148 pFineDiff1=d3l.pFineCA;
joachim99@69 1149 pFineDiff2=d3l.pFineBC;
joachim99@69 1150 changed |= ((d3l.lineA==-1)!=(lineIdx==-1) ? 1 : 0) +
joachim99@69 1151 ((d3l.lineB==-1)!=(lineIdx==-1) ? 2 : 0);
joachim99@8 1152 changed2 |= ( bAEqC ? 0 : 1 ) + (bBEqC ? 0 : 2);
joachim99@8 1153 }
joachim99@8 1154 else assert(false);
joachim99@8 1155 }
joachim99@8 1156
joachim99@8 1157
joachim99@8 1158
joachim99@8 1159 void DiffTextWindow::resizeEvent( QResizeEvent* e )
joachim99@8 1160 {
joachim99@8 1161 QSize s = e->size();
joachim99@8 1162 QFontMetrics fm = fontMetrics();
joachim99@8 1163 int visibleLines = s.height()/fm.height()-2;
joachim99@69 1164 int visibleColumns = s.width()/fm.width('W') - d->leftInfoWidth();
joachim99@8 1165 emit resizeSignal( visibleColumns, visibleLines );
joachim99@8 1166 QWidget::resizeEvent(e);
joachim99@8 1167 }
joachim99@8 1168
joachim99@8 1169 int DiffTextWindow::getNofVisibleLines()
joachim99@8 1170 {
joachim99@8 1171 QFontMetrics fm = fontMetrics();
joachim99@8 1172 int fmh = fm.height();
joachim99@8 1173 int h = height();
joachim99@69 1174 return h/fmh -1;//height()/fm.height()-2;
joachim99@8 1175 }
joachim99@8 1176
joachim99@8 1177 int DiffTextWindow::getNofVisibleColumns()
joachim99@8 1178 {
joachim99@8 1179 QFontMetrics fm = fontMetrics();
joachim99@69 1180 return width()/fm.width('W') - d->leftInfoWidth();
joachim99@8 1181 }
joachim99@8 1182
joachim99@8 1183 QString DiffTextWindow::getSelection()
joachim99@8 1184 {
joachim99@8 1185 QString selectionString;
joachim99@8 1186
joachim99@8 1187 int line=0;
joachim99@8 1188 int lineIdx=0;
joachim99@8 1189
joachim99@8 1190 int it;
joachim99@69 1191 int vectorSize = d->m_bWordWrap ? d->m_diff3WrapLineVector.size() : d->m_pDiff3LineVector->size();
joachim99@66 1192 for( it=0; it<vectorSize; ++it )
joachim99@8 1193 {
joachim99@69 1194 const Diff3Line* d3l = d->m_bWordWrap ? d->m_diff3WrapLineVector[it].pD3L : (*d->m_pDiff3LineVector)[it];
joachim99@69 1195 if ( d->m_winIdx == 1 ) { lineIdx=d3l->lineA; }
joachim99@69 1196 else if ( d->m_winIdx == 2 ) { lineIdx=d3l->lineB; }
joachim99@69 1197 else if ( d->m_winIdx == 3 ) { lineIdx=d3l->lineC; }
joachim99@8 1198 else assert(false);
joachim99@8 1199
joachim99@8 1200 if( lineIdx != -1 )
joachim99@69 1201 {
joachim99@69 1202 const QChar* pLine = d->m_pLineData[lineIdx].pLine;
joachim99@69 1203 int size = d->m_pLineData[lineIdx].size;
joachim99@68 1204 QString lineString = QString( pLine, size );
joachim99@69 1205
joachim99@69 1206 if ( d->m_bWordWrap )
joachim99@66 1207 {
joachim99@69 1208 size = d->m_diff3WrapLineVector[it].wrapLineLength;
joachim99@69 1209 lineString = lineString.mid( d->m_diff3WrapLineVector[it].wrapLineOffset, size );
joachim99@66 1210 }
joachim99@8 1211
joachim99@8 1212 // Consider tabs
joachim99@8 1213 int outPos = 0;
joachim99@8 1214 for( int i=0; i<size; ++i )
joachim99@8 1215 {
joachim99@8 1216 int spaces = 1;
joachim99@68 1217 if ( lineString[i]=='\t' )
joachim99@8 1218 {
joachim99@69 1219 spaces = tabber( outPos, d->m_pOptionDialog->m_tabSize );
joachim99@8 1220 }
joachim99@8 1221
joachim99@69 1222 if( d->m_selection.within( line, outPos ) )
joachim99@8 1223 {
joachim99@68 1224 selectionString += lineString[i];
joachim99@8 1225 }
joachim99@8 1226
joachim99@8 1227 outPos += spaces;
joachim99@69 1228 }
joachim99@66 1229
joachim99@69 1230 if( d->m_selection.within( line, outPos ) &&
joachim99@69 1231 !( d->m_bWordWrap && it+1<vectorSize && d3l == d->m_diff3WrapLineVector[it+1].pD3L )
joachim99@66 1232 )
joachim99@8 1233 {
joachim99@8 1234 #ifdef _WIN32
joachim99@8 1235 selectionString += '\r';
joachim99@8 1236 #endif
joachim99@8 1237 selectionString += '\n';
joachim99@8 1238 }
joachim99@8 1239 }
joachim99@8 1240
joachim99@8 1241 ++line;
joachim99@8 1242 }
joachim99@8 1243
joachim99@8 1244 return selectionString;
joachim99@8 1245 }
joachim99@8 1246
joachim99@68 1247 bool DiffTextWindow::findString( const QString& s, int& d3vLine, int& posInLine, bool bDirDown, bool bCaseSensitive )
joachim99@8 1248 {
joachim99@8 1249 int it = d3vLine;
joachim99@69 1250 int endIt = bDirDown ? (int)d->m_pDiff3LineVector->size() : -1;
joachim99@8 1251 int step = bDirDown ? 1 : -1;
joachim99@8 1252 int startPos = posInLine;
joachim99@8 1253
joachim99@8 1254 for( ; it!=endIt; it+=step )
joachim99@8 1255 {
joachim99@69 1256 QString line = d->getString( it );
joachim99@8 1257 if ( !line.isEmpty() )
joachim99@8 1258 {
joachim99@8 1259 int pos = line.find( s, startPos, bCaseSensitive );
joachim99@8 1260 if ( pos != -1 )
joachim99@8 1261 {
joachim99@8 1262 d3vLine = it;
joachim99@8 1263 posInLine = pos;
joachim99@8 1264 return true;
joachim99@8 1265 }
joachim99@8 1266
joachim99@69 1267 startPos = 0;
joachim99@8 1268 }
joachim99@8 1269 }
joachim99@8 1270 return false;
joachim99@8 1271 }
joachim99@8 1272
joachim99@66 1273 void DiffTextWindow::convertD3LCoordsToLineCoords( int d3LIdx, int d3LPos, int& line, int& pos )
joachim99@66 1274 {
joachim99@69 1275 if( d->m_bWordWrap )
joachim99@66 1276 {
joachim99@66 1277 int wrapPos = d3LPos;
joachim99@66 1278 int wrapLine = convertDiff3LineIdxToLine(d3LIdx);
joachim99@69 1279 while ( wrapPos > d->m_diff3WrapLineVector[wrapLine].wrapLineLength )
joachim99@66 1280 {
joachim99@69 1281 wrapPos -= d->m_diff3WrapLineVector[wrapLine].wrapLineLength;
joachim99@66 1282 ++wrapLine;
joachim99@66 1283 }
joachim99@66 1284 pos = wrapPos;
joachim99@66 1285 line = wrapLine;
joachim99@66 1286 }
joachim99@66 1287 else
joachim99@66 1288 {
joachim99@66 1289 pos = d3LPos;
joachim99@66 1290 line = d3LIdx;
joachim99@66 1291 }
joachim99@66 1292 }
joachim99@66 1293
joachim99@66 1294 void DiffTextWindow::convertLineCoordsToD3LCoords( int line, int pos, int& d3LIdx, int& d3LPos )
joachim99@66 1295 {
joachim99@69 1296 if( d->m_bWordWrap )
joachim99@66 1297 {
joachim99@66 1298 d3LPos = pos;
joachim99@66 1299 d3LIdx = convertLineToDiff3LineIdx( line );
joachim99@66 1300 int wrapLine = convertDiff3LineIdxToLine(d3LIdx); // First wrap line belonging to this d3LIdx
joachim99@66 1301 while ( wrapLine < line )
joachim99@66 1302 {
joachim99@69 1303 d3LPos += d->m_diff3WrapLineVector[wrapLine].wrapLineLength;
joachim99@66 1304 ++wrapLine;
joachim99@66 1305 }
joachim99@66 1306 }
joachim99@66 1307 else
joachim99@66 1308 {
joachim99@66 1309 d3LPos = pos;
joachim99@66 1310 d3LIdx = line;
joachim99@66 1311 }
joachim99@66 1312 }
joachim99@66 1313
joachim99@66 1314
joachim99@66 1315 void DiffTextWindow::setSelection( int firstLine, int startPos, int lastLine, int endPos, int& l, int& p )
joachim99@8 1316 {
joachim99@69 1317 d->m_selection.reset();
joachim99@69 1318 if ( lastLine >= getNofLines() )
joachim99@69 1319 {
joachim99@69 1320 lastLine = getNofLines()-1;
joachim99@69 1321
joachim99@69 1322 const Diff3Line* d3l = (*d->m_pDiff3LineVector)[convertLineToDiff3LineIdx(lastLine)];
joachim99@69 1323 int line = -1;
joachim99@69 1324 if ( d->m_winIdx==1 ) line = d3l->lineA;
joachim99@69 1325 if ( d->m_winIdx==2 ) line = d3l->lineB;
joachim99@69 1326 if ( d->m_winIdx==3 ) line = d3l->lineC;
joachim99@69 1327 if (line>=0)
joachim99@69 1328 endPos = d->m_pLineData[line].width( d->m_pOptionDialog->m_tabSize);
joachim99@69 1329 }
joachim99@69 1330
joachim99@69 1331 if ( d->m_bWordWrap && d->m_pDiff3LineVector!=0 )
joachim99@69 1332 {
joachim99@69 1333 QString s1 = d->getString(firstLine);
joachim99@66 1334 int firstWrapLine = convertDiff3LineIdxToLine(firstLine);
joachim99@66 1335 int wrapStartPos = startPos;
joachim99@69 1336 while ( wrapStartPos > d->m_diff3WrapLineVector[firstWrapLine].wrapLineLength )
joachim99@66 1337 {
joachim99@69 1338 wrapStartPos -= d->m_diff3WrapLineVector[firstWrapLine].wrapLineLength;
joachim99@69 1339 s1 = s1.mid(d->m_diff3WrapLineVector[firstWrapLine].wrapLineLength);
joachim99@66 1340 ++firstWrapLine;
joachim99@66 1341 }
joachim99@66 1342
joachim99@69 1343 QString s2 = d->getString(lastLine);
joachim99@66 1344 int lastWrapLine = convertDiff3LineIdxToLine(lastLine);
joachim99@66 1345 int wrapEndPos = endPos;
joachim99@69 1346 while ( wrapEndPos > d->m_diff3WrapLineVector[lastWrapLine].wrapLineLength )
joachim99@66 1347 {
joachim99@69 1348 wrapEndPos -= d->m_diff3WrapLineVector[lastWrapLine].wrapLineLength;
joachim99@69 1349 s2 = s2.mid(d->m_diff3WrapLineVector[lastWrapLine].wrapLineLength);
joachim99@66 1350 ++lastWrapLine;
joachim99@66 1351 }
joachim99@66 1352
joachim99@69 1353 d->m_selection.start( firstWrapLine, convertToPosOnScreen( s1, wrapStartPos, d->m_pOptionDialog->m_tabSize ) );
joachim99@69 1354 d->m_selection.end( lastWrapLine, convertToPosOnScreen( s2, wrapEndPos, d->m_pOptionDialog->m_tabSize ) );
joachim99@66 1355 l=firstWrapLine;
joachim99@66 1356 p=wrapStartPos;
joachim99@66 1357 }
joachim99@66 1358 else
joachim99@66 1359 {
joachim99@69 1360 d->m_selection.start( firstLine, convertToPosOnScreen( d->getString(firstLine), startPos, d->m_pOptionDialog->m_tabSize ) );
joachim99@69 1361 d->m_selection.end( lastLine, convertToPosOnScreen( d->getString(lastLine), endPos, d->m_pOptionDialog->m_tabSize ) );
joachim99@66 1362 l=firstLine;
joachim99@66 1363 p=startPos;
joachim99@66 1364 }
joachim99@8 1365 update();
joachim99@8 1366 }
joachim99@51 1367
joachim99@69 1368 int DiffTextWindowData::convertLineOnScreenToLineInSource( int lineOnScreen, e_CoordType coordType, bool bFirstLine )
joachim99@69 1369 {
joachim99@69 1370 int line=-1;
joachim99@69 1371 if (lineOnScreen>=0)
joachim99@69 1372 {
joachim99@69 1373 if (coordType==eWrapCoords) return lineOnScreen;
joachim99@69 1374 int d3lIdx = m_pDiffTextWindow->convertLineToDiff3LineIdx( lineOnScreen );
joachim99@69 1375 if ( !bFirstLine && d3lIdx >= (int)m_pDiff3LineVector->size() )
joachim99@69 1376 d3lIdx = m_pDiff3LineVector->size()-1;
joachim99@69 1377 if (coordType==eD3LLineCoords) return d3lIdx;
joachim99@69 1378 while ( line<0 && d3lIdx<(int)m_pDiff3LineVector->size() && d3lIdx>=0 )
joachim99@69 1379 {
joachim99@69 1380 const Diff3Line* d3l = (*m_pDiff3LineVector)[d3lIdx];
joachim99@69 1381 if ( m_winIdx==1 ) line = d3l->lineA;
joachim99@69 1382 if ( m_winIdx==2 ) line = d3l->lineB;
joachim99@69 1383 if ( m_winIdx==3 ) line = d3l->lineC;
joachim99@69 1384 if ( bFirstLine )
joachim99@69 1385 ++d3lIdx;
joachim99@69 1386 else
joachim99@69 1387 --d3lIdx;
joachim99@69 1388 }
joachim99@69 1389 if (coordType==eFileCoords) return line;
joachim99@69 1390 }
joachim99@69 1391 return line;
joachim99@69 1392 }
joachim99@69 1393
joachim99@69 1394
joachim99@69 1395 void DiffTextWindow::getSelectionRange( int* pFirstLine, int* pLastLine, e_CoordType coordType )
joachim99@69 1396 {
joachim99@69 1397 if (pFirstLine)
joachim99@69 1398 *pFirstLine = d->convertLineOnScreenToLineInSource( d->m_selection.beginLine(), coordType, true );
joachim99@69 1399 if (pLastLine)
joachim99@69 1400 *pLastLine = d->convertLineOnScreenToLineInSource( d->m_selection.endLine(), coordType, false );
joachim99@69 1401 }
joachim99@51 1402
joachim99@66 1403 // Returns the number of wrapped lines
joachim99@66 1404 // if pWrappedLines != 0 then the stringlist will contain the wrapped lines.
joachim99@66 1405 int wordWrap( const QString& origLine, int nofColumns, Diff3WrapLine* pDiff3WrapLine )
joachim99@69 1406 {
joachim99@66 1407 if (nofColumns<=0)
joachim99@66 1408 nofColumns = 1;
joachim99@69 1409
joachim99@66 1410 int nofNeededLines = 0;
joachim99@66 1411 int length = origLine.length();
joachim99@69 1412
joachim99@66 1413 if (length==0)
joachim99@66 1414 {
joachim99@66 1415 nofNeededLines = 1;
joachim99@66 1416 if( pDiff3WrapLine )
joachim99@66 1417 {
joachim99@66 1418 pDiff3WrapLine->wrapLineOffset=0;
joachim99@66 1419 pDiff3WrapLine->wrapLineLength=0;
joachim99@66 1420 }
joachim99@66 1421 }
joachim99@66 1422 else
joachim99@69 1423 {
joachim99@66 1424 int pos = 0;
joachim99@69 1425
joachim99@66 1426 while ( pos < length )
joachim99@66 1427 {
joachim99@66 1428 int wrapPos = pos + nofColumns;
joachim99@69 1429
joachim99@66 1430 if ( length-pos <= nofColumns )
joachim99@66 1431 {
joachim99@66 1432 wrapPos = length;
joachim99@66 1433 }
joachim99@66 1434 else
joachim99@69 1435 {
joachim99@66 1436 int wsPos = max2( origLine.findRev( ' ', wrapPos ), origLine.findRev( '\t', wrapPos ) );
joachim99@69 1437
joachim99@66 1438 if ( wsPos > pos )
joachim99@66 1439 {
joachim99@66 1440 // Wrap line at wsPos
joachim99@66 1441 wrapPos = wsPos;
joachim99@66 1442 }
joachim99@66 1443 }
joachim99@69 1444
joachim99@66 1445 if ( pDiff3WrapLine )
joachim99@66 1446 {
joachim99@66 1447 pDiff3WrapLine->wrapLineOffset = pos;
joachim99@66 1448 pDiff3WrapLine->wrapLineLength = wrapPos-pos;
joachim99@66 1449 ++pDiff3WrapLine;
joachim99@66 1450 }
joachim99@69 1451
joachim99@66 1452 pos = wrapPos;
joachim99@69 1453
joachim99@66 1454 ++nofNeededLines;
joachim99@66 1455 }
joachim99@66 1456 }
joachim99@69 1457 return nofNeededLines;
joachim99@66 1458 }
joachim99@66 1459
joachim99@66 1460 void DiffTextWindow::convertSelectionToD3LCoords()
joachim99@66 1461 {
joachim99@69 1462 if ( d->m_pDiff3LineVector==0 || ! d->m_bPaintingAllowed || !isVisible() || d->m_selection.isEmpty() )
joachim99@66 1463 {
joachim99@66 1464 return;
joachim99@66 1465 }
joachim99@66 1466
joachim99@69 1467 // convert the d->m_selection to unwrapped coordinates: Later restore to new coords
joachim99@66 1468 int firstD3LIdx, firstD3LPos;
joachim99@69 1469 QString s = d->getLineString( d->m_selection.beginLine() );
joachim99@69 1470 int firstPosInText = convertToPosInText( s, d->m_selection.beginPos(), d->m_pOptionDialog->m_tabSize );
joachim99@69 1471 convertLineCoordsToD3LCoords( d->m_selection.beginLine(), firstPosInText, firstD3LIdx, firstD3LPos );
joachim99@69 1472
joachim99@66 1473 int lastD3LIdx, lastD3LPos;
joachim99@69 1474 s = d->getLineString( d->m_selection.endLine() );
joachim99@69 1475 int lastPosInText = convertToPosInText( s, d->m_selection.endPos(), d->m_pOptionDialog->m_tabSize );
joachim99@69 1476 convertLineCoordsToD3LCoords( d->m_selection.endLine(), lastPosInText, lastD3LIdx, lastD3LPos );
joachim99@69 1477
joachim99@69 1478 //d->m_selection.reset();
joachim99@69 1479 d->m_selection.start( firstD3LIdx, firstD3LPos );
joachim99@69 1480 d->m_selection.end( lastD3LIdx, lastD3LPos );
joachim99@66 1481 }
joachim99@66 1482
joachim99@69 1483 void DiffTextWindow::recalcWordWrap( bool bWordWrap, int wrapLineVectorSize, int nofVisibleColumns )
joachim99@69 1484 {
joachim99@69 1485 if ( d->m_pDiff3LineVector==0 || ! d->m_bPaintingAllowed || !isVisible() )
joachim99@66 1486 {
joachim99@69 1487 d->m_bWordWrap = bWordWrap;
joachim99@69 1488 if (!bWordWrap) d->m_diff3WrapLineVector.resize( 0 );
joachim99@66 1489 return;
joachim99@66 1490 }
joachim99@69 1491
joachim99@69 1492 d->m_bWordWrap = bWordWrap;
joachim99@69 1493
joachim99@66 1494 if ( bWordWrap )
joachim99@69 1495 {
joachim99@69 1496 d->m_diff3WrapLineVector.resize( wrapLineVectorSize );
joachim99@69 1497
joachim99@69 1498 if (nofVisibleColumns<0)
joachim99@69 1499 nofVisibleColumns = getNofVisibleColumns();
joachim99@69 1500 else
joachim99@69 1501 nofVisibleColumns-= d->leftInfoWidth();
joachim99@66 1502 int i;
joachim99@66 1503 int wrapLineIdx = 0;
joachim99@69 1504 int size = d->m_pDiff3LineVector->size();
joachim99@66 1505 for( i=0; i<size; ++i )
joachim99@66 1506 {
joachim99@69 1507 QString s = d->getString( i );
joachim99@69 1508 int linesNeeded = wordWrap( s, nofVisibleColumns, wrapLineVectorSize==0 ? 0 : &d->m_diff3WrapLineVector[wrapLineIdx] );
joachim99@69 1509 Diff3Line& d3l = *(*d->m_pDiff3LineVector)[i];
joachim99@66 1510 if ( d3l.linesNeededForDisplay<linesNeeded )
joachim99@66 1511 {
joachim99@66 1512 d3l.linesNeededForDisplay = linesNeeded;
joachim99@66 1513 }
joachim99@69 1514
joachim99@66 1515 if ( wrapLineVectorSize>0 )
joachim99@66 1516 {
joachim99@66 1517 int j;
joachim99@66 1518 for( j=0; j<d3l.linesNeededForDisplay; ++j, ++wrapLineIdx )
joachim99@66 1519 {
joachim99@69 1520 Diff3WrapLine& d3wl = d->m_diff3WrapLineVector[wrapLineIdx];
joachim99@66 1521 d3wl.diff3LineIndex = i;
joachim99@69 1522 d3wl.pD3L = (*d->m_pDiff3LineVector)[i];
joachim99@66 1523 if ( j>=linesNeeded )
joachim99@66 1524 {
joachim99@66 1525 d3wl.wrapLineOffset=0;
joachim99@66 1526 d3wl.wrapLineLength=0;
joachim99@66 1527 }
joachim99@66 1528 }
joachim99@66 1529 }
joachim99@69 1530 }
joachim99@69 1531
joachim99@66 1532 if ( wrapLineVectorSize>0 )
joachim99@69 1533 {
joachim99@69 1534 d->m_firstLine = min2( d->m_firstLine, wrapLineVectorSize-1 );
joachim99@69 1535 d->m_firstColumn = 0;
joachim99@69 1536 d->m_pDiffTextWindowFrame->setFirstLine( d->m_firstLine );
joachim99@66 1537 }
joachim99@66 1538 }
joachim99@66 1539 else
joachim99@66 1540 {
joachim99@69 1541 d->m_diff3WrapLineVector.resize( 0 );
joachim99@66 1542 }
joachim99@69 1543
joachim99@69 1544 if ( !d->m_selection.isEmpty() && ( !d->m_bWordWrap || wrapLineVectorSize>0 ) )
joachim99@69 1545 {
joachim99@66 1546 // Assume unwrapped coordinates
joachim99@66 1547 //( Why? ->Conversion to unwrapped coords happened a few lines above in this method.
joachim99@66 1548 // Also see KDiff3App::recalcWordWrap() on the role of wrapLineVectorSize)
joachim99@69 1549
joachim99@66 1550 // Wrap them now.
joachim99@69 1551
joachim99@69 1552 // convert the d->m_selection to unwrapped coordinates.
joachim99@66 1553 int firstLine, firstPos;
joachim99@69 1554 convertD3LCoordsToLineCoords( d->m_selection.beginLine(), d->m_selection.beginPos(), firstLine, firstPos );
joachim99@69 1555
joachim99@66 1556 int lastLine, lastPos;
joachim99@69 1557 convertD3LCoordsToLineCoords( d->m_selection.endLine(), d->m_selection.endPos(), lastLine, lastPos );
joachim99@69 1558
joachim99@69 1559 //d->m_selection.reset();
joachim99@69 1560 d->m_selection.start( firstLine, convertToPosOnScreen( d->getLineString( firstLine ), firstPos, d->m_pOptionDialog->m_tabSize ) );
joachim99@69 1561 d->m_selection.end( lastLine, convertToPosOnScreen( d->getLineString( lastLine ),lastPos, d->m_pOptionDialog->m_tabSize ) );
joachim99@69 1562 }
joachim99@66 1563 }
joachim99@66 1564
joachim99@66 1565
joachim99@69 1566 class DiffTextWindowFrameData
joachim99@69 1567 {
joachim99@69 1568 public:
joachim99@69 1569 DiffTextWindow* m_pDiffTextWindow;
joachim99@69 1570 QLineEdit* m_pFileSelection;
joachim99@69 1571 QPushButton* m_pBrowseButton;
joachim99@69 1572 OptionDialog* m_pOptionDialog;
joachim99@69 1573 QLabel* m_pLabel;
joachim99@69 1574 QLabel* m_pTopLine;
joachim99@69 1575 QWidget* m_pTopLineWidget;
joachim99@69 1576 };
joachim99@66 1577
joachim99@69 1578 DiffTextWindowFrame::DiffTextWindowFrame( QWidget* pParent, QStatusBar* pStatusBar, OptionDialog* pOptionDialog, int winIdx )
joachim99@69 1579 : QWidget( pParent )
joachim99@69 1580 {
joachim99@69 1581 d = new DiffTextWindowFrameData;
joachim99@69 1582 d->m_pOptionDialog = pOptionDialog;
joachim99@69 1583 d->m_pTopLineWidget = new QWidget(this);
joachim99@69 1584 d->m_pFileSelection = new QLineEdit(d->m_pTopLineWidget);
joachim99@69 1585 d->m_pBrowseButton = new QPushButton( "...",d->m_pTopLineWidget );
joachim99@69 1586 d->m_pBrowseButton->setFixedWidth( 30 );
joachim99@69 1587 connect(d->m_pBrowseButton,SIGNAL(clicked()), this, SLOT(slotBrowseButtonClicked()));
joachim99@69 1588 connect(d->m_pFileSelection,SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()));
joachim99@66 1589
joachim99@69 1590 d->m_pLabel = new QLabel("A:",d->m_pTopLineWidget);
joachim99@69 1591 d->m_pTopLine = new QLabel(d->m_pTopLineWidget);
joachim99@69 1592 d->m_pDiffTextWindow = 0;
joachim99@69 1593 d->m_pDiffTextWindow = new DiffTextWindow( this, pStatusBar, pOptionDialog, winIdx );
joachim99@70 1594 Q3HBoxLayout* pHL = new Q3HBoxLayout(d->m_pTopLineWidget);
joachim99@69 1595 pHL->setMargin(2);
joachim99@69 1596 pHL->setSpacing(2);
joachim99@51 1597
joachim99@69 1598 pHL->addWidget( d->m_pLabel, 0 );
joachim99@69 1599 pHL->addWidget( d->m_pFileSelection, 1 );
joachim99@69 1600 pHL->addWidget( d->m_pBrowseButton, 0 );
joachim99@69 1601 pHL->addWidget( d->m_pTopLine, 0 );
joachim99@69 1602
joachim99@70 1603 Q3VBoxLayout* pVL = new Q3VBoxLayout( this, 0, 0 );
joachim99@69 1604 pVL->addWidget( d->m_pTopLineWidget, 0 );
joachim99@69 1605 pVL->addWidget( d->m_pDiffTextWindow, 1 );
joachim99@69 1606
joachim99@69 1607 d->m_pDiffTextWindow->installEventFilter( this );
joachim99@69 1608 d->m_pFileSelection->installEventFilter( this );
joachim99@69 1609 d->m_pBrowseButton->installEventFilter( this );
joachim99@69 1610 init();
joachim99@69 1611 }
joachim99@69 1612
joachim99@69 1613 DiffTextWindowFrame::~DiffTextWindowFrame()
joachim99@69 1614 {
joachim99@69 1615 delete d;
joachim99@69 1616 }
joachim99@69 1617
joachim99@69 1618 void DiffTextWindowFrame::init()
joachim99@69 1619 {
joachim99@69 1620 DiffTextWindow* pDTW = d->m_pDiffTextWindow;
joachim99@69 1621 if ( pDTW )
joachim99@69 1622 {
joachim99@69 1623 QString s = pDTW->d->m_filename ;
joachim99@69 1624 d->m_pFileSelection->setText( s );
joachim99@69 1625 QString winId = pDTW->d->m_winIdx==1 ?
joachim99@69 1626 ( pDTW->d->m_bTriple?"A (Base)":"A") :
joachim99@69 1627 ( pDTW->d->m_winIdx==2 ? "B" : "C" );
joachim99@69 1628 d->m_pLabel->setText( winId + ":" );
joachim99@69 1629 }
joachim99@69 1630 }
joachim99@69 1631
joachim99@69 1632 // Search for the first visible line (search loop needed when no line exist for this file.)
joachim99@69 1633 int DiffTextWindow::calcTopLineInFile( int firstLine )
joachim99@69 1634 {
joachim99@69 1635 int l=-1;
joachim99@69 1636 for ( int i = convertLineToDiff3LineIdx(firstLine); i<(int)d->m_pDiff3LineVector->size(); ++i )
joachim99@69 1637 {
joachim99@69 1638 const Diff3Line* d3l = (*d->m_pDiff3LineVector)[i];
joachim99@69 1639 l = d3l->getLineInFile(d->m_winIdx);
joachim99@69 1640 if (l!=-1) break;
joachim99@69 1641 }
joachim99@69 1642 return l;
joachim99@69 1643 }
joachim99@69 1644
joachim99@69 1645 void DiffTextWindowFrame::setFirstLine( int firstLine )
joachim99@69 1646 {
joachim99@69 1647 DiffTextWindow* pDTW = d->m_pDiffTextWindow;
joachim99@69 1648 if ( pDTW && pDTW->d->m_pDiff3LineVector )
joachim99@69 1649 {
joachim99@69 1650 QString s= i18n("Top line");
joachim99@69 1651 int lineNumberWidth = (int)log10((double)pDTW->d->m_size)+1;
joachim99@69 1652
joachim99@69 1653 int l=pDTW->calcTopLineInFile(firstLine);
joachim99@69 1654
joachim99@69 1655 int w = d->m_pTopLine->fontMetrics().width(
joachim99@69 1656 s+" "+QString().fill('0',lineNumberWidth));
joachim99@69 1657 d->m_pTopLine->setMinimumWidth( w );
joachim99@69 1658
joachim99@69 1659 if (l==-1)
joachim99@69 1660 s = i18n("End");
joachim99@69 1661 else
joachim99@69 1662 s += " " + QString::number( l+1 );
joachim99@69 1663
joachim99@69 1664 d->m_pTopLine->setText( s );
joachim99@69 1665 d->m_pTopLine->repaint();
joachim99@69 1666 }
joachim99@69 1667 }
joachim99@69 1668
joachim99@69 1669 DiffTextWindow* DiffTextWindowFrame::getDiffTextWindow()
joachim99@69 1670 {
joachim99@69 1671 return d->m_pDiffTextWindow;
joachim99@69 1672 }
joachim99@69 1673
joachim99@69 1674 bool DiffTextWindowFrame::eventFilter( QObject* o, QEvent* e )
joachim99@69 1675 {
joachim99@69 1676 DiffTextWindow* pDTW = d->m_pDiffTextWindow;
joachim99@69 1677 if ( e->type()==QEvent::FocusIn || e->type()==QEvent::FocusOut )
joachim99@69 1678 {
joachim99@69 1679 QColor c1 = d->m_pOptionDialog->m_bgColor;
joachim99@69 1680 QColor c2 = pDTW->d->m_cThis;
joachim99@69 1681 QPalette p = d->m_pTopLineWidget->palette();
joachim99@69 1682 if ( e->type()==QEvent::FocusOut )
joachim99@69 1683 std::swap(c1,c2);
joachim99@69 1684
joachim99@70 1685 p.setColor(QPalette::Window, c2);
joachim99@70 1686 setPalette( p );
joachim99@69 1687
joachim99@70 1688 p.setColor(QPalette::WindowText, c1);
joachim99@69 1689 d->m_pLabel->setPalette( p );
joachim99@69 1690 d->m_pTopLine->setPalette( p );
joachim99@69 1691 }
joachim99@69 1692 if (o == d->m_pFileSelection && e->type()==QEvent::Drop)
joachim99@69 1693 {
joachim99@69 1694 QDropEvent* d = static_cast<QDropEvent*>(e);
joachim99@69 1695
joachim99@70 1696 if ( Q3UriDrag::canDecode( d ) )
joachim99@69 1697 {
joachim99@69 1698 QStringList lst;
joachim99@70 1699 Q3UriDrag::decodeLocalFiles( d, lst );
joachim99@69 1700
joachim99@69 1701 if ( lst.count() > 0 )
joachim99@69 1702 {
joachim99@69 1703 static_cast<QLineEdit*>(o)->setText( lst[0] );
joachim99@69 1704 static_cast<QLineEdit*>(o)->setFocus();
joachim99@69 1705 emit fileNameChanged( lst[0], pDTW->d->m_winIdx );
joachim99@69 1706 return true;
joachim99@69 1707 }
joachim99@69 1708 }
joachim99@69 1709 /* The following lines work for Qt>4.1 but not for 4.0.x*/
joachim99@69 1710 /*if ( d->mimeData()->hasUrls() )
joachim99@69 1711 {
joachim99@69 1712 QList<QUrl> lst = d->mimeData()->urls();
joachim99@69 1713 if ( !lst.empty() )
joachim99@69 1714 {
joachim99@69 1715 static_cast<QLineEdit*>(o)->setText( lst[0].toLocalFile() );
joachim99@69 1716 static_cast<QLineEdit*>(o)->setFocus();
joachim99@69 1717 emit fileNameChanged( lst[0], pDTW->d->m_winIdx );
joachim99@69 1718 return true;
joachim99@69 1719 }
joachim99@69 1720 }*/
joachim99@69 1721 }
joachim99@69 1722 return false;
joachim99@69 1723 }
joachim99@69 1724
joachim99@70 1725 void DiffTextWindowFrame::paintEvent(QPaintEvent*)
joachim99@70 1726 {
joachim99@70 1727 QPainter p(this);
joachim99@70 1728 p.fillRect( rect(), palette().window() );
joachim99@70 1729 }
joachim99@70 1730
joachim99@69 1731 void DiffTextWindowFrame::slotReturnPressed()
joachim99@69 1732 {
joachim99@69 1733 DiffTextWindow* pDTW = d->m_pDiffTextWindow;
joachim99@69 1734 if ( pDTW->d->m_filename != d->m_pFileSelection->text() )
joachim99@69 1735 {
joachim99@69 1736 emit fileNameChanged( d->m_pFileSelection->text(), pDTW->d->m_winIdx );
joachim99@69 1737 }
joachim99@69 1738 }
joachim99@69 1739
joachim99@69 1740 void DiffTextWindowFrame::slotBrowseButtonClicked()
joachim99@69 1741 {
joachim99@69 1742 QString current = d->m_pFileSelection->text();
joachim99@69 1743
joachim99@69 1744 KURL newURL = KFileDialog::getOpenURL( current, 0, this);
joachim99@69 1745 if ( !newURL.isEmpty() )
joachim99@69 1746 {
joachim99@69 1747 DiffTextWindow* pDTW = d->m_pDiffTextWindow;
joachim99@69 1748 emit fileNameChanged( newURL.url(), pDTW->d->m_winIdx );
joachim99@69 1749 }
joachim99@69 1750 }
joachim99@68 1751
joachim99@70 1752 Q3CString encodeString( const QString& s )
joachim99@51 1753 {
joachim99@68 1754 QTextCodec* c = QTextCodec::codecForLocale();
joachim99@68 1755 if (c!=0)
joachim99@68 1756 return c->fromUnicode( s );
joachim99@51 1757 else
joachim99@70 1758 return Q3CString( s.latin1() );
joachim99@51 1759 }
joachim99@69 1760
joachim99@70 1761 //#include "difftextwindow.moc"