File indexing completed on 2024-04-21 05:03:30

0001 /**********************************************************************************************
0002   Copyright (C) 2005-2006 by Holger Danielsson (holger.danielsson@t-online.de)
0003                 2008-2017 by Michel Ludwig (michel.ludwig@kdemail.net)
0004  **********************************************************************************************/
0005 
0006 /***************************************************************************
0007  *                                                                         *
0008  *   This program is free software; you can redistribute it and/or modify  *
0009  *   it under the terms of the GNU General Public License as published by  *
0010  *   the Free Software Foundation; either version 2 of the License, or     *
0011  *   (at your option) any later version.                                   *
0012  *                                                                         *
0013  ***************************************************************************/
0014 
0015 #include "userhelp.h"
0016 
0017 #include <QFileInfo>
0018 #include <QMenu>
0019 
0020 #include <KMessageBox>
0021 #include <QUrl>
0022 #include <KRun>
0023 
0024 #include "kileactions.h"
0025 #include "kileconfig.h"
0026 #include "kiledebug.h"
0027 #include "kilestdtools.h"
0028 #include "dialogs/userhelpdialog.h"
0029 
0030 namespace KileHelp
0031 {
0032 
0033 UserHelp::UserHelp(KileTool::Manager *manager, KActionMenu *userHelpActionMenu, QWidget* mainWindow)
0034     : m_manager(manager), m_userHelpActionMenu(userHelpActionMenu), m_mainWindow(mainWindow)
0035 {
0036     setupUserHelpMenu();
0037 }
0038 
0039 UserHelp::~UserHelp()
0040 {
0041     clearActionList();
0042 }
0043 
0044 void UserHelp::clearActionList()
0045 {
0046     for(QList<QAction*>::iterator i = m_actionList.begin(); i != m_actionList.end(); ++i) {
0047         delete *i;
0048     }
0049     m_actionList.clear();
0050 }
0051 
0052 void UserHelp::readConfig(QStringList& menuList, QList<QUrl>& fileList)
0053 {
0054     menuList.clear();
0055     fileList.clear();
0056 
0057     // first read all entries
0058     KConfig *config = m_manager->config();
0059     KConfigGroup configGroup = config->group("UserHelp");
0060     int entries = configGroup.readEntry("entries", int(0));
0061     for(int i = 0; i < entries; ++i) {
0062         QString menu = configGroup.readEntry(QString("menu%1").arg(i));
0063         menuList << menu;
0064         if(!menu.isEmpty() && menu != "-") {
0065             fileList << configGroup.readEntry(QString("file%1").arg(i), QUrl());
0066         }
0067         else {
0068             fileList << QUrl();
0069         }
0070     }
0071 }
0072 
0073 void UserHelp::writeConfig(const QStringList& menuList, const QList<QUrl>& fileList)
0074 {
0075     //KILE_DEBUG_MAIN << "\tuserhelp: write config";
0076     int entries = menuList.count();
0077 
0078     // first delete old entries
0079     KConfig *config = m_manager->config();
0080     config->deleteGroup("UserHelp");
0081 
0082     // then write new entries
0083     KConfigGroup configGroup = config->group("UserHelp");
0084     configGroup.writeEntry("entries", entries);
0085     for(int i = 0; i < entries; ++i) {
0086         QString menu = menuList[i];
0087         configGroup.writeEntry(QString("menu%1").arg(i), menu);
0088         if(menu != "-") {
0089             configGroup.writeEntry(QString("file%1").arg(i), fileList[i]);
0090         }
0091     }
0092 }
0093 
0094 void UserHelp::setupUserHelpMenu()
0095 {
0096     QStringList menuList;
0097     QList<QUrl> urlList;
0098     readConfig(menuList, urlList);
0099 
0100     clearActionList();
0101 
0102     m_userHelpActionMenu->setEnabled(menuList.count() > 0);
0103     QList<QUrl>::iterator j = urlList.begin();
0104 
0105     for(QStringList::iterator i = menuList.begin(); i != menuList.end(); ++i) {
0106         QString menu = *i;
0107         // first look, if this entry is a separator
0108         if(menu == "-" ) {
0109             QAction *action = m_userHelpActionMenu->addSeparator();
0110             m_actionList.append(action);
0111         }
0112         else {
0113             QUrl url = *j;
0114 
0115             // some file types have an icon
0116             QFileInfo fi(url.fileName());
0117             QString ext = fi.suffix();
0118             if(ext == "htm") {
0119                 ext = "html";
0120             }
0121             KileAction::VariantSelection *action = new KileAction::VariantSelection(menu, QVariant::fromValue(url), this);
0122             if(!url.isLocalFile() ||  ext == "html" || ext == "dvi" || ext == "ps" || ext == "pdf") {
0123                 QString icon = (!url.isLocalFile()) ? "viewhtml" : "view" + ext;
0124                 action->setIcon(QIcon::fromTheme(icon));
0125             }
0126             connect(action, SIGNAL(triggered(QUrl)), this, SLOT(slotUserHelpActivated(QUrl)));
0127             m_userHelpActionMenu->addAction(action);
0128             m_actionList.append(action);
0129         }
0130         ++j;
0131     }
0132 }
0133 
0134 void UserHelp::enableUserHelpEntries(bool state)
0135 {
0136     QStringList menuList;
0137     QList<QUrl> urlList;
0138     readConfig(menuList, urlList);
0139     m_userHelpActionMenu->setEnabled(state && (menuList.size() > 0));
0140 }
0141 
0142 void UserHelp::slotUserHelpActivated(const QUrl &url)
0143 {
0144     KILE_DEBUG_MAIN << "==slotUserHelpActivated(" << url << ")============";
0145 
0146     // does the files exist?
0147     QFileInfo fi(url.toLocalFile());
0148     bool local = url.isLocalFile();
0149     if(local && !fi.exists()) {
0150         KMessageBox::error(m_mainWindow, i18n("The file '%1' does not exist.", url.toDisplayString()));
0151         return;
0152     }
0153 
0154     // show help file
0155     KILE_DEBUG_MAIN << "\tshow userhelpfile (" << url << ")";
0156 
0157     // determine, how to show the file
0158     QString type;
0159     if(local) {
0160         QString ext = fi.suffix();
0161         if(ext == "dvi") {
0162             type = "ViewDVI";
0163         }
0164         else if(ext == "ps") {
0165             type = "ViewPS";
0166         }
0167         else if(ext == "pdf") {
0168             type = "ViewPDF";
0169         }
0170         else if(ext == "html" || ext == "htm") {
0171             type = "ViewHTML";
0172         }
0173     }
0174 
0175     KileTool::Base *tool = Q_NULLPTR;
0176     if(!type.isEmpty() && type != "ViewHTML") {
0177         tool = m_manager->createTool(type, "Okular", false);
0178     }
0179     if(tool) {
0180         tool->setFlags(0);
0181         tool->setSource(url.toLocalFile());
0182         m_manager->run(tool);
0183     }
0184     else {
0185         new KRun(url,m_mainWindow);
0186     }
0187 }
0188 
0189 void UserHelp::userHelpDialog()
0190 {
0191     QStringList menuList;
0192     QList<QUrl> fileList;
0193     readConfig(menuList, fileList);
0194 
0195     KileDialog::UserHelpDialog *dialog = new KileDialog::UserHelpDialog();
0196     dialog->setParameter(menuList, fileList);
0197     if(dialog->exec()) {
0198         //KILE_DEBUG_MAIN << "\t new userhelp entries accepted";
0199         dialog->getParameter(menuList, fileList);
0200         writeConfig(menuList, fileList);
0201         setupUserHelpMenu();
0202     }
0203 
0204     delete dialog;
0205 }
0206 
0207 }
0208