joachim99@8: /* joachim99@8: * kdiff3 - Text Diff And Merge Tool joachim99@8: * This file only: Copyright (C) 2002 Joachim Eibl, joachim.eibl@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@8: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. joachim99@8: * joachim99@8: */ joachim99@8: joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@8: #include joachim99@58: #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@8: //#include joachim99@58: #include joachim99@8: joachim99@8: #include "optiondialog.h" joachim99@8: #include "diff.h" joachim99@8: 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@8: OptionItem( OptionDialog* pOptionDialog, 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@8: virtual void write(KConfig*)=0; joachim99@8: virtual void read(KConfig*)=0; 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@8: void write(KConfig* config){ config->writeEntry(m_saveName, *m_pbVar ); } joachim99@8: void read (KConfig* 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@51: class OptionToggleAction : public OptionItem joachim99@51: { joachim99@51: public: joachim99@51: OptionToggleAction( bool bDefaultVal, const QString& saveName, bool* pbVar, OptionDialog* pOD ) joachim99@51: : OptionItem( pOD, saveName ) joachim99@51: { joachim99@51: m_pbVar = pbVar; joachim99@51: *m_pbVar = bDefaultVal; joachim99@51: } joachim99@51: void setToDefault(){} joachim99@51: void setToCurrent(){} joachim99@51: void apply() {} joachim99@51: void write(KConfig* config){ config->writeEntry(m_saveName, *m_pbVar ); } joachim99@51: void read (KConfig* config){ *m_pbVar = config->readBoolEntry( m_saveName, *m_pbVar ); } joachim99@51: private: joachim99@51: OptionToggleAction( const OptionToggleAction& ); // private copy constructor without implementation joachim99@51: bool* m_pbVar; joachim99@51: }; joachim99@51: 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@8: void write(KConfig* config){ config->writeEntry(m_saveName, *m_pVar ); } joachim99@8: void read (KConfig* 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@8: m_pVar = pVar; joachim99@8: m_defaultVal = defaultVal; joachim99@58: m_list.push_back(defaultVal); joachim99@58: setEditable(true); joachim99@8: } joachim99@58: void setToDefault(){ setCurrentText( m_defaultVal ); } joachim99@58: void setToCurrent(){ setCurrentText( *m_pVar ); } joachim99@58: void apply() { *m_pVar = currentText(); insertText(); } joachim99@58: void write(KConfig* config){ config->writeEntry( m_saveName, m_list, '|' ); } joachim99@58: void read (KConfig* config){ joachim99@58: m_list = config->readListEntry( m_saveName, '|' ); joachim99@58: if ( !m_list.isEmpty() ) *m_pVar = m_list.front(); joachim99@58: clear(); joachim99@58: insertStringList(m_list); joachim99@58: } joachim99@8: private: joachim99@58: void insertText() joachim99@58: { // Check if the text exists. If yes remove it and joachim99@58: QString current = currentText(); joachim99@58: m_list.remove( current ); joachim99@58: m_list.push_front( current ); joachim99@58: clear(); joachim99@58: if ( m_list.count()>10 ) m_list.erase( m_list.at(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@8: void write(KConfig* config){ config->writeEntry(m_saveName, *m_pVar ); } joachim99@8: void read (KConfig* 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@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@58: void apply() joachim99@58: { joachim99@58: if (m_pVarNum!=0){ *m_pVarNum = currentItem(); } joachim99@58: else { *m_pVarStr = currentText(); } joachim99@58: } joachim99@58: void write(KConfig* 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@58: void read (KConfig* 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; iaddWidget( m_fontChooser ); joachim99@8: joachim99@8: QGridLayout *gbox = new QGridLayout( 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@51: QFrame *page = addPage( i18n("Color"), i18n("Colors in Editor & Diff Output"), joachim99@8: BarIcon("colorize", KIcon::SizeMedium ) ); joachim99@8: QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); joachim99@8: joachim99@8: QGridLayout *gbox = new QGridLayout( 7, 2 ); joachim99@8: topLayout->addLayout(gbox); joachim99@8: joachim99@8: QLabel* label; joachim99@8: int line = 0; joachim99@8: joachim99@8: int depth = QColor::numBitPlanes(); joachim99@8: bool bLowColor = depth<=8; joachim99@8: joachim99@8: OptionColorButton* pFgColor = new OptionColorButton( 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@8: OptionColorButton* pBgColor = new OptionColorButton( 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@8: OptionColorButton* pDiffBgColor = new OptionColorButton( lightGray, "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@8: OptionColorButton* pColorForConflict = new OptionColorButton( 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@8: topLayout->addStretch(10); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: void OptionDialog::setupEditPage( void ) joachim99@8: { joachim99@51: QFrame *page = addPage( i18n("Editor"), i18n("Editor Behaviour"), joachim99@8: BarIcon("edit", KIcon::SizeMedium ) ); joachim99@8: QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); joachim99@8: joachim99@8: QGridLayout *gbox = new QGridLayout( 4, 2 ); 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@58: 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@58: "Sets the line endings for when a edited file is saved.\n" joachim99@58: "DOS/Windows: CR+LF; Unix: LF; with CR=0D, LF=0A") joachim99@58: ); joachim99@58: ++line; joachim99@58: joachim99@51: OptionCheckBox* pStringEncoding = new OptionCheckBox( i18n("Use locale encoding"), true, "LocaleEncoding", &m_bStringEncoding, page, this ); joachim99@51: gbox->addMultiCellWidget( pStringEncoding, line, line, 0, 1 ); joachim99@51: QToolTip::add( pStringEncoding, i18n( joachim99@51: "Change this if non-ascii-characters aren't displayed correctly." joachim99@51: )); joachim99@51: ++line; joachim99@51: joachim99@8: topLayout->addStretch(10); joachim99@8: } joachim99@8: joachim99@8: joachim99@8: void OptionDialog::setupDiffPage( void ) joachim99@8: { joachim99@51: QFrame *page = addPage( i18n("Diff & Merge"), i18n("Diff & Merge Settings"), joachim99@8: BarIcon("misc", KIcon::SizeMedium ) ); joachim99@8: QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); joachim99@8: joachim99@8: QGridLayout *gbox = new QGridLayout( 3, 2 ); 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@51: 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@51: OptionCheckBox* pUpCase = new OptionCheckBox( i18n("Convert to upper case"), false, "UpCase", &m_bUpCase, page, this ); joachim99@8: gbox->addMultiCellWidget( pUpCase, line, line, 0, 1 ); joachim99@51: QToolTip::add( pUpCase, i18n( joachim99@51: "Turn all lower case characters to upper case on reading. (e.g.: '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@51: 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@51: 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@8: topLayout->addStretch(10); joachim99@8: } joachim99@8: joachim99@8: void OptionDialog::setupDirectoryMergePage( void ) joachim99@8: { joachim99@51: QFrame *page = addPage( i18n("Directory Merge"), i18n("Directory Merge"), joachim99@8: BarIcon("folder", KIcon::SizeMedium ) ); joachim99@8: QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); joachim99@8: joachim99@8: QGridLayout *gbox = new QGridLayout( 11, 2 ); 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@8: OptionLineEdit* pFileAntiPattern = new OptionLineEdit( "*.orig;*.o", "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@8: OptionLineEdit* pDirAntiPattern = new OptionLineEdit( "CVS;.deps", "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@8: OptionCheckBox* pShowOnlyDeltas = new OptionCheckBox( i18n("List only deltas"),false,"ListOnlyDeltas", &m_bDmShowOnlyDeltas, page, this ); joachim99@8: gbox->addMultiCellWidget( pShowOnlyDeltas, line, line, 0, 1 ); joachim99@8: QToolTip::add( pShowOnlyDeltas, i18n( joachim99@8: "Files and directories without change will not appear in the list.")); joachim99@8: ++line; joachim99@8: joachim99@51: OptionCheckBox* pTrustDate = new OptionCheckBox( i18n("Trust the modification date (unsafe)"), false, "TrustDate", &m_bDmTrustDate, page, this ); joachim99@8: gbox->addMultiCellWidget( pTrustDate, line, line, 0, 1 ); 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: ++line; joachim99@8: joachim99@51: OptionCheckBox* pTrustSize = new OptionCheckBox( i18n("Trust the size (unsafe)"), false, "TrustSize", &m_bDmTrustSize, page, this ); joachim99@51: gbox->addMultiCellWidget( pTrustSize, line, line, 0, 1 ); 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: ++line; 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@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@8: 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@58: joachim99@58: void OptionDialog::setupRegionalPage( void ) joachim99@58: { joachim99@58: QFrame *page = addPage( i18n("Regional Settings"), i18n("Regional Settings"), joachim99@58: BarIcon("locale"/*"charset"*/, KIcon::SizeMedium ) ); joachim99@58: QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() ); joachim99@58: joachim99@58: QGridLayout *gbox = new QGridLayout( 3, 2 ); joachim99@58: topLayout->addLayout( gbox ); joachim99@58: int line=0; joachim99@58: joachim99@58: QLabel* label; joachim99@58: #ifdef KREPLACEMENTS_H 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@58: pLanguage->insertItem( i18n("Auto"), 0 ); joachim99@58: // Read directory: Find all kdiff3_*.qm-files and insert the found files here selection 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@58: #endif joachim99@58: 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@58: joachim99@58: topLayout->addStretch(10); joachim99@58: } joachim99@58: 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: // FontConfigDlg joachim99@8: m_font = m_fontChooser->font(); 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@8: { 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@30: #ifdef _WIN32 joachim99@30: m_fontChooser->setFont( QFont("Courier New", 10 ), true /*only fixed*/ ); joachim99@30: #else joachim99@8: m_fontChooser->setFont( QFont("Courier", 10 ), true /*only fixed*/ ); joachim99@30: #endif 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@8: m_fontChooser->setFont( m_font, true /*only fixed*/ ); joachim99@8: } joachim99@8: 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@8: std::list::iterator i; joachim99@8: for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i) joachim99@8: { joachim99@8: (*i)->write(config); joachim99@8: } joachim99@8: joachim99@8: // FontConfigDlg joachim99@8: config->writeEntry("Font", m_font ); joachim99@8: joachim99@8: // Recent files (selectable in the OpenDialog) joachim99@8: config->writeEntry( "RecentAFiles", m_recentAFiles, '|' ); joachim99@8: config->writeEntry( "RecentBFiles", m_recentBFiles, '|' ); joachim99@8: config->writeEntry( "RecentCFiles", m_recentCFiles, '|' ); joachim99@8: config->writeEntry( "RecentOutputFiles", m_recentOutputFiles, '|' ); 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@8: std::list::iterator i; joachim99@8: joachim99@8: for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i) joachim99@8: { joachim99@8: (*i)->read(config); joachim99@8: } joachim99@8: joachim99@8: // Use the current values as default settings. joachim99@8: joachim99@8: // FontConfigDlg joachim99@8: m_font = config->readFontEntry( "Font", &m_font); joachim99@8: joachim99@8: // Recent files (selectable in the OpenDialog) joachim99@8: m_recentAFiles = config->readListEntry( "RecentAFiles", '|' ); joachim99@8: m_recentBFiles = config->readListEntry( "RecentBFiles", '|' ); joachim99@8: m_recentCFiles = config->readListEntry( "RecentCFiles", '|' ); joachim99@8: m_recentOutputFiles = config->readListEntry( "RecentOutputFiles", '|' ); 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@8: joachim99@58: joachim99@8: #include "optiondialog.moc"