joachim99@8: /* joachim99@8: * kdiff3 - Text Diff And Merge Tool joachim99@69: * Copyright (C) 2002-2006 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@8: #include joachim99@8: #include joachim99@8: #include joachim99@73: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@70: #include joachim99@8: #include joachim99@8: #include joachim99@58: #include joachim99@66: #include joachim99@70: #include joachim99@70: //Added by qt3to4: joachim99@70: #include joachim99@70: #include joachim99@8: joachim99@8: #include joachim99@8: #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@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@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@69: void read (ValueMap* vm){ readEntry ( vm, 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@69: static void readEntry(ValueMap* vm, const QString& saveName, bool& v ) { v = vm->readBoolEntry( saveName, v ); } joachim99@69: static void readEntry(ValueMap* vm, const QString& saveName, int& v ) { v = vm->readNumEntry( saveName, v ); } joachim99@69: static void readEntry(ValueMap* vm, const QString& saveName, QSize& v ) { v = vm->readSizeEntry( saveName, &v ); } joachim99@69: static void readEntry(ValueMap* vm, const QString& saveName, QPoint& v ) { v = vm->readPointEntry( saveName, &v ); } joachim99@69: 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@69: OptionFontChooser( const QFont& defaultVal, const QString& saveName, QFont* pbVar, QWidget* pParent, OptionDialog* pOD ) joachim99@69: :KFontChooser( pParent,"font",true/*onlyFixed*/,QStringList(),false,6 ), joachim99@69: 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@69: void setToDefault(){ setCurrentText( m_defaultVal ); } joachim99@69: void setToCurrent(){ setCurrentText( *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@58: insertStringList(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@58: m_list.remove( 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@58: insertStringList(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@58: setCurrentItem( m_defaultVal ); joachim99@58: if (m_pVarStr!=0){ *m_pVarStr=currentText(); } joachim99@58: } joachim99@58: void setToCurrent() joachim99@58: { joachim99@58: if (m_pVarNum!=0) setCurrentItem( *m_pVarNum ); joachim99@58: else setText( *m_pVarStr ); joachim99@58: } joachim99@69: void apply() joachim99@58: { joachim99@58: if (m_pVarNum!=0){ *m_pVarNum = currentItem(); } 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@68: if ( c==0 ) break; joachim99@68: else names[QString(c->name()).upper()]=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@68: QToolTip::add( this, 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()+")", 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@68: QString codecName = config->readEntry( m_saveName, m_codecVec[ currentItem() ]->name() ); joachim99@68: for(unsigned int i=0; iname() ) joachim99@68: { joachim99@68: setCurrentItem( 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@8: OptionDialog::OptionDialog( bool bShowDirMergeSettings, QWidget *parent, char *name ) joachim99@8: :KDialogBase( IconList, i18n("Configure"), Help|Default|Apply|Ok|Cancel, joachim99@8: Ok, parent, name, true /*modal*/, true ) joachim99@8: { joachim99@68: setHelp( "kdiff3/index.html", QString::null ); joachim99@8: joachim99@68: setupFontPage(); joachim99@68: setupColorPage(); joachim99@68: setupEditPage(); joachim99@68: setupDiffPage(); 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@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@69: new OptionNum( (int)KToolBar::Top, "ToolBarPos", &m_toolBarPos, this ); joachim99@69: new OptionSize( QSize(600,400),"Geometry", &m_geometry, this ); joachim99@69: new OptionPoint( QPoint(0,22), "Position", &m_position, 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@73: QFrame *page = addPage( i18n("Font"), i18n("Editor & Diff Output Font" ), joachim99@8: BarIcon("fonts", KIcon::SizeMedium ) ); joachim99@8: joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, 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@70: Q3GridLayout *gbox = new Q3GridLayout( 1, 2 ); 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@8: gbox->addMultiCellWidget( pItalicDeltas, line, line, 0, 1 ); joachim99@8: QToolTip::add( pItalicDeltas, 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@73: QFrame *page = addPage( i18n("Color"), i18n("Colors Settings"), joachim99@8: BarIcon("colorize", KIcon::SizeMedium ) ); joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, spacingHint() ); joachim99@8: joachim99@70: Q3GridLayout *gbox = new Q3GridLayout( 7, 2 ); joachim99@69: gbox->setColStretch(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@8: label = new QLabel( pFgColor, i18n("Foreground color:"), page ); 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@8: label = new QLabel( pBgColor, i18n("Background color:"), page ); 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@69: bLowColor ? Qt::lightGray : qRgb(224,224,224), "DiffBgColor", &m_diffBgColor, page, this ); joachim99@8: label = new QLabel( pDiffBgColor, i18n("Diff background color:"), page ); 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@8: label = new QLabel( pColorA, i18n("Color A:"), page ); 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@8: label = new QLabel( pColorB, i18n("Color B:"), page ); 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@8: label = new QLabel( pColorC, i18n("Color C:"), page ); 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@51: label = new QLabel( pColorForConflict, i18n("Conflict color:"), page ); 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@8: label = new QLabel( pColor, i18n("Current range background color:"), page ); 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@8: label = new QLabel( pColor, i18n("Current range diff background color:"), page ); 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@69: label = new QLabel( pColor, i18n("Color for manually aligned difference ranges:"), page ); 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@69: label = new QLabel( pColor, i18n("Newest file color:"), page ); 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@69: QToolTip::add( label, dirColorTip ); joachim99@69: ++line; joachim99@69: joachim99@69: pColor = new OptionColorButton( qRgb(0xf0,0,0), "OldestFileColor", &m_oldestFileColor, page, this ); joachim99@69: label = new QLabel( pColor, i18n("Oldest file color:"), page ); joachim99@69: gbox->addWidget( label, line, 0 ); joachim99@69: gbox->addWidget( pColor, line, 1 ); joachim99@69: QToolTip::add( label, dirColorTip ); joachim99@69: ++line; joachim99@69: joachim99@69: pColor = new OptionColorButton( qRgb(0xc0,0xc0,0), "MidAgeFileColor", &m_midAgeFileColor, page, this ); joachim99@69: label = new QLabel( pColor, i18n("Middle age file color:"), page ); joachim99@69: gbox->addWidget( label, line, 0 ); joachim99@69: gbox->addWidget( pColor, line, 1 ); joachim99@69: QToolTip::add( label, dirColorTip ); joachim99@69: ++line; joachim99@69: joachim99@69: pColor = new OptionColorButton( qRgb(0,0,0), "MissingFileColor", &m_missingFileColor, page, this ); joachim99@69: label = new QLabel( pColor, i18n("Color for missing files:"), page ); joachim99@69: gbox->addWidget( label, line, 0 ); joachim99@69: gbox->addWidget( pColor, line, 1 ); joachim99@69: QToolTip::add( label, 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@73: QFrame *page = addPage( i18n("Editor"), i18n("Editor Behavior"), joachim99@8: BarIcon("edit", KIcon::SizeMedium ) ); joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, spacingHint() ); joachim99@8: joachim99@70: Q3GridLayout *gbox = new Q3GridLayout( 4, 2 ); joachim99@69: gbox->setColStretch(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@8: gbox->addMultiCellWidget( pReplaceTabs, line, line, 0, 1 ); joachim99@8: QToolTip::add( pReplaceTabs, 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@8: label = new QLabel( pTabSize, i18n("Tab size:"), page ); 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@8: gbox->addMultiCellWidget( pAutoIndentation, line, line, 0, 1 ); joachim99@8: QToolTip::add( pAutoIndentation, 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@8: gbox->addMultiCellWidget( pAutoCopySelection, line, line, 0, 1 ); joachim99@8: QToolTip::add( pAutoCopySelection, 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@58: #ifdef _WIN32 joachim99@58: int defaultLineEndStyle = eLineEndDos; joachim99@58: #else joachim99@58: int defaultLineEndStyle = eLineEndUnix; joachim99@58: #endif joachim99@58: OptionComboBox* pLineEndStyle = new OptionComboBox( defaultLineEndStyle, "LineEndStyle", &m_lineEndStyle, page, this ); joachim99@58: gbox->addWidget( pLineEndStyle, line, 1 ); joachim99@58: pLineEndStyle->insertItem( "Unix", eLineEndUnix ); joachim99@58: pLineEndStyle->insertItem( "Dos/Windows", eLineEndDos ); joachim99@58: QToolTip::add( label, 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@73: QFrame *page = addPage( i18n("Diff and Merge"), i18n("Diff and Merge Settings"), joachim99@8: BarIcon("misc", KIcon::SizeMedium ) ); joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, spacingHint() ); joachim99@8: joachim99@70: Q3GridLayout *gbox = new Q3GridLayout( 3, 2 ); joachim99@69: gbox->setColStretch(1,5); joachim99@8: topLayout->addLayout( gbox ); joachim99@8: int line=0; joachim99@8: joachim99@51: QLabel* label=0; joachim99@51: joachim99@51: OptionCheckBox* pPreserveCarriageReturn = new OptionCheckBox( i18n("Preserve carriage return"), false, "PreserveCarriageReturn", &m_bPreserveCarriageReturn, page, this ); joachim99@51: gbox->addMultiCellWidget( pPreserveCarriageReturn, line, line, 0, 1 ); joachim99@51: QToolTip::add( pPreserveCarriageReturn, i18n( joachim99@51: "Show carriage return characters '\\r' if they exist.\n" joachim99@51: "Helps to compare files that were modified under different operating systems.") joachim99@8: ); joachim99@8: ++line; joachim99@8: joachim99@51: OptionCheckBox* pIgnoreNumbers = new OptionCheckBox( i18n("Ignore numbers"), false, "IgnoreNumbers", &m_bIgnoreNumbers, page, this ); joachim99@51: gbox->addMultiCellWidget( pIgnoreNumbers, line, line, 0, 1 ); joachim99@51: QToolTip::add( pIgnoreNumbers, 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@68: OptionCheckBox* pIgnoreComments = new OptionCheckBox( i18n("Ignore C/C++ comments"), false, "IgnoreComments", &m_bIgnoreComments, page, this ); joachim99@51: gbox->addMultiCellWidget( pIgnoreComments, line, line, 0, 1 ); joachim99@51: QToolTip::add( pIgnoreComments, i18n( "Treat C/C++ comments like white space.") joachim99@8: ); joachim99@8: ++line; joachim99@8: joachim99@66: OptionCheckBox* pIgnoreCase = new OptionCheckBox( i18n("Ignore case"), false, "IgnoreCase", &m_bIgnoreCase, page, this ); joachim99@66: gbox->addMultiCellWidget( pIgnoreCase, line, line, 0, 1 ); joachim99@66: QToolTip::add( pIgnoreCase, 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@8: QToolTip::add( label, 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@8: QToolTip::add( label, 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@51: gbox->addMultiCellWidget( pTryHard, line, line, 0, 1 ); joachim99@51: QToolTip::add( pTryHard, 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@51: label = new QLabel( i18n("Auto advance delay (ms):"), page ); joachim99@8: gbox->addWidget( label, line, 0 ); joachim99@8: OptionIntEdit* pAutoAdvanceDelay = new OptionIntEdit( 500, "AutoAdvanceDelay", &m_autoAdvanceDelay, 0, 2000, page, this ); joachim99@8: gbox->addWidget( pAutoAdvanceDelay, line, 1 ); joachim99@8: QToolTip::add( label,i18n( joachim99@8: "When in Auto-Advance mode the result of the current selection is shown \n" joachim99@8: "for the specified time, before jumping to the next conflict. Range: 0-2000 ms") joachim99@8: ); joachim99@8: ++line; joachim99@8: 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@68: pWhiteSpace2FileMergeDefault->insertItem( i18n("Manual Choice"), 0 ); joachim99@51: pWhiteSpace2FileMergeDefault->insertItem( "A", 1 ); joachim99@51: pWhiteSpace2FileMergeDefault->insertItem( "B", 2 ); joachim99@58: QToolTip::add( label, i18n( joachim99@51: "Allow the merge algorithm to automatically select an input for " joachim99@51: "white-space-only changes." ) joachim99@51: ); 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@68: pWhiteSpace3FileMergeDefault->insertItem( i18n("Manual Choice"), 0 ); joachim99@51: pWhiteSpace3FileMergeDefault->insertItem( "A", 1 ); joachim99@51: pWhiteSpace3FileMergeDefault->insertItem( "B", 2 ); joachim99@51: pWhiteSpace3FileMergeDefault->insertItem( "C", 3 ); joachim99@58: QToolTip::add( label, i18n( joachim99@51: "Allow the merge algorithm to automatically select an input for " joachim99@51: "white-space-only changes." ) joachim99@51: ); joachim99@51: ++line; joachim99@51: joachim99@70: Q3GroupBox* pGroupBox = new Q3GroupBox( 2, Qt::Horizontal, i18n("Automatic Merge Regular Expression"), page); joachim99@69: gbox->addMultiCellWidget( pGroupBox, line,line,0,1); joachim99@69: ++line; joachim99@69: { joachim99@69: QWidget* page = new QWidget( pGroupBox ); joachim99@70: Q3GridLayout* gbox = new Q3GridLayout( page, 2, 2, spacingHint() ); joachim99@69: gbox->setColStretch(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@69: "When a line with a conflict matches the regular expression then\n" joachim99@69: "- if available - C, otherwise B will be chosen."); joachim99@69: QToolTip::add( label, 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@69: gbox->addMultiCellWidget( pAutoMergeRegExp, line, line, 0, 1 ); joachim99@69: QToolTip::add( pAutoMergeRegExp, i18n( "Run the merge for auto merge regular expressions\n" joachim99@69: "immediately when a merge starts.\n")); joachim99@69: ++line; joachim99@69: } joachim99@69: joachim99@70: pGroupBox = new Q3GroupBox( 2, Qt::Horizontal, i18n("Version Control History Merging"), page); joachim99@69: gbox->addMultiCellWidget( pGroupBox, line,line,0,1); joachim99@69: ++line; joachim99@69: { joachim99@69: QWidget* page = new QWidget( pGroupBox ); joachim99@70: Q3GridLayout* gbox = new Q3GridLayout( page, 2, 2, spacingHint() ); joachim99@69: gbox->setColStretch(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@70: "Usually this line contains the \"$Log$\"-keyword.\n" joachim99@69: "Default value: \".*\\$Log.*\\$.*\""); joachim99@69: QToolTip::add( label, 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@69: "\\s*\\\\main\\\\(\\S+)\\s+" // Start with "\main\" joachim99@69: "([0-9]+) " // day joachim99@69: "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) " //month joachim99@69: "([0-9][0-9][0-9][0-9]) " // year joachim99@69: "([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@69: "Specify the regular expression to detect the first line (without the leading comment).\n" joachim99@69: "Use parentheses to group the keys you want to use for sorting.\n" joachim99@69: "If left empty, then KDiff3 assumes that empty lines separate history entries.\n" joachim99@69: "See the documentation for details."); joachim99@69: QToolTip::add( label, s_historyEntryStartRegExpToolTip ); joachim99@69: ++line; joachim99@69: joachim99@69: m_pHistoryMergeSorting = new OptionCheckBox( i18n("History merge sorting"), false, "HistoryMergeSorting", &m_bHistoryMergeSorting, page, this ); joachim99@69: gbox->addMultiCellWidget( m_pHistoryMergeSorting, line, line, 0, 1 ); joachim99@69: QToolTip::add( m_pHistoryMergeSorting, 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@69: "groups a key that can be used for sorting.\n" joachim99@69: "Specify the list of keys (that are numbered in order of occurrence\n" joachim99@69: "starting with 1) using ',' as separator (e.g. \"4,5,6,1,2,3,7\").\n" joachim99@69: "If left empty, then no sorting will be done.\n" joachim99@69: "See the documentation for details."); joachim99@69: QToolTip::add( label, 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@69: gbox->addMultiCellWidget( m_pHistoryAutoMerge, line, line, 0, 1 ); joachim99@69: QToolTip::add( m_pHistoryAutoMerge, i18n("Run version control history automerge on merge start.") ); joachim99@69: ++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@69: pLE = new OptionLineEdit( "", "IrrelevantMergeCmd", &m_IrrelevantMergeCmd, page, this ); joachim99@69: gbox->addWidget( pLE, line, 1 ); joachim99@69: QToolTip::add( label, i18n("If specified this script is run after automerge\n" joachim99@69: "when no other relevant changes were detected.\n" joachim99@69: "Called with the parameters: filename1 filename2 filename3") ); joachim99@69: ++line; joachim99@69: joachim99@8: topLayout->addStretch(10); joachim99@8: } joachim99@8: joachim99@8: void OptionDialog::setupDirectoryMergePage( void ) joachim99@8: { joachim99@73: QFrame *page = addPage( i18n("Directory Merge"), i18n("Directory Merge"), joachim99@8: BarIcon("folder", KIcon::SizeMedium ) ); joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, spacingHint() ); joachim99@8: joachim99@70: Q3GridLayout *gbox = new Q3GridLayout( 11, 2 ); joachim99@69: gbox->setColStretch(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@8: gbox->addMultiCellWidget( pRecursiveDirs, line, line, 0, 1 ); joachim99@8: QToolTip::add( pRecursiveDirs, 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@8: QToolTip::add( label, 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@8: QToolTip::add( label, 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@8: QToolTip::add( label, 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@8: gbox->addMultiCellWidget( pUseCvsIgnore, line, line, 0, 1 ); joachim99@8: QToolTip::add( pUseCvsIgnore, 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@8: gbox->addMultiCellWidget( pFindHidden, line, line, 0, 1 ); joachim99@8: #ifdef _WIN32 joachim99@8: QToolTip::add( pFindHidden, i18n("Finds files and directories with the hidden attribute.") ); joachim99@8: #else joachim99@8: QToolTip::add( pFindHidden, 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@8: gbox->addMultiCellWidget( pFollowFileLinks, line, line, 0, 1 ); joachim99@8: QToolTip::add( pFollowFileLinks, 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@8: gbox->addMultiCellWidget( pFollowDirLinks, line, line, 0, 1 ); joachim99@8: QToolTip::add( pFollowDirLinks, 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@69: //gbox->addMultiCellWidget( pShowOnlyDeltas, line, line, 0, 1 ); joachim99@69: //QToolTip::add( pShowOnlyDeltas, i18n( joachim99@69: // "Files and directories without change will not appear in the list.")); joachim99@69: //++line; joachim99@69: joachim99@69: #ifdef _WIN32 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@69: gbox->addMultiCellWidget( pCaseSensitiveFileNames, line, line, 0, 1 ); joachim99@69: QToolTip::add( pCaseSensitiveFileNames, 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@70: Q3VButtonGroup* pBG = new Q3VButtonGroup(i18n("File Comparison Mode"),page); joachim99@66: gbox->addMultiCellWidget( pBG, line, line, 0, 1 ); joachim99@66: ++line; joachim99@66: joachim99@68: OptionRadioButton* pBinaryComparison = new OptionRadioButton( i18n("Binary comparison"), true, "BinaryComparison", &m_bDmBinaryComparison, pBG, this ); joachim99@66: QToolTip::add( pBinaryComparison, i18n("Binary comparison of each file. (Default)") ); joachim99@66: joachim99@68: OptionRadioButton* pFullAnalysis = new OptionRadioButton( i18n("Full analysis"), false, "FullAnalysis", &m_bDmFullAnalysis, pBG, this ); joachim99@66: QToolTip::add( pFullAnalysis, i18n("Do a full analysis and show statistics information in extra columns.\n" joachim99@66: "(Slower than a binary comparison, much slower for binary files.)") ); joachim99@66: joachim99@66: OptionRadioButton* pTrustDate = new OptionRadioButton( i18n("Trust the modification date (unsafe)"), false, "TrustDate", &m_bDmTrustDate, pBG, this ); joachim99@8: QToolTip::add( pTrustDate, i18n("Assume that files are equal if the modification date and file length are equal.\n" joachim99@8: "Useful for big directories or slow networks.") ); joachim99@8: joachim99@66: OptionRadioButton* pTrustSize = new OptionRadioButton( i18n("Trust the size (unsafe)"), false, "TrustSize", &m_bDmTrustSize, pBG, this ); joachim99@51: QToolTip::add( pTrustSize, i18n("Assume that files are equal if their file lengths are equal.\n" joachim99@51: "Useful for big directories or slow networks when the date is modified during download.") ); 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@8: gbox->addMultiCellWidget( pSyncMode, line, line, 0, 1 ); joachim99@8: QToolTip::add( pSyncMode, 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@68: OptionCheckBox* pWhiteSpaceDiffsEqual = new OptionCheckBox( i18n("White space differences considered equal"), false,"WhiteSpaceEqual", &m_bDmWhiteSpaceEqual, page, this ); joachim99@68: gbox->addMultiCellWidget( pWhiteSpaceDiffsEqual, line, line, 0, 1 ); joachim99@68: QToolTip::add( pWhiteSpaceDiffsEqual, 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@8: gbox->addMultiCellWidget( pCopyNewer, line, line, 0, 1 ); joachim99@8: QToolTip::add( pCopyNewer, 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@8: gbox->addMultiCellWidget( pCreateBakFiles, line, line, 0, 1 ); joachim99@8: QToolTip::add( pCreateBakFiles, 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@58: if ( pCodec != 0 ) m.insert( std::make_pair( QString(pCodec->mimeName()).upper(), 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@58: void OptionDialog::setupRegionalPage( void ) joachim99@58: { joachim99@73: QFrame *page = addPage( i18n("Regional Settings"), i18n("Regional Settings"), joachim99@68: BarIcon("locale"/*"charset"*/, KIcon::SizeMedium ) ); joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, spacingHint() ); joachim99@68: joachim99@70: Q3GridLayout *gbox = new Q3GridLayout( 3, 2 ); joachim99@69: gbox->setColStretch(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@66: static 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@66: pLanguage->insertItem( "Auto", 0 ); // Must not translate, won't work otherwise! joachim99@66: pLanguage->insertItem( "en_orig" ); joachim99@66: joachim99@66: // Read directory: Find all kdiff3_*.qm-files and insert the found files here selection joachim99@66: FileAccess fa( getTranslationDir() ); joachim99@66: t_DirectoryList dirList; joachim99@66: fa.listDir( &dirList, false, false, "kdiff3_*.qm", "", "*", false, false ); joachim99@66: t_DirectoryList::iterator i; joachim99@66: for( i=dirList.begin(); i!=dirList.end(); ++i) joachim99@66: { joachim99@66: QString fileName = i->fileName(); joachim99@66: // Skip the "kdiff3_" and omit the .qm joachim99@66: QString languageId = fileName.mid(7, fileName.length()-10 ); joachim99@66: joachim99@66: unsigned int countryIdx=0; joachim99@66: for(countryIdx=0; countryIdx< sizeof(countryMap)/sizeof(countryMap[0]); ++countryIdx ) joachim99@66: { joachim99@66: QString fullName = countryMap[countryIdx]; joachim99@66: if ( languageId+" " == fullName.left(languageId.length()+1) ) joachim99@66: { joachim99@66: languageId += " (" + fullName.mid(languageId.length()+1) + ")"; joachim99@66: } joachim99@66: } joachim99@66: joachim99@66: pLanguage->insertItem( languageId ); joachim99@66: } joachim99@66: joachim99@58: QToolTip::add( label, 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@58: QToolTip::add( label, 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@68: gbox->addMultiCellWidget( m_pSameEncoding, line, line, 0, 1 ); joachim99@68: QToolTip::add( m_pSameEncoding, 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@68: ++line; 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@68: ++line; 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@68: ++line; 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@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@68: joachim99@68: OptionCheckBox* pRightToLeftLanguage = new OptionCheckBox( i18n("Right To Left Language"), false, "RightToLeftLanguage", &m_bRightToLeftLanguage, page, this ); joachim99@68: gbox->addMultiCellWidget( pRightToLeftLanguage, line, line, 0, 1 ); joachim99@68: QToolTip::add( pRightToLeftLanguage, 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@69: void OptionDialog::setupIntegrationPage( void ) joachim99@69: { joachim99@73: QFrame *page = addPage( i18n("Integration"), i18n("Integration Settings"), joachim99@69: BarIcon("launch"/*"charset"*/, KIcon::SizeMedium ) ); joachim99@70: Q3VBoxLayout *topLayout = new Q3VBoxLayout( page, 5, spacingHint() ); joachim99@69: joachim99@70: Q3GridLayout *gbox = new Q3GridLayout( 3, 2 ); joachim99@69: gbox->setColStretch(1,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@69: gbox->addWidget( pIgnorableCmdLineOptions, line, 1 ); joachim99@69: QToolTip::add( label, 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@69: topLayout->addStretch(10); joachim99@69: } joachim99@69: joachim99@69: joachim99@68: void OptionDialog::slotEncodingChanged() joachim99@68: { joachim99@68: if ( m_pSameEncoding->isChecked() ) joachim99@68: { joachim99@68: m_pEncodingBComboBox->setEnabled( false ); joachim99@68: m_pEncodingBComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() ); joachim99@68: m_pEncodingCComboBox->setEnabled( false ); joachim99@68: m_pEncodingCComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() ); joachim99@68: m_pEncodingOutComboBox->setEnabled( false ); joachim99@68: m_pEncodingOutComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() ); joachim99@68: m_pEncodingPPComboBox->setEnabled( false ); joachim99@68: m_pEncodingPPComboBox->setCurrentItem( m_pEncodingAComboBox->currentItem() ); 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@68: } joachim99@68: } joachim99@58: joachim99@8: void OptionDialog::setupKeysPage( void ) joachim99@8: { joachim99@8: //QVBox *page = addVBoxPage( i18n("Keys"), i18n("KeyDialog" ), joachim99@8: // BarIcon("fonts", KIcon::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@51: i18n("Continue at Own Risk"), 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@8: emit applyClicked(); 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@69: KConfig* m_pConfig; joachim99@69: public: joachim99@69: ConfigValueMap( KConfig* pConfig ) { m_pConfig = pConfig; } joachim99@69: joachim99@69: void writeEntry(const QString& s, const QFont& v ){ m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, const QColor& v ){ m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, const QSize& v ){ m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, const QPoint& v ){ m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, int v ) { m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, bool v ) { m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, const QStringList& v, char separator ){ m_pConfig->writeEntry(s,v,separator); } joachim99@69: void writeEntry(const QString& s, const QString& v ){ m_pConfig->writeEntry(s,v); } joachim99@69: void writeEntry(const QString& s, const char* v ) { m_pConfig->writeEntry(s,v); } joachim99@69: joachim99@69: QFont readFontEntry (const QString& s, QFont* defaultVal ) { return m_pConfig->readFontEntry(s,defaultVal); } joachim99@69: QColor readColorEntry(const QString& s, QColor* defaultVal ){ return m_pConfig->readColorEntry(s,defaultVal); } joachim99@69: QSize readSizeEntry (const QString& s, QSize* defaultVal ) { return m_pConfig->readSizeEntry(s,defaultVal); } joachim99@69: QPoint readPointEntry(const QString& s, QPoint* defaultVal) { return m_pConfig->readPointEntry(s,defaultVal); } joachim99@69: bool readBoolEntry (const QString& s, bool defaultVal ) { return m_pConfig->readBoolEntry(s,defaultVal); } joachim99@69: int readNumEntry (const QString& s, int defaultVal ) { return m_pConfig->readNumEntry(s,defaultVal); } joachim99@69: QStringList readListEntry (const QString& s, const QStringList& def, char separator ) { return m_pConfig->readListEntry(s.latin1(),def,separator); } joachim99@69: QString readEntry (const QString& s, const QString& defaultVal){ return m_pConfig->readEntry(s,defaultVal); } joachim99@69: }; joachim99@69: joachim99@8: void OptionDialog::saveOptions( KConfig* config ) joachim99@8: { joachim99@8: // No i18n()-Translations here! joachim99@8: joachim99@8: config->setGroup("KDiff3 Options"); joachim99@8: joachim99@69: ConfigValueMap cvm(config); 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@8: void OptionDialog::readOptions( KConfig* config ) joachim99@8: { joachim99@8: // No i18n()-Translations here! joachim99@8: joachim99@8: config->setGroup("KDiff3 Options"); joachim99@8: joachim99@69: ConfigValueMap cvm(config); 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@8: void OptionDialog::slotHelp( void ) joachim99@8: { joachim99@8: KDialogBase::slotHelp(); joachim99@8: } joachim99@8: joachim99@69: QString OptionDialog::parseOptions( const QCStringList& optionList ) joachim99@69: { joachim99@69: QString result; joachim99@69: QCStringList::const_iterator i; joachim99@69: for ( i=optionList.begin(); i!=optionList.end(); ++i ) joachim99@69: { joachim99@69: QString s = *i; joachim99@69: joachim99@69: int pos = s.find('='); 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@69: m_pAutoMergeRegExpLineEdit->setCurrentText( dlg.autoMergeRegExp() ); joachim99@69: m_pHistoryStartRegExpLineEdit->setCurrentText( dlg.historyStartRegExp() ); joachim99@69: m_pHistoryEntryStartRegExpLineEdit->setCurrentText( dlg.historyEntryStartRegExp() ); joachim99@69: m_pHistorySortKeyOrderLineEdit->setCurrentText( dlg.historySortKeyOrder() ); joachim99@69: } joachim99@69: } joachim99@69: joachim99@69: joachim99@70: //#include "optiondialog.moc"