mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-24 10:52:51 +00:00

notice how the use of primary shortcut only disappears Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
1296 lines
45 KiB
C++
1296 lines
45 KiB
C++
/* This file is part of the KDE libraries
|
|
Copyright (C) 2002, 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
|
|
Copyright (C) 2003 Christoph Cullmann <cullmann@kde.org>
|
|
Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
|
|
Copyright (C) 2006 Dominik Haumann <dhdev@gmx.de>
|
|
Copyright (C) 2007 Mirko Stocker <me@misto.ch>
|
|
Copyright (C) 2009 Michel Ludwig <michel.ludwig@kdemail.net>
|
|
Copyright (C) 2009 Erlend Hamberg <ehamberg@gmail.com>
|
|
|
|
Based on work of:
|
|
Copyright (C) 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
This library 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
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
//BEGIN Includes
|
|
#include "katedialogs.h"
|
|
#include "moc_katedialogs.cpp"
|
|
|
|
#include "kateautoindent.h"
|
|
#include "katebuffer.h"
|
|
#include "kateconfig.h"
|
|
#include "katedocument.h"
|
|
#include "kateglobal.h"
|
|
#include "kateschema.h"
|
|
#include "katesyntaxdocument.h"
|
|
#include "katemodeconfigpage.h"
|
|
#include "kateview.h"
|
|
#include "katepartpluginmanager.h"
|
|
#include "kpluginselector.h"
|
|
#include "spellcheck/spellcheck.h"
|
|
|
|
// auto generated ui files
|
|
#include "ui_modonhdwidget.h"
|
|
#include "ui_textareaappearanceconfigwidget.h"
|
|
#include "ui_bordersappearanceconfigwidget.h"
|
|
#include "ui_navigationconfigwidget.h"
|
|
#include "ui_editconfigwidget.h"
|
|
#include "ui_indentationconfigwidget.h"
|
|
#include "ui_completionconfigtab.h"
|
|
#include "ui_opensaveconfigwidget.h"
|
|
#include "ui_opensaveconfigadvwidget.h"
|
|
#include "ui_spellcheckconfigwidget.h"
|
|
|
|
#include <ktexteditor/plugin.h>
|
|
|
|
#include <kio/job.h>
|
|
#include <kio/jobclasses.h>
|
|
#include <kio/netaccess.h>
|
|
#include <kapplication.h>
|
|
#include <kcharsets.h>
|
|
#include <kcolorbutton.h>
|
|
#include <kcombobox.h>
|
|
#include <kconfig.h>
|
|
#include <kdebug.h>
|
|
#include <kglobal.h>
|
|
#include <kglobalsettings.h>
|
|
#include <kiconloader.h>
|
|
#include <klineedit.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <kmimetypechooser.h>
|
|
#include <knuminput.h>
|
|
#include <kmenu.h>
|
|
#include <krun.h>
|
|
#include <kseparator.h>
|
|
#include <kstandarddirs.h>
|
|
#include <ktemporaryfile.h>
|
|
#include <kpushbutton.h>
|
|
#include <kvbox.h>
|
|
#include <kactioncollection.h>
|
|
#include <kplugininfo.h>
|
|
#include <ktabwidget.h>
|
|
#include <kspeller.h>
|
|
|
|
#include <QtCore/QFile>
|
|
#include <QtCore/QMap>
|
|
#include <QtCore/QObject>
|
|
#include <QtCore/QProcess>
|
|
#include <QtCore/QStringList>
|
|
#include <QtCore/QTextCodec>
|
|
#include <QtCore/QTextStream>
|
|
#include <QtGui/QCheckBox>
|
|
#include <QtGui/QComboBox>
|
|
#include <QtGui/QDialog>
|
|
#include <QtGui/QGroupBox>
|
|
#include <QtGui/QLabel>
|
|
#include <QtGui/QLayout>
|
|
#include <QtGui/QPainter>
|
|
#include <QtGui/QRadioButton>
|
|
#include <QtGui/QSlider>
|
|
#include <QtGui/QTabWidget>
|
|
#include <QtGui/QToolButton>
|
|
#include <QtGui/QWhatsThis>
|
|
#include <QtGui/qevent.h>
|
|
|
|
//END
|
|
|
|
//BEGIN KateConfigPage
|
|
KateConfigPage::KateConfigPage ( QWidget *parent, const char * )
|
|
: KTextEditor::ConfigPage (parent)
|
|
, m_changed (false)
|
|
{
|
|
connect (this, SIGNAL(changed()), this, SLOT(somethingHasChanged()));
|
|
}
|
|
|
|
KateConfigPage::~KateConfigPage ()
|
|
{
|
|
}
|
|
|
|
void KateConfigPage::slotChanged()
|
|
{
|
|
emit changed();
|
|
}
|
|
|
|
void KateConfigPage::somethingHasChanged ()
|
|
{
|
|
m_changed = true;
|
|
kDebug (13000) << "TEST: something changed on the config page: " << this;
|
|
}
|
|
//END KateConfigPage
|
|
|
|
//BEGIN KateIndentConfigTab
|
|
KateIndentConfigTab::KateIndentConfigTab(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
{
|
|
// This will let us have more separation between this page and
|
|
// the KTabWidget edge (ereslibre)
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
QWidget *newWidget = new QWidget(this);
|
|
|
|
ui = new Ui::IndentationConfigWidget();
|
|
ui->setupUi( newWidget );
|
|
|
|
ui->cmbMode->addItems (KateAutoIndent::listModes());
|
|
|
|
ui->label->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard);
|
|
connect(ui->label, SIGNAL(linkActivated(QString)), this, SLOT(showWhatsThis(QString)));
|
|
|
|
// What's This? help can be found in the ui file
|
|
|
|
reload ();
|
|
|
|
//
|
|
// after initial reload, connect the stuff for the changed () signal
|
|
//
|
|
|
|
connect(ui->cmbMode, SIGNAL(activated(int)), this, SLOT(slotChanged()));
|
|
connect(ui->rbIndentWithTabs, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->rbIndentWithSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->rbIndentMixed, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->rbIndentWithTabs, SIGNAL(toggled(bool)), ui->sbIndentWidth, SLOT(setDisabled(bool)));
|
|
|
|
connect(ui->chkKeepExtraSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->chkIndentPaste, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->chkBackspaceUnindents, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
|
|
connect(ui->sbTabWidth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect(ui->sbIndentWidth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
|
|
connect(ui->rbTabAdvances, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->rbTabIndents, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->rbTabSmart, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
|
|
layout->addWidget(newWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateIndentConfigTab::~KateIndentConfigTab()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void KateIndentConfigTab::slotChanged()
|
|
{
|
|
if (ui->rbIndentWithTabs->isChecked())
|
|
ui->sbIndentWidth->setValue(ui->sbTabWidth->value());
|
|
|
|
KateConfigPage::slotChanged();
|
|
}
|
|
|
|
void KateIndentConfigTab::showWhatsThis(const QString& text)
|
|
{
|
|
QWhatsThis::showText(QCursor::pos(), text);
|
|
}
|
|
|
|
void KateIndentConfigTab::apply ()
|
|
{
|
|
// nothing changed, no need to apply stuff
|
|
if (!hasChanged())
|
|
return;
|
|
m_changed = false;
|
|
|
|
KateDocumentConfig::global()->configStart ();
|
|
|
|
KateDocumentConfig::global()->setKeepExtraSpaces(ui->chkKeepExtraSpaces->isChecked());
|
|
KateDocumentConfig::global()->setBackspaceIndents(ui->chkBackspaceUnindents->isChecked());
|
|
KateDocumentConfig::global()->setIndentPastedText(ui->chkIndentPaste->isChecked());
|
|
KateDocumentConfig::global()->setIndentationWidth(ui->sbIndentWidth->value());
|
|
KateDocumentConfig::global()->setIndentationMode(KateAutoIndent::modeName(ui->cmbMode->currentIndex()));
|
|
KateDocumentConfig::global()->setTabWidth(ui->sbTabWidth->value());
|
|
KateDocumentConfig::global()->setReplaceTabsDyn(ui->rbIndentWithSpaces->isChecked());
|
|
|
|
if (ui->rbTabAdvances->isChecked())
|
|
KateDocumentConfig::global()->setTabHandling( KateDocumentConfig::tabInsertsTab );
|
|
else if (ui->rbTabIndents->isChecked())
|
|
KateDocumentConfig::global()->setTabHandling( KateDocumentConfig::tabIndents );
|
|
else
|
|
KateDocumentConfig::global()->setTabHandling( KateDocumentConfig::tabSmart );
|
|
|
|
KateDocumentConfig::global()->configEnd ();
|
|
}
|
|
|
|
void KateIndentConfigTab::reload ()
|
|
{
|
|
ui->sbTabWidth->setSuffix(ki18np(" character", " characters"));
|
|
ui->sbTabWidth->setValue(KateDocumentConfig::global()->tabWidth());
|
|
ui->sbIndentWidth->setSuffix(ki18np(" character", " characters"));
|
|
ui->sbIndentWidth->setValue(KateDocumentConfig::global()->indentationWidth());
|
|
ui->chkKeepExtraSpaces->setChecked(KateDocumentConfig::global()->keepExtraSpaces());
|
|
ui->chkIndentPaste->setChecked(KateDocumentConfig::global()->indentPastedText());
|
|
ui->chkBackspaceUnindents->setChecked(KateDocumentConfig::global()->backspaceIndents());
|
|
|
|
ui->rbTabAdvances->setChecked( KateDocumentConfig::global()->tabHandling() == KateDocumentConfig::tabInsertsTab );
|
|
ui->rbTabIndents->setChecked( KateDocumentConfig::global()->tabHandling() == KateDocumentConfig::tabIndents );
|
|
ui->rbTabSmart->setChecked( KateDocumentConfig::global()->tabHandling() == KateDocumentConfig::tabSmart );
|
|
|
|
ui->cmbMode->setCurrentIndex (KateAutoIndent::modeNumber (KateDocumentConfig::global()->indentationMode()));
|
|
|
|
if (KateDocumentConfig::global()->replaceTabsDyn())
|
|
ui->rbIndentWithSpaces->setChecked (true);
|
|
else
|
|
{
|
|
if (KateDocumentConfig::global()->indentationWidth() == KateDocumentConfig::global()->tabWidth())
|
|
ui->rbIndentWithTabs->setChecked (true);
|
|
else
|
|
ui->rbIndentMixed->setChecked (true);
|
|
}
|
|
|
|
ui->sbIndentWidth->setEnabled(!ui->rbIndentWithTabs->isChecked());
|
|
}
|
|
//END KateIndentConfigTab
|
|
|
|
//BEGIN KateCompletionConfigTab
|
|
KateCompletionConfigTab::KateCompletionConfigTab(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
{
|
|
// This will let us have more separation between this page and
|
|
// the KTabWidget edge (ereslibre)
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
QWidget *newWidget = new QWidget(this);
|
|
|
|
ui = new Ui::CompletionConfigTab ();
|
|
ui->setupUi( newWidget );
|
|
|
|
// What's This? help can be found in the ui file
|
|
|
|
reload ();
|
|
|
|
//
|
|
// after initial reload, connect the stuff for the changed () signal
|
|
//
|
|
|
|
connect(ui->chkAutoCompletionEnabled, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->gbWordCompletion, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->gbKeywordCompletion, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->minimalWordLength, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect(ui->removeTail, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
|
|
layout->addWidget(newWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateCompletionConfigTab::~KateCompletionConfigTab()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void KateCompletionConfigTab::showWhatsThis(const QString& text)
|
|
{
|
|
QWhatsThis::showText(QCursor::pos(), text);
|
|
}
|
|
|
|
void KateCompletionConfigTab::apply ()
|
|
{
|
|
// nothing changed, no need to apply stuff
|
|
if (!hasChanged())
|
|
return;
|
|
m_changed = false;
|
|
|
|
KateViewConfig::global()->configStart ();
|
|
KateViewConfig::global()->setAutomaticCompletionInvocation (ui->chkAutoCompletionEnabled->isChecked());
|
|
KateViewConfig::global()->setWordCompletion (ui->gbWordCompletion->isChecked());
|
|
KateViewConfig::global()->setWordCompletionMinimalWordLength (ui->minimalWordLength->value());
|
|
KateViewConfig::global()->setWordCompletionRemoveTail (ui->removeTail->isChecked());
|
|
KateViewConfig::global()->setKeywordCompletion (ui->gbKeywordCompletion->isChecked());
|
|
KateViewConfig::global()->configEnd ();
|
|
}
|
|
|
|
void KateCompletionConfigTab::reload ()
|
|
{
|
|
ui->chkAutoCompletionEnabled->setChecked( KateViewConfig::global()->automaticCompletionInvocation () );
|
|
ui->gbWordCompletion->setChecked( KateViewConfig::global()->wordCompletion () );
|
|
ui->gbKeywordCompletion->setChecked( KateViewConfig::global()->keywordCompletion () );
|
|
ui->minimalWordLength->setValue (KateViewConfig::global()->wordCompletionMinimalWordLength ());
|
|
ui->removeTail->setChecked (KateViewConfig::global()->wordCompletionRemoveTail ());
|
|
}
|
|
//END KateCompletionConfigTab
|
|
|
|
//BEGIN KateSpellCheckConfigTab
|
|
KateSpellCheckConfigTab::KateSpellCheckConfigTab(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
{
|
|
// This will let us have more separation between this page and
|
|
// the KTabWidget edge (ereslibre)
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
QWidget *newWidget = new QWidget(this);
|
|
|
|
ui = new Ui::SpellCheckConfigWidget();
|
|
ui->setupUi(newWidget);
|
|
|
|
// What's This? help can be found in the ui file
|
|
reload();
|
|
|
|
//
|
|
// after initial reload, connect the stuff for the changed () signal
|
|
|
|
m_spellConfigWidget = new KSpellConfigWidget(KGlobal::config().data(), this);
|
|
connect(m_spellConfigWidget, SIGNAL(configChanged()), this, SLOT(slotChanged()));
|
|
layout->addWidget(m_spellConfigWidget);
|
|
|
|
layout->addWidget(newWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateSpellCheckConfigTab::~KateSpellCheckConfigTab()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void KateSpellCheckConfigTab::showWhatsThis(const QString& text)
|
|
{
|
|
QWhatsThis::showText(QCursor::pos(), text);
|
|
}
|
|
|
|
void KateSpellCheckConfigTab::apply()
|
|
{
|
|
if (!hasChanged()) {
|
|
// nothing changed, no need to apply stuff
|
|
return;
|
|
}
|
|
m_changed = false;
|
|
|
|
KateDocumentConfig::global()->configStart();
|
|
m_spellConfigWidget->save();
|
|
KateDocumentConfig::global()->configEnd();
|
|
foreach (KateDocument *doc, KateGlobal::self()->kateDocuments()) {
|
|
doc->refreshOnTheFlyCheck();
|
|
}
|
|
}
|
|
|
|
void KateSpellCheckConfigTab::reload()
|
|
{
|
|
// does nothing
|
|
}
|
|
//END KateSpellCheckConfigTab
|
|
|
|
//BEGIN KateNavigationConfigTab
|
|
KateNavigationConfigTab::KateNavigationConfigTab(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
{
|
|
// This will let us having more separation between this page and
|
|
// the KTabWidget edge (ereslibre)
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
QWidget *newWidget = new QWidget(this);
|
|
|
|
ui = new Ui::NavigationConfigWidget();
|
|
ui->setupUi( newWidget );
|
|
|
|
// What's This? Help is in the ui-files
|
|
|
|
reload ();
|
|
|
|
//
|
|
// after initial reload, connect the stuff for the changed () signal
|
|
//
|
|
|
|
connect(ui->cbTextSelectionMode, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChanged()));
|
|
connect(ui->chkSmartHome, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->chkPagingMovesCursor, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->sbAutoCenterCursor, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect(ui->chkScrollPastEnd, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
|
|
layout->addWidget(newWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateNavigationConfigTab::~KateNavigationConfigTab()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void KateNavigationConfigTab::apply ()
|
|
{
|
|
// nothing changed, no need to apply stuff
|
|
if (!hasChanged())
|
|
return;
|
|
m_changed = false;
|
|
|
|
KateViewConfig::global()->configStart ();
|
|
KateDocumentConfig::global()->configStart ();
|
|
|
|
KateDocumentConfig::global()->setSmartHome(ui->chkSmartHome->isChecked());
|
|
|
|
KateViewConfig::global()->setAutoCenterLines(qMax(0, ui->sbAutoCenterCursor->value()));
|
|
KateDocumentConfig::global()->setPageUpDownMovesCursor(ui->chkPagingMovesCursor->isChecked());
|
|
|
|
KateViewConfig::global()->setPersistentSelection (ui->cbTextSelectionMode->currentIndex() == 1);
|
|
|
|
KateViewConfig::global()->setScrollPastEnd(ui->chkScrollPastEnd->isChecked());
|
|
|
|
KateDocumentConfig::global()->configEnd ();
|
|
KateViewConfig::global()->configEnd ();
|
|
}
|
|
|
|
void KateNavigationConfigTab::reload ()
|
|
{
|
|
ui->cbTextSelectionMode->setCurrentIndex( KateViewConfig::global()->persistentSelection() ? 1 : 0 );
|
|
|
|
ui->chkSmartHome->setChecked(KateDocumentConfig::global()->smartHome());
|
|
ui->chkPagingMovesCursor->setChecked(KateDocumentConfig::global()->pageUpDownMovesCursor());
|
|
ui->sbAutoCenterCursor->setValue(KateViewConfig::global()->autoCenterLines());
|
|
ui->chkScrollPastEnd->setChecked(KateViewConfig::global()->scrollPastEnd());
|
|
}
|
|
//END KateNavigationConfigTab
|
|
|
|
//BEGIN KateEditGeneralConfigTab
|
|
KateEditGeneralConfigTab::KateEditGeneralConfigTab(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
{
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
QWidget *newWidget = new QWidget(this);
|
|
ui = new Ui::EditConfigWidget();
|
|
ui->setupUi( newWidget );
|
|
|
|
reload();
|
|
|
|
connect(ui->chkStaticWordWrap, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->chkShowStaticWordWrapMarker, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(ui->sbWordWrap, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect(ui->chkSmartCopyCut, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
|
|
// "What's this?" help is in the ui-file
|
|
|
|
layout->addWidget(newWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateEditGeneralConfigTab::~KateEditGeneralConfigTab()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void KateEditGeneralConfigTab::apply ()
|
|
{
|
|
// nothing changed, no need to apply stuff
|
|
if (!hasChanged())
|
|
return;
|
|
m_changed = false;
|
|
|
|
KateViewConfig::global()->configStart ();
|
|
KateDocumentConfig::global()->configStart ();
|
|
|
|
KateDocumentConfig::global()->setWordWrapAt(ui->sbWordWrap->value());
|
|
KateDocumentConfig::global()->setWordWrap(ui->chkStaticWordWrap->isChecked());
|
|
|
|
KateRendererConfig::global()->setWordWrapMarker (ui->chkShowStaticWordWrapMarker->isChecked());
|
|
|
|
KateDocumentConfig::global()->configEnd ();
|
|
KateViewConfig::global()->setSmartCopyCut(ui->chkSmartCopyCut->isChecked());
|
|
KateViewConfig::global()->configEnd ();
|
|
}
|
|
|
|
void KateEditGeneralConfigTab::reload ()
|
|
{
|
|
ui->chkStaticWordWrap->setChecked(KateDocumentConfig::global()->wordWrap());
|
|
ui->chkShowStaticWordWrapMarker->setChecked( KateRendererConfig::global()->wordWrapMarker() );
|
|
ui->sbWordWrap->setSuffix(ki18ncp("Wrap words at", " character", " characters"));
|
|
ui->sbWordWrap->setValue( KateDocumentConfig::global()->wordWrapAt() );
|
|
ui->chkSmartCopyCut->setChecked( KateViewConfig::global()->smartCopyCut() );
|
|
}
|
|
//END KateEditGeneralConfigTab
|
|
|
|
|
|
//BEGIN KateEditConfigTab
|
|
KateEditConfigTab::KateEditConfigTab(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
, editConfigTab(new KateEditGeneralConfigTab(this))
|
|
, navigationConfigTab(new KateNavigationConfigTab(this))
|
|
, indentConfigTab(new KateIndentConfigTab(this))
|
|
, completionConfigTab (new KateCompletionConfigTab(this))
|
|
, spellCheckConfigTab(new KateSpellCheckConfigTab(this))
|
|
{
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
layout->setMargin(0);
|
|
KTabWidget *tabWidget = new KTabWidget(this);
|
|
|
|
// add all tabs
|
|
tabWidget->insertTab(0, editConfigTab, i18n("General"));
|
|
tabWidget->insertTab(1, navigationConfigTab, i18n("Text Navigation"));
|
|
tabWidget->insertTab(2, indentConfigTab, i18n("Indentation"));
|
|
tabWidget->insertTab(3, completionConfigTab, i18n("Auto Completion"));
|
|
tabWidget->insertTab(4, spellCheckConfigTab, i18n("Spellcheck"));
|
|
|
|
connect(editConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
|
|
connect(navigationConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
|
|
connect(indentConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
|
|
connect(completionConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
|
|
connect(spellCheckConfigTab, SIGNAL(changed()), this, SLOT(slotChanged()));
|
|
|
|
layout->addWidget(tabWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateEditConfigTab::~KateEditConfigTab()
|
|
{
|
|
}
|
|
|
|
void KateEditConfigTab::apply ()
|
|
{
|
|
// try to update the rest of tabs
|
|
editConfigTab->apply();
|
|
navigationConfigTab->apply();
|
|
indentConfigTab->apply();
|
|
completionConfigTab->apply();
|
|
spellCheckConfigTab->apply();
|
|
}
|
|
|
|
void KateEditConfigTab::reload ()
|
|
{
|
|
editConfigTab->reload();
|
|
navigationConfigTab->reload();
|
|
indentConfigTab->reload();
|
|
completionConfigTab->reload();
|
|
spellCheckConfigTab->reload();
|
|
}
|
|
|
|
void KateEditConfigTab::reset ()
|
|
{
|
|
editConfigTab->reset();
|
|
navigationConfigTab->reset();
|
|
indentConfigTab->reset();
|
|
completionConfigTab->reset();
|
|
spellCheckConfigTab->reset();
|
|
}
|
|
|
|
void KateEditConfigTab::defaults ()
|
|
{
|
|
editConfigTab->defaults();
|
|
navigationConfigTab->defaults();
|
|
indentConfigTab->defaults();
|
|
completionConfigTab->defaults();
|
|
spellCheckConfigTab->defaults();
|
|
}
|
|
//END KateEditConfigTab
|
|
|
|
//BEGIN KateViewDefaultsConfig
|
|
KateViewDefaultsConfig::KateViewDefaultsConfig(QWidget *parent)
|
|
: KateConfigPage(parent)
|
|
, textareaUi(new Ui::TextareaAppearanceConfigWidget())
|
|
, bordersUi(new Ui::BordersAppearanceConfigWidget())
|
|
{
|
|
QLayout *layout = new QVBoxLayout( this );
|
|
QTabWidget *tabWidget = new QTabWidget( this );
|
|
layout->addWidget( tabWidget );
|
|
layout->setMargin( 0 );
|
|
|
|
QWidget *textareaTab = new QWidget( tabWidget );
|
|
textareaUi->setupUi( textareaTab );
|
|
tabWidget->addTab( textareaTab, i18n("General") );
|
|
|
|
QWidget *bordersTab = new QWidget( tabWidget );
|
|
bordersUi->setupUi( bordersTab );
|
|
tabWidget->addTab( bordersTab, i18n("Borders") );
|
|
|
|
if (KateDocument::simpleMode ())
|
|
bordersUi->gbSortBookmarks->hide ();
|
|
|
|
textareaUi->cmbDynamicWordWrapIndicator->addItem( i18n("Off") );
|
|
textareaUi->cmbDynamicWordWrapIndicator->addItem( i18n("Follow Line Numbers") );
|
|
textareaUi->cmbDynamicWordWrapIndicator->addItem( i18n("Always On") );
|
|
|
|
// hide power user mode if activated anyway
|
|
if (!KateGlobal::self()->simpleMode ())
|
|
textareaUi->chkDeveloperMode->hide ();
|
|
|
|
// What's This? help is in the ui-file
|
|
|
|
reload();
|
|
|
|
//
|
|
// after initial reload, connect the stuff for the changed () signal
|
|
//
|
|
|
|
connect(textareaUi->gbWordWrap, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->cmbDynamicWordWrapIndicator, SIGNAL(activated(int)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->sbDynamicWordWrapDepth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkShowTabs, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkShowSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkShowIndentationLines, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkShowWholeBracketExpression, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkAnimateBracketMatching, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkDeveloperMode, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(textareaUi->chkFoldFirstLine, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
|
|
connect(bordersUi->chkIconBorder, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->chkScrollbarMarks, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->chkScrollbarMiniMap, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->chkScrollbarMiniMapAll, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
bordersUi->chkScrollbarMiniMapAll->hide(); // this is temporary until the feature is done
|
|
connect(bordersUi->spBoxMiniMapWidth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->chkLineNumbers, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->chkShowLineModification, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->chkShowFoldingMarkers, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->rbSortBookmarksByPosition, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->rbSortBookmarksByCreation, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect(bordersUi->cmbShowScrollbars, SIGNAL(activated(int)), this, SLOT(slotChanged()));
|
|
}
|
|
|
|
KateViewDefaultsConfig::~KateViewDefaultsConfig()
|
|
{
|
|
delete bordersUi;
|
|
delete textareaUi;
|
|
}
|
|
|
|
void KateViewDefaultsConfig::apply ()
|
|
{
|
|
// nothing changed, no need to apply stuff
|
|
if (!hasChanged())
|
|
return;
|
|
m_changed = false;
|
|
|
|
KateViewConfig::global()->configStart ();
|
|
KateRendererConfig::global()->configStart ();
|
|
|
|
KateViewConfig::global()->setDynWordWrap (textareaUi->gbWordWrap->isChecked());
|
|
KateViewConfig::global()->setDynWordWrapIndicators (textareaUi->cmbDynamicWordWrapIndicator->currentIndex ());
|
|
KateViewConfig::global()->setDynWordWrapAlignIndent(textareaUi->sbDynamicWordWrapDepth->value());
|
|
KateDocumentConfig::global()->setShowTabs (textareaUi->chkShowTabs->isChecked());
|
|
KateDocumentConfig::global()->setShowSpaces (textareaUi->chkShowSpaces->isChecked());
|
|
KateViewConfig::global()->setLineNumbers (bordersUi->chkLineNumbers->isChecked());
|
|
KateViewConfig::global()->setIconBar (bordersUi->chkIconBorder->isChecked());
|
|
KateViewConfig::global()->setScrollBarMarks (bordersUi->chkScrollbarMarks->isChecked());
|
|
KateViewConfig::global()->setScrollBarMiniMap (bordersUi->chkScrollbarMiniMap->isChecked());
|
|
KateViewConfig::global()->setScrollBarMiniMapAll (bordersUi->chkScrollbarMiniMapAll->isChecked());
|
|
KateViewConfig::global()->setScrollBarMiniMapWidth (bordersUi->spBoxMiniMapWidth->value());
|
|
KateViewConfig::global()->setFoldingBar (bordersUi->chkShowFoldingMarkers->isChecked());
|
|
KateViewConfig::global()->setLineModification(bordersUi->chkShowLineModification->isChecked());
|
|
KateViewConfig::global()->setShowScrollbars( bordersUi->cmbShowScrollbars->currentIndex() );
|
|
|
|
KateViewConfig::global()->setBookmarkSort (bordersUi->rbSortBookmarksByPosition->isChecked()?0:1);
|
|
KateRendererConfig::global()->setShowIndentationLines(textareaUi->chkShowIndentationLines->isChecked());
|
|
KateRendererConfig::global()->setShowWholeBracketExpression(textareaUi->chkShowWholeBracketExpression->isChecked());
|
|
KateRendererConfig::global()->setAnimateBracketMatching(textareaUi->chkAnimateBracketMatching->isChecked());
|
|
KateViewConfig::global()->setFoldFirstLine(textareaUi->chkFoldFirstLine->isChecked());
|
|
|
|
// warn user that he needs restart the application
|
|
if (!textareaUi->chkDeveloperMode->isChecked() != KateDocumentConfig::global()->allowSimpleMode())
|
|
{
|
|
// inform...
|
|
KMessageBox::information(
|
|
this,
|
|
i18n("Changing the power user mode affects only newly opened / created documents. In KWrite a restart is recommended."),
|
|
i18n("Power user mode changed"));
|
|
|
|
KateDocumentConfig::global()->setAllowSimpleMode (!textareaUi->chkDeveloperMode->isChecked());
|
|
}
|
|
|
|
KateRendererConfig::global()->configEnd ();
|
|
KateViewConfig::global()->configEnd ();
|
|
}
|
|
|
|
void KateViewDefaultsConfig::reload ()
|
|
{
|
|
textareaUi->gbWordWrap->setChecked(KateViewConfig::global()->dynWordWrap());
|
|
textareaUi->cmbDynamicWordWrapIndicator->setCurrentIndex( KateViewConfig::global()->dynWordWrapIndicators() );
|
|
textareaUi->sbDynamicWordWrapDepth->setValue(KateViewConfig::global()->dynWordWrapAlignIndent());
|
|
textareaUi->chkShowTabs->setChecked(KateDocumentConfig::global()->showTabs());
|
|
textareaUi->chkShowSpaces->setChecked(KateDocumentConfig::global()->showSpaces());
|
|
bordersUi->chkLineNumbers->setChecked(KateViewConfig::global()->lineNumbers());
|
|
bordersUi->chkIconBorder->setChecked(KateViewConfig::global()->iconBar());
|
|
bordersUi->chkScrollbarMarks->setChecked(KateViewConfig::global()->scrollBarMarks());
|
|
bordersUi->chkScrollbarMiniMap->setChecked(KateViewConfig::global()->scrollBarMiniMap());
|
|
bordersUi->chkScrollbarMiniMapAll->setChecked(KateViewConfig::global()->scrollBarMiniMapAll());
|
|
bordersUi->spBoxMiniMapWidth->setValue(KateViewConfig::global()->scrollBarMiniMapWidth());
|
|
bordersUi->chkShowFoldingMarkers->setChecked(KateViewConfig::global()->foldingBar());
|
|
bordersUi->chkShowLineModification->setChecked(KateViewConfig::global()->lineModification());
|
|
bordersUi->rbSortBookmarksByPosition->setChecked(KateViewConfig::global()->bookmarkSort()==0);
|
|
bordersUi->rbSortBookmarksByCreation->setChecked(KateViewConfig::global()->bookmarkSort()==1);
|
|
bordersUi->cmbShowScrollbars->setCurrentIndex( KateViewConfig::global()->showScrollbars() );
|
|
textareaUi->chkShowIndentationLines->setChecked(KateRendererConfig::global()->showIndentationLines());
|
|
textareaUi->chkShowWholeBracketExpression->setChecked(KateRendererConfig::global()->showWholeBracketExpression());
|
|
textareaUi->chkAnimateBracketMatching->setChecked(KateRendererConfig::global()->animateBracketMatching());
|
|
textareaUi->chkDeveloperMode->setChecked(!KateDocumentConfig::global()->allowSimpleMode());
|
|
textareaUi->chkFoldFirstLine->setChecked(KateViewConfig::global()->foldFirstLine());
|
|
}
|
|
|
|
void KateViewDefaultsConfig::reset () {;}
|
|
|
|
void KateViewDefaultsConfig::defaults (){;}
|
|
//END KateViewDefaultsConfig
|
|
|
|
//BEGIN KateSaveConfigTab
|
|
KateSaveConfigTab::KateSaveConfigTab( QWidget *parent )
|
|
: KateConfigPage( parent )
|
|
, modeConfigPage( new ModeConfigPage( this ) )
|
|
{
|
|
// FIXME: Is really needed to move all this code below to another class,
|
|
// since it is another tab itself on the config dialog. This means we should
|
|
// initialize, add and work with as we do with modeConfigPage (ereslibre)
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
layout->setMargin(0);
|
|
KTabWidget *tabWidget = new KTabWidget(this);
|
|
|
|
QWidget *tmpWidget = new QWidget(tabWidget);
|
|
QVBoxLayout *internalLayout = new QVBoxLayout;
|
|
QWidget *newWidget = new QWidget(tabWidget);
|
|
ui = new Ui::OpenSaveConfigWidget();
|
|
ui->setupUi( newWidget );
|
|
|
|
QWidget *tmpWidget2 = new QWidget(tabWidget);
|
|
QVBoxLayout *internalLayout2 = new QVBoxLayout;
|
|
QWidget *newWidget2 = new QWidget(tabWidget);
|
|
uiadv = new Ui::OpenSaveConfigAdvWidget();
|
|
uiadv->setupUi( newWidget2 );
|
|
|
|
// What's this help is added in ui/opensaveconfigwidget.ui
|
|
reload();
|
|
|
|
//
|
|
// after initial reload, connect the stuff for the changed () signal
|
|
//
|
|
|
|
connect( ui->cmbEncoding, SIGNAL(activated(int)), this, SLOT(slotChanged()));
|
|
connect( ui->cmbEncodingFallback, SIGNAL(activated(int)), this, SLOT(slotChanged()));
|
|
connect( ui->cmbEOL, SIGNAL(activated(int)), this, SLOT(slotChanged()));
|
|
connect( ui->chkDetectEOL, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
|
|
connect( ui->chkEnableBOM, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
|
|
connect( ui->lineLengthLimit, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect( ui->cbRemoveTrailingSpaces, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChanged()));
|
|
connect( ui->chkNewLineAtEof, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
|
|
connect( uiadv->chkBackupLocalFiles, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
|
|
connect( uiadv->chkBackupRemoteFiles, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
|
|
connect( uiadv->sbConfigFileSearchDepth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
|
|
connect( uiadv->edtBackupPrefix, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( uiadv->edtBackupSuffix, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( uiadv->chkNoSync, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
|
|
|
|
internalLayout->addWidget(newWidget);
|
|
tmpWidget->setLayout(internalLayout);
|
|
internalLayout2->addWidget(newWidget2);
|
|
tmpWidget2->setLayout(internalLayout2);
|
|
|
|
// add all tabs
|
|
tabWidget->insertTab(0, tmpWidget, i18n("General"));
|
|
tabWidget->insertTab(1, tmpWidget2, i18n("Advanced"));
|
|
tabWidget->insertTab(2, modeConfigPage, i18n("Modes && Filetypes"));
|
|
|
|
connect(modeConfigPage, SIGNAL(changed()), this, SLOT(slotChanged()));
|
|
|
|
layout->addWidget(tabWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KateSaveConfigTab::~KateSaveConfigTab()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void KateSaveConfigTab::apply()
|
|
{
|
|
modeConfigPage->apply();
|
|
|
|
// nothing changed, no need to apply stuff
|
|
if (!hasChanged())
|
|
return;
|
|
m_changed = false;
|
|
|
|
KateGlobalConfig::global()->configStart ();
|
|
KateDocumentConfig::global()->configStart ();
|
|
|
|
if ( uiadv->edtBackupSuffix->text().isEmpty() && uiadv->edtBackupPrefix->text().isEmpty() ) {
|
|
KMessageBox::information(
|
|
this,
|
|
i18n("You did not provide a backup suffix or prefix. Using default suffix: '~'"),
|
|
i18n("No Backup Suffix or Prefix")
|
|
);
|
|
uiadv->edtBackupSuffix->setText( "~" );
|
|
}
|
|
|
|
uint f( 0 );
|
|
if ( uiadv->chkBackupLocalFiles->isChecked() )
|
|
f |= KateDocumentConfig::LocalFiles;
|
|
if ( uiadv->chkBackupRemoteFiles->isChecked() )
|
|
f |= KateDocumentConfig::RemoteFiles;
|
|
|
|
KateDocumentConfig::global()->setBackupFlags(f);
|
|
KateDocumentConfig::global()->setBackupPrefix(uiadv->edtBackupPrefix->text());
|
|
KateDocumentConfig::global()->setBackupSuffix(uiadv->edtBackupSuffix->text());
|
|
|
|
KateDocumentConfig::global()->setSwapFileNoSync(uiadv->chkNoSync->isChecked());
|
|
|
|
KateDocumentConfig::global()->setSearchDirConfigDepth(uiadv->sbConfigFileSearchDepth->value());
|
|
|
|
KateDocumentConfig::global()->setRemoveSpaces(ui->cbRemoveTrailingSpaces->currentIndex());
|
|
|
|
KateDocumentConfig::global()->setNewLineAtEof(ui->chkNewLineAtEof->isChecked());
|
|
|
|
// set both standard and fallback encoding
|
|
KateDocumentConfig::global()->setEncoding(KGlobal::charsets()->encodingForName(ui->cmbEncoding->currentText()));
|
|
|
|
KateGlobalConfig::global()->setFallbackEncoding(KGlobal::charsets()->encodingForName(ui->cmbEncodingFallback->currentText()));
|
|
|
|
KateDocumentConfig::global()->setEol(ui->cmbEOL->currentIndex());
|
|
KateDocumentConfig::global()->setAllowEolDetection(ui->chkDetectEOL->isChecked());
|
|
KateDocumentConfig::global()->setBom(ui->chkEnableBOM->isChecked());
|
|
|
|
KateDocumentConfig::global()->setLineLengthLimit(ui->lineLengthLimit->value());
|
|
|
|
KateDocumentConfig::global()->configEnd ();
|
|
KateGlobalConfig::global()->configEnd ();
|
|
}
|
|
|
|
void KateSaveConfigTab::reload()
|
|
{
|
|
modeConfigPage->reload();
|
|
|
|
// encodings
|
|
ui->cmbEncoding->clear ();
|
|
ui->cmbEncodingFallback->clear ();
|
|
QStringList encodings (KGlobal::charsets()->descriptiveEncodingNames());
|
|
for (int i=0; i < encodings.count(); i++)
|
|
{
|
|
bool found = false;
|
|
QTextCodec *codecForEnc = KGlobal::charsets()->codecForName(KGlobal::charsets()->encodingForName(encodings[i]), found);
|
|
|
|
if (found)
|
|
{
|
|
ui->cmbEncoding->addItem (encodings[i]);
|
|
ui->cmbEncodingFallback->addItem (encodings[i]);
|
|
|
|
if ( codecForEnc->name() == KateDocumentConfig::global()->encoding() )
|
|
{
|
|
ui->cmbEncoding->setCurrentIndex(i);
|
|
}
|
|
|
|
if ( codecForEnc == KateGlobalConfig::global()->fallbackCodec() )
|
|
{
|
|
// adjust index for fallback config, has no default!
|
|
ui->cmbEncodingFallback->setCurrentIndex(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
// eol
|
|
ui->cmbEOL->setCurrentIndex(KateDocumentConfig::global()->eol());
|
|
ui->chkDetectEOL->setChecked(KateDocumentConfig::global()->allowEolDetection());
|
|
ui->chkEnableBOM->setChecked(KateDocumentConfig::global()->bom());
|
|
ui->lineLengthLimit->setValue(KateDocumentConfig::global()->lineLengthLimit());
|
|
|
|
ui->cbRemoveTrailingSpaces->setCurrentIndex(KateDocumentConfig::global()->removeSpaces());
|
|
ui->chkNewLineAtEof->setChecked(KateDocumentConfig::global()->newLineAtEof());
|
|
uiadv->sbConfigFileSearchDepth->setValue(KateDocumentConfig::global()->searchDirConfigDepth());
|
|
|
|
// other stuff
|
|
uint f ( KateDocumentConfig::global()->backupFlags() );
|
|
uiadv->chkBackupLocalFiles->setChecked( f & KateDocumentConfig::LocalFiles );
|
|
uiadv->chkBackupRemoteFiles->setChecked( f & KateDocumentConfig::RemoteFiles );
|
|
uiadv->edtBackupPrefix->setText( KateDocumentConfig::global()->backupPrefix() );
|
|
uiadv->edtBackupSuffix->setText( KateDocumentConfig::global()->backupSuffix() );
|
|
uiadv->chkNoSync->setChecked( KateDocumentConfig::global()->swapFileNoSync() );
|
|
}
|
|
|
|
void KateSaveConfigTab::reset()
|
|
{
|
|
modeConfigPage->reset();
|
|
}
|
|
|
|
void KateSaveConfigTab::defaults()
|
|
{
|
|
modeConfigPage->defaults();
|
|
|
|
ui->cbRemoveTrailingSpaces->setCurrentIndex(0);
|
|
|
|
uiadv->chkBackupLocalFiles->setChecked( true );
|
|
uiadv->chkBackupRemoteFiles->setChecked( false );
|
|
uiadv->edtBackupPrefix->setText( "" );
|
|
uiadv->edtBackupSuffix->setText( "~" );
|
|
uiadv->chkNoSync->setChecked( false );
|
|
}
|
|
|
|
//END KateSaveConfigTab
|
|
|
|
//BEGIN KatePartPluginConfigPage
|
|
KatePartPluginConfigPage::KatePartPluginConfigPage (QWidget *parent)
|
|
: KateConfigPage (parent, "")
|
|
{
|
|
QVBoxLayout *layout = new QVBoxLayout;
|
|
layout->setMargin(0);
|
|
|
|
plugins.clear();
|
|
|
|
foreach (const KatePartPluginInfo &info, KatePartPluginManager::self()->pluginList())
|
|
{
|
|
KPluginInfo it(info.service());
|
|
it.setPluginEnabled(info.load);
|
|
plugins.append(it);
|
|
}
|
|
|
|
selector = new KPluginSelector(0);
|
|
|
|
connect(selector, SIGNAL(changed(bool)), this, SLOT(slotChanged()));
|
|
connect(selector, SIGNAL(configCommitted(QByteArray)), this, SLOT(slotChanged()));
|
|
|
|
selector->addPlugins(plugins, KPluginSelector::IgnoreConfigFile, i18n("Editor Plugins"), "Editor");
|
|
|
|
layout->addWidget(selector);
|
|
setLayout(layout);
|
|
}
|
|
|
|
KatePartPluginConfigPage::~KatePartPluginConfigPage ()
|
|
{
|
|
}
|
|
|
|
void KatePartPluginConfigPage::apply ()
|
|
{
|
|
selector->updatePluginsState();
|
|
|
|
KatePartPluginList &katePluginList = KatePartPluginManager::self()->pluginList();
|
|
for (int i=0; i < plugins.count(); i++) {
|
|
if (plugins[i].isPluginEnabled()) {
|
|
if (!katePluginList[i].load) {
|
|
KatePartPluginManager::self()->loadPlugin(katePluginList[i]);
|
|
KatePartPluginManager::self()->enablePlugin(katePluginList[i]);
|
|
}
|
|
} else {
|
|
if (katePluginList[i].load) {
|
|
KatePartPluginManager::self()->disablePlugin(katePluginList[i]);
|
|
KatePartPluginManager::self()->unloadPlugin(katePluginList[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void KatePartPluginConfigPage::reload ()
|
|
{
|
|
selector->load();
|
|
}
|
|
|
|
void KatePartPluginConfigPage::reset ()
|
|
{
|
|
selector->load();
|
|
}
|
|
|
|
void KatePartPluginConfigPage::defaults ()
|
|
{
|
|
selector->defaults();
|
|
}
|
|
//END KatePartPluginConfigPage
|
|
|
|
//BEGIN KateGotoBar
|
|
KateGotoBar::KateGotoBar(KTextEditor::View *view, QWidget *parent)
|
|
: KateViewBarWidget( true, parent )
|
|
, m_view( view )
|
|
{
|
|
Q_ASSERT( m_view != 0 ); // this bar widget is pointless w/o a view
|
|
|
|
QHBoxLayout *topLayout = new QHBoxLayout( centralWidget() );
|
|
topLayout->setMargin(0);
|
|
gotoRange = new KIntSpinBox(centralWidget());
|
|
|
|
QLabel *label = new QLabel(i18n("&Go to line:"), centralWidget() );
|
|
label->setBuddy(gotoRange);
|
|
|
|
QToolButton *btnOK = new QToolButton(centralWidget());
|
|
btnOK->setAutoRaise(true);
|
|
btnOK->setIcon(QIcon(SmallIcon("go-jump")));
|
|
btnOK->setText(i18n("Go"));
|
|
btnOK->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
|
connect(btnOK, SIGNAL(clicked()), this, SLOT(gotoLine()));
|
|
|
|
topLayout->addWidget(label);
|
|
topLayout->addWidget(gotoRange, 1);
|
|
topLayout->setStretchFactor( gotoRange, 0 );
|
|
topLayout->addWidget(btnOK);
|
|
topLayout->addStretch();
|
|
|
|
setFocusProxy(gotoRange);
|
|
}
|
|
|
|
void KateGotoBar::updateData()
|
|
{
|
|
gotoRange->setMaximum(m_view->document()->lines());
|
|
if (!isVisible())
|
|
{
|
|
gotoRange->setValue(m_view->cursorPosition().line() + 1);
|
|
gotoRange->adjustSize(); // ### does not respect the range :-(
|
|
}
|
|
gotoRange->setFocus(Qt::OtherFocusReason);
|
|
gotoRange->selectAll();
|
|
}
|
|
|
|
void KateGotoBar::keyPressEvent(QKeyEvent* event)
|
|
{
|
|
int key = event->key();
|
|
if (key == Qt::Key_Return || key == Qt::Key_Enter) {
|
|
gotoLine();
|
|
return;
|
|
}
|
|
KateViewBarWidget::keyPressEvent(event);
|
|
}
|
|
|
|
void KateGotoBar::gotoLine()
|
|
{
|
|
KateView *kv = qobject_cast<KateView*>(m_view);
|
|
if (kv && kv->selection() && !kv->config()->persistentSelection()) {
|
|
kv->clearSelection();
|
|
}
|
|
|
|
m_view->setCursorPosition( KTextEditor::Cursor(gotoRange->value() - 1, 0) );
|
|
m_view->setFocus();
|
|
emit hideMe();
|
|
}
|
|
//END KateGotoBar
|
|
|
|
//BEGIN KateDictionaryBar
|
|
KateDictionaryBar::KateDictionaryBar(KateView* view, QWidget *parent)
|
|
: KateViewBarWidget( true, parent )
|
|
, m_view( view )
|
|
{
|
|
Q_ASSERT(m_view != 0); // this bar widget is pointless w/o a view
|
|
|
|
QHBoxLayout *topLayout = new QHBoxLayout(centralWidget());
|
|
topLayout->setMargin(0);
|
|
//topLayout->setSpacing(spacingHint());
|
|
m_dictionaryComboBox = new KSpellDictionaryComboBox(centralWidget());
|
|
connect(m_dictionaryComboBox, SIGNAL(dictionaryChanged(QString)),
|
|
this, SLOT(dictionaryChanged(QString)));
|
|
connect(view->doc(), SIGNAL(defaultDictionaryChanged(KateDocument*)),
|
|
this, SLOT(updateData()));
|
|
QLabel *label = new QLabel(i18n("Dictionary:"), centralWidget());
|
|
label->setBuddy(m_dictionaryComboBox);
|
|
|
|
topLayout->addWidget(label);
|
|
topLayout->addWidget(m_dictionaryComboBox, 1);
|
|
topLayout->setStretchFactor(m_dictionaryComboBox, 0);
|
|
topLayout->addStretch();
|
|
}
|
|
|
|
KateDictionaryBar::~KateDictionaryBar()
|
|
{
|
|
}
|
|
|
|
void KateDictionaryBar::updateData()
|
|
{
|
|
KateDocument *document = m_view->doc();
|
|
QString dictionary = document->defaultDictionary();
|
|
if(dictionary.isEmpty()) {
|
|
dictionary = KSpeller::defaultLanguage();
|
|
}
|
|
m_dictionaryComboBox->setCurrentByDictionary(dictionary);
|
|
}
|
|
|
|
void KateDictionaryBar::dictionaryChanged(const QString& dictionary)
|
|
{
|
|
KTextEditor::Range selection = m_view->selectionRange();
|
|
if(selection.isValid() && !selection.isEmpty()) {
|
|
m_view->doc()->setDictionary(dictionary, selection);
|
|
}
|
|
else {
|
|
m_view->doc()->setDefaultDictionary(dictionary);
|
|
}
|
|
}
|
|
|
|
//END KateGotoBar
|
|
|
|
|
|
//BEGIN KateModOnHdPrompt
|
|
KateModOnHdPrompt::KateModOnHdPrompt( KateDocument *doc,
|
|
KTextEditor::ModificationInterface::ModifiedOnDiskReason modtype,
|
|
const QString &reason,
|
|
QWidget *parent )
|
|
: KDialog( parent ),
|
|
m_doc( doc ),
|
|
m_modtype ( modtype ),
|
|
m_proc( 0 ),
|
|
m_diffFile( 0 )
|
|
{
|
|
setButtons( Ok | Apply | Cancel | User1 );
|
|
|
|
QString title, okText, okIcon, okToolTip;
|
|
if ( modtype == KTextEditor::ModificationInterface::OnDiskDeleted )
|
|
{
|
|
title = i18n("File Was Deleted on Disk");
|
|
okText = i18n("&Save File As...");
|
|
okIcon = "document-save-as";
|
|
okToolTip = i18n("Lets you select a location and save the file again.");
|
|
} else {
|
|
title = i18n("File Changed on Disk");
|
|
okText = i18n("&Reload File");
|
|
okIcon = "view-refresh";
|
|
okToolTip = i18n("Reload the file from disk. If you have unsaved changes, "
|
|
"they will be lost.");
|
|
}
|
|
|
|
setButtonText( Ok, okText );
|
|
setButtonIcon( Ok, KIcon( okIcon ) );
|
|
setButtonText( Apply, i18n("&Ignore Changes") );
|
|
setButtonIcon( Apply, KIcon( "dialog-warning" ) );
|
|
|
|
setButtonToolTip( Ok, okToolTip );
|
|
setButtonToolTip( Apply, i18n("Ignore the changes. You will not be prompted again.") );
|
|
setButtonToolTip( Cancel, i18n("Do nothing. Next time you focus the file, "
|
|
"or try to save it or close it, you will be prompted again.") );
|
|
|
|
setCaption( title );
|
|
|
|
QWidget *w = new QWidget(this);
|
|
ui = new Ui::ModOnHdWidget();
|
|
ui->setupUi( w );
|
|
setMainWidget( w );
|
|
|
|
ui->lblIcon->setPixmap( DesktopIcon("dialog-warning" ) );
|
|
ui->lblText->setText( reason + "\n\n" + i18n("What do you want to do?") );
|
|
|
|
// If the file isn't deleted, present a diff button, and a overwrite action.
|
|
if ( modtype != KTextEditor::ModificationInterface::OnDiskDeleted )
|
|
{
|
|
setButtonGuiItem( User1, KStandardGuiItem::overwrite() );
|
|
setButtonToolTip( User1, i18n("Overwrite the disk file with the editor content.") );
|
|
connect( ui->btnDiff, SIGNAL(clicked()), this, SLOT(slotDiff()) );
|
|
}
|
|
else
|
|
{
|
|
ui->chkIgnoreWhiteSpaces->setVisible( false );
|
|
ui->btnDiff->setVisible( false );
|
|
showButton( User1, false );
|
|
}
|
|
}
|
|
|
|
KateModOnHdPrompt::~KateModOnHdPrompt()
|
|
{
|
|
delete m_proc;
|
|
m_proc = 0;
|
|
if (m_diffFile) {
|
|
m_diffFile->setAutoRemove(true);
|
|
delete m_diffFile;
|
|
m_diffFile = 0;
|
|
}
|
|
delete ui;
|
|
}
|
|
|
|
void KateModOnHdPrompt::slotDiff()
|
|
{
|
|
if (m_diffFile)
|
|
return;
|
|
|
|
m_diffFile = new KTemporaryFile();
|
|
m_diffFile->open();
|
|
|
|
// Start a QProcess that creates a diff
|
|
m_proc = new QProcess( this );
|
|
m_proc->setProcessChannelMode( QProcess::MergedChannels );
|
|
connect( m_proc, SIGNAL(readyRead()), this, SLOT(slotDataAvailable()) );
|
|
connect( m_proc, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotPDone()) );
|
|
|
|
setCursor( Qt::WaitCursor );
|
|
// disable the button and checkbox, to hinder the user to run it twice.
|
|
ui->chkIgnoreWhiteSpaces->setEnabled( false );
|
|
ui->btnDiff->setEnabled( false );
|
|
|
|
QStringList procargs;
|
|
procargs << QString(ui->chkIgnoreWhiteSpaces->isChecked() ? "-ub" : "-u")
|
|
<< "-" << m_doc->url().toLocalFile();
|
|
qDebug() << "diff" << procargs;
|
|
m_proc->start("diff", procargs);
|
|
|
|
QTextStream ts(m_proc);
|
|
int lastln = m_doc->lines() - 1;
|
|
for ( int l = 0; l < lastln; ++l ) {
|
|
ts << m_doc->line( l ) << '\n';
|
|
}
|
|
ts << m_doc->line(lastln);
|
|
ts.flush();
|
|
m_proc->closeWriteChannel();
|
|
}
|
|
|
|
void KateModOnHdPrompt::slotDataAvailable()
|
|
{
|
|
m_diffFile->write(m_proc->readAll());
|
|
}
|
|
|
|
void KateModOnHdPrompt::slotPDone()
|
|
{
|
|
setCursor( Qt::ArrowCursor );
|
|
ui->chkIgnoreWhiteSpaces->setEnabled( true );
|
|
ui->btnDiff->setEnabled( true );
|
|
|
|
const QProcess::ExitStatus es = m_proc->exitStatus();
|
|
delete m_proc;
|
|
m_proc = 0;
|
|
|
|
if ( es != QProcess::NormalExit )
|
|
{
|
|
KMessageBox::sorry( this,
|
|
i18n("The diff command failed. Please make sure that "
|
|
"diff(1) is installed and in your PATH."),
|
|
i18n("Error Creating Diff") );
|
|
delete m_diffFile;
|
|
m_diffFile = 0;
|
|
return;
|
|
}
|
|
|
|
if ( m_diffFile->size() == 0 )
|
|
{
|
|
if (ui->chkIgnoreWhiteSpaces->isChecked()) {
|
|
KMessageBox::information( this,
|
|
i18n("The files are identical."),
|
|
i18n("Diff Output") );
|
|
} else {
|
|
KMessageBox::information( this,
|
|
i18n("Ignoring amount of white space changed, the files are identical."),
|
|
i18n("Diff Output") );
|
|
}
|
|
delete m_diffFile;
|
|
m_diffFile = 0;
|
|
return;
|
|
}
|
|
|
|
m_diffFile->setAutoRemove(false);
|
|
KUrl url = KUrl::fromPath(m_diffFile->fileName());
|
|
delete m_diffFile;
|
|
m_diffFile = 0;
|
|
|
|
// KRun::runUrl should delete the file, once the client exits
|
|
KRun::runUrl( url, "text/x-patch", this, true );
|
|
}
|
|
|
|
void KateModOnHdPrompt::slotButtonClicked(int button)
|
|
{
|
|
switch(button)
|
|
{
|
|
case Default:
|
|
case Ok:
|
|
done( (m_modtype == KTextEditor::ModificationInterface::OnDiskDeleted) ?
|
|
Save : Reload );
|
|
break;
|
|
case Apply:
|
|
{
|
|
if ( KMessageBox::warningContinueCancel(
|
|
this,
|
|
i18n("Ignoring means that you will not be warned again (unless "
|
|
"the disk file changes once more): if you save the document, you "
|
|
"will overwrite the file on disk; if you do not save then the disk "
|
|
"file (if present) is what you have."),
|
|
i18n("You Are on Your Own"),
|
|
KStandardGuiItem::cont(),
|
|
KStandardGuiItem::cancel(),
|
|
"kate_ignore_modonhd" ) != KMessageBox::Continue )
|
|
return;
|
|
done( Ignore );
|
|
break;
|
|
}
|
|
case User1:
|
|
done( Overwrite );
|
|
break;
|
|
default:
|
|
KDialog::slotButtonClicked(button);
|
|
}
|
|
}
|
|
|
|
//END KateModOnHdPrompt
|
|
|
|
// kate: space-indent on; indent-width 2; replace-tabs on;
|