annotate kdiff3/src/mergeresultwindow.cpp @ 68:d7cafcda8c99

KDiff3 0.9.87
author joachim99
date Mon, 31 Jan 2005 22:30:47 +0000
parents efe33e938730
children 8febbfb1148c
rev   line source
joachim99@8 1 /***************************************************************************
joachim99@8 2 mergeresultwindow.cpp - description
joachim99@8 3 -------------------
joachim99@8 4 begin : Sun Apr 14 2002
joachim99@58 5 copyright : (C) 2002-2004 by Joachim Eibl
joachim99@8 6 email : joachim.eibl@gmx.de
joachim99@8 7 ***************************************************************************/
joachim99@8 8
joachim99@8 9 /***************************************************************************
joachim99@8 10 * *
joachim99@8 11 * This program is free software; you can redistribute it and/or modify *
joachim99@8 12 * it under the terms of the GNU General Public License as published by *
joachim99@8 13 * the Free Software Foundation; either version 2 of the License, or *
joachim99@8 14 * (at your option) any later version. *
joachim99@8 15 * *
joachim99@8 16 ***************************************************************************/
joachim99@8 17
joachim99@8 18 #include "diff.h"
joachim99@8 19 #include <stdio.h>
joachim99@8 20 #include <qpainter.h>
joachim99@8 21 #include <qapplication.h>
joachim99@8 22 #include <qclipboard.h>
joachim99@8 23 #include <qdir.h>
joachim99@8 24 #include <qfile.h>
joachim99@8 25 #include <qcursor.h>
joachim99@8 26 #include <qpopupmenu.h>
joachim99@8 27 #include <optiondialog.h>
joachim99@8 28 #include <klocale.h>
joachim99@8 29 #include <kmessagebox.h>
joachim99@58 30 #include <iostream>
joachim99@66 31 #include <qstatusbar.h>
joachim99@8 32
joachim99@8 33 int g_bAutoSolve = true;
joachim99@8 34
joachim99@53 35 #undef leftInfoWidth
joachim99@8 36 #define leftInfoWidth 3
joachim99@8 37
joachim99@8 38 MergeResultWindow::MergeResultWindow(
joachim99@8 39 QWidget* pParent,
joachim99@66 40 OptionDialog* pOptionDialog,
joachim99@66 41 QStatusBar* pStatusBar
joachim99@8 42 )
joachim99@8 43 : QWidget( pParent, 0, WRepaintNoErase )
joachim99@8 44 {
joachim99@8 45 setFocusPolicy( QWidget::ClickFocus );
joachim99@8 46
joachim99@8 47 m_firstLine = 0;
joachim99@8 48 m_firstColumn = 0;
joachim99@8 49 m_nofColumns = 0;
joachim99@8 50 m_nofLines = 0;
joachim99@58 51 m_totalSize = 0;
joachim99@8 52 m_bMyUpdate = false;
joachim99@8 53 m_bInsertMode = true;
joachim99@8 54 m_scrollDeltaX = 0;
joachim99@8 55 m_scrollDeltaY = 0;
joachim99@8 56 m_bModified = false;
joachim99@8 57
joachim99@8 58 m_fileName = "";
joachim99@8 59 m_pldA = 0;
joachim99@8 60 m_pldB = 0;
joachim99@8 61 m_pldC = 0;
joachim99@8 62
joachim99@8 63 m_pDiff3LineList = 0;
joachim99@8 64 m_pTotalDiffStatus = 0;
joachim99@66 65 m_pStatusBar = pStatusBar;
joachim99@58 66
joachim99@8 67 m_pOptionDialog = pOptionDialog;
joachim99@58 68 m_bPaintingAllowed = false;
joachim99@8 69
joachim99@8 70 m_cursorXPos=0;
joachim99@8 71 m_cursorOldXPos=0;
joachim99@8 72 m_cursorYPos=0;
joachim99@8 73 m_bCursorOn = true;
joachim99@8 74 connect( &m_cursorTimer, SIGNAL(timeout()), this, SLOT( slotCursorUpdate() ) );
joachim99@8 75 m_cursorTimer.start( 500 /*ms*/, true /*single shot*/ );
joachim99@8 76 m_selection.reset();
joachim99@8 77
joachim99@8 78 setMinimumSize( QSize(20,20) );
joachim99@27 79 setFont( m_pOptionDialog->m_font );
joachim99@8 80 }
joachim99@8 81
joachim99@8 82 void MergeResultWindow::init(
joachim99@8 83 const LineData* pLineDataA,
joachim99@8 84 const LineData* pLineDataB,
joachim99@8 85 const LineData* pLineDataC,
joachim99@8 86 const Diff3LineList* pDiff3LineList,
joachim99@66 87 TotalDiffStatus* pTotalDiffStatus,
joachim99@8 88 QString fileName
joachim99@8 89 )
joachim99@8 90 {
joachim99@8 91 m_firstLine = 0;
joachim99@8 92 m_firstColumn = 0;
joachim99@8 93 m_nofColumns = 0;
joachim99@8 94 m_nofLines = 0;
joachim99@8 95 m_bMyUpdate = false;
joachim99@8 96 m_bInsertMode = true;
joachim99@8 97 m_scrollDeltaX = 0;
joachim99@8 98 m_scrollDeltaY = 0;
joachim99@8 99 m_bModified = false;
joachim99@8 100
joachim99@8 101 m_fileName = fileName;
joachim99@8 102 m_pldA = pLineDataA;
joachim99@8 103 m_pldB = pLineDataB;
joachim99@8 104 m_pldC = pLineDataC;
joachim99@8 105
joachim99@8 106 m_pDiff3LineList = pDiff3LineList;
joachim99@8 107 m_pTotalDiffStatus = pTotalDiffStatus;
joachim99@8 108
joachim99@8 109 m_selection.reset();
joachim99@8 110 m_cursorXPos=0;
joachim99@8 111 m_cursorOldXPos=0;
joachim99@8 112 m_cursorYPos=0;
joachim99@8 113
joachim99@8 114 merge( g_bAutoSolve, -1 );
joachim99@8 115 g_bAutoSolve = true;
joachim99@8 116 update();
joachim99@66 117 updateSourceMask();
joachim99@68 118
joachim99@68 119 int wsc;
joachim99@68 120 m_pStatusBar->message( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
joachim99@68 121 .arg(getNrOfUnsolvedConflicts(&wsc)).arg(wsc) );
joachim99@8 122 }
joachim99@8 123
joachim99@8 124
joachim99@8 125 // Calculate the merge information for the given Diff3Line.
joachim99@8 126 // Results will be stored in mergeDetails, bConflict, bLineRemoved and src.
joachim99@8 127 void mergeOneLine(
joachim99@8 128 const Diff3Line& d, e_MergeDetails& mergeDetails, bool& bConflict,
joachim99@8 129 bool& bLineRemoved, int& src, bool bTwoInputs
joachim99@8 130 )
joachim99@8 131 {
joachim99@8 132 mergeDetails = eDefault;
joachim99@8 133 bConflict = false;
joachim99@8 134 bLineRemoved = false;
joachim99@8 135 src = 0;
joachim99@8 136
joachim99@8 137 if ( bTwoInputs ) // Only two input files
joachim99@8 138 {
joachim99@8 139 if ( d.lineA!=-1 && d.lineB!=-1 )
joachim99@8 140 {
joachim99@8 141 if ( d.pFineAB == 0 )
joachim99@8 142 {
joachim99@8 143 mergeDetails = eNoChange; src = A;
joachim99@8 144 }
joachim99@8 145 else
joachim99@8 146 {
joachim99@8 147 mergeDetails = eBChanged; bConflict = true;
joachim99@8 148 }
joachim99@8 149 }
joachim99@8 150 else
joachim99@8 151 {
joachim99@8 152 if ( d.lineA!=-1 && d.lineB==-1 )
joachim99@8 153 {
joachim99@8 154 mergeDetails = eBDeleted; bConflict = true;
joachim99@8 155 }
joachim99@8 156 else if ( d.lineA==-1 && d.lineB!=-1 )
joachim99@8 157 {
joachim99@8 158 mergeDetails = eBDeleted; bConflict = true;
joachim99@8 159 }
joachim99@8 160 }
joachim99@8 161 return;
joachim99@8 162 }
joachim99@8 163
joachim99@8 164 // A is base.
joachim99@8 165 if ( d.lineA!=-1 && d.lineB!=-1 && d.lineC!=-1 )
joachim99@8 166 {
joachim99@8 167 if ( d.pFineAB == 0 && d.pFineBC == 0 && d.pFineCA == 0)
joachim99@8 168 {
joachim99@8 169 mergeDetails = eNoChange; src = A;
joachim99@8 170 }
joachim99@8 171 else if( d.pFineAB == 0 && d.pFineBC != 0 && d.pFineCA != 0 )
joachim99@8 172 {
joachim99@8 173 mergeDetails = eCChanged; src = C;
joachim99@8 174 }
joachim99@8 175 else if( d.pFineAB != 0 && d.pFineBC != 0 && d.pFineCA == 0 )
joachim99@8 176 {
joachim99@8 177 mergeDetails = eBChanged; src = B;
joachim99@8 178 }
joachim99@8 179 else if( d.pFineAB != 0 && d.pFineBC == 0 && d.pFineCA != 0 )
joachim99@8 180 {
joachim99@8 181 mergeDetails = eBCChangedAndEqual; src = C;
joachim99@8 182 }
joachim99@8 183 else if( d.pFineAB != 0 && d.pFineBC != 0 && d.pFineCA != 0 )
joachim99@8 184 {
joachim99@8 185 mergeDetails = eBCChanged; bConflict = true;
joachim99@8 186 }
joachim99@8 187 else
joachim99@8 188 assert(false);
joachim99@8 189 }
joachim99@8 190 else if ( d.lineA!=-1 && d.lineB!=-1 && d.lineC==-1 )
joachim99@8 191 {
joachim99@8 192 if( d.pFineAB != 0 )
joachim99@8 193 {
joachim99@8 194 mergeDetails = eBChanged_CDeleted; bConflict = true;
joachim99@8 195 }
joachim99@8 196 else
joachim99@8 197 {
joachim99@8 198 mergeDetails = eCDeleted; bLineRemoved = true; src = C;
joachim99@8 199 }
joachim99@8 200 }
joachim99@8 201 else if ( d.lineA!=-1 && d.lineB==-1 && d.lineC!=-1 )
joachim99@8 202 {
joachim99@8 203 if( d.pFineCA != 0 )
joachim99@8 204 {
joachim99@8 205 mergeDetails = eCChanged_BDeleted; bConflict = true;
joachim99@8 206 }
joachim99@8 207 else
joachim99@8 208 {
joachim99@8 209 mergeDetails = eBDeleted; bLineRemoved = true; src = B;
joachim99@8 210 }
joachim99@8 211 }
joachim99@8 212 else if ( d.lineA==-1 && d.lineB!=-1 && d.lineC!=-1 )
joachim99@8 213 {
joachim99@8 214 if( d.pFineBC != 0 )
joachim99@8 215 {
joachim99@8 216 mergeDetails = eBCAdded; bConflict = true;
joachim99@8 217 }
joachim99@8 218 else // B==C
joachim99@8 219 {
joachim99@8 220 mergeDetails = eBCAddedAndEqual; src = C;
joachim99@8 221 }
joachim99@8 222 }
joachim99@8 223 else if ( d.lineA==-1 && d.lineB==-1 && d.lineC!= -1 )
joachim99@8 224 {
joachim99@8 225 mergeDetails = eCAdded; src = C;
joachim99@8 226 }
joachim99@8 227 else if ( d.lineA==-1 && d.lineB!=-1 && d.lineC== -1 )
joachim99@8 228 {
joachim99@8 229 mergeDetails = eBAdded; src = B;
joachim99@8 230 }
joachim99@8 231 else if ( d.lineA!=-1 && d.lineB==-1 && d.lineC==-1 )
joachim99@8 232 {
joachim99@8 233 mergeDetails = eBCDeleted; bLineRemoved = true; src = C;
joachim99@8 234 }
joachim99@8 235 else
joachim99@8 236 assert(false);
joachim99@8 237 }
joachim99@8 238
joachim99@8 239 bool MergeResultWindow::sameKindCheck( const MergeLine& ml1, const MergeLine& ml2 )
joachim99@8 240 {
joachim99@8 241 if ( ml1.bConflict && ml2.bConflict )
joachim99@8 242 {
joachim99@51 243 // Both lines have conflicts: If one is only a white space conflict and
joachim99@51 244 // the other one is a real conflict, then this line returns false.
joachim99@8 245 return ml1.id3l->bAEqC == ml2.id3l->bAEqC && ml1.id3l->bAEqB == ml2.id3l->bAEqB;
joachim99@8 246 }
joachim99@8 247 else
joachim99@8 248 return (
joachim99@8 249 !ml1.bConflict && !ml2.bConflict && ml1.bDelta && ml2.bDelta && ml1.srcSelect == ml2.srcSelect ||
joachim99@8 250 !ml1.bDelta && !ml2.bDelta
joachim99@8 251 );
joachim99@8 252 }
joachim99@8 253
joachim99@51 254 void MergeResultWindow::merge(bool bAutoSolve, int defaultSelector, bool bConflictsOnly, bool bWhiteSpaceOnly )
joachim99@51 255 {
joachim99@51 256 if ( !bConflictsOnly )
joachim99@8 257 {
joachim99@51 258 if(m_bModified)
joachim99@8 259 {
joachim99@51 260 int result = KMessageBox::warningYesNo(this,
joachim99@51 261 i18n("The output has been modified.\n"
joachim99@51 262 "If you continue your changes will be lost."),
joachim99@51 263 i18n("Warning"), i18n("C&ontinue"), i18n("&Cancel"));
joachim99@51 264 if ( result==KMessageBox::No )
joachim99@51 265 return;
joachim99@8 266 }
joachim99@8 267
joachim99@51 268 m_mergeLineList.clear();
joachim99@58 269 m_totalSize = 0;
joachim99@51 270 int lineIdx = 0;
joachim99@51 271 Diff3LineList::const_iterator it;
joachim99@51 272 for( it=m_pDiff3LineList->begin(); it!=m_pDiff3LineList->end(); ++it, ++lineIdx )
joachim99@8 273 {
joachim99@51 274 const Diff3Line& d = *it;
joachim99@51 275
joachim99@51 276 MergeLine ml;
joachim99@51 277 bool bLineRemoved;
joachim99@51 278 mergeOneLine( d, ml.mergeDetails, ml.bConflict, bLineRemoved, ml.srcSelect, m_pldC==0 );
joachim99@51 279
joachim99@51 280 // Automatic solving for only whitespace changes.
joachim99@51 281 if ( ml.bConflict &&
joachim99@51 282 ( m_pldC==0 && (d.bAEqB || d.bWhiteLineA && d.bWhiteLineB) ||
joachim99@51 283 m_pldC!=0 && (d.bAEqB && d.bAEqC || d.bWhiteLineA && d.bWhiteLineB && d.bWhiteLineC ) ) )
joachim99@51 284 {
joachim99@51 285 ml.bWhiteSpaceConflict = true;
joachim99@51 286 }
joachim99@51 287
joachim99@51 288 ml.d3lLineIdx = lineIdx;
joachim99@51 289 ml.bDelta = ml.srcSelect != A;
joachim99@51 290 ml.id3l = it;
joachim99@51 291 ml.srcRangeLength = 1;
joachim99@51 292
joachim99@51 293 MergeLine* back = m_mergeLineList.empty() ? 0 : &m_mergeLineList.back();
joachim99@51 294
joachim99@51 295 bool bSame = back!=0 && sameKindCheck( ml, *back );
joachim99@51 296 if( bSame )
joachim99@51 297 {
joachim99@51 298 ++back->srcRangeLength;
joachim99@51 299 if ( back->bWhiteSpaceConflict && !ml.bWhiteSpaceConflict )
joachim99@51 300 back->bWhiteSpaceConflict = false;
joachim99@51 301 }
joachim99@51 302 else
joachim99@51 303 {
joachim99@51 304 if (back!=0 && back->bWhiteSpaceConflict )
joachim99@51 305 {
joachim99@51 306 if ( m_pldC==0 && m_pOptionDialog->m_whiteSpace2FileMergeDefault != 0 ) // Only two inputs
joachim99@51 307 {
joachim99@51 308 back->srcSelect = m_pOptionDialog->m_whiteSpace2FileMergeDefault;
joachim99@51 309 back->bConflict = false;
joachim99@51 310 }
joachim99@51 311 else if ( m_pldC!=0 && m_pOptionDialog->m_whiteSpace3FileMergeDefault != 0 )
joachim99@51 312 {
joachim99@51 313 back->srcSelect = m_pOptionDialog->m_whiteSpace3FileMergeDefault;
joachim99@51 314 back->bConflict = false;
joachim99@51 315 }
joachim99@51 316 }
joachim99@58 317 ml.mergeEditLineList.setTotalSizePtr(&m_totalSize);
joachim99@51 318 m_mergeLineList.push_back( ml );
joachim99@51 319 }
joachim99@51 320
joachim99@51 321 if ( ! ml.bConflict )
joachim99@51 322 {
joachim99@51 323 MergeLine& tmpBack = m_mergeLineList.back();
joachim99@51 324 MergeEditLine mel;
joachim99@51 325 mel.setSource( ml.srcSelect, ml.id3l, bLineRemoved );
joachim99@51 326 tmpBack.mergeEditLineList.push_back(mel);
joachim99@51 327 }
joachim99@51 328 else if ( back==0 || ! back->bConflict || !bSame )
joachim99@51 329 {
joachim99@51 330 MergeLine& tmpBack = m_mergeLineList.back();
joachim99@51 331 MergeEditLine mel;
joachim99@51 332 mel.setConflict();
joachim99@51 333 tmpBack.mergeEditLineList.push_back(mel);
joachim99@51 334 }
joachim99@8 335 }
joachim99@8 336 }
joachim99@8 337
joachim99@8 338 if ( !bAutoSolve )
joachim99@8 339 {
joachim99@8 340 // Change all auto selections
joachim99@8 341 MergeLineList::iterator mlIt;
joachim99@8 342 for( mlIt=m_mergeLineList.begin(); mlIt!=m_mergeLineList.end(); ++mlIt )
joachim99@8 343 {
joachim99@8 344 MergeLine& ml = *mlIt;
joachim99@51 345 bool bConflict = ml.mergeEditLineList.empty() || ml.mergeEditLineList.begin()->isConflict();
joachim99@51 346 if ( ml.bDelta && ( !bConflictsOnly || bConflict ) && (!bWhiteSpaceOnly || ml.bWhiteSpaceConflict ))
joachim99@8 347 {
joachim99@8 348 ml.mergeEditLineList.clear();
joachim99@8 349 if ( defaultSelector==-1 && ml.bDelta )
joachim99@8 350 {
joachim99@8 351 MergeEditLine mel;
joachim99@8 352 mel.setConflict();
joachim99@8 353 ml.bConflict = true;
joachim99@8 354 ml.mergeEditLineList.push_back(mel);
joachim99@8 355 }
joachim99@8 356 else
joachim99@8 357 {
joachim99@8 358 Diff3LineList::const_iterator d3llit=ml.id3l;
joachim99@8 359 int j;
joachim99@8 360
joachim99@8 361 for( j=0; j<ml.srcRangeLength; ++j )
joachim99@8 362 {
joachim99@8 363 MergeEditLine mel;
joachim99@8 364 mel.setSource( defaultSelector, d3llit, false );
joachim99@51 365
joachim99@8 366 int srcLine = defaultSelector==1 ? d3llit->lineA :
joachim99@8 367 defaultSelector==2 ? d3llit->lineB :
joachim99@8 368 defaultSelector==3 ? d3llit->lineC : -1;
joachim99@51 369
joachim99@8 370 if ( srcLine != -1 )
joachim99@8 371 {
joachim99@8 372 ml.mergeEditLineList.push_back(mel);
joachim99@8 373 }
joachim99@8 374
joachim99@8 375 ++d3llit;
joachim99@8 376 }
joachim99@8 377
joachim99@8 378 if ( ml.mergeEditLineList.empty() ) // Make a line nevertheless
joachim99@8 379 {
joachim99@8 380 MergeEditLine mel;
joachim99@8 381 mel.setSource( defaultSelector, ml.id3l, false );
joachim99@8 382 mel.setRemoved( defaultSelector );
joachim99@8 383 ml.mergeEditLineList.push_back(mel);
joachim99@8 384 }
joachim99@8 385 }
joachim99@8 386 }
joachim99@8 387 }
joachim99@8 388 }
joachim99@8 389
joachim99@8 390 MergeLineList::iterator mlIt;
joachim99@8 391 for( mlIt=m_mergeLineList.begin(); mlIt!=m_mergeLineList.end(); ++mlIt )
joachim99@8 392 {
joachim99@8 393 MergeLine& ml = *mlIt;
joachim99@8 394 // Remove all lines that are empty, because no src lines are there.
joachim99@8 395
joachim99@8 396 int oldSrcLine = -1;
joachim99@8 397 int oldSrc = -1;
joachim99@8 398 MergeEditLineList::iterator melIt;
joachim99@8 399 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); )
joachim99@8 400 {
joachim99@8 401 MergeEditLine& mel = *melIt;
joachim99@8 402 int melsrc = mel.src();
joachim99@8 403
joachim99@8 404 int srcLine = melsrc==1 ? mel.id3l()->lineA :
joachim99@8 405 melsrc==2 ? mel.id3l()->lineB :
joachim99@8 406 melsrc==3 ? mel.id3l()->lineC : -1;
joachim99@8 407
joachim99@8 408 if ( srcLine == -1 && oldSrcLine==-1 && oldSrc == melsrc )
joachim99@8 409 melIt = ml.mergeEditLineList.erase( melIt );
joachim99@8 410 else
joachim99@8 411 ++melIt;
joachim99@8 412
joachim99@8 413 oldSrcLine = srcLine;
joachim99@8 414 oldSrc = melsrc;
joachim99@8 415 }
joachim99@8 416 }
joachim99@8 417
joachim99@66 418 int nrOfSolvedConflicts = 0;
joachim99@66 419 int nrOfUnsolvedConflicts = 0;
joachim99@66 420 int nrOfWhiteSpaceConflicts = 0;
joachim99@66 421
joachim99@66 422 MergeLineList::iterator i;
joachim99@66 423 for ( i = m_mergeLineList.begin(); i!=m_mergeLineList.end(); ++i )
joachim99@66 424 {
joachim99@66 425 if ( i->bConflict )
joachim99@66 426 ++nrOfUnsolvedConflicts;
joachim99@66 427 else if ( i->bDelta )
joachim99@66 428 ++nrOfSolvedConflicts;
joachim99@68 429
joachim99@66 430 if ( i->bWhiteSpaceConflict )
joachim99@66 431 ++nrOfWhiteSpaceConflicts;
joachim99@66 432 }
joachim99@68 433
joachim99@66 434 m_pTotalDiffStatus->nofUnsolvedConflicts = nrOfUnsolvedConflicts;
joachim99@66 435 m_pTotalDiffStatus->nofSolvedConflicts = nrOfSolvedConflicts;
joachim99@66 436 m_pTotalDiffStatus->nofWhitespaceConflicts = nrOfWhiteSpaceConflicts;
joachim99@66 437
joachim99@66 438
joachim99@8 439 m_cursorXPos=0;
joachim99@8 440 m_cursorOldXPos=0;
joachim99@8 441 m_cursorYPos=0;
joachim99@66 442 //m_firstLine = 0; // Must not set line/column without scrolling there
joachim99@66 443 //m_firstColumn = 0;
joachim99@51 444
joachim99@8 445 m_bModified = false;
joachim99@66 446
joachim99@66 447 m_currentMergeLineIt = m_mergeLineList.begin();
joachim99@66 448 slotGoTop();
joachim99@66 449
joachim99@8 450 updateAvailabilities();
joachim99@8 451 update();
joachim99@8 452 }
joachim99@8 453
joachim99@8 454 void MergeResultWindow::setFirstLine(int firstLine)
joachim99@8 455 {
joachim99@8 456 m_firstLine = max2(0,firstLine);
joachim99@8 457 update();
joachim99@8 458 }
joachim99@8 459
joachim99@8 460 void MergeResultWindow::setFirstColumn(int firstCol)
joachim99@8 461 {
joachim99@8 462 m_firstColumn = max2(0,firstCol);
joachim99@8 463 update();
joachim99@8 464 }
joachim99@8 465
joachim99@8 466 int MergeResultWindow::getNofColumns()
joachim99@8 467 {
joachim99@8 468 return m_nofColumns;
joachim99@8 469 }
joachim99@8 470
joachim99@8 471 int MergeResultWindow::getNofLines()
joachim99@8 472 {
joachim99@58 473 return m_totalSize;
joachim99@8 474 }
joachim99@8 475
joachim99@8 476 int MergeResultWindow::getNofVisibleColumns()
joachim99@8 477 {
joachim99@8 478 QFontMetrics fm = fontMetrics();
joachim99@8 479 return width()/fm.width('W')-4;
joachim99@8 480 }
joachim99@8 481
joachim99@8 482 int MergeResultWindow::getNofVisibleLines()
joachim99@8 483 {
joachim99@8 484 QFontMetrics fm = fontMetrics();
joachim99@8 485 return (height()-3)/fm.height()-2;
joachim99@8 486 }
joachim99@8 487
joachim99@8 488 void MergeResultWindow::resizeEvent( QResizeEvent* e )
joachim99@8 489 {
joachim99@8 490 QWidget::resizeEvent(e);
joachim99@8 491 emit resizeSignal();
joachim99@8 492 }
joachim99@8 493
joachim99@8 494 // Go to prev/next delta/conflict or first/last delta.
joachim99@8 495 void MergeResultWindow::go( e_Direction eDir, e_EndPoint eEndPoint )
joachim99@8 496 {
joachim99@8 497 assert( eDir==eUp || eDir==eDown );
joachim99@8 498 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@51 499 bool bSkipWhiteConflicts = ! m_pOptionDialog->m_bShowWhiteSpace;
joachim99@8 500 if( eEndPoint==eEnd )
joachim99@8 501 {
joachim99@8 502 if (eDir==eUp) i = m_mergeLineList.begin(); // first mergeline
joachim99@8 503 else i = --m_mergeLineList.end(); // last mergeline
joachim99@8 504
joachim99@51 505 while ( i!=m_mergeLineList.end() && ! i->bDelta )
joachim99@8 506 {
joachim99@8 507 if ( eDir==eUp ) ++i; // search downwards
joachim99@8 508 else --i; // search upwards
joachim99@8 509 }
joachim99@8 510 }
joachim99@8 511 else if ( eEndPoint == eDelta && i!=m_mergeLineList.end())
joachim99@8 512 {
joachim99@8 513 do
joachim99@8 514 {
joachim99@8 515 if ( eDir==eUp ) --i;
joachim99@8 516 else ++i;
joachim99@8 517 }
joachim99@51 518 while ( i!=m_mergeLineList.end() && ( i->bDelta == false || bSkipWhiteConflicts && i->bWhiteSpaceConflict ) );
joachim99@8 519 }
joachim99@51 520 else if ( eEndPoint == eConflict && i!=m_mergeLineList.end() )
joachim99@8 521 {
joachim99@8 522 do
joachim99@8 523 {
joachim99@8 524 if ( eDir==eUp ) --i;
joachim99@8 525 else ++i;
joachim99@8 526 }
joachim99@51 527 while ( i!=m_mergeLineList.end() && (i->bConflict == false || bSkipWhiteConflicts && i->bWhiteSpaceConflict ) );
joachim99@8 528 }
joachim99@51 529 else if ( i!=m_mergeLineList.end() && eEndPoint == eUnsolvedConflict )
joachim99@8 530 {
joachim99@8 531 do
joachim99@8 532 {
joachim99@8 533 if ( eDir==eUp ) --i;
joachim99@8 534 else ++i;
joachim99@8 535 }
joachim99@8 536 while ( i!=m_mergeLineList.end() && ! i->mergeEditLineList.begin()->isConflict() );
joachim99@8 537 }
joachim99@8 538
joachim99@53 539 if ( isVisible() )
joachim99@53 540 setFocus();
joachim99@68 541
joachim99@66 542 setFastSelector( i );
joachim99@8 543 }
joachim99@8 544
joachim99@8 545 bool MergeResultWindow::isDeltaAboveCurrent()
joachim99@8 546 {
joachim99@51 547 bool bSkipWhiteConflicts = ! m_pOptionDialog->m_bShowWhiteSpace;
joachim99@66 548 if (m_mergeLineList.empty()) return false;
joachim99@8 549 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@66 550 if (i == m_mergeLineList.begin()) return false;
joachim99@66 551 do
joachim99@8 552 {
joachim99@66 553 --i;
joachim99@51 554 if ( i->bDelta && !( bSkipWhiteConflicts && i->bWhiteSpaceConflict ) ) return true;
joachim99@68 555 }
joachim99@66 556 while (i!=m_mergeLineList.begin());
joachim99@68 557
joachim99@8 558 return false;
joachim99@8 559 }
joachim99@8 560
joachim99@8 561 bool MergeResultWindow::isDeltaBelowCurrent()
joachim99@8 562 {
joachim99@51 563 bool bSkipWhiteConflicts = ! m_pOptionDialog->m_bShowWhiteSpace;
joachim99@66 564 if (m_mergeLineList.empty()) return false;
joachim99@68 565
joachim99@8 566 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@66 567 if (i!=m_mergeLineList.end())
joachim99@8 568 {
joachim99@66 569 ++i;
joachim99@66 570 for( ; i!=m_mergeLineList.end(); ++i )
joachim99@66 571 {
joachim99@66 572 if ( i->bDelta && !( bSkipWhiteConflicts && i->bWhiteSpaceConflict ) ) return true;
joachim99@66 573 }
joachim99@8 574 }
joachim99@8 575 return false;
joachim99@8 576 }
joachim99@8 577
joachim99@8 578 bool MergeResultWindow::isConflictAboveCurrent()
joachim99@8 579 {
joachim99@66 580 if (m_mergeLineList.empty()) return false;
joachim99@8 581 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@66 582 if (i == m_mergeLineList.begin()) return false;
joachim99@68 583
joachim99@66 584 do
joachim99@8 585 {
joachim99@66 586 --i;
joachim99@8 587 if ( i->bConflict ) return true;
joachim99@66 588 }
joachim99@66 589 while (i!=m_mergeLineList.begin());
joachim99@66 590
joachim99@8 591 return false;
joachim99@8 592 }
joachim99@8 593
joachim99@8 594 bool MergeResultWindow::isConflictBelowCurrent()
joachim99@8 595 {
joachim99@8 596 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@66 597 if (m_mergeLineList.empty()) return false;
joachim99@66 598
joachim99@66 599 if (i!=m_mergeLineList.end())
joachim99@8 600 {
joachim99@66 601 ++i;
joachim99@66 602 for( ; i!=m_mergeLineList.end(); ++i )
joachim99@66 603 {
joachim99@66 604 if ( i->bConflict ) return true;
joachim99@66 605 }
joachim99@8 606 }
joachim99@8 607 return false;
joachim99@8 608 }
joachim99@8 609
joachim99@8 610 bool MergeResultWindow::isUnsolvedConflictAboveCurrent()
joachim99@8 611 {
joachim99@66 612 if (m_mergeLineList.empty()) return false;
joachim99@8 613 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@66 614 if (i == m_mergeLineList.begin()) return false;
joachim99@66 615
joachim99@66 616 do
joachim99@8 617 {
joachim99@66 618 --i;
joachim99@8 619 if ( i->mergeEditLineList.begin()->isConflict() ) return true;
joachim99@66 620 }
joachim99@66 621 while (i!=m_mergeLineList.begin());
joachim99@66 622
joachim99@8 623 return false;
joachim99@8 624 }
joachim99@8 625
joachim99@8 626 bool MergeResultWindow::isUnsolvedConflictBelowCurrent()
joachim99@8 627 {
joachim99@8 628 MergeLineList::iterator i = m_currentMergeLineIt;
joachim99@66 629 if (m_mergeLineList.empty()) return false;
joachim99@66 630
joachim99@66 631 if (i!=m_mergeLineList.end())
joachim99@8 632 {
joachim99@66 633 ++i;
joachim99@66 634 for( ; i!=m_mergeLineList.end(); ++i )
joachim99@66 635 {
joachim99@66 636 if ( i->mergeEditLineList.begin()->isConflict() ) return true;
joachim99@66 637 }
joachim99@8 638 }
joachim99@8 639 return false;
joachim99@8 640 }
joachim99@8 641
joachim99@8 642 void MergeResultWindow::slotGoTop()
joachim99@8 643 {
joachim99@8 644 go( eUp, eEnd );
joachim99@8 645 }
joachim99@8 646
joachim99@8 647 void MergeResultWindow::slotGoCurrent()
joachim99@8 648 {
joachim99@8 649 setFastSelector( m_currentMergeLineIt );
joachim99@8 650 }
joachim99@8 651
joachim99@8 652 void MergeResultWindow::slotGoBottom()
joachim99@8 653 {
joachim99@8 654 go( eDown, eEnd );
joachim99@8 655 }
joachim99@8 656
joachim99@8 657 void MergeResultWindow::slotGoPrevDelta()
joachim99@8 658 {
joachim99@8 659 go( eUp, eDelta );
joachim99@8 660 }
joachim99@8 661
joachim99@8 662 void MergeResultWindow::slotGoNextDelta()
joachim99@8 663 {
joachim99@8 664 go( eDown, eDelta );
joachim99@8 665 }
joachim99@8 666
joachim99@8 667 void MergeResultWindow::slotGoPrevConflict()
joachim99@8 668 {
joachim99@8 669 go( eUp, eConflict );
joachim99@8 670 }
joachim99@8 671
joachim99@8 672 void MergeResultWindow::slotGoNextConflict()
joachim99@8 673 {
joachim99@8 674 go( eDown, eConflict );
joachim99@8 675 }
joachim99@8 676
joachim99@8 677 void MergeResultWindow::slotGoPrevUnsolvedConflict()
joachim99@8 678 {
joachim99@8 679 go( eUp, eUnsolvedConflict );
joachim99@8 680 }
joachim99@8 681
joachim99@8 682 void MergeResultWindow::slotGoNextUnsolvedConflict()
joachim99@8 683 {
joachim99@8 684 go( eDown, eUnsolvedConflict );
joachim99@8 685 }
joachim99@8 686
joachim99@8 687 /** The line is given as a index in the Diff3LineList.
joachim99@8 688 The function calculates the corresponding iterator. */
joachim99@8 689 void MergeResultWindow::slotSetFastSelectorLine( int line )
joachim99@8 690 {
joachim99@8 691 MergeLineList::iterator i;
joachim99@8 692 for ( i = m_mergeLineList.begin(); i!=m_mergeLineList.end(); ++i )
joachim99@8 693 {
joachim99@8 694 if ( line>=i->d3lLineIdx && line < i->d3lLineIdx + i->srcRangeLength )
joachim99@8 695 {
joachim99@68 696 //if ( i->bDelta )
joachim99@8 697 {
joachim99@8 698 setFastSelector( i );
joachim99@8 699 }
joachim99@8 700 break;
joachim99@8 701 }
joachim99@8 702 }
joachim99@8 703 }
joachim99@8 704
joachim99@68 705 int MergeResultWindow::getNrOfUnsolvedConflicts( int* pNrOfWhiteSpaceConflicts )
joachim99@8 706 {
joachim99@8 707 int nrOfUnsolvedConflicts = 0;
joachim99@68 708 if (pNrOfWhiteSpaceConflicts!=0)
joachim99@68 709 *pNrOfWhiteSpaceConflicts = 0;
joachim99@8 710
joachim99@8 711 MergeLineList::iterator mlIt = m_mergeLineList.begin();
joachim99@8 712 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 713 {
joachim99@8 714 MergeLine& ml = *mlIt;
joachim99@8 715 MergeEditLineList::iterator melIt = ml.mergeEditLineList.begin();
joachim99@8 716 if ( melIt->isConflict() )
joachim99@68 717 {
joachim99@8 718 ++nrOfUnsolvedConflicts;
joachim99@68 719 if ( ml.bWhiteSpaceConflict && pNrOfWhiteSpaceConflicts!=0 )
joachim99@68 720 ++ *pNrOfWhiteSpaceConflicts;
joachim99@68 721 }
joachim99@8 722 }
joachim99@8 723
joachim99@8 724 return nrOfUnsolvedConflicts;
joachim99@8 725 }
joachim99@8 726
joachim99@8 727 void MergeResultWindow::showNrOfConflicts()
joachim99@8 728 {
joachim99@8 729 int nrOfSolvedConflicts = 0;
joachim99@8 730 int nrOfUnsolvedConflicts = 0;
joachim99@8 731
joachim99@8 732 MergeLineList::iterator i;
joachim99@8 733 for ( i = m_mergeLineList.begin(); i!=m_mergeLineList.end(); ++i )
joachim99@8 734 {
joachim99@8 735 if ( i->bConflict )
joachim99@8 736 ++nrOfUnsolvedConflicts;
joachim99@8 737 else if ( i->bDelta )
joachim99@8 738 ++nrOfSolvedConflicts;
joachim99@8 739 }
joachim99@8 740 QString totalInfo;
joachim99@8 741 if ( m_pTotalDiffStatus->bBinaryAEqB && m_pTotalDiffStatus->bBinaryAEqC )
joachim99@8 742 totalInfo += i18n("All input files are binary equal.");
joachim99@8 743 else if ( m_pTotalDiffStatus->bTextAEqB && m_pTotalDiffStatus->bTextAEqC )
joachim99@8 744 totalInfo += i18n("All input files contain the same text.");
joachim99@8 745 else {
joachim99@8 746 if ( m_pTotalDiffStatus->bBinaryAEqB ) totalInfo += i18n("Files A and B are binary equal.\n");
joachim99@8 747 else if ( m_pTotalDiffStatus->bTextAEqB ) totalInfo += i18n("Files A and B have equal text. \n");
joachim99@8 748 if ( m_pTotalDiffStatus->bBinaryAEqC ) totalInfo += i18n("Files A and C are binary equal.\n");
joachim99@8 749 else if ( m_pTotalDiffStatus->bTextAEqC ) totalInfo += i18n("Files A and C have equal text. \n");
joachim99@8 750 if ( m_pTotalDiffStatus->bBinaryBEqC ) totalInfo += i18n("Files B and C are binary equal.\n");
joachim99@8 751 else if ( m_pTotalDiffStatus->bTextBEqC ) totalInfo += i18n("Files B and C have equal text. \n");
joachim99@8 752 }
joachim99@8 753 KMessageBox::information( this,
joachim99@8 754 i18n("Total number of conflicts: ") + QString::number(nrOfSolvedConflicts + nrOfUnsolvedConflicts) +
joachim99@8 755 i18n("\nNr of automatically solved conflicts: ") + QString::number(nrOfSolvedConflicts) +
joachim99@8 756 i18n("\nNr of unsolved conflicts: ") + QString::number(nrOfUnsolvedConflicts) +
joachim99@8 757 "\n"+totalInfo,
joachim99@8 758 i18n("Conflicts")
joachim99@8 759 );
joachim99@8 760 }
joachim99@8 761
joachim99@8 762 void MergeResultWindow::setFastSelector(MergeLineList::iterator i)
joachim99@8 763 {
joachim99@8 764 if ( i==m_mergeLineList.end() )
joachim99@8 765 return;
joachim99@8 766 m_currentMergeLineIt = i;
joachim99@8 767 emit setFastSelectorRange( i->d3lLineIdx, i->srcRangeLength );
joachim99@8 768
joachim99@8 769 int line1 = 0;
joachim99@8 770
joachim99@8 771 MergeLineList::iterator mlIt = m_mergeLineList.begin();
joachim99@8 772 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 773 {
joachim99@8 774 if(mlIt==m_currentMergeLineIt)
joachim99@8 775 break;
joachim99@8 776 line1 += mlIt->mergeEditLineList.size();
joachim99@8 777 }
joachim99@8 778
joachim99@8 779 int nofLines = m_currentMergeLineIt->mergeEditLineList.size();
joachim99@8 780 int newFirstLine = getBestFirstLine( line1, nofLines, m_firstLine, getNofVisibleLines() );
joachim99@8 781 if ( newFirstLine != m_firstLine )
joachim99@8 782 {
joachim99@8 783 scroll( 0, newFirstLine - m_firstLine );
joachim99@8 784 }
joachim99@8 785
joachim99@8 786 if ( m_selection.isEmpty() )
joachim99@8 787 {
joachim99@8 788 m_cursorXPos = 0;
joachim99@8 789 m_cursorOldXPos = 0;
joachim99@8 790 m_cursorYPos = line1;
joachim99@8 791 }
joachim99@8 792
joachim99@8 793 update();
joachim99@66 794 updateSourceMask();
joachim99@8 795 emit updateAvailabilities();
joachim99@8 796 }
joachim99@8 797
joachim99@8 798 void MergeResultWindow::choose( int selector )
joachim99@8 799 {
joachim99@66 800 if ( m_currentMergeLineIt==m_mergeLineList.end() )
joachim99@66 801 return;
joachim99@68 802
joachim99@8 803 setModified();
joachim99@8 804
joachim99@8 805 // First find range for which this change works.
joachim99@8 806 MergeLine& ml = *m_currentMergeLineIt;
joachim99@8 807
joachim99@8 808 MergeEditLineList::iterator melIt;
joachim99@8 809
joachim99@8 810 // Now check if selector is active for this range already.
joachim99@8 811 bool bActive = false;
joachim99@8 812
joachim99@8 813 // Remove unneeded lines in the range.
joachim99@8 814 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); )
joachim99@8 815 {
joachim99@8 816 MergeEditLine& mel = *melIt;
joachim99@8 817 if ( mel.src()==selector )
joachim99@8 818 bActive = true;
joachim99@8 819
joachim99@8 820 if ( mel.src()==selector || !mel.isEditableText() || mel.isModified() )
joachim99@8 821 melIt = ml.mergeEditLineList.erase( melIt );
joachim99@8 822 else
joachim99@8 823 ++melIt;
joachim99@8 824 }
joachim99@8 825
joachim99@8 826 if ( !bActive ) // Selected source wasn't active.
joachim99@8 827 { // Append the lines from selected source here at rangeEnd.
joachim99@8 828 Diff3LineList::const_iterator d3llit=ml.id3l;
joachim99@8 829 int j;
joachim99@8 830
joachim99@8 831 for( j=0; j<ml.srcRangeLength; ++j )
joachim99@8 832 {
joachim99@8 833 MergeEditLine mel;
joachim99@8 834 mel.setSource( selector, d3llit, false );
joachim99@8 835 ml.mergeEditLineList.push_back(mel);
joachim99@8 836
joachim99@8 837 ++d3llit;
joachim99@8 838 }
joachim99@8 839 }
joachim99@8 840
joachim99@8 841 if ( ! ml.mergeEditLineList.empty() )
joachim99@8 842 {
joachim99@8 843 // Remove all lines that are empty, because no src lines are there.
joachim99@8 844 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); )
joachim99@8 845 {
joachim99@8 846 MergeEditLine& mel = *melIt;
joachim99@8 847
joachim99@8 848 int srcLine = mel.src()==1 ? mel.id3l()->lineA :
joachim99@8 849 mel.src()==2 ? mel.id3l()->lineB :
joachim99@8 850 mel.src()==3 ? mel.id3l()->lineC : -1;
joachim99@8 851
joachim99@8 852 if ( srcLine == -1 )
joachim99@8 853 melIt = ml.mergeEditLineList.erase( melIt );
joachim99@8 854 else
joachim99@8 855 ++melIt;
joachim99@8 856 }
joachim99@8 857 }
joachim99@8 858
joachim99@8 859 if ( ml.mergeEditLineList.empty() )
joachim99@8 860 {
joachim99@8 861 // Insert a dummy line:
joachim99@8 862 MergeEditLine mel;
joachim99@8 863
joachim99@8 864 if ( bActive ) mel.setConflict(); // All src entries deleted => conflict
joachim99@8 865 else mel.setRemoved(selector); // No lines in corresponding src found.
joachim99@8 866
joachim99@8 867 ml.mergeEditLineList.push_back(mel);
joachim99@8 868 }
joachim99@68 869
joachim99@58 870 if ( m_cursorYPos >= m_totalSize )
joachim99@58 871 {
joachim99@58 872 m_cursorYPos = m_totalSize-1;
joachim99@58 873 m_cursorXPos = 0;
joachim99@58 874 }
joachim99@8 875
joachim99@8 876 update();
joachim99@66 877 updateSourceMask();
joachim99@8 878 emit updateAvailabilities();
joachim99@68 879 int wsc;
joachim99@68 880 m_pStatusBar->message( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
joachim99@68 881 .arg(getNrOfUnsolvedConflicts(&wsc)).arg(wsc) );
joachim99@8 882 }
joachim99@8 883
joachim99@51 884 // bConflictsOnly: automatically choose for conflicts only (true) or for everywhere (false)
joachim99@51 885 void MergeResultWindow::chooseGlobal(int selector, bool bConflictsOnly, bool bWhiteSpaceOnly )
joachim99@8 886 {
joachim99@8 887 resetSelection();
joachim99@8 888
joachim99@51 889 merge( false, selector, bConflictsOnly, bWhiteSpaceOnly );
joachim99@8 890 emit modified();
joachim99@8 891 update();
joachim99@68 892 int wsc;
joachim99@68 893 m_pStatusBar->message( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
joachim99@68 894 .arg(getNrOfUnsolvedConflicts(&wsc)).arg(wsc) );
joachim99@8 895 }
joachim99@8 896
joachim99@8 897 void MergeResultWindow::slotAutoSolve()
joachim99@8 898 {
joachim99@8 899 resetSelection();
joachim99@8 900 merge( true, -1 );
joachim99@8 901 emit modified();
joachim99@8 902 update();
joachim99@68 903 int wsc;
joachim99@68 904 m_pStatusBar->message( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
joachim99@68 905 .arg(getNrOfUnsolvedConflicts(&wsc)).arg(wsc) );
joachim99@8 906 }
joachim99@8 907
joachim99@8 908 void MergeResultWindow::slotUnsolve()
joachim99@8 909 {
joachim99@8 910 resetSelection();
joachim99@8 911 merge( false, -1 );
joachim99@8 912 emit modified();
joachim99@8 913 update();
joachim99@68 914 int wsc;
joachim99@68 915 m_pStatusBar->message( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
joachim99@68 916 .arg(getNrOfUnsolvedConflicts(&wsc)).arg(wsc) );
joachim99@8 917 }
joachim99@8 918
joachim99@8 919 void MergeResultWindow::myUpdate(int afterMilliSecs)
joachim99@8 920 {
joachim99@8 921 killTimers();
joachim99@8 922 m_bMyUpdate = true;
joachim99@8 923 startTimer( afterMilliSecs );
joachim99@8 924 }
joachim99@8 925
joachim99@8 926 void MergeResultWindow::timerEvent(QTimerEvent*)
joachim99@8 927 {
joachim99@8 928 killTimers();
joachim99@8 929
joachim99@8 930 if ( m_bMyUpdate )
joachim99@8 931 {
joachim99@8 932 update();//paintEvent( 0 );
joachim99@8 933 m_bMyUpdate = false;
joachim99@8 934 }
joachim99@8 935
joachim99@8 936 if ( m_scrollDeltaX != 0 || m_scrollDeltaY != 0 )
joachim99@8 937 {
joachim99@8 938 m_selection.end( m_selection.lastLine + m_scrollDeltaY, m_selection.lastPos + m_scrollDeltaX );
joachim99@8 939 emit scroll( m_scrollDeltaX, m_scrollDeltaY );
joachim99@8 940 killTimers();
joachim99@8 941 startTimer(50);
joachim99@8 942 }
joachim99@8 943 }
joachim99@8 944
joachim99@68 945 QString MergeResultWindow::MergeEditLine::getString( const MergeResultWindow* mrw )
joachim99@8 946 {
joachim99@68 947 if ( isRemoved() ) { return QString(); }
joachim99@8 948
joachim99@8 949 if ( ! isModified() )
joachim99@8 950 {
joachim99@8 951 int src = m_src;
joachim99@8 952 const Diff3Line& d3l = *m_id3l;
joachim99@68 953 if ( src == 0 ) { return QString(); }
joachim99@8 954
joachim99@8 955 const LineData* pld = 0;
joachim99@8 956 assert( src == A || src == B || src == C );
joachim99@8 957 if ( src == A && d3l.lineA!=-1 ) pld = &mrw->m_pldA[ d3l.lineA ];
joachim99@8 958 else if ( src == B && d3l.lineB!=-1 ) pld = &mrw->m_pldB[ d3l.lineB ];
joachim99@8 959 else if ( src == C && d3l.lineC!=-1 ) pld = &mrw->m_pldC[ d3l.lineC ];
joachim99@8 960
joachim99@8 961 if ( pld == 0 )
joachim99@8 962 {
joachim99@8 963 // assert(false); This is no error.
joachim99@68 964 return QString();
joachim99@8 965 }
joachim99@8 966
joachim99@68 967 return QString( pld->pLine, pld->size );
joachim99@8 968 }
joachim99@8 969 else
joachim99@8 970 {
joachim99@8 971 return m_str;
joachim99@8 972 }
joachim99@8 973 return 0;
joachim99@8 974 }
joachim99@8 975
joachim99@8 976 /// Converts the cursor-posOnScreen into a text index, considering tabulators.
joachim99@68 977 int convertToPosInText( const QString& s, int posOnScreen )
joachim99@8 978 {
joachim99@8 979 int localPosOnScreen = 0;
joachim99@68 980 int size=s.length();
joachim99@8 981 for ( int i=0; i<size; ++i )
joachim99@8 982 {
joachim99@8 983 if ( localPosOnScreen>=posOnScreen )
joachim99@8 984 return i;
joachim99@8 985
joachim99@8 986 // All letters except tabulator have width one.
joachim99@68 987 int letterWidth = s[i]!='\t' ? 1 : tabber( localPosOnScreen, g_tabSize );
joachim99@8 988
joachim99@8 989 localPosOnScreen += letterWidth;
joachim99@8 990
joachim99@8 991 if ( localPosOnScreen>posOnScreen )
joachim99@8 992 return i;
joachim99@8 993 }
joachim99@8 994 return size;
joachim99@8 995 }
joachim99@8 996
joachim99@8 997
joachim99@8 998 /// Converts the index into the text to a cursor-posOnScreen considering tabulators.
joachim99@66 999 int convertToPosOnScreen( const QString& p, int posInText )
joachim99@8 1000 {
joachim99@8 1001 int posOnScreen = 0;
joachim99@8 1002 for ( int i=0; i<posInText; ++i )
joachim99@8 1003 {
joachim99@8 1004 // All letters except tabulator have width one.
joachim99@8 1005 int letterWidth = p[i]!='\t' ? 1 : tabber( posOnScreen, g_tabSize );
joachim99@8 1006
joachim99@8 1007 posOnScreen += letterWidth;
joachim99@8 1008 }
joachim99@8 1009 return posOnScreen;
joachim99@8 1010 }
joachim99@8 1011
joachim99@8 1012 void MergeResultWindow::writeLine(
joachim99@68 1013 MyPainter& p, int line, const QString& str,
joachim99@68 1014 int srcSelect, e_MergeDetails mergeDetails, int rangeMark, bool bUserModified, bool bLineRemoved, bool bWhiteSpaceConflict
joachim99@8 1015 )
joachim99@8 1016 {
joachim99@8 1017 const QFontMetrics& fm = fontMetrics();
joachim99@8 1018 int fontHeight = fm.height();
joachim99@8 1019 int fontWidth = fm.width("W");
joachim99@8 1020 int fontAscent = fm.ascent();
joachim99@8 1021
joachim99@8 1022 int topLineYOffset = fontHeight + 3;
joachim99@8 1023 int xOffset = fontWidth * leftInfoWidth;
joachim99@8 1024
joachim99@8 1025 int yOffset = ( line-m_firstLine ) * fontHeight;
joachim99@8 1026 if ( yOffset < 0 || yOffset > height() )
joachim99@8 1027 return;
joachim99@8 1028
joachim99@8 1029 yOffset += topLineYOffset;
joachim99@8 1030
joachim99@8 1031 QString srcName = " ";
joachim99@8 1032 if ( bUserModified ) srcName = "m";
joachim99@8 1033 else if ( srcSelect == A && mergeDetails != eNoChange ) srcName = "A";
joachim99@8 1034 else if ( srcSelect == B ) srcName = "B";
joachim99@8 1035 else if ( srcSelect == C ) srcName = "C";
joachim99@8 1036
joachim99@8 1037 if ( rangeMark & 4 )
joachim99@8 1038 {
joachim99@8 1039 p.fillRect( xOffset, yOffset, width(), fontHeight, m_pOptionDialog->m_currentRangeBgColor );
joachim99@8 1040 }
joachim99@68 1041
joachim99@8 1042 if( (srcSelect > 0 || bUserModified ) && !bLineRemoved )
joachim99@8 1043 {
joachim99@8 1044 int outPos = 0;
joachim99@68 1045 QString s;
joachim99@68 1046 int size = str.length();
joachim99@8 1047 for ( int i=0; i<size; ++i )
joachim99@8 1048 {
joachim99@8 1049 int spaces = 1;
joachim99@68 1050 if ( str[i]=='\t' )
joachim99@8 1051 {
joachim99@8 1052 spaces = tabber( outPos, g_tabSize );
joachim99@8 1053 for( int j=0; j<spaces; ++j )
joachim99@8 1054 s+=' ';
joachim99@8 1055 }
joachim99@8 1056 else
joachim99@8 1057 {
joachim99@68 1058 s+=str[i];
joachim99@8 1059 }
joachim99@8 1060 outPos += spaces;
joachim99@8 1061 }
joachim99@8 1062
joachim99@8 1063 if ( m_selection.lineWithin( line ) )
joachim99@8 1064 {
joachim99@68 1065 int firstPosInLine = convertToPosOnScreen( str, convertToPosInText( str, m_selection.firstPosInLine(line) ) );
joachim99@68 1066 int lastPosInLine = convertToPosOnScreen( str, convertToPosInText( str, m_selection.lastPosInLine(line) ) );
joachim99@8 1067 int lengthInLine = max2(0,lastPosInLine - firstPosInLine);
joachim99@8 1068 if (lengthInLine>0) m_selection.bSelectionContainsData = true;
joachim99@8 1069
joachim99@8 1070 if ( lengthInLine < int(s.length()) )
joachim99@8 1071 { // Draw a normal line first
joachim99@8 1072 p.setPen( m_pOptionDialog->m_fgColor );
joachim99@68 1073 p.drawText( xOffset, yOffset+fontAscent, s.mid(m_firstColumn), true );
joachim99@8 1074 }
joachim99@8 1075 int firstPosInLine2 = max2( firstPosInLine, m_firstColumn );
joachim99@8 1076 int lengthInLine2 = max2(0,lastPosInLine - firstPosInLine2);
joachim99@8 1077
joachim99@8 1078 if( m_selection.lineWithin( line+1 ) )
joachim99@8 1079 p.fillRect( xOffset + fontWidth*(firstPosInLine2-m_firstColumn), yOffset,
joachim99@8 1080 width(), fontHeight, colorGroup().highlight() );
joachim99@8 1081 else
joachim99@8 1082 p.fillRect( xOffset + fontWidth*(firstPosInLine2-m_firstColumn), yOffset,
joachim99@8 1083 fontWidth*lengthInLine2, fontHeight, colorGroup().highlight() );
joachim99@8 1084
joachim99@8 1085 p.setPen( colorGroup().highlightedText() );
joachim99@8 1086 p.drawText( xOffset + fontWidth*(firstPosInLine2-m_firstColumn), yOffset+fontAscent,
joachim99@68 1087 s.mid(firstPosInLine2,lengthInLine2), true );
joachim99@8 1088 }
joachim99@8 1089 else
joachim99@8 1090 {
joachim99@8 1091 p.setPen( m_pOptionDialog->m_fgColor );
joachim99@68 1092 p.drawText( xOffset, yOffset+fontAscent, s.mid(m_firstColumn), true );
joachim99@8 1093 }
joachim99@8 1094
joachim99@8 1095 p.setPen( m_pOptionDialog->m_fgColor );
joachim99@8 1096 if ( m_cursorYPos==line )
joachim99@8 1097 {
joachim99@8 1098 m_cursorXPos = minMaxLimiter( m_cursorXPos, 0, outPos );
joachim99@68 1099 m_cursorXPos = convertToPosOnScreen( str, convertToPosInText( str, m_cursorXPos ) );
joachim99@8 1100 }
joachim99@8 1101
joachim99@68 1102 p.drawText( 1, yOffset+fontAscent, srcName, true );
joachim99@8 1103 }
joachim99@8 1104 else if ( bLineRemoved )
joachim99@8 1105 {
joachim99@8 1106 p.setPen( m_pOptionDialog->m_colorForConflict );
joachim99@8 1107 p.drawText( xOffset, yOffset+fontAscent, i18n("<No src line>") );
joachim99@8 1108 p.drawText( 1, yOffset+fontAscent, srcName );
joachim99@8 1109 if ( m_cursorYPos==line ) m_cursorXPos = 0;
joachim99@8 1110 }
joachim99@8 1111 else if ( srcSelect == 0 )
joachim99@8 1112 {
joachim99@8 1113 p.setPen( m_pOptionDialog->m_colorForConflict );
joachim99@68 1114 if ( bWhiteSpaceConflict )
joachim99@68 1115 p.drawText( xOffset, yOffset+fontAscent, i18n("<Merge Conflict (Whitespace only)>") );
joachim99@68 1116 else
joachim99@68 1117 p.drawText( xOffset, yOffset+fontAscent, i18n("<Merge Conflict>") );
joachim99@8 1118 p.drawText( 1, yOffset+fontAscent, "?" );
joachim99@8 1119 if ( m_cursorYPos==line ) m_cursorXPos = 0;
joachim99@8 1120 }
joachim99@8 1121 else assert(false);
joachim99@8 1122
joachim99@8 1123 xOffset -= fontWidth;
joachim99@8 1124 p.setPen( m_pOptionDialog->m_fgColor );
joachim99@8 1125 if ( rangeMark & 1 ) // begin mark
joachim99@8 1126 {
joachim99@8 1127 p.drawLine( xOffset, yOffset+1, xOffset, yOffset+fontHeight/2 );
joachim99@8 1128 p.drawLine( xOffset, yOffset+1, xOffset-2, yOffset+1 );
joachim99@8 1129 }
joachim99@8 1130 else
joachim99@8 1131 {
joachim99@8 1132 p.drawLine( xOffset, yOffset, xOffset, yOffset+fontHeight/2 );
joachim99@8 1133 }
joachim99@8 1134
joachim99@8 1135 if ( rangeMark & 2 ) // end mark
joachim99@8 1136 {
joachim99@8 1137 p.drawLine( xOffset, yOffset+fontHeight/2, xOffset, yOffset+fontHeight-1 );
joachim99@8 1138 p.drawLine( xOffset, yOffset+fontHeight-1, xOffset-2, yOffset+fontHeight-1 );
joachim99@8 1139 }
joachim99@8 1140 else
joachim99@8 1141 {
joachim99@8 1142 p.drawLine( xOffset, yOffset+fontHeight/2, xOffset, yOffset+fontHeight );
joachim99@8 1143 }
joachim99@8 1144
joachim99@8 1145 if ( rangeMark & 4 )
joachim99@8 1146 {
joachim99@8 1147 p.fillRect( xOffset + 3, yOffset, 3, fontHeight, m_pOptionDialog->m_fgColor );
joachim99@8 1148 /* p.setPen( blue );
joachim99@8 1149 p.drawLine( xOffset+2, yOffset, xOffset+2, yOffset+fontHeight-1 );
joachim99@8 1150 p.drawLine( xOffset+3, yOffset, xOffset+3, yOffset+fontHeight-1 );*/
joachim99@8 1151 }
joachim99@8 1152 }
joachim99@8 1153
joachim99@58 1154 void MergeResultWindow::setPaintingAllowed(bool bPaintingAllowed)
joachim99@58 1155 {
joachim99@58 1156 m_bPaintingAllowed = bPaintingAllowed;
joachim99@66 1157 if ( !m_bPaintingAllowed )
joachim99@66 1158 m_currentMergeLineIt = m_mergeLineList.end();
joachim99@58 1159 }
joachim99@58 1160
joachim99@8 1161 void MergeResultWindow::paintEvent( QPaintEvent* e )
joachim99@8 1162 {
joachim99@58 1163 if (m_pDiff3LineList==0 || !m_bPaintingAllowed) return;
joachim99@8 1164
joachim99@8 1165 bool bOldSelectionContainsData = m_selection.bSelectionContainsData;
joachim99@8 1166 const QFontMetrics& fm = fontMetrics();
joachim99@8 1167 int fontHeight = fm.height();
joachim99@8 1168 int fontWidth = fm.width("W");
joachim99@8 1169 int fontAscent = fm.ascent();
joachim99@8 1170
joachim99@8 1171 if ( e!= 0 ) // e==0 for blinking cursor
joachim99@8 1172 {
joachim99@8 1173 m_selection.bSelectionContainsData = false;
joachim99@8 1174 if ( size() != m_pixmap.size() )
joachim99@8 1175 m_pixmap.resize(size());
joachim99@8 1176
joachim99@68 1177 MyPainter p(&m_pixmap, m_pOptionDialog->m_bRightToLeftLanguage, width(), fontWidth);
joachim99@8 1178 p.setFont( font() );
joachim99@68 1179 p.QPainter::fillRect( rect(), m_pOptionDialog->m_bgColor );
joachim99@8 1180
joachim99@8 1181 //int visibleLines = height() / fontHeight;
joachim99@8 1182
joachim99@8 1183 { // Draw the topline
joachim99@58 1184 QString s = " " +i18n("Output") + " : " + m_fileName + " ";
joachim99@8 1185 if (m_bModified)
joachim99@8 1186 s += i18n("[Modified]");
joachim99@8 1187
joachim99@8 1188 int topLineYOffset = fontHeight + 3;
joachim99@8 1189
joachim99@8 1190 if (hasFocus())
joachim99@8 1191 {
joachim99@8 1192 p.fillRect( 0, 0, width(), topLineYOffset, lightGray /*m_pOptionDialog->m_diffBgColor*/ );
joachim99@8 1193 }
joachim99@8 1194 else
joachim99@8 1195 {
joachim99@8 1196 p.fillRect( 0, 0, width(), topLineYOffset, m_pOptionDialog->m_bgColor );
joachim99@8 1197 }
joachim99@8 1198 p.setPen( m_pOptionDialog->m_fgColor );
joachim99@68 1199 p.QPainter::drawText( 0, fontAscent+1, s );
joachim99@8 1200 p.drawLine( 0, fontHeight + 2, width(), fontHeight + 2 );
joachim99@8 1201 }
joachim99@8 1202
joachim99@8 1203 int lastVisibleLine = m_firstLine + getNofVisibleLines() + 5;
joachim99@8 1204 int nofColumns = 0;
joachim99@8 1205 int line = 0;
joachim99@8 1206 MergeLineList::iterator mlIt = m_mergeLineList.begin();
joachim99@8 1207 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 1208 {
joachim99@8 1209 MergeLine& ml = *mlIt;
joachim99@8 1210 if ( line > lastVisibleLine || line + ml.mergeEditLineList.size() < m_firstLine)
joachim99@8 1211 {
joachim99@8 1212 line += ml.mergeEditLineList.size();
joachim99@8 1213 }
joachim99@8 1214 else
joachim99@8 1215 {
joachim99@8 1216 MergeEditLineList::iterator melIt;
joachim99@8 1217 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt )
joachim99@8 1218 {
joachim99@8 1219 if (line>=m_firstLine && line<=lastVisibleLine)
joachim99@8 1220 {
joachim99@8 1221 MergeEditLine& mel = *melIt;
joachim99@8 1222 MergeEditLineList::iterator melIt1 = melIt;
joachim99@8 1223 ++melIt1;
joachim99@8 1224
joachim99@8 1225 int rangeMark = 0;
joachim99@8 1226 if ( melIt==ml.mergeEditLineList.begin() ) rangeMark |= 1; // Begin range mark
joachim99@8 1227 if ( melIt1==ml.mergeEditLineList.end() ) rangeMark |= 2; // End range mark
joachim99@8 1228
joachim99@8 1229 if ( mlIt == m_currentMergeLineIt ) rangeMark |= 4; // Mark of the current line
joachim99@8 1230
joachim99@68 1231 QString s;
joachim99@68 1232 s = mel.getString( this );
joachim99@68 1233 if ( convertToPosOnScreen(s,s.length()) >nofColumns)
joachim99@68 1234 nofColumns = s.length();
joachim99@8 1235
joachim99@68 1236 writeLine( p, line, s, mel.src(), ml.mergeDetails, rangeMark,
joachim99@68 1237 mel.isModified(), mel.isRemoved(), ml.bWhiteSpaceConflict );
joachim99@8 1238 }
joachim99@8 1239 ++line;
joachim99@8 1240 }
joachim99@8 1241 }
joachim99@8 1242 }
joachim99@8 1243
joachim99@8 1244 if ( line != m_nofLines || nofColumns != m_nofColumns )
joachim99@8 1245 {
joachim99@8 1246 m_nofLines = line;
joachim99@58 1247 assert( m_nofLines == m_totalSize );
joachim99@8 1248
joachim99@8 1249 m_nofColumns = nofColumns;
joachim99@8 1250 emit resizeSignal();
joachim99@8 1251 }
joachim99@8 1252
joachim99@8 1253 p.end();
joachim99@8 1254 }
joachim99@8 1255
joachim99@8 1256 QPainter painter(this);
joachim99@8 1257 if ( e!= 0 )
joachim99@8 1258 {
joachim99@8 1259 painter.drawPixmap(0,0, m_pixmap);
joachim99@8 1260 }
joachim99@8 1261
joachim99@8 1262 int topLineYOffset = fontHeight + 3;
joachim99@8 1263 int xOffset = fontWidth * leftInfoWidth;
joachim99@8 1264 int yOffset = ( m_cursorYPos - m_firstLine ) * fontHeight + topLineYOffset;
joachim99@8 1265 int xCursor = ( m_cursorXPos - m_firstColumn ) * fontWidth + xOffset;
joachim99@8 1266
joachim99@8 1267 if ( e!= 0 )
joachim99@8 1268 painter.drawPixmap(0,0, m_pixmap);
joachim99@8 1269 else
joachim99@68 1270 {
joachim99@68 1271 if (!m_pOptionDialog->m_bRightToLeftLanguage)
joachim99@68 1272 painter.drawPixmap(xCursor-2, yOffset, m_pixmap,
joachim99@68 1273 xCursor-2, yOffset, 5, fontAscent+2 );
joachim99@68 1274 else
joachim99@68 1275 painter.drawPixmap(width()-1-4-(xCursor-2), yOffset, m_pixmap,
joachim99@68 1276 width()-1-4-(xCursor-2), yOffset, 5, fontAscent+2 );
joachim99@68 1277 }
joachim99@8 1278
joachim99@8 1279 if ( m_bCursorOn && hasFocus() && m_cursorYPos>=m_firstLine )
joachim99@8 1280 {
joachim99@68 1281 MyPainter painter(this, m_pOptionDialog->m_bRightToLeftLanguage, width(), fontWidth);
joachim99@8 1282 int topLineYOffset = fontHeight + 3;
joachim99@8 1283 int xOffset = fontWidth * leftInfoWidth;
joachim99@8 1284
joachim99@8 1285 int yOffset = ( m_cursorYPos-m_firstLine ) * fontHeight + topLineYOffset;
joachim99@8 1286
joachim99@8 1287 int xCursor = ( m_cursorXPos - m_firstColumn ) * fontWidth + xOffset;
joachim99@66 1288
joachim99@66 1289 painter.setPen( m_pOptionDialog->m_fgColor );
joachim99@66 1290
joachim99@8 1291 painter.drawLine( xCursor, yOffset, xCursor, yOffset+fontAscent );
joachim99@8 1292 painter.drawLine( xCursor-2, yOffset, xCursor+2, yOffset );
joachim99@8 1293 painter.drawLine( xCursor-2, yOffset+fontAscent+1, xCursor+2, yOffset+fontAscent+1 );
joachim99@8 1294 }
joachim99@8 1295
joachim99@8 1296 if( !bOldSelectionContainsData && m_selection.bSelectionContainsData )
joachim99@8 1297 emit newSelection();
joachim99@8 1298 }
joachim99@8 1299
joachim99@66 1300 void MergeResultWindow::updateSourceMask()
joachim99@66 1301 {
joachim99@66 1302 int srcMask=0;
joachim99@66 1303 int enabledMask = 0;
joachim99@66 1304 if( !hasFocus() || m_pDiff3LineList==0 || !m_bPaintingAllowed || m_currentMergeLineIt == m_mergeLineList.end() )
joachim99@66 1305 {
joachim99@66 1306 srcMask = 0;
joachim99@66 1307 enabledMask = 0;
joachim99@66 1308 }
joachim99@66 1309 else
joachim99@66 1310 {
joachim99@66 1311 enabledMask = m_pldC==0 ? 3 : 7;
joachim99@66 1312 MergeLine& ml = *m_currentMergeLineIt;
joachim99@66 1313
joachim99@66 1314 srcMask = 0;
joachim99@66 1315 bool bModified = false;
joachim99@66 1316 MergeEditLineList::iterator melIt;
joachim99@66 1317 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt )
joachim99@66 1318 {
joachim99@66 1319 MergeEditLine& mel = *melIt;
joachim99@66 1320 if ( mel.src()==1 ) srcMask |= 1;
joachim99@66 1321 if ( mel.src()==2 ) srcMask |= 2;
joachim99@66 1322 if ( mel.src()==3 ) srcMask |= 4;
joachim99@66 1323 if ( mel.isModified() || !mel.isEditableText() ) bModified = true;
joachim99@66 1324 }
joachim99@68 1325
joachim99@66 1326 if ( ml.mergeDetails == eNoChange )
joachim99@66 1327 {
joachim99@66 1328 srcMask = 0;
joachim99@66 1329 enabledMask = bModified ? 1 : 0;
joachim99@66 1330 }
joachim99@66 1331 }
joachim99@68 1332
joachim99@66 1333 emit sourceMask( srcMask, enabledMask );
joachim99@66 1334 }
joachim99@66 1335
joachim99@66 1336 void MergeResultWindow::focusInEvent( QFocusEvent* e )
joachim99@66 1337 {
joachim99@66 1338 updateSourceMask();
joachim99@66 1339 QWidget::focusInEvent(e);
joachim99@66 1340 }
joachim99@66 1341
joachim99@8 1342 void MergeResultWindow::convertToLinePos( int x, int y, int& line, int& pos )
joachim99@8 1343 {
joachim99@8 1344 const QFontMetrics& fm = fontMetrics();
joachim99@8 1345 int fontHeight = fm.height();
joachim99@8 1346 int fontWidth = fm.width('W');
joachim99@8 1347 int xOffset = (leftInfoWidth-m_firstColumn)*fontWidth;
joachim99@8 1348 int topLineYOffset = fontHeight + 3;
joachim99@8 1349
joachim99@8 1350 int yOffset = topLineYOffset - m_firstLine * fontHeight;
joachim99@8 1351
joachim99@58 1352 line = min2( ( y - yOffset ) / fontHeight, m_totalSize-1 );
joachim99@68 1353 if ( ! m_pOptionDialog->m_bRightToLeftLanguage )
joachim99@68 1354 pos = ( x - xOffset ) / fontWidth;
joachim99@68 1355 else
joachim99@68 1356 pos = ( (width() - 1 - x) - xOffset ) / fontWidth;
joachim99@8 1357 }
joachim99@8 1358
joachim99@8 1359 void MergeResultWindow::mousePressEvent ( QMouseEvent* e )
joachim99@8 1360 {
joachim99@8 1361 m_bCursorOn = true;
joachim99@8 1362
joachim99@8 1363 int line;
joachim99@8 1364 int pos;
joachim99@8 1365 convertToLinePos( e->x(), e->y(), line, pos );
joachim99@8 1366
joachim99@8 1367 bool bLMB = e->button() == LeftButton;
joachim99@8 1368 bool bMMB = e->button() == MidButton;
joachim99@8 1369 bool bRMB = e->button() == RightButton;
joachim99@8 1370
joachim99@8 1371 if ( bLMB && pos < m_firstColumn || bRMB ) // Fast range selection
joachim99@8 1372 {
joachim99@8 1373 m_cursorXPos = 0;
joachim99@8 1374 m_cursorOldXPos = 0;
joachim99@8 1375 m_cursorYPos = max2(line,0);
joachim99@8 1376 int l = 0;
joachim99@8 1377 MergeLineList::iterator i = m_mergeLineList.begin();
joachim99@8 1378 for(i = m_mergeLineList.begin();i!=m_mergeLineList.end(); ++i)
joachim99@8 1379 {
joachim99@8 1380 if (l==line)
joachim99@8 1381 break;
joachim99@8 1382
joachim99@8 1383 l += i->mergeEditLineList.size();
joachim99@8 1384 if (l>line)
joachim99@8 1385 break;
joachim99@8 1386 }
joachim99@8 1387 m_selection.reset(); // Disable current selection
joachim99@8 1388
joachim99@8 1389 m_bCursorOn = true;
joachim99@8 1390 setFastSelector( i );
joachim99@8 1391
joachim99@8 1392 if (bRMB)
joachim99@8 1393 {
joachim99@8 1394 showPopupMenu( QCursor::pos() );
joachim99@8 1395 }
joachim99@8 1396 }
joachim99@8 1397 else if ( bLMB ) // Normal cursor placement
joachim99@8 1398 {
joachim99@8 1399 pos = max2(pos,0);
joachim99@8 1400 line = max2(line,0);
joachim99@8 1401 if ( e->state() & ShiftButton )
joachim99@8 1402 {
joachim99@8 1403 if (m_selection.firstLine==-1)
joachim99@8 1404 m_selection.start( line, pos );
joachim99@8 1405 m_selection.end( line, pos );
joachim99@8 1406 }
joachim99@8 1407 else
joachim99@8 1408 {
joachim99@8 1409 // Selection
joachim99@8 1410 m_selection.reset();
joachim99@8 1411 m_selection.start( line, pos );
joachim99@8 1412 m_selection.end( line, pos );
joachim99@8 1413 }
joachim99@8 1414 m_cursorXPos = pos;
joachim99@8 1415 m_cursorOldXPos = pos;
joachim99@8 1416 m_cursorYPos = line;
joachim99@8 1417
joachim99@8 1418 update();
joachim99@8 1419 //showStatusLine( line, m_winIdx, m_pFilename, m_pDiff3LineList, m_pStatusBar );
joachim99@8 1420 }
joachim99@8 1421 else if ( bMMB ) // Paste clipboard
joachim99@8 1422 {
joachim99@8 1423 pos = max2(pos,0);
joachim99@8 1424 line = max2(line,0);
joachim99@8 1425
joachim99@8 1426 m_selection.reset();
joachim99@8 1427 m_cursorXPos = pos;
joachim99@8 1428 m_cursorOldXPos = pos;
joachim99@8 1429 m_cursorYPos = line;
joachim99@8 1430
joachim99@66 1431 pasteClipboard( true );
joachim99@8 1432 }
joachim99@8 1433 }
joachim99@8 1434
joachim99@8 1435 void MergeResultWindow::mouseDoubleClickEvent( QMouseEvent* e )
joachim99@8 1436 {
joachim99@8 1437 if ( e->button() == LeftButton )
joachim99@8 1438 {
joachim99@8 1439 int line;
joachim99@8 1440 int pos;
joachim99@8 1441 convertToLinePos( e->x(), e->y(), line, pos );
joachim99@8 1442 m_cursorXPos = pos;
joachim99@8 1443 m_cursorOldXPos = pos;
joachim99@8 1444 m_cursorYPos = line;
joachim99@8 1445
joachim99@8 1446 // Get the string data of the current line
joachim99@8 1447
joachim99@8 1448 MergeLineList::iterator mlIt;
joachim99@8 1449 MergeEditLineList::iterator melIt;
joachim99@8 1450 calcIteratorFromLineNr( line, mlIt, melIt );
joachim99@68 1451 QString s = melIt->getString( this );
joachim99@8 1452
joachim99@68 1453 if ( !s.isEmpty() )
joachim99@8 1454 {
joachim99@8 1455 int pos1, pos2;
joachim99@8 1456
joachim99@68 1457 calcTokenPos( s, pos, pos1, pos2 );
joachim99@8 1458
joachim99@8 1459 resetSelection();
joachim99@8 1460 m_selection.start( line, convertToPosOnScreen( s, pos1 ) );
joachim99@8 1461 m_selection.end( line, convertToPosOnScreen( s, pos2 ) );
joachim99@8 1462
joachim99@8 1463 update();
joachim99@8 1464 // emit selectionEnd() happens in the mouseReleaseEvent.
joachim99@8 1465 }
joachim99@8 1466 }
joachim99@8 1467 }
joachim99@8 1468
joachim99@8 1469 void MergeResultWindow::mouseReleaseEvent ( QMouseEvent * e )
joachim99@8 1470 {
joachim99@8 1471 if ( e->button() == LeftButton )
joachim99@8 1472 {
joachim99@8 1473 killTimers();
joachim99@8 1474
joachim99@8 1475 if (m_selection.firstLine != -1 )
joachim99@8 1476 {
joachim99@8 1477 emit selectionEnd();
joachim99@8 1478 }
joachim99@8 1479 }
joachim99@8 1480 }
joachim99@8 1481
joachim99@8 1482 void MergeResultWindow::mouseMoveEvent ( QMouseEvent * e )
joachim99@8 1483 {
joachim99@8 1484 int line;
joachim99@8 1485 int pos;
joachim99@8 1486 convertToLinePos( e->x(), e->y(), line, pos );
joachim99@8 1487 m_cursorXPos = pos;
joachim99@8 1488 m_cursorOldXPos = pos;
joachim99@8 1489 m_cursorYPos = line;
joachim99@8 1490 if (m_selection.firstLine != -1 )
joachim99@8 1491 {
joachim99@8 1492 m_selection.end( line, pos );
joachim99@8 1493 myUpdate(0);
joachim99@8 1494
joachim99@8 1495 //showStatusLine( line, m_winIdx, m_pFilename, m_pDiff3LineList, m_pStatusBar );
joachim99@8 1496
joachim99@8 1497 // Scroll because mouse moved out of the window
joachim99@8 1498 const QFontMetrics& fm = fontMetrics();
joachim99@8 1499 int fontHeight = fm.height();
joachim99@8 1500 int fontWidth = fm.width('W');
joachim99@8 1501 int topLineYOffset = fontHeight + 3;
joachim99@8 1502 int deltaX=0;
joachim99@8 1503 int deltaY=0;
joachim99@68 1504 if ( ! m_pOptionDialog->m_bRightToLeftLanguage )
joachim99@68 1505 {
joachim99@68 1506 if ( e->x() < leftInfoWidth*fontWidth ) deltaX=-1;
joachim99@68 1507 if ( e->x() > width() ) deltaX=+1;
joachim99@68 1508 }
joachim99@68 1509 else
joachim99@68 1510 {
joachim99@68 1511 if ( e->x() > width()-1-leftInfoWidth*fontWidth ) deltaX=-1;
joachim99@68 1512 if ( e->x() < fontWidth ) deltaX=+1;
joachim99@68 1513 }
joachim99@8 1514 if ( e->y() < topLineYOffset ) deltaY=-1;
joachim99@8 1515 if ( e->y() > height() ) deltaY=+1;
joachim99@8 1516 m_scrollDeltaX = deltaX;
joachim99@8 1517 m_scrollDeltaY = deltaY;
joachim99@8 1518 if ( deltaX != 0 || deltaY!= 0)
joachim99@8 1519 {
joachim99@8 1520 emit scroll( deltaX, deltaY );
joachim99@8 1521 }
joachim99@8 1522 }
joachim99@8 1523 }
joachim99@8 1524
joachim99@8 1525
joachim99@8 1526 void MergeResultWindow::slotCursorUpdate()
joachim99@8 1527 {
joachim99@8 1528 m_cursorTimer.stop();
joachim99@8 1529 m_bCursorOn = !m_bCursorOn;
joachim99@8 1530
joachim99@8 1531 if ( isVisible() )
joachim99@8 1532 paintEvent(0);
joachim99@8 1533
joachim99@8 1534 m_cursorTimer.start(500,true);
joachim99@8 1535 }
joachim99@8 1536
joachim99@8 1537
joachim99@8 1538 void MergeResultWindow::wheelEvent( QWheelEvent* e )
joachim99@8 1539 {
joachim99@8 1540 int d = -e->delta()*QApplication::wheelScrollLines()/120;
joachim99@8 1541 e->accept();
joachim99@8 1542 scroll( 0, min2(d, getNofVisibleLines()) );
joachim99@8 1543 }
joachim99@8 1544
joachim99@51 1545
joachim99@8 1546 void MergeResultWindow::keyPressEvent( QKeyEvent* e )
joachim99@8 1547 {
joachim99@8 1548 int y = m_cursorYPos;
joachim99@8 1549 MergeLineList::iterator mlIt;
joachim99@8 1550 MergeEditLineList::iterator melIt;
joachim99@8 1551 calcIteratorFromLineNr( y, mlIt, melIt );
joachim99@8 1552
joachim99@68 1553 QString str = melIt->getString( this );
joachim99@68 1554 int x = convertToPosInText( str, m_cursorXPos );
joachim99@8 1555
joachim99@8 1556 bool bCtrl = ( e->state() & ControlButton ) != 0 ;
joachim99@8 1557 bool bShift = ( e->state() & ShiftButton ) != 0 ;
joachim99@8 1558 #ifdef _WIN32
joachim99@8 1559 bool bAlt = ( e->state() & AltButton ) != 0 ;
joachim99@8 1560 if ( bCtrl && bAlt ){ bCtrl=false; bAlt=false; } // AltGr-Key pressed.
joachim99@8 1561 #endif
joachim99@8 1562
joachim99@8 1563 bool bYMoveKey = false;
joachim99@8 1564 // Special keys
joachim99@8 1565 switch ( e->key() )
joachim99@8 1566 {
joachim99@8 1567 case Key_Escape: break;
joachim99@8 1568 //case Key_Tab: break;
joachim99@8 1569 case Key_Backtab: break;
joachim99@8 1570 case Key_Delete:
joachim99@8 1571 {
joachim99@68 1572 if ( deleteSelection2( str, x, y, mlIt, melIt )) break;
joachim99@8 1573 if( !melIt->isEditableText() ) break;
joachim99@68 1574 if (x>=(int)str.length())
joachim99@8 1575 {
joachim99@58 1576 if ( y<m_totalSize-1 )
joachim99@8 1577 {
joachim99@8 1578 setModified();
joachim99@8 1579 MergeLineList::iterator mlIt1;
joachim99@8 1580 MergeEditLineList::iterator melIt1;
joachim99@8 1581 calcIteratorFromLineNr( y+1, mlIt1, melIt1 );
joachim99@8 1582 if ( melIt1->isEditableText() )
joachim99@8 1583 {
joachim99@68 1584 QString s2 = melIt1->getString( this );
joachim99@68 1585 melIt->setString( str + s2 );
joachim99@8 1586
joachim99@8 1587 // Remove the line
joachim99@8 1588 if ( mlIt1->mergeEditLineList.size()>1 )
joachim99@8 1589 mlIt1->mergeEditLineList.erase( melIt1 );
joachim99@8 1590 else
joachim99@8 1591 melIt1->setRemoved();
joachim99@8 1592 }
joachim99@8 1593 }
joachim99@8 1594 }
joachim99@8 1595 else
joachim99@8 1596 {
joachim99@68 1597 QString s = str.left(x);
joachim99@68 1598 s += str.mid( x+1 );
joachim99@8 1599 melIt->setString( s );
joachim99@8 1600 setModified();
joachim99@8 1601 }
joachim99@8 1602 break;
joachim99@8 1603 }
joachim99@8 1604 case Key_Backspace:
joachim99@8 1605 {
joachim99@68 1606 if ( deleteSelection2( str, x, y, mlIt, melIt )) break;
joachim99@8 1607 if( !melIt->isEditableText() ) break;
joachim99@8 1608 if (x==0)
joachim99@8 1609 {
joachim99@8 1610 if ( y>0 )
joachim99@8 1611 {
joachim99@8 1612 setModified();
joachim99@8 1613 MergeLineList::iterator mlIt1;
joachim99@8 1614 MergeEditLineList::iterator melIt1;
joachim99@8 1615 calcIteratorFromLineNr( y-1, mlIt1, melIt1 );
joachim99@8 1616 if ( melIt1->isEditableText() )
joachim99@8 1617 {
joachim99@68 1618 QString s1 = melIt1->getString( this );
joachim99@68 1619 melIt1->setString( s1 + str );
joachim99@8 1620
joachim99@8 1621 // Remove the previous line
joachim99@8 1622 if ( mlIt->mergeEditLineList.size()>1 )
joachim99@8 1623 mlIt->mergeEditLineList.erase( melIt );
joachim99@8 1624 else
joachim99@8 1625 melIt->setRemoved();
joachim99@8 1626
joachim99@8 1627 --y;
joachim99@68 1628 x=str.length();
joachim99@8 1629 }
joachim99@8 1630 }
joachim99@8 1631 }
joachim99@8 1632 else
joachim99@8 1633 {
joachim99@68 1634 QString s = str.left( x-1 );
joachim99@68 1635 s += str.mid( x );
joachim99@8 1636 --x;
joachim99@8 1637 melIt->setString( s );
joachim99@8 1638 setModified();
joachim99@8 1639 }
joachim99@8 1640 break;
joachim99@8 1641 }
joachim99@8 1642 case Key_Return:
joachim99@8 1643 case Key_Enter:
joachim99@8 1644 {
joachim99@8 1645 if( !melIt->isEditableText() ) break;
joachim99@68 1646 deleteSelection2( str, x, y, mlIt, melIt );
joachim99@8 1647 setModified();
joachim99@68 1648 QString indentation;
joachim99@8 1649 if ( m_pOptionDialog->m_bAutoIndentation )
joachim99@8 1650 { // calc last indentation
joachim99@8 1651 MergeLineList::iterator mlIt1 = mlIt;
joachim99@8 1652 MergeEditLineList::iterator melIt1 = melIt;
joachim99@8 1653 for(;;) {
joachim99@68 1654 const QString s = melIt1->getString(this);
joachim99@68 1655 if ( !s.isEmpty() ) {
joachim99@68 1656 unsigned int i;
joachim99@68 1657 for( i=0; i<s.length(); ++i ){ if(s[i]!=' ' && s[i]!='\t') break; }
joachim99@68 1658 if (i<s.length()) {
joachim99@68 1659 indentation = s.left(i);
joachim99@8 1660 break;
joachim99@8 1661 }
joachim99@8 1662 }
joachim99@8 1663 --melIt1;
joachim99@8 1664 if ( melIt1 == mlIt1->mergeEditLineList.end() ) {
joachim99@8 1665 --mlIt1;
joachim99@8 1666 if ( mlIt1 == m_mergeLineList.end() ) break;
joachim99@8 1667 melIt1 = mlIt1->mergeEditLineList.end();
joachim99@8 1668 --melIt1;
joachim99@8 1669 }
joachim99@8 1670 }
joachim99@8 1671 }
joachim99@8 1672 MergeEditLine mel;
joachim99@68 1673 mel.setString( indentation + str.mid(x) );
joachim99@8 1674
joachim99@68 1675 if ( x<(int)str.length() ) // Cut off the old line.
joachim99@8 1676 {
joachim99@8 1677 // Since ps possibly points into melIt->str, first copy it into a temporary.
joachim99@68 1678 QString temp = str.left(x);
joachim99@8 1679 melIt->setString( temp );
joachim99@8 1680 }
joachim99@8 1681
joachim99@8 1682 ++melIt;
joachim99@8 1683 mlIt->mergeEditLineList.insert( melIt, mel );
joachim99@68 1684 x = indentation.length();
joachim99@8 1685 ++y;
joachim99@8 1686 break;
joachim99@8 1687 }
joachim99@8 1688 case Key_Insert: m_bInsertMode = !m_bInsertMode; break;
joachim99@8 1689 case Key_Pause: break;
joachim99@8 1690 case Key_Print: break;
joachim99@8 1691 case Key_SysReq: break;
joachim99@8 1692 case Key_Home: x=0; if(bCtrl){y=0; } break; // cursor movement
joachim99@8 1693 case Key_End: x=INT_MAX; if(bCtrl){y=INT_MAX;} break;
joachim99@8 1694
joachim99@8 1695 case Key_Left:
joachim99@68 1696 case Key_Right:
joachim99@68 1697 if ( (e->key()==Key_Left) ^ m_pOptionDialog->m_bRightToLeftLanguage ) // operator^: XOR
joachim99@8 1698 {
joachim99@68 1699 if ( !bCtrl )
joachim99@68 1700 {
joachim99@68 1701 --x;
joachim99@68 1702 if(x<0 && y>0){--y; x=INT_MAX;}
joachim99@68 1703 }
joachim99@68 1704 else
joachim99@68 1705 {
joachim99@68 1706 while( x>0 && (str[x-1]==' ' || str[x-1]=='\t') ) --x;
joachim99@68 1707 while( x>0 && (str[x-1]!=' ' && str[x-1]!='\t') ) --x;
joachim99@68 1708 }
joachim99@8 1709 }
joachim99@8 1710 else
joachim99@8 1711 {
joachim99@68 1712 if ( !bCtrl )
joachim99@68 1713 {
joachim99@68 1714 ++x; if(x>(int)str.length() && y<m_totalSize-1){ ++y; x=0; }
joachim99@68 1715 }
joachim99@8 1716
joachim99@68 1717 else
joachim99@68 1718 {
joachim99@68 1719 while( x<(int)str.length() && (str[x]==' ' || str[x]=='\t') ) ++x;
joachim99@68 1720 while( x<(int)str.length() && (str[x]!=' ' && str[x]!='\t') ) ++x;
joachim99@68 1721 }
joachim99@8 1722 }
joachim99@8 1723 break;
joachim99@8 1724
joachim99@8 1725 case Key_Up: --y; bYMoveKey=true; break;
joachim99@8 1726 case Key_Down: ++y; bYMoveKey=true; break;
joachim99@8 1727 case Key_PageUp: y-=getNofVisibleLines(); bYMoveKey=true; break;
joachim99@8 1728 case Key_PageDown: y+=getNofVisibleLines(); bYMoveKey=true; break;
joachim99@8 1729 default:
joachim99@8 1730 {
joachim99@8 1731 QString t = e->text();
joachim99@8 1732 if( t.isEmpty() || bCtrl )
joachim99@8 1733 { e->ignore(); return; }
joachim99@8 1734 else
joachim99@8 1735 {
joachim99@8 1736 if( bCtrl )
joachim99@8 1737 {
joachim99@8 1738 e->ignore(); return;
joachim99@8 1739 }
joachim99@8 1740 else
joachim99@8 1741 {
joachim99@8 1742 if( !melIt->isEditableText() ) break;
joachim99@68 1743 deleteSelection2( str, x, y, mlIt, melIt );
joachim99@8 1744
joachim99@8 1745 setModified();
joachim99@8 1746 // Characters to insert
joachim99@68 1747 QString s=str;
joachim99@8 1748 if ( t[0]=='\t' && m_pOptionDialog->m_bReplaceTabs )
joachim99@8 1749 {
joachim99@8 1750 int spaces = (m_cursorXPos / g_tabSize + 1)*g_tabSize - m_cursorXPos;
joachim99@8 1751 t.fill( ' ', spaces );
joachim99@8 1752 }
joachim99@8 1753 if ( m_bInsertMode )
joachim99@68 1754 s.insert( x, t );
joachim99@8 1755 else
joachim99@68 1756 s.replace( x, t.length(), t );
joachim99@8 1757
joachim99@8 1758 melIt->setString( s );
joachim99@8 1759 x += t.length();
joachim99@8 1760 bShift = false;
joachim99@8 1761 }
joachim99@8 1762 }
joachim99@8 1763 }
joachim99@8 1764 }
joachim99@8 1765
joachim99@58 1766 y = minMaxLimiter( y, 0, m_totalSize-1 );
joachim99@8 1767
joachim99@8 1768 calcIteratorFromLineNr( y, mlIt, melIt );
joachim99@68 1769 str = melIt->getString( this );
joachim99@8 1770
joachim99@68 1771 x = minMaxLimiter( x, 0, (int)str.length() );
joachim99@8 1772
joachim99@8 1773 int newFirstLine = m_firstLine;
joachim99@8 1774 int newFirstColumn = m_firstColumn;
joachim99@8 1775
joachim99@8 1776 if ( y<m_firstLine )
joachim99@8 1777 newFirstLine = y;
joachim99@8 1778 else if ( y > m_firstLine + getNofVisibleLines() )
joachim99@8 1779 newFirstLine = y - getNofVisibleLines();
joachim99@8 1780
joachim99@8 1781 if (bYMoveKey)
joachim99@68 1782 x=convertToPosInText( str, m_cursorOldXPos );
joachim99@8 1783
joachim99@68 1784 int xOnScreen = convertToPosOnScreen( str, x );
joachim99@8 1785 if ( xOnScreen<m_firstColumn )
joachim99@8 1786 newFirstColumn = xOnScreen;
joachim99@8 1787 else if ( xOnScreen > m_firstColumn + getNofVisibleColumns() )
joachim99@8 1788 newFirstColumn = xOnScreen - getNofVisibleColumns();
joachim99@8 1789
joachim99@8 1790 if ( bShift )
joachim99@8 1791 {
joachim99@8 1792 if (m_selection.firstLine==-1)
joachim99@8 1793 m_selection.start( m_cursorYPos, m_cursorXPos );
joachim99@8 1794
joachim99@8 1795 m_selection.end( y, xOnScreen );
joachim99@8 1796 }
joachim99@8 1797 else
joachim99@8 1798 m_selection.reset();
joachim99@8 1799
joachim99@8 1800 m_cursorYPos = y;
joachim99@8 1801 m_cursorXPos = xOnScreen;
joachim99@8 1802 if ( ! bYMoveKey )
joachim99@8 1803 m_cursorOldXPos = m_cursorXPos;
joachim99@8 1804
joachim99@8 1805 m_bCursorOn = false;
joachim99@8 1806
joachim99@8 1807 if ( newFirstLine!=m_firstLine || newFirstColumn!=m_firstColumn )
joachim99@8 1808 {
joachim99@8 1809 m_bCursorOn = true;
joachim99@8 1810 scroll( newFirstColumn-m_firstColumn, newFirstLine-m_firstLine );
joachim99@8 1811 return;
joachim99@8 1812 }
joachim99@8 1813
joachim99@8 1814 m_bCursorOn = true;
joachim99@8 1815 update();
joachim99@8 1816 }
joachim99@8 1817
joachim99@8 1818 void MergeResultWindow::calcIteratorFromLineNr(
joachim99@8 1819 int line,
joachim99@8 1820 MergeResultWindow::MergeLineList::iterator& mlIt,
joachim99@8 1821 MergeResultWindow::MergeEditLineList::iterator& melIt
joachim99@8 1822 )
joachim99@8 1823 {
joachim99@8 1824 for( mlIt = m_mergeLineList.begin(); mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 1825 {
joachim99@8 1826 MergeLine& ml = *mlIt;
joachim99@8 1827 if ( line > ml.mergeEditLineList.size() )
joachim99@8 1828 {
joachim99@8 1829 line -= ml.mergeEditLineList.size();
joachim99@8 1830 }
joachim99@8 1831 else
joachim99@8 1832 {
joachim99@8 1833 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt )
joachim99@8 1834 {
joachim99@8 1835 --line;
joachim99@8 1836 if (line<0) return;
joachim99@8 1837 }
joachim99@8 1838 }
joachim99@8 1839 }
joachim99@8 1840 assert(false);
joachim99@8 1841 }
joachim99@8 1842
joachim99@8 1843
joachim99@8 1844 QString MergeResultWindow::getSelection()
joachim99@8 1845 {
joachim99@8 1846 QString selectionString;
joachim99@8 1847
joachim99@8 1848 int line = 0;
joachim99@8 1849 MergeLineList::iterator mlIt = m_mergeLineList.begin();
joachim99@8 1850 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 1851 {
joachim99@8 1852 MergeLine& ml = *mlIt;
joachim99@8 1853 MergeEditLineList::iterator melIt;
joachim99@8 1854 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt )
joachim99@8 1855 {
joachim99@8 1856 MergeEditLine& mel = *melIt;
joachim99@8 1857
joachim99@8 1858 if ( m_selection.lineWithin(line) )
joachim99@8 1859 {
joachim99@8 1860 int outPos = 0;
joachim99@8 1861 if (mel.isEditableText())
joachim99@8 1862 {
joachim99@68 1863 const QString str = mel.getString( this );
joachim99@8 1864
joachim99@8 1865 // Consider tabs
joachim99@8 1866
joachim99@68 1867 for( unsigned int i=0; i<str.length(); ++i )
joachim99@8 1868 {
joachim99@8 1869 int spaces = 1;
joachim99@68 1870 if ( str[i]=='\t' )
joachim99@8 1871 {
joachim99@8 1872 spaces = tabber( outPos, g_tabSize );
joachim99@8 1873 }
joachim99@8 1874
joachim99@8 1875 if( m_selection.within( line, outPos ) )
joachim99@8 1876 {
joachim99@68 1877 selectionString += str[i];
joachim99@8 1878 }
joachim99@8 1879
joachim99@8 1880 outPos += spaces;
joachim99@8 1881 }
joachim99@8 1882 }
joachim99@8 1883 else if ( mel.isConflict() )
joachim99@8 1884 {
joachim99@58 1885 selectionString += i18n("<Merge Conflict>");
joachim99@8 1886 }
joachim99@68 1887
joachim99@8 1888 if( m_selection.within( line, outPos ) )
joachim99@8 1889 {
joachim99@8 1890 #ifdef _WIN32
joachim99@8 1891 selectionString += '\r';
joachim99@8 1892 #endif
joachim99@8 1893 selectionString += '\n';
joachim99@8 1894 }
joachim99@8 1895 }
joachim99@8 1896
joachim99@8 1897 ++line;
joachim99@8 1898 }
joachim99@8 1899 }
joachim99@8 1900
joachim99@8 1901 return selectionString;
joachim99@8 1902 }
joachim99@8 1903
joachim99@68 1904 bool MergeResultWindow::deleteSelection2( QString& s, int& x, int& y,
joachim99@8 1905 MergeLineList::iterator& mlIt, MergeEditLineList::iterator& melIt )
joachim99@8 1906 {
joachim99@8 1907 if (m_selection.firstLine!=-1 && m_selection.bSelectionContainsData )
joachim99@8 1908 {
joachim99@8 1909 deleteSelection();
joachim99@8 1910 y = m_cursorYPos;
joachim99@8 1911 calcIteratorFromLineNr( y, mlIt, melIt );
joachim99@68 1912 s = melIt->getString( this );
joachim99@68 1913 x = convertToPosInText( s, m_cursorXPos );
joachim99@8 1914 return true;
joachim99@8 1915 }
joachim99@8 1916 return false;
joachim99@8 1917 }
joachim99@8 1918
joachim99@8 1919 void MergeResultWindow::deleteSelection()
joachim99@8 1920 {
joachim99@8 1921 if ( m_selection.firstLine==-1 || !m_selection.bSelectionContainsData )
joachim99@8 1922 {
joachim99@8 1923 return;
joachim99@8 1924 }
joachim99@8 1925 setModified();
joachim99@8 1926
joachim99@8 1927 int line = 0;
joachim99@8 1928 MergeLineList::iterator mlItFirst;
joachim99@8 1929 MergeEditLineList::iterator melItFirst;
joachim99@68 1930 QString firstLineString;
joachim99@8 1931
joachim99@8 1932 int firstLine = -1;
joachim99@8 1933 int lastLine = -1;
joachim99@8 1934
joachim99@8 1935 MergeLineList::iterator mlIt;
joachim99@8 1936 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 1937 {
joachim99@8 1938 MergeLine& ml = *mlIt;
joachim99@8 1939 MergeEditLineList::iterator melIt;
joachim99@8 1940 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt )
joachim99@8 1941 {
joachim99@8 1942 MergeEditLine& mel = *melIt;
joachim99@8 1943
joachim99@8 1944 if ( mel.isEditableText() && m_selection.lineWithin(line) )
joachim99@8 1945 {
joachim99@8 1946 if ( firstLine==-1 )
joachim99@8 1947 firstLine = line;
joachim99@8 1948 lastLine = line;
joachim99@8 1949 }
joachim99@8 1950
joachim99@8 1951 ++line;
joachim99@8 1952 }
joachim99@8 1953 }
joachim99@8 1954
joachim99@8 1955 if ( firstLine == -1 )
joachim99@8 1956 {
joachim99@8 1957 return; // Nothing to delete.
joachim99@8 1958 }
joachim99@8 1959
joachim99@8 1960 line = 0;
joachim99@8 1961 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 1962 {
joachim99@8 1963 MergeLine& ml = *mlIt;
joachim99@8 1964 MergeEditLineList::iterator melIt, melIt1;
joachim99@8 1965 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); )
joachim99@8 1966 {
joachim99@8 1967 MergeEditLine& mel = *melIt;
joachim99@8 1968 melIt1 = melIt;
joachim99@8 1969 ++melIt1;
joachim99@8 1970
joachim99@8 1971 if ( mel.isEditableText() && m_selection.lineWithin(line) )
joachim99@8 1972 {
joachim99@68 1973 QString lineString = mel.getString( this );
joachim99@8 1974
joachim99@8 1975 int firstPosInLine = m_selection.firstPosInLine(line);
joachim99@8 1976 int lastPosInLine = m_selection.lastPosInLine(line);
joachim99@8 1977
joachim99@8 1978 if ( line==firstLine )
joachim99@8 1979 {
joachim99@8 1980 mlItFirst = mlIt;
joachim99@8 1981 melItFirst = melIt;
joachim99@68 1982 int pos = convertToPosInText( lineString, firstPosInLine );
joachim99@68 1983 firstLineString = lineString.left( pos );
joachim99@8 1984 }
joachim99@8 1985
joachim99@8 1986 if ( line==lastLine )
joachim99@8 1987 {
joachim99@8 1988 // This is the last line in the selection
joachim99@68 1989 int pos = convertToPosInText( lineString, lastPosInLine );
joachim99@68 1990 firstLineString += lineString.mid( pos ); // rest of line
joachim99@8 1991 melItFirst->setString( firstLineString );
joachim99@8 1992 }
joachim99@8 1993
joachim99@8 1994 if ( line!=firstLine )
joachim99@8 1995 {
joachim99@8 1996 // Remove the line
joachim99@8 1997 if ( mlIt->mergeEditLineList.size()>1 )
joachim99@58 1998 mlIt->mergeEditLineList.erase( melIt );
joachim99@8 1999 else
joachim99@58 2000 melIt->setRemoved();
joachim99@8 2001 }
joachim99@8 2002 }
joachim99@8 2003
joachim99@8 2004 ++line;
joachim99@8 2005 melIt = melIt1;
joachim99@8 2006 }
joachim99@8 2007 }
joachim99@8 2008
joachim99@8 2009 m_cursorYPos = m_selection.beginLine();
joachim99@8 2010 m_cursorXPos = m_selection.beginPos();
joachim99@8 2011 m_cursorOldXPos = m_cursorXPos;
joachim99@8 2012
joachim99@8 2013 m_selection.reset();
joachim99@8 2014 }
joachim99@8 2015
joachim99@66 2016 void MergeResultWindow::pasteClipboard( bool bFromSelection )
joachim99@8 2017 {
joachim99@8 2018 if (m_selection.firstLine != -1 )
joachim99@8 2019 deleteSelection();
joachim99@8 2020
joachim99@8 2021 setModified();
joachim99@8 2022
joachim99@8 2023 int y = m_cursorYPos;
joachim99@8 2024 MergeLineList::iterator mlIt;
joachim99@8 2025 MergeEditLineList::iterator melIt, melItAfter;
joachim99@8 2026 calcIteratorFromLineNr( y, mlIt, melIt );
joachim99@8 2027 melItAfter = melIt;
joachim99@8 2028 ++melItAfter;
joachim99@68 2029 QString str = melIt->getString( this );
joachim99@68 2030 int x = convertToPosInText( str, m_cursorXPos );
joachim99@8 2031
joachim99@66 2032 if ( !QApplication::clipboard()->supportsSelection() )
joachim99@66 2033 bFromSelection = false;
joachim99@8 2034
joachim99@68 2035 QString clipBoard = QApplication::clipboard()->text( bFromSelection ? QClipboard::Selection : QClipboard::Clipboard );
joachim99@68 2036
joachim99@68 2037 QString currentLine = str.left(x);
joachim99@68 2038 QString endOfLine = str.mid(x);
joachim99@8 2039 int i;
joachim99@68 2040 int len = clipBoard.length();
joachim99@68 2041 for( i=0; i<len; ++i )
joachim99@8 2042 {
joachim99@68 2043 QChar c = clipBoard[i];
joachim99@8 2044 if ( c == '\r' ) continue;
joachim99@8 2045 if ( c == '\n' )
joachim99@8 2046 {
joachim99@8 2047 melIt->setString( currentLine );
joachim99@8 2048
joachim99@8 2049 melIt = mlIt->mergeEditLineList.insert( melItAfter, MergeEditLine() );
joachim99@8 2050 currentLine = "";
joachim99@8 2051 x=0;
joachim99@8 2052 ++y;
joachim99@8 2053 }
joachim99@8 2054 else
joachim99@8 2055 {
joachim99@8 2056 currentLine += c;
joachim99@8 2057 ++x;
joachim99@8 2058 }
joachim99@8 2059 }
joachim99@8 2060
joachim99@8 2061 currentLine += endOfLine;
joachim99@8 2062 melIt->setString( currentLine );
joachim99@8 2063
joachim99@8 2064 m_cursorYPos = y;
joachim99@8 2065 m_cursorXPos = convertToPosOnScreen( currentLine, x );
joachim99@8 2066 m_cursorOldXPos = m_cursorXPos;
joachim99@8 2067
joachim99@8 2068 update();
joachim99@8 2069 }
joachim99@8 2070
joachim99@8 2071 void MergeResultWindow::resetSelection()
joachim99@8 2072 {
joachim99@8 2073 m_selection.reset();
joachim99@8 2074 update();
joachim99@8 2075 }
joachim99@8 2076
joachim99@8 2077 void MergeResultWindow::setModified()
joachim99@8 2078 {
joachim99@8 2079 if (!m_bModified)
joachim99@8 2080 {
joachim99@8 2081 m_bModified = true;
joachim99@8 2082 emit modified();
joachim99@8 2083 }
joachim99@8 2084 }
joachim99@8 2085
joachim99@8 2086 /// Saves and returns true when successful.
joachim99@8 2087 bool MergeResultWindow::saveDocument( const QString& fileName )
joachim99@8 2088 {
joachim99@8 2089 m_fileName = fileName;
joachim99@8 2090
joachim99@8 2091 // Are still conflicts somewhere?
joachim99@8 2092 if ( getNrOfUnsolvedConflicts()>0 )
joachim99@8 2093 {
joachim99@8 2094 KMessageBox::error( this,
joachim99@8 2095 i18n("Not all conflicts are solved yet.\n"
joachim99@8 2096 "File not saved.\n"),
joachim99@51 2097 i18n("Conflicts Left"));
joachim99@8 2098 return false;
joachim99@8 2099 }
joachim99@8 2100
joachim99@8 2101 update();
joachim99@8 2102
joachim99@8 2103 FileAccess file( fileName, true /*bWantToWrite*/ );
joachim99@8 2104 if ( m_pOptionDialog->m_bDmCreateBakFiles && file.exists() )
joachim99@8 2105 {
joachim99@8 2106 bool bSuccess = file.createBackup(".orig");
joachim99@8 2107 if ( !bSuccess )
joachim99@8 2108 {
joachim99@68 2109 KMessageBox::error( this, file.getStatusText() + i18n("\n\nCreating backup failed. File not saved."), i18n("File Save Error") );
joachim99@8 2110 return false;
joachim99@8 2111 }
joachim99@8 2112 }
joachim99@8 2113
joachim99@8 2114 QByteArray dataArray;
joachim99@68 2115 QTextStream textOutStream(dataArray, IO_WriteOnly);
joachim99@68 2116 textOutStream.setCodec( m_pOptionDialog->m_pEncodingOut );
joachim99@68 2117
joachim99@68 2118 int line = 0;
joachim99@68 2119 MergeLineList::iterator mlIt = m_mergeLineList.begin();
joachim99@68 2120 for(mlIt = m_mergeLineList.begin();mlIt!=m_mergeLineList.end(); ++mlIt)
joachim99@8 2121 {
joachim99@68 2122 MergeLine& ml = *mlIt;
joachim99@68 2123 MergeEditLineList::iterator melIt;
joachim99@68 2124 for( melIt = ml.mergeEditLineList.begin(); melIt != ml.mergeEditLineList.end(); ++melIt )
joachim99@8 2125 {
joachim99@68 2126 MergeEditLine& mel = *melIt;
joachim99@68 2127
joachim99@68 2128 if ( mel.isEditableText() )
joachim99@8 2129 {
joachim99@68 2130 QString str = mel.getString( this );
joachim99@8 2131
joachim99@68 2132 if (line>0) // Prepend line feed, but not for first line
joachim99@8 2133 {
joachim99@68 2134 if ( m_pOptionDialog->m_lineEndStyle == eLineEndDos )
joachim99@68 2135 { str.prepend("\r\n"); }
joachim99@8 2136 else
joachim99@68 2137 { str.prepend("\n"); }
joachim99@8 2138 }
joachim99@8 2139
joachim99@68 2140 textOutStream << str;
joachim99@8 2141 }
joachim99@68 2142
joachim99@68 2143 ++line;
joachim99@8 2144 }
joachim99@8 2145 }
joachim99@68 2146 bool bSuccess = file.writeFile( dataArray.data(), dataArray.size() );
joachim99@8 2147 if ( ! bSuccess )
joachim99@8 2148 {
joachim99@51 2149 KMessageBox::error( this, i18n("Error while writing."), i18n("File Save Error") );
joachim99@8 2150 return false;
joachim99@8 2151 }
joachim99@8 2152
joachim99@8 2153 m_bModified = false;
joachim99@8 2154 update();
joachim99@8 2155
joachim99@8 2156 return true;
joachim99@8 2157 }
joachim99@8 2158
joachim99@68 2159 QString MergeResultWindow::getString( int lineIdx )
joachim99@8 2160 {
joachim99@8 2161 MergeResultWindow::MergeLineList::iterator mlIt;
joachim99@8 2162 MergeResultWindow::MergeEditLineList::iterator melIt;
joachim99@8 2163 calcIteratorFromLineNr( lineIdx, mlIt, melIt );
joachim99@68 2164 QString s = melIt->getString( this );
joachim99@68 2165 return s;
joachim99@8 2166 }
joachim99@8 2167
joachim99@68 2168 bool MergeResultWindow::findString( const QString& s, int& d3vLine, int& posInLine, bool bDirDown, bool bCaseSensitive )
joachim99@8 2169 {
joachim99@8 2170 int it = d3vLine;
joachim99@8 2171 int endIt = bDirDown ? getNofLines() : -1;
joachim99@8 2172 int step = bDirDown ? 1 : -1;
joachim99@8 2173 int startPos = posInLine;
joachim99@8 2174
joachim99@8 2175 for( ; it!=endIt; it+=step )
joachim99@8 2176 {
joachim99@68 2177 QString line = getString( it );
joachim99@8 2178 if ( !line.isEmpty() )
joachim99@8 2179 {
joachim99@8 2180 int pos = line.find( s, startPos, bCaseSensitive );
joachim99@8 2181 if ( pos != -1 )
joachim99@8 2182 {
joachim99@8 2183 d3vLine = it;
joachim99@8 2184 posInLine = pos;
joachim99@8 2185 return true;
joachim99@8 2186 }
joachim99@8 2187
joachim99@8 2188 startPos = 0;
joachim99@8 2189 }
joachim99@8 2190 }
joachim99@8 2191 return false;
joachim99@8 2192 }
joachim99@8 2193
joachim99@8 2194 void MergeResultWindow::setSelection( int firstLine, int startPos, int lastLine, int endPos )
joachim99@8 2195 {
joachim99@8 2196 m_selection.reset();
joachim99@8 2197 m_selection.start( firstLine, convertToPosOnScreen( getString(firstLine), startPos ) );
joachim99@8 2198 m_selection.end( lastLine, convertToPosOnScreen( getString(lastLine), endPos ) );
joachim99@8 2199 update();
joachim99@8 2200 }
joachim99@8 2201
joachim99@8 2202 Overview::Overview( QWidget* pParent, OptionDialog* pOptions )
joachim99@8 2203 : QWidget( pParent, 0, WRepaintNoErase )
joachim99@8 2204 {
joachim99@8 2205 m_pDiff3LineList = 0;
joachim99@8 2206 m_pOptions = pOptions;
joachim99@8 2207 m_bTripleDiff = false;
joachim99@66 2208 m_eOverviewMode = eOMNormal;
joachim99@66 2209 m_nofLines = 1;
joachim99@8 2210 setFixedWidth(20);
joachim99@8 2211 }
joachim99@8 2212
joachim99@8 2213 void Overview::init( Diff3LineList* pDiff3LineList, bool bTripleDiff )
joachim99@8 2214 {
joachim99@8 2215 m_pDiff3LineList = pDiff3LineList;
joachim99@8 2216 m_bTripleDiff = bTripleDiff;
joachim99@8 2217 m_pixmap.resize( QSize(0,0) ); // make sure that a redraw happens
joachim99@8 2218 update();
joachim99@8 2219 }
joachim99@8 2220
joachim99@51 2221 void Overview::slotRedraw()
joachim99@51 2222 {
joachim99@51 2223 m_pixmap.resize( QSize(0,0) ); // make sure that a redraw happens
joachim99@51 2224 update();
joachim99@51 2225 }
joachim99@51 2226
joachim99@8 2227 void Overview::setRange( int firstLine, int pageHeight )
joachim99@8 2228 {
joachim99@8 2229 m_firstLine = firstLine;
joachim99@8 2230 m_pageHeight = pageHeight;
joachim99@8 2231 update();
joachim99@8 2232 }
joachim99@8 2233 void Overview::setFirstLine( int firstLine )
joachim99@8 2234 {
joachim99@8 2235 m_firstLine = firstLine;
joachim99@8 2236 update();
joachim99@8 2237 }
joachim99@8 2238
joachim99@66 2239 void Overview::setOverviewMode( e_OverviewMode eOverviewMode )
joachim99@66 2240 {
joachim99@66 2241 m_eOverviewMode = eOverviewMode;
joachim99@66 2242 slotRedraw();
joachim99@66 2243 }
joachim99@66 2244
joachim99@66 2245 Overview::e_OverviewMode Overview::getOverviewMode()
joachim99@66 2246 {
joachim99@66 2247 return m_eOverviewMode;
joachim99@66 2248 }
joachim99@66 2249
joachim99@8 2250 void Overview::mousePressEvent( QMouseEvent* e )
joachim99@8 2251 {
joachim99@8 2252 int h = height()-1;
joachim99@66 2253 int h1 = h * m_pageHeight / max2(1,m_nofLines)+3;
joachim99@8 2254 if ( h>0 )
joachim99@66 2255 emit setLine( ( e->y() - h1/2 )*m_nofLines/h );
joachim99@8 2256 }
joachim99@8 2257
joachim99@8 2258 void Overview::mouseMoveEvent( QMouseEvent* e )
joachim99@8 2259 {
joachim99@8 2260 mousePressEvent(e);
joachim99@8 2261 }
joachim99@8 2262
joachim99@8 2263 void Overview::setPaintingAllowed( bool bAllowPainting )
joachim99@8 2264 {
joachim99@8 2265 if (m_bPaintingAllowed != bAllowPainting)
joachim99@8 2266 {
joachim99@8 2267 m_bPaintingAllowed = bAllowPainting;
joachim99@8 2268 if ( m_bPaintingAllowed ) update();
joachim99@8 2269 }
joachim99@8 2270 }
joachim99@8 2271
joachim99@66 2272 void Overview::drawColumn( QPainter& p, e_OverviewMode eOverviewMode, int x, int w, int h, int nofLines )
joachim99@66 2273 {
joachim99@66 2274 p.setPen(black);
joachim99@66 2275 p.drawLine( x, 0, x, h );
joachim99@66 2276
joachim99@66 2277 if (nofLines==0) return;
joachim99@66 2278
joachim99@66 2279 int line = 0;
joachim99@66 2280 int oldY = 0;
joachim99@66 2281 int oldConflictY = -1;
joachim99@66 2282 int wrapLineIdx=0;
joachim99@66 2283 Diff3LineList::const_iterator i;
joachim99@66 2284 for( i = m_pDiff3LineList->begin(); i!= m_pDiff3LineList->end(); )
joachim99@66 2285 {
joachim99@66 2286 const Diff3Line& d3l = *i;
joachim99@66 2287 int y = h * (line+1) / nofLines;
joachim99@66 2288 e_MergeDetails md;
joachim99@66 2289 bool bConflict;
joachim99@66 2290 bool bLineRemoved;
joachim99@66 2291 int src;
joachim99@66 2292 mergeOneLine( d3l, md, bConflict, bLineRemoved, src, !m_bTripleDiff );
joachim99@66 2293
joachim99@66 2294 QColor c = m_pOptions->m_bgColor;
joachim99@66 2295 bool bWhiteSpaceChange = false;
joachim99@66 2296 //if( bConflict ) c=m_pOptions->m_colorForConflict;
joachim99@66 2297 //else
joachim99@66 2298 if ( eOverviewMode==eOMNormal )
joachim99@66 2299 {
joachim99@66 2300 switch( md )
joachim99@66 2301 {
joachim99@66 2302 case eDefault:
joachim99@66 2303 case eNoChange:
joachim99@66 2304 c = m_pOptions->m_bgColor;
joachim99@66 2305 break;
joachim99@66 2306
joachim99@66 2307 case eBAdded:
joachim99@66 2308 case eBDeleted:
joachim99@66 2309 case eBChanged:
joachim99@66 2310 c = bConflict ? m_pOptions->m_colorForConflict : m_pOptions->m_colorB;
joachim99@66 2311 bWhiteSpaceChange = d3l.bAEqB || d3l.bWhiteLineA && d3l.bWhiteLineB;
joachim99@66 2312 break;
joachim99@66 2313
joachim99@66 2314 case eCAdded:
joachim99@66 2315 case eCDeleted:
joachim99@66 2316 case eCChanged:
joachim99@66 2317 bWhiteSpaceChange = d3l.bAEqC || d3l.bWhiteLineA && d3l.bWhiteLineC;
joachim99@66 2318 c = bConflict ? m_pOptions->m_colorForConflict : m_pOptions->m_colorC;
joachim99@66 2319 break;
joachim99@66 2320
joachim99@66 2321 case eBCChanged: // conflict
joachim99@66 2322 case eBCChangedAndEqual: // possible conflict
joachim99@66 2323 case eBCDeleted: // possible conflict
joachim99@66 2324 case eBChanged_CDeleted: // conflict
joachim99@66 2325 case eCChanged_BDeleted: // conflict
joachim99@66 2326 case eBCAdded: // conflict
joachim99@66 2327 case eBCAddedAndEqual: // possible conflict
joachim99@66 2328 c=m_pOptions->m_colorForConflict;
joachim99@66 2329 break;
joachim99@66 2330 default: assert(false); break;
joachim99@66 2331 }
joachim99@66 2332 }
joachim99@66 2333 else if ( eOverviewMode==eOMAvsB )
joachim99@66 2334 {
joachim99@66 2335 switch( md )
joachim99@66 2336 {
joachim99@66 2337 case eDefault:
joachim99@66 2338 case eNoChange:
joachim99@66 2339 case eCAdded:
joachim99@66 2340 case eCDeleted:
joachim99@66 2341 case eCChanged: break;
joachim99@66 2342 default: c = m_pOptions->m_colorForConflict;
joachim99@66 2343 bWhiteSpaceChange = d3l.bAEqB || d3l.bWhiteLineA && d3l.bWhiteLineB;
joachim99@66 2344 break;
joachim99@66 2345 }
joachim99@66 2346 }
joachim99@66 2347 else if ( eOverviewMode==eOMAvsC )
joachim99@66 2348 {
joachim99@66 2349 switch( md )
joachim99@66 2350 {
joachim99@66 2351 case eDefault:
joachim99@66 2352 case eNoChange:
joachim99@66 2353 case eBAdded:
joachim99@66 2354 case eBDeleted:
joachim99@66 2355 case eBChanged: break;
joachim99@66 2356 default: c = m_pOptions->m_colorForConflict;
joachim99@66 2357 bWhiteSpaceChange = d3l.bAEqC || d3l.bWhiteLineA && d3l.bWhiteLineC;
joachim99@66 2358 break;
joachim99@66 2359 }
joachim99@66 2360 }
joachim99@66 2361 else if ( eOverviewMode==eOMBvsC )
joachim99@66 2362 {
joachim99@66 2363 switch( md )
joachim99@66 2364 {
joachim99@66 2365 case eDefault:
joachim99@66 2366 case eNoChange:
joachim99@66 2367 case eBCChangedAndEqual:
joachim99@66 2368 case eBCDeleted:
joachim99@66 2369 case eBCAddedAndEqual: break;
joachim99@66 2370 default: c=m_pOptions->m_colorForConflict;
joachim99@66 2371 bWhiteSpaceChange = d3l.bBEqC || d3l.bWhiteLineB && d3l.bWhiteLineC;
joachim99@66 2372 break;
joachim99@66 2373 }
joachim99@66 2374 }
joachim99@66 2375
joachim99@66 2376 if (!bWhiteSpaceChange || m_pOptions->m_bShowWhiteSpace )
joachim99@66 2377 {
joachim99@66 2378 // Make sure that lines with conflict are not overwritten.
joachim99@66 2379 if ( c == m_pOptions->m_colorForConflict )
joachim99@66 2380 {
joachim99@66 2381 p.fillRect(x+1, oldY, w, max2(1,y-oldY), bWhiteSpaceChange ? QBrush(c,Dense4Pattern) : c );
joachim99@66 2382 oldConflictY = oldY;
joachim99@66 2383 }
joachim99@66 2384 else if ( c!=m_pOptions->m_bgColor && oldY>oldConflictY )
joachim99@66 2385 {
joachim99@66 2386 p.fillRect(x+1, oldY, w, max2(1,y-oldY), bWhiteSpaceChange ? QBrush(c,Dense4Pattern) : c );
joachim99@66 2387 }
joachim99@66 2388 }
joachim99@66 2389
joachim99@66 2390 oldY = y;
joachim99@66 2391
joachim99@66 2392 ++line;
joachim99@66 2393 if ( m_pOptions->m_bWordWrap )
joachim99@66 2394 {
joachim99@66 2395 ++wrapLineIdx;
joachim99@66 2396 if(wrapLineIdx>=d3l.linesNeededForDisplay)
joachim99@66 2397 {
joachim99@66 2398 wrapLineIdx=0;
joachim99@66 2399 ++i;
joachim99@66 2400 }
joachim99@66 2401 }
joachim99@66 2402 else
joachim99@66 2403 {
joachim99@66 2404 ++i;
joachim99@66 2405 }
joachim99@66 2406 }
joachim99@66 2407 }
joachim99@66 2408
joachim99@8 2409 void Overview::paintEvent( QPaintEvent* )
joachim99@8 2410 {
joachim99@8 2411 if (m_pDiff3LineList==0 || !m_bPaintingAllowed ) return;
joachim99@8 2412 int h = height()-1;
joachim99@8 2413 int w = width();
joachim99@66 2414
joachim99@8 2415
joachim99@8 2416 if ( m_pixmap.size() != size() )
joachim99@8 2417 {
joachim99@66 2418 if ( m_pOptions->m_bWordWrap )
joachim99@66 2419 {
joachim99@66 2420 m_nofLines = 0;
joachim99@66 2421 Diff3LineList::const_iterator i;
joachim99@66 2422 for( i = m_pDiff3LineList->begin(); i!= m_pDiff3LineList->end(); ++i )
joachim99@66 2423 {
joachim99@66 2424 m_nofLines += i->linesNeededForDisplay;
joachim99@66 2425 }
joachim99@66 2426 }
joachim99@66 2427 else
joachim99@66 2428 {
joachim99@66 2429 m_nofLines = m_pDiff3LineList->size();
joachim99@66 2430 }
joachim99@66 2431
joachim99@8 2432 m_pixmap.resize( size() );
joachim99@8 2433
joachim99@8 2434 QPainter p(&m_pixmap);
joachim99@66 2435 p.fillRect( rect(), m_pOptions->m_bgColor );
joachim99@8 2436
joachim99@66 2437 if ( !m_bTripleDiff || m_eOverviewMode == eOMNormal )
joachim99@8 2438 {
joachim99@66 2439 drawColumn( p, eOMNormal, 0, w, h, m_nofLines );
joachim99@8 2440 }
joachim99@66 2441 else
joachim99@66 2442 {
joachim99@66 2443 drawColumn( p, eOMNormal, 0, w/2, h, m_nofLines );
joachim99@66 2444 drawColumn( p, m_eOverviewMode, w/2, w/2, h, m_nofLines );
joachim99@66 2445 }
joachim99@8 2446 }
joachim99@8 2447
joachim99@8 2448 QPainter painter( this );
joachim99@8 2449 painter.drawPixmap( 0,0, m_pixmap );
joachim99@8 2450
joachim99@66 2451 int y1 = h * m_firstLine / m_nofLines-1;
joachim99@66 2452 int h1 = h * m_pageHeight / m_nofLines+3;
joachim99@8 2453 painter.setPen(black);
joachim99@8 2454 painter.drawRect( 1, y1, w-1, h1 );
joachim99@8 2455 }
joachim99@8 2456
joachim99@8 2457