00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "diffpage.h"
00019
00020 #include <QtGui/QCheckBox>
00021 #include <Q3HGroupBox>
00022 #include <QtGui/QLabel>
00023 #include <QtGui/QLayout>
00024 #include <QtGui/QRadioButton>
00025 #include <QtGui/QSpinBox>
00026 #include <QtGui/QVBoxLayout>
00027 #include <QtGui/QHBoxLayout>
00028 #include <QtGui/QToolTip>
00029
00030 #include <kbuttongroup.h>
00031 #include <kapplication.h>
00032 #include <kcombobox.h>
00033 #include <kdialog.h>
00034 #include <keditlistbox.h>
00035 #include <klineedit.h>
00036 #include <klocale.h>
00037 #include <kurlcombobox.h>
00038 #include <kurlrequester.h>
00039 #include <kservicetypetrader.h>
00040 #include <ktabwidget.h>
00041
00042 #include <kparts/componentfactory.h>
00043 #include <kregexpeditorinterface.h>
00044 #include <kglobal.h>
00045
00046 #include "diffsettings.h"
00047
00048 DiffPage::DiffPage() : PageBase(), m_ignoreRegExpDialog( 0 )
00049 {
00050 m_tabWidget = new KTabWidget( this );
00051
00052 addDiffTab();
00053
00054 addFormatTab();
00055
00056 addOptionsTab();
00057
00058 addExcludeTab();
00059 }
00060
00061 DiffPage::~DiffPage()
00062 {
00063 m_settings = 0;
00064 }
00065
00066 void DiffPage::setSettings( DiffSettings* setts )
00067 {
00068 m_settings = setts;
00069
00070 m_diffURLRequester->setUrl( m_settings->m_diffProgram );
00071
00072 m_smallerCheckBox->setChecked ( m_settings->m_createSmallerDiff );
00073 m_largerCheckBox->setChecked ( m_settings->m_largeFiles );
00074 m_tabsCheckBox->setChecked ( m_settings->m_convertTabsToSpaces );
00075 m_caseCheckBox->setChecked ( m_settings->m_ignoreChangesInCase );
00076 m_linesCheckBox->setChecked ( m_settings->m_ignoreEmptyLines );
00077 m_whitespaceCheckBox->setChecked ( m_settings->m_ignoreWhiteSpace );
00078 m_allWhitespaceCheckBox->setChecked ( m_settings->m_ignoreAllWhiteSpace );
00079 m_ignoreTabExpansionCheckBox->setChecked( m_settings->m_ignoreChangesDueToTabExpansion );
00080
00081 m_ignoreRegExpCheckBox->setChecked ( m_settings->m_ignoreRegExp );
00082 m_ignoreRegExpEdit->setCompletedItems( m_settings->m_ignoreRegExpTextHistory );
00083 m_ignoreRegExpEdit->setText ( m_settings->m_ignoreRegExpText );
00084
00085 m_locSpinBox->setValue( m_settings->m_linesOfContext );
00086
00087 m_modeButtonGroup->setSelected( m_settings->m_format );
00088
00089 m_excludeFilePatternCheckBox->setChecked ( m_settings->m_excludeFilePattern );
00090 slotExcludeFilePatternToggled ( m_settings->m_excludeFilePattern );
00091 m_excludeFilePatternEditListBox->insertStringList( m_settings->m_excludeFilePatternList );
00092
00093 m_excludeFileCheckBox->setChecked( m_settings->m_excludeFilesFile );
00094 slotExcludeFileToggled ( m_settings->m_excludeFilesFile );
00095 m_excludeFileURLComboBox->setUrls( m_settings->m_excludeFilesFileHistoryList );
00096 m_excludeFileURLComboBox->setUrl ( KUrl( m_settings->m_excludeFilesFileURL ) );
00097 }
00098
00099 DiffSettings* DiffPage::settings( void )
00100 {
00101 return m_settings;
00102 }
00103
00104 void DiffPage::restore()
00105 {
00106
00107 }
00108
00109 void DiffPage::apply()
00110 {
00111 m_settings->m_diffProgram = m_diffURLRequester->url().pathOrUrl();
00112
00113 m_settings->m_largeFiles = m_largerCheckBox->isChecked();
00114 m_settings->m_createSmallerDiff = m_smallerCheckBox->isChecked();
00115 m_settings->m_convertTabsToSpaces = m_tabsCheckBox->isChecked();
00116 m_settings->m_ignoreChangesInCase = m_caseCheckBox->isChecked();
00117 m_settings->m_ignoreEmptyLines = m_linesCheckBox->isChecked();
00118 m_settings->m_ignoreWhiteSpace = m_whitespaceCheckBox->isChecked();
00119 m_settings->m_ignoreAllWhiteSpace = m_allWhitespaceCheckBox->isChecked();
00120 m_settings->m_ignoreChangesDueToTabExpansion = m_ignoreTabExpansionCheckBox->isChecked();
00121
00122 m_settings->m_ignoreRegExp = m_ignoreRegExpCheckBox->isChecked();
00123 m_settings->m_ignoreRegExpText = m_ignoreRegExpEdit->text();
00124 m_settings->m_ignoreRegExpTextHistory = m_ignoreRegExpEdit->completionObject()->items();
00125
00126 m_settings->m_linesOfContext = m_locSpinBox->value();
00127
00128 m_settings->m_format = static_cast<Kompare::Format>( m_modeButtonGroup->selected() );
00129
00130 m_settings->m_excludeFilePattern = m_excludeFilePatternCheckBox->isChecked();
00131 m_settings->m_excludeFilePatternList = m_excludeFilePatternEditListBox->items();
00132
00133 m_settings->m_excludeFilesFile = m_excludeFileCheckBox->isChecked();
00134 m_settings->m_excludeFilesFileURL = m_excludeFileURLComboBox->currentText();
00135 m_settings->m_excludeFilesFileHistoryList = m_excludeFileURLComboBox->urls();
00136
00137 m_settings->saveSettings( KGlobal::config().data() );
00138 }
00139
00140 void DiffPage::setDefaults()
00141 {
00142 m_diffURLRequester->setUrl( KUrl( "diff" ) );
00143 m_smallerCheckBox->setChecked( true );
00144 m_largerCheckBox->setChecked( true );
00145 m_tabsCheckBox->setChecked( false );
00146 m_caseCheckBox->setChecked( false );
00147 m_linesCheckBox->setChecked( false );
00148 m_whitespaceCheckBox->setChecked( false );
00149 m_allWhitespaceCheckBox->setChecked( false );
00150 m_ignoreTabExpansionCheckBox->setChecked( false );
00151 m_ignoreRegExpCheckBox->setChecked( false );
00152
00153 m_ignoreRegExpEdit->setText( QString() );
00154
00155 m_locSpinBox->setValue( 3 );
00156
00157 m_modeButtonGroup->setSelected( Kompare::Unified );
00158
00159 m_excludeFilePatternCheckBox->setChecked( false );
00160
00161 m_excludeFileCheckBox->setChecked( false );
00162 }
00163
00164 void DiffPage::slotShowRegExpEditor()
00165 {
00166 if ( ! m_ignoreRegExpDialog )
00167 m_ignoreRegExpDialog = KServiceTypeTrader::createInstanceFromQuery<QDialog>( "KRegExpEditor/KRegExpEditor", QString(), this );
00168
00169 KRegExpEditorInterface *iface = qobject_cast<KRegExpEditorInterface *>( m_ignoreRegExpDialog );
00170
00171 if ( !iface )
00172 return;
00173
00174 iface->setRegExp( m_ignoreRegExpEdit->text() );
00175 bool ok = m_ignoreRegExpDialog->exec();
00176
00177 if ( ok )
00178 m_ignoreRegExpEdit->setText( iface->regExp() );
00179 }
00180
00181 void DiffPage::slotExcludeFilePatternToggled( bool on )
00182 {
00183 if ( !on )
00184 {
00185 m_excludeFilePatternEditListBox->setEnabled( false );
00186 }
00187 else
00188 {
00189 m_excludeFilePatternEditListBox->setEnabled( true );
00190 }
00191 }
00192
00193 void DiffPage::slotExcludeFileToggled( bool on )
00194 {
00195 if ( !on )
00196 {
00197 m_excludeFileURLComboBox->setEnabled( false );
00198 m_excludeFileURLRequester->setEnabled( false );
00199 }
00200 else
00201 {
00202 m_excludeFileURLComboBox->setEnabled( true );
00203 m_excludeFileURLRequester->setEnabled( true );
00204 }
00205 }
00206
00207 void DiffPage::addDiffTab()
00208 {
00209 QWidget* page = new QWidget( this );
00210 QVBoxLayout* layout = new QVBoxLayout( page );
00211 layout->setSpacing( KDialog::spacingHint() );
00212 layout->setMargin( KDialog::marginHint() );
00213
00214
00215 m_diffProgramGroup = new KButtonGroup( page );
00216 layout->addWidget( m_diffProgramGroup );
00217 QVBoxLayout* bgLayout = new QVBoxLayout( m_diffProgramGroup );
00218 m_diffProgramGroup->setTitle( i18n( "Diff Program" ) );
00219
00220
00221 m_diffURLRequester = new KUrlRequester( m_diffProgramGroup);
00222 m_diffURLRequester->setObjectName("diffURLRequester" );
00223 m_diffURLRequester->setWhatsThis( i18n( "You can select a different diff program here. On Solaris the standard diff program does not support all the options that the GNU version does. This way you can select that version." ) );
00224 bgLayout->addWidget( m_diffURLRequester );
00225
00226 layout->addStretch( 1 );
00227 page->setMinimumSize( sizeHintForWidget( page ) );
00228
00229 m_tabWidget->addTab( page, i18n( "Diff" ) );
00230 }
00231
00232 void DiffPage::addFormatTab()
00233 {
00234 QWidget* page = new QWidget( this );
00235 QVBoxLayout* layout = new QVBoxLayout( page );
00236 layout->setSpacing( KDialog::spacingHint() );
00237 layout->setMargin( KDialog::marginHint() );
00238
00239
00240 m_modeButtonGroup = new KButtonGroup( page );
00241 m_modeButtonGroup->setWhatsThis( i18n( "Select the format of the output generated by diff. Unified is the one that is used most frequently because it is very readable. The KDE developers like this format the best so use it for sending patches." ) );
00242 layout->addWidget( m_modeButtonGroup );
00243 QVBoxLayout* bgLayout = new QVBoxLayout( m_modeButtonGroup );
00244 m_modeButtonGroup->setTitle( i18n( "Output Format" ) );
00245
00246
00247 QRadioButton* radioButton;
00248 radioButton = new QRadioButton( i18n( "Context" ), m_modeButtonGroup );
00249 bgLayout->addWidget( radioButton );
00250 radioButton = new QRadioButton( i18n( "Ed" ), m_modeButtonGroup );
00251 radioButton->setEnabled( false );
00252 bgLayout->addWidget( radioButton );
00253 radioButton = new QRadioButton( i18n( "Normal" ), m_modeButtonGroup );
00254 bgLayout->addWidget( radioButton );
00255 radioButton = new QRadioButton( i18n( "RCS" ), m_modeButtonGroup );
00256 radioButton->setEnabled( false );
00257 bgLayout->addWidget( radioButton );
00258 radioButton = new QRadioButton( i18n( "Unified" ), m_modeButtonGroup );
00259 bgLayout->addWidget( radioButton );
00260
00261
00262 Q3HGroupBox* groupBox = new Q3HGroupBox( page );
00263 layout->addWidget( groupBox );
00264 groupBox->setTitle( i18n( "Lines of Context" ) );
00265
00266
00267 QLabel* label = new QLabel( i18n( "Number of context lines:" ), groupBox );
00268 m_locSpinBox = new QSpinBox( 0, 100, 1, groupBox );
00269 m_locSpinBox->setWhatsThis( i18n( "The number of context lines is normally 2 or 3. This makes the diff readable and applicable in most cases. More than 3 lines will only bloat the diff unnecessarily." ) );
00270 label->setBuddy( m_locSpinBox );
00271
00272 layout->addStretch( 1 );
00273 page->setMinimumSize( sizeHintForWidget( page ) );
00274
00275 m_tabWidget->addTab( page, i18n( "Format" ) );
00276 }
00277
00278 void DiffPage::addOptionsTab()
00279 {
00280 QWidget* page = new QWidget( this );
00281 QVBoxLayout* layout = new QVBoxLayout( page );
00282 layout->setSpacing( KDialog::spacingHint() );
00283 layout->setMargin( KDialog::marginHint() );
00284
00285
00286 KButtonGroup* optionButtonGroup = new KButtonGroup( page );
00287 layout->addWidget( optionButtonGroup );
00288 QVBoxLayout* bgLayout = new QVBoxLayout( optionButtonGroup );
00289 optionButtonGroup->setTitle( i18n( "General" ) );
00290
00291
00292 m_smallerCheckBox = new QCheckBox( i18n( "&Look for smaller changes" ), optionButtonGroup );
00293 QToolTip::add( m_smallerCheckBox, i18n( "This corresponds to the -d diff option." ) );
00294 bgLayout->addWidget( m_smallerCheckBox );
00295 m_largerCheckBox = new QCheckBox( i18n( "O&ptimize for large files" ), optionButtonGroup );
00296 QToolTip::add( m_largerCheckBox, i18n( "This corresponds to the -H diff option." ) );
00297 bgLayout->addWidget( m_largerCheckBox );
00298 m_caseCheckBox = new QCheckBox( i18n( "&Ignore changes in case" ), optionButtonGroup );
00299 QToolTip::add( m_caseCheckBox, i18n( "This corresponds to the -i diff option." ) );
00300 bgLayout->addWidget( m_caseCheckBox );
00301
00302 QHBoxLayout* groupLayout = new QHBoxLayout( layout );
00303 groupLayout->setObjectName( "regexp_horizontal_layout" );
00304 groupLayout->setSpacing( -1 );
00305 groupLayout->setMargin( KDialog::marginHint() );
00306
00307 m_ignoreRegExpCheckBox = new QCheckBox( i18n( "Ignore regexp:" ), page );
00308 QToolTip::add( m_ignoreRegExpCheckBox, i18n( "This option corresponds to the -I diff option." ) );
00309 groupLayout->addWidget( m_ignoreRegExpCheckBox );
00310 m_ignoreRegExpEdit = new KLineEdit( QString::null, page);
00311 m_ignoreRegExpEdit->setObjectName("regexplineedit" );
00312 QToolTip::add( m_ignoreRegExpEdit, i18n( "Add the regular expression here that you want to use\nto ignore lines that match it." ) );
00313 groupLayout->addWidget( m_ignoreRegExpEdit );
00314
00315 if ( !KServiceTypeTrader::self()->query("KRegExpEditor/KRegExpEditor").isEmpty() )
00316 {
00317
00318 QPushButton* ignoreRegExpEditButton = new QPushButton( i18n( "&Edit..." ), page, "regexp_editor_button" );
00319 QToolTip::add( ignoreRegExpEditButton, i18n( "Clicking this will open a regular expression dialog where\nyou can graphically create regular expressions." ) );
00320 groupLayout->addWidget( ignoreRegExpEditButton );
00321 connect( ignoreRegExpEditButton, SIGNAL( clicked() ), this, SLOT( slotShowRegExpEditor() ) );
00322 }
00323
00324 KButtonGroup* moreOptionButtonGroup = new KButtonGroup( page );
00325 layout->addWidget( moreOptionButtonGroup );
00326 bgLayout = new QVBoxLayout( moreOptionButtonGroup );
00327 moreOptionButtonGroup->setTitle( i18n( "Whitespace" ) );
00328
00329
00330 m_tabsCheckBox = new QCheckBox( i18n( "E&xpand tabs to spaces in output" ), moreOptionButtonGroup );
00331 QToolTip::add( m_tabsCheckBox, i18n( "This option corresponds to the -t diff option." ) );
00332 bgLayout->addWidget( m_tabsCheckBox );
00333 m_linesCheckBox = new QCheckBox( i18n( "I&gnore added or removed empty lines" ), moreOptionButtonGroup );
00334 QToolTip::add( m_linesCheckBox, i18n( "This option corresponds to the -B diff option." ) );
00335 bgLayout->addWidget( m_linesCheckBox );
00336 m_whitespaceCheckBox = new QCheckBox( i18n( "Ig&nore changes in the amount of whitespace" ), moreOptionButtonGroup );
00337 QToolTip::add( m_whitespaceCheckBox, i18n( "This option corresponds to the -b diff option." ) );
00338 bgLayout->addWidget( m_whitespaceCheckBox );
00339 m_allWhitespaceCheckBox = new QCheckBox( i18n( "Ign&ore all whitespace" ), moreOptionButtonGroup );
00340 QToolTip::add( m_allWhitespaceCheckBox, i18n( "This option corresponds to the -w diff option." ) );
00341 bgLayout->addWidget( m_allWhitespaceCheckBox );
00342 m_ignoreTabExpansionCheckBox = new QCheckBox( i18n( "Igno&re changes due to tab expansion" ), moreOptionButtonGroup );
00343 QToolTip::add( m_ignoreTabExpansionCheckBox, i18n( "This option corresponds to the -E diff option." ) );
00344 bgLayout->addWidget( m_ignoreTabExpansionCheckBox );
00345
00346 layout->addStretch( 1 );
00347 page->setMinimumSize( sizeHintForWidget( page ) );
00348
00349 m_tabWidget->addTab( page, i18n( "Options" ) );
00350 }
00351
00352 void DiffPage::addExcludeTab()
00353 {
00354 QWidget* page = new QWidget( this );
00355 QVBoxLayout* layout = new QVBoxLayout( page );
00356 layout->setSpacing( KDialog::spacingHint() );
00357 layout->setMargin( KDialog::marginHint() );
00358
00359 Q3HGroupBox* excludeFilePatternGroupBox = new Q3HGroupBox( page );
00360 excludeFilePatternGroupBox->setTitle( i18n( "File Pattern to Exclude" ) );
00361 m_excludeFilePatternCheckBox = new QCheckBox( "", excludeFilePatternGroupBox );
00362 QToolTip::add( m_excludeFilePatternCheckBox, i18n( "If this is checked you can enter a shell pattern in the text box on the right or select entries from the list." ) );
00363 m_excludeFilePatternEditListBox = new KEditListBox( excludeFilePatternGroupBox );
00364 m_excludeFilePatternEditListBox->setObjectName( "exclude_file_pattern_editlistbox" );
00365 m_excludeFilePatternEditListBox->setButtons( KEditListBox::Add|KEditListBox::Remove );
00366 m_excludeFilePatternEditListBox->setCheckAtEntering( false );
00367 QToolTip::add( m_excludeFilePatternEditListBox, i18n( "Here you can enter or remove a shell pattern or select one or more entries from the list." ) );
00368 layout->addWidget( excludeFilePatternGroupBox );
00369
00370
00371 connect( m_excludeFilePatternCheckBox, SIGNAL(toggled(bool)), this, SLOT(slotExcludeFilePatternToggled(bool)));
00372
00373 Q3HGroupBox* excludeFileNameGroupBox = new Q3HGroupBox( page );
00374 excludeFileNameGroupBox->setTitle( i18n( "File with Filenames to Exclude" ) );
00375 m_excludeFileCheckBox = new QCheckBox( "", excludeFileNameGroupBox );
00376 QToolTip::add( m_excludeFileCheckBox, i18n( "If this is checked you can enter a filename in the combo box on the right." ) );
00377 m_excludeFileURLComboBox = new KUrlComboBox( KUrlComboBox::Files, true, excludeFileNameGroupBox );
00378 m_excludeFileURLComboBox->setObjectName( "exclude_file_urlcombo" );
00379 QToolTip::add( m_excludeFileURLComboBox, i18n( "Here you can enter the URL of a file with shell patterns to ignore during the comparison of the folders." ) );
00380 m_excludeFileURLRequester = new KUrlRequester( m_excludeFileURLComboBox, excludeFileNameGroupBox);
00381 m_excludeFileURLRequester->setObjectName("exclude_file_name_urlrequester" );
00382 QToolTip::add( m_excludeFileURLRequester, i18n( "Any file you select in the dialog that pops up when you click it will be put in the dialog to the left of this button." ) );
00383 layout->addWidget( excludeFileNameGroupBox );
00384
00385 connect( m_excludeFileCheckBox, SIGNAL(toggled(bool)), this, SLOT(slotExcludeFileToggled(bool)));
00386
00387 layout->addStretch( 1 );
00388 page->setMinimumSize( sizeHintForWidget( page ) );
00389
00390 m_tabWidget->addTab( page, i18n( "Exclude" ) );
00391 }
00392
00393 #include "diffpage.moc"