mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-27 04:13:05 +00:00
343 lines
11 KiB
C++
343 lines
11 KiB
C++
/* This file is part of KDevelop
|
|
|
|
Copyright 2010 Benjamin Port <port.benjamin@gmail.com>
|
|
Copyright 2014 Kevin Funk <kfunk@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.
|
|
*/
|
|
|
|
#include "qthelpconfig.h"
|
|
|
|
#include <KMessageBox>
|
|
#include <KLocalizedString>
|
|
#include <KPluginFactory>
|
|
#include <KPluginLoader>
|
|
#include <KAboutData>
|
|
#include <KDebug>
|
|
#include <KSettings/Dispatcher>
|
|
#include <qhelpenginecore.h>
|
|
#include <QFileDialog>
|
|
|
|
#include "ui_qthelpconfig.h"
|
|
#include "ui_qthelpconfigeditdialog.h"
|
|
#include "qthelp_config_shared.h"
|
|
|
|
K_PLUGIN_FACTORY(QtHelpConfigFactory, registerPlugin<QtHelpConfig>();)
|
|
K_EXPORT_PLUGIN(QtHelpConfigFactory("kdevqthelp_config"))
|
|
|
|
enum Column
|
|
{
|
|
NameColumn,
|
|
PathColumn,
|
|
IconColumn,
|
|
GhnsColumn
|
|
};
|
|
|
|
class QtHelpConfigEditDialog : public QDialog, public Ui_QtHelpConfigEditDialog
|
|
{
|
|
public:
|
|
explicit QtHelpConfigEditDialog(QTreeWidgetItem* modifiedItem, QtHelpConfig* parent = 0,
|
|
Qt::WindowFlags f = 0)
|
|
: QDialog(parent, f)
|
|
, m_modifiedItem(modifiedItem)
|
|
, m_config(parent)
|
|
{
|
|
setupUi(this);
|
|
|
|
if (modifiedItem) {
|
|
setWindowTitle(i18n("Modify Entry"));
|
|
} else {
|
|
setWindowTitle(i18n("Add New Entry"));
|
|
}
|
|
qchIcon->setIcon("qtlogo");
|
|
}
|
|
|
|
bool checkQtHelpFile();
|
|
|
|
virtual void accept() override;
|
|
|
|
private:
|
|
QTreeWidgetItem* m_modifiedItem;
|
|
QtHelpConfig* m_config;
|
|
};
|
|
|
|
bool QtHelpConfigEditDialog::checkQtHelpFile()
|
|
{
|
|
//verify if the file is valid and if there is a name
|
|
if(qchName->text().isEmpty()){
|
|
KMessageBox::error(this, i18n("Name cannot be empty."));
|
|
return false;
|
|
}
|
|
|
|
return m_config->checkNamespace(qchRequester->text(), m_modifiedItem);
|
|
}
|
|
|
|
void QtHelpConfigEditDialog::accept()
|
|
{
|
|
if (!checkQtHelpFile())
|
|
return;
|
|
|
|
QDialog::accept();
|
|
}
|
|
|
|
QtHelpConfig::QtHelpConfig(QWidget *parent, const QVariantList &args)
|
|
: KCModule(QtHelpConfigFactory::componentData(), parent, args)
|
|
{
|
|
QVBoxLayout * l = new QVBoxLayout( this );
|
|
|
|
QWidget* w = new QWidget;
|
|
m_configWidget = new Ui::QtHelpConfigUI;
|
|
m_configWidget->setupUi( w );
|
|
m_configWidget->addButton->setIcon(KIcon("list-add"));
|
|
connect(m_configWidget->addButton, SIGNAL(clicked(bool)), this, SLOT(add()));
|
|
m_configWidget->editButton->setIcon(KIcon("document-edit"));
|
|
connect(m_configWidget->editButton, SIGNAL(clicked(bool)), this, SLOT(modify()));
|
|
m_configWidget->removeButton->setIcon(KIcon("list-remove"));
|
|
connect(m_configWidget->removeButton, SIGNAL(clicked(bool)), this, SLOT(remove()));
|
|
m_configWidget->upButton->setIcon(KIcon("arrow-up"));
|
|
connect(m_configWidget->upButton, SIGNAL(clicked(bool)), this, SLOT(up()));
|
|
m_configWidget->downButton->setIcon(KIcon("arrow-down"));
|
|
connect(m_configWidget->downButton, SIGNAL(clicked(bool)), this, SLOT(down()));
|
|
// Table
|
|
connect(m_configWidget->qchTable, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged()));
|
|
m_configWidget->qchTable->setColumnHidden(IconColumn, true);
|
|
m_configWidget->qchTable->setColumnHidden(GhnsColumn, true);
|
|
m_configWidget->qchTable->header()->setStretchLastSection(true);
|
|
|
|
connect(m_configWidget->loadQtDocsCheckBox, SIGNAL(toggled(bool)), this, SLOT(changed()));
|
|
connect(m_configWidget->qchSearchDirButton, SIGNAL(clicked(bool)), this, SLOT(chooseSearchDir()));
|
|
connect(m_configWidget->qchSearchDir,SIGNAL(textChanged(QString)), this, SLOT(searchDirChanged()));
|
|
l->addWidget( w );
|
|
load();
|
|
selectionChanged();
|
|
}
|
|
|
|
QtHelpConfig::~QtHelpConfig()
|
|
{
|
|
delete m_configWidget;
|
|
}
|
|
|
|
void QtHelpConfig::save()
|
|
{
|
|
QStringList iconList, nameList, pathList, ghnsList;
|
|
for (int i = 0; i < m_configWidget->qchTable->topLevelItemCount(); i++) {
|
|
const QTreeWidgetItem* item = m_configWidget->qchTable->topLevelItem(i);
|
|
nameList << item->text(0);
|
|
pathList << item->text(1);
|
|
iconList << item->text(2);
|
|
ghnsList << item->text(3);
|
|
}
|
|
QString searchDir = m_configWidget->qchSearchDir->text();
|
|
bool loadQtDoc = m_configWidget->loadQtDocsCheckBox->isChecked();
|
|
|
|
qtHelpWriteConfig(iconList, nameList, pathList, ghnsList, searchDir, loadQtDoc);
|
|
|
|
KSettings::Dispatcher::reparseConfiguration( componentData().componentName() );
|
|
|
|
emit changed(false);
|
|
}
|
|
|
|
void QtHelpConfig::load()
|
|
{
|
|
m_configWidget->qchTable->clear();;
|
|
|
|
QStringList iconList, nameList, pathList, ghnsList;
|
|
QString searchDir;
|
|
bool loadQtDoc;
|
|
qtHelpReadConfig(iconList, nameList, pathList, ghnsList, searchDir, loadQtDoc);
|
|
|
|
const int size = qMin(qMin(iconList.size(), nameList.size()), pathList.size());
|
|
for(int i = 0; i < size; ++i) {
|
|
QTreeWidgetItem* item = new QTreeWidgetItem(m_configWidget->qchTable);
|
|
item->setIcon(NameColumn, KIcon(iconList.at(i)));
|
|
item->setText(NameColumn, nameList.at(i));
|
|
item->setText(PathColumn, pathList.at(i));
|
|
item->setText(IconColumn, iconList.at(i));
|
|
item->setText(GhnsColumn, ghnsList.size()>i ? ghnsList.at(i) : "0");
|
|
}
|
|
m_configWidget->qchSearchDir->setText(searchDir);
|
|
m_configWidget->loadQtDocsCheckBox->setChecked(loadQtDoc);
|
|
|
|
emit changed(false);
|
|
}
|
|
|
|
void QtHelpConfig::defaults()
|
|
{
|
|
bool change=false;
|
|
if(m_configWidget->qchTable->topLevelItemCount() > 0) {
|
|
m_configWidget->qchTable->clear();
|
|
change = true;
|
|
}
|
|
if(!m_configWidget->loadQtDocsCheckBox->isChecked()){
|
|
m_configWidget->loadQtDocsCheckBox->setChecked(true);
|
|
change = true;
|
|
}
|
|
emit changed(change);
|
|
}
|
|
|
|
void QtHelpConfig::selectionChanged()
|
|
{
|
|
if (m_configWidget->qchTable->selectedItems().isEmpty()) {
|
|
m_configWidget->removeButton->setEnabled(false);
|
|
m_configWidget->editButton->setEnabled(false);
|
|
m_configWidget->upButton->setEnabled(false);
|
|
m_configWidget->downButton->setEnabled(false);
|
|
} else {
|
|
QTreeWidgetItem* selectedItem = m_configWidget->qchTable->selectedItems().at(0);
|
|
const int selectedRow = m_configWidget->qchTable->indexOfTopLevelItem(selectedItem);
|
|
int rowCount = m_configWidget->qchTable->topLevelItemCount();
|
|
if (selectedItem->text(GhnsColumn) != "0") {
|
|
// TODO: Can't we just remove the file even if it has been installed via GHNS?
|
|
m_configWidget->removeButton->setEnabled(false);
|
|
m_configWidget->removeButton->setToolTip(tr("Please uninstall this via GHNS"));
|
|
} else {
|
|
m_configWidget->removeButton->setEnabled(true);
|
|
m_configWidget->removeButton->setToolTip(QString());
|
|
}
|
|
m_configWidget->editButton->setEnabled(true);
|
|
if (selectedRow == 0) {
|
|
m_configWidget->upButton->setEnabled(false);
|
|
} else {
|
|
m_configWidget->upButton->setEnabled(true);
|
|
}
|
|
if (rowCount > selectedRow + 1) {
|
|
m_configWidget->downButton->setEnabled(true);
|
|
} else {
|
|
m_configWidget->downButton->setEnabled(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void QtHelpConfig::add()
|
|
{
|
|
QtHelpConfigEditDialog dialog(0, this);
|
|
if (!dialog.exec())
|
|
return;
|
|
|
|
QTreeWidgetItem* item = new QTreeWidgetItem(m_configWidget->qchTable);
|
|
item->setIcon(NameColumn, KIcon(dialog.qchIcon->icon()));
|
|
item->setText(NameColumn, dialog.qchName->text());
|
|
item->setText(PathColumn, dialog.qchRequester->text());
|
|
item->setText(IconColumn, dialog.qchIcon->icon());
|
|
item->setText(GhnsColumn, "0");
|
|
m_configWidget->qchTable->setCurrentItem(item);
|
|
emit changed(true);
|
|
}
|
|
|
|
void QtHelpConfig::modify()
|
|
{
|
|
QTreeWidgetItem* item = m_configWidget->qchTable->currentItem();
|
|
if (!item)
|
|
return;
|
|
|
|
QtHelpConfigEditDialog dialog(item, this);
|
|
if (item->text(GhnsColumn) != "0") {
|
|
dialog.qchRequester->setText(i18n("Documentation provided by GHNS"));
|
|
dialog.qchRequester->setEnabled(false);
|
|
} else {
|
|
dialog.qchRequester->setText(item->text(PathColumn));
|
|
dialog.qchRequester->setEnabled(true);
|
|
}
|
|
dialog.qchName->setText(item->text(NameColumn));
|
|
dialog.qchIcon->setIcon(item->text(IconColumn));
|
|
if (!dialog.exec()) {
|
|
return;
|
|
}
|
|
|
|
item->setIcon(NameColumn, KIcon(dialog.qchIcon->icon()));
|
|
item->setText(NameColumn, dialog.qchName->text());
|
|
item->setText(IconColumn, dialog.qchIcon->icon());
|
|
if(item->text(GhnsColumn) == "0") {
|
|
item->setText(PathColumn, dialog.qchRequester->text());
|
|
}
|
|
emit changed(true);
|
|
}
|
|
|
|
bool QtHelpConfig::checkNamespace(const QString& filename, QTreeWidgetItem* modifiedItem)
|
|
{
|
|
QString qtHelpNamespace = QHelpEngineCore::namespaceName(filename);
|
|
if (qtHelpNamespace.isEmpty()) {
|
|
// Open error message (not valid Qt Compressed Help file)
|
|
KMessageBox::error(this, i18n("Qt Compressed Help file is not valid."));
|
|
return false;
|
|
}
|
|
// verify if it's the namespace it's not already in the list
|
|
for(int i=0; i < m_configWidget->qchTable->topLevelItemCount(); i++) {
|
|
const QTreeWidgetItem* item = m_configWidget->qchTable->topLevelItem(i);
|
|
if (item != modifiedItem){
|
|
if (qtHelpNamespace == QHelpEngineCore::namespaceName(item->text(PathColumn))) {
|
|
// Open error message, documentation already imported
|
|
KMessageBox::error(this, i18n("Documentation already imported"));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void QtHelpConfig::remove()
|
|
{
|
|
QTreeWidgetItem* selectedItem = m_configWidget->qchTable->currentItem();
|
|
if (!selectedItem)
|
|
return;
|
|
|
|
delete selectedItem;
|
|
emit changed(true);
|
|
}
|
|
|
|
void QtHelpConfig::up()
|
|
{
|
|
QTreeWidgetItem* item = m_configWidget->qchTable->currentItem();
|
|
if (!item)
|
|
return;
|
|
const int row = m_configWidget->qchTable->indexOfTopLevelItem(item);
|
|
if (row == 0)
|
|
return;
|
|
|
|
m_configWidget->qchTable->takeTopLevelItem(row);
|
|
m_configWidget->qchTable->insertTopLevelItem(row - 1, item);
|
|
m_configWidget->qchTable->setCurrentItem(item);
|
|
emit changed();
|
|
}
|
|
|
|
void QtHelpConfig::down()
|
|
{
|
|
QTreeWidgetItem* item = m_configWidget->qchTable->currentItem();
|
|
if (!item)
|
|
return;
|
|
const int row = m_configWidget->qchTable->indexOfTopLevelItem(item);
|
|
if (row + 1 >= m_configWidget->qchTable->topLevelItemCount())
|
|
return;
|
|
|
|
m_configWidget->qchTable->takeTopLevelItem(row);
|
|
m_configWidget->qchTable->insertTopLevelItem(row + 1, item);
|
|
m_configWidget->qchTable->setCurrentItem(item);
|
|
emit changed();
|
|
}
|
|
|
|
void QtHelpConfig::chooseSearchDir()
|
|
{
|
|
m_configWidget->qchSearchDir->setText(QFileDialog::getExistingDirectory(this));
|
|
}
|
|
|
|
|
|
void QtHelpConfig::searchDirChanged()
|
|
{
|
|
emit changed(true);
|
|
}
|
|
|
|
|
|
#include "moc_qthelpconfig.cpp"
|