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