mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-24 10:52:51 +00:00
313 lines
9.3 KiB
C++
313 lines
9.3 KiB
C++
/* This file is part of the KDE libraries and the Kate part.
|
|
*
|
|
* Copyright (C) 2001-2010 Christoph Cullmann <cullmann@kde.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* 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 "katemodeconfigpage.h"
|
|
#include "moc_katemodeconfigpage.cpp"
|
|
|
|
#include "katedocument.h"
|
|
#include "kateconfig.h"
|
|
#include "kateview.h"
|
|
#include "kateglobal.h"
|
|
#include "kateautoindent.h"
|
|
#include "katesyntaxmanager.h"
|
|
#include "katesyntaxdocument.h"
|
|
|
|
#include "ui_filetypeconfigwidget.h"
|
|
|
|
#include <kconfig.h>
|
|
#include <kmimetype.h>
|
|
#include <kmimetypechooser.h>
|
|
#include <kdebug.h>
|
|
#include <kicon.h>
|
|
#include <knuminput.h>
|
|
#include <klocale.h>
|
|
#include <kmenu.h>
|
|
|
|
#include <QtCore/QRegExp>
|
|
#include <QtGui/QCheckBox>
|
|
#include <QtGui/QComboBox>
|
|
#include <QtGui/QGroupBox>
|
|
|
|
#include <QtGui/QLabel>
|
|
#include <QtGui/QLayout>
|
|
#include <QtGui/QPushButton>
|
|
#include <QtGui/QToolButton>
|
|
#include <kvbox.h>
|
|
|
|
#define KATE_FT_HOWMANY 1024
|
|
//END Includes
|
|
|
|
ModeConfigPage::ModeConfigPage( QWidget *parent )
|
|
: KateConfigPage( parent )
|
|
{
|
|
m_lastType = -1;
|
|
|
|
// 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::FileTypeConfigWidget();
|
|
ui->setupUi( newWidget );
|
|
|
|
ui->cmbHl->addItem(i18n("<Unchanged>"), QVariant(""));
|
|
for( int i = 0; i < KateHlManager::self()->highlights(); i++) {
|
|
if (KateHlManager::self()->hlSection(i).length() > 0)
|
|
ui->cmbHl->addItem(KateHlManager::self()->hlSection(i) + QString ("/")
|
|
+ KateHlManager::self()->hlNameTranslated(i), QVariant(KateHlManager::self()->hlName(i)));
|
|
else
|
|
ui->cmbHl->addItem(KateHlManager::self()->hlNameTranslated(i), QVariant(KateHlManager::self()->hlName(i)));
|
|
}
|
|
|
|
QStringList indentationModes;
|
|
indentationModes << i18n ("Use Default");
|
|
indentationModes << KateAutoIndent::listModes();
|
|
ui->cmbIndenter->addItems (indentationModes);
|
|
|
|
connect( ui->cmbFiletypes, SIGNAL(activated(int)), this, SLOT(typeChanged(int)) );
|
|
connect( ui->btnNew, SIGNAL(clicked()), this, SLOT(newType()) );
|
|
connect( ui->btnDelete, SIGNAL(clicked()), this, SLOT(deleteType()) );
|
|
ui->btnMimeTypes->setIcon(KIcon("tools-wizard"));
|
|
connect(ui->btnMimeTypes, SIGNAL(clicked()), this, SLOT(showMTDlg()));
|
|
|
|
reload();
|
|
|
|
connect( ui->edtName, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( ui->edtSection, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( ui->edtVariables, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( ui->edtFileExtensions, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( ui->edtMimeTypes, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()) );
|
|
connect( ui->sbPriority, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()) );
|
|
connect( ui->cmbHl, SIGNAL(activated(int)), this, SLOT(slotChanged()) );
|
|
connect( ui->cmbIndenter, SIGNAL(activated(int)), this, SLOT(slotChanged()) );
|
|
|
|
layout->addWidget(newWidget);
|
|
setLayout(layout);
|
|
}
|
|
|
|
ModeConfigPage::~ModeConfigPage ()
|
|
{
|
|
qDeleteAll (m_types);
|
|
delete ui;
|
|
}
|
|
|
|
void ModeConfigPage::apply()
|
|
{
|
|
if (!hasChanged())
|
|
return;
|
|
|
|
save ();
|
|
|
|
KateGlobal::self()->modeManager()->save(m_types);
|
|
}
|
|
|
|
void ModeConfigPage::reload()
|
|
{
|
|
qDeleteAll (m_types);
|
|
m_types.clear();
|
|
|
|
// deep copy...
|
|
foreach (KateFileType *type, KateGlobal::self()->modeManager()->list())
|
|
{
|
|
KateFileType *t = new KateFileType ();
|
|
*t = *type;
|
|
m_types.append (t);
|
|
}
|
|
|
|
update ();
|
|
}
|
|
|
|
void ModeConfigPage::reset()
|
|
{
|
|
reload ();
|
|
}
|
|
|
|
void ModeConfigPage::defaults()
|
|
{
|
|
reload ();
|
|
}
|
|
|
|
void ModeConfigPage::update ()
|
|
{
|
|
m_lastType = -1;
|
|
|
|
ui->cmbFiletypes->clear ();
|
|
|
|
foreach (KateFileType *type, m_types) {
|
|
if (!type->sectionTranslated().isEmpty())
|
|
ui->cmbFiletypes->addItem(type->sectionTranslated() + QString ("/") + type->nameTranslated());
|
|
else
|
|
ui->cmbFiletypes->addItem(type->nameTranslated());
|
|
}
|
|
|
|
// get current filetype from active view via the host application
|
|
int currentIndex = 0;
|
|
KTextEditor::MdiContainer *iface = qobject_cast<KTextEditor::MdiContainer*>(KateGlobal::self()->container());
|
|
if (iface) {
|
|
KateView *kv = qobject_cast<KateView*>(iface->activeView());
|
|
if (kv) {
|
|
const QString filetypeName = kv->doc()->fileType();
|
|
for (int i = 0; i < m_types.size(); ++i) {
|
|
if (filetypeName == m_types[i]->name) {
|
|
currentIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ui->cmbFiletypes->setCurrentIndex (currentIndex);
|
|
typeChanged (currentIndex);
|
|
|
|
ui->cmbFiletypes->setEnabled (ui->cmbFiletypes->count() > 0);
|
|
}
|
|
|
|
void ModeConfigPage::deleteType ()
|
|
{
|
|
int type = ui->cmbFiletypes->currentIndex ();
|
|
|
|
if (type > -1 && type < m_types.count())
|
|
{
|
|
delete m_types[type];
|
|
m_types.removeAt(type);
|
|
update ();
|
|
}
|
|
}
|
|
|
|
void ModeConfigPage::newType ()
|
|
{
|
|
QString newN = i18n("New Filetype");
|
|
|
|
for (int i = 0; i < m_types.count(); ++i) {
|
|
KateFileType *type = m_types.at(i);
|
|
if (type->name == newN)
|
|
{
|
|
ui->cmbFiletypes->setCurrentIndex (i);
|
|
typeChanged (i);
|
|
return;
|
|
}
|
|
}
|
|
|
|
KateFileType *newT = new KateFileType ();
|
|
newT->priority = 0;
|
|
newT->name = newN;
|
|
newT->hlGenerated = false;
|
|
|
|
m_types.prepend (newT);
|
|
|
|
update ();
|
|
}
|
|
|
|
void ModeConfigPage::save ()
|
|
{
|
|
if (m_lastType != -1)
|
|
{
|
|
if (!m_types[m_lastType]->hlGenerated) {
|
|
m_types[m_lastType]->name = ui->edtName->text ();
|
|
m_types[m_lastType]->section = ui->edtSection->text ();
|
|
}
|
|
m_types[m_lastType]->varLine = ui->edtVariables->text ();
|
|
m_types[m_lastType]->wildcards = ui->edtFileExtensions->text().split (';', QString::SkipEmptyParts);
|
|
m_types[m_lastType]->mimetypes = ui->edtMimeTypes->text().split (';', QString::SkipEmptyParts);
|
|
m_types[m_lastType]->priority = ui->sbPriority->value();
|
|
m_types[m_lastType]->hl = ui->cmbHl->itemData(ui->cmbHl->currentIndex()).toString();
|
|
|
|
if (ui->cmbIndenter->currentIndex() > 0)
|
|
m_types[m_lastType]->indenter = KateAutoIndent::modeName (ui->cmbIndenter->currentIndex() - 1);
|
|
else
|
|
m_types[m_lastType]->indenter = "";
|
|
}
|
|
}
|
|
|
|
void ModeConfigPage::typeChanged (int type)
|
|
{
|
|
save ();
|
|
|
|
ui->cmbHl->setEnabled (true);
|
|
ui->btnDelete->setEnabled (true);
|
|
ui->edtName->setEnabled (true);
|
|
ui->edtSection->setEnabled (true);
|
|
|
|
if (type > -1 && type < m_types.count())
|
|
{
|
|
KateFileType *t = m_types.at(type);
|
|
|
|
ui->gbProperties->setTitle (i18n("Properties of %1", ui->cmbFiletypes->currentText()));
|
|
|
|
ui->gbProperties->setEnabled (true);
|
|
ui->btnDelete->setEnabled (true);
|
|
|
|
ui->edtName->setText(t->nameTranslated());
|
|
ui->edtSection->setText(t->sectionTranslated());
|
|
ui->edtVariables->setText(t->varLine);
|
|
ui->edtFileExtensions->setText(t->wildcards.join (";"));
|
|
ui->edtMimeTypes->setText(t->mimetypes.join (";"));
|
|
ui->sbPriority->setValue(t->priority);
|
|
|
|
ui->cmbHl->setEnabled (!t->hlGenerated);
|
|
ui->btnDelete->setEnabled (!t->hlGenerated);
|
|
ui->edtName->setEnabled (!t->hlGenerated);
|
|
ui->edtSection->setEnabled (!t->hlGenerated);
|
|
|
|
// activate current hl...
|
|
for (int i = 0; i < ui->cmbHl->count(); ++i)
|
|
if (ui->cmbHl->itemData (i).toString() == t->hl)
|
|
ui->cmbHl->setCurrentIndex (i);
|
|
|
|
// activate the right indenter
|
|
int indenterIndex = 0;
|
|
if (!t->indenter.isEmpty())
|
|
indenterIndex = KateAutoIndent::modeNumber (t->indenter) + 1;
|
|
ui->cmbIndenter->setCurrentIndex (indenterIndex);
|
|
}
|
|
else
|
|
{
|
|
ui->gbProperties->setTitle (i18n("Properties"));
|
|
|
|
ui->gbProperties->setEnabled (false);
|
|
ui->btnDelete->setEnabled (false);
|
|
|
|
ui->edtName->clear();
|
|
ui->edtSection->clear();
|
|
ui->edtVariables->clear();
|
|
ui->edtFileExtensions->clear();
|
|
ui->edtMimeTypes->clear();
|
|
ui->sbPriority->setValue(0);
|
|
ui->cmbHl->setCurrentIndex (0);
|
|
ui->cmbIndenter->setCurrentIndex (0);
|
|
}
|
|
|
|
m_lastType = type;
|
|
}
|
|
|
|
void ModeConfigPage::showMTDlg()
|
|
{
|
|
QString text = i18n("Select the MimeTypes you want for this file type.\nPlease note that this will automatically edit the associated file extensions as well.");
|
|
QStringList list = ui->edtMimeTypes->text().split( QRegExp("\\s*;\\s*"), QString::SkipEmptyParts );
|
|
KMimeTypeChooserDialog d( i18n("Select Mime Types"), text, list, "text", this );
|
|
if ( d.exec() == KDialog::Accepted ) {
|
|
// do some checking, warn user if mime types or patterns are removed.
|
|
// if the lists are empty, and the fields not, warn.
|
|
ui->edtFileExtensions->setText( d.chooser()->patterns().join(";") );
|
|
ui->edtMimeTypes->setText( d.chooser()->mimeTypes().join(";") );
|
|
}
|
|
}
|
|
|
|
// kate: space-indent on; indent-width 2; replace-tabs on;
|