annotate kdiff3/src-QT4/kdiff3.cpp @ 113:7bca1f1340f6 tip

Build fixes for Xcode 10 / Qt 5.12
author Chris Cannam
date Mon, 17 Dec 2018 11:13:01 +0000
parents 6f42f5bd218e
children 2df4daf33fbd
rev   line source
joachim99@8 1 /***************************************************************************
joachim99@8 2 kdiff3.cpp - description
joachim99@8 3 -------------------
joachim99@8 4 begin : Don Jul 11 12:31:29 CEST 2002
joachim99@77 5 copyright : (C) 2002-2007 by Joachim Eibl
joachim99@69 6 email : joachim.eibl at gmx.de
joachim99@8 7 ***************************************************************************/
joachim99@8 8
joachim99@8 9 /***************************************************************************
joachim99@8 10 * *
joachim99@8 11 * This program is free software; you can redistribute it and/or modify *
joachim99@8 12 * it under the terms of the GNU General Public License as published by *
joachim99@8 13 * the Free Software Foundation; either version 2 of the License, or *
joachim99@8 14 * (at your option) any later version. *
joachim99@8 15 * *
joachim99@8 16 ***************************************************************************/
joachim99@8 17
joachim99@69 18 #include "difftextwindow.h"
joachim99@69 19 #include "mergeresultwindow.h"
joachim99@8 20
joachim99@8 21 #include <iostream>
joachim99@80 22 #include <assert.h>
joachim99@8 23
joachim99@8 24 // include files for QT
joachim99@8 25 #include <qdir.h>
joachim99@8 26 #include <qprinter.h>
joachim99@8 27 #include <qpainter.h>
joachim99@8 28 #include <qsplitter.h>
joachim99@8 29 #include <qlineedit.h>
joachim99@8 30 #include <qcheckbox.h>
joachim99@8 31 #include <qpushbutton.h>
joachim99@75 32 #include <QMenu>
joachim99@75 33 #include <QLabel>
joachim99@75 34 #include <QTextEdit>
joachim99@75 35 #include <QLayout>
joachim99@75 36 #include <QPaintDevice>
joachim99@75 37 #include <QStatusBar>
joachim99@70 38 #include <QDesktopWidget>
joachim99@80 39 #include <QPrinter>
joachim99@75 40 #include <QPrintDialog>
joachim99@8 41
joachim99@8 42 // include files for KDE
joachim99@8 43 #include <kiconloader.h>
joachim99@8 44 #include <kmessagebox.h>
joachim99@8 45 #include <kfiledialog.h>
joachim99@8 46 #include <kmenubar.h>
joachim99@8 47 #include <kstatusbar.h>
joachim99@8 48 #include <klocale.h>
joachim99@8 49 #include <kconfig.h>
joachim99@80 50 #include <kstandardaction.h>
joachim99@8 51 #include <kcmdlineargs.h>
joachim99@8 52 //#include <kkeydialog.h>
joachim99@80 53 #include <kglobal.h>
joachim99@80 54 #include <ktoggleaction.h>
joachim99@80 55 #include <ktoolbar.h>
joachim99@80 56 #include <kiconloader.h>
joachim99@80 57 #include <kactioncollection.h>
joachim99@8 58
joachim99@8 59 // application specific includes
joachim99@8 60 #include "kdiff3.h"
joachim99@8 61 #include "optiondialog.h"
joachim99@8 62 #include "fileaccess.h"
joachim99@8 63 #include "kdiff3_part.h"
joachim99@8 64 #include "directorymergewindow.h"
joachim99@69 65 #include "smalldialogs.h"
joachim99@80 66 #include "guiutils.h" // namespace KDiff3
joachim99@8 67
joachim99@8 68 #define ID_STATUS_MSG 1
joachim99@80 69 #define MAIN_TOOLBAR_NAME "mainToolBar"
joachim99@8 70
joachim99@8 71 KActionCollection* KDiff3App::actionCollection()
joachim99@8 72 {
joachim99@8 73 if ( m_pKDiff3Shell==0 )
joachim99@8 74 return m_pKDiff3Part->actionCollection();
joachim99@8 75 else
joachim99@8 76 return m_pKDiff3Shell->actionCollection();
joachim99@8 77 }
joachim99@8 78
joachim99@8 79 KStatusBar* KDiff3App::statusBar()
joachim99@8 80 {
joachim99@8 81 if ( m_pKDiff3Shell==0 )
joachim99@8 82 return 0;
joachim99@8 83 else
joachim99@8 84 return m_pKDiff3Shell->statusBar();
joachim99@8 85 }
joachim99@8 86
joachim99@8 87 KToolBar* KDiff3App::toolBar(const char* toolBarId )
joachim99@8 88 {
joachim99@8 89 if ( m_pKDiff3Shell==0 )
joachim99@8 90 return 0;
joachim99@8 91 else
joachim99@8 92 return m_pKDiff3Shell->toolBar( toolBarId );
joachim99@80 93 //return m_pKDiff3Shell->toolBar();
joachim99@8 94 }
joachim99@8 95
joachim99@8 96 bool KDiff3App::isPart()
joachim99@8 97 {
joachim99@8 98 return m_pKDiff3Shell==0;
joachim99@8 99 }
joachim99@8 100
joachim99@69 101 bool KDiff3App::isFileSaved()
joachim99@69 102 {
joachim99@69 103 return m_bFileSaved;
joachim99@69 104 }
joachim99@8 105
joachim99@80 106 bool KDiff3App::isDirComparison()
joachim99@80 107 {
joachim99@80 108 return m_bDirCompare;
joachim99@80 109 }
joachim99@80 110
joachim99@92 111 KDiff3App::KDiff3App(QWidget* pParent, const char* /*name*/, KDiff3Part* pKDiff3Part )
joachim99@75 112 : QSplitter(pParent) //previously KMainWindow
joachim99@8 113 {
joachim99@92 114 setObjectName( "KDiff3App" );
joachim99@8 115 m_pKDiff3Part = pKDiff3Part;
joachim99@8 116 m_pKDiff3Shell = dynamic_cast<KParts::MainWindow*>(pParent);
joachim99@8 117
joachim99@75 118 setWindowTitle( "KDiff3" );
joachim99@75 119 setOpaqueResize(false); // faster resizing
joachim99@80 120 setUpdatesEnabled(false);
joachim99@8 121
joachim99@8 122 m_pMainSplitter = 0;
joachim99@80 123 m_pDirectoryMergeSplitter = 0;
joachim99@8 124 m_pDirectoryMergeWindow = 0;
joachim99@8 125 m_pCornerWidget = 0;
joachim99@8 126 m_pMainWidget = 0;
joachim99@8 127 m_pDiffTextWindow1 = 0;
joachim99@8 128 m_pDiffTextWindow2 = 0;
joachim99@8 129 m_pDiffTextWindow3 = 0;
joachim99@69 130 m_pDiffTextWindowFrame1 = 0;
joachim99@69 131 m_pDiffTextWindowFrame2 = 0;
joachim99@69 132 m_pDiffTextWindowFrame3 = 0;
joachim99@8 133 m_pDiffWindowSplitter = 0;
joachim99@8 134 m_pOverview = 0;
joachim99@8 135 m_bTripleDiff = false;
joachim99@8 136 m_pMergeResultWindow = 0;
joachim99@8 137 m_pMergeWindowFrame = 0;
joachim99@8 138 m_bOutputModified = false;
joachim99@69 139 m_bFileSaved = false;
joachim99@8 140 m_bTimerBlock = false;
joachim99@68 141 m_pHScrollBar = 0;
joachim99@91 142 m_pDiffVScrollBar = 0;
joachim99@91 143 m_pMergeVScrollBar = 0;
joachim99@80 144 viewToolBar = 0;
joachim99@8 145
joachim99@51 146 // Needed before any file operations via FileAccess happen.
joachim99@69 147 if (!g_pProgressDialog)
joachim99@77 148 {
joachim99@69 149 g_pProgressDialog = new ProgressDialog(0);
joachim99@77 150 g_pProgressDialog->setStayHidden( true );
joachim99@77 151 }
joachim99@51 152
joachim99@58 153 // All default values must be set before calling readOptions().
joachim99@58 154 m_pOptionDialog = new OptionDialog( m_pKDiff3Shell!=0, this );
joachim99@80 155 connect( m_pOptionDialog, SIGNAL(applyDone()), this, SLOT(slotRefresh()) );
joachim99@68 156
joachim99@80 157 m_pOptionDialog->readOptions( isPart() ? m_pKDiff3Part->componentData().config() : KGlobal::config() );
joachim99@58 158
joachim99@69 159 // Option handling: Only when pParent==0 (no parent)
joachim99@69 160 KCmdLineArgs *args = isPart() ? 0 : KCmdLineArgs::parsedArgs();
joachim99@69 161
joachim99@69 162 if (args)
joachim99@69 163 {
joachim99@69 164 QString s;
joachim99@69 165 QString title;
joachim99@69 166 if ( args->isSet("confighelp") )
joachim99@69 167 {
joachim99@69 168 s = m_pOptionDialog->calcOptionHelp();
joachim99@69 169 title = i18n("Current Configuration:");
joachim99@69 170 }
joachim99@69 171 else
joachim99@69 172 {
joachim99@69 173 s = m_pOptionDialog->parseOptions( args->getOptionList("cs") );
joachim99@69 174 title = i18n("Config Option Error:");
joachim99@69 175 }
joachim99@69 176 if (!s.isEmpty())
joachim99@69 177 {
joachim99@95 178 #if defined(_WIN32) || defined(Q_OS_OS2)
joachim99@69 179 // A windows program has no console
joachim99@69 180 //KMessageBox::information(0, s,i18n("KDiff3-Usage"));
joachim99@75 181 QDialog* pDialog = new QDialog(this);
joachim99@75 182 pDialog->setAttribute( Qt::WA_DeleteOnClose );
joachim99@75 183 pDialog->setModal( true );
joachim99@75 184 pDialog->setWindowTitle(title);
joachim99@75 185 QVBoxLayout* pVBoxLayout = new QVBoxLayout( pDialog );
joachim99@75 186 QTextEdit* pTextEdit = new QTextEdit(pDialog);
joachim99@69 187 pTextEdit->setText(s);
joachim99@69 188 pTextEdit->setReadOnly(true);
joachim99@75 189 pTextEdit->setWordWrapMode(QTextOption::NoWrap);
joachim99@69 190 pVBoxLayout->addWidget(pTextEdit);
joachim99@69 191 pDialog->resize(600,400);
joachim99@69 192 pDialog->exec();
joachim99@69 193 #else
joachim99@75 194 std::cerr << title.toLatin1().constData() << std::endl;
joachim99@75 195 std::cerr << s.toLatin1().constData() << std::endl;
joachim99@69 196 #endif
joachim99@69 197 exit(1);
joachim99@69 198 }
joachim99@69 199 }
joachim99@69 200
joachim99@58 201 m_sd1.setOptionDialog(m_pOptionDialog);
joachim99@58 202 m_sd2.setOptionDialog(m_pOptionDialog);
joachim99@58 203 m_sd3.setOptionDialog(m_pOptionDialog);
joachim99@68 204
joachim99@8 205 if (args!=0)
joachim99@8 206 {
joachim99@8 207 m_outputFilename = args->getOption("output");
joachim99@8 208 if ( m_outputFilename.isEmpty() )
joachim99@8 209 m_outputFilename = args->getOption("out");
joachim99@8 210 }
joachim99@8 211
joachim99@77 212 m_bAutoFlag = args!=0 && args->isSet("auto");
joachim99@77 213 m_bAutoMode = m_bAutoFlag || m_pOptionDialog->m_bAutoSaveAndQuitOnMergeWithoutConflicts;
joachim99@77 214 if ( m_bAutoMode && m_outputFilename.isEmpty() )
joachim99@8 215 {
joachim99@77 216 if ( m_bAutoFlag )
joachim99@77 217 {
joachim99@77 218 //KMessageBox::information(this, i18n("Option --auto used, but no output file specified."));
joachim99@77 219 std::cerr << (const char*)i18n("Option --auto used, but no output file specified.").toLatin1() << std::endl;
joachim99@77 220 }
joachim99@77 221 m_bAutoMode = false;
joachim99@8 222 }
joachim99@77 223 g_pProgressDialog->setStayHidden( m_bAutoMode );
joachim99@8 224
joachim99@8 225 if ( m_outputFilename.isEmpty() && args!=0 && args->isSet("merge") )
joachim99@8 226 {
joachim99@8 227 m_outputFilename = "unnamed.txt";
joachim99@8 228 m_bDefaultFilename = true;
joachim99@8 229 }
joachim99@8 230 else
joachim99@8 231 m_bDefaultFilename = false;
joachim99@8 232
joachim99@8 233 g_bAutoSolve = args!=0 && !args->isSet("qall"); // Note that this is effective only once.
joachim99@8 234
joachim99@8 235 if ( args!=0 )
joachim99@8 236 {
joachim99@8 237 m_sd1.setFilename( args->getOption("base") );
joachim99@8 238 if ( m_sd1.isEmpty() )
joachim99@8 239 {
joachim99@51 240 if ( args->count() > 0 ) m_sd1.setFilename( args->url(0).url() ); // args->arg(0)
joachim99@51 241 if ( args->count() > 1 ) m_sd2.setFilename( args->url(1).url() );
joachim99@51 242 if ( args->count() > 2 ) m_sd3.setFilename( args->url(2).url() );
joachim99@8 243 }
joachim99@8 244 else
joachim99@8 245 {
joachim99@51 246 if ( args->count() > 0 ) m_sd2.setFilename( args->url(0).url() );
joachim99@51 247 if ( args->count() > 1 ) m_sd3.setFilename( args->url(1).url() );
joachim99@8 248 }
joachim99@8 249
joachim99@68 250
joachim99@80 251 QStringList aliasList = args->getOptionList("fname");
joachim99@80 252 QStringList::Iterator ali = aliasList.begin();
joachim99@68 253
joachim99@66 254 QString an1 = args->getOption("L1");
joachim99@66 255 if ( !an1.isEmpty() ) { m_sd1.setAliasName(an1); }
joachim99@66 256 else if ( ali != aliasList.end() ) { m_sd1.setAliasName(*ali); ++ali; }
joachim99@68 257
joachim99@66 258 QString an2 = args->getOption("L2");
joachim99@66 259 if ( !an2.isEmpty() ) { m_sd2.setAliasName(an2); }
joachim99@66 260 else if ( ali != aliasList.end() ) { m_sd2.setAliasName(*ali); ++ali; }
joachim99@68 261
joachim99@66 262 QString an3 = args->getOption("L3");
joachim99@66 263 if ( !an3.isEmpty() ) { m_sd3.setAliasName(an3); }
joachim99@66 264 else if ( ali != aliasList.end() ) { m_sd3.setAliasName(*ali); ++ali; }
joachim99@8 265 }
joachim99@80 266
joachim99@8 267 ///////////////////////////////////////////////////////////////////
joachim99@8 268 // call inits to invoke all other construction parts
joachim99@8 269 initActions(actionCollection());
joachim99@8 270 initStatusBar();
joachim99@8 271
joachim99@8 272 m_pFindDialog = new FindDialog( this );
joachim99@8 273 connect( m_pFindDialog, SIGNAL(findNext()), this, SLOT(slotEditFindNext()));
joachim99@8 274
joachim99@51 275 autoAdvance->setChecked( m_pOptionDialog->m_bAutoAdvance );
joachim99@51 276 showWhiteSpaceCharacters->setChecked( m_pOptionDialog->m_bShowWhiteSpaceCharacters );
joachim99@51 277 showWhiteSpace->setChecked( m_pOptionDialog->m_bShowWhiteSpace );
joachim99@51 278 showWhiteSpaceCharacters->setEnabled( m_pOptionDialog->m_bShowWhiteSpace );
joachim99@51 279 showLineNumbers->setChecked( m_pOptionDialog->m_bShowLineNumbers );
joachim99@66 280 wordWrap->setChecked( m_pOptionDialog->m_bWordWrap );
joachim99@69 281 if ( ! isPart() )
joachim99@69 282 {
joachim99@80 283 // TODO
joachim99@80 284 // viewToolBar->setChecked( m_pOptionDialog->m_bShowToolBar );
joachim99@80 285 // slotViewToolBar();
joachim99@80 286
joachim99@69 287 viewStatusBar->setChecked( m_pOptionDialog->m_bShowStatusBar );
joachim99@69 288 slotViewStatusBar();
joachim99@80 289 /*
joachim99@80 290 vrusu - commented out as new KToolBar does not hase setParPos
joachim99@80 291 TODO figure out how to restore bar position
joachim99@80 292 if( toolBar(MAIN_TOOLBAR_NAME)!=0 )
joachim99@80 293 toolBar(MAIN_TOOLBAR_NAME)->setBarPos( (KToolBar::BarPosition) m_pOptionDialog->m_toolBarPos );*/
joachim99@69 294 /* QSize size = m_pOptionDialog->m_geometry;
joachim99@69 295 QPoint pos = m_pOptionDialog->m_position;
joachim99@69 296 if(!size.isEmpty())
joachim99@69 297 {
joachim99@69 298 m_pKDiff3Shell->resize( size );
joachim99@69 299 QRect visibleRect = QRect( pos, size ) & QApplication::desktop()->rect();
joachim99@69 300 if ( visibleRect.width()>100 && visibleRect.height()>100 )
joachim99@69 301 m_pKDiff3Shell->move( pos );
joachim99@69 302 }*/
joachim99@69 303 }
joachim99@69 304 slotRefresh();
joachim99@51 305
joachim99@8 306 m_pMainSplitter = this; //new QSplitter(this);
joachim99@70 307 m_pMainSplitter->setOrientation( Qt::Vertical );
joachim99@8 308 // setCentralWidget( m_pMainSplitter );
joachim99@8 309 m_pDirectoryMergeSplitter = new QSplitter( m_pMainSplitter );
joachim99@92 310 m_pDirectoryMergeSplitter->setObjectName("DirectoryMergeSplitter");
joachim99@80 311 m_pMainSplitter->addWidget( m_pDirectoryMergeSplitter );
joachim99@70 312 m_pDirectoryMergeSplitter->setOrientation( Qt::Horizontal );
joachim99@8 313 m_pDirectoryMergeWindow = new DirectoryMergeWindow( m_pDirectoryMergeSplitter, m_pOptionDialog,
joachim99@80 314 KIconLoader::global() );
joachim99@80 315 m_pDirectoryMergeSplitter->addWidget(m_pDirectoryMergeWindow);
joachim99@8 316 m_pDirectoryMergeInfo = new DirectoryMergeInfo( m_pDirectoryMergeSplitter );
joachim99@8 317 m_pDirectoryMergeWindow->setDirectoryMergeInfo( m_pDirectoryMergeInfo );
joachim99@80 318 m_pDirectoryMergeSplitter->addWidget(m_pDirectoryMergeInfo);
joachim99@80 319
joachim99@66 320 connect( m_pDirectoryMergeWindow, SIGNAL(startDiffMerge(QString,QString,QString,QString,QString,QString,QString,TotalDiffStatus*)),
joachim99@66 321 this, SLOT( slotFileOpen2(QString,QString,QString,QString,QString,QString,QString,TotalDiffStatus*)));
joachim99@75 322 connect( m_pDirectoryMergeWindow, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateAvailabilities()));
joachim99@75 323 connect( m_pDirectoryMergeWindow, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotUpdateAvailabilities()));
joachim99@8 324 connect( m_pDirectoryMergeWindow, SIGNAL(checkIfCanContinue(bool*)), this, SLOT(slotCheckIfCanContinue(bool*)));
joachim99@8 325 connect( m_pDirectoryMergeWindow, SIGNAL(updateAvailabilities()), this, SLOT(slotUpdateAvailabilities()));
joachim99@66 326 connect( m_pDirectoryMergeWindow, SIGNAL(statusBarMessage(const QString&)), this, SLOT(slotStatusMsg(const QString&)));
joachim99@8 327
joachim99@51 328 m_pDirectoryMergeWindow->initDirectoryMergeActions( this, actionCollection() );
joachim99@8 329
joachim99@8 330 if ( args!=0 ) args->clear(); // Free up some memory.
joachim99@8 331
joachim99@8 332 if (m_pKDiff3Shell==0)
joachim99@8 333 {
joachim99@8 334 completeInit();
joachim99@8 335 }
joachim99@8 336 }
joachim99@8 337
joachim99@8 338
joachim99@69 339 void KDiff3App::completeInit( const QString& fn1, const QString& fn2, const QString& fn3 )
joachim99@8 340 {
joachim99@8 341 if (m_pKDiff3Shell!=0)
joachim99@8 342 {
joachim99@69 343 QSize size=m_pOptionDialog->m_geometry;
joachim99@69 344 QPoint pos=m_pOptionDialog->m_position;
joachim99@8 345 if(!size.isEmpty())
joachim99@8 346 {
joachim99@8 347 m_pKDiff3Shell->resize( size );
joachim99@75 348
joachim99@69 349 QRect visibleRect = QRect( pos, size ) & QApplication::desktop()->rect();
joachim99@69 350 if ( visibleRect.width()>100 && visibleRect.height()>100 )
joachim99@69 351 m_pKDiff3Shell->move( pos );
joachim99@77 352 if (!m_bAutoMode)
joachim99@75 353 {
joachim99@75 354 if ( m_pOptionDialog->m_bMaximised )
joachim99@75 355 m_pKDiff3Shell->showMaximized();
joachim99@75 356 else
joachim99@75 357 m_pKDiff3Shell->show();
joachim99@75 358 }
joachim99@8 359 }
joachim99@8 360 }
joachim99@69 361 if ( ! fn1.isEmpty() ) { m_sd1.setFilename(fn1); }
joachim99@69 362 if ( ! fn2.isEmpty() ) { m_sd2.setFilename(fn2); }
joachim99@69 363 if ( ! fn3.isEmpty() ) { m_sd3.setFilename(fn3); }
joachim99@8 364
joachim99@69 365 bool bSuccess = improveFilenames(false);
joachim99@68 366
joachim99@77 367 if ( m_bAutoFlag && m_bAutoMode && m_bDirCompare )
joachim99@8 368 {
joachim99@75 369 std::cerr << (const char*)i18n("Option --auto ignored for directory comparison.").toLatin1()<<std::endl;
joachim99@77 370 m_bAutoMode = false;
joachim99@8 371 }
joachim99@8 372 if (!m_bDirCompare)
joachim99@8 373 {
joachim99@8 374 m_pDirectoryMergeSplitter->hide();
joachim99@8 375
joachim99@77 376 init( m_bAutoMode );
joachim99@77 377 if ( m_bAutoMode )
joachim99@8 378 {
joachim99@58 379 SourceData* pSD=0;
joachim99@8 380 if ( m_sd3.isEmpty() )
joachim99@8 381 {
joachim99@58 382 if ( m_totalDiffStatus.bBinaryAEqB ){ pSD = &m_sd1; }
joachim99@8 383 }
joachim99@8 384 else
joachim99@8 385 {
joachim99@58 386 if ( m_totalDiffStatus.bBinaryBEqC ){ pSD = &m_sd3; } // B==C (assume A is old)
joachim99@58 387 else if ( m_totalDiffStatus.bBinaryAEqB ){ pSD = &m_sd3; } // assuming C has changed
joachim99@58 388 else if ( m_totalDiffStatus.bBinaryAEqC ){ pSD = &m_sd2; } // assuming B has changed
joachim99@8 389 }
joachim99@8 390
joachim99@58 391 if ( pSD!=0 )
joachim99@8 392 {
joachim99@8 393 // Save this file directly, not via the merge result window.
joachim99@8 394 bool bSuccess = false;
joachim99@58 395 FileAccess fa( m_outputFilename );
joachim99@58 396 if ( m_pOptionDialog->m_bDmCreateBakFiles && fa.exists() )
joachim99@8 397 {
joachim99@8 398 QString newName = m_outputFilename + ".orig";
joachim99@58 399 if ( FileAccess::exists( newName ) ) FileAccess::removeFile( newName );
joachim99@58 400 if ( !FileAccess::exists( newName ) ) fa.rename( newName );
joachim99@8 401 }
joachim99@68 402
joachim99@58 403 bSuccess = pSD->saveNormalDataAs( m_outputFilename );
joachim99@8 404 if ( bSuccess ) ::exit(0);
joachim99@8 405 else KMessageBox::error( this, i18n("Saving failed.") );
joachim99@8 406 }
joachim99@8 407 else if ( m_pMergeResultWindow->getNrOfUnsolvedConflicts() == 0 )
joachim99@8 408 {
joachim99@80 409 bool bSuccess = m_pMergeResultWindow->saveDocument( m_pMergeResultWindowTitle->getFileName(), m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() );
joachim99@8 410 if ( bSuccess ) ::exit(0);
joachim99@8 411 }
joachim99@8 412 }
joachim99@8 413 }
joachim99@77 414 m_bAutoMode = false;
joachim99@8 415
joachim99@69 416 if (m_pKDiff3Shell)
joachim99@77 417 {
joachim99@77 418 if ( m_pOptionDialog->m_bMaximised )
joachim99@77 419 m_pKDiff3Shell->showMaximized();
joachim99@77 420 else
joachim99@77 421 m_pKDiff3Shell->show();
joachim99@77 422 }
joachim99@77 423
joachim99@77 424 g_pProgressDialog->setStayHidden( false );
joachim99@69 425
joachim99@8 426 if (statusBar() !=0 )
joachim99@69 427 statusBar()->setSizeGripEnabled(true);
joachim99@8 428
joachim99@8 429 slotClipboardChanged(); // For initialisation.
joachim99@8 430
joachim99@8 431 slotUpdateAvailabilities();
joachim99@8 432
joachim99@8 433 if ( ! m_bDirCompare && m_pKDiff3Shell!=0 )
joachim99@8 434 {
joachim99@8 435 bool bFileOpenError = false;
joachim99@80 436 if ( (! m_sd1.isEmpty() && !m_sd1.hasData()) ||
joachim99@80 437 (! m_sd2.isEmpty() && !m_sd2.hasData()) ||
joachim99@80 438 (! m_sd3.isEmpty() && !m_sd3.hasData()) )
joachim99@8 439 {
joachim99@8 440 QString text( i18n("Opening of these files failed:") );
joachim99@8 441 text += "\n\n";
joachim99@58 442 if ( ! m_sd1.isEmpty() && !m_sd1.hasData() )
joachim99@8 443 text += " - " + m_sd1.getAliasName() + "\n";
joachim99@58 444 if ( ! m_sd2.isEmpty() && !m_sd2.hasData() )
joachim99@8 445 text += " - " + m_sd2.getAliasName() + "\n";
joachim99@58 446 if ( ! m_sd3.isEmpty() && !m_sd3.hasData() )
joachim99@8 447 text += " - " + m_sd3.getAliasName() + "\n";
joachim99@8 448
joachim99@51 449 KMessageBox::sorry( this, text, i18n("File Open Error") );
joachim99@8 450 bFileOpenError = true;
joachim99@8 451 }
joachim99@8 452
joachim99@8 453 if ( m_sd1.isEmpty() || m_sd2.isEmpty() || bFileOpenError )
joachim99@8 454 slotFileOpen();
joachim99@8 455 }
joachim99@66 456 else if ( !bSuccess ) // Directory open failed
joachim99@66 457 {
joachim99@66 458 slotFileOpen();
joachim99@66 459 }
joachim99@8 460 }
joachim99@8 461
joachim99@8 462 KDiff3App::~KDiff3App()
joachim99@8 463 {
joachim99@8 464
joachim99@8 465 }
joachim99@8 466
joachim99@80 467 /**
joachim99@80 468 * Helper function used to create actions into the ac collection
joachim99@80 469 */
joachim99@80 470
joachim99@8 471 void KDiff3App::initActions( KActionCollection* ac )
joachim99@8 472 {
joachim99@80 473 if (ac==0)
joachim99@80 474 KMessageBox::error(0, "actionCollection==0");
joachim99@8 475
joachim99@80 476 fileOpen = KStandardAction::open(this, SLOT(slotFileOpen()), ac);
joachim99@80 477 fileOpen->setStatusTip(i18n("Opens documents for comparison..."));
joachim99@69 478
joachim99@80 479 fileReload = KDiff3::createAction< KAction >( i18n("Reload"), KShortcut( Qt::Key_F5 ), this, SLOT(slotReload()), ac, "file_reload" );
joachim99@80 480
joachim99@80 481 fileSave = KStandardAction::save(this, SLOT(slotFileSave()), ac);
joachim99@80 482 fileSave->setStatusTip(i18n("Saves the merge result. All conflicts must be solved!"));
joachim99@80 483 fileSaveAs = KStandardAction::saveAs(this, SLOT(slotFileSaveAs()), ac);
joachim99@80 484 fileSaveAs->setStatusTip(i18n("Saves the current document as..."));
joachim99@95 485 #ifndef QT_NO_PRINTER
joachim99@80 486 filePrint = KStandardAction::print(this, SLOT(slotFilePrint()), ac);
joachim99@80 487 filePrint->setStatusTip(i18n("Print the differences"));
joachim99@95 488 #endif
joachim99@80 489 fileQuit = KStandardAction::quit(this, SLOT(slotFileQuit()), ac);
joachim99@80 490 fileQuit->setStatusTip(i18n("Quits the application"));
joachim99@80 491 editCut = KStandardAction::cut(this, SLOT(slotEditCut()), ac);
joachim99@80 492 editCut->setStatusTip(i18n("Cuts the selected section and puts it to the clipboard"));
joachim99@80 493 editCopy = KStandardAction::copy(this, SLOT(slotEditCopy()), ac);
joachim99@80 494 editCopy->setStatusTip(i18n("Copies the selected section to the clipboard"));
joachim99@80 495 editPaste = KStandardAction::paste(this, SLOT(slotEditPaste()), ac);
joachim99@80 496 editPaste->setStatusTip(i18n("Pastes the clipboard contents to actual position"));
joachim99@80 497 editSelectAll = KStandardAction::selectAll(this, SLOT(slotEditSelectAll()), ac);
joachim99@80 498 editSelectAll->setStatusTip(i18n("Select everything in current window"));
joachim99@80 499 editFind = KStandardAction::find(this, SLOT(slotEditFind()), ac);
joachim99@80 500 editFind->setStatusTip(i18n("Search for a string"));
joachim99@80 501 editFindNext = KStandardAction::findNext(this, SLOT(slotEditFindNext()), ac);
joachim99@80 502 editFindNext->setStatusTip(i18n("Search again for the string"));
joachim99@80 503 /* FIXME figure out how to implement this action
joachim99@80 504 viewToolBar = KStandardAction::showToolbar(this, SLOT(slotViewToolBar()), ac);
joachim99@80 505 viewToolBar->setStatusTip(i18n("Enables/disables the toolbar")); */
joachim99@80 506 viewStatusBar = KStandardAction::showStatusbar(this, SLOT(slotViewStatusBar()), ac);
joachim99@80 507 viewStatusBar->setStatusTip(i18n("Enables/disables the statusbar"));
joachim99@80 508 KStandardAction::keyBindings(this, SLOT(slotConfigureKeys()), ac);
joachim99@80 509 KAction* pAction = KStandardAction::preferences(this, SLOT(slotConfigure()), ac );
joachim99@8 510 if ( isPart() )
joachim99@51 511 pAction->setText(i18n("Configure KDiff3..."));
joachim99@8 512
joachim99@8 513
joachim99@8 514 #include "xpm/downend.xpm"
joachim99@8 515 #include "xpm/currentpos.xpm"
joachim99@8 516 #include "xpm/down1arrow.xpm"
joachim99@8 517 #include "xpm/down2arrow.xpm"
joachim99@8 518 #include "xpm/upend.xpm"
joachim99@8 519 #include "xpm/up1arrow.xpm"
joachim99@8 520 #include "xpm/up2arrow.xpm"
joachim99@8 521 #include "xpm/prevunsolved.xpm"
joachim99@8 522 #include "xpm/nextunsolved.xpm"
joachim99@8 523 #include "xpm/iconA.xpm"
joachim99@8 524 #include "xpm/iconB.xpm"
joachim99@8 525 #include "xpm/iconC.xpm"
joachim99@8 526 #include "xpm/autoadvance.xpm"
joachim99@8 527 #include "xpm/showwhitespace.xpm"
joachim99@58 528 #include "xpm/showwhitespacechars.xpm"
joachim99@8 529 #include "xpm/showlinenumbers.xpm"
joachim99@8 530 //#include "reload.xpm"
joachim99@8 531
joachim99@80 532 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 533
joachim99@80 534 goTop = KDiff3::createAction< KAction >(i18n("Go to First Delta"), QIcon(QPixmap(upend)), i18n("First\nDelta"), this, SLOT(slotGoTop()), ac, "go_top");
joachim99@80 535
joachim99@80 536 goBottom = KDiff3::createAction< KAction >(i18n("Go to Last Delta"), QIcon(QPixmap(downend)), i18n("Last\nDelta"), this, SLOT(slotGoBottom()), ac, "go_bottom");
joachim99@80 537
joachim99@68 538 QString omitsWhitespace = ".\n" + i18n("(Skips white space differences when \"Show White Space\" is disabled.)");
joachim99@69 539 QString includeWhitespace = ".\n" + i18n("(Does not skip white space differences even when \"Show White Space\" is disabled.)");
joachim99@80 540 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 541 goPrevDelta->setToolTip( goPrevDelta->text() + omitsWhitespace );
joachim99@80 542 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 543 goNextDelta->setToolTip( goNextDelta->text() + omitsWhitespace );
joachim99@80 544 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 545 goPrevConflict->setToolTip( goPrevConflict->text() + omitsWhitespace );
joachim99@80 546 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 547 goNextConflict->setToolTip( goNextConflict->text() + omitsWhitespace );
joachim99@80 548 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 549 goPrevUnsolvedConflict->setToolTip( goPrevUnsolvedConflict->text() + includeWhitespace );
joachim99@80 550 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 551 goNextUnsolvedConflict->setToolTip( goNextUnsolvedConflict->text() + includeWhitespace );
joachim99@80 552 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 553 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 554 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 555 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 556
joachim99@80 557 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 558 showWhiteSpace = KDiff3::createAction< KToggleAction >(i18n("Show White Space"), QIcon(QPixmap(showwhitespace)), i18n("White\nDeltas"), this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace");
joachim99@51 559
joachim99@80 560 showLineNumbers = KDiff3::createAction< KToggleAction >(i18n("Show Line Numbers"), QIcon(QPixmap(showlinenumbers)), i18n("Line\nNumbers"), this, SLOT(slotShowLineNumbersToggled()), ac, "diff_showlinenumbers");
joachim99@80 561 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 562 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 563 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 564 chooseAForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose A for All Unsolved Conflicts"), this, SLOT(slotChooseAForUnsolvedConflicts()), ac, "merge_choose_a_for_unsolved_conflicts");
joachim99@80 565 chooseBForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose B for All Unsolved Conflicts"), this, SLOT(slotChooseBForUnsolvedConflicts()), ac, "merge_choose_b_for_unsolved_conflicts");
joachim99@80 566 chooseCForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose C for All Unsolved Conflicts"), this, SLOT(slotChooseCForUnsolvedConflicts()), ac, "merge_choose_c_for_unsolved_conflicts");
joachim99@80 567 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 568 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 569 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 570 autoSolve = KDiff3::createAction< KAction >(i18n("Automatically Solve Simple Conflicts"), this, SLOT(slotAutoSolve()), ac, "merge_autosolve");
joachim99@80 571 unsolve = KDiff3::createAction< KAction >(i18n("Set Deltas to Conflicts"), this, SLOT(slotUnsolve()), ac, "merge_autounsolve");
joachim99@80 572 mergeRegExp = KDiff3::createAction< KAction >(i18n("Run Regular Expression Auto Merge"), this, SLOT(slotRegExpAutoMerge()),ac, "merge_regexp_automerge" );
joachim99@80 573 mergeHistory = KDiff3::createAction< KAction >(i18n("Automatically Solve History Conflicts"), this, SLOT(slotMergeHistory()), ac, "merge_versioncontrol_history" );
joachim99@80 574 splitDiff = KDiff3::createAction< KAction >(i18n("Split Diff At Selection"), this, SLOT(slotSplitDiff()), ac, "merge_splitdiff");
joachim99@80 575 joinDiffs = KDiff3::createAction< KAction >(i18n("Join Selected Diffs"), this, SLOT(slotJoinDiffs()), ac, "merge_joindiffs");
joachim99@69 576
joachim99@80 577 showWindowA = KDiff3::createAction< KToggleAction >(i18n("Show Window A"), this, SLOT(slotShowWindowAToggled()), ac, "win_show_a");
joachim99@80 578 showWindowB = KDiff3::createAction< KToggleAction >(i18n("Show Window B"), this, SLOT(slotShowWindowBToggled()), ac, "win_show_b");
joachim99@80 579 showWindowC = KDiff3::createAction< KToggleAction >(i18n("Show Window C"), this, SLOT(slotShowWindowCToggled()), ac, "win_show_c");
joachim99@80 580 winFocusNext = KDiff3::createAction< KAction >(i18n("Focus Next Window"), KShortcut( Qt::ALT+Qt::Key_Right ), this, SLOT(slotWinFocusNext()), ac, "win_focus_next");
joachim99@68 581
joachim99@80 582 overviewModeNormal = KDiff3::createAction< KToggleAction >(i18n("Normal Overview"), this, SLOT(slotOverviewNormal()), ac, "diff_overview_normal");
joachim99@80 583 overviewModeAB = KDiff3::createAction< KToggleAction >(i18n("A vs. B Overview"), this, SLOT(slotOverviewAB()), ac, "diff_overview_ab");
joachim99@80 584 overviewModeAC = KDiff3::createAction< KToggleAction >(i18n("A vs. C Overview"), this, SLOT(slotOverviewAC()), ac, "diff_overview_ac");
joachim99@80 585 overviewModeBC = KDiff3::createAction< KToggleAction >(i18n("B vs. C Overview"), this, SLOT(slotOverviewBC()), ac, "diff_overview_bc");
joachim99@80 586 wordWrap = KDiff3::createAction< KToggleAction >(i18n("Word Wrap Diff Windows"), this, SLOT(slotWordWrapToggled()), ac, "diff_wordwrap");
joachim99@80 587 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 588 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 589
joachim99@95 590 #if defined(_WIN32) || defined(Q_OS_OS2)
joachim99@80 591 KDiff3::createAction< KAction >(i18n("Focus Next Window"), KShortcut(Qt::CTRL+Qt::Key_Tab), this, SLOT(slotWinFocusNext()), ac, "win_focus_next");
joachim99@26 592 #endif
joachim99@80 593 winFocusPrev = KDiff3::createAction< KAction >(i18n("Focus Prev Window"), KShortcut( Qt::ALT+Qt::Key_Left ), this, SLOT(slotWinFocusPrev()), ac, "win_focus_prev");
joachim99@80 594 winToggleSplitOrientation = KDiff3::createAction< KAction >(i18n("Toggle Split Orientation"), this, SLOT(slotWinToggleSplitterOrientation()), ac, "win_toggle_split_orientation");
joachim99@8 595
joachim99@80 596 dirShowBoth = KDiff3::createAction< KToggleAction >(i18n("Dir && Text Split Screen View"), this, SLOT(slotDirShowBoth()), ac, "win_dir_show_both");
joachim99@8 597 dirShowBoth->setChecked( true );
joachim99@80 598 dirViewToggle = KDiff3::createAction< KAction >(i18n("Toggle Between Dir && Text View"), this, SLOT(slotDirViewToggle()), ac, "win_dir_view_toggle");
joachim99@8 599
joachim99@75 600 m_pMergeEditorPopupMenu = new QMenu( this );
joachim99@80 601 /* chooseA->plug( m_pMergeEditorPopupMenu );
joachim99@8 602 chooseB->plug( m_pMergeEditorPopupMenu );
joachim99@80 603 chooseC->plug( m_pMergeEditorPopupMenu );*/
joachim99@80 604 m_pMergeEditorPopupMenu->addAction( chooseA );
joachim99@80 605 m_pMergeEditorPopupMenu->addAction( chooseB );
joachim99@80 606 m_pMergeEditorPopupMenu->addAction( chooseC );
joachim99@8 607 }
joachim99@8 608
joachim99@51 609
joachim99@8 610 void KDiff3App::showPopupMenu( const QPoint& point )
joachim99@8 611 {
joachim99@8 612 m_pMergeEditorPopupMenu->popup( point );
joachim99@8 613 }
joachim99@8 614
joachim99@8 615 void KDiff3App::initStatusBar()
joachim99@8 616 {
joachim99@8 617 ///////////////////////////////////////////////////////////////////
joachim99@8 618 // STATUSBAR
joachim99@8 619 if (statusBar() !=0 )
joachim99@75 620 statusBar()->showMessage( i18n("Ready.") );
joachim99@8 621 }
joachim99@8 622
joachim99@80 623 void KDiff3App::saveOptions( KSharedConfigPtr config )
joachim99@8 624 {
joachim99@77 625 if ( !m_bAutoMode )
joachim99@8 626 {
joachim99@77 627 if (!isPart())
joachim99@75 628 {
joachim99@77 629 m_pOptionDialog->m_bMaximised = m_pKDiff3Shell->isMaximized();
joachim99@77 630 if( ! m_pKDiff3Shell->isMaximized() && m_pKDiff3Shell->isVisible() )
joachim99@77 631 {
joachim99@77 632 m_pOptionDialog->m_geometry = m_pKDiff3Shell->size();
joachim99@77 633 m_pOptionDialog->m_position = m_pKDiff3Shell->pos();
joachim99@77 634 }
joachim99@80 635 /* TODO change this option as now KToolbar uses QToolbar positioning style
joachim99@80 636 if ( toolBar(MAIN_TOOLBAR_NAME)!=0 )
joachim99@80 637 m_pOptionDialog->m_toolBarPos = (int) toolBar(MAIN_TOOLBAR_NAME)->allowedAreas();*/
joachim99@75 638 }
joachim99@77 639
joachim99@77 640 m_pOptionDialog->saveOptions( config );
joachim99@8 641 }
joachim99@8 642 }
joachim99@8 643
joachim99@8 644
joachim99@8 645
joachim99@8 646
joachim99@8 647 bool KDiff3App::queryClose()
joachim99@8 648 {
joachim99@80 649 saveOptions( isPart() ? m_pKDiff3Part->componentData().config() : KGlobal::config() );
joachim99@8 650
joachim99@8 651 if(m_bOutputModified)
joachim99@8 652 {
joachim99@8 653 int result = KMessageBox::warningYesNoCancel(this,
joachim99@8 654 i18n("The merge result hasn't been saved."),
joachim99@80 655 i18n("Warning"),
joachim99@80 656 KGuiItem( i18n("Save && Quit") ),
joachim99@80 657 KGuiItem( i18n("Quit Without Saving") ) );
joachim99@8 658 if ( result==KMessageBox::Cancel )
joachim99@8 659 return false;
joachim99@8 660 else if ( result==KMessageBox::Yes )
joachim99@8 661 {
joachim99@8 662 slotFileSave();
joachim99@8 663 if ( m_bOutputModified )
joachim99@8 664 {
joachim99@8 665 KMessageBox::sorry(this, i18n("Saving the merge result failed."), i18n("Warning") );
joachim99@8 666 return false;
joachim99@8 667 }
joachim99@8 668 }
joachim99@8 669 }
joachim99@8 670
joachim99@8 671 m_bOutputModified = false;
joachim99@8 672
joachim99@8 673 if ( m_pDirectoryMergeWindow->isDirectoryMergeInProgress() )
joachim99@8 674 {
joachim99@8 675 int result = KMessageBox::warningYesNo(this,
joachim99@8 676 i18n("You are currently doing a directory merge. Are you sure, you want to abort?"),
joachim99@80 677 i18n("Warning"),
joachim99@80 678 KStandardGuiItem::quit(),
joachim99@80 679 KStandardGuiItem::cont() /* i18n("Continue Merging") */ );
joachim99@8 680 if ( result!=KMessageBox::Yes )
joachim99@8 681 return false;
joachim99@8 682 }
joachim99@8 683
joachim99@8 684 return true;
joachim99@8 685 }
joachim99@8 686
joachim99@8 687
joachim99@8 688 /////////////////////////////////////////////////////////////////////
joachim99@8 689 // SLOT IMPLEMENTATION
joachim99@8 690 /////////////////////////////////////////////////////////////////////
joachim99@8 691
joachim99@8 692
joachim99@8 693 void KDiff3App::slotFileSave()
joachim99@8 694 {
joachim99@8 695 if ( m_bDefaultFilename )
joachim99@8 696 {
joachim99@8 697 slotFileSaveAs();
joachim99@8 698 }
joachim99@8 699 else
joachim99@8 700 {
joachim99@8 701 slotStatusMsg(i18n("Saving file..."));
joachim99@8 702
joachim99@80 703 bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() );
joachim99@8 704 if ( bSuccess )
joachim99@8 705 {
joachim99@69 706 m_bFileSaved = true;
joachim99@8 707 m_bOutputModified = false;
joachim99@8 708 if ( m_bDirCompare )
joachim99@75 709 m_pDirectoryMergeWindow->mergeResultSaved( m_outputFilename );
joachim99@8 710 }
joachim99@8 711
joachim99@8 712 slotStatusMsg(i18n("Ready."));
joachim99@8 713 }
joachim99@8 714 }
joachim99@8 715
joachim99@8 716 void KDiff3App::slotFileSaveAs()
joachim99@8 717 {
joachim99@8 718 slotStatusMsg(i18n("Saving file with a new filename..."));
joachim99@8 719
joachim99@80 720 QString s = KFileDialog::getSaveUrl( QDir::currentPath(), 0, this, i18n("Save As...") ).url();
joachim99@8 721 if(!s.isEmpty())
joachim99@8 722 {
joachim99@8 723 m_outputFilename = s;
joachim99@75 724 m_pMergeResultWindowTitle->setFileName( m_outputFilename );
joachim99@80 725 bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() );
joachim99@8 726 if ( bSuccess )
joachim99@8 727 {
joachim99@8 728 m_bOutputModified = false;
joachim99@8 729 if ( m_bDirCompare )
joachim99@75 730 m_pDirectoryMergeWindow->mergeResultSaved( m_outputFilename );
joachim99@8 731 }
joachim99@8 732 //setCaption(url.fileName(),doc->isModified());
joachim99@8 733
joachim99@8 734 m_bDefaultFilename = false;
joachim99@8 735 }
joachim99@8 736
joachim99@8 737 slotStatusMsg(i18n("Ready."));
joachim99@8 738 }
joachim99@8 739
joachim99@8 740
joachim99@69 741 void printDiffTextWindow( MyPainter& painter, const QRect& view, const QString& headerText, DiffTextWindow* pDiffTextWindow, int line, int linesPerPage, QColor fgColor )
joachim99@69 742 {
joachim99@69 743 QRect clipRect = view;
joachim99@69 744 clipRect.setTop(0);
joachim99@69 745 painter.setClipRect( clipRect );
joachim99@69 746 painter.translate( view.left() , 0 );
joachim99@69 747 QFontMetrics fm = painter.fontMetrics();
joachim99@69 748 //if ( fm.width(headerText) > view.width() )
joachim99@69 749 {
joachim99@69 750 // A simple wrapline algorithm
joachim99@69 751 int l=0;
joachim99@70 752 for (int p=0; p<headerText.length(); )
joachim99@69 753 {
joachim99@69 754 QString s = headerText.mid(p);
joachim99@70 755 int i;
joachim99@69 756 for(i=2;i<s.length();++i)
joachim99@69 757 if (fm.width(s,i)>view.width())
joachim99@69 758 {
joachim99@69 759 --i;
joachim99@69 760 break;
joachim99@69 761 }
joachim99@69 762 //QString s2 = s.left(i);
joachim99@69 763 painter.drawText( 0, l*fm.height() + fm.ascent(), s.left(i) );
joachim99@69 764 p+=i;
joachim99@69 765 ++l;
joachim99@69 766 }
joachim99@69 767 painter.setPen( fgColor );
joachim99@69 768 painter.drawLine( 0, view.top()-2, view.width(), view.top()-2 );
joachim99@69 769 }
joachim99@69 770
joachim99@69 771 painter.translate( 0, view.top() );
joachim99@69 772 pDiffTextWindow->print( painter, view, line, linesPerPage );
joachim99@75 773 painter.resetMatrix();
joachim99@69 774 }
joachim99@69 775
joachim99@69 776 void KDiff3App::slotFilePrint()
joachim99@69 777 {
joachim99@69 778 if ( !m_pDiffTextWindow1 )
joachim99@69 779 return;
joachim99@95 780 #ifdef QT_NO_PRINTER
joachim99@95 781 slotStatusMsg( i18n( "Printing not implemented." ) );
joachim99@95 782 #endif
joachim99@95 783 #ifndef QT_NO_PRINTER
joachim99@80 784 QPrinter printer;
joachim99@75 785 QPrintDialog printDialog(&printer, this);
joachim99@69 786
joachim99@69 787 int firstSelectionD3LIdx = -1;
joachim99@69 788 int lastSelectionD3LIdx = -1;
joachim99@69 789 if ( m_pDiffTextWindow1 ) { m_pDiffTextWindow1->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); }
joachim99@69 790 if ( firstSelectionD3LIdx<0 && m_pDiffTextWindow2 ) { m_pDiffTextWindow2->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); }
joachim99@69 791 if ( firstSelectionD3LIdx<0 && m_pDiffTextWindow3 ) { m_pDiffTextWindow3->getSelectionRange(&firstSelectionD3LIdx, &lastSelectionD3LIdx, eD3LLineCoords); }
joachim99@69 792 #ifdef KREPLACEMENTS_H // Currently PrintSelection is not supported in KDEs print dialog.
joachim99@69 793 if ( firstSelectionD3LIdx>=0 )
joachim99@69 794 {
joachim99@75 795 printDialog.addEnabledOption(QPrintDialog::PrintSelection);
joachim99@80 796 //printer.setOptionEnabled(QPrinter::PrintSelection,true);
joachim99@80 797 printDialog.setPrintRange(QAbstractPrintDialog::Selection);
joachim99@69 798 }
joachim99@69 799 #endif
joachim99@69 800
joachim99@80 801 if ( firstSelectionD3LIdx == -1 )
joachim99@80 802 printDialog.setPrintRange(QAbstractPrintDialog::AllPages);
joachim99@80 803 //printDialog.setMinMax(0,0);
joachim99@80 804 printDialog.setFromTo(0,0);
joachim99@69 805
joachim99@69 806 int currentFirstLine = m_pDiffTextWindow1->getFirstLine();
joachim99@69 807 int currentFirstD3LIdx = m_pDiffTextWindow1->convertLineToDiff3LineIdx( currentFirstLine );
joachim99@69 808
joachim99@69 809 // do some printer initialization
joachim99@69 810 printer.setFullPage( false );
joachim99@69 811
joachim99@69 812 // initialize the printer using the print dialog
joachim99@75 813 if (printDialog.exec()== QDialog::Accepted)
joachim99@69 814 {
joachim99@69 815 slotStatusMsg( i18n( "Printing..." ) );
joachim99@69 816 // create a painter to paint on the printer object
joachim99@77 817 MyPainter painter( &printer, m_pOptionDialog->m_bRightToLeftLanguage, width(), fontMetrics().width('W') );
joachim99@69 818
joachim99@75 819 QPaintDevice* pPaintDevice = painter.device();
joachim99@75 820 int dpiy = pPaintDevice->logicalDpiY();
joachim99@69 821 int columnDistance = (int) ( (0.5/2.54)*dpiy ); // 0.5 cm between the columns
joachim99@69 822
joachim99@69 823 int columns = m_bTripleDiff ? 3 : 2;
joachim99@75 824 int columnWidth = ( pPaintDevice->width() - (columns-1)*columnDistance ) / columns;
joachim99@69 825
joachim99@69 826 QFont f = m_pOptionDialog->m_font;
joachim99@75 827 f.setPointSizeF(f.pointSizeF()-1); // Print with slightly smaller font.
joachim99@69 828 painter.setFont( f );
joachim99@69 829 QFontMetrics fm = painter.fontMetrics();
joachim99@69 830
joachim99@69 831 QString topLineText = i18n("Top line");
joachim99@69 832
joachim99@69 833 //int headerWidth = fm.width( m_sd1.getAliasName() + ", "+topLineText+": 01234567" );
joachim99@69 834 int headerLines = fm.width( m_sd1.getAliasName() + ", "+topLineText+": 01234567" )/columnWidth+1;
joachim99@69 835
joachim99@69 836 int headerMargin = headerLines * fm.height() + 3; // Text + one horizontal line
joachim99@69 837 int footerMargin = fm.height() + 3;
joachim99@69 838
joachim99@75 839 QRect view ( 0, headerMargin, pPaintDevice->width(), pPaintDevice->height() - (headerMargin + footerMargin) );
joachim99@75 840 QRect view1( 0*(columnWidth + columnDistance), view.top(), columnWidth, view.height() );
joachim99@75 841 QRect view2( 1*(columnWidth + columnDistance), view.top(), columnWidth, view.height() );
joachim99@75 842 QRect view3( 2*(columnWidth + columnDistance), view.top(), columnWidth, view.height() );
joachim99@69 843
joachim99@69 844 int linesPerPage = view.height() / fm.height();
joachim99@69 845 int charactersPerLine = columnWidth / fm.width("W");
joachim99@69 846 if ( m_pOptionDialog->m_bWordWrap )
joachim99@69 847 {
joachim99@69 848 // For printing the lines are wrapped differently (this invalidates the first line)
joachim99@69 849 recalcWordWrap( charactersPerLine );
joachim99@69 850 }
joachim99@69 851
joachim99@69 852 int totalNofLines = max2(m_pDiffTextWindow1->getNofLines(), m_pDiffTextWindow2->getNofLines());
joachim99@69 853 if ( m_bTripleDiff && m_pDiffTextWindow3)
joachim99@69 854 totalNofLines = max2(totalNofLines, m_pDiffTextWindow3->getNofLines());
joachim99@69 855
joachim99@80 856 QList<int> pageList;// = printer.pageList();
joachim99@69 857
joachim99@69 858 bool bPrintCurrentPage=false;
joachim99@69 859 bool bFirstPrintedPage = false;
joachim99@69 860
joachim99@69 861 bool bPrintSelection = false;
joachim99@69 862 int totalNofPages = (totalNofLines+linesPerPage-1) / linesPerPage;
joachim99@69 863 int line=-1;
joachim99@69 864 int selectionEndLine = -1;
joachim99@69 865
joachim99@69 866 #ifdef KREPLACEMENTS_H
joachim99@80 867 if ( printer.printRange()==QPrinter::AllPages )
joachim99@69 868 {
joachim99@69 869 pageList.clear();
joachim99@69 870 for(int i=0; i<totalNofPages; ++i)
joachim99@69 871 {
joachim99@69 872 pageList.push_back(i+1);
joachim99@69 873 }
joachim99@69 874 }
joachim99@80 875 else if ( printer.printRange()==QPrinter::PageRange )
joachim99@80 876 {
joachim99@80 877 pageList.clear();
joachim99@80 878 for(int i=printer.fromPage(); i<=printer.toPage(); ++i)
joachim99@80 879 {
joachim99@80 880 pageList.push_back(i);
joachim99@80 881 }
joachim99@80 882 }
joachim99@69 883
joachim99@80 884 if ( printer.printRange()==QPrinter::Selection )
joachim99@69 885 #else
joachim99@69 886 if ( !pageList.empty() && pageList.front()==9999 )
joachim99@69 887 #endif
joachim99@69 888 {
joachim99@69 889 bPrintSelection = true;
joachim99@69 890 if ( firstSelectionD3LIdx >=0 )
joachim99@69 891 {
joachim99@69 892 line = m_pDiffTextWindow1->convertDiff3LineIdxToLine( firstSelectionD3LIdx );
joachim99@69 893 selectionEndLine = m_pDiffTextWindow1->convertDiff3LineIdxToLine( lastSelectionD3LIdx+1 );
joachim99@69 894 totalNofPages = (selectionEndLine-line+linesPerPage-1) / linesPerPage;
joachim99@69 895 }
joachim99@69 896 }
joachim99@69 897
joachim99@69 898 int page = 1;
joachim99@69 899
joachim99@75 900 QList<int>::iterator pageListIt = pageList.begin();
joachim99@69 901 for(;;)
joachim99@69 902 {
joachim99@69 903 if (!bPrintSelection)
joachim99@69 904 {
joachim99@69 905 if (pageListIt==pageList.end())
joachim99@69 906 break;
joachim99@69 907 page = *pageListIt;
joachim99@69 908 line = (page - 1) * linesPerPage;
joachim99@69 909 if (page==10000) // This means "Print the current page"
joachim99@69 910 {
joachim99@69 911 bPrintCurrentPage=true;
joachim99@69 912 // Detect the first visible line in the window.
joachim99@69 913 line = m_pDiffTextWindow1->convertDiff3LineIdxToLine( currentFirstD3LIdx );
joachim99@69 914 }
joachim99@69 915 }
joachim99@69 916 else
joachim99@69 917 {
joachim99@69 918 if ( line>=selectionEndLine )
joachim99@69 919 {
joachim99@69 920 break;
joachim99@69 921 }
joachim99@69 922 else
joachim99@69 923 {
joachim99@69 924 if ( selectionEndLine-line < linesPerPage )
joachim99@69 925 linesPerPage=selectionEndLine-line;
joachim99@69 926 }
joachim99@69 927 }
joachim99@69 928 if (line>=0 && line<totalNofLines )
joachim99@69 929 {
joachim99@69 930
joachim99@69 931 if (bFirstPrintedPage)
joachim99@69 932 printer.newPage();
joachim99@69 933
joachim99@69 934 painter.setClipping(true);
joachim99@69 935
joachim99@69 936 painter.setPen( m_pOptionDialog->m_colorA );
joachim99@69 937 QString headerText1 = m_sd1.getAliasName() + ", "+topLineText+": " + QString::number(m_pDiffTextWindow1->calcTopLineInFile(line)+1);
joachim99@69 938 printDiffTextWindow( painter, view1, headerText1, m_pDiffTextWindow1, line, linesPerPage, m_pOptionDialog->m_fgColor );
joachim99@69 939
joachim99@69 940 painter.setPen( m_pOptionDialog->m_colorB );
joachim99@69 941 QString headerText2 = m_sd2.getAliasName() + ", "+topLineText+": " + QString::number(m_pDiffTextWindow2->calcTopLineInFile(line)+1);
joachim99@69 942 printDiffTextWindow( painter, view2, headerText2, m_pDiffTextWindow2, line, linesPerPage, m_pOptionDialog->m_fgColor );
joachim99@69 943
joachim99@69 944 if ( m_bTripleDiff && m_pDiffTextWindow3 )
joachim99@69 945 {
joachim99@69 946 painter.setPen( m_pOptionDialog->m_colorC );
joachim99@69 947 QString headerText3 = m_sd3.getAliasName() + ", "+topLineText+": " + QString::number(m_pDiffTextWindow3->calcTopLineInFile(line)+1);
joachim99@69 948 printDiffTextWindow( painter, view3, headerText3, m_pDiffTextWindow3, line, linesPerPage, m_pOptionDialog->m_fgColor );
joachim99@69 949 }
joachim99@69 950 painter.setClipping(false);
joachim99@69 951
joachim99@69 952 painter.setPen( m_pOptionDialog->m_fgColor );
joachim99@69 953 painter.drawLine( 0, view.bottom()+3, view.width(), view.bottom()+3 );
joachim99@69 954 QString s = bPrintCurrentPage ? QString("")
joachim99@69 955 : QString::number( page ) + "/" + QString::number(totalNofPages);
joachim99@69 956 if ( bPrintSelection ) s+=" (" + i18n("Selection") + ")";
joachim99@69 957 painter.drawText( (view.right() - painter.fontMetrics().width( s ))/2,
joachim99@69 958 view.bottom() + painter.fontMetrics().ascent() + 5, s );
joachim99@69 959
joachim99@69 960 bFirstPrintedPage = true;
joachim99@69 961 }
joachim99@69 962
joachim99@69 963 if ( bPrintSelection )
joachim99@69 964 {
joachim99@69 965 line+=linesPerPage;
joachim99@69 966 ++page;
joachim99@69 967 }
joachim99@69 968 else
joachim99@69 969 {
joachim99@69 970 ++pageListIt;
joachim99@69 971 }
joachim99@69 972 }
joachim99@69 973
joachim99@69 974 painter.end();
joachim99@69 975
joachim99@69 976 if ( m_pOptionDialog->m_bWordWrap )
joachim99@69 977 {
joachim99@69 978 recalcWordWrap();
joachim99@69 979 m_pDiffVScrollBar->setValue( m_pDiffTextWindow1->convertDiff3LineIdxToLine( currentFirstD3LIdx ) );
joachim99@69 980 }
joachim99@69 981
joachim99@69 982 slotStatusMsg( i18n( "Printing completed." ) );
joachim99@69 983 }
joachim99@69 984 else
joachim99@69 985 {
joachim99@69 986 slotStatusMsg( i18n( "Printing aborted." ) );
joachim99@69 987 }
joachim99@95 988 #endif
joachim99@69 989 }
joachim99@69 990
joachim99@8 991 void KDiff3App::slotFileQuit()
joachim99@8 992 {
joachim99@8 993 slotStatusMsg(i18n("Exiting..."));
joachim99@8 994
joachim99@8 995 if( !queryClose() )
joachim99@8 996 return; // Don't quit
joachim99@8 997
joachim99@80 998 KApplication::exit( isFileSaved() || isDirComparison() ? 0 : 1 );
joachim99@8 999 }
joachim99@8 1000
joachim99@8 1001
joachim99@8 1002
joachim99@8 1003 void KDiff3App::slotViewToolBar()
joachim99@8 1004 {
joachim99@80 1005 assert( viewToolBar != 0 );
joachim99@8 1006 slotStatusMsg(i18n("Toggling toolbar..."));
joachim99@69 1007 m_pOptionDialog->m_bShowToolBar = viewToolBar->isChecked();
joachim99@8 1008 ///////////////////////////////////////////////////////////////////
joachim99@8 1009 // turn Toolbar on or off
joachim99@80 1010 if ( toolBar(MAIN_TOOLBAR_NAME) !=0 )
joachim99@8 1011 {
joachim99@69 1012 if(!m_pOptionDialog->m_bShowToolBar)
joachim99@8 1013 {
joachim99@80 1014 toolBar(MAIN_TOOLBAR_NAME)->hide();
joachim99@8 1015 }
joachim99@8 1016 else
joachim99@8 1017 {
joachim99@80 1018 toolBar(MAIN_TOOLBAR_NAME)->show();
joachim99@8 1019 }
joachim99@8 1020 }
joachim99@8 1021
joachim99@8 1022 slotStatusMsg(i18n("Ready."));
joachim99@8 1023 }
joachim99@8 1024
joachim99@8 1025 void KDiff3App::slotViewStatusBar()
joachim99@8 1026 {
joachim99@8 1027 slotStatusMsg(i18n("Toggle the statusbar..."));
joachim99@69 1028 m_pOptionDialog->m_bShowStatusBar = viewStatusBar->isChecked();
joachim99@8 1029 ///////////////////////////////////////////////////////////////////
joachim99@8 1030 //turn Statusbar on or off
joachim99@8 1031 if (statusBar() !=0 )
joachim99@8 1032 {
joachim99@8 1033 if(!viewStatusBar->isChecked())
joachim99@8 1034 {
joachim99@8 1035 statusBar()->hide();
joachim99@8 1036 }
joachim99@8 1037 else
joachim99@8 1038 {
joachim99@8 1039 statusBar()->show();
joachim99@8 1040 }
joachim99@8 1041 }
joachim99@8 1042
joachim99@8 1043 slotStatusMsg(i18n("Ready."));
joachim99@8 1044 }
joachim99@8 1045
joachim99@8 1046
joachim99@8 1047 void KDiff3App::slotStatusMsg(const QString &text)
joachim99@8 1048 {
joachim99@8 1049 ///////////////////////////////////////////////////////////////////
joachim99@8 1050 // change status message permanently
joachim99@8 1051 if (statusBar() !=0 )
joachim99@8 1052 {
joachim99@75 1053 statusBar()->clearMessage();
joachim99@75 1054 statusBar()->showMessage( text );
joachim99@8 1055 }
joachim99@8 1056 }
joachim99@8 1057
joachim99@8 1058
joachim99@8 1059
joachim99@8 1060
joachim99@70 1061 //#include "kdiff3.moc"