annotate kdiff3/src/mergeresultwindow.cpp @ 57:023fbd76c1e3

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