joachim99@8: /*************************************************************************** joachim99@58: pdiff.cpp - Implementation for class KDiff3App joachim99@58: --------------- joachim99@69: begin : Mon March 18 20:04:50 CET 2002 joachim99@77: copyright : (C) 2002-2007 by Joachim Eibl joachim99@69: email : joachim.eibl at gmx.de joachim99@8: ***************************************************************************/ joachim99@8: joachim99@8: /*************************************************************************** joachim99@8: * * joachim99@8: * This program is free software; you can redistribute it and/or modify * joachim99@8: * it under the terms of the GNU General Public License as published by * joachim99@8: * the Free Software Foundation; either version 2 of the License, or * joachim99@8: * (at your option) any later version. * joachim99@8: * * joachim99@8: ***************************************************************************/ joachim99@8: joachim99@69: #include "difftextwindow.h" joachim99@69: #include "mergeresultwindow.h" joachim99@8: #include "directorymergewindow.h" joachim99@69: #include "smalldialogs.h" joachim99@8: joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@69: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@69: #include joachim99@69: #include joachim99@75: #include joachim99@75: #include joachim99@75: #include Chris@113: #include joachim99@75: joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@75: joachim99@75: joachim99@8: #include joachim99@8: joachim99@8: #include "kdiff3.h" joachim99@8: #include "optiondialog.h" joachim99@8: #include "fileaccess.h" joachim99@8: #ifdef _WIN32 joachim99@8: #include joachim99@8: #else joachim99@8: #include joachim99@80: #include joachim99@8: #endif joachim99@8: joachim99@51: #include "gnudiff_diff.h" joachim99@51: joachim99@8: bool g_bIgnoreWhiteSpace = true; joachim99@8: bool g_bIgnoreTrivialMatches = true; joachim99@8: joachim99@8: joachim99@58: bool KDiff3App::runDiff( const LineData* p1, int size1, const LineData* p2, int size2, DiffList& diffList ) joachim99@8: { joachim99@66: ProgressProxy pp; joachim99@68: static GnuDiff gnuDiff; // All values are initialized with zeros. joachim99@68: joachim99@66: pp.setCurrent(0); joachim99@51: joachim99@8: diffList.clear(); joachim99@69: if ( p1[0].pLine==0 || p2[0].pLine==0 || size1==0 || size2==0 ) joachim99@51: { joachim99@51: Diff d( 0,0,0); joachim99@51: if ( p1[0].pLine==0 && p2[0].pLine==0 && size1 == size2 ) joachim99@51: d.nofEquals = size1; joachim99@69: else joachim99@53: { joachim99@53: d.diff1=size1; joachim99@53: d.diff2=size2; joachim99@53: } joachim99@51: joachim99@51: diffList.push_back(d); joachim99@51: } joachim99@53: else joachim99@68: { joachim99@53: GnuDiff::comparison comparisonInput; joachim99@53: memset( &comparisonInput, 0, sizeof(comparisonInput) ); joachim99@53: comparisonInput.parent = 0; joachim99@69: comparisonInput.file[0].buffer = p1[0].pLine;//ptr to buffer joachim99@68: comparisonInput.file[0].buffered = (p1[size1-1].pLine-p1[0].pLine+p1[size1-1].size); // size of buffer joachim99@69: comparisonInput.file[1].buffer = p2[0].pLine;//ptr to buffer joachim99@68: comparisonInput.file[1].buffered = (p2[size2-1].pLine-p2[0].pLine+p2[size2-1].size); // size of buffer joachim99@68: joachim99@53: gnuDiff.ignore_white_space = GnuDiff::IGNORE_ALL_SPACE; // I think nobody needs anything else ... joachim99@53: gnuDiff.bIgnoreWhiteSpace = true; joachim99@53: gnuDiff.bIgnoreNumbers = m_pOptionDialog->m_bIgnoreNumbers; joachim99@53: gnuDiff.minimal = m_pOptionDialog->m_bTryHard; joachim99@66: gnuDiff.ignore_case = false; joachim99@53: GnuDiff::change* script = gnuDiff.diff_2_files( &comparisonInput ); joachim99@68: joachim99@53: int equalLinesAtStart = comparisonInput.file[0].prefix_lines; joachim99@53: int currentLine1 = 0; joachim99@53: int currentLine2 = 0; joachim99@53: GnuDiff::change* p=0; joachim99@53: for (GnuDiff::change* e = script; e; e = p) joachim99@51: { joachim99@53: Diff d(0,0,0); joachim99@53: d.nofEquals = e->line0 - currentLine1; joachim99@53: assert( d.nofEquals == e->line1 - currentLine2 ); joachim99@53: d.diff1 = e->deleted; joachim99@53: d.diff2 = e->inserted; joachim99@53: currentLine1 += d.nofEquals + d.diff1; joachim99@53: currentLine2 += d.nofEquals + d.diff2; joachim99@53: diffList.push_back(d); joachim99@68: joachim99@53: p = e->link; joachim99@53: free (e); joachim99@51: } joachim99@68: joachim99@66: if ( diffList.empty() ) joachim99@51: { joachim99@66: Diff d(0,0,0); joachim99@66: d.nofEquals = min2(size1,size2); joachim99@66: d.diff1 = size1 - d.nofEquals; joachim99@66: d.diff2 = size2 - d.nofEquals; joachim99@66: diffList.push_back(d); joachim99@66: /* Diff d(0,0,0); joachim99@66: d.nofEquals = equalLinesAtStart; joachim99@66: if ( gnuDiff.files[0].missing_newline != gnuDiff.files[1].missing_newline ) joachim99@66: { joachim99@66: d.diff1 = gnuDiff.files[0].missing_newline ? 0 : 1; joachim99@66: d.diff2 = gnuDiff.files[1].missing_newline ? 0 : 1; joachim99@66: ++d.nofEquals; joachim99@66: } joachim99@66: else if ( !gnuDiff.files[0].missing_newline ) joachim99@66: { joachim99@66: ++d.nofEquals; joachim99@68: } joachim99@66: diffList.push_back(d); joachim99@66: */ joachim99@66: } joachim99@66: else joachim99@66: { joachim99@66: diffList.front().nofEquals += equalLinesAtStart; joachim99@53: currentLine1 += equalLinesAtStart; joachim99@53: currentLine2 += equalLinesAtStart; joachim99@68: joachim99@53: int nofEquals = min2(size1-currentLine1,size2-currentLine2); joachim99@53: if ( nofEquals==0 ) joachim99@53: { joachim99@53: diffList.back().diff1 += size1-currentLine1; joachim99@53: diffList.back().diff2 += size2-currentLine2; joachim99@53: } joachim99@53: else joachim99@53: { joachim99@53: Diff d( nofEquals,size1-currentLine1-nofEquals,size2-currentLine2-nofEquals); joachim99@53: diffList.push_back(d); joachim99@53: } joachim99@68: joachim99@66: /* joachim99@66: if ( gnuDiff.files[0].missing_newline != gnuDiff.files[1].missing_newline ) joachim99@66: { joachim99@66: diffList.back().diff1 += gnuDiff.files[0].missing_newline ? 0 : 1; joachim99@66: diffList.back().diff2 += gnuDiff.files[1].missing_newline ? 0 : 1; joachim99@66: } joachim99@66: else if ( !gnuDiff.files[0].missing_newline ) joachim99@66: { joachim99@66: ++ diffList.back().nofEquals; joachim99@66: } joachim99@66: */ joachim99@53: } joachim99@51: } joachim99@68: joachim99@51: #ifndef NDEBUG joachim99@51: // Verify difflist joachim99@51: { joachim99@51: int l1=0; joachim99@51: int l2=0; joachim99@51: DiffList::iterator i; joachim99@51: for( i = diffList.begin(); i!=diffList.end(); ++i ) joachim99@51: { joachim99@51: l1+= i->nofEquals + i->diff1; joachim99@51: l2+= i->nofEquals + i->diff2; joachim99@51: } joachim99@51: joachim99@51: //if( l1!=p1-p1start || l2!=p2-p2start ) joachim99@51: if( l1!=size1 || l2!=size2 ) joachim99@51: assert( false ); joachim99@51: } joachim99@51: #endif joachim99@51: joachim99@66: pp.setCurrent(1.0); joachim99@51: joachim99@51: return true; joachim99@8: } joachim99@8: joachim99@69: bool KDiff3App::runDiff( const LineData* p1, int size1, const LineData* p2, int size2, DiffList& diffList, joachim99@69: int winIdx1, int winIdx2 ) joachim99@69: { joachim99@69: diffList.clear(); joachim99@69: DiffList diffList2; joachim99@8: joachim99@69: int l1begin = 0; joachim99@69: int l2begin = 0; joachim99@69: ManualDiffHelpList::const_iterator i; joachim99@69: for( i = m_manualDiffHelpList.begin(); i!=m_manualDiffHelpList.end(); ++i ) joachim99@69: { joachim99@69: const ManualDiffHelpEntry& mdhe = *i; joachim99@69: joachim99@69: int l1end = winIdx1 == 1 ? mdhe.lineA1 : winIdx1==2 ? mdhe.lineB1 : mdhe.lineC1 ; joachim99@69: int l2end = winIdx2 == 1 ? mdhe.lineA1 : winIdx2==2 ? mdhe.lineB1 : mdhe.lineC1 ; joachim99@69: joachim99@69: if ( l1end>=0 && l2end>=0 ) joachim99@69: { joachim99@69: runDiff( p1+l1begin, l1end-l1begin, p2+l2begin, l2end-l2begin, diffList2 ); joachim99@69: diffList.splice( diffList.end(), diffList2 ); joachim99@69: l1begin = l1end; joachim99@69: l2begin = l2end; joachim99@69: joachim99@69: l1end = winIdx1 == 1 ? mdhe.lineA2 : winIdx1==2 ? mdhe.lineB2 : mdhe.lineC2 ; joachim99@69: l2end = winIdx2 == 1 ? mdhe.lineA2 : winIdx2==2 ? mdhe.lineB2 : mdhe.lineC2 ; joachim99@69: joachim99@69: if ( l1end>=0 && l2end>=0 ) joachim99@69: { joachim99@69: ++l1end; // point to line after last selected line joachim99@69: ++l2end; joachim99@69: runDiff( p1+l1begin, l1end-l1begin, p2+l2begin, l2end-l2begin, diffList2 ); joachim99@69: diffList.splice( diffList.end(), diffList2 ); joachim99@69: l1begin = l1end; joachim99@69: l2begin = l2end; joachim99@69: } joachim99@69: } joachim99@69: } joachim99@69: runDiff( p1+l1begin, size1-l1begin, p2+l2begin, size2-l2begin, diffList2 ); joachim99@69: diffList.splice( diffList.end(), diffList2 ); joachim99@69: return true; joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::init( bool bAuto, TotalDiffStatus* pTotalDiffStatus, bool bLoadFiles ) joachim99@8: { joachim99@66: ProgressProxy pp; joachim99@66: // When doing a full analysis in the directory-comparison, then the statistics-results joachim99@66: // will be stored in the given TotalDiffStatus. Otherwise it will be 0. joachim99@66: bool bGUI = pTotalDiffStatus == 0; joachim99@66: if (pTotalDiffStatus==0) joachim99@66: pTotalDiffStatus = &m_totalDiffStatus; joachim99@66: joachim99@8: bool bPreserveCarriageReturn = m_pOptionDialog->m_bPreserveCarriageReturn; joachim99@8: joachim99@8: bool bVisibleMergeResultWindow = ! m_outputFilename.isEmpty(); joachim99@66: if ( bVisibleMergeResultWindow && bGUI ) joachim99@8: { joachim99@8: bPreserveCarriageReturn = false; joachim99@69: joachim99@58: QString msg; joachim99@69: joachim99@58: if ( !m_pOptionDialog->m_PreProcessorCmd.isEmpty() ) joachim99@58: { joachim99@58: msg += "- " + i18n("PreprocessorCmd: ") + m_pOptionDialog->m_PreProcessorCmd + "\n"; joachim99@58: } joachim99@58: if ( !msg.isEmpty() ) joachim99@58: { joachim99@58: int result = KMessageBox::warningYesNo( this, joachim99@58: i18n("The following option(s) you selected might change data:\n") + msg + joachim99@58: i18n("\nMost likely this is not wanted during a merge.\n" joachim99@58: "Do you want to disable these settings or continue with these settings active?"), joachim99@68: i18n("Option Unsafe for Merging"), joachim99@80: KGuiItem( i18n("Use These Options During Merge") ), joachim99@80: KGuiItem( i18n("Disable Unsafe Options") ) joachim99@58: ); joachim99@69: joachim99@58: if (result == KMessageBox::No ) joachim99@58: { joachim99@58: m_pOptionDialog->m_PreProcessorCmd = ""; joachim99@58: } joachim99@58: } joachim99@8: } joachim99@8: joachim99@58: // Because of the progressdialog paintevents can occur, but data is invalid, joachim99@58: // so painting must be suppressed. joachim99@8: if (m_pDiffTextWindow1) m_pDiffTextWindow1->setPaintingAllowed( false ); joachim99@8: if (m_pDiffTextWindow2) m_pDiffTextWindow2->setPaintingAllowed( false ); joachim99@8: if (m_pDiffTextWindow3) m_pDiffTextWindow3->setPaintingAllowed( false ); joachim99@8: if (m_pOverview) m_pOverview->setPaintingAllowed( false ); joachim99@58: if (m_pMergeResultWindow) m_pMergeResultWindow->setPaintingAllowed( false ); joachim99@8: joachim99@69: m_diff3LineList.clear(); joachim99@8: joachim99@69: if ( bLoadFiles ) joachim99@69: { joachim99@69: m_manualDiffHelpList.clear(); joachim99@69: joachim99@69: if( m_sd3.isEmpty() ) joachim99@69: pp.setMaxNofSteps( 4 ); // Read 2 files, 1 comparison, 1 finediff joachim99@69: else joachim99@69: pp.setMaxNofSteps( 9 ); // Read 3 files, 3 comparisons, 3 finediffs joachim99@69: joachim99@69: // First get all input data. joachim99@69: pp.setInformation(i18n("Loading A")); joachim99@75: m_sd1.readAndPreprocess(m_pOptionDialog->m_pEncodingA, m_pOptionDialog->m_bAutoDetectUnicodeA ); joachim99@69: pp.step(); joachim99@69: joachim99@69: pp.setInformation(i18n("Loading B")); joachim99@75: m_sd2.readAndPreprocess(m_pOptionDialog->m_pEncodingB, m_pOptionDialog->m_bAutoDetectUnicodeB ); joachim99@69: pp.step(); joachim99@69: } joachim99@8: else joachim99@69: { joachim99@69: if( m_sd3.isEmpty() ) joachim99@69: pp.setMaxNofSteps( 2 ); // 1 comparison, 1 finediff joachim99@69: else joachim99@69: pp.setMaxNofSteps( 6 ); // 3 comparisons, 3 finediffs joachim99@69: } joachim99@8: joachim99@66: pTotalDiffStatus->reset(); joachim99@8: // Run the diff. joachim99@8: if ( m_sd3.isEmpty() ) joachim99@8: { joachim99@66: pTotalDiffStatus->bBinaryAEqB = m_sd1.isBinaryEqualWith( m_sd2 ); joachim99@66: pp.setInformation(i18n("Diff: A <-> B")); joachim99@69: joachim99@69: runDiff( m_sd1.getLineDataForDiff(), m_sd1.getSizeLines(), m_sd2.getLineDataForDiff(), m_sd2.getSizeLines(), m_diffList12,1,2 ); joachim99@8: joachim99@66: pp.step(); joachim99@8: joachim99@66: pp.setInformation(i18n("Linediff: A <-> B")); joachim99@8: calcDiff3LineListUsingAB( &m_diffList12, m_diff3LineList ); joachim99@66: fineDiff( m_diff3LineList, 1, m_sd1.getLineDataForDisplay(), m_sd2.getLineDataForDisplay(), pTotalDiffStatus->bTextAEqB ); joachim99@66: if ( m_sd1.getSizeBytes()==0 ) pTotalDiffStatus->bTextAEqB=false; joachim99@8: joachim99@66: pp.step(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@69: if (bLoadFiles) joachim99@69: { joachim99@69: pp.setInformation(i18n("Loading C")); joachim99@75: m_sd3.readAndPreprocess(m_pOptionDialog->m_pEncodingC, m_pOptionDialog->m_bAutoDetectUnicodeC ); joachim99@69: pp.step(); joachim99@69: } joachim99@8: joachim99@66: pTotalDiffStatus->bBinaryAEqB = m_sd1.isBinaryEqualWith( m_sd2 ); joachim99@66: pTotalDiffStatus->bBinaryAEqC = m_sd1.isBinaryEqualWith( m_sd3 ); joachim99@66: pTotalDiffStatus->bBinaryBEqC = m_sd3.isBinaryEqualWith( m_sd2 ); joachim99@8: joachim99@66: pp.setInformation(i18n("Diff: A <-> B")); joachim99@69: runDiff( m_sd1.getLineDataForDiff(), m_sd1.getSizeLines(), m_sd2.getLineDataForDiff(), m_sd2.getSizeLines(), m_diffList12,1,2 ); joachim99@66: pp.step(); joachim99@66: pp.setInformation(i18n("Diff: B <-> C")); joachim99@69: runDiff( m_sd2.getLineDataForDiff(), m_sd2.getSizeLines(), m_sd3.getLineDataForDiff(), m_sd3.getSizeLines(), m_diffList23,2,3 ); joachim99@66: pp.step(); joachim99@66: pp.setInformation(i18n("Diff: A <-> C")); joachim99@69: runDiff( m_sd1.getLineDataForDiff(), m_sd1.getSizeLines(), m_sd3.getLineDataForDiff(), m_sd3.getSizeLines(), m_diffList13,1,3 ); joachim99@66: pp.step(); joachim99@8: joachim99@8: calcDiff3LineListUsingAB( &m_diffList12, m_diff3LineList ); joachim99@8: calcDiff3LineListUsingAC( &m_diffList13, m_diff3LineList ); joachim99@69: correctManualDiffAlignment( m_diff3LineList, &m_manualDiffHelpList ); joachim99@69: calcDiff3LineListTrim( m_diff3LineList, m_sd1.getLineDataForDiff(), m_sd2.getLineDataForDiff(), m_sd3.getLineDataForDiff(), &m_manualDiffHelpList ); joachim99@8: joachim99@80: if ( m_pOptionDialog->m_bDiff3AlignBC ) joachim99@80: { joachim99@80: calcDiff3LineListUsingBC( &m_diffList23, m_diff3LineList ); joachim99@80: correctManualDiffAlignment( m_diff3LineList, &m_manualDiffHelpList ); joachim99@80: calcDiff3LineListTrim( m_diff3LineList, m_sd1.getLineDataForDiff(), m_sd2.getLineDataForDiff(), m_sd3.getLineDataForDiff(), &m_manualDiffHelpList ); joachim99@80: } joachim99@58: debugLineCheck( m_diff3LineList, m_sd1.getSizeLines(), 1 ); joachim99@58: debugLineCheck( m_diff3LineList, m_sd2.getSizeLines(), 2 ); joachim99@58: debugLineCheck( m_diff3LineList, m_sd3.getSizeLines(), 3 ); joachim99@8: joachim99@66: pp.setInformation(i18n("Linediff: A <-> B")); joachim99@66: fineDiff( m_diff3LineList, 1, m_sd1.getLineDataForDisplay(), m_sd2.getLineDataForDisplay(), pTotalDiffStatus->bTextAEqB ); joachim99@66: pp.step(); joachim99@66: pp.setInformation(i18n("Linediff: B <-> C")); joachim99@66: fineDiff( m_diff3LineList, 2, m_sd2.getLineDataForDisplay(), m_sd3.getLineDataForDisplay(), pTotalDiffStatus->bTextBEqC ); joachim99@66: pp.step(); joachim99@66: pp.setInformation(i18n("Linediff: A <-> C")); joachim99@66: fineDiff( m_diff3LineList, 3, m_sd3.getLineDataForDisplay(), m_sd1.getLineDataForDisplay(), pTotalDiffStatus->bTextAEqC ); joachim99@66: pp.step(); joachim99@66: if ( m_sd1.getSizeBytes()==0 ) { pTotalDiffStatus->bTextAEqB=false; pTotalDiffStatus->bTextAEqC=false; } joachim99@66: if ( m_sd2.getSizeBytes()==0 ) { pTotalDiffStatus->bTextAEqB=false; pTotalDiffStatus->bTextBEqC=false; } joachim99@8: } joachim99@69: m_diffBufferInfo.init( &m_diff3LineList, &m_diff3LineVector, joachim99@69: m_sd1.getLineDataForDiff(), m_sd1.getSizeLines(), joachim99@69: m_sd2.getLineDataForDiff(), m_sd2.getSizeLines(), joachim99@69: m_sd3.getLineDataForDiff(), m_sd3.getSizeLines() ); joachim99@58: calcWhiteDiff3Lines( m_diff3LineList, m_sd1.getLineDataForDiff(), m_sd2.getLineDataForDiff(), m_sd3.getLineDataForDiff() ); joachim99@8: calcDiff3LineVector( m_diff3LineList, m_diff3LineVector ); joachim99@8: joachim99@8: // Calc needed lines for display joachim99@8: m_neededLines = m_diff3LineList.size(); joachim99@8: joachim99@75: QList oldHeights; joachim99@75: if ( m_pDirectoryMergeSplitter->isVisible() ) joachim99@75: oldHeights = m_pMainSplitter->sizes(); joachim99@75: joachim99@8: initView(); joachim99@75: joachim99@75: if ( m_pDirectoryMergeSplitter->isVisible() ) joachim99@66: { joachim99@75: if (oldHeights.count() < 2) joachim99@75: oldHeights.append(0); joachim99@75: if (oldHeights[1]==0) // Distribute the available space evenly between the two widgets. joachim99@75: { joachim99@75: oldHeights[1] = oldHeights[0]/2; joachim99@75: oldHeights[0] -= oldHeights[1]; joachim99@75: } joachim99@92: if ( oldHeights[0]==0 && oldHeights[1]==0 ) joachim99@92: { joachim99@92: oldHeights[1] = 100; joachim99@92: oldHeights[0] = 100; joachim99@92: } joachim99@75: m_pMainSplitter->setSizes( oldHeights ); joachim99@66: } joachim99@75: joachim99@75: m_pMainWidget->setVisible( bGUI ); joachim99@8: joachim99@8: m_bTripleDiff = ! m_sd3.isEmpty(); joachim99@8: joachim99@75: m_pMergeResultWindowTitle->setEncodings( m_sd1.getEncoding(), m_sd2.getEncoding(), m_sd3.getEncoding() ); joachim99@75: if ( ! m_pOptionDialog->m_bAutoSelectOutEncoding ) joachim99@75: m_pMergeResultWindowTitle->setEncoding( m_pOptionDialog->m_pEncodingOut ); joachim99@75: joachim99@80: m_pMergeResultWindowTitle->setLineEndStyles( m_sd1.getLineEndStyle(), m_sd2.getLineEndStyle(), m_sd3.getLineEndStyle() ); joachim99@80: joachim99@66: if ( bGUI ) joachim99@66: { joachim99@69: const ManualDiffHelpList* pMDHL = &m_manualDiffHelpList; joachim99@92: m_pDiffTextWindow1->init( m_sd1.getAliasName(), m_sd1.getEncoding(), m_sd1.getLineEndStyle(), joachim99@69: m_sd1.getLineDataForDisplay(), m_sd1.getSizeLines(), &m_diff3LineVector, pMDHL, m_bTripleDiff ); joachim99@92: m_pDiffTextWindow2->init( m_sd2.getAliasName(), m_sd2.getEncoding(), m_sd2.getLineEndStyle(), joachim99@69: m_sd2.getLineDataForDisplay(), m_sd2.getSizeLines(), &m_diff3LineVector, pMDHL, m_bTripleDiff ); joachim99@92: m_pDiffTextWindow3->init( m_sd3.getAliasName(), m_sd3.getEncoding(), m_sd3.getLineEndStyle(), joachim99@69: m_sd3.getLineDataForDisplay(), m_sd3.getSizeLines(), &m_diff3LineVector, pMDHL, m_bTripleDiff ); joachim99@69: joachim99@75: m_pDiffTextWindowFrame3->setVisible(m_bTripleDiff); joachim99@66: } joachim99@8: joachim99@8: m_bOutputModified = bVisibleMergeResultWindow; joachim99@8: joachim99@8: m_pMergeResultWindow->init( joachim99@69: m_sd1.getLineDataForDisplay(), m_sd1.getSizeLines(), joachim99@69: m_sd2.getLineDataForDisplay(), m_sd2.getSizeLines(), joachim99@69: m_bTripleDiff ? m_sd3.getLineDataForDisplay() : 0, m_sd3.getSizeLines(), joachim99@8: &m_diff3LineList, joachim99@75: pTotalDiffStatus joachim99@8: ); joachim99@75: m_pMergeResultWindowTitle->setFileName( m_outputFilename.isEmpty() ? QString("unnamed.txt") : m_outputFilename ); joachim99@69: joachim99@66: if ( !bGUI ) joachim99@66: { joachim99@66: // We now have all needed information. The rest below is only for GUI-activation. joachim99@69: m_sd1.reset(); joachim99@69: m_sd2.reset(); joachim99@69: m_sd3.reset(); joachim99@66: return; joachim99@66: } joachim99@69: joachim99@8: m_pOverview->init(&m_diff3LineList, m_bTripleDiff ); joachim99@8: m_pDiffVScrollBar->setValue( 0 ); joachim99@8: m_pHScrollBar->setValue( 0 ); joachim99@66: m_pMergeVScrollBar->setValue( 0 ); joachim99@8: joachim99@8: m_pDiffTextWindow1->setPaintingAllowed( true ); joachim99@8: m_pDiffTextWindow2->setPaintingAllowed( true ); joachim99@8: m_pDiffTextWindow3->setPaintingAllowed( true ); joachim99@8: m_pOverview->setPaintingAllowed( true ); joachim99@58: m_pMergeResultWindow->setPaintingAllowed( true ); joachim99@58: joachim99@8: joachim99@8: if ( !bVisibleMergeResultWindow ) joachim99@8: m_pMergeWindowFrame->hide(); joachim99@8: else joachim99@8: m_pMergeWindowFrame->show(); joachim99@8: joachim99@92: setHScrollBarRange(); joachim99@8: joachim99@66: // Try to create a meaningful but not too long caption joachim99@66: if ( !isPart() ) joachim99@66: { joachim99@66: // 1. If the filenames are equal then show only one filename joachim99@66: QString caption; joachim99@66: QString a1 = m_sd1.getAliasName(); joachim99@66: QString a2 = m_sd2.getAliasName(); joachim99@66: QString a3 = m_sd3.getAliasName(); joachim99@66: QString f1, f2, f3; joachim99@66: int p1,p2,p3; joachim99@75: if ( !a1.isEmpty() && (p1=a1.lastIndexOf('/'))>=0 ) joachim99@66: f1 = a1.mid( p1+1 ); joachim99@75: if ( !a2.isEmpty() && (p2=a2.lastIndexOf('/'))>=0 ) joachim99@66: f2 = a2.mid( p2+1 ); joachim99@75: if ( !a3.isEmpty() && (p3=a3.lastIndexOf('/'))>=0 ) joachim99@66: f3 = a3.mid( p3+1 ); joachim99@66: if ( !f1.isEmpty() ) joachim99@66: { joachim99@66: if ( ( f2.isEmpty() && f3.isEmpty() ) || joachim99@66: (f2.isEmpty() && f1==f3) || ( f3.isEmpty() && f1==f2 ) || (f1==f2 && f1==f3)) joachim99@66: caption = ".../"+f1; joachim99@66: } joachim99@66: else if ( ! f2.isEmpty() ) joachim99@66: { joachim99@66: if ( f3.isEmpty() || f2==f3 ) joachim99@66: caption = ".../"+f2; joachim99@66: } joachim99@66: else if ( ! f3.isEmpty() ) joachim99@66: caption = ".../"+f3; joachim99@69: joachim99@66: // 2. If the files don't have the same name then show all names joachim99@66: if ( caption.isEmpty() && (!f1.isEmpty() || !f2.isEmpty() || !f3.isEmpty()) ) joachim99@66: { joachim99@68: caption = ( f1.isEmpty()? QString("") : QString(".../")+f1 ); joachim99@68: caption += QString(caption.isEmpty() || f2.isEmpty() ? "" : " <-> ") + ( f2.isEmpty()? QString("") : QString(".../")+f2 ); joachim99@68: caption += QString(caption.isEmpty() || f3.isEmpty() ? "" : " <-> ") + ( f3.isEmpty()? QString("") : QString(".../")+f3 ) ; joachim99@69: } joachim99@69: joachim99@75: m_pKDiff3Shell->setWindowTitle( caption.isEmpty() ? QString("KDiff3") : caption+QString(" - KDiff3")); joachim99@66: } joachim99@69: joachim99@69: if ( bLoadFiles ) joachim99@8: { joachim99@69: if ( bVisibleMergeResultWindow && !bAuto ) joachim99@69: m_pMergeResultWindow->showNrOfConflicts(); joachim99@69: else if ( !bAuto && joachim99@69: // Avoid showing this message during startup without parameters. joachim99@69: !( m_sd1.getAliasName().isEmpty() && m_sd2.getAliasName().isEmpty() && m_sd3.getAliasName().isEmpty() ) && joachim99@69: ( m_sd1.isValid() && m_sd2.isValid() && m_sd3.isValid() ) joachim99@69: ) joachim99@69: { joachim99@69: QString totalInfo; joachim99@69: if ( pTotalDiffStatus->bBinaryAEqB && pTotalDiffStatus->bBinaryAEqC ) joachim99@69: totalInfo += i18n("All input files are binary equal."); joachim99@69: else if ( pTotalDiffStatus->bTextAEqB && pTotalDiffStatus->bTextAEqC ) joachim99@69: totalInfo += i18n("All input files contain the same text, but are not binary equal."); joachim99@69: else { joachim99@80: if ( pTotalDiffStatus->bBinaryAEqB ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("A"),QString("B")); joachim99@80: else if ( pTotalDiffStatus->bTextAEqB ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n",QString("A"),QString("B")); joachim99@80: if ( pTotalDiffStatus->bBinaryAEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("A"),QString("C")); joachim99@80: else if ( pTotalDiffStatus->bTextAEqC ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n",QString("A"),QString("C")); joachim99@80: if ( pTotalDiffStatus->bBinaryBEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("B"),QString("C")); joachim99@80: else if ( pTotalDiffStatus->bTextBEqC ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n",QString("B"),QString("C")); joachim99@69: } joachim99@69: joachim99@69: if ( !totalInfo.isEmpty() ) joachim99@69: KMessageBox::information( this, totalInfo ); joachim99@8: } joachim99@8: joachim99@69: if ( bVisibleMergeResultWindow && (!m_sd1.isText() || !m_sd2.isText() || !m_sd3.isText()) ) joachim99@8: { joachim99@69: KMessageBox::information( this, i18n( joachim99@69: "Some inputfiles don't seem to be pure textfiles.\n" joachim99@69: "Note that the KDiff3-merge was not meant for binary data.\n" joachim99@69: "Continue at your own risk.") ); joachim99@69: } joachim99@8: } joachim99@8: joachim99@8: QTimer::singleShot( 10, this, SLOT(slotAfterFirstPaint()) ); joachim99@69: joachim99@53: if ( bVisibleMergeResultWindow && m_pMergeResultWindow ) joachim99@53: { joachim99@53: m_pMergeResultWindow->setFocus(); joachim99@53: } joachim99@53: else if(m_pDiffTextWindow1) joachim99@53: { joachim99@53: m_pDiffTextWindow1->setFocus(); joachim99@53: } joachim99@8: } joachim99@8: joachim99@8: joachim99@92: void KDiff3App::setHScrollBarRange() joachim99@92: { joachim99@92: int w1 = m_pDiffTextWindow1!=0 && m_pDiffTextWindow1->isVisible() ? m_pDiffTextWindow1->getNofColumns() : 0; joachim99@92: int w2 = m_pDiffTextWindow2!=0 && m_pDiffTextWindow2->isVisible() ? m_pDiffTextWindow2->getNofColumns() : 0; joachim99@92: int w3 = m_pDiffTextWindow3!=0 && m_pDiffTextWindow3->isVisible() ? m_pDiffTextWindow3->getNofColumns() : 0; joachim99@92: joachim99@92: int wm = m_pMergeResultWindow!=0 && m_pMergeResultWindow->isVisible() ? m_pMergeResultWindow->getNofColumns() : 0; joachim99@92: joachim99@92: int v1 = m_pDiffTextWindow1!=0 && m_pDiffTextWindow1->isVisible() ? m_pDiffTextWindow1->getNofVisibleColumns() : 0; joachim99@92: int v2 = m_pDiffTextWindow2!=0 && m_pDiffTextWindow2->isVisible() ? m_pDiffTextWindow2->getNofVisibleColumns() : 0; joachim99@92: int v3 = m_pDiffTextWindow3!=0 && m_pDiffTextWindow3->isVisible() ? m_pDiffTextWindow3->getNofVisibleColumns() : 0; joachim99@92: int vm = m_pMergeResultWindow!=0 && m_pMergeResultWindow->isVisible() ? m_pMergeResultWindow->getNofVisibleColumns() : 0; joachim99@92: joachim99@92: // Find the minimum, but don't consider 0. joachim99@92: int pageStep = 0; joachim99@92: if ( (pageStep==0 || pageStep>v1) && v1>0 ) joachim99@92: pageStep = v1; joachim99@92: if ( (pageStep==0 || pageStep>v2) && v2>0 ) joachim99@92: pageStep = v2; joachim99@92: if ( (pageStep==0 || pageStep>v3) && v3>0 ) joachim99@92: pageStep = v3; joachim99@92: if ( (pageStep==0 || pageStep>vm) && vm>0 ) joachim99@92: pageStep = vm; joachim99@92: joachim99@92: int rangeMax = 0; joachim99@92: if ( w1>v1 && w1-v1>rangeMax && v1>0 ) joachim99@92: rangeMax = w1-v1; joachim99@92: if ( w2>v2 && w2-v2>rangeMax && v2>0 ) joachim99@92: rangeMax = w2-v2; joachim99@92: if ( w3>v3 && w3-v3>rangeMax && v3>0 ) joachim99@92: rangeMax = w3-v3; joachim99@92: if ( wm>vm && wm-vm>rangeMax && vm>0 ) joachim99@92: rangeMax = wm-vm; joachim99@92: joachim99@92: m_pHScrollBar->setRange(0, rangeMax ); joachim99@92: m_pHScrollBar->setPageStep( pageStep ); joachim99@92: } joachim99@92: joachim99@92: void KDiff3App::resizeDiffTextWindow(int /*newWidth*/, int newHeight) joachim99@8: { joachim99@69: m_DTWHeight = newHeight; joachim99@69: joachim99@66: recalcWordWrap(); joachim99@66: joachim99@8: m_pDiffVScrollBar->setRange(0, max2(0, m_neededLines+1 - newHeight) ); joachim99@8: m_pDiffVScrollBar->setPageStep( newHeight ); joachim99@8: m_pOverview->setRange( m_pDiffVScrollBar->value(), m_pDiffVScrollBar->pageStep() ); joachim99@8: joachim99@92: setHScrollBarRange(); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::resizeMergeResultWindow() joachim99@8: { joachim99@8: MergeResultWindow* p = m_pMergeResultWindow; joachim99@8: m_pMergeVScrollBar->setRange(0, max2(0, p->getNofLines() - p->getNofVisibleLines()) ); joachim99@8: m_pMergeVScrollBar->setPageStep( p->getNofVisibleLines() ); joachim99@8: joachim99@92: setHScrollBarRange(); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::scrollDiffTextWindow( int deltaX, int deltaY ) joachim99@8: { joachim99@8: if ( deltaY!= 0 ) joachim99@8: { joachim99@8: m_pDiffVScrollBar->setValue( m_pDiffVScrollBar->value() + deltaY ); joachim99@8: m_pOverview->setRange( m_pDiffVScrollBar->value(), m_pDiffVScrollBar->pageStep() ); joachim99@8: } joachim99@8: if ( deltaX!= 0) joachim99@69: m_pHScrollBar->QScrollBar::setValue( m_pHScrollBar->value() + deltaX ); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::scrollMergeResultWindow( int deltaX, int deltaY ) joachim99@8: { joachim99@8: if ( deltaY!= 0 ) joachim99@8: m_pMergeVScrollBar->setValue( m_pMergeVScrollBar->value() + deltaY ); joachim99@8: if ( deltaX!= 0) joachim99@8: m_pHScrollBar->setValue( m_pHScrollBar->value() + deltaX ); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::setDiff3Line( int line ) joachim99@8: { joachim99@8: m_pDiffVScrollBar->setValue( line ); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::sourceMask( int srcMask, int enabledMask ) joachim99@8: { joachim99@80: chooseA->blockSignals(true); joachim99@80: chooseB->blockSignals(true); joachim99@80: chooseC->blockSignals(true); joachim99@8: chooseA->setChecked( (srcMask & 1) != 0 ); joachim99@8: chooseB->setChecked( (srcMask & 2) != 0 ); joachim99@8: chooseC->setChecked( (srcMask & 4) != 0 ); joachim99@80: chooseA->blockSignals(false); joachim99@80: chooseB->blockSignals(false); joachim99@80: chooseC->blockSignals(false); joachim99@8: chooseA->setEnabled( (enabledMask & 1) != 0 ); joachim99@8: chooseB->setEnabled( (enabledMask & 2) != 0 ); joachim99@8: chooseC->setEnabled( (enabledMask & 4) != 0 ); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: joachim99@8: // Function uses setMinSize( sizeHint ) before adding the widget. joachim99@8: // void addWidget(QBoxLayout* layout, QWidget* widget); joachim99@8: template joachim99@8: void addWidget( L* layout, W* widget) joachim99@8: { joachim99@8: QSize s = widget->sizeHint(); joachim99@8: widget->setMinimumSize( QSize(max2(s.width(),0),max2(s.height(),0) ) ); joachim99@8: layout->addWidget( widget ); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::initView() joachim99@8: { joachim99@8: // set the main widget here joachim99@8: if ( m_pMainWidget != 0 ) joachim99@8: { joachim99@8: return; joachim99@8: //delete m_pMainWidget; joachim99@8: } joachim99@92: m_pMainWidget = new QWidget(); // Contains vertical splitter and horiz scrollbar joachim99@92: m_pMainSplitter->addWidget( m_pMainWidget ); joachim99@92: m_pMainWidget->setObjectName("MainWidget"); joachim99@75: QVBoxLayout* pVLayout = new QVBoxLayout(m_pMainWidget); joachim99@75: pVLayout->setMargin(0); joachim99@75: pVLayout->setSpacing(0); joachim99@8: joachim99@75: QSplitter* pVSplitter = new QSplitter(); joachim99@92: pVSplitter->setObjectName("VSplitter"); joachim99@75: pVSplitter->setOpaqueResize(false); joachim99@69: pVSplitter->setOrientation( Qt::Vertical ); joachim99@8: pVLayout->addWidget( pVSplitter ); joachim99@75: pVSplitter->show(); joachim99@8: joachim99@92: QWidget* pDiffWindowFrame = new QWidget(); // Contains diff windows, overview and vert scrollbar joachim99@92: pDiffWindowFrame->setObjectName("DiffWindowFrame"); joachim99@75: QHBoxLayout* pDiffHLayout = new QHBoxLayout( pDiffWindowFrame ); joachim99@75: pDiffHLayout->setMargin(0); joachim99@75: pDiffHLayout->setSpacing(0); joachim99@92: //pDiffWindowFrame->show(); joachim99@80: pVSplitter->addWidget(pDiffWindowFrame); joachim99@92: joachim99@75: m_pDiffWindowSplitter = new QSplitter(); joachim99@92: m_pDiffWindowSplitter->setObjectName("DiffWindowSplitter"); joachim99@75: m_pDiffWindowSplitter->setOpaqueResize(false); joachim99@8: joachim99@69: m_pDiffWindowSplitter->setOrientation( m_pOptionDialog->m_bHorizDiffWindowSplitting ? Qt::Horizontal : Qt::Vertical ); joachim99@8: pDiffHLayout->addWidget( m_pDiffWindowSplitter ); joachim99@80: //m_pDiffWindowSplitter->show(); joachim99@8: joachim99@75: m_pOverview = new Overview( m_pOptionDialog ); joachim99@92: m_pOverview->setObjectName("Overview"); joachim99@8: pDiffHLayout->addWidget(m_pOverview); joachim99@8: connect( m_pOverview, SIGNAL(setLine(int)), this, SLOT(setDiff3Line(int)) ); joachim99@8: //connect( m_pOverview, SIGNAL(afterFirstPaint()), this, SLOT(slotAfterFirstPaint())); joachim99@8: joachim99@69: m_pDiffVScrollBar = new QScrollBar( Qt::Vertical, pDiffWindowFrame ); joachim99@8: pDiffHLayout->addWidget( m_pDiffVScrollBar ); joachim99@8: joachim99@69: m_pDiffTextWindowFrame1 = new DiffTextWindowFrame( m_pDiffWindowSplitter, statusBar(), m_pOptionDialog, 1 ); joachim99@80: m_pDiffWindowSplitter->addWidget(m_pDiffTextWindowFrame1); joachim99@80: //m_pDiffTextWindowFrame1->show(); joachim99@69: m_pDiffTextWindowFrame2 = new DiffTextWindowFrame( m_pDiffWindowSplitter, statusBar(), m_pOptionDialog, 2 ); joachim99@80: m_pDiffWindowSplitter->addWidget(m_pDiffTextWindowFrame2); joachim99@80: //m_pDiffTextWindowFrame2->show(); joachim99@69: m_pDiffTextWindowFrame3 = new DiffTextWindowFrame( m_pDiffWindowSplitter, statusBar(), m_pOptionDialog, 3 ); joachim99@80: m_pDiffWindowSplitter->addWidget(m_pDiffTextWindowFrame3); joachim99@69: m_pDiffTextWindow1 = m_pDiffTextWindowFrame1->getDiffTextWindow(); joachim99@69: m_pDiffTextWindow2 = m_pDiffTextWindowFrame2->getDiffTextWindow(); joachim99@69: m_pDiffTextWindow3 = m_pDiffTextWindowFrame3->getDiffTextWindow(); joachim99@69: connect(m_pDiffTextWindowFrame1, SIGNAL(fileNameChanged(const QString&,int)), this, SLOT(slotFileNameChanged(const QString&,int))); joachim99@69: connect(m_pDiffTextWindowFrame2, SIGNAL(fileNameChanged(const QString&,int)), this, SLOT(slotFileNameChanged(const QString&,int))); joachim99@69: connect(m_pDiffTextWindowFrame3, SIGNAL(fileNameChanged(const QString&,int)), this, SLOT(slotFileNameChanged(const QString&,int))); joachim99@8: joachim99@8: // Merge window joachim99@69: m_pMergeWindowFrame = new QWidget( pVSplitter ); joachim99@92: m_pMergeWindowFrame->setObjectName("MergeWindowFrame"); joachim99@80: pVSplitter->addWidget(m_pMergeWindowFrame); joachim99@75: QHBoxLayout* pMergeHLayout = new QHBoxLayout( m_pMergeWindowFrame ); joachim99@75: pMergeHLayout->setMargin(0); joachim99@75: pMergeHLayout->setSpacing(0); joachim99@75: QVBoxLayout* pMergeVLayout = new QVBoxLayout(); joachim99@75: pMergeHLayout->addLayout( pMergeVLayout, 1 ); joachim99@75: joachim99@75: m_pMergeResultWindowTitle = new WindowTitleWidget(m_pOptionDialog); joachim99@75: pMergeVLayout->addWidget( m_pMergeResultWindowTitle ); joachim99@8: joachim99@66: m_pMergeResultWindow = new MergeResultWindow( m_pMergeWindowFrame, m_pOptionDialog, statusBar() ); joachim99@75: pMergeVLayout->addWidget( m_pMergeResultWindow, 1 ); joachim99@8: joachim99@69: m_pMergeVScrollBar = new QScrollBar( Qt::Vertical, m_pMergeWindowFrame ); joachim99@8: pMergeHLayout->addWidget( m_pMergeVScrollBar ); joachim99@8: joachim99@80: m_pMainSplitter->addWidget(m_pMainWidget); joachim99@80: joachim99@8: autoAdvance->setEnabled(true); joachim99@8: joachim99@75: QList sizes = pVSplitter->sizes(); joachim99@8: int total = sizes[0] + sizes[1]; joachim99@92: if ( total<10 ) joachim99@92: total = 100; joachim99@8: sizes[0]=total/2; sizes[1]=total/2; joachim99@8: pVSplitter->setSizes( sizes ); joachim99@8: joachim99@103: QList hSizes; joachim99@103: hSizes << 1 << 1 << 1; joachim99@103: m_pDiffWindowSplitter->setSizes( hSizes ); joachim99@103: joachim99@8: m_pMergeResultWindow->installEventFilter( this ); // for Cut/Copy/Paste-shortcuts joachim99@75: m_pMergeResultWindow->installEventFilter( m_pMergeResultWindowTitle ); // for focus tracking joachim99@8: joachim99@75: QHBoxLayout* pHScrollBarLayout = new QHBoxLayout(); joachim99@75: pVLayout->addLayout( pHScrollBarLayout ); joachim99@75: m_pHScrollBar = new ReversibleScrollBar( Qt::Horizontal, &m_pOptionDialog->m_bRightToLeftLanguage ); joachim99@8: pHScrollBarLayout->addWidget( m_pHScrollBar ); joachim99@8: m_pCornerWidget = new QWidget( m_pMainWidget ); joachim99@8: pHScrollBarLayout->addWidget( m_pCornerWidget ); joachim99@8: joachim99@8: joachim99@8: connect( m_pDiffVScrollBar, SIGNAL(valueChanged(int)), m_pOverview, SLOT(setFirstLine(int))); joachim99@8: connect( m_pDiffVScrollBar, SIGNAL(valueChanged(int)), m_pDiffTextWindow1, SLOT(setFirstLine(int))); joachim99@68: connect( m_pHScrollBar, SIGNAL(valueChanged2(int)), m_pDiffTextWindow1, SLOT(setFirstColumn(int))); joachim99@8: connect( m_pDiffTextWindow1, SIGNAL(newSelection()), this, SLOT(slotSelectionStart())); joachim99@8: connect( m_pDiffTextWindow1, SIGNAL(selectionEnd()), this, SLOT(slotSelectionEnd())); joachim99@8: connect( m_pDiffTextWindow1, SIGNAL(scroll(int,int)), this, SLOT(scrollDiffTextWindow(int,int))); joachim99@8: m_pDiffTextWindow1->installEventFilter( this ); joachim99@8: joachim99@8: connect( m_pDiffVScrollBar, SIGNAL(valueChanged(int)), m_pDiffTextWindow2, SLOT(setFirstLine(int))); joachim99@68: connect( m_pHScrollBar, SIGNAL(valueChanged2(int)), m_pDiffTextWindow2, SLOT(setFirstColumn(int))); joachim99@8: connect( m_pDiffTextWindow2, SIGNAL(newSelection()), this, SLOT(slotSelectionStart())); joachim99@8: connect( m_pDiffTextWindow2, SIGNAL(selectionEnd()), this, SLOT(slotSelectionEnd())); joachim99@8: connect( m_pDiffTextWindow2, SIGNAL(scroll(int,int)), this, SLOT(scrollDiffTextWindow(int,int))); joachim99@8: m_pDiffTextWindow2->installEventFilter( this ); joachim99@8: joachim99@8: connect( m_pDiffVScrollBar, SIGNAL(valueChanged(int)), m_pDiffTextWindow3, SLOT(setFirstLine(int))); joachim99@68: connect( m_pHScrollBar, SIGNAL(valueChanged2(int)), m_pDiffTextWindow3, SLOT(setFirstColumn(int))); joachim99@8: connect( m_pDiffTextWindow3, SIGNAL(newSelection()), this, SLOT(slotSelectionStart())); joachim99@8: connect( m_pDiffTextWindow3, SIGNAL(selectionEnd()), this, SLOT(slotSelectionEnd())); joachim99@8: connect( m_pDiffTextWindow3, SIGNAL(scroll(int,int)), this, SLOT(scrollDiffTextWindow(int,int))); joachim99@8: m_pDiffTextWindow3->installEventFilter( this ); joachim99@8: joachim99@69: joachim99@8: MergeResultWindow* p = m_pMergeResultWindow; joachim99@8: connect( m_pMergeVScrollBar, SIGNAL(valueChanged(int)), p, SLOT(setFirstLine(int))); joachim99@8: joachim99@68: connect( m_pHScrollBar, SIGNAL(valueChanged2(int)), p, SLOT(setFirstColumn(int))); joachim99@8: connect( p, SIGNAL(scroll(int,int)), this, SLOT(scrollMergeResultWindow(int,int))); joachim99@8: connect( p, SIGNAL(sourceMask(int,int)), this, SLOT(sourceMask(int,int))); joachim99@8: connect( p, SIGNAL( resizeSignal() ),this, SLOT(resizeMergeResultWindow())); joachim99@8: connect( p, SIGNAL( selectionEnd() ), this, SLOT( slotSelectionEnd() ) ); joachim99@8: connect( p, SIGNAL( newSelection() ), this, SLOT( slotSelectionStart() ) ); joachim99@75: connect( p, SIGNAL( modifiedChanged(bool) ), this, SLOT( slotOutputModified(bool) ) ); joachim99@75: connect( p, SIGNAL( modifiedChanged(bool) ), m_pMergeResultWindowTitle, SLOT( slotSetModified(bool) ) ); joachim99@8: connect( p, SIGNAL( updateAvailabilities() ), this, SLOT( slotUpdateAvailabilities() ) ); joachim99@8: connect( p, SIGNAL( showPopupMenu(const QPoint&) ), this, SLOT(showPopupMenu(const QPoint&))); joachim99@69: connect( p, SIGNAL( noRelevantChangesDetected() ), this, SLOT(slotNoRelevantChangesDetected())); joachim99@8: sourceMask(0,0); joachim99@8: joachim99@8: joachim99@8: connect( p, SIGNAL(setFastSelectorRange(int,int)), m_pDiffTextWindow1, SLOT(setFastSelectorRange(int,int))); joachim99@8: connect( p, SIGNAL(setFastSelectorRange(int,int)), m_pDiffTextWindow2, SLOT(setFastSelectorRange(int,int))); joachim99@8: connect( p, SIGNAL(setFastSelectorRange(int,int)), m_pDiffTextWindow3, SLOT(setFastSelectorRange(int,int))); joachim99@8: connect(m_pDiffTextWindow1, SIGNAL(setFastSelectorLine(int)), p, SLOT(slotSetFastSelectorLine(int))); joachim99@8: connect(m_pDiffTextWindow2, SIGNAL(setFastSelectorLine(int)), p, SLOT(slotSetFastSelectorLine(int))); joachim99@8: connect(m_pDiffTextWindow3, SIGNAL(setFastSelectorLine(int)), p, SLOT(slotSetFastSelectorLine(int))); joachim99@66: connect(m_pDiffTextWindow1, SIGNAL(gotFocus()), p, SLOT(updateSourceMask())); joachim99@66: connect(m_pDiffTextWindow2, SIGNAL(gotFocus()), p, SLOT(updateSourceMask())); joachim99@66: connect(m_pDiffTextWindow3, SIGNAL(gotFocus()), p, SLOT(updateSourceMask())); joachim99@66: connect(m_pDirectoryMergeInfo, SIGNAL(gotFocus()), p, SLOT(updateSourceMask())); joachim99@8: joachim99@8: connect( m_pDiffTextWindow1, SIGNAL( resizeSignal(int,int) ),this, SLOT(resizeDiffTextWindow(int,int))); joachim99@66: // The following two connects cause the wordwrap to be recalced thrice, just to make sure. Better than forgetting one. joachim99@69: connect( m_pDiffTextWindow2, SIGNAL( resizeSignal(int,int) ),this, SLOT(slotRecalcWordWrap())); joachim99@69: connect( m_pDiffTextWindow3, SIGNAL( resizeSignal(int,int) ),this, SLOT(slotRecalcWordWrap())); joachim99@8: joachim99@8: m_pDiffTextWindow1->setFocus(); joachim99@8: m_pMainWidget->setMinimumSize(50,50); joachim99@8: m_pCornerWidget->setFixedSize( m_pDiffVScrollBar->width(), m_pHScrollBar->height() ); joachim99@8: showWindowA->setChecked( true ); joachim99@8: showWindowB->setChecked( true ); joachim99@8: showWindowC->setChecked( true ); joachim99@8: } joachim99@8: joachim99@69: static int calcManualDiffFirstDiff3LineIdx( const Diff3LineVector& d3lv, const ManualDiffHelpEntry& mdhe ) joachim99@69: { joachim99@69: unsigned int i; joachim99@69: for( i = 0; i=0 && mdhe.lineA1==d3l.lineA) || joachim99@80: (mdhe.lineB1>=0 && mdhe.lineB1==d3l.lineB) || joachim99@80: (mdhe.lineC1>=0 && mdhe.lineC1==d3l.lineC) ) joachim99@69: return i; joachim99@69: } joachim99@69: return -1; joachim99@69: } joachim99@69: joachim99@8: void KDiff3App::slotAfterFirstPaint() joachim99@8: { joachim99@8: int newHeight = m_pDiffTextWindow1->getNofVisibleLines(); joachim99@92: /*int newWidth = m_pDiffTextWindow1->getNofVisibleColumns();*/ joachim99@8: m_DTWHeight = newHeight; joachim99@69: joachim99@69: recalcWordWrap(); joachim99@69: joachim99@8: m_pDiffVScrollBar->setRange(0, max2(0, m_neededLines+1 - newHeight) ); joachim99@8: m_pDiffVScrollBar->setPageStep( newHeight ); joachim99@8: m_pOverview->setRange( m_pDiffVScrollBar->value(), m_pDiffVScrollBar->pageStep() ); joachim99@8: joachim99@69: int d3l=-1; joachim99@69: if ( ! m_manualDiffHelpList.empty() ) joachim99@69: d3l = calcManualDiffFirstDiff3LineIdx( m_diff3LineVector, m_manualDiffHelpList.front() ); joachim99@69: if ( d3l>=0 && m_pDiffTextWindow1 ) joachim99@69: { joachim99@69: int line = m_pDiffTextWindow1->convertDiff3LineIdxToLine( d3l ); joachim99@69: m_pDiffVScrollBar->setValue( max2(0,line-1) ); joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: m_pMergeResultWindow->slotGoTop(); joachim99@77: if ( ! m_outputFilename.isEmpty() && ! m_pMergeResultWindow->isUnsolvedConflictAtCurrent() ) joachim99@77: m_pMergeResultWindow->slotGoNextUnsolvedConflict(); joachim99@69: } joachim99@8: joachim99@8: if (m_pCornerWidget) joachim99@8: m_pCornerWidget->setFixedSize( m_pDiffVScrollBar->width(), m_pHScrollBar->height() ); joachim99@8: joachim99@8: slotUpdateAvailabilities(); joachim99@80: setUpdatesEnabled(true); joachim99@80: // Workaround for a Qt-bug joachim99@80: QList treeViews = findChildren(); joachim99@80: foreach( QTreeView* pTreeView, treeViews ) joachim99@80: { joachim99@80: pTreeView->setUpdatesEnabled(true); joachim99@80: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::resizeEvent(QResizeEvent* e) joachim99@8: { joachim99@8: QSplitter::resizeEvent(e); joachim99@8: if (m_pCornerWidget) joachim99@8: m_pCornerWidget->setFixedSize( m_pDiffVScrollBar->width(), m_pHScrollBar->height() ); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: bool KDiff3App::eventFilter( QObject* o, QEvent* e ) joachim99@8: { joachim99@8: if( o == m_pMergeResultWindow ) joachim99@8: { joachim99@8: if ( e->type() == QEvent::KeyPress ) joachim99@8: { // key press joachim99@8: QKeyEvent *k = (QKeyEvent*)e; joachim99@75: if (k->key()==Qt::Key_Insert && (k->QInputEvent::modifiers() & Qt::ControlModifier)!=0 ) joachim99@8: { joachim99@8: slotEditCopy(); joachim99@8: return true; joachim99@8: } joachim99@75: if (k->key()==Qt::Key_Insert && (k->QInputEvent::modifiers() & Qt::ShiftModifier)!=0 ) joachim99@8: { joachim99@8: slotEditPaste(); joachim99@8: return true; joachim99@8: } joachim99@75: if (k->key()==Qt::Key_Delete && (k->QInputEvent::modifiers() & Qt::ShiftModifier)!=0 ) joachim99@8: { joachim99@8: slotEditCut(); joachim99@8: return true; joachim99@8: } joachim99@80: if ( k->key()==Qt::Key_Escape && m_pKDiff3Shell && m_pOptionDialog->m_bEscapeKeyQuits ) joachim99@80: { joachim99@80: m_pKDiff3Shell->close(); joachim99@80: return true; joachim99@80: } joachim99@8: } joachim99@8: return QSplitter::eventFilter( o, e ); // standard event processing joachim99@8: } joachim99@8: joachim99@8: if ( e->type() == QEvent::KeyPress ) // key press joachim99@8: { joachim99@8: QKeyEvent *k = (QKeyEvent*)e; joachim99@80: if ( k->key()==Qt::Key_Escape && m_pKDiff3Shell && m_pOptionDialog->m_bEscapeKeyQuits ) joachim99@80: { joachim99@80: m_pKDiff3Shell->close(); joachim99@80: return true; joachim99@80: } joachim99@8: joachim99@75: bool bCtrl = (k->QInputEvent::modifiers() & Qt::ControlModifier) != 0; joachim99@8: if (k->key()==Qt::Key_Insert && bCtrl ) joachim99@8: { joachim99@8: slotEditCopy(); joachim99@8: return true; joachim99@8: } joachim99@75: if (k->key()==Qt::Key_Insert && (k->QInputEvent::modifiers() & Qt::ShiftModifier)!=0 ) joachim99@8: { joachim99@8: slotEditPaste(); joachim99@8: return true; joachim99@8: } joachim99@8: int deltaX=0; joachim99@8: int deltaY=0; joachim99@8: int pageSize = m_DTWHeight; joachim99@8: switch( k->key() ) joachim99@8: { joachim99@69: case Qt::Key_Down: if (!bCtrl) ++deltaY; break; joachim99@69: case Qt::Key_Up: if (!bCtrl) --deltaY; break; joachim99@69: case Qt::Key_PageDown: if (!bCtrl) deltaY+=pageSize; break; joachim99@69: case Qt::Key_PageUp: if (!bCtrl) deltaY-=pageSize; break; joachim99@69: case Qt::Key_Left: if (!bCtrl) --deltaX; break; joachim99@69: case Qt::Key_Right: if (!bCtrl) ++deltaX; break; joachim99@69: case Qt::Key_Home: if ( bCtrl ) m_pDiffVScrollBar->setValue( 0 ); joachim99@8: else m_pHScrollBar->setValue( 0 ); joachim99@8: break; joachim99@75: case Qt::Key_End: if ( bCtrl ) m_pDiffVScrollBar->setValue( m_pDiffVScrollBar->maximum() ); joachim99@75: else m_pHScrollBar->setValue( m_pHScrollBar->maximum() ); joachim99@8: break; joachim99@8: default: break; joachim99@8: } joachim99@8: joachim99@8: scrollDiffTextWindow( deltaX, deltaY ); joachim99@8: joachim99@8: return true; // eat event joachim99@8: } joachim99@58: else if (e->type() == QEvent::Wheel ) // wheel event joachim99@58: { joachim99@8: QWheelEvent *w = (QWheelEvent*)e; joachim99@8: w->accept(); joachim99@8: joachim99@8: int deltaX=0; joachim99@8: joachim99@8: int d=w->delta(); joachim99@8: int deltaY = -d/120 * QApplication::wheelScrollLines(); joachim99@8: joachim99@8: scrollDiffTextWindow( deltaX, deltaY ); joachim99@8: return true; joachim99@8: } joachim99@8: else if (e->type() == QEvent::Drop ) joachim99@8: { joachim99@8: QDropEvent* pDropEvent = static_cast(e); joachim99@8: pDropEvent->accept(); joachim99@8: joachim99@75: if ( pDropEvent->mimeData()->hasUrls() ) joachim99@8: { joachim99@8: #ifdef KREPLACEMENTS_H joachim99@75: QList urlList = pDropEvent->mimeData()->urls(); joachim99@75: if ( canContinue() && !urlList.isEmpty() ) joachim99@8: { joachim99@8: raise(); joachim99@75: QString filename = urlList.first().toLocalFile(); joachim99@8: if ( o == m_pDiffTextWindow1 ) m_sd1.setFilename( filename ); joachim99@8: else if ( o == m_pDiffTextWindow2 ) m_sd2.setFilename( filename ); joachim99@8: else if ( o == m_pDiffTextWindow3 ) m_sd3.setFilename( filename ); joachim99@8: init(); joachim99@8: } joachim99@8: #else joachim99@80: KUrl::List urlList = KUrl::List::fromMimeData( pDropEvent->mimeData() ); joachim99@8: if ( canContinue() && !urlList.isEmpty() ) joachim99@8: { joachim99@8: raise(); joachim99@8: FileAccess fa( urlList.first().url() ); joachim99@8: if ( o == m_pDiffTextWindow1 ) m_sd1.setFileAccess( fa ); joachim99@8: else if ( o == m_pDiffTextWindow2 ) m_sd2.setFileAccess( fa ); joachim99@8: else if ( o == m_pDiffTextWindow3 ) m_sd3.setFileAccess( fa ); joachim99@8: init(); joachim99@8: } joachim99@8: #endif joachim99@8: } joachim99@75: else if ( pDropEvent->mimeData()->hasText() ) joachim99@8: { joachim99@75: QString text = pDropEvent->mimeData()->text(); joachim99@75: if ( canContinue() ) joachim99@8: { joachim99@8: raise(); joachim99@58: if ( o == m_pDiffTextWindow1 ) m_sd1.setData(text); joachim99@58: else if ( o == m_pDiffTextWindow2 ) m_sd2.setData(text); joachim99@58: else if ( o == m_pDiffTextWindow3 ) m_sd3.setData(text); joachim99@8: init(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: return true; joachim99@8: } joachim99@8: return QSplitter::eventFilter( o, e ); // standard event processing joachim99@8: } joachim99@8: joachim99@8: joachim99@8: joachim99@8: joachim99@8: void KDiff3App::slotFileOpen() joachim99@8: { joachim99@8: if ( !canContinue() ) return; joachim99@8: joachim99@8: if ( m_pDirectoryMergeWindow->isDirectoryMergeInProgress() ) joachim99@8: { joachim99@8: int result = KMessageBox::warningYesNo(this, joachim99@8: i18n("You are currently doing a directory merge. Are you sure, you want to abort?"), joachim99@80: i18n("Warning"), joachim99@80: KGuiItem( i18n("Abort") ), joachim99@80: KGuiItem( i18n("Continue Merging") ) ); joachim99@8: if ( result!=KMessageBox::Yes ) joachim99@8: return; joachim99@8: } joachim99@8: joachim99@8: joachim99@8: slotStatusMsg(i18n("Opening files...")); joachim99@8: joachim99@8: for(;;) joachim99@8: { joachim99@8: OpenDialog d(this, joachim99@75: QDir::toNativeSeparators( m_bDirCompare ? m_pDirectoryMergeWindow->getDirNameA() : m_sd1.isFromBuffer() ? QString("") : m_sd1.getAliasName() ), joachim99@75: QDir::toNativeSeparators( m_bDirCompare ? m_pDirectoryMergeWindow->getDirNameB() : m_sd2.isFromBuffer() ? QString("") : m_sd2.getAliasName() ), joachim99@75: QDir::toNativeSeparators( m_bDirCompare ? m_pDirectoryMergeWindow->getDirNameC() : m_sd3.isFromBuffer() ? QString("") : m_sd3.getAliasName() ), joachim99@75: m_bDirCompare ? ! m_pDirectoryMergeWindow->getDirNameDest().isEmpty() : !m_outputFilename.isEmpty(), joachim99@75: QDir::toNativeSeparators( m_bDirCompare ? m_pDirectoryMergeWindow->getDirNameDest() : m_bDefaultFilename ? QString("") : m_outputFilename ), joachim99@8: SLOT(slotConfigure()), m_pOptionDialog ); joachim99@8: int status = d.exec(); joachim99@8: if ( status == QDialog::Accepted ) joachim99@8: { joachim99@69: m_sd1.setFilename( d.m_pLineA->currentText() ); joachim99@69: m_sd2.setFilename( d.m_pLineB->currentText() ); joachim99@69: m_sd3.setFilename( d.m_pLineC->currentText() ); joachim99@8: joachim99@8: if( d.m_pMerge->isChecked() ) joachim99@8: { joachim99@69: if ( d.m_pLineOut->currentText().isEmpty() ) joachim99@8: { joachim99@8: m_outputFilename = "unnamed.txt"; joachim99@8: m_bDefaultFilename = true; joachim99@8: } joachim99@8: else joachim99@8: { joachim99@69: m_outputFilename = d.m_pLineOut->currentText(); joachim99@8: m_bDefaultFilename = false; joachim99@8: } joachim99@8: } joachim99@8: else joachim99@8: m_outputFilename = ""; joachim99@8: joachim99@69: bool bSuccess = improveFilenames(false); joachim99@66: if ( !bSuccess ) joachim99@66: continue; joachim99@69: joachim99@8: if ( m_bDirCompare ) joachim99@8: { joachim99@8: m_pDirectoryMergeSplitter->show(); joachim99@8: if ( m_pMainWidget!=0 ) joachim99@8: { joachim99@8: m_pMainWidget->hide(); joachim99@8: } joachim99@8: break; joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: m_pDirectoryMergeSplitter->hide(); joachim99@8: init(); joachim99@8: joachim99@80: if ( (! m_sd1.isEmpty() && !m_sd1.hasData()) || joachim99@80: (! m_sd2.isEmpty() && !m_sd2.hasData()) || joachim99@80: (! m_sd3.isEmpty() && !m_sd3.hasData()) ) joachim99@8: { joachim99@8: QString text( i18n("Opening of these files failed:") ); joachim99@8: text += "\n\n"; joachim99@58: if ( ! m_sd1.isEmpty() && !m_sd1.hasData() ) joachim99@8: text += " - " + m_sd1.getAliasName() + "\n"; joachim99@58: if ( ! m_sd2.isEmpty() && !m_sd2.hasData() ) joachim99@8: text += " - " + m_sd2.getAliasName() + "\n"; joachim99@58: if ( ! m_sd3.isEmpty() && !m_sd3.hasData() ) joachim99@8: text += " - " + m_sd3.getAliasName() + "\n"; joachim99@8: joachim99@8: KMessageBox::sorry( this, text, i18n("File open error") ); joachim99@8: continue; joachim99@8: } joachim99@8: } joachim99@8: } joachim99@8: break; joachim99@8: } joachim99@8: joachim99@8: slotUpdateAvailabilities(); joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotFileOpen2(QString fn1, QString fn2, QString fn3, QString ofn, joachim99@66: QString an1, QString an2, QString an3, TotalDiffStatus* pTotalDiffStatus ) joachim99@8: { joachim99@8: if ( !canContinue() ) return; joachim99@8: joachim99@68: if(fn1=="" && fn2=="" && fn3=="" && ofn=="" && m_pMainWidget!=0 ) joachim99@68: { joachim99@68: m_pMainWidget->hide(); joachim99@68: return; joachim99@68: } joachim99@68: joachim99@8: slotStatusMsg(i18n("Opening files...")); joachim99@8: joachim99@8: m_sd1.setFilename( fn1 ); joachim99@8: m_sd2.setFilename( fn2 ); joachim99@8: m_sd3.setFilename( fn3 ); joachim99@8: joachim99@8: m_sd1.setAliasName( an1 ); joachim99@8: m_sd2.setAliasName( an2 ); joachim99@8: m_sd3.setAliasName( an3 ); joachim99@8: joachim99@8: if ( ! ofn.isEmpty() ) joachim99@8: { joachim99@8: m_outputFilename = ofn; joachim99@8: m_bDefaultFilename = false; joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: m_outputFilename = ""; joachim99@8: m_bDefaultFilename = true; joachim99@8: } joachim99@8: joachim99@66: bool bDirCompare = m_bDirCompare; joachim99@69: improveFilenames(true); // Create new window for KDiff3 for directory comparison. joachim99@68: joachim99@66: if( m_bDirCompare ) joachim99@8: { joachim99@8: } joachim99@8: else joachim99@8: { joachim99@66: m_bDirCompare = bDirCompare; // Don't allow this to change here. joachim99@66: init( false, pTotalDiffStatus ); joachim99@8: joachim99@66: if ( pTotalDiffStatus!=0 ) joachim99@66: return; joachim99@69: joachim99@80: if ( (! m_sd1.isEmpty() && ! m_sd1.hasData()) || joachim99@80: (! m_sd2.isEmpty() && ! m_sd2.hasData()) || joachim99@80: (! m_sd3.isEmpty() && ! m_sd3.hasData()) ) joachim99@8: { joachim99@8: QString text( i18n("Opening of these files failed:") ); joachim99@8: text += "\n\n"; joachim99@58: if ( ! m_sd1.isEmpty() && !m_sd1.hasData() ) joachim99@8: text += " - " + m_sd1.getAliasName() + "\n"; joachim99@58: if ( ! m_sd2.isEmpty() && !m_sd2.hasData() ) joachim99@8: text += " - " + m_sd2.getAliasName() + "\n"; joachim99@58: if ( ! m_sd3.isEmpty() && !m_sd3.hasData() ) joachim99@8: text += " - " + m_sd3.getAliasName() + "\n"; joachim99@8: joachim99@8: KMessageBox::sorry( this, text, i18n("File open error") ); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: if ( m_pDirectoryMergeWindow!=0 && m_pDirectoryMergeWindow->isVisible() && ! dirShowBoth->isChecked() ) joachim99@8: { joachim99@8: slotDirViewToggle(); joachim99@8: } joachim99@8: } joachim99@8: } joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@69: joachim99@69: void KDiff3App::slotFileNameChanged(const QString& fileName, int winIdx) joachim99@69: { joachim99@69: QString fn1 = m_sd1.getFilename(); joachim99@69: QString an1 = m_sd1.getAliasName(); joachim99@69: QString fn2 = m_sd2.getFilename(); joachim99@69: QString an2 = m_sd2.getAliasName(); joachim99@69: QString fn3 = m_sd3.getFilename(); joachim99@69: QString an3 = m_sd3.getAliasName(); joachim99@69: if (winIdx==1) { fn1 = fileName; an1 = ""; } joachim99@69: if (winIdx==2) { fn2 = fileName; an2 = ""; } joachim99@69: if (winIdx==3) { fn3 = fileName; an3 = ""; } joachim99@69: joachim99@69: slotFileOpen2( fn1, fn2, fn3, m_outputFilename, an1, an2, an3, 0 ); joachim99@69: } joachim99@69: joachim99@69: joachim99@8: void KDiff3App::slotEditCut() joachim99@8: { joachim99@8: slotStatusMsg(i18n("Cutting selection...")); joachim99@8: joachim99@8: QString s; joachim99@8: if ( m_pMergeResultWindow!=0 ) joachim99@8: { joachim99@8: s = m_pMergeResultWindow->getSelection(); joachim99@8: m_pMergeResultWindow->deleteSelection(); joachim99@8: joachim99@8: m_pMergeResultWindow->update(); joachim99@8: } joachim99@8: joachim99@8: if ( !s.isNull() ) joachim99@8: { joachim99@58: QApplication::clipboard()->setText( s, QClipboard::Clipboard ); joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotEditCopy() joachim99@8: { joachim99@8: slotStatusMsg(i18n("Copying selection to clipboard...")); joachim99@8: QString s; joachim99@8: if ( m_pDiffTextWindow1!=0 ) s = m_pDiffTextWindow1->getSelection(); joachim99@8: if ( s.isNull() && m_pDiffTextWindow2!=0 ) s = m_pDiffTextWindow2->getSelection(); joachim99@8: if ( s.isNull() && m_pDiffTextWindow3!=0 ) s = m_pDiffTextWindow3->getSelection(); joachim99@8: if ( s.isNull() && m_pMergeResultWindow!=0 ) s = m_pMergeResultWindow->getSelection(); joachim99@8: if ( !s.isNull() ) joachim99@8: { joachim99@58: QApplication::clipboard()->setText( s, QClipboard::Clipboard ); joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotEditPaste() joachim99@8: { joachim99@8: slotStatusMsg(i18n("Inserting clipboard contents...")); joachim99@8: joachim99@8: if ( m_pMergeResultWindow!=0 && m_pMergeResultWindow->isVisible() ) joachim99@8: { joachim99@66: m_pMergeResultWindow->pasteClipboard(false); joachim99@8: } joachim99@8: else if ( canContinue() ) joachim99@8: { joachim99@8: if ( m_pDiffTextWindow1->hasFocus() ) joachim99@8: { joachim99@66: m_sd1.setData( QApplication::clipboard()->text(QClipboard::Clipboard) ); joachim99@8: init(); joachim99@8: } joachim99@8: else if ( m_pDiffTextWindow2->hasFocus() ) joachim99@8: { joachim99@66: m_sd2.setData( QApplication::clipboard()->text(QClipboard::Clipboard) ); joachim99@8: init(); joachim99@8: } joachim99@8: else if ( m_pDiffTextWindow3->hasFocus() ) joachim99@8: { joachim99@66: m_sd3.setData( QApplication::clipboard()->text(QClipboard::Clipboard) ); joachim99@8: init(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@69: void KDiff3App::slotEditSelectAll() joachim99@69: { joachim99@69: int l=0,p=0; // needed as dummy return values joachim99@69: if ( m_pMergeResultWindow && m_pMergeResultWindow->hasFocus() ) { m_pMergeResultWindow->setSelection( 0,0,m_pMergeResultWindow->getNofLines(),0); } joachim99@69: else if ( m_pDiffTextWindow1 && m_pDiffTextWindow1->hasFocus() ) { m_pDiffTextWindow1 ->setSelection( 0,0,m_pDiffTextWindow1->getNofLines(),0,l,p); } joachim99@69: else if ( m_pDiffTextWindow2 && m_pDiffTextWindow2->hasFocus() ) { m_pDiffTextWindow2 ->setSelection( 0,0,m_pDiffTextWindow2->getNofLines(),0,l,p); } joachim99@69: else if ( m_pDiffTextWindow3 && m_pDiffTextWindow3->hasFocus() ) { m_pDiffTextWindow3 ->setSelection( 0,0,m_pDiffTextWindow3->getNofLines(),0,l,p); } joachim99@69: joachim99@69: slotStatusMsg(i18n("Ready.")); joachim99@69: } joachim99@8: joachim99@8: void KDiff3App::slotGoCurrent() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoCurrent(); joachim99@8: } joachim99@8: void KDiff3App::slotGoTop() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoTop(); joachim99@8: } joachim99@8: void KDiff3App::slotGoBottom() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoBottom(); joachim99@8: } joachim99@8: void KDiff3App::slotGoPrevUnsolvedConflict() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoPrevUnsolvedConflict(); joachim99@8: } joachim99@8: void KDiff3App::slotGoNextUnsolvedConflict() joachim99@8: { joachim99@8: m_bTimerBlock = false; joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoNextUnsolvedConflict(); joachim99@8: } joachim99@8: void KDiff3App::slotGoPrevConflict() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoPrevConflict(); joachim99@8: } joachim99@8: void KDiff3App::slotGoNextConflict() joachim99@8: { joachim99@8: m_bTimerBlock = false; joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoNextConflict(); joachim99@8: } joachim99@8: void KDiff3App::slotGoPrevDelta() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoPrevDelta(); joachim99@8: } joachim99@8: void KDiff3App::slotGoNextDelta() joachim99@8: { joachim99@8: if (m_pMergeResultWindow) m_pMergeResultWindow->slotGoNextDelta(); joachim99@8: } joachim99@51: joachim99@53: void KDiff3App::choose( int choice ) joachim99@8: { joachim99@53: if (!m_bTimerBlock ) joachim99@8: { joachim99@53: if ( m_pDirectoryMergeWindow && m_pDirectoryMergeWindow->hasFocus() ) joachim99@8: { joachim99@53: if (choice==A) m_pDirectoryMergeWindow->slotCurrentChooseA(); joachim99@53: if (choice==B) m_pDirectoryMergeWindow->slotCurrentChooseB(); joachim99@53: if (choice==C) m_pDirectoryMergeWindow->slotCurrentChooseC(); joachim99@53: joachim99@53: chooseA->setChecked(false); joachim99@53: chooseB->setChecked(false); joachim99@53: chooseC->setChecked(false); joachim99@53: } joachim99@53: else if ( m_pMergeResultWindow ) joachim99@53: { joachim99@53: m_pMergeResultWindow->choose( choice ); joachim99@53: if ( autoAdvance->isChecked() ) joachim99@53: { joachim99@53: m_bTimerBlock = true; joachim99@53: QTimer::singleShot( m_pOptionDialog->m_autoAdvanceDelay, this, SLOT( slotGoNextUnsolvedConflict() ) ); joachim99@53: } joachim99@8: } joachim99@8: } joachim99@8: } joachim99@53: joachim99@53: void KDiff3App::slotChooseA() { choose( A ); } joachim99@53: void KDiff3App::slotChooseB() { choose( B ); } joachim99@53: void KDiff3App::slotChooseC() { choose( C ); } joachim99@51: joachim99@51: // bConflictsOnly automatically choose for conflicts only (true) or for everywhere joachim99@68: static void mergeChooseGlobal( MergeResultWindow* pMRW, int selector, bool bConflictsOnly, bool bWhiteSpaceOnly ) joachim99@8: { joachim99@51: if ( pMRW ) joachim99@8: { joachim99@51: pMRW->chooseGlobal(selector, bConflictsOnly, bWhiteSpaceOnly ); joachim99@8: } joachim99@8: } joachim99@8: joachim99@68: void KDiff3App::slotChooseAEverywhere() { mergeChooseGlobal( m_pMergeResultWindow, A, false, false ); } joachim99@68: void KDiff3App::slotChooseBEverywhere() { mergeChooseGlobal( m_pMergeResultWindow, B, false, false ); } joachim99@68: void KDiff3App::slotChooseCEverywhere() { mergeChooseGlobal( m_pMergeResultWindow, C, false, false ); } joachim99@68: void KDiff3App::slotChooseAForUnsolvedConflicts() { mergeChooseGlobal( m_pMergeResultWindow, A, true, false ); } joachim99@68: void KDiff3App::slotChooseBForUnsolvedConflicts() { mergeChooseGlobal( m_pMergeResultWindow, B, true, false ); } joachim99@68: void KDiff3App::slotChooseCForUnsolvedConflicts() { mergeChooseGlobal( m_pMergeResultWindow, C, true, false ); } joachim99@68: void KDiff3App::slotChooseAForUnsolvedWhiteSpaceConflicts() { mergeChooseGlobal( m_pMergeResultWindow, A, true, true ); } joachim99@68: void KDiff3App::slotChooseBForUnsolvedWhiteSpaceConflicts() { mergeChooseGlobal( m_pMergeResultWindow, B, true, true ); } joachim99@68: void KDiff3App::slotChooseCForUnsolvedWhiteSpaceConflicts() { mergeChooseGlobal( m_pMergeResultWindow, C, true, true ); } joachim99@51: joachim99@8: joachim99@8: void KDiff3App::slotAutoSolve() joachim99@8: { joachim99@8: if (m_pMergeResultWindow ) joachim99@8: { joachim99@8: m_pMergeResultWindow->slotAutoSolve(); joachim99@8: // m_pMergeWindowFrame->show(); incompatible with bPreserveCarriageReturn joachim99@8: m_pMergeResultWindow->showNrOfConflicts(); joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotUnsolve() joachim99@8: { joachim99@8: if (m_pMergeResultWindow ) joachim99@8: { joachim99@8: m_pMergeResultWindow->slotUnsolve(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@69: void KDiff3App::slotMergeHistory() joachim99@69: { joachim99@69: if (m_pMergeResultWindow ) joachim99@69: { joachim99@69: m_pMergeResultWindow->slotMergeHistory(); joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::slotRegExpAutoMerge() joachim99@69: { joachim99@69: if (m_pMergeResultWindow ) joachim99@69: { joachim99@69: m_pMergeResultWindow->slotRegExpAutoMerge(); joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::slotSplitDiff() joachim99@69: { joachim99@69: int firstLine = -1; joachim99@69: int lastLine = -1; joachim99@69: DiffTextWindow* pDTW=0; joachim99@69: if ( m_pDiffTextWindow1 ) { pDTW=m_pDiffTextWindow1; pDTW->getSelectionRange(&firstLine, &lastLine, eD3LLineCoords); } joachim99@69: if ( firstLine<0 && m_pDiffTextWindow2 ) { pDTW=m_pDiffTextWindow2; pDTW->getSelectionRange(&firstLine, &lastLine, eD3LLineCoords); } joachim99@69: if ( firstLine<0 && m_pDiffTextWindow3 ) { pDTW=m_pDiffTextWindow3; pDTW->getSelectionRange(&firstLine, &lastLine, eD3LLineCoords); } joachim99@69: if ( pDTW && firstLine>=0 && m_pMergeResultWindow) joachim99@69: { joachim99@69: pDTW->resetSelection(); joachim99@69: joachim99@69: m_pMergeResultWindow->slotSplitDiff( firstLine, lastLine ); joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::slotJoinDiffs() joachim99@69: { joachim99@69: int firstLine = -1; joachim99@69: int lastLine = -1; joachim99@69: DiffTextWindow* pDTW=0; joachim99@69: if ( m_pDiffTextWindow1 ) { pDTW=m_pDiffTextWindow1; pDTW->getSelectionRange(&firstLine, &lastLine, eD3LLineCoords); } joachim99@69: if ( firstLine<0 && m_pDiffTextWindow2 ) { pDTW=m_pDiffTextWindow2; pDTW->getSelectionRange(&firstLine, &lastLine, eD3LLineCoords); } joachim99@69: if ( firstLine<0 && m_pDiffTextWindow3 ) { pDTW=m_pDiffTextWindow3; pDTW->getSelectionRange(&firstLine, &lastLine, eD3LLineCoords); } joachim99@69: if ( pDTW && firstLine>=0 && m_pMergeResultWindow) joachim99@69: { joachim99@69: pDTW->resetSelection(); joachim99@69: joachim99@69: m_pMergeResultWindow->slotJoinDiffs( firstLine, lastLine ); joachim99@69: } joachim99@69: } joachim99@8: joachim99@8: void KDiff3App::slotConfigure() joachim99@8: { joachim99@8: m_pOptionDialog->setState(); joachim99@80: m_pOptionDialog->incrementInitialSize ( QSize(0,40) ); joachim99@8: m_pOptionDialog->exec(); joachim99@8: slotRefresh(); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotConfigureKeys() joachim99@8: { joachim99@80: KShortcutsDialog::configure(actionCollection(), KShortcutsEditor::LetterShortcutsAllowed, this); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotRefresh() joachim99@8: { joachim99@51: if (m_pDiffTextWindow1!=0) joachim99@51: { joachim99@51: m_pDiffTextWindow1->setFont(m_pOptionDialog->m_font); joachim99@51: m_pDiffTextWindow1->update(); joachim99@28: } joachim99@28: if (m_pDiffTextWindow2!=0) joachim99@51: { joachim99@51: m_pDiffTextWindow2->setFont(m_pOptionDialog->m_font); joachim99@51: m_pDiffTextWindow2->update(); joachim99@28: } joachim99@28: if (m_pDiffTextWindow3!=0) joachim99@51: { joachim99@51: m_pDiffTextWindow3->setFont(m_pOptionDialog->m_font); joachim99@51: m_pDiffTextWindow3->update(); joachim99@28: } joachim99@28: if (m_pMergeResultWindow!=0) joachim99@51: { joachim99@51: m_pMergeResultWindow->setFont(m_pOptionDialog->m_font); joachim99@51: m_pMergeResultWindow->update(); joachim99@28: } joachim99@68: if (m_pHScrollBar!=0) joachim99@68: { joachim99@68: m_pHScrollBar->setAgain(); joachim99@68: } joachim99@8: if ( m_pDiffWindowSplitter!=0 ) joachim99@8: { joachim99@69: m_pDiffWindowSplitter->setOrientation( m_pOptionDialog->m_bHorizDiffWindowSplitting ? Qt::Horizontal : Qt::Vertical ); joachim99@69: } joachim99@69: if ( m_pDirectoryMergeWindow ) joachim99@69: { joachim99@69: m_pDirectoryMergeWindow->updateFileVisibilities(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotSelectionStart() joachim99@8: { joachim99@8: //editCopy->setEnabled( false ); joachim99@8: //editCut->setEnabled( false ); joachim99@8: joachim99@8: const QObject* s = sender(); joachim99@8: if (m_pDiffTextWindow1 && s!=m_pDiffTextWindow1) m_pDiffTextWindow1->resetSelection(); joachim99@8: if (m_pDiffTextWindow2 && s!=m_pDiffTextWindow2) m_pDiffTextWindow2->resetSelection(); joachim99@8: if (m_pDiffTextWindow3 && s!=m_pDiffTextWindow3) m_pDiffTextWindow3->resetSelection(); joachim99@8: if (m_pMergeResultWindow && s!=m_pMergeResultWindow) m_pMergeResultWindow->resetSelection(); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotSelectionEnd() joachim99@8: { joachim99@8: //const QObject* s = sender(); joachim99@8: //editCopy->setEnabled(true); joachim99@8: //editCut->setEnabled( s==m_pMergeResultWindow ); joachim99@8: if ( m_pOptionDialog->m_bAutoCopySelection ) joachim99@8: { joachim99@8: slotEditCopy(); joachim99@8: } joachim99@58: else joachim99@58: { joachim99@58: QClipboard *clipBoard = QApplication::clipboard(); joachim99@58: joachim99@58: if (clipBoard->supportsSelection ()) joachim99@69: { joachim99@58: QString s; joachim99@58: if ( m_pDiffTextWindow1!=0 ) s = m_pDiffTextWindow1->getSelection(); joachim99@58: if ( s.isNull() && m_pDiffTextWindow2!=0 ) s = m_pDiffTextWindow2->getSelection(); joachim99@58: if ( s.isNull() && m_pDiffTextWindow3!=0 ) s = m_pDiffTextWindow3->getSelection(); joachim99@58: if ( s.isNull() && m_pMergeResultWindow!=0 ) s = m_pMergeResultWindow->getSelection(); joachim99@58: if ( !s.isNull() ) joachim99@58: { joachim99@58: clipBoard->setText( s, QClipboard::Selection ); joachim99@58: } joachim99@58: } joachim99@58: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotClipboardChanged() joachim99@8: { joachim99@8: QString s = QApplication::clipboard()->text(); joachim99@8: //editPaste->setEnabled(!s.isEmpty()); joachim99@8: } joachim99@8: joachim99@75: void KDiff3App::slotOutputModified(bool bModified) joachim99@8: { joachim99@75: if ( bModified && !m_bOutputModified ) joachim99@8: { joachim99@8: m_bOutputModified=true; joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotAutoAdvanceToggled() joachim99@8: { joachim99@8: m_pOptionDialog->m_bAutoAdvance = autoAdvance->isChecked(); joachim99@8: } joachim99@8: joachim99@66: void KDiff3App::slotWordWrapToggled() joachim99@66: { joachim99@66: m_pOptionDialog->m_bWordWrap = wordWrap->isChecked(); joachim99@66: recalcWordWrap(); joachim99@66: } joachim99@66: joachim99@69: void KDiff3App::slotRecalcWordWrap() joachim99@66: { joachim99@69: recalcWordWrap(); joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::recalcWordWrap(int nofVisibleColumns) // nofVisibleColumns is >=0 only for printing, otherwise the really visible width is used joachim99@69: { joachim99@69: bool bPrinting = nofVisibleColumns>=0; joachim99@66: int firstD3LIdx = 0; joachim99@66: if( m_pDiffTextWindow1 ) joachim99@66: firstD3LIdx = m_pDiffTextWindow1->convertLineToDiff3LineIdx( m_pDiffTextWindow1->getFirstLine() ); joachim99@66: joachim99@66: // Convert selection to D3L-coords (converting back happens in DiffTextWindow::recalcWordWrap() joachim99@66: if ( m_pDiffTextWindow1 ) joachim99@66: m_pDiffTextWindow1->convertSelectionToD3LCoords(); joachim99@66: if ( m_pDiffTextWindow2 ) joachim99@66: m_pDiffTextWindow2->convertSelectionToD3LCoords(); joachim99@66: if ( m_pDiffTextWindow3 ) joachim99@66: m_pDiffTextWindow3->convertSelectionToD3LCoords(); joachim99@69: joachim99@69: joachim99@66: if ( !m_diff3LineList.empty() && m_pOptionDialog->m_bWordWrap ) joachim99@69: { joachim99@66: Diff3LineList::iterator i; joachim99@66: int sumOfLines=0; joachim99@66: for ( i=m_diff3LineList.begin(); i!=m_diff3LineList.end(); ++i ) joachim99@66: { joachim99@66: Diff3Line& d3l = *i; joachim99@66: d3l.linesNeededForDisplay = 1; joachim99@66: d3l.sumLinesNeededForDisplay = sumOfLines; joachim99@66: sumOfLines += d3l.linesNeededForDisplay; joachim99@66: } joachim99@69: joachim99@66: // Let every window calc how many lines will be needed. joachim99@66: if ( m_pDiffTextWindow1 ) joachim99@69: m_pDiffTextWindow1->recalcWordWrap(true,0,nofVisibleColumns); joachim99@66: if ( m_pDiffTextWindow2 ) joachim99@69: m_pDiffTextWindow2->recalcWordWrap(true,0,nofVisibleColumns); joachim99@66: if ( m_pDiffTextWindow3 ) joachim99@69: m_pDiffTextWindow3->recalcWordWrap(true,0,nofVisibleColumns); joachim99@69: joachim99@66: sumOfLines=0; joachim99@66: for ( i=m_diff3LineList.begin(); i!=m_diff3LineList.end(); ++i ) joachim99@66: { joachim99@66: Diff3Line& d3l = *i; joachim99@66: d3l.sumLinesNeededForDisplay = sumOfLines; joachim99@66: sumOfLines += d3l.linesNeededForDisplay; joachim99@66: } joachim99@69: joachim99@66: // Finish the initialisation: joachim99@66: if ( m_pDiffTextWindow1 ) joachim99@69: m_pDiffTextWindow1->recalcWordWrap(true,sumOfLines,nofVisibleColumns); joachim99@66: if ( m_pDiffTextWindow2 ) joachim99@69: m_pDiffTextWindow2->recalcWordWrap(true,sumOfLines,nofVisibleColumns); joachim99@66: if ( m_pDiffTextWindow3 ) joachim99@69: m_pDiffTextWindow3->recalcWordWrap(true,sumOfLines,nofVisibleColumns); joachim99@66: joachim99@66: m_neededLines = sumOfLines; joachim99@66: } joachim99@66: else joachim99@66: { joachim99@66: m_neededLines = m_diff3LineVector.size(); joachim99@66: if ( m_pDiffTextWindow1 ) joachim99@69: m_pDiffTextWindow1->recalcWordWrap(false,0,0); joachim99@66: if ( m_pDiffTextWindow2 ) joachim99@69: m_pDiffTextWindow2->recalcWordWrap(false,0,0); joachim99@66: if ( m_pDiffTextWindow3 ) joachim99@69: m_pDiffTextWindow3->recalcWordWrap(false,0,0); joachim99@66: } joachim99@69: if (bPrinting) joachim99@69: return; joachim99@69: joachim99@80: if (m_pOverview) joachim99@80: m_pOverview->slotRedraw(); joachim99@66: if ( m_pDiffTextWindow1 ) joachim99@66: { joachim99@66: m_pDiffTextWindow1->setFirstLine( m_pDiffTextWindow1->convertDiff3LineIdxToLine( firstD3LIdx ) ); joachim99@66: m_pDiffTextWindow1->update(); joachim99@66: } joachim99@66: if ( m_pDiffTextWindow2 ) joachim99@66: { joachim99@66: m_pDiffTextWindow2->setFirstLine( m_pDiffTextWindow2->convertDiff3LineIdxToLine( firstD3LIdx ) ); joachim99@66: m_pDiffTextWindow2->update(); joachim99@66: } joachim99@66: if ( m_pDiffTextWindow3 ) joachim99@66: { joachim99@66: m_pDiffTextWindow3->setFirstLine( m_pDiffTextWindow3->convertDiff3LineIdxToLine( firstD3LIdx ) ); joachim99@66: m_pDiffTextWindow3->update(); joachim99@66: } joachim99@66: joachim99@91: if ( m_pDiffVScrollBar ) joachim99@91: m_pDiffVScrollBar->setRange(0, max2(0, m_neededLines+1 - m_DTWHeight) ); joachim99@66: if ( m_pDiffTextWindow1 ) joachim99@66: { joachim99@66: m_pDiffVScrollBar->setValue( m_pDiffTextWindow1->convertDiff3LineIdxToLine( firstD3LIdx ) ); joachim99@69: joachim99@92: setHScrollBarRange(); joachim99@66: m_pHScrollBar->setValue(0); joachim99@66: } joachim99@66: } joachim99@66: joachim99@8: void KDiff3App::slotShowWhiteSpaceToggled() joachim99@8: { joachim99@51: m_pOptionDialog->m_bShowWhiteSpaceCharacters = showWhiteSpaceCharacters->isChecked(); joachim99@8: m_pOptionDialog->m_bShowWhiteSpace = showWhiteSpace->isChecked(); joachim99@51: showWhiteSpaceCharacters->setEnabled( showWhiteSpace->isChecked() ); joachim99@8: if ( m_pDiffTextWindow1!=0 ) joachim99@8: m_pDiffTextWindow1->update(); joachim99@8: if ( m_pDiffTextWindow2!=0 ) joachim99@8: m_pDiffTextWindow2->update(); joachim99@8: if ( m_pDiffTextWindow3!=0 ) joachim99@8: m_pDiffTextWindow3->update(); joachim99@51: if ( m_pOverview!=0 ) joachim99@51: m_pOverview->slotRedraw(); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotShowLineNumbersToggled() joachim99@8: { joachim99@8: m_pOptionDialog->m_bShowLineNumbers = showLineNumbers->isChecked(); joachim99@8: if ( m_pDiffTextWindow1!=0 ) joachim99@8: m_pDiffTextWindow1->update(); joachim99@8: if ( m_pDiffTextWindow2!=0 ) joachim99@8: m_pDiffTextWindow2->update(); joachim99@8: if ( m_pDiffTextWindow3!=0 ) joachim99@8: m_pDiffTextWindow3->update(); joachim99@8: } joachim99@8: joachim99@66: /// Return true for success, else false joachim99@69: bool KDiff3App::improveFilenames( bool bCreateNewInstance ) joachim99@8: { joachim99@66: m_bDirCompare = false; joachim99@69: joachim99@8: FileAccess f1(m_sd1.getFilename()); joachim99@8: FileAccess f2(m_sd2.getFilename()); joachim99@8: FileAccess f3(m_sd3.getFilename()); joachim99@8: FileAccess f4(m_outputFilename); joachim99@8: joachim99@8: if ( f1.isFile() && f1.exists() ) joachim99@8: { joachim99@8: if ( f2.isDir() ) joachim99@8: { joachim99@8: f2.addPath( f1.fileName() ); joachim99@8: if ( f2.isFile() && f2.exists() ) joachim99@8: m_sd2.setFileAccess( f2 ); joachim99@8: } joachim99@8: if ( f3.isDir() ) joachim99@8: { joachim99@8: f3.addPath( f1.fileName() ); joachim99@8: if ( f3.isFile() && f3.exists() ) joachim99@8: m_sd3.setFileAccess( f3 ); joachim99@8: } joachim99@8: if ( f4.isDir() ) joachim99@8: { joachim99@8: f4.addPath( f1.fileName() ); joachim99@8: if ( f4.isFile() && f4.exists() ) joachim99@80: m_outputFilename = f4.absoluteFilePath(); joachim99@8: } joachim99@8: } joachim99@8: else if ( f1.isDir() ) joachim99@8: { joachim99@66: m_bDirCompare = true; joachim99@69: if (bCreateNewInstance) joachim99@69: { joachim99@80: emit createNewInstance( f1.absoluteFilePath(), f2.absoluteFilePath(), f3.absoluteFilePath() ); joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: FileAccess destDir; joachim99@69: if (!m_bDefaultFilename) destDir = f4; joachim99@69: m_pDirectoryMergeSplitter->show(); joachim99@69: if (m_pMainWidget!=0) m_pMainWidget->hide(); joachim99@80: setUpdatesEnabled(true); joachim99@69: joachim99@69: bool bSuccess = m_pDirectoryMergeWindow->init( joachim99@69: f1, f2, f3, joachim99@69: destDir, // Destdirname joachim99@69: !m_outputFilename.isEmpty() joachim99@69: ); joachim99@66: joachim99@75: m_bDirCompare = true; // This seems redundant but it might have been reset during full analysis. joachim99@69: joachim99@69: if (bSuccess) joachim99@69: { joachim99@69: m_sd1.reset(); joachim99@92: if (m_pDiffTextWindow1!=0) m_pDiffTextWindow1->init(0,0,eLineEndStyleDos,0,0,0,0,false); joachim99@69: m_sd2.reset(); joachim99@92: if (m_pDiffTextWindow2!=0) m_pDiffTextWindow2->init(0,0,eLineEndStyleDos,0,0,0,0,false); joachim99@69: m_sd3.reset(); joachim99@92: if (m_pDiffTextWindow3!=0) m_pDiffTextWindow3->init(0,0,eLineEndStyleDos,0,0,0,0,false); joachim99@69: } joachim99@69: slotUpdateAvailabilities(); joachim99@69: return bSuccess; joachim99@66: } joachim99@8: } joachim99@66: return true; joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotReload() joachim99@8: { joachim99@8: if ( !canContinue() ) return; joachim99@8: joachim99@8: init(); joachim99@8: } joachim99@8: joachim99@8: bool KDiff3App::canContinue() joachim99@8: { joachim99@8: // First test if anything must be saved. joachim99@8: if(m_bOutputModified) joachim99@8: { joachim99@8: int result = KMessageBox::warningYesNoCancel(this, joachim99@8: i18n("The merge result hasn't been saved."), joachim99@80: i18n("Warning"), joachim99@80: KGuiItem( i18n("Save && Continue") ), joachim99@80: KGuiItem( i18n("Continue Without Saving") ) ); joachim99@8: if ( result==KMessageBox::Cancel ) joachim99@8: return false; joachim99@8: else if ( result==KMessageBox::Yes ) joachim99@8: { joachim99@8: slotFileSave(); joachim99@8: if ( m_bOutputModified ) joachim99@8: { joachim99@8: KMessageBox::sorry(this, i18n("Saving the merge result failed."), i18n("Warning") ); joachim99@8: return false; joachim99@8: } joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: m_bOutputModified = false; joachim99@8: return true; joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotCheckIfCanContinue( bool* pbContinue ) joachim99@8: { joachim99@8: if (pbContinue!=0) *pbContinue = canContinue(); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: void KDiff3App::slotDirShowBoth() joachim99@8: { joachim99@8: if( dirShowBoth->isChecked() ) joachim99@8: { joachim99@80: if ( m_pDirectoryMergeSplitter ) joachim99@80: m_pDirectoryMergeSplitter->setVisible( m_bDirCompare ); joachim99@8: joachim99@8: if ( m_pMainWidget!=0 ) joachim99@8: m_pMainWidget->show(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@98: bool bTextDataAvailable = ( m_sd1.hasData() || m_sd2.hasData() || m_sd3.hasData() ); joachim99@98: if ( m_pMainWidget!=0 && bTextDataAvailable ) joachim99@8: { joachim99@8: m_pMainWidget->show(); joachim99@8: m_pDirectoryMergeSplitter->hide(); joachim99@8: } joachim99@8: else if ( m_bDirCompare ) joachim99@8: { joachim99@8: m_pDirectoryMergeSplitter->show(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: void KDiff3App::slotDirViewToggle() joachim99@8: { joachim99@8: if ( m_bDirCompare ) joachim99@8: { joachim99@8: if( ! m_pDirectoryMergeSplitter->isVisible() ) joachim99@8: { joachim99@8: m_pDirectoryMergeSplitter->show(); joachim99@8: if (m_pMainWidget!=0) joachim99@8: m_pMainWidget->hide(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: if (m_pMainWidget!=0) joachim99@8: { joachim99@8: m_pDirectoryMergeSplitter->hide(); joachim99@8: m_pMainWidget->show(); joachim99@8: } joachim99@8: } joachim99@8: } joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotShowWindowAToggled() joachim99@8: { joachim99@8: if ( m_pDiffTextWindow1!=0 ) joachim99@8: { joachim99@75: m_pDiffTextWindowFrame1->setVisible( showWindowA->isChecked() ); joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotShowWindowBToggled() joachim99@8: { joachim99@8: if ( m_pDiffTextWindow2!=0 ) joachim99@8: { joachim99@75: m_pDiffTextWindowFrame2->setVisible( showWindowB->isChecked() ); joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotShowWindowCToggled() joachim99@8: { joachim99@8: if ( m_pDiffTextWindow3!=0 ) joachim99@8: { joachim99@75: m_pDiffTextWindowFrame3->setVisible( showWindowC->isChecked() ); joachim99@8: slotUpdateAvailabilities(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotEditFind() joachim99@8: { joachim99@8: m_pFindDialog->currentLine = 0; joachim99@8: m_pFindDialog->currentPos = 0; joachim99@8: m_pFindDialog->currentWindow = 1; joachim99@8: joachim99@8: if ( QDialog::Accepted == m_pFindDialog->exec() ) joachim99@8: { joachim99@8: slotEditFindNext(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotEditFindNext() joachim99@8: { joachim99@68: QString s = m_pFindDialog->m_pSearchString->text(); joachim99@8: if ( s.isEmpty() ) joachim99@8: { joachim99@8: slotEditFind(); joachim99@8: return; joachim99@8: } joachim99@8: joachim99@8: bool bDirDown = true; joachim99@8: bool bCaseSensitive = m_pFindDialog->m_pCaseSensitive->isChecked(); joachim99@8: joachim99@8: int d3vLine = m_pFindDialog->currentLine; joachim99@8: int posInLine = m_pFindDialog->currentPos; joachim99@66: int l=0; joachim99@66: int p=0; joachim99@8: if ( m_pFindDialog->currentWindow == 1 ) joachim99@8: { joachim99@8: if ( m_pFindDialog->m_pSearchInA->isChecked() && m_pDiffTextWindow1!=0 && joachim99@8: m_pDiffTextWindow1->findString( s, d3vLine, posInLine, bDirDown, bCaseSensitive ) ) joachim99@8: { joachim99@66: m_pDiffTextWindow1->setSelection( d3vLine, posInLine, d3vLine, posInLine+s.length(), l, p ); joachim99@66: m_pDiffVScrollBar->setValue(l-m_pDiffVScrollBar->pageStep()/2); joachim99@66: m_pHScrollBar->setValue( max2( 0, p+(int)s.length()-m_pHScrollBar->pageStep()) ); joachim99@8: m_pFindDialog->currentLine = d3vLine; joachim99@8: m_pFindDialog->currentPos = posInLine + 1; joachim99@8: return; joachim99@8: } joachim99@8: m_pFindDialog->currentWindow = 2; joachim99@8: m_pFindDialog->currentLine = 0; joachim99@8: m_pFindDialog->currentPos = 0; joachim99@8: } joachim99@8: joachim99@8: d3vLine = m_pFindDialog->currentLine; joachim99@8: posInLine = m_pFindDialog->currentPos; joachim99@8: if ( m_pFindDialog->currentWindow == 2 ) joachim99@8: { joachim99@8: if ( m_pFindDialog->m_pSearchInB->isChecked() && m_pDiffTextWindow2!=0 && joachim99@8: m_pDiffTextWindow2->findString( s, d3vLine, posInLine, bDirDown, bCaseSensitive ) ) joachim99@8: { joachim99@66: m_pDiffTextWindow2->setSelection( d3vLine, posInLine, d3vLine, posInLine+s.length(),l,p ); joachim99@66: m_pDiffVScrollBar->setValue(l-m_pDiffVScrollBar->pageStep()/2); joachim99@66: m_pHScrollBar->setValue( max2( 0, p+(int)s.length()-m_pHScrollBar->pageStep()) ); joachim99@8: m_pFindDialog->currentLine = d3vLine; joachim99@8: m_pFindDialog->currentPos = posInLine + 1; joachim99@8: return; joachim99@8: } joachim99@8: m_pFindDialog->currentWindow = 3; joachim99@8: m_pFindDialog->currentLine = 0; joachim99@8: m_pFindDialog->currentPos = 0; joachim99@8: } joachim99@8: joachim99@8: d3vLine = m_pFindDialog->currentLine; joachim99@8: posInLine = m_pFindDialog->currentPos; joachim99@8: if ( m_pFindDialog->currentWindow == 3 ) joachim99@8: { joachim99@8: if ( m_pFindDialog->m_pSearchInC->isChecked() && m_pDiffTextWindow3!=0 && joachim99@8: m_pDiffTextWindow3->findString( s, d3vLine, posInLine, bDirDown, bCaseSensitive ) ) joachim99@8: { joachim99@66: m_pDiffTextWindow3->setSelection( d3vLine, posInLine, d3vLine, posInLine+s.length(),l,p ); joachim99@66: m_pDiffVScrollBar->setValue(l-m_pDiffVScrollBar->pageStep()/2); joachim99@66: m_pHScrollBar->setValue( max2( 0, p+(int)s.length()-m_pHScrollBar->pageStep()) ); joachim99@8: m_pFindDialog->currentLine = d3vLine; joachim99@8: m_pFindDialog->currentPos = posInLine + 1; joachim99@8: return; joachim99@8: } joachim99@8: m_pFindDialog->currentWindow = 4; joachim99@8: m_pFindDialog->currentLine = 0; joachim99@8: m_pFindDialog->currentPos = 0; joachim99@8: } joachim99@8: joachim99@8: d3vLine = m_pFindDialog->currentLine; joachim99@8: posInLine = m_pFindDialog->currentPos; joachim99@8: if ( m_pFindDialog->currentWindow == 4 ) joachim99@8: { joachim99@8: if ( m_pFindDialog->m_pSearchInOutput->isChecked() && m_pMergeResultWindow!=0 && m_pMergeResultWindow->isVisible() && joachim99@8: m_pMergeResultWindow->findString( s, d3vLine, posInLine, bDirDown, bCaseSensitive ) ) joachim99@8: { joachim99@8: m_pMergeResultWindow->setSelection( d3vLine, posInLine, d3vLine, posInLine+s.length() ); joachim99@8: m_pMergeVScrollBar->setValue(d3vLine - m_pMergeVScrollBar->pageStep()/2); joachim99@8: m_pHScrollBar->setValue( max2( 0, posInLine+(int)s.length()-m_pHScrollBar->pageStep()) ); joachim99@8: m_pFindDialog->currentLine = d3vLine; joachim99@8: m_pFindDialog->currentPos = posInLine + 1; joachim99@8: return; joachim99@8: } joachim99@8: m_pFindDialog->currentWindow = 5; joachim99@8: m_pFindDialog->currentLine = 0; joachim99@8: m_pFindDialog->currentPos = 0; joachim99@8: } joachim99@8: joachim99@51: KMessageBox::information(this,i18n("Search complete."),i18n("Search Complete")); joachim99@8: m_pFindDialog->currentWindow = 1; joachim99@8: m_pFindDialog->currentLine = 0; joachim99@8: m_pFindDialog->currentPos = 0; joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotMergeCurrentFile() joachim99@8: { joachim99@8: if ( m_bDirCompare && m_pDirectoryMergeWindow->isVisible() && m_pDirectoryMergeWindow->isFileSelected() ) joachim99@8: { joachim99@8: m_pDirectoryMergeWindow->mergeCurrentFile(); joachim99@8: } joachim99@8: else if ( m_pMainWidget != 0 && m_pMainWidget->isVisible() ) joachim99@8: { joachim99@8: if ( !canContinue() ) return; joachim99@8: if ( m_outputFilename.isEmpty() ) joachim99@8: { joachim99@58: if ( !m_sd3.isEmpty() && !m_sd3.isFromBuffer() ) joachim99@8: { joachim99@8: m_outputFilename = m_sd3.getFilename(); joachim99@8: } joachim99@58: else if ( !m_sd2.isEmpty() && !m_sd2.isFromBuffer() ) joachim99@8: { joachim99@8: m_outputFilename = m_sd2.getFilename(); joachim99@8: } joachim99@58: else if ( !m_sd1.isEmpty() && !m_sd1.isFromBuffer() ) joachim99@8: { joachim99@8: m_outputFilename = m_sd1.getFilename(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: m_outputFilename = "unnamed.txt"; joachim99@8: m_bDefaultFilename = true; joachim99@8: } joachim99@8: } joachim99@8: init(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotWinFocusNext() joachim99@8: { joachim99@8: QWidget* focus = qApp->focusWidget(); joachim99@8: if ( focus == m_pDirectoryMergeWindow && m_pDirectoryMergeWindow->isVisible() && ! dirShowBoth->isChecked() ) joachim99@8: { joachim99@8: slotDirViewToggle(); joachim99@8: } joachim99@8: joachim99@8: std::list visibleWidgetList; joachim99@66: if ( m_pDiffTextWindow1 && m_pDiffTextWindow1->isVisible() ) visibleWidgetList.push_back(m_pDiffTextWindow1); joachim99@66: if ( m_pDiffTextWindow2 && m_pDiffTextWindow2->isVisible() ) visibleWidgetList.push_back(m_pDiffTextWindow2); joachim99@66: if ( m_pDiffTextWindow3 && m_pDiffTextWindow3->isVisible() ) visibleWidgetList.push_back(m_pDiffTextWindow3); joachim99@66: if ( m_pMergeResultWindow && m_pMergeResultWindow->isVisible() ) visibleWidgetList.push_back(m_pMergeResultWindow); joachim99@8: if ( m_bDirCompare /*m_pDirectoryMergeWindow->isVisible()*/ ) visibleWidgetList.push_back(m_pDirectoryMergeWindow); joachim99@8: //if ( m_pDirectoryMergeInfo->isVisible() ) visibleWidgetList.push_back(m_pDirectoryMergeInfo->getInfoList()); joachim99@8: joachim99@8: std::list::iterator i = std::find( visibleWidgetList.begin(), visibleWidgetList.end(), focus); joachim99@8: ++i; joachim99@66: if ( i==visibleWidgetList.end() ) joachim99@66: i = visibleWidgetList.begin(); joachim99@8: if ( i!=visibleWidgetList.end() ) joachim99@8: { joachim99@8: if ( *i == m_pDirectoryMergeWindow && ! dirShowBoth->isChecked() ) joachim99@8: { joachim99@8: slotDirViewToggle(); joachim99@8: } joachim99@8: (*i)->setFocus(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotWinFocusPrev() joachim99@8: { joachim99@8: QWidget* focus = qApp->focusWidget(); joachim99@8: if ( focus == m_pDirectoryMergeWindow && m_pDirectoryMergeWindow->isVisible() && ! dirShowBoth->isChecked() ) joachim99@8: { joachim99@8: slotDirViewToggle(); joachim99@8: } joachim99@8: joachim99@8: std::list visibleWidgetList; joachim99@66: if ( m_pDiffTextWindow1 && m_pDiffTextWindow1->isVisible() ) visibleWidgetList.push_back(m_pDiffTextWindow1); joachim99@66: if ( m_pDiffTextWindow2 && m_pDiffTextWindow2->isVisible() ) visibleWidgetList.push_back(m_pDiffTextWindow2); joachim99@66: if ( m_pDiffTextWindow3 && m_pDiffTextWindow3->isVisible() ) visibleWidgetList.push_back(m_pDiffTextWindow3); joachim99@66: if ( m_pMergeResultWindow && m_pMergeResultWindow->isVisible() ) visibleWidgetList.push_back(m_pMergeResultWindow); joachim99@8: if (m_bDirCompare /* m_pDirectoryMergeWindow->isVisible() */ ) visibleWidgetList.push_back(m_pDirectoryMergeWindow); joachim99@8: //if ( m_pDirectoryMergeInfo->isVisible() ) visibleWidgetList.push_back(m_pDirectoryMergeInfo->getInfoList()); joachim99@8: joachim99@8: std::list::iterator i = std::find( visibleWidgetList.begin(), visibleWidgetList.end(), focus); joachim99@73: if ( i==visibleWidgetList.begin() ) joachim99@73: i=visibleWidgetList.end(); joachim99@8: --i; joachim99@8: if ( i!=visibleWidgetList.end() ) joachim99@8: { joachim99@8: if ( *i == m_pDirectoryMergeWindow && ! dirShowBoth->isChecked() ) joachim99@8: { joachim99@8: slotDirViewToggle(); joachim99@8: } joachim99@8: (*i)->setFocus(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotWinToggleSplitterOrientation() joachim99@8: { joachim99@8: if ( m_pDiffWindowSplitter!=0 ) joachim99@8: { joachim99@8: m_pDiffWindowSplitter->setOrientation( joachim99@69: m_pDiffWindowSplitter->orientation()==Qt::Vertical ? Qt::Horizontal : Qt::Vertical joachim99@8: ); joachim99@51: joachim99@69: m_pOptionDialog->m_bHorizDiffWindowSplitting = m_pDiffWindowSplitter->orientation()==Qt::Horizontal; joachim99@8: } joachim99@8: } joachim99@8: joachim99@66: void KDiff3App::slotOverviewNormal() joachim99@69: { joachim99@80: if ( m_pOverview != 0 ) joachim99@80: m_pOverview->setOverviewMode( Overview::eOMNormal ); joachim99@80: if ( m_pMergeResultWindow !=0 ) joachim99@80: m_pMergeResultWindow->setOverviewMode( Overview::eOMNormal ); joachim99@66: slotUpdateAvailabilities(); joachim99@66: } joachim99@66: joachim99@66: void KDiff3App::slotOverviewAB() joachim99@66: { joachim99@80: if ( m_pOverview != 0 ) joachim99@80: m_pOverview->setOverviewMode( Overview::eOMAvsB ); joachim99@69: m_pMergeResultWindow->setOverviewMode( Overview::eOMAvsB ); joachim99@66: slotUpdateAvailabilities(); joachim99@66: } joachim99@66: joachim99@66: void KDiff3App::slotOverviewAC() joachim99@66: { joachim99@80: if ( m_pOverview != 0 ) joachim99@80: m_pOverview->setOverviewMode( Overview::eOMAvsC ); joachim99@80: if ( m_pMergeResultWindow !=0 ) joachim99@80: m_pMergeResultWindow->setOverviewMode( Overview::eOMAvsC ); joachim99@66: slotUpdateAvailabilities(); joachim99@66: } joachim99@66: joachim99@66: void KDiff3App::slotOverviewBC() joachim99@66: { joachim99@80: if ( m_pOverview != 0 ) joachim99@80: m_pOverview->setOverviewMode( Overview::eOMBvsC ); joachim99@80: if ( m_pMergeResultWindow !=0 ) joachim99@80: m_pMergeResultWindow->setOverviewMode( Overview::eOMBvsC ); joachim99@66: slotUpdateAvailabilities(); joachim99@66: } joachim99@69: joachim99@69: void KDiff3App::slotNoRelevantChangesDetected() joachim99@69: { joachim99@69: if ( m_bTripleDiff && ! m_outputFilename.isEmpty() ) joachim99@69: { joachim99@69: //KMessageBox::information( this, "No relevant changes detected", "KDiff3" ); joachim99@69: if (!m_pOptionDialog->m_IrrelevantMergeCmd.isEmpty()) joachim99@69: { joachim99@69: QString cmd = m_pOptionDialog->m_IrrelevantMergeCmd + " \"" + m_sd1.getAliasName()+ "\" \"" + m_sd2.getAliasName() + "\" \"" + m_sd3.getAliasName(); joachim99@75: QProcess process; joachim99@75: process.start( cmd ); joachim99@75: process.waitForFinished(-1); joachim99@75: //::system( cmd.local8Bit() ); joachim99@69: } joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: static void insertManualDiffHelp( ManualDiffHelpList* pManualDiffHelpList, int winIdx, int firstLine, int lastLine ) joachim99@69: { joachim99@69: // The manual diff help list must be sorted and compact. joachim99@69: // "Compact" means that upper items can't be empty if lower items contain data. joachim99@69: joachim99@69: // First insert the new item without regarding compactness. joachim99@69: // If the new item overlaps with previous items then the previous items will be removed. joachim99@69: joachim99@69: ManualDiffHelpEntry mdhe; joachim99@69: mdhe.firstLine( winIdx ) = firstLine; joachim99@69: mdhe.lastLine( winIdx ) = lastLine; joachim99@69: joachim99@69: ManualDiffHelpList::iterator i; joachim99@69: for( i=pManualDiffHelpList->begin(); i!=pManualDiffHelpList->end(); ++i ) joachim99@69: { joachim99@69: int& l1 = i->firstLine( winIdx ); joachim99@69: int& l2 = i->lastLine( winIdx ); joachim99@69: if (l1>=0 && l2>=0) joachim99@69: { joachim99@80: if ( (firstLine<=l1 && lastLine>=l1) || (firstLine <=l2 && lastLine>=l2) ) joachim99@69: { joachim99@69: // overlap joachim99@69: l1 = -1; joachim99@69: l2 = -1; joachim99@69: } joachim99@69: if ( firstLineinsert( i, mdhe ); joachim99@69: break; joachim99@69: } joachim99@69: } joachim99@69: } joachim99@69: if ( i == pManualDiffHelpList->end() ) joachim99@69: { joachim99@69: pManualDiffHelpList->insert( i, mdhe ); joachim99@69: } joachim99@69: joachim99@69: // Now make the list compact joachim99@69: for( int wIdx=1; wIdx<=3; ++wIdx ) joachim99@69: { joachim99@69: ManualDiffHelpList::iterator iEmpty = pManualDiffHelpList->begin(); joachim99@69: for( i=pManualDiffHelpList->begin(); i!=pManualDiffHelpList->end(); ++i ) joachim99@69: { joachim99@69: if ( iEmpty->firstLine(wIdx) >= 0 ) joachim99@69: { joachim99@69: ++iEmpty; joachim99@69: continue; joachim99@69: } joachim99@69: if ( i->firstLine(wIdx)>=0 ) // Current item is not empty -> move it to the empty place joachim99@69: { joachim99@69: iEmpty->firstLine(wIdx) = i->firstLine(wIdx); joachim99@69: iEmpty->lastLine(wIdx) = i->lastLine(wIdx); joachim99@69: i->firstLine(wIdx) = -1; joachim99@69: i->lastLine(wIdx) = -1; joachim99@69: ++iEmpty; joachim99@69: } joachim99@69: } joachim99@69: } joachim99@69: pManualDiffHelpList->remove( ManualDiffHelpEntry() ); // Remove all completely empty items. joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::slotAddManualDiffHelp() joachim99@69: { joachim99@69: int firstLine = -1; joachim99@69: int lastLine = -1; joachim99@69: int winIdx = -1; joachim99@69: if ( m_pDiffTextWindow1 ) { m_pDiffTextWindow1->getSelectionRange(&firstLine, &lastLine, eFileCoords); winIdx=1; } joachim99@69: if ( firstLine<0 && m_pDiffTextWindow2 ) { m_pDiffTextWindow2->getSelectionRange(&firstLine, &lastLine, eFileCoords); winIdx=2; } joachim99@69: if ( firstLine<0 && m_pDiffTextWindow3 ) { m_pDiffTextWindow3->getSelectionRange(&firstLine, &lastLine, eFileCoords); winIdx=3; } joachim99@69: joachim99@69: if ( firstLine<0 || lastLine <0 || lastLineisChecked() ) joachim99@8: { joachim99@80: if ( m_pDirectoryMergeSplitter!=0 ) joachim99@80: m_pDirectoryMergeSplitter->setVisible( m_bDirCompare ); joachim99@8: joachim99@8: if ( m_pMainWidget!=0 && !m_pMainWidget->isVisible() && joachim99@66: bTextDataAvailable && !m_pDirectoryMergeWindow->isScanning() joachim99@8: ) joachim99@8: m_pMainWidget->show(); joachim99@8: } joachim99@69: joachim99@8: joachim99@8: bool bDiffWindowVisible = m_pMainWidget != 0 && m_pMainWidget->isVisible(); joachim99@8: bool bMergeEditorVisible = m_pMergeWindowFrame !=0 && m_pMergeWindowFrame->isVisible(); joachim99@8: joachim99@53: m_pDirectoryMergeWindow->updateAvailabilities( m_bDirCompare, bDiffWindowVisible, chooseA, chooseB, chooseC ); joachim99@8: joachim99@8: dirShowBoth->setEnabled( m_bDirCompare ); joachim99@8: dirViewToggle->setEnabled( joachim99@8: m_bDirCompare && joachim99@80: ((!m_pDirectoryMergeSplitter->isVisible() && m_pMainWidget!=0 && m_pMainWidget->isVisible()) || joachim99@80: (m_pDirectoryMergeSplitter->isVisible() && m_pMainWidget!=0 && !m_pMainWidget->isVisible() && bTextDataAvailable) ) joachim99@8: ); joachim99@69: joachim99@53: bool bDirWindowHasFocus = m_pDirectoryMergeSplitter->isVisible() && m_pDirectoryMergeWindow->hasFocus(); joachim99@8: joachim99@51: showWhiteSpaceCharacters->setEnabled( bDiffWindowVisible ); joachim99@8: autoAdvance->setEnabled( bMergeEditorVisible ); joachim99@8: autoSolve->setEnabled( bMergeEditorVisible && m_bTripleDiff ); joachim99@8: unsolve->setEnabled( bMergeEditorVisible ); joachim99@53: if ( !bDirWindowHasFocus ) joachim99@53: { joachim99@53: chooseA->setEnabled( bMergeEditorVisible ); joachim99@53: chooseB->setEnabled( bMergeEditorVisible ); joachim99@53: chooseC->setEnabled( bMergeEditorVisible && m_bTripleDiff ); joachim99@53: } joachim99@8: chooseAEverywhere->setEnabled( bMergeEditorVisible ); joachim99@8: chooseBEverywhere->setEnabled( bMergeEditorVisible ); joachim99@8: chooseCEverywhere->setEnabled( bMergeEditorVisible && m_bTripleDiff ); joachim99@51: chooseAForUnsolvedConflicts->setEnabled( bMergeEditorVisible ); joachim99@51: chooseBForUnsolvedConflicts->setEnabled( bMergeEditorVisible ); joachim99@51: chooseCForUnsolvedConflicts->setEnabled( bMergeEditorVisible && m_bTripleDiff ); joachim99@51: chooseAForUnsolvedWhiteSpaceConflicts->setEnabled( bMergeEditorVisible ); joachim99@51: chooseBForUnsolvedWhiteSpaceConflicts->setEnabled( bMergeEditorVisible ); joachim99@51: chooseCForUnsolvedWhiteSpaceConflicts->setEnabled( bMergeEditorVisible && m_bTripleDiff ); joachim99@69: mergeHistory->setEnabled( bMergeEditorVisible ); joachim99@69: mergeRegExp->setEnabled( bMergeEditorVisible ); joachim99@8: showWindowA->setEnabled( bDiffWindowVisible && ( m_pDiffTextWindow2->isVisible() || m_pDiffTextWindow3->isVisible() ) ); joachim99@8: showWindowB->setEnabled( bDiffWindowVisible && ( m_pDiffTextWindow1->isVisible() || m_pDiffTextWindow3->isVisible() )); joachim99@8: showWindowC->setEnabled( bDiffWindowVisible && m_bTripleDiff && ( m_pDiffTextWindow1->isVisible() || m_pDiffTextWindow2->isVisible() ) ); joachim99@8: editFind->setEnabled( bDiffWindowVisible ); joachim99@8: editFindNext->setEnabled( bDiffWindowVisible ); joachim99@8: m_pFindDialog->m_pSearchInC->setEnabled( m_bTripleDiff ); joachim99@8: m_pFindDialog->m_pSearchInOutput->setEnabled( bMergeEditorVisible ); joachim99@8: joachim99@8: bool bSavable = bMergeEditorVisible && m_pMergeResultWindow->getNrOfUnsolvedConflicts()==0; joachim99@8: fileSave->setEnabled( m_bOutputModified && bSavable ); joachim99@8: fileSaveAs->setEnabled( bSavable ); joachim99@8: joachim99@8: goTop->setEnabled( bDiffWindowVisible && m_pMergeResultWindow->isDeltaAboveCurrent() ); joachim99@8: goBottom->setEnabled( bDiffWindowVisible && m_pMergeResultWindow->isDeltaBelowCurrent() ); joachim99@8: goCurrent->setEnabled( bDiffWindowVisible ); joachim99@8: goPrevUnsolvedConflict->setEnabled( bMergeEditorVisible && m_pMergeResultWindow->isUnsolvedConflictAboveCurrent() ); joachim99@8: goNextUnsolvedConflict->setEnabled( bMergeEditorVisible && m_pMergeResultWindow->isUnsolvedConflictBelowCurrent() ); joachim99@8: goPrevConflict->setEnabled( bDiffWindowVisible && m_pMergeResultWindow->isConflictAboveCurrent() ); joachim99@8: goNextConflict->setEnabled( bDiffWindowVisible && m_pMergeResultWindow->isConflictBelowCurrent() ); joachim99@8: goPrevDelta->setEnabled( bDiffWindowVisible && m_pMergeResultWindow->isDeltaAboveCurrent() ); joachim99@8: goNextDelta->setEnabled( bDiffWindowVisible && m_pMergeResultWindow->isDeltaBelowCurrent() ); joachim99@69: joachim99@66: overviewModeNormal->setEnabled( m_bTripleDiff && bDiffWindowVisible ); joachim99@66: overviewModeAB->setEnabled( m_bTripleDiff && bDiffWindowVisible ); joachim99@66: overviewModeAC->setEnabled( m_bTripleDiff && bDiffWindowVisible ); joachim99@66: overviewModeBC->setEnabled( m_bTripleDiff && bDiffWindowVisible ); joachim99@66: Overview::e_OverviewMode overviewMode = m_pOverview==0 ? Overview::eOMNormal : m_pOverview->getOverviewMode(); joachim99@66: overviewModeNormal->setChecked( overviewMode == Overview::eOMNormal ); joachim99@66: overviewModeAB->setChecked( overviewMode == Overview::eOMAvsB ); joachim99@66: overviewModeAC->setChecked( overviewMode == Overview::eOMAvsC ); joachim99@66: overviewModeBC->setChecked( overviewMode == Overview::eOMBvsC ); joachim99@8: joachim99@8: winToggleSplitOrientation->setEnabled( bDiffWindowVisible && m_pDiffWindowSplitter!=0 ); joachim99@8: }