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