joachim99@8: /*************************************************************************** joachim99@8: kdiff3.cpp - description joachim99@8: ------------------- joachim99@8: begin : Don Jul 11 12:31:29 CEST 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: joachim99@8: #include joachim99@80: #include joachim99@8: joachim99@8: // include files for QT joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@70: #include joachim99@80: #include joachim99@75: #include joachim99@8: joachim99@8: // include files for KDE joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@80: #include joachim99@8: #include joachim99@8: //#include joachim99@80: #include joachim99@80: #include joachim99@80: #include joachim99@80: #include joachim99@80: #include joachim99@8: joachim99@8: // application specific includes joachim99@8: #include "kdiff3.h" joachim99@8: #include "optiondialog.h" joachim99@8: #include "fileaccess.h" joachim99@8: #include "kdiff3_part.h" joachim99@8: #include "directorymergewindow.h" joachim99@69: #include "smalldialogs.h" joachim99@80: #include "guiutils.h" // namespace KDiff3 joachim99@8: joachim99@8: #define ID_STATUS_MSG 1 joachim99@80: #define MAIN_TOOLBAR_NAME "mainToolBar" joachim99@8: joachim99@8: KActionCollection* KDiff3App::actionCollection() joachim99@8: { joachim99@8: if ( m_pKDiff3Shell==0 ) joachim99@8: return m_pKDiff3Part->actionCollection(); joachim99@8: else joachim99@8: return m_pKDiff3Shell->actionCollection(); joachim99@8: } joachim99@8: joachim99@8: KStatusBar* KDiff3App::statusBar() joachim99@8: { joachim99@8: if ( m_pKDiff3Shell==0 ) joachim99@8: return 0; joachim99@8: else joachim99@8: return m_pKDiff3Shell->statusBar(); joachim99@8: } joachim99@8: joachim99@8: KToolBar* KDiff3App::toolBar(const char* toolBarId ) joachim99@8: { joachim99@8: if ( m_pKDiff3Shell==0 ) joachim99@8: return 0; joachim99@8: else joachim99@8: return m_pKDiff3Shell->toolBar( toolBarId ); joachim99@80: //return m_pKDiff3Shell->toolBar(); joachim99@8: } joachim99@8: joachim99@8: bool KDiff3App::isPart() joachim99@8: { joachim99@8: return m_pKDiff3Shell==0; joachim99@8: } joachim99@8: joachim99@69: bool KDiff3App::isFileSaved() joachim99@69: { joachim99@69: return m_bFileSaved; joachim99@69: } joachim99@8: joachim99@80: bool KDiff3App::isDirComparison() joachim99@80: { joachim99@80: return m_bDirCompare; joachim99@80: } joachim99@80: joachim99@92: KDiff3App::KDiff3App(QWidget* pParent, const char* /*name*/, KDiff3Part* pKDiff3Part ) joachim99@75: : QSplitter(pParent) //previously KMainWindow joachim99@8: { joachim99@92: setObjectName( "KDiff3App" ); joachim99@8: m_pKDiff3Part = pKDiff3Part; joachim99@8: m_pKDiff3Shell = dynamic_cast(pParent); joachim99@8: joachim99@75: setWindowTitle( "KDiff3" ); joachim99@75: setOpaqueResize(false); // faster resizing joachim99@80: setUpdatesEnabled(false); joachim99@8: joachim99@8: m_pMainSplitter = 0; joachim99@80: m_pDirectoryMergeSplitter = 0; joachim99@8: m_pDirectoryMergeWindow = 0; joachim99@8: m_pCornerWidget = 0; joachim99@8: m_pMainWidget = 0; joachim99@8: m_pDiffTextWindow1 = 0; joachim99@8: m_pDiffTextWindow2 = 0; joachim99@8: m_pDiffTextWindow3 = 0; joachim99@69: m_pDiffTextWindowFrame1 = 0; joachim99@69: m_pDiffTextWindowFrame2 = 0; joachim99@69: m_pDiffTextWindowFrame3 = 0; joachim99@8: m_pDiffWindowSplitter = 0; joachim99@8: m_pOverview = 0; joachim99@8: m_bTripleDiff = false; joachim99@8: m_pMergeResultWindow = 0; joachim99@8: m_pMergeWindowFrame = 0; joachim99@8: m_bOutputModified = false; joachim99@69: m_bFileSaved = false; joachim99@8: m_bTimerBlock = false; joachim99@68: m_pHScrollBar = 0; joachim99@91: m_pDiffVScrollBar = 0; joachim99@91: m_pMergeVScrollBar = 0; joachim99@80: viewToolBar = 0; joachim99@8: joachim99@51: // Needed before any file operations via FileAccess happen. joachim99@69: if (!g_pProgressDialog) joachim99@77: { joachim99@69: g_pProgressDialog = new ProgressDialog(0); joachim99@77: g_pProgressDialog->setStayHidden( true ); joachim99@77: } joachim99@51: joachim99@58: // All default values must be set before calling readOptions(). joachim99@58: m_pOptionDialog = new OptionDialog( m_pKDiff3Shell!=0, this ); joachim99@80: connect( m_pOptionDialog, SIGNAL(applyDone()), this, SLOT(slotRefresh()) ); joachim99@68: joachim99@80: m_pOptionDialog->readOptions( isPart() ? m_pKDiff3Part->componentData().config() : KGlobal::config() ); joachim99@58: joachim99@69: // Option handling: Only when pParent==0 (no parent) joachim99@69: KCmdLineArgs *args = isPart() ? 0 : KCmdLineArgs::parsedArgs(); joachim99@69: joachim99@69: if (args) joachim99@69: { joachim99@69: QString s; joachim99@69: QString title; joachim99@69: if ( args->isSet("confighelp") ) joachim99@69: { joachim99@69: s = m_pOptionDialog->calcOptionHelp(); joachim99@69: title = i18n("Current Configuration:"); joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: s = m_pOptionDialog->parseOptions( args->getOptionList("cs") ); joachim99@69: title = i18n("Config Option Error:"); joachim99@69: } joachim99@69: if (!s.isEmpty()) joachim99@69: { joachim99@95: #if defined(_WIN32) || defined(Q_OS_OS2) joachim99@69: // A windows program has no console joachim99@69: //KMessageBox::information(0, s,i18n("KDiff3-Usage")); joachim99@75: QDialog* pDialog = new QDialog(this); joachim99@75: pDialog->setAttribute( Qt::WA_DeleteOnClose ); joachim99@75: pDialog->setModal( true ); joachim99@75: pDialog->setWindowTitle(title); joachim99@75: QVBoxLayout* pVBoxLayout = new QVBoxLayout( pDialog ); joachim99@75: QTextEdit* pTextEdit = new QTextEdit(pDialog); joachim99@69: pTextEdit->setText(s); joachim99@69: pTextEdit->setReadOnly(true); joachim99@75: pTextEdit->setWordWrapMode(QTextOption::NoWrap); joachim99@69: pVBoxLayout->addWidget(pTextEdit); joachim99@69: pDialog->resize(600,400); joachim99@69: pDialog->exec(); joachim99@69: #else joachim99@75: std::cerr << title.toLatin1().constData() << std::endl; joachim99@75: std::cerr << s.toLatin1().constData() << std::endl; joachim99@69: #endif joachim99@69: exit(1); joachim99@69: } joachim99@69: } joachim99@69: joachim99@58: m_sd1.setOptionDialog(m_pOptionDialog); joachim99@58: m_sd2.setOptionDialog(m_pOptionDialog); joachim99@58: m_sd3.setOptionDialog(m_pOptionDialog); joachim99@68: joachim99@8: if (args!=0) joachim99@8: { joachim99@8: m_outputFilename = args->getOption("output"); joachim99@8: if ( m_outputFilename.isEmpty() ) joachim99@8: m_outputFilename = args->getOption("out"); joachim99@8: } joachim99@8: joachim99@77: m_bAutoFlag = args!=0 && args->isSet("auto"); joachim99@77: m_bAutoMode = m_bAutoFlag || m_pOptionDialog->m_bAutoSaveAndQuitOnMergeWithoutConflicts; joachim99@77: if ( m_bAutoMode && m_outputFilename.isEmpty() ) joachim99@8: { joachim99@77: if ( m_bAutoFlag ) joachim99@77: { joachim99@77: //KMessageBox::information(this, i18n("Option --auto used, but no output file specified.")); joachim99@77: std::cerr << (const char*)i18n("Option --auto used, but no output file specified.").toLatin1() << std::endl; joachim99@77: } joachim99@77: m_bAutoMode = false; joachim99@8: } joachim99@77: g_pProgressDialog->setStayHidden( m_bAutoMode ); joachim99@8: joachim99@8: if ( m_outputFilename.isEmpty() && args!=0 && args->isSet("merge") ) joachim99@8: { joachim99@8: m_outputFilename = "unnamed.txt"; joachim99@8: m_bDefaultFilename = true; joachim99@8: } joachim99@8: else joachim99@8: m_bDefaultFilename = false; joachim99@8: joachim99@8: g_bAutoSolve = args!=0 && !args->isSet("qall"); // Note that this is effective only once. joachim99@8: joachim99@8: if ( args!=0 ) joachim99@8: { joachim99@8: m_sd1.setFilename( args->getOption("base") ); joachim99@8: if ( m_sd1.isEmpty() ) joachim99@8: { joachim99@51: if ( args->count() > 0 ) m_sd1.setFilename( args->url(0).url() ); // args->arg(0) joachim99@51: if ( args->count() > 1 ) m_sd2.setFilename( args->url(1).url() ); joachim99@51: if ( args->count() > 2 ) m_sd3.setFilename( args->url(2).url() ); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@51: if ( args->count() > 0 ) m_sd2.setFilename( args->url(0).url() ); joachim99@51: if ( args->count() > 1 ) m_sd3.setFilename( args->url(1).url() ); joachim99@8: } joachim99@8: joachim99@68: joachim99@80: QStringList aliasList = args->getOptionList("fname"); joachim99@80: QStringList::Iterator ali = aliasList.begin(); joachim99@68: joachim99@66: QString an1 = args->getOption("L1"); joachim99@66: if ( !an1.isEmpty() ) { m_sd1.setAliasName(an1); } joachim99@66: else if ( ali != aliasList.end() ) { m_sd1.setAliasName(*ali); ++ali; } joachim99@68: joachim99@66: QString an2 = args->getOption("L2"); joachim99@66: if ( !an2.isEmpty() ) { m_sd2.setAliasName(an2); } joachim99@66: else if ( ali != aliasList.end() ) { m_sd2.setAliasName(*ali); ++ali; } joachim99@68: joachim99@66: QString an3 = args->getOption("L3"); joachim99@66: if ( !an3.isEmpty() ) { m_sd3.setAliasName(an3); } joachim99@66: else if ( ali != aliasList.end() ) { m_sd3.setAliasName(*ali); ++ali; } joachim99@8: } joachim99@80: joachim99@8: /////////////////////////////////////////////////////////////////// joachim99@8: // call inits to invoke all other construction parts joachim99@8: initActions(actionCollection()); joachim99@8: initStatusBar(); joachim99@8: joachim99@8: m_pFindDialog = new FindDialog( this ); joachim99@8: connect( m_pFindDialog, SIGNAL(findNext()), this, SLOT(slotEditFindNext())); joachim99@8: joachim99@51: autoAdvance->setChecked( m_pOptionDialog->m_bAutoAdvance ); joachim99@51: showWhiteSpaceCharacters->setChecked( m_pOptionDialog->m_bShowWhiteSpaceCharacters ); joachim99@51: showWhiteSpace->setChecked( m_pOptionDialog->m_bShowWhiteSpace ); joachim99@51: showWhiteSpaceCharacters->setEnabled( m_pOptionDialog->m_bShowWhiteSpace ); joachim99@51: showLineNumbers->setChecked( m_pOptionDialog->m_bShowLineNumbers ); joachim99@66: wordWrap->setChecked( m_pOptionDialog->m_bWordWrap ); joachim99@69: if ( ! isPart() ) joachim99@69: { joachim99@80: // TODO joachim99@80: // viewToolBar->setChecked( m_pOptionDialog->m_bShowToolBar ); joachim99@80: // slotViewToolBar(); joachim99@80: joachim99@69: viewStatusBar->setChecked( m_pOptionDialog->m_bShowStatusBar ); joachim99@69: slotViewStatusBar(); joachim99@80: /* joachim99@80: vrusu - commented out as new KToolBar does not hase setParPos joachim99@80: TODO figure out how to restore bar position joachim99@80: if( toolBar(MAIN_TOOLBAR_NAME)!=0 ) joachim99@80: toolBar(MAIN_TOOLBAR_NAME)->setBarPos( (KToolBar::BarPosition) m_pOptionDialog->m_toolBarPos );*/ joachim99@69: /* QSize size = m_pOptionDialog->m_geometry; joachim99@69: QPoint pos = m_pOptionDialog->m_position; joachim99@69: if(!size.isEmpty()) joachim99@69: { joachim99@69: m_pKDiff3Shell->resize( size ); joachim99@69: QRect visibleRect = QRect( pos, size ) & QApplication::desktop()->rect(); joachim99@69: if ( visibleRect.width()>100 && visibleRect.height()>100 ) joachim99@69: m_pKDiff3Shell->move( pos ); joachim99@69: }*/ joachim99@69: } joachim99@69: slotRefresh(); joachim99@51: joachim99@8: m_pMainSplitter = this; //new QSplitter(this); joachim99@70: m_pMainSplitter->setOrientation( Qt::Vertical ); joachim99@8: // setCentralWidget( m_pMainSplitter ); joachim99@8: m_pDirectoryMergeSplitter = new QSplitter( m_pMainSplitter ); joachim99@92: m_pDirectoryMergeSplitter->setObjectName("DirectoryMergeSplitter"); joachim99@80: m_pMainSplitter->addWidget( m_pDirectoryMergeSplitter ); joachim99@70: m_pDirectoryMergeSplitter->setOrientation( Qt::Horizontal ); joachim99@8: m_pDirectoryMergeWindow = new DirectoryMergeWindow( m_pDirectoryMergeSplitter, m_pOptionDialog, joachim99@80: KIconLoader::global() ); joachim99@80: m_pDirectoryMergeSplitter->addWidget(m_pDirectoryMergeWindow); joachim99@8: m_pDirectoryMergeInfo = new DirectoryMergeInfo( m_pDirectoryMergeSplitter ); joachim99@8: m_pDirectoryMergeWindow->setDirectoryMergeInfo( m_pDirectoryMergeInfo ); joachim99@80: m_pDirectoryMergeSplitter->addWidget(m_pDirectoryMergeInfo); joachim99@80: joachim99@66: connect( m_pDirectoryMergeWindow, SIGNAL(startDiffMerge(QString,QString,QString,QString,QString,QString,QString,TotalDiffStatus*)), joachim99@66: this, SLOT( slotFileOpen2(QString,QString,QString,QString,QString,QString,QString,TotalDiffStatus*))); joachim99@75: connect( m_pDirectoryMergeWindow, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateAvailabilities())); joachim99@75: connect( m_pDirectoryMergeWindow, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotUpdateAvailabilities())); joachim99@8: connect( m_pDirectoryMergeWindow, SIGNAL(checkIfCanContinue(bool*)), this, SLOT(slotCheckIfCanContinue(bool*))); joachim99@8: connect( m_pDirectoryMergeWindow, SIGNAL(updateAvailabilities()), this, SLOT(slotUpdateAvailabilities())); joachim99@66: connect( m_pDirectoryMergeWindow, SIGNAL(statusBarMessage(const QString&)), this, SLOT(slotStatusMsg(const QString&))); joachim99@8: joachim99@51: m_pDirectoryMergeWindow->initDirectoryMergeActions( this, actionCollection() ); joachim99@8: joachim99@8: if ( args!=0 ) args->clear(); // Free up some memory. joachim99@8: joachim99@8: if (m_pKDiff3Shell==0) joachim99@8: { joachim99@8: completeInit(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: joachim99@69: void KDiff3App::completeInit( const QString& fn1, const QString& fn2, const QString& fn3 ) joachim99@8: { joachim99@8: if (m_pKDiff3Shell!=0) joachim99@8: { joachim99@69: QSize size=m_pOptionDialog->m_geometry; joachim99@69: QPoint pos=m_pOptionDialog->m_position; joachim99@8: if(!size.isEmpty()) joachim99@8: { joachim99@8: m_pKDiff3Shell->resize( size ); joachim99@75: joachim99@69: QRect visibleRect = QRect( pos, size ) & QApplication::desktop()->rect(); joachim99@69: if ( visibleRect.width()>100 && visibleRect.height()>100 ) joachim99@69: m_pKDiff3Shell->move( pos ); joachim99@77: if (!m_bAutoMode) joachim99@75: { joachim99@75: if ( m_pOptionDialog->m_bMaximised ) joachim99@75: m_pKDiff3Shell->showMaximized(); joachim99@75: else joachim99@75: m_pKDiff3Shell->show(); joachim99@75: } joachim99@8: } joachim99@8: } joachim99@69: if ( ! fn1.isEmpty() ) { m_sd1.setFilename(fn1); } joachim99@69: if ( ! fn2.isEmpty() ) { m_sd2.setFilename(fn2); } joachim99@69: if ( ! fn3.isEmpty() ) { m_sd3.setFilename(fn3); } joachim99@8: joachim99@69: bool bSuccess = improveFilenames(false); joachim99@68: joachim99@77: if ( m_bAutoFlag && m_bAutoMode && m_bDirCompare ) joachim99@8: { joachim99@75: std::cerr << (const char*)i18n("Option --auto ignored for directory comparison.").toLatin1()<hide(); joachim99@8: joachim99@77: init( m_bAutoMode ); joachim99@77: if ( m_bAutoMode ) joachim99@8: { joachim99@58: SourceData* pSD=0; joachim99@8: if ( m_sd3.isEmpty() ) joachim99@8: { joachim99@58: if ( m_totalDiffStatus.bBinaryAEqB ){ pSD = &m_sd1; } joachim99@8: } joachim99@8: else joachim99@8: { joachim99@58: if ( m_totalDiffStatus.bBinaryBEqC ){ pSD = &m_sd3; } // B==C (assume A is old) joachim99@58: else if ( m_totalDiffStatus.bBinaryAEqB ){ pSD = &m_sd3; } // assuming C has changed joachim99@58: else if ( m_totalDiffStatus.bBinaryAEqC ){ pSD = &m_sd2; } // assuming B has changed joachim99@8: } joachim99@8: joachim99@58: if ( pSD!=0 ) joachim99@8: { joachim99@8: // Save this file directly, not via the merge result window. joachim99@8: bool bSuccess = false; joachim99@58: FileAccess fa( m_outputFilename ); joachim99@58: if ( m_pOptionDialog->m_bDmCreateBakFiles && fa.exists() ) joachim99@8: { joachim99@8: QString newName = m_outputFilename + ".orig"; joachim99@58: if ( FileAccess::exists( newName ) ) FileAccess::removeFile( newName ); joachim99@58: if ( !FileAccess::exists( newName ) ) fa.rename( newName ); joachim99@8: } joachim99@68: joachim99@58: bSuccess = pSD->saveNormalDataAs( m_outputFilename ); joachim99@8: if ( bSuccess ) ::exit(0); joachim99@8: else KMessageBox::error( this, i18n("Saving failed.") ); joachim99@8: } joachim99@8: else if ( m_pMergeResultWindow->getNrOfUnsolvedConflicts() == 0 ) joachim99@8: { joachim99@80: bool bSuccess = m_pMergeResultWindow->saveDocument( m_pMergeResultWindowTitle->getFileName(), m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() ); joachim99@8: if ( bSuccess ) ::exit(0); joachim99@8: } joachim99@8: } joachim99@8: } joachim99@77: m_bAutoMode = false; joachim99@8: joachim99@69: if (m_pKDiff3Shell) joachim99@77: { joachim99@77: if ( m_pOptionDialog->m_bMaximised ) joachim99@77: m_pKDiff3Shell->showMaximized(); joachim99@77: else joachim99@77: m_pKDiff3Shell->show(); joachim99@77: } joachim99@77: joachim99@77: g_pProgressDialog->setStayHidden( false ); joachim99@69: joachim99@8: if (statusBar() !=0 ) joachim99@69: statusBar()->setSizeGripEnabled(true); joachim99@8: joachim99@8: slotClipboardChanged(); // For initialisation. joachim99@8: joachim99@8: slotUpdateAvailabilities(); joachim99@8: joachim99@8: if ( ! m_bDirCompare && m_pKDiff3Shell!=0 ) joachim99@8: { joachim99@8: bool bFileOpenError = false; 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@51: KMessageBox::sorry( this, text, i18n("File Open Error") ); joachim99@8: bFileOpenError = true; joachim99@8: } joachim99@8: joachim99@8: if ( m_sd1.isEmpty() || m_sd2.isEmpty() || bFileOpenError ) joachim99@8: slotFileOpen(); joachim99@8: } joachim99@66: else if ( !bSuccess ) // Directory open failed joachim99@66: { joachim99@66: slotFileOpen(); joachim99@66: } joachim99@8: } joachim99@8: joachim99@8: KDiff3App::~KDiff3App() joachim99@8: { joachim99@8: joachim99@8: } joachim99@8: joachim99@80: /** joachim99@80: * Helper function used to create actions into the ac collection joachim99@80: */ joachim99@80: joachim99@8: void KDiff3App::initActions( KActionCollection* ac ) joachim99@8: { joachim99@80: if (ac==0) joachim99@80: KMessageBox::error(0, "actionCollection==0"); joachim99@8: joachim99@80: fileOpen = KStandardAction::open(this, SLOT(slotFileOpen()), ac); joachim99@80: fileOpen->setStatusTip(i18n("Opens documents for comparison...")); joachim99@69: joachim99@80: fileReload = KDiff3::createAction< KAction >( i18n("Reload"), KShortcut( Qt::Key_F5 ), this, SLOT(slotReload()), ac, "file_reload" ); joachim99@80: joachim99@80: fileSave = KStandardAction::save(this, SLOT(slotFileSave()), ac); joachim99@80: fileSave->setStatusTip(i18n("Saves the merge result. All conflicts must be solved!")); joachim99@80: fileSaveAs = KStandardAction::saveAs(this, SLOT(slotFileSaveAs()), ac); joachim99@80: fileSaveAs->setStatusTip(i18n("Saves the current document as...")); joachim99@95: #ifndef QT_NO_PRINTER joachim99@80: filePrint = KStandardAction::print(this, SLOT(slotFilePrint()), ac); joachim99@80: filePrint->setStatusTip(i18n("Print the differences")); joachim99@95: #endif joachim99@80: fileQuit = KStandardAction::quit(this, SLOT(slotFileQuit()), ac); joachim99@80: fileQuit->setStatusTip(i18n("Quits the application")); joachim99@80: editCut = KStandardAction::cut(this, SLOT(slotEditCut()), ac); joachim99@80: editCut->setStatusTip(i18n("Cuts the selected section and puts it to the clipboard")); joachim99@80: editCopy = KStandardAction::copy(this, SLOT(slotEditCopy()), ac); joachim99@80: editCopy->setStatusTip(i18n("Copies the selected section to the clipboard")); joachim99@80: editPaste = KStandardAction::paste(this, SLOT(slotEditPaste()), ac); joachim99@80: editPaste->setStatusTip(i18n("Pastes the clipboard contents to actual position")); joachim99@80: editSelectAll = KStandardAction::selectAll(this, SLOT(slotEditSelectAll()), ac); joachim99@80: editSelectAll->setStatusTip(i18n("Select everything in current window")); joachim99@80: editFind = KStandardAction::find(this, SLOT(slotEditFind()), ac); joachim99@80: editFind->setStatusTip(i18n("Search for a string")); joachim99@80: editFindNext = KStandardAction::findNext(this, SLOT(slotEditFindNext()), ac); joachim99@80: editFindNext->setStatusTip(i18n("Search again for the string")); joachim99@80: /* FIXME figure out how to implement this action joachim99@80: viewToolBar = KStandardAction::showToolbar(this, SLOT(slotViewToolBar()), ac); joachim99@80: viewToolBar->setStatusTip(i18n("Enables/disables the toolbar")); */ joachim99@80: viewStatusBar = KStandardAction::showStatusbar(this, SLOT(slotViewStatusBar()), ac); joachim99@80: viewStatusBar->setStatusTip(i18n("Enables/disables the statusbar")); joachim99@80: KStandardAction::keyBindings(this, SLOT(slotConfigureKeys()), ac); joachim99@80: KAction* pAction = KStandardAction::preferences(this, SLOT(slotConfigure()), ac ); joachim99@8: if ( isPart() ) joachim99@51: pAction->setText(i18n("Configure KDiff3...")); joachim99@8: joachim99@8: joachim99@8: #include "xpm/downend.xpm" joachim99@8: #include "xpm/currentpos.xpm" joachim99@8: #include "xpm/down1arrow.xpm" joachim99@8: #include "xpm/down2arrow.xpm" joachim99@8: #include "xpm/upend.xpm" joachim99@8: #include "xpm/up1arrow.xpm" joachim99@8: #include "xpm/up2arrow.xpm" joachim99@8: #include "xpm/prevunsolved.xpm" joachim99@8: #include "xpm/nextunsolved.xpm" joachim99@8: #include "xpm/iconA.xpm" joachim99@8: #include "xpm/iconB.xpm" joachim99@8: #include "xpm/iconC.xpm" joachim99@8: #include "xpm/autoadvance.xpm" joachim99@8: #include "xpm/showwhitespace.xpm" joachim99@58: #include "xpm/showwhitespacechars.xpm" joachim99@8: #include "xpm/showlinenumbers.xpm" joachim99@8: //#include "reload.xpm" joachim99@8: joachim99@80: goCurrent = KDiff3::createAction< KAction >( i18n("Go to Current Delta"), QIcon(QPixmap(currentpos)), i18n("Current\nDelta"), KShortcut( Qt::CTRL+Qt::Key_Space ), this, SLOT(slotGoCurrent()), ac, "go_current"); joachim99@80: joachim99@80: goTop = KDiff3::createAction< KAction >(i18n("Go to First Delta"), QIcon(QPixmap(upend)), i18n("First\nDelta"), this, SLOT(slotGoTop()), ac, "go_top"); joachim99@80: joachim99@80: goBottom = KDiff3::createAction< KAction >(i18n("Go to Last Delta"), QIcon(QPixmap(downend)), i18n("Last\nDelta"), this, SLOT(slotGoBottom()), ac, "go_bottom"); joachim99@80: joachim99@68: QString omitsWhitespace = ".\n" + i18n("(Skips white space differences when \"Show White Space\" is disabled.)"); joachim99@69: QString includeWhitespace = ".\n" + i18n("(Does not skip white space differences even when \"Show White Space\" is disabled.)"); joachim99@80: goPrevDelta = KDiff3::createAction< KAction >(i18n("Go to Previous Delta"), QIcon(QPixmap(up1arrow)), i18n("Prev\nDelta"), KShortcut( Qt::CTRL+Qt::Key_Up), this, SLOT(slotGoPrevDelta()), ac, "go_prev_delta"); joachim99@68: goPrevDelta->setToolTip( goPrevDelta->text() + omitsWhitespace ); joachim99@80: goNextDelta = KDiff3::createAction< KAction >(i18n("Go to Next Delta"), QIcon(QPixmap(down1arrow)), i18n("Next\nDelta"), KShortcut( Qt::CTRL+Qt::Key_Down ), this, SLOT(slotGoNextDelta()), ac, "go_next_delta"); joachim99@68: goNextDelta->setToolTip( goNextDelta->text() + omitsWhitespace ); joachim99@80: goPrevConflict = KDiff3::createAction< KAction >(i18n("Go to Previous Conflict"), QIcon(QPixmap(up2arrow)), i18n("Prev\nConflict"), KShortcut( Qt::CTRL+Qt::Key_PageUp ), this, SLOT(slotGoPrevConflict()), ac, "go_prev_conflict"); joachim99@68: goPrevConflict->setToolTip( goPrevConflict->text() + omitsWhitespace ); joachim99@80: goNextConflict = KDiff3::createAction< KAction >(i18n("Go to Next Conflict"), QIcon(QPixmap(down2arrow)), i18n("Next\nConflict"), KShortcut( Qt::CTRL+Qt::Key_PageDown ), this, SLOT(slotGoNextConflict()), ac, "go_next_conflict"); joachim99@68: goNextConflict->setToolTip( goNextConflict->text() + omitsWhitespace ); joachim99@80: goPrevUnsolvedConflict = KDiff3::createAction< KAction >(i18n("Go to Previous Unsolved Conflict"), QIcon(QPixmap(prevunsolved)), i18n("Prev\nUnsolved"), this, SLOT(slotGoPrevUnsolvedConflict()), ac, "go_prev_unsolved_conflict"); joachim99@68: goPrevUnsolvedConflict->setToolTip( goPrevUnsolvedConflict->text() + includeWhitespace ); joachim99@80: goNextUnsolvedConflict = KDiff3::createAction< KAction >(i18n("Go to Next Unsolved Conflict"), QIcon(QPixmap(nextunsolved)), i18n("Next\nUnsolved"), this, SLOT(slotGoNextUnsolvedConflict()), ac, "go_next_unsolved_conflict"); joachim99@68: goNextUnsolvedConflict->setToolTip( goNextUnsolvedConflict->text() + includeWhitespace ); joachim99@80: chooseA = KDiff3::createAction< KToggleAction >(i18n("Select Line(s) From A"), QIcon(QPixmap(iconA)), i18n("Choose\nA"), KShortcut( Qt::CTRL+Qt::Key_1 ), this, SLOT(slotChooseA()), ac, "merge_choose_a"); joachim99@80: chooseB = KDiff3::createAction< KToggleAction >(i18n("Select Line(s) From B"), QIcon(QPixmap(iconB)), i18n("Choose\nB"), KShortcut( Qt::CTRL+Qt::Key_2 ), this, SLOT(slotChooseB()), ac, "merge_choose_b"); joachim99@80: chooseC = KDiff3::createAction< KToggleAction >(i18n("Select Line(s) From C"), QIcon(QPixmap(iconC)), i18n("Choose\nC"), KShortcut( Qt::CTRL+Qt::Key_3 ), this, SLOT(slotChooseC()), ac, "merge_choose_c"); joachim99@80: autoAdvance = KDiff3::createAction< KToggleAction >(i18n("Automatically Go to Next Unsolved Conflict After Source Selection"), QIcon(QPixmap(autoadvance)), i18n("Auto\nNext"), this, SLOT(slotAutoAdvanceToggled()), ac, "merge_autoadvance"); joachim99@51: joachim99@80: showWhiteSpaceCharacters = KDiff3::createAction< KToggleAction >(i18n("Show Space && Tabulator Characters for Differences"), QIcon(QPixmap(showwhitespacechars)), i18n("White\nCharacters"), this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace_characters"); joachim99@80: showWhiteSpace = KDiff3::createAction< KToggleAction >(i18n("Show White Space"), QIcon(QPixmap(showwhitespace)), i18n("White\nDeltas"), this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace"); joachim99@51: joachim99@80: showLineNumbers = KDiff3::createAction< KToggleAction >(i18n("Show Line Numbers"), QIcon(QPixmap(showlinenumbers)), i18n("Line\nNumbers"), this, SLOT(slotShowLineNumbersToggled()), ac, "diff_showlinenumbers"); joachim99@80: chooseAEverywhere = KDiff3::createAction< KAction >(i18n("Choose A Everywhere"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_1 ), this, SLOT(slotChooseAEverywhere()), ac, "merge_choose_a_everywhere"); joachim99@80: chooseBEverywhere = KDiff3::createAction< KAction >(i18n("Choose B Everywhere"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_2 ), this, SLOT(slotChooseBEverywhere()), ac, "merge_choose_b_everywhere"); joachim99@80: chooseCEverywhere = KDiff3::createAction< KAction >(i18n("Choose C Everywhere"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_3 ), this, SLOT(slotChooseCEverywhere()), ac, "merge_choose_c_everywhere"); joachim99@80: chooseAForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose A for All Unsolved Conflicts"), this, SLOT(slotChooseAForUnsolvedConflicts()), ac, "merge_choose_a_for_unsolved_conflicts"); joachim99@80: chooseBForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose B for All Unsolved Conflicts"), this, SLOT(slotChooseBForUnsolvedConflicts()), ac, "merge_choose_b_for_unsolved_conflicts"); joachim99@80: chooseCForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose C for All Unsolved Conflicts"), this, SLOT(slotChooseCForUnsolvedConflicts()), ac, "merge_choose_c_for_unsolved_conflicts"); joachim99@80: chooseAForUnsolvedWhiteSpaceConflicts = KDiff3::createAction< KAction >(i18n("Choose A for All Unsolved Whitespace Conflicts"), this, SLOT(slotChooseAForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_a_for_unsolved_whitespace_conflicts"); joachim99@80: chooseBForUnsolvedWhiteSpaceConflicts = KDiff3::createAction< KAction >(i18n("Choose B for All Unsolved Whitespace Conflicts"), this, SLOT(slotChooseBForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_b_for_unsolved_whitespace_conflicts"); joachim99@80: chooseCForUnsolvedWhiteSpaceConflicts = KDiff3::createAction< KAction >(i18n("Choose C for All Unsolved Whitespace Conflicts"), this, SLOT(slotChooseCForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_c_for_unsolved_whitespace_conflicts"); joachim99@80: autoSolve = KDiff3::createAction< KAction >(i18n("Automatically Solve Simple Conflicts"), this, SLOT(slotAutoSolve()), ac, "merge_autosolve"); joachim99@80: unsolve = KDiff3::createAction< KAction >(i18n("Set Deltas to Conflicts"), this, SLOT(slotUnsolve()), ac, "merge_autounsolve"); joachim99@80: mergeRegExp = KDiff3::createAction< KAction >(i18n("Run Regular Expression Auto Merge"), this, SLOT(slotRegExpAutoMerge()),ac, "merge_regexp_automerge" ); joachim99@80: mergeHistory = KDiff3::createAction< KAction >(i18n("Automatically Solve History Conflicts"), this, SLOT(slotMergeHistory()), ac, "merge_versioncontrol_history" ); joachim99@80: splitDiff = KDiff3::createAction< KAction >(i18n("Split Diff At Selection"), this, SLOT(slotSplitDiff()), ac, "merge_splitdiff"); joachim99@80: joinDiffs = KDiff3::createAction< KAction >(i18n("Join Selected Diffs"), this, SLOT(slotJoinDiffs()), ac, "merge_joindiffs"); joachim99@69: joachim99@80: showWindowA = KDiff3::createAction< KToggleAction >(i18n("Show Window A"), this, SLOT(slotShowWindowAToggled()), ac, "win_show_a"); joachim99@80: showWindowB = KDiff3::createAction< KToggleAction >(i18n("Show Window B"), this, SLOT(slotShowWindowBToggled()), ac, "win_show_b"); joachim99@80: showWindowC = KDiff3::createAction< KToggleAction >(i18n("Show Window C"), this, SLOT(slotShowWindowCToggled()), ac, "win_show_c"); joachim99@80: winFocusNext = KDiff3::createAction< KAction >(i18n("Focus Next Window"), KShortcut( Qt::ALT+Qt::Key_Right ), this, SLOT(slotWinFocusNext()), ac, "win_focus_next"); joachim99@68: joachim99@80: overviewModeNormal = KDiff3::createAction< KToggleAction >(i18n("Normal Overview"), this, SLOT(slotOverviewNormal()), ac, "diff_overview_normal"); joachim99@80: overviewModeAB = KDiff3::createAction< KToggleAction >(i18n("A vs. B Overview"), this, SLOT(slotOverviewAB()), ac, "diff_overview_ab"); joachim99@80: overviewModeAC = KDiff3::createAction< KToggleAction >(i18n("A vs. C Overview"), this, SLOT(slotOverviewAC()), ac, "diff_overview_ac"); joachim99@80: overviewModeBC = KDiff3::createAction< KToggleAction >(i18n("B vs. C Overview"), this, SLOT(slotOverviewBC()), ac, "diff_overview_bc"); joachim99@80: wordWrap = KDiff3::createAction< KToggleAction >(i18n("Word Wrap Diff Windows"), this, SLOT(slotWordWrapToggled()), ac, "diff_wordwrap"); joachim99@80: addManualDiffHelp = KDiff3::createAction< KAction >(i18n("Add Manual Diff Alignment"), KShortcut( Qt::CTRL+Qt::Key_Y ), this, SLOT(slotAddManualDiffHelp()), ac, "diff_add_manual_diff_help"); joachim99@80: clearManualDiffHelpList = KDiff3::createAction< KAction >(i18n("Clear All Manual Diff Alignments"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_Y ), this, SLOT(slotClearManualDiffHelpList()), ac, "diff_clear_manual_diff_help_list"); joachim99@68: joachim99@95: #if defined(_WIN32) || defined(Q_OS_OS2) joachim99@80: KDiff3::createAction< KAction >(i18n("Focus Next Window"), KShortcut(Qt::CTRL+Qt::Key_Tab), this, SLOT(slotWinFocusNext()), ac, "win_focus_next"); joachim99@26: #endif joachim99@80: winFocusPrev = KDiff3::createAction< KAction >(i18n("Focus Prev Window"), KShortcut( Qt::ALT+Qt::Key_Left ), this, SLOT(slotWinFocusPrev()), ac, "win_focus_prev"); joachim99@80: winToggleSplitOrientation = KDiff3::createAction< KAction >(i18n("Toggle Split Orientation"), this, SLOT(slotWinToggleSplitterOrientation()), ac, "win_toggle_split_orientation"); joachim99@8: joachim99@80: dirShowBoth = KDiff3::createAction< KToggleAction >(i18n("Dir && Text Split Screen View"), this, SLOT(slotDirShowBoth()), ac, "win_dir_show_both"); joachim99@8: dirShowBoth->setChecked( true ); joachim99@80: dirViewToggle = KDiff3::createAction< KAction >(i18n("Toggle Between Dir && Text View"), this, SLOT(slotDirViewToggle()), ac, "win_dir_view_toggle"); joachim99@8: joachim99@75: m_pMergeEditorPopupMenu = new QMenu( this ); joachim99@80: /* chooseA->plug( m_pMergeEditorPopupMenu ); joachim99@8: chooseB->plug( m_pMergeEditorPopupMenu ); joachim99@80: chooseC->plug( m_pMergeEditorPopupMenu );*/ joachim99@80: m_pMergeEditorPopupMenu->addAction( chooseA ); joachim99@80: m_pMergeEditorPopupMenu->addAction( chooseB ); joachim99@80: m_pMergeEditorPopupMenu->addAction( chooseC ); joachim99@8: } joachim99@8: joachim99@51: joachim99@8: void KDiff3App::showPopupMenu( const QPoint& point ) joachim99@8: { joachim99@8: m_pMergeEditorPopupMenu->popup( point ); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::initStatusBar() joachim99@8: { joachim99@8: /////////////////////////////////////////////////////////////////// joachim99@8: // STATUSBAR joachim99@8: if (statusBar() !=0 ) joachim99@75: statusBar()->showMessage( i18n("Ready.") ); joachim99@8: } joachim99@8: joachim99@80: void KDiff3App::saveOptions( KSharedConfigPtr config ) joachim99@8: { joachim99@77: if ( !m_bAutoMode ) joachim99@8: { joachim99@77: if (!isPart()) joachim99@75: { joachim99@77: m_pOptionDialog->m_bMaximised = m_pKDiff3Shell->isMaximized(); joachim99@77: if( ! m_pKDiff3Shell->isMaximized() && m_pKDiff3Shell->isVisible() ) joachim99@77: { joachim99@77: m_pOptionDialog->m_geometry = m_pKDiff3Shell->size(); joachim99@77: m_pOptionDialog->m_position = m_pKDiff3Shell->pos(); joachim99@77: } joachim99@80: /* TODO change this option as now KToolbar uses QToolbar positioning style joachim99@80: if ( toolBar(MAIN_TOOLBAR_NAME)!=0 ) joachim99@80: m_pOptionDialog->m_toolBarPos = (int) toolBar(MAIN_TOOLBAR_NAME)->allowedAreas();*/ joachim99@75: } joachim99@77: joachim99@77: m_pOptionDialog->saveOptions( config ); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: joachim99@8: joachim99@8: joachim99@8: bool KDiff3App::queryClose() joachim99@8: { joachim99@80: saveOptions( isPart() ? m_pKDiff3Part->componentData().config() : KGlobal::config() ); joachim99@8: 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 && Quit") ), joachim99@80: KGuiItem( i18n("Quit 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: 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: KStandardGuiItem::quit(), joachim99@80: KStandardGuiItem::cont() /* i18n("Continue Merging") */ ); joachim99@8: if ( result!=KMessageBox::Yes ) joachim99@8: return false; joachim99@8: } joachim99@8: joachim99@8: return true; joachim99@8: } joachim99@8: joachim99@8: joachim99@8: ///////////////////////////////////////////////////////////////////// joachim99@8: // SLOT IMPLEMENTATION joachim99@8: ///////////////////////////////////////////////////////////////////// joachim99@8: joachim99@8: joachim99@8: void KDiff3App::slotFileSave() joachim99@8: { joachim99@8: if ( m_bDefaultFilename ) joachim99@8: { joachim99@8: slotFileSaveAs(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: slotStatusMsg(i18n("Saving file...")); joachim99@8: joachim99@80: bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() ); joachim99@8: if ( bSuccess ) joachim99@8: { joachim99@69: m_bFileSaved = true; joachim99@8: m_bOutputModified = false; joachim99@8: if ( m_bDirCompare ) joachim99@75: m_pDirectoryMergeWindow->mergeResultSaved( m_outputFilename ); joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotFileSaveAs() joachim99@8: { joachim99@8: slotStatusMsg(i18n("Saving file with a new filename...")); joachim99@8: joachim99@80: QString s = KFileDialog::getSaveUrl( QDir::currentPath(), 0, this, i18n("Save As...") ).url(); joachim99@8: if(!s.isEmpty()) joachim99@8: { joachim99@8: m_outputFilename = s; joachim99@75: m_pMergeResultWindowTitle->setFileName( m_outputFilename ); joachim99@80: bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() ); joachim99@8: if ( bSuccess ) joachim99@8: { joachim99@8: m_bOutputModified = false; joachim99@8: if ( m_bDirCompare ) joachim99@75: m_pDirectoryMergeWindow->mergeResultSaved( m_outputFilename ); joachim99@8: } joachim99@8: //setCaption(url.fileName(),doc->isModified()); joachim99@8: joachim99@8: m_bDefaultFilename = false; joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@8: joachim99@69: void printDiffTextWindow( MyPainter& painter, const QRect& view, const QString& headerText, DiffTextWindow* pDiffTextWindow, int line, int linesPerPage, QColor fgColor ) joachim99@69: { joachim99@69: QRect clipRect = view; joachim99@69: clipRect.setTop(0); joachim99@69: painter.setClipRect( clipRect ); joachim99@69: painter.translate( view.left() , 0 ); joachim99@69: QFontMetrics fm = painter.fontMetrics(); joachim99@69: //if ( fm.width(headerText) > view.width() ) joachim99@69: { joachim99@69: // A simple wrapline algorithm joachim99@69: int l=0; joachim99@70: for (int p=0; pview.width()) joachim99@69: { joachim99@69: --i; joachim99@69: break; joachim99@69: } joachim99@69: //QString s2 = s.left(i); joachim99@69: painter.drawText( 0, l*fm.height() + fm.ascent(), s.left(i) ); joachim99@69: p+=i; joachim99@69: ++l; joachim99@69: } joachim99@69: painter.setPen( fgColor ); joachim99@69: painter.drawLine( 0, view.top()-2, view.width(), view.top()-2 ); joachim99@69: } joachim99@69: joachim99@69: painter.translate( 0, view.top() ); joachim99@69: pDiffTextWindow->print( painter, view, line, linesPerPage ); joachim99@75: painter.resetMatrix(); joachim99@69: } joachim99@69: joachim99@69: void KDiff3App::slotFilePrint() joachim99@69: { joachim99@69: if ( !m_pDiffTextWindow1 ) joachim99@69: return; joachim99@95: #ifdef QT_NO_PRINTER joachim99@95: slotStatusMsg( i18n( "Printing not implemented." ) ); joachim99@95: #endif joachim99@95: #ifndef QT_NO_PRINTER joachim99@80: QPrinter printer; joachim99@75: QPrintDialog printDialog(&printer, this); joachim99@69: joachim99@69: int firstSelectionD3LIdx = -1; joachim99@69: int lastSelectionD3LIdx = -1; joachim99@69: if ( m_pDiffTextWindow1 ) { m_pDiffTextWindow1->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); } joachim99@69: if ( firstSelectionD3LIdx<0 && m_pDiffTextWindow2 ) { m_pDiffTextWindow2->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); } joachim99@69: if ( firstSelectionD3LIdx<0 && m_pDiffTextWindow3 ) { m_pDiffTextWindow3->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); } joachim99@69: #ifdef KREPLACEMENTS_H // Currently PrintSelection is not supported in KDEs print dialog. joachim99@69: if ( firstSelectionD3LIdx>=0 ) joachim99@69: { joachim99@75: printDialog.addEnabledOption(QPrintDialog::PrintSelection); joachim99@80: //printer.setOptionEnabled(QPrinter::PrintSelection,true); joachim99@80: printDialog.setPrintRange(QAbstractPrintDialog::Selection); joachim99@69: } joachim99@69: #endif joachim99@69: joachim99@80: if ( firstSelectionD3LIdx == -1 ) joachim99@80: printDialog.setPrintRange(QAbstractPrintDialog::AllPages); joachim99@80: //printDialog.setMinMax(0,0); joachim99@80: printDialog.setFromTo(0,0); joachim99@69: joachim99@69: int currentFirstLine = m_pDiffTextWindow1->getFirstLine(); joachim99@69: int currentFirstD3LIdx = m_pDiffTextWindow1->convertLineToDiff3LineIdx( currentFirstLine ); joachim99@69: joachim99@69: // do some printer initialization joachim99@69: printer.setFullPage( false ); joachim99@69: joachim99@69: // initialize the printer using the print dialog joachim99@75: if (printDialog.exec()== QDialog::Accepted) joachim99@69: { joachim99@69: slotStatusMsg( i18n( "Printing..." ) ); joachim99@69: // create a painter to paint on the printer object joachim99@77: MyPainter painter( &printer, m_pOptionDialog->m_bRightToLeftLanguage, width(), fontMetrics().width('W') ); joachim99@69: joachim99@75: QPaintDevice* pPaintDevice = painter.device(); joachim99@75: int dpiy = pPaintDevice->logicalDpiY(); joachim99@69: int columnDistance = (int) ( (0.5/2.54)*dpiy ); // 0.5 cm between the columns joachim99@69: joachim99@69: int columns = m_bTripleDiff ? 3 : 2; joachim99@75: int columnWidth = ( pPaintDevice->width() - (columns-1)*columnDistance ) / columns; joachim99@69: joachim99@69: QFont f = m_pOptionDialog->m_font; joachim99@75: f.setPointSizeF(f.pointSizeF()-1); // Print with slightly smaller font. joachim99@69: painter.setFont( f ); joachim99@69: QFontMetrics fm = painter.fontMetrics(); joachim99@69: joachim99@69: QString topLineText = i18n("Top line"); joachim99@69: joachim99@69: //int headerWidth = fm.width( m_sd1.getAliasName() + ", "+topLineText+": 01234567" ); joachim99@69: int headerLines = fm.width( m_sd1.getAliasName() + ", "+topLineText+": 01234567" )/columnWidth+1; joachim99@69: joachim99@69: int headerMargin = headerLines * fm.height() + 3; // Text + one horizontal line joachim99@69: int footerMargin = fm.height() + 3; joachim99@69: joachim99@75: QRect view ( 0, headerMargin, pPaintDevice->width(), pPaintDevice->height() - (headerMargin + footerMargin) ); joachim99@75: QRect view1( 0*(columnWidth + columnDistance), view.top(), columnWidth, view.height() ); joachim99@75: QRect view2( 1*(columnWidth + columnDistance), view.top(), columnWidth, view.height() ); joachim99@75: QRect view3( 2*(columnWidth + columnDistance), view.top(), columnWidth, view.height() ); joachim99@69: joachim99@69: int linesPerPage = view.height() / fm.height(); joachim99@69: int charactersPerLine = columnWidth / fm.width("W"); joachim99@69: if ( m_pOptionDialog->m_bWordWrap ) joachim99@69: { joachim99@69: // For printing the lines are wrapped differently (this invalidates the first line) joachim99@69: recalcWordWrap( charactersPerLine ); joachim99@69: } joachim99@69: joachim99@69: int totalNofLines = max2(m_pDiffTextWindow1->getNofLines(), m_pDiffTextWindow2->getNofLines()); joachim99@69: if ( m_bTripleDiff && m_pDiffTextWindow3) joachim99@69: totalNofLines = max2(totalNofLines, m_pDiffTextWindow3->getNofLines()); joachim99@69: joachim99@80: QList pageList;// = printer.pageList(); joachim99@69: joachim99@69: bool bPrintCurrentPage=false; joachim99@69: bool bFirstPrintedPage = false; joachim99@69: joachim99@69: bool bPrintSelection = false; joachim99@69: int totalNofPages = (totalNofLines+linesPerPage-1) / linesPerPage; joachim99@69: int line=-1; joachim99@69: int selectionEndLine = -1; joachim99@69: joachim99@69: #ifdef KREPLACEMENTS_H joachim99@80: if ( printer.printRange()==QPrinter::AllPages ) joachim99@69: { joachim99@69: pageList.clear(); joachim99@69: for(int i=0; i=0 ) joachim99@69: { joachim99@69: line = m_pDiffTextWindow1->convertDiff3LineIdxToLine( firstSelectionD3LIdx ); joachim99@69: selectionEndLine = m_pDiffTextWindow1->convertDiff3LineIdxToLine( lastSelectionD3LIdx+1 ); joachim99@69: totalNofPages = (selectionEndLine-line+linesPerPage-1) / linesPerPage; joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: int page = 1; joachim99@69: joachim99@75: QList::iterator pageListIt = pageList.begin(); joachim99@69: for(;;) joachim99@69: { joachim99@69: if (!bPrintSelection) joachim99@69: { joachim99@69: if (pageListIt==pageList.end()) joachim99@69: break; joachim99@69: page = *pageListIt; joachim99@69: line = (page - 1) * linesPerPage; joachim99@69: if (page==10000) // This means "Print the current page" joachim99@69: { joachim99@69: bPrintCurrentPage=true; joachim99@69: // Detect the first visible line in the window. joachim99@69: line = m_pDiffTextWindow1->convertDiff3LineIdxToLine( currentFirstD3LIdx ); joachim99@69: } joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: if ( line>=selectionEndLine ) joachim99@69: { joachim99@69: break; joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: if ( selectionEndLine-line < linesPerPage ) joachim99@69: linesPerPage=selectionEndLine-line; joachim99@69: } joachim99@69: } joachim99@69: if (line>=0 && linem_colorA ); joachim99@69: QString headerText1 = m_sd1.getAliasName() + ", "+topLineText+": " + QString::number(m_pDiffTextWindow1->calcTopLineInFile(line)+1); joachim99@69: printDiffTextWindow( painter, view1, headerText1, m_pDiffTextWindow1, line, linesPerPage, m_pOptionDialog->m_fgColor ); joachim99@69: joachim99@69: painter.setPen( m_pOptionDialog->m_colorB ); joachim99@69: QString headerText2 = m_sd2.getAliasName() + ", "+topLineText+": " + QString::number(m_pDiffTextWindow2->calcTopLineInFile(line)+1); joachim99@69: printDiffTextWindow( painter, view2, headerText2, m_pDiffTextWindow2, line, linesPerPage, m_pOptionDialog->m_fgColor ); joachim99@69: joachim99@69: if ( m_bTripleDiff && m_pDiffTextWindow3 ) joachim99@69: { joachim99@69: painter.setPen( m_pOptionDialog->m_colorC ); joachim99@69: QString headerText3 = m_sd3.getAliasName() + ", "+topLineText+": " + QString::number(m_pDiffTextWindow3->calcTopLineInFile(line)+1); joachim99@69: printDiffTextWindow( painter, view3, headerText3, m_pDiffTextWindow3, line, linesPerPage, m_pOptionDialog->m_fgColor ); joachim99@69: } joachim99@69: painter.setClipping(false); joachim99@69: joachim99@69: painter.setPen( m_pOptionDialog->m_fgColor ); joachim99@69: painter.drawLine( 0, view.bottom()+3, view.width(), view.bottom()+3 ); joachim99@69: QString s = bPrintCurrentPage ? QString("") joachim99@69: : QString::number( page ) + "/" + QString::number(totalNofPages); joachim99@69: if ( bPrintSelection ) s+=" (" + i18n("Selection") + ")"; joachim99@69: painter.drawText( (view.right() - painter.fontMetrics().width( s ))/2, joachim99@69: view.bottom() + painter.fontMetrics().ascent() + 5, s ); joachim99@69: joachim99@69: bFirstPrintedPage = true; joachim99@69: } joachim99@69: joachim99@69: if ( bPrintSelection ) joachim99@69: { joachim99@69: line+=linesPerPage; joachim99@69: ++page; joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: ++pageListIt; joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: painter.end(); joachim99@69: joachim99@69: if ( m_pOptionDialog->m_bWordWrap ) joachim99@69: { joachim99@69: recalcWordWrap(); joachim99@69: m_pDiffVScrollBar->setValue( m_pDiffTextWindow1->convertDiff3LineIdxToLine( currentFirstD3LIdx ) ); joachim99@69: } joachim99@69: joachim99@69: slotStatusMsg( i18n( "Printing completed." ) ); joachim99@69: } joachim99@69: else joachim99@69: { joachim99@69: slotStatusMsg( i18n( "Printing aborted." ) ); joachim99@69: } joachim99@95: #endif joachim99@69: } joachim99@69: joachim99@8: void KDiff3App::slotFileQuit() joachim99@8: { joachim99@8: slotStatusMsg(i18n("Exiting...")); joachim99@8: joachim99@8: if( !queryClose() ) joachim99@8: return; // Don't quit joachim99@8: joachim99@80: KApplication::exit( isFileSaved() || isDirComparison() ? 0 : 1 ); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: joachim99@8: void KDiff3App::slotViewToolBar() joachim99@8: { joachim99@80: assert( viewToolBar != 0 ); joachim99@8: slotStatusMsg(i18n("Toggling toolbar...")); joachim99@69: m_pOptionDialog->m_bShowToolBar = viewToolBar->isChecked(); joachim99@8: /////////////////////////////////////////////////////////////////// joachim99@8: // turn Toolbar on or off joachim99@80: if ( toolBar(MAIN_TOOLBAR_NAME) !=0 ) joachim99@8: { joachim99@69: if(!m_pOptionDialog->m_bShowToolBar) joachim99@8: { joachim99@80: toolBar(MAIN_TOOLBAR_NAME)->hide(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@80: toolBar(MAIN_TOOLBAR_NAME)->show(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@8: void KDiff3App::slotViewStatusBar() joachim99@8: { joachim99@8: slotStatusMsg(i18n("Toggle the statusbar...")); joachim99@69: m_pOptionDialog->m_bShowStatusBar = viewStatusBar->isChecked(); joachim99@8: /////////////////////////////////////////////////////////////////// joachim99@8: //turn Statusbar on or off joachim99@8: if (statusBar() !=0 ) joachim99@8: { joachim99@8: if(!viewStatusBar->isChecked()) joachim99@8: { joachim99@8: statusBar()->hide(); joachim99@8: } joachim99@8: else joachim99@8: { joachim99@8: statusBar()->show(); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: slotStatusMsg(i18n("Ready.")); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: void KDiff3App::slotStatusMsg(const QString &text) joachim99@8: { joachim99@8: /////////////////////////////////////////////////////////////////// joachim99@8: // change status message permanently joachim99@8: if (statusBar() !=0 ) joachim99@8: { joachim99@75: statusBar()->clearMessage(); joachim99@75: statusBar()->showMessage( text ); joachim99@8: } joachim99@8: } joachim99@8: joachim99@8: joachim99@8: joachim99@8: joachim99@70: //#include "kdiff3.moc"