summaryrefslogtreecommitdiffstats
path: root/cervisia/settingsdlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cervisia/settingsdlg.cpp')
-rw-r--r--cervisia/settingsdlg.cpp385
1 files changed, 385 insertions, 0 deletions
diff --git a/cervisia/settingsdlg.cpp b/cervisia/settingsdlg.cpp
new file mode 100644
index 00000000..71b8b32c
--- /dev/null
+++ b/cervisia/settingsdlg.cpp
@@ -0,0 +1,385 @@
+/*
+ * Copyright (C) 1999-2002 Bernd Gehrmann
+ * bernd@mail.berlios.de
+ * Copyright (c) 2002-2004 Christian Loose <christian.loose@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "settingsdlg.h"
+
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qgrid.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qwidgetlist.h>
+#include <qhbuttongroup.h>
+#include <qradiobutton.h>
+#include <kbuttonbox.h>
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kfontdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <kurlrequester.h>
+
+#include "misc.h"
+#include "cervisiasettings.h"
+#include "settingsdlg_advanced.h"
+
+
+namespace
+{
+ // helper method to load icons for configuration pages
+ inline QPixmap LoadIcon(const char* iconName)
+ {
+ KIconLoader* loader = KGlobal::instance()->iconLoader();
+ return loader->loadIcon(QString::fromLatin1(iconName), KIcon::NoGroup,
+ KIcon::SizeMedium);
+ }
+}
+
+
+FontButton::FontButton( const QString &text, QWidget *parent, const char *name )
+ : QPushButton(text, parent, name)
+{
+ connect( this, SIGNAL(clicked()), this, SLOT(chooseFont()) );
+}
+
+
+void FontButton::chooseFont()
+{
+ QFont newFont(font());
+
+ if (KFontDialog::getFont(newFont, false, this) == QDialog::Rejected)
+ return;
+
+ setFont(newFont);
+ repaint(false);
+}
+
+
+SettingsDialog::SettingsDialog( KConfig *conf, QWidget *parent, const char *name )
+ : KDialogBase(KDialogBase::IconList, i18n("Configure Cervisia"),
+ KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help,
+ KDialogBase::Ok,
+ parent, name, true)
+{
+ config = conf;
+
+ // open cvs DCOP service configuration file
+ serviceConfig = new KConfig("cvsservicerc");
+
+ //
+ // General Options
+ //
+ addGeneralPage();
+
+ //
+ // Diff Options
+ //
+ addDiffPage();
+
+ //
+ // Status Options
+ //
+ addStatusPage();
+
+ //
+ // Advanced Options
+ //
+ addAdvancedPage();
+
+ //
+ // Look and Feel Options
+ //
+ addLookAndFeelPage();
+
+ readSettings();
+
+ setHelp("customization", "cervisia");
+}
+
+SettingsDialog::~SettingsDialog()
+{
+ delete serviceConfig;
+}
+
+void SettingsDialog::readSettings()
+{
+ // read entries from cvs DCOP service configuration
+ serviceConfig->setGroup("General");
+ cvspathedit->setURL(serviceConfig->readPathEntry("CVSPath", "cvs"));
+ m_advancedPage->kcfg_Compression->setValue(serviceConfig->readNumEntry(
+ "Compression", 0));
+ m_advancedPage->kcfg_UseSshAgent->setChecked(serviceConfig->readBoolEntry(
+ "UseSshAgent", false));
+
+ config->setGroup("General");
+ m_advancedPage->kcfg_Timeout->setValue(CervisiaSettings::timeout());
+ usernameedit->setText(config->readEntry("Username", Cervisia::UserName()));
+
+ contextedit->setValue((int)config->readUnsignedNumEntry("ContextLines", 65535));
+ tabwidthedit->setValue((int)config->readUnsignedNumEntry("TabWidth", 8));
+ diffoptedit->setText(config->readEntry("DiffOptions"));
+ extdiffedit->setURL(config->readPathEntry("ExternalDiff"));
+ remotestatusbox->setChecked(config->readBoolEntry("StatusForRemoteRepos", false));
+ localstatusbox->setChecked(config->readBoolEntry("StatusForLocalRepos", false));
+
+ // read configuration for look and feel page
+ config->setGroup("LookAndFeel");
+ m_protocolFontBox->setFont(config->readFontEntry("ProtocolFont"));
+ m_annotateFontBox->setFont(config->readFontEntry("AnnotateFont"));
+ m_diffFontBox->setFont(config->readFontEntry("DiffFont"));
+ m_changelogFontBox->setFont(config->readFontEntry("ChangeLogFont"));
+ m_splitterBox->setChecked(config->readBoolEntry("SplitHorizontally",true));
+
+ m_conflictButton->setColor(CervisiaSettings::conflictColor());
+ m_localChangeButton->setColor(CervisiaSettings::localChangeColor());
+ m_remoteChangeButton->setColor(CervisiaSettings::remoteChangeColor());
+ m_notInCvsButton->setColor(CervisiaSettings::notInCvsColor());
+
+ m_diffChangeButton->setColor(CervisiaSettings::diffChangeColor());
+ m_diffInsertButton->setColor(CervisiaSettings::diffInsertColor());
+ m_diffDeleteButton->setColor(CervisiaSettings::diffDeleteColor());
+}
+
+
+void SettingsDialog::writeSettings()
+{
+ // write entries to cvs DCOP service configuration
+ serviceConfig->setGroup("General");
+ serviceConfig->writePathEntry("CVSPath", cvspathedit->url());
+ serviceConfig->writeEntry("Compression",
+ m_advancedPage->kcfg_Compression->value());
+ serviceConfig->writeEntry("UseSshAgent",
+ m_advancedPage->kcfg_UseSshAgent->isChecked());
+
+ // write to disk so other services can reparse the configuration
+ serviceConfig->sync();
+
+ config->setGroup("General");
+ CervisiaSettings::setTimeout(m_advancedPage->kcfg_Timeout->value());
+ config->writeEntry("Username", usernameedit->text());
+
+ config->writePathEntry("ExternalDiff", extdiffedit->url());
+
+ config->writeEntry("ContextLines", (unsigned)contextedit->value());
+ config->writeEntry("TabWidth", tabwidthedit->value());
+ config->writeEntry("DiffOptions", diffoptedit->text());
+ config->writeEntry("StatusForRemoteRepos", remotestatusbox->isChecked());
+ config->writeEntry("StatusForLocalRepos", localstatusbox->isChecked());
+
+ config->setGroup("LookAndFeel");
+ config->writeEntry("ProtocolFont", m_protocolFontBox->font());
+ config->writeEntry("AnnotateFont", m_annotateFontBox->font());
+ config->writeEntry("DiffFont", m_diffFontBox->font());
+ config->writeEntry("ChangeLogFont", m_changelogFontBox->font());
+ config->writeEntry("SplitHorizontally", m_splitterBox->isChecked());
+
+ CervisiaSettings::setConflictColor(m_conflictButton->color());
+ CervisiaSettings::setLocalChangeColor(m_localChangeButton->color());
+ CervisiaSettings::setRemoteChangeColor(m_remoteChangeButton->color());
+ CervisiaSettings::setNotInCvsColor(m_notInCvsButton->color());
+ CervisiaSettings::setDiffChangeColor(m_diffChangeButton->color());
+ CervisiaSettings::setDiffInsertColor(m_diffInsertButton->color());
+ CervisiaSettings::setDiffDeleteColor(m_diffDeleteButton->color());
+
+ // I'm not yet sure whether this is a hack or not :-)
+ QWidgetListIt it(*QApplication::allWidgets());
+ for (; it.current(); ++it)
+ {
+ QWidget *w = it.current();
+ if (w->inherits("ProtocolView"))
+ w->setFont(m_protocolFontBox->font());
+ if (w->inherits("AnnotateView"))
+ w->setFont(m_annotateFontBox->font());
+ if (w->inherits("DiffView"))
+ w->setFont(m_diffFontBox->font());
+ }
+ config->sync();
+
+ CervisiaSettings::writeConfig();
+}
+
+void SettingsDialog::done(int res)
+{
+ if (res == Accepted)
+ writeSettings();
+ KDialogBase::done(res);
+ delete this;
+}
+
+
+/*
+ * Create a page for the general options
+ */
+void SettingsDialog::addGeneralPage()
+{
+ QFrame* generalPage = addPage(i18n("General"), QString::null,
+ LoadIcon("misc"));
+ QVBoxLayout* layout = new QVBoxLayout(generalPage, 0, KDialog::spacingHint());
+
+ QLabel *usernamelabel = new QLabel( i18n("&User name for the change log editor:"), generalPage );
+ usernameedit = new KLineEdit(generalPage);
+ usernameedit->setFocus();
+ usernamelabel->setBuddy(usernameedit);
+
+ layout->addWidget(usernamelabel);
+ layout->addWidget(usernameedit);
+
+ QLabel *cvspathlabel = new QLabel( i18n("&Path to CVS executable, or 'cvs':"), generalPage );
+ cvspathedit = new KURLRequester(generalPage);
+ cvspathlabel->setBuddy(cvspathedit);
+
+ layout->addWidget(cvspathlabel);
+ layout->addWidget(cvspathedit);
+
+ layout->addStretch();
+}
+
+
+/*
+ * Create a page for the diff optionsw
+ */
+void SettingsDialog::addDiffPage()
+{
+ QGrid *diffPage = addGridPage(2, QGrid::Horizontal, i18n("Diff Viewer"),
+ QString::null, LoadIcon("vcs_diff"));
+
+ QLabel *contextlabel = new QLabel( i18n("&Number of context lines in diff dialog:"), diffPage );
+ contextedit = new KIntNumInput( 0, diffPage );
+ contextedit->setRange(0, 65535, 1, false);
+ contextlabel->setBuddy(contextedit);
+
+ QLabel *diffoptlabel = new QLabel(i18n("Additional &options for cvs diff:"), diffPage);
+ diffoptedit = new KLineEdit(diffPage);
+ diffoptlabel->setBuddy(diffoptedit);
+
+ QLabel *tabwidthlabel = new QLabel(i18n("Tab &width in diff dialog:"), diffPage);
+ tabwidthedit = new KIntNumInput(0, diffPage);
+ tabwidthedit->setRange(1, 16, 1, false);
+ tabwidthlabel->setBuddy(tabwidthedit);
+
+ QLabel *extdifflabel = new QLabel(i18n("External diff &frontend:"), diffPage);
+ extdiffedit = new KURLRequester(diffPage);
+ extdifflabel->setBuddy(extdiffedit);
+
+ // dummy widget to take up the vertical space
+ new QWidget(diffPage);
+}
+
+
+/*
+ * Create a page for the status options
+ */
+void SettingsDialog::addStatusPage()
+{
+ QVBox* statusPage = addVBoxPage(i18n("Status"), QString::null,
+ LoadIcon("fork"));
+
+ remotestatusbox = new QCheckBox(i18n("When opening a sandbox from a &remote repository,\n"
+ "start a File->Status command automatically"), statusPage);
+ localstatusbox = new QCheckBox(i18n("When opening a sandbox from a &local repository,\n"
+ "start a File->Status command automatically"), statusPage);
+
+ // dummy widget to take up the vertical space
+ new QWidget(statusPage);
+}
+
+
+/*
+ * Create a page for the advanced options
+ */
+void SettingsDialog::addAdvancedPage()
+{
+ QVBox* frame = addVBoxPage(i18n("Advanced"), QString::null,
+ LoadIcon("configure"));
+
+ m_advancedPage = new AdvancedPage(frame);
+ m_advancedPage->kcfg_Timeout->setRange(0, 50000, 100, false);
+ m_advancedPage->kcfg_Compression->setRange(0, 9, 1, false);
+}
+
+
+/*
+ * Create a page for the look & feel options
+ */
+void SettingsDialog::addLookAndFeelPage()
+{
+ QVBox* lookPage = addVBoxPage(i18n("Appearance"), QString::null,
+ LoadIcon("looknfeel"));
+
+ QGroupBox* fontGroupBox = new QGroupBox(4, Qt::Vertical, i18n("Fonts"),
+ lookPage);
+ fontGroupBox->setInsideSpacing(KDialog::spacingHint());
+
+ m_protocolFontBox = new FontButton(i18n("Font for &Protocol Window..."),
+ fontGroupBox);
+ m_annotateFontBox = new FontButton(i18n("Font for A&nnotate View..."),
+ fontGroupBox);
+ m_diffFontBox = new FontButton(i18n("Font for D&iff View..."),
+ fontGroupBox);
+ m_changelogFontBox = new FontButton(i18n("Font for ChangeLog View..."),
+ fontGroupBox);
+
+ QGroupBox* colorGroupBox = new QGroupBox(4, Qt::Horizontal,
+ i18n("Colors"), lookPage);
+ colorGroupBox->setColumns(4);
+ colorGroupBox->setInsideSpacing(KDialog::spacingHint());
+
+ QLabel* conflictLabel = new QLabel(i18n("Conflict:"), colorGroupBox);
+ m_conflictButton = new KColorButton(colorGroupBox);
+ conflictLabel->setBuddy(m_conflictButton);
+
+ QLabel* diffChangeLabel = new QLabel(i18n("Diff change:"), colorGroupBox);
+ m_diffChangeButton = new KColorButton(colorGroupBox);
+ diffChangeLabel->setBuddy(m_diffChangeButton);
+
+ QLabel* localChangeLabel = new QLabel(i18n("Local change:"), colorGroupBox);
+ m_localChangeButton = new KColorButton(colorGroupBox);
+ localChangeLabel->setBuddy(m_localChangeButton);
+
+ QLabel* diffInsertLabel = new QLabel(i18n("Diff insertion:"), colorGroupBox);
+ m_diffInsertButton = new KColorButton(colorGroupBox);
+ diffInsertLabel->setBuddy(m_diffInsertButton);
+
+ QLabel* remoteChangeLabel = new QLabel(i18n("Remote change:"), colorGroupBox);
+ m_remoteChangeButton = new KColorButton(colorGroupBox);
+ remoteChangeLabel->setBuddy( m_remoteChangeButton );
+
+ QLabel* diffDeleteLabel = new QLabel(i18n("Diff deletion:"), colorGroupBox);
+ m_diffDeleteButton = new KColorButton(colorGroupBox);
+ diffDeleteLabel->setBuddy(m_diffDeleteButton);
+
+ QLabel* notInCvsLabel = new QLabel(i18n("Not in cvs:"), colorGroupBox);
+ m_notInCvsButton = new KColorButton(colorGroupBox);
+ notInCvsLabel->setBuddy(m_notInCvsButton);
+
+ m_splitterBox = new QCheckBox(i18n("Split main window &horizontally"), lookPage);
+}
+
+#include "settingsdlg.moc"
+
+
+// Local Variables:
+// c-basic-offset: 4
+// End: