annotate kdiff3/src/kdiff3.cpp @ 60:4732f709a8cb

*** empty log message ***
author joachim99
date Sun, 07 Mar 2004 10:08:07 +0000
parents 8af4bb9d9a5a
children efe33e938730
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@58 5 copyright : (C) 2002-2004 by Joachim Eibl
joachim99@8 6 email : joachim.eibl@gmx.de
joachim99@8 7 ***************************************************************************/
joachim99@8 8
joachim99@8 9 /***************************************************************************
joachim99@8 10 * *
joachim99@8 11 * This program is free software; you can redistribute it and/or modify *
joachim99@8 12 * it under the terms of the GNU General Public License as published by *
joachim99@8 13 * the Free Software Foundation; either version 2 of the License, or *
joachim99@8 14 * (at your option) any later version. *
joachim99@8 15 * *
joachim99@8 16 ***************************************************************************/
joachim99@8 17
joachim99@8 18 #include "diff.h"
joachim99@8 19
joachim99@8 20 #include <iostream>
joachim99@8 21
joachim99@8 22 // include files for QT
joachim99@8 23 #include <qdir.h>
joachim99@8 24 #include <qprinter.h>
joachim99@8 25 #include <qpainter.h>
joachim99@8 26 #include <qsplitter.h>
joachim99@8 27 #include <qlayout.h>
joachim99@8 28 #include <qlineedit.h>
joachim99@8 29 #include <qcheckbox.h>
joachim99@8 30 #include <qpushbutton.h>
joachim99@8 31 #include <qpopupmenu.h>
joachim99@8 32 #include <qlabel.h>
joachim99@8 33
joachim99@8 34 // include files for KDE
joachim99@8 35 #include <kiconloader.h>
joachim99@8 36 #include <kmessagebox.h>
joachim99@8 37 #include <kfiledialog.h>
joachim99@8 38 #include <kmenubar.h>
joachim99@8 39 #include <kstatusbar.h>
joachim99@8 40 #include <klocale.h>
joachim99@8 41 #include <kconfig.h>
joachim99@8 42 #include <kstdaction.h>
joachim99@8 43 #include <kcmdlineargs.h>
joachim99@8 44 //#include <kkeydialog.h>
joachim99@8 45
joachim99@8 46 // application specific includes
joachim99@8 47 #include "kdiff3.h"
joachim99@8 48 #include "optiondialog.h"
joachim99@8 49 #include "fileaccess.h"
joachim99@8 50 #include "kdiff3_part.h"
joachim99@8 51 #include "directorymergewindow.h"
joachim99@8 52
joachim99@8 53 #define ID_STATUS_MSG 1
joachim99@8 54
joachim99@8 55 KActionCollection* KDiff3App::actionCollection()
joachim99@8 56 {
joachim99@8 57 if ( m_pKDiff3Shell==0 )
joachim99@8 58 return m_pKDiff3Part->actionCollection();
joachim99@8 59 else
joachim99@8 60 return m_pKDiff3Shell->actionCollection();
joachim99@8 61 }
joachim99@8 62
joachim99@8 63 KStatusBar* KDiff3App::statusBar()
joachim99@8 64 {
joachim99@8 65 if ( m_pKDiff3Shell==0 )
joachim99@8 66 return 0;
joachim99@8 67 else
joachim99@8 68 return m_pKDiff3Shell->statusBar();
joachim99@8 69 }
joachim99@8 70
joachim99@8 71 KToolBar* KDiff3App::toolBar(const char* toolBarId )
joachim99@8 72 {
joachim99@8 73 if ( m_pKDiff3Shell==0 )
joachim99@8 74 return 0;
joachim99@8 75 else
joachim99@8 76 return m_pKDiff3Shell->toolBar( toolBarId );
joachim99@8 77 }
joachim99@8 78
joachim99@8 79 bool KDiff3App::isPart()
joachim99@8 80 {
joachim99@8 81 return m_pKDiff3Shell==0;
joachim99@8 82 }
joachim99@8 83
joachim99@8 84
joachim99@8 85 KDiff3App::KDiff3App(QWidget* pParent, const char* name, KDiff3Part* pKDiff3Part )
joachim99@8 86 :QSplitter(pParent, name) //previously KMainWindow
joachim99@8 87 {
joachim99@8 88 m_pKDiff3Part = pKDiff3Part;
joachim99@8 89 m_pKDiff3Shell = dynamic_cast<KParts::MainWindow*>(pParent);
joachim99@8 90
joachim99@8 91 setCaption( "KDiff3" );
joachim99@8 92
joachim99@8 93 m_pMainSplitter = 0;
joachim99@8 94 m_pDirectoryMergeWindow = 0;
joachim99@8 95 m_pCornerWidget = 0;
joachim99@8 96 m_pMainWidget = 0;
joachim99@8 97 m_pDiffTextWindow1 = 0;
joachim99@8 98 m_pDiffTextWindow2 = 0;
joachim99@8 99 m_pDiffTextWindow3 = 0;
joachim99@8 100 m_pDiffWindowSplitter = 0;
joachim99@8 101 m_pOverview = 0;
joachim99@8 102 m_bTripleDiff = false;
joachim99@8 103 m_pMergeResultWindow = 0;
joachim99@8 104 m_pMergeWindowFrame = 0;
joachim99@8 105 m_bOutputModified = false;
joachim99@8 106 m_bTimerBlock = false;
joachim99@8 107
joachim99@51 108 // Needed before any file operations via FileAccess happen.
joachim99@51 109 g_pProgressDialog = new ProgressDialog(this);
joachim99@51 110
joachim99@58 111 // All default values must be set before calling readOptions().
joachim99@58 112 m_pOptionDialog = new OptionDialog( m_pKDiff3Shell!=0, this );
joachim99@58 113 connect( m_pOptionDialog, SIGNAL(applyClicked()), this, SLOT(slotRefresh()) );
joachim99@58 114
joachim99@58 115 m_pOptionDialog->readOptions( isPart() ? m_pKDiff3Part->instance()->config() : kapp->config() );
joachim99@58 116
joachim99@58 117 m_sd1.setOptionDialog(m_pOptionDialog);
joachim99@58 118 m_sd2.setOptionDialog(m_pOptionDialog);
joachim99@58 119 m_sd3.setOptionDialog(m_pOptionDialog);
joachim99@58 120
joachim99@8 121 // Option handling: Only when pParent==0 (no parent)
joachim99@8 122 KCmdLineArgs *args = isPart() ? 0 : KCmdLineArgs::parsedArgs();
joachim99@8 123
joachim99@8 124 if (args!=0)
joachim99@8 125 {
joachim99@8 126 m_outputFilename = args->getOption("output");
joachim99@8 127 if ( m_outputFilename.isEmpty() )
joachim99@8 128 m_outputFilename = args->getOption("out");
joachim99@8 129 }
joachim99@8 130
joachim99@8 131 m_bAuto = args!=0 && args->isSet("auto");
joachim99@8 132 if ( m_bAuto && m_outputFilename.isEmpty() )
joachim99@8 133 {
joachim99@8 134 //KMessageBox::information(this, i18n("Option --auto used, but no output file specified."));
joachim99@8 135 std::cerr << i18n("Option --auto used, but no output file specified.").ascii()<<std::endl;
joachim99@8 136 m_bAuto = false;
joachim99@8 137 }
joachim99@8 138
joachim99@8 139 if ( m_outputFilename.isEmpty() && args!=0 && args->isSet("merge") )
joachim99@8 140 {
joachim99@8 141 m_outputFilename = "unnamed.txt";
joachim99@8 142 m_bDefaultFilename = true;
joachim99@8 143 }
joachim99@8 144 else
joachim99@8 145 m_bDefaultFilename = false;
joachim99@8 146
joachim99@8 147 g_bAutoSolve = args!=0 && !args->isSet("qall"); // Note that this is effective only once.
joachim99@8 148
joachim99@8 149 if ( args!=0 )
joachim99@8 150 {
joachim99@8 151 m_sd1.setFilename( args->getOption("base") );
joachim99@8 152 if ( m_sd1.isEmpty() )
joachim99@8 153 {
joachim99@51 154 if ( args->count() > 0 ) m_sd1.setFilename( args->url(0).url() ); // args->arg(0)
joachim99@51 155 if ( args->count() > 1 ) m_sd2.setFilename( args->url(1).url() );
joachim99@51 156 if ( args->count() > 2 ) m_sd3.setFilename( args->url(2).url() );
joachim99@8 157 }
joachim99@8 158 else
joachim99@8 159 {
joachim99@51 160 if ( args->count() > 0 ) m_sd2.setFilename( args->url(0).url() );
joachim99@51 161 if ( args->count() > 1 ) m_sd3.setFilename( args->url(1).url() );
joachim99@8 162 }
joachim99@8 163
joachim99@8 164 QCStringList aliasList = args->getOptionList("fname");
joachim99@8 165 QCStringList::Iterator ali = aliasList.begin();
joachim99@8 166 if ( ali != aliasList.end() ) { m_sd1.setAliasName(*ali); ++ali; }
joachim99@8 167 if ( ali != aliasList.end() ) { m_sd2.setAliasName(*ali); ++ali; }
joachim99@8 168 if ( ali != aliasList.end() ) { m_sd3.setAliasName(*ali); ++ali; }
joachim99@8 169 }
joachim99@8 170 ///////////////////////////////////////////////////////////////////
joachim99@8 171 // call inits to invoke all other construction parts
joachim99@8 172 initActions(actionCollection());
joachim99@8 173 initStatusBar();
joachim99@8 174
joachim99@8 175 m_pFindDialog = new FindDialog( this );
joachim99@8 176 connect( m_pFindDialog, SIGNAL(findNext()), this, SLOT(slotEditFindNext()));
joachim99@8 177
joachim99@8 178 readOptions( isPart() ? m_pKDiff3Part->instance()->config() : kapp->config() );
joachim99@58 179
joachim99@51 180 autoAdvance->setChecked( m_pOptionDialog->m_bAutoAdvance );
joachim99@51 181 showWhiteSpaceCharacters->setChecked( m_pOptionDialog->m_bShowWhiteSpaceCharacters );
joachim99@51 182 showWhiteSpace->setChecked( m_pOptionDialog->m_bShowWhiteSpace );
joachim99@51 183 showWhiteSpaceCharacters->setEnabled( m_pOptionDialog->m_bShowWhiteSpace );
joachim99@51 184 showLineNumbers->setChecked( m_pOptionDialog->m_bShowLineNumbers );
joachim99@51 185
joachim99@8 186 m_pMainSplitter = this; //new QSplitter(this);
joachim99@8 187 m_pMainSplitter->setOrientation( Vertical );
joachim99@8 188 // setCentralWidget( m_pMainSplitter );
joachim99@8 189 m_pDirectoryMergeSplitter = new QSplitter( m_pMainSplitter );
joachim99@8 190 m_pDirectoryMergeSplitter->setOrientation( Horizontal );
joachim99@8 191 m_pDirectoryMergeWindow = new DirectoryMergeWindow( m_pDirectoryMergeSplitter, m_pOptionDialog,
joachim99@8 192 KApplication::kApplication()->iconLoader() );
joachim99@8 193 m_pDirectoryMergeInfo = new DirectoryMergeInfo( m_pDirectoryMergeSplitter );
joachim99@8 194 m_pDirectoryMergeWindow->setDirectoryMergeInfo( m_pDirectoryMergeInfo );
joachim99@8 195 connect( m_pDirectoryMergeWindow, SIGNAL(startDiffMerge(QString,QString,QString,QString,QString,QString,QString)),
joachim99@8 196 this, SLOT( slotFileOpen2(QString,QString,QString,QString,QString,QString,QString)));
joachim99@8 197 connect( m_pDirectoryMergeWindow, SIGNAL(selectionChanged()), this, SLOT(slotUpdateAvailabilities()));
joachim99@8 198 connect( m_pDirectoryMergeWindow, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(slotUpdateAvailabilities()));
joachim99@8 199 connect( m_pDirectoryMergeWindow, SIGNAL(checkIfCanContinue(bool*)), this, SLOT(slotCheckIfCanContinue(bool*)));
joachim99@8 200 connect( m_pDirectoryMergeWindow, SIGNAL(updateAvailabilities()), this, SLOT(slotUpdateAvailabilities()));
joachim99@8 201
joachim99@51 202 m_pDirectoryMergeWindow->initDirectoryMergeActions( this, actionCollection() );
joachim99@8 203
joachim99@8 204 if ( args!=0 ) args->clear(); // Free up some memory.
joachim99@8 205
joachim99@8 206 if (m_pKDiff3Shell==0)
joachim99@8 207 {
joachim99@8 208 completeInit();
joachim99@8 209 }
joachim99@8 210 }
joachim99@8 211
joachim99@8 212
joachim99@8 213 void KDiff3App::completeInit()
joachim99@8 214 {
joachim99@8 215 if (m_pKDiff3Shell!=0)
joachim99@8 216 {
joachim99@8 217 QSize size=kapp->config()->readSizeEntry("Geometry");
joachim99@8 218 QPoint pos=kapp->config()->readPointEntry("Position");
joachim99@8 219 if(!size.isEmpty())
joachim99@8 220 {
joachim99@8 221 m_pKDiff3Shell->resize( size );
joachim99@8 222 m_pKDiff3Shell->move( pos );
joachim99@8 223 }
joachim99@8 224 }
joachim99@8 225
joachim99@8 226 m_bDirCompare = improveFilenames();
joachim99@8 227 if ( m_bAuto && m_bDirCompare )
joachim99@8 228 {
joachim99@8 229 std::cerr << i18n("Option --auto ignored for directory comparison.").ascii()<<std::endl;
joachim99@8 230 m_bAuto = false;
joachim99@8 231 }
joachim99@8 232 if (!m_bDirCompare)
joachim99@8 233 {
joachim99@8 234 m_pDirectoryMergeSplitter->hide();
joachim99@8 235
joachim99@8 236 init( m_bAuto );
joachim99@8 237 if ( m_bAuto )
joachim99@8 238 {
joachim99@58 239 SourceData* pSD=0;
joachim99@8 240 if ( m_sd3.isEmpty() )
joachim99@8 241 {
joachim99@58 242 if ( m_totalDiffStatus.bBinaryAEqB ){ pSD = &m_sd1; }
joachim99@8 243 }
joachim99@8 244 else
joachim99@8 245 {
joachim99@58 246 if ( m_totalDiffStatus.bBinaryBEqC ){ pSD = &m_sd3; } // B==C (assume A is old)
joachim99@58 247 else if ( m_totalDiffStatus.bBinaryAEqB ){ pSD = &m_sd3; } // assuming C has changed
joachim99@58 248 else if ( m_totalDiffStatus.bBinaryAEqC ){ pSD = &m_sd2; } // assuming B has changed
joachim99@8 249 }
joachim99@8 250
joachim99@58 251 if ( pSD!=0 )
joachim99@8 252 {
joachim99@8 253 // Save this file directly, not via the merge result window.
joachim99@8 254 bool bSuccess = false;
joachim99@58 255 FileAccess fa( m_outputFilename );
joachim99@58 256 if ( m_pOptionDialog->m_bDmCreateBakFiles && fa.exists() )
joachim99@8 257 {
joachim99@8 258 QString newName = m_outputFilename + ".orig";
joachim99@58 259 if ( FileAccess::exists( newName ) ) FileAccess::removeFile( newName );
joachim99@58 260 if ( !FileAccess::exists( newName ) ) fa.rename( newName );
joachim99@8 261 }
joachim99@58 262
joachim99@58 263 bSuccess = pSD->saveNormalDataAs( m_outputFilename );
joachim99@8 264 if ( bSuccess ) ::exit(0);
joachim99@8 265 else KMessageBox::error( this, i18n("Saving failed.") );
joachim99@8 266 }
joachim99@8 267 else if ( m_pMergeResultWindow->getNrOfUnsolvedConflicts() == 0 )
joachim99@8 268 {
joachim99@8 269 bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename );
joachim99@8 270 if ( bSuccess ) ::exit(0);
joachim99@8 271 }
joachim99@8 272 }
joachim99@8 273 }
joachim99@8 274
joachim99@8 275 if (statusBar() !=0 )
joachim99@8 276 statusBar()->setSizeGripEnabled(false);
joachim99@8 277
joachim99@8 278 slotClipboardChanged(); // For initialisation.
joachim99@8 279
joachim99@8 280 slotUpdateAvailabilities();
joachim99@8 281
joachim99@8 282 if ( ! m_bDirCompare && m_pKDiff3Shell!=0 )
joachim99@8 283 {
joachim99@8 284 bool bFileOpenError = false;
joachim99@58 285 if ( ! m_sd1.isEmpty() && !m_sd1.hasData() ||
joachim99@58 286 ! m_sd2.isEmpty() && !m_sd2.hasData() ||
joachim99@58 287 ! m_sd3.isEmpty() && !m_sd3.hasData() )
joachim99@8 288 {
joachim99@8 289 QString text( i18n("Opening of these files failed:") );
joachim99@8 290 text += "\n\n";
joachim99@58 291 if ( ! m_sd1.isEmpty() && !m_sd1.hasData() )
joachim99@8 292 text += " - " + m_sd1.getAliasName() + "\n";
joachim99@58 293 if ( ! m_sd2.isEmpty() && !m_sd2.hasData() )
joachim99@8 294 text += " - " + m_sd2.getAliasName() + "\n";
joachim99@58 295 if ( ! m_sd3.isEmpty() && !m_sd3.hasData() )
joachim99@8 296 text += " - " + m_sd3.getAliasName() + "\n";
joachim99@8 297
joachim99@51 298 KMessageBox::sorry( this, text, i18n("File Open Error") );
joachim99@8 299 bFileOpenError = true;
joachim99@8 300 }
joachim99@8 301
joachim99@8 302 if ( m_sd1.isEmpty() || m_sd2.isEmpty() || bFileOpenError )
joachim99@8 303 slotFileOpen();
joachim99@8 304 }
joachim99@8 305 }
joachim99@8 306
joachim99@8 307 KDiff3App::~KDiff3App()
joachim99@8 308 {
joachim99@8 309
joachim99@8 310 }
joachim99@8 311
joachim99@8 312 void KDiff3App::initActions( KActionCollection* ac )
joachim99@8 313 {
joachim99@8 314 if (ac==0) KMessageBox::error(0, "actionCollection==0");
joachim99@8 315
joachim99@8 316 fileOpen = KStdAction::open(this, SLOT(slotFileOpen()), ac);
joachim99@51 317 fileOpen->setStatusText(i18n("Opens documents for comparison..."));
joachim99@8 318 fileSave = KStdAction::save(this, SLOT(slotFileSave()), ac);
joachim99@8 319 fileSave->setStatusText(i18n("Saves the merge result. All conflicts must be solved!"));
joachim99@8 320 fileSaveAs = KStdAction::saveAs(this, SLOT(slotFileSaveAs()), ac);
joachim99@8 321 fileSaveAs->setStatusText(i18n("Saves the current document as..."));
joachim99@8 322 fileQuit = KStdAction::quit(this, SLOT(slotFileQuit()), ac);
joachim99@8 323 fileQuit->setStatusText(i18n("Quits the application"));
joachim99@8 324 editCut = KStdAction::cut(this, SLOT(slotEditCut()), ac);
joachim99@8 325 editCut->setStatusText(i18n("Cuts the selected section and puts it to the clipboard"));
joachim99@8 326 editCopy = KStdAction::copy(this, SLOT(slotEditCopy()), ac);
joachim99@8 327 editCopy->setStatusText(i18n("Copies the selected section to the clipboard"));
joachim99@8 328 editPaste = KStdAction::paste(this, SLOT(slotEditPaste()), ac);
joachim99@8 329 editPaste->setStatusText(i18n("Pastes the clipboard contents to actual position"));
joachim99@8 330 editFind = KStdAction::find(this, SLOT(slotEditFind()), ac);
joachim99@8 331 editFind->setStatusText(i18n("Search for a string"));
joachim99@8 332 editFindNext = KStdAction::findNext(this, SLOT(slotEditFindNext()), ac);
joachim99@8 333 editFindNext->setStatusText(i18n("Search again for the string"));
joachim99@8 334 viewToolBar = KStdAction::showToolbar(this, SLOT(slotViewToolBar()), ac);
joachim99@8 335 viewToolBar->setStatusText(i18n("Enables/disables the toolbar"));
joachim99@8 336 viewStatusBar = KStdAction::showStatusbar(this, SLOT(slotViewStatusBar()), ac);
joachim99@8 337 viewStatusBar->setStatusText(i18n("Enables/disables the statusbar"));
joachim99@8 338 KStdAction::keyBindings(this, SLOT(slotConfigureKeys()), ac);
joachim99@8 339 KAction* pAction = KStdAction::preferences(this, SLOT(slotConfigure()), ac );
joachim99@8 340 if ( isPart() )
joachim99@51 341 pAction->setText(i18n("Configure KDiff3..."));
joachim99@8 342
joachim99@8 343
joachim99@8 344 #include "xpm/downend.xpm"
joachim99@8 345 #include "xpm/currentpos.xpm"
joachim99@8 346 #include "xpm/down1arrow.xpm"
joachim99@8 347 #include "xpm/down2arrow.xpm"
joachim99@8 348 #include "xpm/upend.xpm"
joachim99@8 349 #include "xpm/up1arrow.xpm"
joachim99@8 350 #include "xpm/up2arrow.xpm"
joachim99@8 351 #include "xpm/prevunsolved.xpm"
joachim99@8 352 #include "xpm/nextunsolved.xpm"
joachim99@8 353 #include "xpm/iconA.xpm"
joachim99@8 354 #include "xpm/iconB.xpm"
joachim99@8 355 #include "xpm/iconC.xpm"
joachim99@8 356 #include "xpm/autoadvance.xpm"
joachim99@8 357 #include "xpm/showwhitespace.xpm"
joachim99@58 358 #include "xpm/showwhitespacechars.xpm"
joachim99@8 359 #include "xpm/showlinenumbers.xpm"
joachim99@8 360 //#include "reload.xpm"
joachim99@8 361
joachim99@8 362 goCurrent = new KAction(i18n("Go to Current Delta"), QIconSet(QPixmap(currentpos)), CTRL+Key_Space, this, SLOT(slotGoCurrent()), ac, "go_current");
joachim99@8 363 goTop = new KAction(i18n("Go to First Delta"), QIconSet(QPixmap(upend)), 0, this, SLOT(slotGoTop()), ac, "go_top");
joachim99@8 364 goBottom = new KAction(i18n("Go to Last Delta"), QIconSet(QPixmap(downend)), 0, this, SLOT(slotGoBottom()), ac, "go_bottom");
joachim99@51 365 goPrevDelta = new KAction(i18n("Go to Previous Delta"), QIconSet(QPixmap(up1arrow)), CTRL+Key_Up, this, SLOT(slotGoPrevDelta()), ac, "go_prev_delta");
joachim99@51 366 goNextDelta = new KAction(i18n("Go to Next Delta"), QIconSet(QPixmap(down1arrow)), CTRL+Key_Down, this, SLOT(slotGoNextDelta()), ac, "go_next_delta");
joachim99@8 367 goPrevConflict = new KAction(i18n("Go to Previous Conflict"), QIconSet(QPixmap(up2arrow)), CTRL+Key_PageUp, this, SLOT(slotGoPrevConflict()), ac, "go_prev_conflict");
joachim99@8 368 goNextConflict = new KAction(i18n("Go to Next Conflict"), QIconSet(QPixmap(down2arrow)), CTRL+Key_PageDown, this, SLOT(slotGoNextConflict()), ac, "go_next_conflict");
joachim99@8 369 goPrevUnsolvedConflict = new KAction(i18n("Go to Previous Unsolved Conflict"), QIconSet(QPixmap(prevunsolved)), 0, this, SLOT(slotGoPrevUnsolvedConflict()), ac, "go_prev_unsolved_conflict");
joachim99@8 370 goNextUnsolvedConflict = new KAction(i18n("Go to Next Unsolved Conflict"), QIconSet(QPixmap(nextunsolved)), 0, this, SLOT(slotGoNextUnsolvedConflict()), ac, "go_next_unsolved_conflict");
joachim99@51 371 chooseA = new KToggleAction(i18n("Select Line(s) From A"), QIconSet(QPixmap(iconA)), CTRL+Key_1, this, SLOT(slotChooseA()), ac, "merge_choose_a");
joachim99@51 372 chooseB = new KToggleAction(i18n("Select Line(s) From B"), QIconSet(QPixmap(iconB)), CTRL+Key_2, this, SLOT(slotChooseB()), ac, "merge_choose_b");
joachim99@51 373 chooseC = new KToggleAction(i18n("Select Line(s) From C"), QIconSet(QPixmap(iconC)), CTRL+Key_3, this, SLOT(slotChooseC()), ac, "merge_choose_c");
joachim99@51 374 autoAdvance = new KToggleAction(i18n("Automatically Go to Next Unsolved Conflict After Source Selection"), QIconSet(QPixmap(autoadvance)), 0, this, SLOT(slotAutoAdvanceToggled()), ac, "merge_autoadvance");
joachim99@51 375
joachim99@58 376 showWhiteSpaceCharacters = new KToggleAction(i18n("Show Space && Tabulator Characters for Differences"), QIconSet(QPixmap(showwhitespacechars)), 0, this, SLOT(slotShowWhiteSpaceToggled()), ac, "merge_show_whitespace_characters");
joachim99@58 377 showWhiteSpace = new KToggleAction(i18n("Show White Space"), QIconSet(QPixmap(showwhitespace)), 0, this, SLOT(slotShowWhiteSpaceToggled()), ac, "merge_show_whitespace");
joachim99@51 378
joachim99@51 379 showLineNumbers = new KToggleAction(i18n("Show Line Numbers"), QIconSet(QPixmap(showlinenumbers)), 0, this, SLOT(slotShowLineNumbersToggled()), ac, "merge_showlinenumbers");
joachim99@8 380 chooseAEverywhere = new KAction(i18n("Choose A Everywhere"), CTRL+SHIFT+Key_1, this, SLOT(slotChooseAEverywhere()), ac, "merge_choose_a_everywhere");
joachim99@8 381 chooseBEverywhere = new KAction(i18n("Choose B Everywhere"), CTRL+SHIFT+Key_2, this, SLOT(slotChooseBEverywhere()), ac, "merge_choose_b_everywhere");
joachim99@8 382 chooseCEverywhere = new KAction(i18n("Choose C Everywhere"), CTRL+SHIFT+Key_3, this, SLOT(slotChooseCEverywhere()), ac, "merge_choose_c_everywhere");
joachim99@51 383 chooseAForUnsolvedConflicts = new KAction(i18n("Choose A For All Unsolved Conflicts"), 0, this, SLOT(slotChooseAForUnsolvedConflicts()), ac, "merge_choose_a_for_unsolved_conflicts");
joachim99@51 384 chooseBForUnsolvedConflicts = new KAction(i18n("Choose B For All Unsolved Conflicts"), 0, this, SLOT(slotChooseBForUnsolvedConflicts()), ac, "merge_choose_b_for_unsolved_conflicts");
joachim99@51 385 chooseCForUnsolvedConflicts = new KAction(i18n("Choose C For All Unsolved Conflicts"), 0, this, SLOT(slotChooseCForUnsolvedConflicts()), ac, "merge_choose_c_for_unsolved_conflicts");
joachim99@51 386 chooseAForUnsolvedWhiteSpaceConflicts = new KAction(i18n("Choose A For All Unsolved Whitespace Conflicts"), 0, this, SLOT(slotChooseAForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_a_for_unsolved_whitespace_conflicts");
joachim99@51 387 chooseBForUnsolvedWhiteSpaceConflicts = new KAction(i18n("Choose B For All Unsolved Whitespace Conflicts"), 0, this, SLOT(slotChooseBForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_b_for_unsolved_whitespace_conflicts");
joachim99@51 388 chooseCForUnsolvedWhiteSpaceConflicts = new KAction(i18n("Choose C For All Unsolved Whitespace Conflicts"), 0, this, SLOT(slotChooseCForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_c_for_unsolved_whitespace_conflicts");
joachim99@51 389 autoSolve = new KAction(i18n("Automatically Solve Simple Conflicts"), 0, this, SLOT(slotAutoSolve()), ac, "merge_autosolve");
joachim99@51 390 unsolve = new KAction(i18n("Set Deltas to Conflicts"), 0, this, SLOT(slotUnsolve()), actionCollection(), "merge_autounsolve");
joachim99@51 391 fileReload = new KAction(i18n("Reload"), /*QIconSet(QPixmap(reloadIcon)),*/ Key_F5, this, SLOT(slotReload()), ac, "file_reload");
joachim99@8 392 showWindowA = new KToggleAction(i18n("Show Window A"), 0, this, SLOT(slotShowWindowAToggled()), ac, "win_show_a");
joachim99@8 393 showWindowB = new KToggleAction(i18n("Show Window B"), 0, this, SLOT(slotShowWindowBToggled()), ac, "win_show_b");
joachim99@8 394 showWindowC = new KToggleAction(i18n("Show Window C"), 0, this, SLOT(slotShowWindowCToggled()), ac, "win_show_c");
joachim99@8 395 winFocusNext = new KAction(i18n("Focus Next Window"), ALT+Key_Right, this, SLOT(slotWinFocusNext()), ac, "win_focus_next");
joachim99@26 396 #ifdef _WIN32
joachim99@26 397 new KAction(i18n("Focus Next Window"), CTRL+Key_Tab, this, SLOT(slotWinFocusNext()), ac, "win_focus_next", false, false);
joachim99@26 398 #endif
joachim99@8 399 winFocusPrev = new KAction(i18n("Focus Prev Window"), ALT+Key_Left, this, SLOT(slotWinFocusPrev()), ac, "win_focus_prev");
joachim99@8 400 winToggleSplitOrientation = new KAction(i18n("Toggle Split Orientation"), 0, this, SLOT(slotWinToggleSplitterOrientation()), ac, "win_toggle_split_orientation");
joachim99@8 401
joachim99@51 402 dirShowBoth = new KToggleAction(i18n("Dir && Text Split Screen View"), 0, this, SLOT(slotDirShowBoth()), ac, "win_dir_show_both");
joachim99@8 403 dirShowBoth->setChecked( true );
joachim99@51 404 dirViewToggle = new KAction(i18n("Toggle Between Dir && Text View"), 0, this, SLOT(slotDirViewToggle()), actionCollection(), "win_dir_view_toggle");
joachim99@8 405
joachim99@8 406 m_pMergeEditorPopupMenu = new QPopupMenu( this );
joachim99@8 407 chooseA->plug( m_pMergeEditorPopupMenu );
joachim99@8 408 chooseB->plug( m_pMergeEditorPopupMenu );
joachim99@8 409 chooseC->plug( m_pMergeEditorPopupMenu );
joachim99@8 410 }
joachim99@8 411
joachim99@51 412
joachim99@8 413 void KDiff3App::showPopupMenu( const QPoint& point )
joachim99@8 414 {
joachim99@8 415 m_pMergeEditorPopupMenu->popup( point );
joachim99@8 416 }
joachim99@8 417
joachim99@8 418 void KDiff3App::initStatusBar()
joachim99@8 419 {
joachim99@8 420 ///////////////////////////////////////////////////////////////////
joachim99@8 421 // STATUSBAR
joachim99@8 422 if (statusBar() !=0 )
joachim99@8 423 statusBar()->message( i18n("Ready.") );
joachim99@8 424 }
joachim99@8 425
joachim99@8 426 void KDiff3App::saveOptions( KConfig* config )
joachim99@8 427 {
joachim99@8 428 if ( !isPart() )
joachim99@8 429 {
joachim99@8 430 config->setGroup("General Options");
joachim99@8 431 config->writeEntry("Geometry", m_pKDiff3Shell->size());
joachim99@8 432 config->writeEntry("Position", m_pKDiff3Shell->pos());
joachim99@8 433 config->writeEntry("Show Toolbar", viewToolBar->isChecked());
joachim99@8 434 config->writeEntry("Show Statusbar",viewStatusBar->isChecked());
joachim99@8 435 if(toolBar("mainToolBar")!=0)
joachim99@8 436 config->writeEntry("ToolBarPos", (int) toolBar("mainToolBar")->barPos());
joachim99@8 437 }
joachim99@8 438
joachim99@8 439 m_pOptionDialog->saveOptions( config );
joachim99@8 440 }
joachim99@8 441
joachim99@8 442
joachim99@8 443 void KDiff3App::readOptions( KConfig* config )
joachim99@8 444 {
joachim99@8 445 if( !isPart() )
joachim99@8 446 {
joachim99@8 447 config->setGroup("General Options");
joachim99@8 448
joachim99@8 449 // bar status settings
joachim99@8 450 bool bViewToolbar = config->readBoolEntry("Show Toolbar", true);
joachim99@8 451 viewToolBar->setChecked(bViewToolbar);
joachim99@8 452 slotViewToolBar();
joachim99@8 453
joachim99@8 454 bool bViewStatusbar = config->readBoolEntry("Show Statusbar", true);
joachim99@8 455 viewStatusBar->setChecked(bViewStatusbar);
joachim99@8 456 slotViewStatusBar();
joachim99@8 457
joachim99@8 458
joachim99@8 459 // bar position settings
joachim99@8 460 KToolBar::BarPosition toolBarPos;
joachim99@8 461 toolBarPos=(KToolBar::BarPosition) config->readNumEntry("ToolBarPos", KToolBar::Top);
joachim99@8 462 if( toolBar("mainToolBar")!=0 )
joachim99@8 463 toolBar("mainToolBar")->setBarPos(toolBarPos);
joachim99@8 464
joachim99@8 465 QSize size=config->readSizeEntry("Geometry");
joachim99@8 466 QPoint pos=config->readPointEntry("Position");
joachim99@8 467 if(!size.isEmpty())
joachim99@8 468 {
joachim99@8 469 m_pKDiff3Shell->resize( size );
joachim99@8 470 m_pKDiff3Shell->move( pos );
joachim99@8 471 }
joachim99@8 472 }
joachim99@8 473
joachim99@8 474 slotRefresh();
joachim99@8 475 }
joachim99@8 476
joachim99@8 477
joachim99@8 478 bool KDiff3App::queryClose()
joachim99@8 479 {
joachim99@8 480 saveOptions( isPart() ? m_pKDiff3Part->instance()->config() : kapp->config() );
joachim99@8 481
joachim99@8 482 if(m_bOutputModified)
joachim99@8 483 {
joachim99@8 484 int result = KMessageBox::warningYesNoCancel(this,
joachim99@8 485 i18n("The merge result hasn't been saved."),
joachim99@51 486 i18n("Warning"), i18n("Save && Quit"), i18n("Quit Without Saving") );
joachim99@8 487 if ( result==KMessageBox::Cancel )
joachim99@8 488 return false;
joachim99@8 489 else if ( result==KMessageBox::Yes )
joachim99@8 490 {
joachim99@8 491 slotFileSave();
joachim99@8 492 if ( m_bOutputModified )
joachim99@8 493 {
joachim99@8 494 KMessageBox::sorry(this, i18n("Saving the merge result failed."), i18n("Warning") );
joachim99@8 495 return false;
joachim99@8 496 }
joachim99@8 497 }
joachim99@8 498 }
joachim99@8 499
joachim99@8 500 m_bOutputModified = false;
joachim99@8 501
joachim99@8 502 if ( m_pDirectoryMergeWindow->isDirectoryMergeInProgress() )
joachim99@8 503 {
joachim99@8 504 int result = KMessageBox::warningYesNo(this,
joachim99@8 505 i18n("You are currently doing a directory merge. Are you sure, you want to abort?"),
joachim99@51 506 i18n("Warning"), i18n("Quit"), i18n("Continue Merging") );
joachim99@8 507 if ( result!=KMessageBox::Yes )
joachim99@8 508 return false;
joachim99@8 509 }
joachim99@8 510
joachim99@8 511 return true;
joachim99@8 512 }
joachim99@8 513
joachim99@8 514
joachim99@8 515 /////////////////////////////////////////////////////////////////////
joachim99@8 516 // SLOT IMPLEMENTATION
joachim99@8 517 /////////////////////////////////////////////////////////////////////
joachim99@8 518
joachim99@8 519
joachim99@8 520 void KDiff3App::slotFileSave()
joachim99@8 521 {
joachim99@8 522 if ( m_bDefaultFilename )
joachim99@8 523 {
joachim99@8 524 slotFileSaveAs();
joachim99@8 525 }
joachim99@8 526 else
joachim99@8 527 {
joachim99@8 528 slotStatusMsg(i18n("Saving file..."));
joachim99@8 529
joachim99@8 530 bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename );
joachim99@8 531 if ( bSuccess )
joachim99@8 532 {
joachim99@8 533 m_bOutputModified = false;
joachim99@8 534 if ( m_bDirCompare )
joachim99@8 535 m_pDirectoryMergeWindow->mergeResultSaved(m_outputFilename);
joachim99@8 536 }
joachim99@8 537
joachim99@8 538 slotStatusMsg(i18n("Ready."));
joachim99@8 539 }
joachim99@8 540 }
joachim99@8 541
joachim99@8 542 void KDiff3App::slotFileSaveAs()
joachim99@8 543 {
joachim99@8 544 slotStatusMsg(i18n("Saving file with a new filename..."));
joachim99@8 545
joachim99@51 546 QString s = KFileDialog::getSaveURL( QDir::currentDirPath(), 0, this, i18n("Save As...") ).url();
joachim99@8 547 if(!s.isEmpty())
joachim99@8 548 {
joachim99@8 549 m_outputFilename = s;
joachim99@8 550 bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename );
joachim99@8 551 if ( bSuccess )
joachim99@8 552 {
joachim99@8 553 m_bOutputModified = false;
joachim99@8 554 if ( m_bDirCompare )
joachim99@8 555 m_pDirectoryMergeWindow->mergeResultSaved(m_outputFilename);
joachim99@8 556 }
joachim99@8 557 //setCaption(url.fileName(),doc->isModified());
joachim99@8 558
joachim99@8 559 m_bDefaultFilename = false;
joachim99@8 560 }
joachim99@8 561
joachim99@8 562 slotStatusMsg(i18n("Ready."));
joachim99@8 563 }
joachim99@8 564
joachim99@8 565
joachim99@8 566 void KDiff3App::slotFileQuit()
joachim99@8 567 {
joachim99@8 568 slotStatusMsg(i18n("Exiting..."));
joachim99@8 569
joachim99@8 570 if( !queryClose() )
joachim99@8 571 return; // Don't quit
joachim99@8 572
joachim99@8 573 KApplication::exit(0);
joachim99@8 574 }
joachim99@8 575
joachim99@8 576
joachim99@8 577
joachim99@8 578 void KDiff3App::slotViewToolBar()
joachim99@8 579 {
joachim99@8 580 slotStatusMsg(i18n("Toggling toolbar..."));
joachim99@8 581 ///////////////////////////////////////////////////////////////////
joachim99@8 582 // turn Toolbar on or off
joachim99@8 583 if ( toolBar("mainToolBar") !=0 )
joachim99@8 584 {
joachim99@8 585 if(!viewToolBar->isChecked())
joachim99@8 586 {
joachim99@8 587 toolBar("mainToolBar")->hide();
joachim99@8 588 }
joachim99@8 589 else
joachim99@8 590 {
joachim99@8 591 toolBar("mainToolBar")->show();
joachim99@8 592 }
joachim99@8 593 }
joachim99@8 594
joachim99@8 595 slotStatusMsg(i18n("Ready."));
joachim99@8 596 }
joachim99@8 597
joachim99@8 598 void KDiff3App::slotViewStatusBar()
joachim99@8 599 {
joachim99@8 600 slotStatusMsg(i18n("Toggle the statusbar..."));
joachim99@8 601 ///////////////////////////////////////////////////////////////////
joachim99@8 602 //turn Statusbar on or off
joachim99@8 603 if (statusBar() !=0 )
joachim99@8 604 {
joachim99@8 605 if(!viewStatusBar->isChecked())
joachim99@8 606 {
joachim99@8 607 statusBar()->hide();
joachim99@8 608 }
joachim99@8 609 else
joachim99@8 610 {
joachim99@8 611 statusBar()->show();
joachim99@8 612 }
joachim99@8 613 }
joachim99@8 614
joachim99@8 615 slotStatusMsg(i18n("Ready."));
joachim99@8 616 }
joachim99@8 617
joachim99@8 618
joachim99@8 619 void KDiff3App::slotStatusMsg(const QString &text)
joachim99@8 620 {
joachim99@8 621 ///////////////////////////////////////////////////////////////////
joachim99@8 622 // change status message permanently
joachim99@8 623 if (statusBar() !=0 )
joachim99@8 624 {
joachim99@8 625 statusBar()->clear();
joachim99@8 626 statusBar()->message( text );
joachim99@8 627 }
joachim99@8 628 }
joachim99@8 629
joachim99@8 630
joachim99@8 631
joachim99@8 632 FindDialog::FindDialog(QWidget* pParent)
joachim99@8 633 : QDialog( pParent )
joachim99@8 634 {
joachim99@8 635 QGridLayout* layout = new QGridLayout( this );
joachim99@8 636 layout->setMargin(5);
joachim99@8 637 layout->setSpacing(5);
joachim99@8 638
joachim99@8 639 int line=0;
joachim99@8 640 layout->addMultiCellWidget( new QLabel(i18n("Searchtext:"),this), line,line,0,1 );
joachim99@8 641 ++line;
joachim99@8 642
joachim99@8 643 m_pSearchString = new QLineEdit( this );
joachim99@8 644 layout->addMultiCellWidget( m_pSearchString, line,line,0,1 );
joachim99@8 645 ++line;
joachim99@8 646
joachim99@51 647 m_pCaseSensitive = new QCheckBox(i18n("Case sensitive"),this);
joachim99@8 648 layout->addWidget( m_pCaseSensitive, line, 1 );
joachim99@8 649
joachim99@8 650 m_pSearchInA = new QCheckBox(i18n("Search A"),this);
joachim99@8 651 layout->addWidget( m_pSearchInA, line, 0 );
joachim99@8 652 m_pSearchInA->setChecked( true );
joachim99@8 653 ++line;
joachim99@8 654
joachim99@8 655 m_pSearchInB = new QCheckBox(i18n("Search B"),this);
joachim99@8 656 layout->addWidget( m_pSearchInB, line, 0 );
joachim99@8 657 m_pSearchInB->setChecked( true );
joachim99@8 658 ++line;
joachim99@8 659
joachim99@8 660 m_pSearchInC = new QCheckBox(i18n("Search C"),this);
joachim99@8 661 layout->addWidget( m_pSearchInC, line, 0 );
joachim99@8 662 m_pSearchInC->setChecked( true );
joachim99@8 663 ++line;
joachim99@8 664
joachim99@51 665 m_pSearchInOutput = new QCheckBox(i18n("Search output"),this);
joachim99@8 666 layout->addWidget( m_pSearchInOutput, line, 0 );
joachim99@8 667 m_pSearchInOutput->setChecked( true );
joachim99@8 668 ++line;
joachim99@51 669
joachim99@51 670 QPushButton* pButton = new QPushButton( i18n("&Search"), this );
joachim99@8 671 layout->addWidget( pButton, line, 0 );
joachim99@8 672 connect( pButton, SIGNAL(clicked()), this, SLOT(accept()));
joachim99@8 673
joachim99@51 674 pButton = new QPushButton( i18n("&Cancel"), this );
joachim99@8 675 layout->addWidget( pButton, line, 1 );
joachim99@8 676 connect( pButton, SIGNAL(clicked()), this, SLOT(reject()));
joachim99@8 677
joachim99@8 678 hide();
joachim99@8 679 }
joachim99@8 680
joachim99@8 681 #include "kdiff3.moc"