annotate kdiff3/src/mergeresultwindow.cpp @ 66:efe33e938730

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