summaryrefslogtreecommitdiffstats
path: root/src/optiondialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/optiondialog.cpp')
-rw-r--r--src/optiondialog.cpp1755
1 files changed, 1755 insertions, 0 deletions
diff --git a/src/optiondialog.cpp b/src/optiondialog.cpp
new file mode 100644
index 0000000..698763e
--- /dev/null
+++ b/src/optiondialog.cpp
@@ -0,0 +1,1755 @@
+/*
+ * kdiff3 - Text Diff And Merge Tool
+ * Copyright (C) 2002-2007 Joachim Eibl, joachim.eibl at gmx.de
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qvbox.h>
+#include <qvalidator.h>
+#include <qtooltip.h>
+#include <qtextcodec.h>
+#include <qradiobutton.h>
+#include <qvbuttongroup.h>
+#include <qsettings.h>
+
+#include <kapplication.h>
+#include <kcolorbtn.h>
+#include <kfontdialog.h> // For KFontChooser
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <kmainwindow.h> //For ktoolbar.h
+
+//#include <kkeydialog.h>
+#include <map>
+
+#include "optiondialog.h"
+#include "diff.h"
+#include "smalldialogs.h"
+
+#include <iostream>
+
+#ifndef KREPLACEMENTS_H
+#include <kglobalsettings.h>
+#endif
+
+static QString s_historyEntryStartRegExpToolTip;
+static QString s_historyEntryStartSortKeyOrderToolTip;
+static QString s_autoMergeRegExpToolTip;
+static QString s_historyStartRegExpToolTip;
+
+void OptionDialog::addOptionItem(OptionItem* p)
+{
+ m_optionItemList.push_back(p);
+}
+
+class OptionItem
+{
+public:
+ OptionItem( OptionDialog* pOptionDialog, const QString& saveName )
+ {
+ assert(pOptionDialog!=0);
+ pOptionDialog->addOptionItem( this );
+ m_saveName = saveName;
+ }
+ virtual ~OptionItem(){}
+ virtual void setToDefault()=0;
+ virtual void setToCurrent()=0;
+ virtual void apply()=0;
+ virtual void write(ValueMap*)=0;
+ virtual void read(ValueMap*)=0;
+ QString getSaveName(){return m_saveName;}
+protected:
+ QString m_saveName;
+};
+
+class OptionCheckBox : public QCheckBox, public OptionItem
+{
+public:
+ OptionCheckBox( QString text, bool bDefaultVal, const QString& saveName, bool* pbVar,
+ QWidget* pParent, OptionDialog* pOD )
+ : QCheckBox( text, pParent ), OptionItem( pOD, saveName )
+ {
+ m_pbVar = pbVar;
+ m_bDefaultVal = bDefaultVal;
+ }
+ void setToDefault(){ setChecked( m_bDefaultVal ); }
+ void setToCurrent(){ setChecked( *m_pbVar ); }
+ void apply() { *m_pbVar = isChecked(); }
+ void write(ValueMap* config){ config->writeEntry(m_saveName, *m_pbVar ); }
+ void read (ValueMap* config){ *m_pbVar = config->readBoolEntry( m_saveName, *m_pbVar ); }
+private:
+ OptionCheckBox( const OptionCheckBox& ); // private copy constructor without implementation
+ bool* m_pbVar;
+ bool m_bDefaultVal;
+};
+
+class OptionRadioButton : public QRadioButton, public OptionItem
+{
+public:
+ OptionRadioButton( QString text, bool bDefaultVal, const QString& saveName, bool* pbVar,
+ QWidget* pParent, OptionDialog* pOD )
+ : QRadioButton( text, pParent ), OptionItem( pOD, saveName )
+ {
+ m_pbVar = pbVar;
+ m_bDefaultVal = bDefaultVal;
+ }
+ void setToDefault(){ setChecked( m_bDefaultVal ); }
+ void setToCurrent(){ setChecked( *m_pbVar ); }
+ void apply() { *m_pbVar = isChecked(); }
+ void write(ValueMap* config){ config->writeEntry(m_saveName, *m_pbVar ); }
+ void read (ValueMap* config){ *m_pbVar = config->readBoolEntry( m_saveName, *m_pbVar ); }
+private:
+ OptionRadioButton( const OptionRadioButton& ); // private copy constructor without implementation
+ bool* m_pbVar;
+ bool m_bDefaultVal;
+};
+
+
+template<class T>
+class OptionT : public OptionItem
+{
+public:
+ OptionT( const T& defaultVal, const QString& saveName, T* pVar, OptionDialog* pOD )
+ : OptionItem( pOD, saveName )
+ {
+ m_pVar = pVar;
+ *m_pVar = defaultVal;
+ }
+ OptionT( const QString& saveName, T* pVar, OptionDialog* pOD )
+ : OptionItem( pOD, saveName )
+ {
+ m_pVar = pVar;
+ }
+ void setToDefault(){}
+ void setToCurrent(){}
+ void apply() {}
+ void write(ValueMap* vm){ writeEntry( vm, m_saveName, *m_pVar ); }
+ void read (ValueMap* vm){ readEntry ( vm, m_saveName, *m_pVar ); }
+private:
+ OptionT( const OptionT& ); // private copy constructor without implementation
+ T* m_pVar;
+};
+
+template <class T> void writeEntry(ValueMap* vm, const QString& saveName, const T& v ) { vm->writeEntry( saveName, v ); }
+static void writeEntry(ValueMap* vm, const QString& saveName, const QStringList& v ) { vm->writeEntry( saveName, v, '|' ); }
+
+static void readEntry(ValueMap* vm, const QString& saveName, bool& v ) { v = vm->readBoolEntry( saveName, v ); }
+static void readEntry(ValueMap* vm, const QString& saveName, int& v ) { v = vm->readNumEntry( saveName, v ); }
+static void readEntry(ValueMap* vm, const QString& saveName, QSize& v ) { v = vm->readSizeEntry( saveName, &v ); }
+static void readEntry(ValueMap* vm, const QString& saveName, QPoint& v ) { v = vm->readPointEntry( saveName, &v ); }
+static void readEntry(ValueMap* vm, const QString& saveName, QStringList& v ){ v = vm->readListEntry( saveName, QStringList(), '|' ); }
+
+typedef OptionT<bool> OptionToggleAction;
+typedef OptionT<int> OptionNum;
+typedef OptionT<QPoint> OptionPoint;
+typedef OptionT<QSize> OptionSize;
+typedef OptionT<QStringList> OptionStringList;
+
+class OptionFontChooser : public KFontChooser, public OptionItem
+{
+public:
+ OptionFontChooser( const QFont& defaultVal, const QString& saveName, QFont* pbVar, QWidget* pParent, OptionDialog* pOD )
+ :KFontChooser( pParent,"font",true/*onlyFixed*/,QStringList(),false,6 ),
+ OptionItem( pOD, saveName )
+ {
+ m_pbVar = pbVar;
+ *m_pbVar = defaultVal;
+ m_default = defaultVal;
+ }
+ void setToDefault(){ setFont( m_default, true /*only fixed*/ ); }
+ void setToCurrent(){ setFont( *m_pbVar, true /*only fixed*/ ); }
+ void apply() { *m_pbVar = font();}
+ void write(ValueMap* config){ config->writeEntry(m_saveName, *m_pbVar ); }
+ void read (ValueMap* config){ *m_pbVar = config->readFontEntry( m_saveName, m_pbVar ); }
+private:
+ OptionFontChooser( const OptionToggleAction& ); // private copy constructor without implementation
+ QFont* m_pbVar;
+ QFont m_default;
+};
+
+class OptionColorButton : public KColorButton, public OptionItem
+{
+public:
+ OptionColorButton( QColor defaultVal, const QString& saveName, QColor* pVar, QWidget* pParent, OptionDialog* pOD )
+ : KColorButton( pParent ), OptionItem( pOD, saveName )
+ {
+ m_pVar = pVar;
+ m_defaultVal = defaultVal;
+ }
+ void setToDefault(){ setColor( m_defaultVal ); }
+ void setToCurrent(){ setColor( *m_pVar ); }
+ void apply() { *m_pVar = color(); }
+ void write(ValueMap* config){ config->writeEntry(m_saveName, *m_pVar ); }
+ void read (ValueMap* config){ *m_pVar = config->readColorEntry( m_saveName, m_pVar ); }
+private:
+ OptionColorButton( const OptionColorButton& ); // private copy constructor without implementation
+ QColor* m_pVar;
+ QColor m_defaultVal;
+};
+
+class OptionLineEdit : public QComboBox, public OptionItem
+{
+public:
+ OptionLineEdit( const QString& defaultVal, const QString& saveName, QString* pVar,
+ QWidget* pParent, OptionDialog* pOD )
+ : QComboBox( pParent ), OptionItem( pOD, saveName )
+ {
+ setMinimumWidth(50);
+ setEditable(true);
+ m_pVar = pVar;
+ m_defaultVal = defaultVal;
+ m_list.push_back(defaultVal);
+ insertText();
+ }
+ void setToDefault(){ setCurrentText( m_defaultVal ); }
+ void setToCurrent(){ setCurrentText( *m_pVar ); }
+ void apply() { *m_pVar = currentText(); insertText(); }
+ void write(ValueMap* config){ config->writeEntry( m_saveName, m_list, '|' ); }
+ void read (ValueMap* config){
+ m_list = config->readListEntry( m_saveName, m_defaultVal, '|' );
+ if ( !m_list.empty() ) *m_pVar = m_list.front();
+ clear();
+ insertStringList(m_list);
+ }
+private:
+ void insertText()
+ { // Check if the text exists. If yes remove it and push it in as first element
+ QString current = currentText();
+ m_list.remove( current );
+ m_list.push_front( current );
+ clear();
+ if ( m_list.size()>10 )
+ m_list.erase( m_list.at(10),m_list.end() );
+ insertStringList(m_list);
+ }
+ OptionLineEdit( const OptionLineEdit& ); // private copy constructor without implementation
+ QString* m_pVar;
+ QString m_defaultVal;
+ QStringList m_list;
+};
+
+#if defined QT_NO_VALIDATOR
+#error No validator
+#endif
+class OptionIntEdit : public QLineEdit, public OptionItem
+{
+public:
+ OptionIntEdit( int defaultVal, const QString& saveName, int* pVar, int rangeMin, int rangeMax,
+ QWidget* pParent, OptionDialog* pOD )
+ : QLineEdit( pParent ), OptionItem( pOD, saveName )
+ {
+ m_pVar = pVar;
+ m_defaultVal = defaultVal;
+ QIntValidator* v = new QIntValidator(this);
+ v->setRange( rangeMin, rangeMax );
+ setValidator( v );
+ }
+ void setToDefault(){ QString s; s.setNum(m_defaultVal); setText( s ); }
+ void setToCurrent(){ QString s; s.setNum(*m_pVar); setText( s ); }
+ void apply() { const QIntValidator* v=static_cast<const QIntValidator*>(validator());
+ *m_pVar = minMaxLimiter( text().toInt(), v->bottom(), v->top());
+ setText( QString::number(*m_pVar) ); }
+ void write(ValueMap* config){ config->writeEntry(m_saveName, *m_pVar ); }
+ void read (ValueMap* config){ *m_pVar = config->readNumEntry( m_saveName, *m_pVar ); }
+private:
+ OptionIntEdit( const OptionIntEdit& ); // private copy constructor without implementation
+ int* m_pVar;
+ int m_defaultVal;
+};
+
+class OptionComboBox : public QComboBox, public OptionItem
+{
+public:
+ OptionComboBox( int defaultVal, const QString& saveName, int* pVarNum,
+ QWidget* pParent, OptionDialog* pOD )
+ : QComboBox( pParent ), OptionItem( pOD, saveName )
+ {
+ setMinimumWidth(50);
+ m_pVarNum = pVarNum;
+ m_pVarStr = 0;
+ m_defaultVal = defaultVal;
+ setEditable(false);
+ }
+ OptionComboBox( int defaultVal, const QString& saveName, QString* pVarStr,
+ QWidget* pParent, OptionDialog* pOD )
+ : QComboBox( pParent ), OptionItem( pOD, saveName )
+ {
+ m_pVarNum = 0;
+ m_pVarStr = pVarStr;
+ m_defaultVal = defaultVal;
+ setEditable(false);
+ }
+ void setToDefault()
+ {
+ setCurrentItem( m_defaultVal );
+ if (m_pVarStr!=0){ *m_pVarStr=currentText(); }
+ }
+ void setToCurrent()
+ {
+ if (m_pVarNum!=0) setCurrentItem( *m_pVarNum );
+ else setText( *m_pVarStr );
+ }
+ void apply()
+ {
+ if (m_pVarNum!=0){ *m_pVarNum = currentItem(); }
+ else { *m_pVarStr = currentText(); }
+ }
+ void write(ValueMap* config)
+ {
+ if (m_pVarStr!=0) config->writeEntry(m_saveName, *m_pVarStr );
+ else config->writeEntry(m_saveName, *m_pVarNum );
+ }
+ void read (ValueMap* config)
+ {
+ if (m_pVarStr!=0) setText( config->readEntry( m_saveName, currentText() ) );
+ else *m_pVarNum = config->readNumEntry( m_saveName, *m_pVarNum );
+ }
+private:
+ OptionComboBox( const OptionIntEdit& ); // private copy constructor without implementation
+ int* m_pVarNum;
+ QString* m_pVarStr;
+ int m_defaultVal;
+
+ void setText(const QString& s)
+ {
+ // Find the string in the combobox-list, don't change the value if nothing fits.
+ for( int i=0; i<count(); ++i )
+ {
+ if ( text(i)==s )
+ {
+ if (m_pVarNum!=0) *m_pVarNum = i;
+ if (m_pVarStr!=0) *m_pVarStr = s;
+ setCurrentItem(i);
+ return;
+ }
+ }
+ }
+};
+
+class OptionEncodingComboBox : public QComboBox, public OptionItem
+{
+ std::vector<QTextCodec*> m_codecVec;
+ QTextCodec** m_ppVarCodec;
+public:
+ OptionEncodingComboBox( const QString& saveName, QTextCodec** ppVarCodec,
+ QWidget* pParent, OptionDialog* pOD )
+ : QComboBox( pParent ), OptionItem( pOD, saveName )
+ {
+ m_ppVarCodec = ppVarCodec;
+ insertCodec( i18n("Unicode, 8 bit"), QTextCodec::codecForName("UTF-8") );
+ insertCodec( i18n("Unicode"), QTextCodec::codecForName("iso-10646-UCS-2") );
+ insertCodec( i18n("Latin1"), QTextCodec::codecForName("iso 8859-1") );
+
+ // First sort codec names:
+ std::map<QString, QTextCodec*> names;
+ int i;
+ for(i=0;;++i)
+ {
+ QTextCodec* c = QTextCodec::codecForIndex(i);
+ if ( c==0 ) break;
+ else names[QString(c->name()).upper()]=c;
+ }
+
+ std::map<QString, QTextCodec*>::iterator it;
+ for(it=names.begin();it!=names.end();++it)
+ {
+ insertCodec( "", it->second );
+ }
+
+ QToolTip::add( this, i18n(
+ "Change this if non-ASCII characters are not displayed correctly."
+ ));
+ }
+ void insertCodec( const QString& visibleCodecName, QTextCodec* c )
+ {
+ if (c!=0)
+ {
+ for( unsigned int i=0; i<m_codecVec.size(); ++i )
+ {
+ if ( c==m_codecVec[i] )
+ return; // don't insert any codec twice
+ }
+ insertItem( visibleCodecName.isEmpty() ? QString(c->name()) : visibleCodecName+" ("+c->name()+")", m_codecVec.size() );
+ m_codecVec.push_back( c );
+ }
+ }
+ void setToDefault()
+ {
+ QString defaultName = QTextCodec::codecForLocale()->name();
+ for(int i=0;i<count();++i)
+ {
+ if (defaultName==text(i) &&
+ m_codecVec[i]==QTextCodec::codecForLocale())
+ {
+ setCurrentItem(i);
+ if (m_ppVarCodec!=0){ *m_ppVarCodec=m_codecVec[i]; }
+ return;
+ }
+ }
+
+ setCurrentItem( 0 );
+ if (m_ppVarCodec!=0){ *m_ppVarCodec=m_codecVec[0]; }
+ }
+ void setToCurrent()
+ {
+ if (m_ppVarCodec!=0)
+ {
+ for(unsigned int i=0; i<m_codecVec.size(); ++i)
+ {
+ if ( *m_ppVarCodec==m_codecVec[i] )
+ {
+ setCurrentItem( i );
+ break;
+ }
+ }
+ }
+ }
+ void apply()
+ {
+ if (m_ppVarCodec!=0){ *m_ppVarCodec = m_codecVec[ currentItem() ]; }
+ }
+ void write(ValueMap* config)
+ {
+ if (m_ppVarCodec!=0) config->writeEntry(m_saveName, (*m_ppVarCodec)->name() );
+ }
+ void read (ValueMap* config)
+ {
+ QString codecName = config->readEntry( m_saveName, m_codecVec[ currentItem() ]->name() );
+ for(unsigned int i=0; i<m_codecVec.size(); ++i)
+ {
+ if ( codecName == m_codecVec[i]->name() )
+ {
+ setCurrentItem( i );
+ if (m_ppVarCodec!=0) *m_ppVarCodec = m_codecVec[i];
+ break;
+ }
+ }
+ }
+};
+
+
+OptionDialog::OptionDialog( bool bShowDirMergeSettings, QWidget *parent, char *name )
+ :KDialogBase( IconList, i18n("Configure"), Help|Default|Apply|Ok|Cancel,
+ Ok, parent, name, true /*modal*/, true )
+{
+ setHelp( "kdiff3/index.html", QString::null );
+
+ setupFontPage();
+ setupColorPage();
+ setupEditPage();
+ setupDiffPage();
+ setupMergePage();
+ setupOtherOptions();
+ if (bShowDirMergeSettings)
+ setupDirectoryMergePage();
+
+ setupRegionalPage();
+ setupIntegrationPage();
+
+ //setupKeysPage();
+
+ // Initialize all values in the dialog
+ resetToDefaults();
+ slotApply();
+}
+
+OptionDialog::~OptionDialog( void )
+{
+}
+
+void OptionDialog::setupOtherOptions()
+{
+ new OptionToggleAction( false, "AutoAdvance", &m_bAutoAdvance, this );
+ new OptionToggleAction( true, "ShowWhiteSpaceCharacters", &m_bShowWhiteSpaceCharacters, this );
+ new OptionToggleAction( true, "ShowWhiteSpace", &m_bShowWhiteSpace, this );
+ new OptionToggleAction( false, "ShowLineNumbers", &m_bShowLineNumbers, this );
+ new OptionToggleAction( true, "HorizDiffWindowSplitting", &m_bHorizDiffWindowSplitting, this );
+ new OptionToggleAction( false, "WordWrap", &m_bWordWrap, this );
+
+ new OptionToggleAction( true, "ShowIdenticalFiles", &m_bDmShowIdenticalFiles, this );
+
+ new OptionToggleAction( true, "Show Toolbar", &m_bShowToolBar, this );
+ new OptionToggleAction( true, "Show Statusbar", &m_bShowStatusBar, this );
+
+ new OptionNum( (int)KToolBar::Top, "ToolBarPos", &m_toolBarPos, this );
+ new OptionSize( QSize(600,400),"Geometry", &m_geometry, this );
+ new OptionPoint( QPoint(0,22), "Position", &m_position, this );
+ new OptionToggleAction( false, "WindowStateMaximised", &m_bMaximised, this );
+
+ new OptionStringList( "RecentAFiles", &m_recentAFiles, this );
+ new OptionStringList( "RecentBFiles", &m_recentBFiles, this );
+ new OptionStringList( "RecentCFiles", &m_recentCFiles, this );
+ new OptionStringList( "RecentOutputFiles", &m_recentOutputFiles, this );
+}
+
+void OptionDialog::setupFontPage( void )
+{
+ QFrame *page = addPage( i18n("Font"), i18n("Editor & Diff Output Font" ),
+ BarIcon("fonts", KIcon::SizeMedium ) );
+
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QFont defaultFont =
+#ifdef _WIN32
+ QFont("Courier New", 10 );
+#elif defined( KREPLACEMENTS_H )
+ QFont("Courier", 10 );
+#else
+ KGlobalSettings::fixedFont();
+#endif
+
+ OptionFontChooser* pFontChooser = new OptionFontChooser( defaultFont, "Font", &m_font, page, this );
+ topLayout->addWidget( pFontChooser );
+
+ QGridLayout *gbox = new QGridLayout( 1, 2 );
+ topLayout->addLayout( gbox );
+ int line=0;
+
+ OptionCheckBox* pItalicDeltas = new OptionCheckBox( i18n("Italic font for deltas"), false, "ItalicForDeltas", &m_bItalicForDeltas, page, this );
+ gbox->addMultiCellWidget( pItalicDeltas, line, line, 0, 1 );
+ QToolTip::add( pItalicDeltas, i18n(
+ "Selects the italic version of the font for differences.\n"
+ "If the font doesn't support italic characters, then this does nothing.")
+ );
+}
+
+
+void OptionDialog::setupColorPage( void )
+{
+ QFrame *page = addPage( i18n("Color"), i18n("Colors Settings"),
+ BarIcon("colorize", KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout( 7, 2 );
+ gbox->setColStretch(1,5);
+ topLayout->addLayout(gbox);
+
+ QLabel* label;
+ int line = 0;
+
+ int depth = QColor::numBitPlanes();
+ bool bLowColor = depth<=8;
+
+ label = new QLabel( i18n("Editor and Diff Views:"), page );
+ gbox->addWidget( label, line, 0 );
+ QFont f( label->font() );
+ f.setBold(true);
+ label->setFont(f);
+ ++line;
+
+ OptionColorButton* pFgColor = new OptionColorButton( Qt::black,"FgColor", &m_fgColor, page, this );
+ label = new QLabel( pFgColor, i18n("Foreground color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pFgColor, line, 1 );
+ ++line;
+
+ OptionColorButton* pBgColor = new OptionColorButton( Qt::white, "BgColor", &m_bgColor, page, this );
+ label = new QLabel( pBgColor, i18n("Background color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pBgColor, line, 1 );
+
+ ++line;
+
+ OptionColorButton* pDiffBgColor = new OptionColorButton(
+ bLowColor ? Qt::lightGray : qRgb(224,224,224), "DiffBgColor", &m_diffBgColor, page, this );
+ label = new QLabel( pDiffBgColor, i18n("Diff background color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pDiffBgColor, line, 1 );
+ ++line;
+
+ OptionColorButton* pColorA = new OptionColorButton(
+ bLowColor ? qRgb(0,0,255) : qRgb(0,0,200)/*blue*/, "ColorA", &m_colorA, page, this );
+ label = new QLabel( pColorA, i18n("Color A:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColorA, line, 1 );
+ ++line;
+
+ OptionColorButton* pColorB = new OptionColorButton(
+ bLowColor ? qRgb(0,128,0) : qRgb(0,150,0)/*green*/, "ColorB", &m_colorB, page, this );
+ label = new QLabel( pColorB, i18n("Color B:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColorB, line, 1 );
+ ++line;
+
+ OptionColorButton* pColorC = new OptionColorButton(
+ bLowColor ? qRgb(128,0,128) : qRgb(150,0,150)/*magenta*/, "ColorC", &m_colorC, page, this );
+ label = new QLabel( pColorC, i18n("Color C:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColorC, line, 1 );
+ ++line;
+
+ OptionColorButton* pColorForConflict = new OptionColorButton( Qt::red, "ColorForConflict", &m_colorForConflict, page, this );
+ label = new QLabel( pColorForConflict, i18n("Conflict color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColorForConflict, line, 1 );
+ ++line;
+
+ OptionColorButton* pColor = new OptionColorButton(
+ bLowColor ? qRgb(192,192,192) : qRgb(220,220,100), "CurrentRangeBgColor", &m_currentRangeBgColor, page, this );
+ label = new QLabel( pColor, i18n("Current range background color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ ++line;
+
+ pColor = new OptionColorButton(
+ bLowColor ? qRgb(255,255,0) : qRgb(255,255,150), "CurrentRangeDiffBgColor", &m_currentRangeDiffBgColor, page, this );
+ label = new QLabel( pColor, i18n("Current range diff background color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ ++line;
+
+ pColor = new OptionColorButton( qRgb(0xff,0xd0,0x80), "ManualAlignmentRangeColor", &m_manualHelpRangeColor, page, this );
+ label = new QLabel( pColor, i18n("Color for manually aligned difference ranges:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ ++line;
+
+ label = new QLabel( i18n("Directory Comparison View:"), page );
+ gbox->addWidget( label, line, 0 );
+ label->setFont(f);
+ ++line;
+
+ pColor = new OptionColorButton( qRgb(0,0xd0,0), "NewestFileColor", &m_newestFileColor, page, this );
+ label = new QLabel( pColor, i18n("Newest file color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ QString dirColorTip = i18n( "Changing this color will only be effective when starting the next directory comparison.");
+ QToolTip::add( label, dirColorTip );
+ ++line;
+
+ pColor = new OptionColorButton( qRgb(0xf0,0,0), "OldestFileColor", &m_oldestFileColor, page, this );
+ label = new QLabel( pColor, i18n("Oldest file color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ QToolTip::add( label, dirColorTip );
+ ++line;
+
+ pColor = new OptionColorButton( qRgb(0xc0,0xc0,0), "MidAgeFileColor", &m_midAgeFileColor, page, this );
+ label = new QLabel( pColor, i18n("Middle age file color:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ QToolTip::add( label, dirColorTip );
+ ++line;
+
+ pColor = new OptionColorButton( qRgb(0,0,0), "MissingFileColor", &m_missingFileColor, page, this );
+ label = new QLabel( pColor, i18n("Color for missing files:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pColor, line, 1 );
+ QToolTip::add( label, dirColorTip );
+ ++line;
+
+ topLayout->addStretch(10);
+}
+
+
+void OptionDialog::setupEditPage( void )
+{
+ QFrame *page = addPage( i18n("Editor"), i18n("Editor Behavior"),
+ BarIcon("edit", KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout( 4, 2 );
+ gbox->setColStretch(1,5);
+ topLayout->addLayout( gbox );
+ QLabel* label;
+ int line=0;
+
+ OptionCheckBox* pReplaceTabs = new OptionCheckBox( i18n("Tab inserts spaces"), false, "ReplaceTabs", &m_bReplaceTabs, page, this );
+ gbox->addMultiCellWidget( pReplaceTabs, line, line, 0, 1 );
+ QToolTip::add( pReplaceTabs, i18n(
+ "On: Pressing tab generates the appropriate number of spaces.\n"
+ "Off: A Tab-character will be inserted.")
+ );
+ ++line;
+
+ OptionIntEdit* pTabSize = new OptionIntEdit( 8, "TabSize", &m_tabSize, 1, 100, page, this );
+ label = new QLabel( pTabSize, i18n("Tab size:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pTabSize, line, 1 );
+ ++line;
+
+ OptionCheckBox* pAutoIndentation = new OptionCheckBox( i18n("Auto indentation"), true, "AutoIndentation", &m_bAutoIndentation, page, this );
+ gbox->addMultiCellWidget( pAutoIndentation, line, line, 0, 1 );
+ QToolTip::add( pAutoIndentation, i18n(
+ "On: The indentation of the previous line is used for a new line.\n"
+ ));
+ ++line;
+
+ OptionCheckBox* pAutoCopySelection = new OptionCheckBox( i18n("Auto copy selection"), false, "AutoCopySelection", &m_bAutoCopySelection, page, this );
+ gbox->addMultiCellWidget( pAutoCopySelection, line, line, 0, 1 );
+ QToolTip::add( pAutoCopySelection, i18n(
+ "On: Any selection is immediately written to the clipboard.\n"
+ "Off: You must explicitely copy e.g. via Ctrl-C."
+ ));
+ ++line;
+
+ label = new QLabel( i18n("Line end style:"), page );
+ gbox->addWidget( label, line, 0 );
+ #ifdef _WIN32
+ int defaultLineEndStyle = eLineEndDos;
+ #else
+ int defaultLineEndStyle = eLineEndUnix;
+ #endif
+ OptionComboBox* pLineEndStyle = new OptionComboBox( defaultLineEndStyle, "LineEndStyle", &m_lineEndStyle, page, this );
+ gbox->addWidget( pLineEndStyle, line, 1 );
+ pLineEndStyle->insertItem( "Unix", eLineEndUnix );
+ pLineEndStyle->insertItem( "Dos/Windows", eLineEndDos );
+ QToolTip::add( label, i18n(
+ "Sets the line endings for when an edited file is saved.\n"
+ "DOS/Windows: CR+LF; UNIX: LF; with CR=0D, LF=0A")
+ );
+ ++line;
+
+ topLayout->addStretch(10);
+}
+
+
+void OptionDialog::setupDiffPage( void )
+{
+ QFrame *page = addPage( i18n("Diff"), i18n("Diff Settings"),
+ BarIcon("misc", KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout( 3, 2 );
+ gbox->setColStretch(1,5);
+ topLayout->addLayout( gbox );
+ int line=0;
+
+ QLabel* label=0;
+
+// OptionCheckBox* pPreserveCarriageReturn = new OptionCheckBox( i18n("Preserve carriage return"), false, "PreserveCarriageReturn", &m_bPreserveCarriageReturn, page, this );
+// gbox->addMultiCellWidget( pPreserveCarriageReturn, line, line, 0, 1 );
+// QToolTip::add( pPreserveCarriageReturn, i18n(
+// "Show carriage return characters '\\r' if they exist.\n"
+// "Helps to compare files that were modified under different operating systems.")
+// );
+// ++line;
+ QString treatAsWhiteSpace = " ("+i18n("Treat as white space.")+")";
+
+ OptionCheckBox* pIgnoreNumbers = new OptionCheckBox( i18n("Ignore numbers")+treatAsWhiteSpace, false, "IgnoreNumbers", &m_bIgnoreNumbers, page, this );
+ gbox->addMultiCellWidget( pIgnoreNumbers, line, line, 0, 1 );
+ QToolTip::add( pIgnoreNumbers, i18n(
+ "Ignore number characters during line matching phase. (Similar to Ignore white space.)\n"
+ "Might help to compare files with numeric data.")
+ );
+ ++line;
+
+ OptionCheckBox* pIgnoreComments = new OptionCheckBox( i18n("Ignore C/C++ comments")+treatAsWhiteSpace, false, "IgnoreComments", &m_bIgnoreComments, page, this );
+ gbox->addMultiCellWidget( pIgnoreComments, line, line, 0, 1 );
+ QToolTip::add( pIgnoreComments, i18n( "Treat C/C++ comments like white space.")
+ );
+ ++line;
+
+ OptionCheckBox* pIgnoreCase = new OptionCheckBox( i18n("Ignore case")+treatAsWhiteSpace, false, "IgnoreCase", &m_bIgnoreCase, page, this );
+ gbox->addMultiCellWidget( pIgnoreCase, line, line, 0, 1 );
+ QToolTip::add( pIgnoreCase, i18n(
+ "Treat case differences like white space changes. ('a'<=>'A')")
+ );
+ ++line;
+
+ label = new QLabel( i18n("Preprocessor command:"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionLineEdit* pLE = new OptionLineEdit( "", "PreProcessorCmd", &m_PreProcessorCmd, page, this );
+ gbox->addWidget( pLE, line, 1 );
+ QToolTip::add( label, i18n("User defined pre-processing. (See the docs for details.)") );
+ ++line;
+
+ label = new QLabel( i18n("Line-matching preprocessor command:"), page );
+ gbox->addWidget( label, line, 0 );
+ pLE = new OptionLineEdit( "", "LineMatchingPreProcessorCmd", &m_LineMatchingPreProcessorCmd, page, this );
+ gbox->addWidget( pLE, line, 1 );
+ QToolTip::add( label, i18n("This pre-processor is only used during line matching.\n(See the docs for details.)") );
+ ++line;
+
+ OptionCheckBox* pTryHard = new OptionCheckBox( i18n("Try hard (slower)"), true, "TryHard", &m_bTryHard, page, this );
+ gbox->addMultiCellWidget( pTryHard, line, line, 0, 1 );
+ QToolTip::add( pTryHard, i18n(
+ "Enables the --minimal option for the external diff.\n"
+ "The analysis of big files will be much slower.")
+ );
+ ++line;
+
+ topLayout->addStretch(10);
+}
+
+void OptionDialog::setupMergePage( void )
+{
+ QFrame *page = addPage( i18n("Merge"), i18n("Merge Settings"),
+ BarIcon("misc", KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page );
+ topLayout->setMargin( 5 );
+ topLayout->setSpacing( spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout();
+ gbox->setColStretch(1,5);
+ topLayout->addLayout( gbox );
+ int line=0;
+
+ QLabel* label=0;
+
+ label = new QLabel( i18n("Auto advance delay (ms):"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionIntEdit* pAutoAdvanceDelay = new OptionIntEdit( 500, "AutoAdvanceDelay", &m_autoAdvanceDelay, 0, 2000, page, this );
+ gbox->addWidget( pAutoAdvanceDelay, line, 1 );
+ QToolTip::add( label,i18n(
+ "When in Auto-Advance mode the result of the current selection is shown \n"
+ "for the specified time, before jumping to the next conflict. Range: 0-2000 ms")
+ );
+ ++line;
+
+ label = new QLabel( i18n("White space 2-file merge default:"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionComboBox* pWhiteSpace2FileMergeDefault = new OptionComboBox( 0, "WhiteSpace2FileMergeDefault", &m_whiteSpace2FileMergeDefault, page, this );
+ gbox->addWidget( pWhiteSpace2FileMergeDefault, line, 1 );
+ pWhiteSpace2FileMergeDefault->insertItem( i18n("Manual Choice"), 0 );
+ pWhiteSpace2FileMergeDefault->insertItem( "A", 1 );
+ pWhiteSpace2FileMergeDefault->insertItem( "B", 2 );
+ QToolTip::add( label, i18n(
+ "Allow the merge algorithm to automatically select an input for "
+ "white-space-only changes." )
+ );
+ ++line;
+
+ label = new QLabel( i18n("White space 3-file merge default:"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionComboBox* pWhiteSpace3FileMergeDefault = new OptionComboBox( 0, "WhiteSpace3FileMergeDefault", &m_whiteSpace3FileMergeDefault, page, this );
+ gbox->addWidget( pWhiteSpace3FileMergeDefault, line, 1 );
+ pWhiteSpace3FileMergeDefault->insertItem( i18n("Manual Choice"), 0 );
+ pWhiteSpace3FileMergeDefault->insertItem( "A", 1 );
+ pWhiteSpace3FileMergeDefault->insertItem( "B", 2 );
+ pWhiteSpace3FileMergeDefault->insertItem( "C", 3 );
+ QToolTip::add( label, i18n(
+ "Allow the merge algorithm to automatically select an input for "
+ "white-space-only changes." )
+ );
+ ++line;
+
+ QGroupBox* pGroupBox = new QGroupBox( 2, Qt::Horizontal, i18n("Automatic Merge Regular Expression"), page);
+ gbox->addMultiCellWidget( pGroupBox, line,line,0,1);
+ ++line;
+ {
+ QWidget* page = new QWidget( pGroupBox );
+ QGridLayout* gbox = new QGridLayout( page, 2, 2, spacingHint() );
+ gbox->setColStretch(1,10);
+ int line = 0;
+
+ label = new QLabel( i18n("Auto merge regular expression:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pAutoMergeRegExpLineEdit = new OptionLineEdit( ".*\\$(Version|Header|Date|Author).*\\$.*", "AutoMergeRegExp", &m_autoMergeRegExp, page, this );
+ gbox->addWidget( m_pAutoMergeRegExpLineEdit, line, 1 );
+ s_autoMergeRegExpToolTip = i18n("Regular expression for lines where KDiff3 should automatically choose one source.\n"
+ "When a line with a conflict matches the regular expression then\n"
+ "- if available - C, otherwise B will be chosen.");
+ QToolTip::add( label, s_autoMergeRegExpToolTip );
+ ++line;
+
+ OptionCheckBox* pAutoMergeRegExp = new OptionCheckBox( i18n("Run regular expression auto merge on merge start"), false, "RunRegExpAutoMergeOnMergeStart", &m_bRunRegExpAutoMergeOnMergeStart, page, this );
+ gbox->addMultiCellWidget( pAutoMergeRegExp, line, line, 0, 1 );
+ QToolTip::add( pAutoMergeRegExp, i18n( "Run the merge for auto merge regular expressions\n"
+ "immediately when a merge starts.\n"));
+ ++line;
+ }
+
+ pGroupBox = new QGroupBox( 2, Qt::Horizontal, i18n("Version Control History Merging"), page);
+ gbox->addMultiCellWidget( pGroupBox, line,line,0,1);
+ ++line;
+ {
+ QWidget* page = new QWidget( pGroupBox );
+ QGridLayout* gbox = new QGridLayout( page, 2, 2, spacingHint() );
+ gbox->setColStretch(1,10);
+ int line = 0;
+
+ label = new QLabel( i18n("History start regular expression:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pHistoryStartRegExpLineEdit = new OptionLineEdit( ".*\\$Log.*\\$.*", "HistoryStartRegExp", &m_historyStartRegExp, page, this );
+ gbox->addWidget( m_pHistoryStartRegExpLineEdit, line, 1 );
+ s_historyStartRegExpToolTip = i18n("Regular expression for the start of the version control history entry.\n"
+ "Usually this line contains the \"$Log$\"-keyword.\n"
+ "Default value: \".*\\$Log.*\\$.*\"");
+ QToolTip::add( label, s_historyStartRegExpToolTip );
+ ++line;
+
+ label = new QLabel( i18n("History entry start regular expression:"), page );
+ gbox->addWidget( label, line, 0 );
+ // Example line: "** \main\rolle_fsp_dev_008\1 17 Aug 2001 10:45:44 rolle"
+ QString historyEntryStartDefault =
+ "\\s*\\\\main\\\\(\\S+)\\s+" // Start with "\main\"
+ "([0-9]+) " // day
+ "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) " //month
+ "([0-9][0-9][0-9][0-9]) " // year
+ "([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\\s+(.*)"; // time, name
+
+ m_pHistoryEntryStartRegExpLineEdit = new OptionLineEdit( historyEntryStartDefault, "HistoryEntryStartRegExp", &m_historyEntryStartRegExp, page, this );
+ gbox->addWidget( m_pHistoryEntryStartRegExpLineEdit, line, 1 );
+ s_historyEntryStartRegExpToolTip = i18n("A version control history entry consists of several lines.\n"
+ "Specify the regular expression to detect the first line (without the leading comment).\n"
+ "Use parentheses to group the keys you want to use for sorting.\n"
+ "If left empty, then KDiff3 assumes that empty lines separate history entries.\n"
+ "See the documentation for details.");
+ QToolTip::add( label, s_historyEntryStartRegExpToolTip );
+ ++line;
+
+ m_pHistoryMergeSorting = new OptionCheckBox( i18n("History merge sorting"), false, "HistoryMergeSorting", &m_bHistoryMergeSorting, page, this );
+ gbox->addMultiCellWidget( m_pHistoryMergeSorting, line, line, 0, 1 );
+ QToolTip::add( m_pHistoryMergeSorting, i18n("Sort version control history by a key.") );
+ ++line;
+ //QString branch = newHistoryEntry.cap(1);
+ //int day = newHistoryEntry.cap(2).toInt();
+ //int month = QString("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec").find(newHistoryEntry.cap(3))/4 + 1;
+ //int year = newHistoryEntry.cap(4).toInt();
+ //QString time = newHistoryEntry.cap(5);
+ //QString name = newHistoryEntry.cap(6);
+ QString defaultSortKeyOrder = "4,3,2,5,1,6"; //QDate(year,month,day).toString(Qt::ISODate) +" "+ time + " " + branch + " " + name;
+
+ label = new QLabel( i18n("History entry start sort key order:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pHistorySortKeyOrderLineEdit = new OptionLineEdit( defaultSortKeyOrder, "HistoryEntryStartSortKeyOrder", &m_historyEntryStartSortKeyOrder, page, this );
+ gbox->addWidget( m_pHistorySortKeyOrderLineEdit, line, 1 );
+ s_historyEntryStartSortKeyOrderToolTip = i18n("Each parentheses used in the regular expression for the history start entry\n"
+ "groups a key that can be used for sorting.\n"
+ "Specify the list of keys (that are numbered in order of occurrence\n"
+ "starting with 1) using ',' as separator (e.g. \"4,5,6,1,2,3,7\").\n"
+ "If left empty, then no sorting will be done.\n"
+ "See the documentation for details.");
+ QToolTip::add( label, s_historyEntryStartSortKeyOrderToolTip );
+ m_pHistorySortKeyOrderLineEdit->setEnabled(false);
+ connect( m_pHistoryMergeSorting, SIGNAL(toggled(bool)), m_pHistorySortKeyOrderLineEdit, SLOT(setEnabled(bool)));
+ ++line;
+
+ m_pHistoryAutoMerge = new OptionCheckBox( i18n("Merge version control history on merge start"), false, "RunHistoryAutoMergeOnMergeStart", &m_bRunHistoryAutoMergeOnMergeStart, page, this );
+ gbox->addMultiCellWidget( m_pHistoryAutoMerge, line, line, 0, 1 );
+ QToolTip::add( m_pHistoryAutoMerge, i18n("Run version control history automerge on merge start.") );
+ ++line;
+
+ OptionIntEdit* pMaxNofHistoryEntries = new OptionIntEdit( -1, "MaxNofHistoryEntries", &m_maxNofHistoryEntries, -1, 1000, page, this );
+ label = new QLabel( pMaxNofHistoryEntries, i18n("Max number of history entries:"), page );
+ gbox->addWidget( label, line, 0 );
+ gbox->addWidget( pMaxNofHistoryEntries, line, 1 );
+ QToolTip::add( pMaxNofHistoryEntries, i18n("Cut off after specified number. Use -1 for infinite number of entries.") );
+ ++line;
+ }
+
+ QPushButton* pButton = new QPushButton( i18n("Test your regular expressions"), page );
+ gbox->addWidget( pButton, line, 0 );
+ connect( pButton, SIGNAL(clicked()), this, SLOT(slotHistoryMergeRegExpTester()));
+ ++line;
+
+ label = new QLabel( i18n("Irrelevant merge command:"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionLineEdit* pLE = new OptionLineEdit( "", "IrrelevantMergeCmd", &m_IrrelevantMergeCmd, page, this );
+ gbox->addWidget( pLE, line, 1 );
+ QToolTip::add( label, i18n("If specified this script is run after automerge\n"
+ "when no other relevant changes were detected.\n"
+ "Called with the parameters: filename1 filename2 filename3") );
+ ++line;
+
+
+ OptionCheckBox* pAutoSaveAndQuit = new OptionCheckBox( i18n("Auto save and quit on merge without conflicts"), false,
+ "AutoSaveAndQuitOnMergeWithoutConflicts", &m_bAutoSaveAndQuitOnMergeWithoutConflicts, page, this );
+ gbox->addMultiCellWidget( pAutoSaveAndQuit, line, line, 0, 1 );
+ QToolTip::add( pAutoSaveAndQuit, i18n("When KDiff3 was started for a file-merge from the commandline and all\n"
+ "conflicts are solvable without user interaction then automatically save and quit.\n"
+ "(Similar to command line option \"--auto\".") );
+ ++line;
+
+ topLayout->addStretch(10);
+}
+
+void OptionDialog::setupDirectoryMergePage( void )
+{
+ QFrame *page = addPage( i18n("Directory Merge"), i18n("Directory Merge"),
+ BarIcon("folder", KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout( 11, 2 );
+ gbox->setColStretch(1,5);
+ topLayout->addLayout( gbox );
+ int line=0;
+
+ OptionCheckBox* pRecursiveDirs = new OptionCheckBox( i18n("Recursive directories"), true, "RecursiveDirs", &m_bDmRecursiveDirs, page, this );
+ gbox->addMultiCellWidget( pRecursiveDirs, line, line, 0, 1 );
+ QToolTip::add( pRecursiveDirs, i18n("Whether to analyze subdirectories or not.") );
+ ++line;
+ QLabel* label = new QLabel( i18n("File pattern(s):"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionLineEdit* pFilePattern = new OptionLineEdit( "*", "FilePattern", &m_DmFilePattern, page, this );
+ gbox->addWidget( pFilePattern, line, 1 );
+ QToolTip::add( label, i18n(
+ "Pattern(s) of files to be analyzed. \n"
+ "Wildcards: '*' and '?'\n"
+ "Several Patterns can be specified by using the separator: ';'"
+ ));
+ ++line;
+
+ label = new QLabel( i18n("File-anti-pattern(s):"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionLineEdit* pFileAntiPattern = new OptionLineEdit( "*.orig;*.o;*.obj", "FileAntiPattern", &m_DmFileAntiPattern, page, this );
+ gbox->addWidget( pFileAntiPattern, line, 1 );
+ QToolTip::add( label, i18n(
+ "Pattern(s) of files to be excluded from analysis. \n"
+ "Wildcards: '*' and '?'\n"
+ "Several Patterns can be specified by using the separator: ';'"
+ ));
+ ++line;
+
+ label = new QLabel( i18n("Dir-anti-pattern(s):"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionLineEdit* pDirAntiPattern = new OptionLineEdit( "CVS;.deps;.svn", "DirAntiPattern", &m_DmDirAntiPattern, page, this );
+ gbox->addWidget( pDirAntiPattern, line, 1 );
+ QToolTip::add( label, i18n(
+ "Pattern(s) of directories to be excluded from analysis. \n"
+ "Wildcards: '*' and '?'\n"
+ "Several Patterns can be specified by using the separator: ';'"
+ ));
+ ++line;
+
+ OptionCheckBox* pUseCvsIgnore = new OptionCheckBox( i18n("Use .cvsignore"), false, "UseCvsIgnore", &m_bDmUseCvsIgnore, page, this );
+ gbox->addMultiCellWidget( pUseCvsIgnore, line, line, 0, 1 );
+ QToolTip::add( pUseCvsIgnore, i18n(
+ "Extends the antipattern to anything that would be ignored by CVS.\n"
+ "Via local \".cvsignore\"-files this can be directory specific."
+ ));
+ ++line;
+
+ OptionCheckBox* pFindHidden = new OptionCheckBox( i18n("Find hidden files and directories"), true, "FindHidden", &m_bDmFindHidden, page, this );
+ gbox->addMultiCellWidget( pFindHidden, line, line, 0, 1 );
+#ifdef _WIN32
+ QToolTip::add( pFindHidden, i18n("Finds files and directories with the hidden attribute.") );
+#else
+ QToolTip::add( pFindHidden, i18n("Finds files and directories starting with '.'.") );
+#endif
+ ++line;
+
+ OptionCheckBox* pFollowFileLinks = new OptionCheckBox( i18n("Follow file links"), false, "FollowFileLinks", &m_bDmFollowFileLinks, page, this );
+ gbox->addMultiCellWidget( pFollowFileLinks, line, line, 0, 1 );
+ QToolTip::add( pFollowFileLinks, i18n(
+ "On: Compare the file the link points to.\n"
+ "Off: Compare the links."
+ ));
+ ++line;
+
+ OptionCheckBox* pFollowDirLinks = new OptionCheckBox( i18n("Follow directory links"), false, "FollowDirLinks", &m_bDmFollowDirLinks, page, this );
+ gbox->addMultiCellWidget( pFollowDirLinks, line, line, 0, 1 );
+ QToolTip::add( pFollowDirLinks, i18n(
+ "On: Compare the directory the link points to.\n"
+ "Off: Compare the links."
+ ));
+ ++line;
+
+ //OptionCheckBox* pShowOnlyDeltas = new OptionCheckBox( i18n("List only deltas"),false,"ListOnlyDeltas", &m_bDmShowOnlyDeltas, page, this );
+ //gbox->addMultiCellWidget( pShowOnlyDeltas, line, line, 0, 1 );
+ //QToolTip::add( pShowOnlyDeltas, i18n(
+ // "Files and directories without change will not appear in the list."));
+ //++line;
+
+#ifdef _WIN32
+ bool bCaseSensitiveFilenameComparison = false;
+#else
+ bool bCaseSensitiveFilenameComparison = true;
+#endif
+ OptionCheckBox* pCaseSensitiveFileNames = new OptionCheckBox( i18n("Case sensitive filename comparison"),bCaseSensitiveFilenameComparison,"CaseSensitiveFilenameComparison", &m_bDmCaseSensitiveFilenameComparison, page, this );
+ gbox->addMultiCellWidget( pCaseSensitiveFileNames, line, line, 0, 1 );
+ QToolTip::add( pCaseSensitiveFileNames, i18n(
+ "The directory comparison will compare files or directories when their names match.\n"
+ "Set this option if the case of the names must match. (Default for Windows is off, otherwise on.)"));
+ ++line;
+
+ QVButtonGroup* pBG = new QVButtonGroup(i18n("File Comparison Mode"),page);
+ gbox->addMultiCellWidget( pBG, line, line, 0, 1 );
+ ++line;
+
+ OptionRadioButton* pBinaryComparison = new OptionRadioButton( i18n("Binary comparison"), true, "BinaryComparison", &m_bDmBinaryComparison, pBG, this );
+ QToolTip::add( pBinaryComparison, i18n("Binary comparison of each file. (Default)") );
+
+ OptionRadioButton* pFullAnalysis = new OptionRadioButton( i18n("Full analysis"), false, "FullAnalysis", &m_bDmFullAnalysis, pBG, this );
+ QToolTip::add( pFullAnalysis, i18n("Do a full analysis and show statistics information in extra columns.\n"
+ "(Slower than a binary comparison, much slower for binary files.)") );
+
+ OptionRadioButton* pTrustDate = new OptionRadioButton( i18n("Trust the size and modification date (unsafe)"), false, "TrustDate", &m_bDmTrustDate, pBG, this );
+ QToolTip::add( pTrustDate, i18n("Assume that files are equal if the modification date and file length are equal.\n"
+ "Files with equal contents but different modification dates will appear as different.\n"
+ "Useful for big directories or slow networks.") );
+
+ OptionRadioButton* pTrustDateFallbackToBinary = new OptionRadioButton( i18n("Trust the size and date, but use binary comparison if date doesn't match (unsafe)"), false, "TrustDateFallbackToBinary", &m_bDmTrustDateFallbackToBinary, pBG, this );
+ QToolTip::add( pTrustDateFallbackToBinary, i18n("Assume that files are equal if the modification date and file length are equal.\n"
+ "If the date isn't equal but the sizes are, use binary comparison.\n"
+ "Useful for big directories or slow networks.") );
+
+ OptionRadioButton* pTrustSize = new OptionRadioButton( i18n("Trust the size (unsafe)"), false, "TrustSize", &m_bDmTrustSize, pBG, this );
+ QToolTip::add( pTrustSize, i18n("Assume that files are equal if their file lengths are equal.\n"
+ "Useful for big directories or slow networks when the date is modified during download.") );
+
+ // Some two Dir-options: Affects only the default actions.
+ OptionCheckBox* pSyncMode = new OptionCheckBox( i18n("Synchronize directories"), false,"SyncMode", &m_bDmSyncMode, page, this );
+ gbox->addMultiCellWidget( pSyncMode, line, line, 0, 1 );
+ QToolTip::add( pSyncMode, i18n(
+ "Offers to store files in both directories so that\n"
+ "both directories are the same afterwards.\n"
+ "Works only when comparing two directories without specifying a destination." ) );
+ ++line;
+
+ // Allow white-space only differences to be considered equal
+ OptionCheckBox* pWhiteSpaceDiffsEqual = new OptionCheckBox( i18n("White space differences considered equal"), true,"WhiteSpaceEqual", &m_bDmWhiteSpaceEqual, page, this );
+ gbox->addMultiCellWidget( pWhiteSpaceDiffsEqual, line, line, 0, 1 );
+ QToolTip::add( pWhiteSpaceDiffsEqual, i18n(
+ "If files differ only by white space consider them equal.\n"
+ "This is only active when full analysis is chosen." ) );
+ connect(pFullAnalysis, SIGNAL(toggled(bool)), pWhiteSpaceDiffsEqual, SLOT(setEnabled(bool)));
+ pWhiteSpaceDiffsEqual->setEnabled(false);
+ ++line;
+
+ OptionCheckBox* pCopyNewer = new OptionCheckBox( i18n("Copy newer instead of merging (unsafe)"), false, "CopyNewer", &m_bDmCopyNewer, page, this );
+ gbox->addMultiCellWidget( pCopyNewer, line, line, 0, 1 );
+ QToolTip::add( pCopyNewer, i18n(
+ "Don't look inside, just take the newer file.\n"
+ "(Use this only if you know what you are doing!)\n"
+ "Only effective when comparing two directories." ) );
+ ++line;
+
+ OptionCheckBox* pCreateBakFiles = new OptionCheckBox( i18n("Backup files (.orig)"), true, "CreateBakFiles", &m_bDmCreateBakFiles, page, this );
+ gbox->addMultiCellWidget( pCreateBakFiles, line, line, 0, 1 );
+ QToolTip::add( pCreateBakFiles, i18n(
+ "When a file would be saved over an old file, then the old file\n"
+ "will be renamed with a '.orig'-extension instead of being deleted."));
+ ++line;
+
+ topLayout->addStretch(10);
+}
+/*
+static void insertCodecs(OptionComboBox* p)
+{
+ std::multimap<QString,QString> m; // Using the multimap for case-insensitive sorting.
+ int i;
+ for(i=0;;++i)
+ {
+ QTextCodec* pCodec = QTextCodec::codecForIndex ( i );
+ if ( pCodec != 0 ) m.insert( std::make_pair( QString(pCodec->mimeName()).upper(), pCodec->mimeName()) );
+ else break;
+ }
+
+ p->insertItem( i18n("Auto"), 0 );
+ std::multimap<QString,QString>::iterator mi;
+ for(mi=m.begin(), i=0; mi!=m.end(); ++mi, ++i)
+ p->insertItem(mi->second, i+1);
+}
+*/
+
+// UTF8-Codec that saves a BOM
+class Utf8BOMCodec : public QTextCodec
+{
+ public:
+ const char * name () const { return "UTF-8-BOM"; }
+ int mibEnum () const { return 2123; }
+ int heuristicContentMatch(const char*, int) const { return 0; }
+ class UTF8BOMEncoder : public QTextEncoder
+ {
+ bool bBOMAdded;
+ public:
+ UTF8BOMEncoder() { bBOMAdded=false; }
+ QCString fromUnicode(const QString& uc, int& lenInOut )
+ {
+ QCString r;
+ if (!bBOMAdded)
+ {
+ r += "\xEF\xBB\xBF";
+ bBOMAdded=true;
+ }
+ r += uc.utf8();
+ lenInOut = r.length();
+ return r;
+ }
+ };
+ QTextEncoder* makeEncoder() const
+ {
+ return new UTF8BOMEncoder;
+ }
+
+ class UTF8BOMDecoder : public QTextDecoder
+ {
+ QTextDecoder *m_pDecoder;
+ public:
+ UTF8BOMDecoder() { m_pDecoder = QTextCodec::codecForName("UTF-8")->makeDecoder(); }
+ ~UTF8BOMDecoder() {
+ delete m_pDecoder;
+ }
+ QString toUnicode( const char* p, int len)
+ {
+ return m_pDecoder->toUnicode( p, len );
+ }
+ };
+ QTextDecoder* makeDecoder() const
+ {
+ return new UTF8BOMDecoder;
+ }
+};
+
+void OptionDialog::setupRegionalPage( void )
+{
+ new Utf8BOMCodec();
+
+ QFrame *page = addPage( i18n("Regional Settings"), i18n("Regional Settings"),
+ BarIcon("locale"/*"charset"*/, KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout( 3, 2 );
+ gbox->setColStretch(1,5);
+ topLayout->addLayout( gbox );
+ int line=0;
+
+ QLabel* label;
+
+#ifdef KREPLACEMENTS_H
+
+static char* countryMap[]={
+"af Afrikaans",
+"ar Arabic",
+"az Azerbaijani",
+"be Belarusian",
+"bg Bulgarian",
+"bn Bengali",
+"bo Tibetan",
+"br Breton",
+"bs Bosnian",
+"ca Catalan",
+"cs Czech",
+"cy Welsh",
+"da Danish",
+"de German",
+"el Greek",
+"en_GB British English",
+"eo Esperanto",
+"es Spanish",
+"et Estonian",
+"eu Basque",
+"fa Farsi (Persian)",
+"fi Finnish",
+"fo Faroese",
+"fr French",
+"ga Irish Gaelic",
+"gl Galician",
+"gu Gujarati",
+"he Hebrew",
+"hi Hindi",
+"hr Croatian",
+"hsb Upper Sorbian",
+"hu Hungarian",
+"id Indonesian",
+"is Icelandic",
+"it Italian",
+"ja Japanese",
+"ka Georgian",
+"ko Korean",
+"ku Kurdish",
+"lo Lao",
+"lt Lithuanian",
+"lv Latvian",
+"mi Maori",
+"mk Macedonian",
+"mn Mongolian",
+"ms Malay",
+"mt Maltese",
+"nb Norwegian Bookmal",
+"nds Low Saxon",
+"nl Dutch",
+"nn Norwegian Nynorsk",
+"nso Northern Sotho",
+"oc Occitan",
+"pl Polish",
+"pt Portuguese",
+"pt_BR Brazilian Portuguese",
+"ro Romanian",
+"ru Russian",
+"rw Kinyarwanda",
+"se Northern Sami",
+"sk Slovak",
+"sl Slovenian",
+"sq Albanian",
+"sr Serbian",
+"sr@Latn Serbian",
+"ss Swati",
+"sv Swedish",
+"ta Tamil",
+"tg Tajik",
+"th Thai",
+"tr Turkish",
+"uk Ukrainian",
+"uz Uzbek",
+"ven Venda",
+"vi Vietnamese",
+"wa Walloon",
+"xh Xhosa",
+"zh_CN Chinese Simplified",
+"zh_TW Chinese Traditional",
+"zu Zulu"
+};
+
+ label = new QLabel( i18n("Language (restart required)"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionComboBox* pLanguage = new OptionComboBox( 0, "Language", &m_language, page, this );
+ gbox->addWidget( pLanguage, line, 1 );
+ pLanguage->insertItem( "Auto", 0 ); // Must not translate, won't work otherwise!
+ pLanguage->insertItem( "en_orig" );
+
+ // Read directory: Find all kdiff3_*.qm-files and insert the found files here selection
+ FileAccess fa( getTranslationDir() );
+ t_DirectoryList dirList;
+ fa.listDir( &dirList, false, false, "kdiff3_*.qm", "", "*", false, false );
+ t_DirectoryList::iterator i;
+ for( i=dirList.begin(); i!=dirList.end(); ++i)
+ {
+ QString fileName = i->fileName();
+ // Skip the "kdiff3_" and omit the .qm
+ QString languageId = fileName.mid(7, fileName.length()-10 );
+
+ unsigned int countryIdx=0;
+ for(countryIdx=0; countryIdx< sizeof(countryMap)/sizeof(countryMap[0]); ++countryIdx )
+ {
+ QString fullName = countryMap[countryIdx];
+ if ( languageId+" " == fullName.left(languageId.length()+1) )
+ {
+ languageId += " (" + fullName.mid(languageId.length()+1) + ")";
+ }
+ }
+
+ pLanguage->insertItem( languageId );
+ }
+
+ QToolTip::add( label, i18n(
+ "Choose the language of the GUI-strings or \"Auto\".\n"
+ "For a change of language to take place, quit and restart KDiff3.")
+ );
+ ++line;
+/*
+ label = new QLabel( i18n("Codec for file contents"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionComboBox* pFileCodec = new OptionComboBox( 0, "FileCodec", &m_fileCodec, page, this );
+ gbox->addWidget( pFileCodec, line, 1 );
+ insertCodecs( pFileCodec );
+ QToolTip::add( label, i18n(
+ "Choose the codec that should be used for your input files\n"
+ "or \"Auto\" if unsure." )
+ );
+ ++line;
+*/
+#endif
+
+ m_pSameEncoding = new OptionCheckBox( i18n("Use the same encoding for everything:"), true, "SameEncoding", &m_bSameEncoding, page, this );
+ gbox->addMultiCellWidget( m_pSameEncoding, line, line, 0, 1 );
+ QToolTip::add( m_pSameEncoding, i18n(
+ "Enable this allows to change all encodings by changing the first only.\n"
+ "Disable this if different individual settings are needed."
+ ) );
+ ++line;
+
+ label = new QLabel( i18n("Note: Local Encoding is ") + "\"" + QTextCodec::codecForLocale()->name() + "\"", page );
+ gbox->addWidget( label, line, 0 );
+ ++line;
+
+ label = new QLabel( i18n("File Encoding for A:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pEncodingAComboBox = new OptionEncodingComboBox( "EncodingForA", &m_pEncodingA, page, this );
+ gbox->addWidget( m_pEncodingAComboBox, line, 1 );
+
+ QString autoDetectToolTip = i18n(
+ "If enabled then Unicode (UTF-16 or UTF-8) encoding will be detected.\n"
+ "If the file encoding is not detected then the selected encoding will be used as fallback.\n"
+ "(Unicode detection depends on the first bytes of a file - the byte order mark \"BOM\".)"
+ );
+ m_pAutoDetectUnicodeA = new OptionCheckBox( i18n("Auto Detect Unicode"), true, "AutoDetectUnicodeA", &m_bAutoDetectUnicodeA, page, this );
+ gbox->addWidget( m_pAutoDetectUnicodeA, line, 2 );
+ QToolTip::add( m_pAutoDetectUnicodeA, autoDetectToolTip );
+ ++line;
+
+ label = new QLabel( i18n("File Encoding for B:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pEncodingBComboBox = new OptionEncodingComboBox( "EncodingForB", &m_pEncodingB, page, this );
+ gbox->addWidget( m_pEncodingBComboBox, line, 1 );
+ m_pAutoDetectUnicodeB = new OptionCheckBox( i18n("Auto Detect Unicode"), true, "AutoDetectUnicodeB", &m_bAutoDetectUnicodeB, page, this );
+ gbox->addWidget( m_pAutoDetectUnicodeB, line, 2 );
+ QToolTip::add( m_pAutoDetectUnicodeB, autoDetectToolTip );
+ ++line;
+
+ label = new QLabel( i18n("File Encoding for C:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pEncodingCComboBox = new OptionEncodingComboBox( "EncodingForC", &m_pEncodingC, page, this );
+ gbox->addWidget( m_pEncodingCComboBox, line, 1 );
+ m_pAutoDetectUnicodeC = new OptionCheckBox( i18n("Auto Detect Unicode"), true, "AutoDetectUnicodeC", &m_bAutoDetectUnicodeC, page, this );
+ gbox->addWidget( m_pAutoDetectUnicodeC, line, 2 );
+ QToolTip::add( m_pAutoDetectUnicodeC, autoDetectToolTip );
+ ++line;
+
+ label = new QLabel( i18n("File Encoding for Merge Output and Saving:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pEncodingOutComboBox = new OptionEncodingComboBox( "EncodingForOutput", &m_pEncodingOut, page, this );
+ gbox->addWidget( m_pEncodingOutComboBox, line, 1 );
+ m_pAutoSelectOutEncoding = new OptionCheckBox( i18n("Auto Select"), true, "AutoSelectOutEncoding", &m_bAutoSelectOutEncoding, page, this );
+ gbox->addWidget( m_pAutoSelectOutEncoding, line, 2 );
+ QToolTip::add( m_pAutoSelectOutEncoding, i18n(
+ "If enabled then the encoding from the input files is used.\n"
+ "In ambiguous cases a dialog will ask the user to choose the encoding for saving."
+ ) );
+ ++line;
+ label = new QLabel( i18n("File Encoding for Preprocessor Files:"), page );
+ gbox->addWidget( label, line, 0 );
+ m_pEncodingPPComboBox = new OptionEncodingComboBox( "EncodingForPP", &m_pEncodingPP, page, this );
+ gbox->addWidget( m_pEncodingPPComboBox, line, 1 );
+ ++line;
+
+ connect(m_pSameEncoding, SIGNAL(toggled(bool)), this, SLOT(slotEncodingChanged()));
+ connect(m_pEncodingAComboBox, SIGNAL(activated(int)), this, SLOT(slotEncodingChanged()));
+ connect(m_pAutoDetectUnicodeA, SIGNAL(toggled(bool)), this, SLOT(slotEncodingChanged()));
+ connect(m_pAutoSelectOutEncoding, SIGNAL(toggled(bool)), this, SLOT(slotEncodingChanged()));
+
+ OptionCheckBox* pRightToLeftLanguage = new OptionCheckBox( i18n("Right To Left Language"), false, "RightToLeftLanguage", &m_bRightToLeftLanguage, page, this );
+ gbox->addMultiCellWidget( pRightToLeftLanguage, line, line, 0, 1 );
+ QToolTip::add( pRightToLeftLanguage, i18n(
+ "Some languages are read from right to left.\n"
+ "This setting will change the viewer and editor accordingly."));
+ ++line;
+
+
+ topLayout->addStretch(10);
+}
+
+#ifdef _WIN32
+#include "ccInstHelper.cpp"
+#endif
+
+void OptionDialog::setupIntegrationPage( void )
+{
+ QFrame *page = addPage( i18n("Integration"), i18n("Integration Settings"),
+ BarIcon("launch"/*"charset"*/, KIcon::SizeMedium ) );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 5, spacingHint() );
+
+ QGridLayout *gbox = new QGridLayout( 3, 3 );
+ gbox->setColStretch(2,5);
+ topLayout->addLayout( gbox );
+ int line=0;
+
+ QLabel* label;
+ label = new QLabel( i18n("Command line options to ignore:"), page );
+ gbox->addWidget( label, line, 0 );
+ OptionLineEdit* pIgnorableCmdLineOptions = new OptionLineEdit( "-u;-query;-html;-abort", "IgnorableCmdLineOptions", &m_ignorableCmdLineOptions, page, this );
+ gbox->addMultiCellWidget( pIgnorableCmdLineOptions, line, line, 1,2 );
+ QToolTip::add( label, i18n(
+ "List of command line options that should be ignored when KDiff3 is used by other tools.\n"
+ "Several values can be specified if separated via ';'\n"
+ "This will suppress the \"Unknown option\"-error."
+ ));
+ ++line;
+
+#ifdef _WIN32
+ QPushButton* pIntegrateWithClearCase = new QPushButton( i18n("Integrate with ClearCase"), page);
+ gbox->addWidget( pIntegrateWithClearCase, line, 0 );
+ QToolTip::add( pIntegrateWithClearCase, i18n(
+ "Integrate with Rational ClearCase from IBM.\n"
+ "Modifies the \"map\" file in ClearCase-subdir \"lib/mgrs\"\n"
+ "(Only enabled when ClearCase \"bin\" directory is in the path.)"));
+ connect(pIntegrateWithClearCase, SIGNAL(clicked()),this, SLOT(slotIntegrateWithClearCase()) );
+ pIntegrateWithClearCase->setEnabled( integrateWithClearCase( "existsClearCase", "" )!=0 );
+
+ QPushButton* pRemoveClearCaseIntegration = new QPushButton( i18n("Remove ClearCase Integration"), page);
+ gbox->addWidget( pRemoveClearCaseIntegration, line, 1 );
+ QToolTip::add( pRemoveClearCaseIntegration, i18n(
+ "Restore the old \"map\" file from before doing the Clearcase integration."));
+ connect(pRemoveClearCaseIntegration, SIGNAL(clicked()),this, SLOT(slotRemoveClearCaseIntegration()) );
+ pRemoveClearCaseIntegration->setEnabled( integrateWithClearCase( "existsClearCase", "" )!=0 );
+
+ ++line;
+#endif
+
+ topLayout->addStretch(10);
+}
+
+void OptionDialog::slotIntegrateWithClearCase()
+{
+#ifdef _WIN32
+ char kdiff3CommandPath[1000];
+ GetModuleFileNameA( 0, kdiff3CommandPath, sizeof(kdiff3CommandPath)-1 );
+ integrateWithClearCase( "install", kdiff3CommandPath );
+#endif
+}
+
+void OptionDialog::slotRemoveClearCaseIntegration()
+{
+#ifdef _WIN32
+ char kdiff3CommandPath[1000];
+ GetModuleFileNameA( 0, kdiff3CommandPath, sizeof(kdiff3CommandPath)-1 );
+ integrateWithClearCase( "uninstall", kdiff3CommandPath );
+#endif
+}
+
+void OptionDialog::slotEncodingChanged()
+{
+ if ( m_pSameEncoding->isChecked() )
+ {
+ m_pEncodingBComboBox->setEnabled( false );
+ m_pEncodingBComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() );
+ m_pEncodingCComboBox->setEnabled( false );
+ m_pEncodingCComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() );
+ m_pEncodingOutComboBox->setEnabled( false );
+ m_pEncodingOutComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() );
+ m_pEncodingPPComboBox->setEnabled( false );
+ m_pEncodingPPComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() );
+ m_pAutoDetectUnicodeB->setEnabled( false );
+ m_pAutoDetectUnicodeB->setChecked( m_pAutoDetectUnicodeA->isChecked() );
+ m_pAutoDetectUnicodeC->setEnabled( false );
+ m_pAutoDetectUnicodeC->setChecked( m_pAutoDetectUnicodeA->isChecked() );
+ m_pAutoSelectOutEncoding->setEnabled( false );
+ m_pAutoSelectOutEncoding->setChecked( m_pAutoDetectUnicodeA->isChecked() );
+ }
+ else
+ {
+ m_pEncodingBComboBox->setEnabled( true );
+ m_pEncodingCComboBox->setEnabled( true );
+ m_pEncodingOutComboBox->setEnabled( true );
+ m_pEncodingPPComboBox->setEnabled( true );
+ m_pAutoDetectUnicodeB->setEnabled( true );
+ m_pAutoDetectUnicodeC->setEnabled( true );
+ m_pAutoSelectOutEncoding->setEnabled( true );
+ m_pEncodingOutComboBox->setEnabled( !m_pAutoSelectOutEncoding->isChecked() );
+ }
+}
+
+void OptionDialog::setupKeysPage( void )
+{
+ //QVBox *page = addVBoxPage( i18n("Keys"), i18n("KeyDialog" ),
+ // BarIcon("fonts", KIcon::SizeMedium ) );
+
+ //QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
+ // new KFontChooser( page,"font",false/*onlyFixed*/,QStringList(),false,6 );
+ //m_pKeyDialog=new KKeyDialog( false, 0 );
+ //topLayout->addWidget( m_pKeyDialog );
+}
+
+void OptionDialog::slotOk( void )
+{
+ slotApply();
+
+ // My system returns variable width fonts even though I
+ // disabled this. Even QFont::fixedPitch() doesn't work.
+ QFontMetrics fm(m_font);
+ if ( fm.width('W')!=fm.width('i') )
+ {
+ int result = KMessageBox::warningYesNo(this, i18n(
+ "You selected a variable width font.\n\n"
+ "Because this program doesn't handle variable width fonts\n"
+ "correctly, you might experience problems while editing.\n\n"
+ "Do you want to continue or do you want to select another font."),
+ i18n("Incompatible Font"),
+ i18n("Continue at Own Risk"), i18n("Select Another Font"));
+ if (result==KMessageBox::No)
+ return;
+ }
+
+ accept();
+}
+
+
+/** Copy the values from the widgets to the public variables.*/
+void OptionDialog::slotApply( void )
+{
+ std::list<OptionItem*>::iterator i;
+ for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
+ {
+ (*i)->apply();
+ }
+
+ emit applyClicked();
+
+#ifdef _WIN32
+ QString locale = m_language;
+ if ( locale == "Auto" || locale.isEmpty() )
+ locale = locale = QTextCodec::locale();
+ int spacePos = locale.find(' ');
+ if (spacePos>0) locale = locale.left(spacePos);
+ QSettings settings;
+ settings.setPath("KDiff3", "diff-ext", QSettings::User );
+ settings.writeEntry( "Language", locale );
+#endif
+}
+
+/** Set the default values in the widgets only, while the
+ public variables remain unchanged. */
+void OptionDialog::slotDefault()
+{
+ int result = KMessageBox::warningContinueCancel(this, i18n("This resets all options. Not only those of the current topic.") );
+ if ( result==KMessageBox::Cancel ) return;
+ else resetToDefaults();
+}
+
+void OptionDialog::resetToDefaults()
+{
+ std::list<OptionItem*>::iterator i;
+ for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
+ {
+ (*i)->setToDefault();
+ }
+
+ slotEncodingChanged();
+}
+
+/** Initialise the widgets using the values in the public varibles. */
+void OptionDialog::setState()
+{
+ std::list<OptionItem*>::iterator i;
+ for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
+ {
+ (*i)->setToCurrent();
+ }
+
+ slotEncodingChanged();
+}
+
+class ConfigValueMap : public ValueMap
+{
+private:
+ KConfig* m_pConfig;
+public:
+ ConfigValueMap( KConfig* pConfig ) { m_pConfig = pConfig; }
+
+ void writeEntry(const QString& s, const QFont& v ){ m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, const QColor& v ){ m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, const QSize& v ){ m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, const QPoint& v ){ m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, int v ) { m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, bool v ) { m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, const QStringList& v, char separator ){ m_pConfig->writeEntry(s,v,separator); }
+ void writeEntry(const QString& s, const QString& v ){ m_pConfig->writeEntry(s,v); }
+ void writeEntry(const QString& s, const char* v ) { m_pConfig->writeEntry(s,v); }
+
+ QFont readFontEntry (const QString& s, QFont* defaultVal ) { return m_pConfig->readFontEntry(s,defaultVal); }
+ QColor readColorEntry(const QString& s, QColor* defaultVal ){ return m_pConfig->readColorEntry(s,defaultVal); }
+ QSize readSizeEntry (const QString& s, QSize* defaultVal ) { return m_pConfig->readSizeEntry(s,defaultVal); }
+ QPoint readPointEntry(const QString& s, QPoint* defaultVal) { return m_pConfig->readPointEntry(s,defaultVal); }
+ bool readBoolEntry (const QString& s, bool defaultVal ) { return m_pConfig->readBoolEntry(s,defaultVal); }
+ int readNumEntry (const QString& s, int defaultVal ) { return m_pConfig->readNumEntry(s,defaultVal); }
+ QStringList readListEntry (const QString& s, const QStringList& def, char separator ) { return m_pConfig->readListEntry(s.latin1(),def,separator); }
+ QString readEntry (const QString& s, const QString& defaultVal){ return m_pConfig->readEntry(s,defaultVal); }
+};
+
+void OptionDialog::saveOptions( KConfig* config )
+{
+ // No i18n()-Translations here!
+
+ config->setGroup("KDiff3 Options");
+
+ ConfigValueMap cvm(config);
+ std::list<OptionItem*>::iterator i;
+ for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
+ {
+ (*i)->write(&cvm);
+ }
+}
+
+void OptionDialog::readOptions( KConfig* config )
+{
+ // No i18n()-Translations here!
+
+ config->setGroup("KDiff3 Options");
+
+ ConfigValueMap cvm(config);
+ std::list<OptionItem*>::iterator i;
+ for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
+ {
+ (*i)->read(&cvm);
+ }
+
+ setState();
+}
+
+void OptionDialog::slotHelp( void )
+{
+ KDialogBase::slotHelp();
+}
+
+QString OptionDialog::parseOptions( const QCStringList& optionList )
+{
+ QString result;
+ QCStringList::const_iterator i;
+ for ( i=optionList.begin(); i!=optionList.end(); ++i )
+ {
+ QString s = *i;
+
+ int pos = s.find('=');
+ if( pos > 0 ) // seems not to have a tag
+ {
+ QString key = s.left(pos);
+ QString val = s.mid(pos+1);
+ std::list<OptionItem*>::iterator j;
+ bool bFound = false;
+ for(j=m_optionItemList.begin(); j!=m_optionItemList.end(); ++j)
+ {
+ if ( (*j)->getSaveName()==key )
+ {
+ ValueMap config;
+ config.writeEntry( key, val ); // Write the value as a string and
+ (*j)->read(&config); // use the internal conversion from string to the needed value.
+ bFound = true;
+ break;
+ }
+ }
+ if ( ! bFound )
+ {
+ result += "No config item named \"" + key + "\"\n";
+ }
+ }
+ else
+ {
+ result += "No '=' found in \"" + s + "\"\n";
+ }
+ }
+ return result;
+}
+
+QString OptionDialog::calcOptionHelp()
+{
+ ValueMap config;
+ std::list<OptionItem*>::iterator j;
+ for(j=m_optionItemList.begin(); j!=m_optionItemList.end(); ++j)
+ {
+ (*j)->write( &config );
+ }
+ return config.getAsString();
+}
+
+void OptionDialog::slotHistoryMergeRegExpTester()
+{
+ RegExpTester dlg(this, s_autoMergeRegExpToolTip, s_historyStartRegExpToolTip,
+ s_historyEntryStartRegExpToolTip, s_historyEntryStartSortKeyOrderToolTip );
+ dlg.init(m_pAutoMergeRegExpLineEdit->currentText(), m_pHistoryStartRegExpLineEdit->currentText(),
+ m_pHistoryEntryStartRegExpLineEdit->currentText(), m_pHistorySortKeyOrderLineEdit->currentText());
+ if ( dlg.exec() )
+ {
+ m_pAutoMergeRegExpLineEdit->setCurrentText( dlg.autoMergeRegExp() );
+ m_pHistoryStartRegExpLineEdit->setCurrentText( dlg.historyStartRegExp() );
+ m_pHistoryEntryStartRegExpLineEdit->setCurrentText( dlg.historyEntryStartRegExp() );
+ m_pHistorySortKeyOrderLineEdit->setCurrentText( dlg.historySortKeyOrder() );
+ }
+}
+
+
+#include "optiondialog.moc"