File indexing completed on 2024-05-05 17:15:15

0001 /*****************************************************************************************
0002                            userhelpdialog.cpp
0003 ----------------------------------------------------------------------------
0004     date                 : Jul 22 2005
0005     version              : 0.20
0006     copyright            : (C) 2005 by Holger Danielsson (holger.danielsson@t-online.de)
0007                                2008 by Michel Ludwig (michel.ludwig@kdemail.net)
0008  *****************************************************************************************/
0009 
0010 /***************************************************************************
0011  *                                                                         *
0012  *   This program is free software; you can redistribute it and/or modify  *
0013  *   it under the terms of the GNU General Public License as published by  *
0014  *   the Free Software Foundation; either version 2 of the License, or     *
0015  *   (at your option) any later version.                                   *
0016  *                                                                         *
0017  ***************************************************************************/
0018 
0019 #include "userhelpdialog.h"
0020 #include "kiledebug.h"
0021 
0022 #include <QBoxLayout>
0023 #include <QFileInfo>
0024 #include <QGridLayout>
0025 #include <QGroupBox>
0026 #include <QLabel>
0027 #include <QListWidget>
0028 
0029 #include <KLocalizedString>
0030 #include <KMessageBox>
0031 #include <QPushButton>
0032 #include <QUrl>
0033 #include <KConfigGroup>
0034 #include <QDialogButtonBox>
0035 #include <QVBoxLayout>
0036 #include <QFileDialog>
0037 
0038 namespace KileDialog
0039 {
0040 
0041 //////////////////// UserHelpDialog ////////////////////
0042 
0043 //BEGIN UserHelpDialog
0044 
0045 UserHelpDialog::UserHelpDialog(QWidget *parent, const char *name)
0046     : QDialog(parent)
0047 {
0048     KILE_DEBUG_MAIN << "==UserHelpDialog::UserHelpDialog()===================";
0049 
0050     setObjectName(name);
0051     setWindowTitle(i18n("Configure User Help"));
0052     setModal(true);
0053 
0054     QVBoxLayout *mainLayout = new QVBoxLayout;
0055     setLayout(mainLayout);
0056 
0057     QGroupBox* group = new QGroupBox(i18n("User Help"), this);
0058     QGridLayout *grid = new QGridLayout();
0059     group->setLayout(grid);
0060     mainLayout->addWidget(group);
0061 
0062     // listbox
0063     QLabel *label1 = new QLabel(i18n("&Menu item:"), group);
0064     grid->addWidget(label1, 0, 0);
0065     m_menulistbox = new QListWidget(group);
0066     m_menulistbox->setSelectionMode(QAbstractItemView::SingleSelection);
0067     grid->addWidget(m_menulistbox, 1, 0);
0068     label1->setBuddy(m_menulistbox);
0069 
0070     // action widget
0071     QWidget *actionwidget = new QWidget(group);
0072     QVBoxLayout *actions = new QVBoxLayout(actionwidget);
0073     actions->setContentsMargins(0, 0, 0, 0);
0074 
0075     m_add = new QPushButton(i18n("&Add..."), actionwidget);
0076     m_remove = new QPushButton(i18n("&Remove"), actionwidget);
0077     m_addsep = new QPushButton(i18n("&Separator"), actionwidget);
0078     m_up = new QPushButton(i18n("Move &Up"), actionwidget);
0079     m_down = new QPushButton(i18n("Move &Down"), actionwidget);
0080 
0081     int wmax = m_add->sizeHint().width();
0082     int w = m_remove->sizeHint().width();
0083     if(w > wmax) {
0084         wmax = w;
0085     }
0086     w = m_addsep->sizeHint().width();
0087     if(w > wmax) {
0088         wmax = w;
0089     }
0090     w = m_up->sizeHint().width();
0091     if(w > wmax) {
0092         wmax = w;
0093     }
0094     w = m_down->sizeHint().width();
0095     if(w > wmax) {
0096         wmax = w;
0097     }
0098 
0099     m_add->setFixedWidth(wmax);
0100     m_remove->setFixedWidth(wmax);
0101     m_addsep->setFixedWidth(wmax);
0102     m_up->setFixedWidth(wmax);
0103     m_down->setFixedWidth(wmax);
0104 
0105     actions->addWidget(m_add);
0106     actions->addWidget(m_remove);
0107     actions->addSpacing(20);
0108     actions->addWidget(m_addsep);
0109     actions->addSpacing(20);
0110     actions->addWidget(m_up);
0111     actions->addWidget(m_down);
0112     actions->addStretch(1);
0113 
0114     // insert action widget
0115     grid->addWidget(actionwidget, 1, 1, Qt::AlignTop);
0116 
0117     // file
0118     grid->addWidget(new QLabel(i18n("File:"), group), 2, 0);
0119     m_fileedit = new QLineEdit(group);
0120     m_fileedit->setReadOnly(true);
0121     grid->addWidget(m_fileedit, 3, 0, 1, 2);
0122 
0123     // fill vbox
0124     mainLayout->addWidget(group);
0125 
0126     connect(m_menulistbox, &QListWidget::itemSelectionChanged, this, &UserHelpDialog::slotChange);
0127     connect(m_add, &QPushButton::clicked, this, &UserHelpDialog::slotAdd);
0128     connect(m_remove, &QPushButton::clicked, this, &UserHelpDialog::slotRemove);
0129     connect(m_addsep, &QPushButton::clicked, this, &UserHelpDialog::slotAddSep);
0130     connect(m_up, &QPushButton::clicked, this, &UserHelpDialog::slotUp);
0131     connect(m_down, &QPushButton::clicked, this, &UserHelpDialog::slotDown);
0132 
0133     // dialog buttons
0134     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
0135     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0136     okButton->setDefault(true);
0137     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0138     connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
0139     connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
0140     mainLayout->addWidget(buttonBox);
0141 
0142     resize(400, sizeHint().height());
0143     updateButton();
0144 }
0145 
0146 void UserHelpDialog::setParameter(const QStringList &menuentries, const QList<QUrl> &helpfiles)
0147 {
0148     for (int i = 0; i < menuentries.count(); ++i) {
0149         m_menulistbox->addItem(menuentries[i]);
0150 
0151         if(m_menulistbox->item(i)->text() != "-") {
0152             m_filelist << helpfiles[i];
0153         }
0154         else {
0155             m_filelist << QUrl();
0156         }
0157     }
0158     updateButton();
0159 }
0160 
0161 void UserHelpDialog::getParameter(QStringList &userhelpmenulist, QList<QUrl> &userhelpfilelist)
0162 {
0163     // clear result
0164     userhelpmenulist.clear();
0165     userhelpfilelist.clear();
0166     bool separator = false;
0167 
0168     // now get all entries
0169     for (int i = 0; i < m_menulistbox->count(); ++i) {
0170         if(m_menulistbox->item(i)->text() != "-") {
0171             userhelpmenulist << m_menulistbox->item(i)->text();
0172             userhelpfilelist << m_filelist[i];
0173             separator = false;
0174         }
0175         else {
0176             if(!separator) {
0177                 userhelpmenulist << m_menulistbox->item(i)->text();
0178                 userhelpfilelist << QUrl();
0179                 separator = true;
0180             }
0181         }
0182     }
0183 }
0184 
0185 void UserHelpDialog::slotChange()
0186 {
0187     int index = m_menulistbox->currentRow();
0188     if (index >= 0) {
0189         m_fileedit->setText(m_filelist[index].url());
0190     }
0191     else {
0192         m_fileedit->clear();
0193     }
0194     updateButton();
0195 }
0196 
0197 void UserHelpDialog::slotAdd()
0198 {
0199     KileDialog::UserHelpAddDialog *dialog = new KileDialog::UserHelpAddDialog(m_menulistbox, this);
0200     if (dialog->exec()) {
0201         // with corresponding filename
0202         QString helpfile = dialog->getHelpfile();
0203 
0204         if (helpfile.isEmpty()
0205                 || m_menulistbox->findItems(helpfile, Qt::MatchExactly).count() > 0
0206            ) {
0207             return;
0208         }
0209 
0210         m_filelist.append(QUrl::fromLocalFile(helpfile));
0211         m_fileedit->setText(helpfile);
0212 
0213         // insert into listbox
0214         m_menulistbox->addItem(dialog->getMenuitem());
0215         m_menulistbox->setCurrentRow(m_menulistbox->count() - 1);
0216 
0217         updateButton();
0218     }
0219 }
0220 
0221 void UserHelpDialog::slotRemove()
0222 {
0223     // get current index
0224     int index = m_menulistbox->currentRow();
0225     if(index >= 0) {
0226         // remove item
0227         m_menulistbox->takeItem(index);
0228         m_filelist.removeAt(index);
0229 
0230         // select a new index: first we try to take the old index. When
0231         // this index is too big now, index is decremented.
0232         // If the list is empty now, index is set to -1.
0233         int entries = m_menulistbox->count();
0234         if (entries > 0) {
0235             if (index >= entries) {
0236                 index--;
0237             }
0238             m_menulistbox->setCurrentRow(index);
0239         }
0240         else {
0241             m_menulistbox->setCurrentItem(0);
0242         }
0243     }
0244 
0245     updateButton();
0246 }
0247 
0248 void UserHelpDialog::slotAddSep()
0249 {
0250     // get current index
0251     int index = m_menulistbox->currentRow();
0252     if (index == -1) {
0253         return;
0254     }
0255 
0256     // insert separator
0257     m_menulistbox->insertItem(index, "-");
0258     m_filelist.insert(index, QUrl());
0259 
0260     updateButton();
0261 }
0262 
0263 void UserHelpDialog::slotUp()
0264 {
0265     // get current index
0266     int index = m_menulistbox->currentRow();
0267     if (index <= 0) {
0268         return;
0269     }
0270 
0271     // insert current entry before current
0272     m_menulistbox->insertItem(index - 1, m_menulistbox->currentItem()->text());
0273     m_filelist.insert(index - 1, m_filelist[index]);
0274 
0275     // then remove the old entry
0276     m_menulistbox->takeItem(index + 1);
0277     m_filelist.removeAt(index + 1);
0278 
0279     // select current entry
0280     m_menulistbox->setCurrentRow(index - 1);
0281 
0282     updateButton();
0283 }
0284 
0285 void UserHelpDialog::slotDown()
0286 {
0287     int entries = m_menulistbox->count();
0288 
0289     // get current index
0290     int index = m_menulistbox->currentRow();
0291     if (index < 0 || index == entries - 1) {
0292         return;
0293     }
0294 
0295     // insert current entry after current
0296     if (index < entries - 2) {
0297         m_menulistbox->insertItem(index + 2, m_menulistbox->currentItem()->text());    // index + 2
0298         m_filelist.insert(index + 2, m_filelist[index]);
0299     }
0300     else {
0301         m_menulistbox->addItem(m_menulistbox->currentItem()->text());
0302         m_filelist.append(m_filelist[index]);
0303     }
0304 
0305     // then remove the old entry
0306     m_menulistbox->takeItem(index);
0307     m_filelist.removeAt(index);
0308 
0309     // select current entry
0310     m_menulistbox->setCurrentRow(index + 1);
0311 
0312     updateButton();
0313 }
0314 
0315 void UserHelpDialog::updateButton()
0316 {
0317     // default states
0318     bool rem_state = false;
0319     bool sep_state = false;
0320     bool up_state = false;
0321     bool down_state = false;
0322 
0323     // change button states, if there are entries
0324     int index = m_menulistbox->currentRow();
0325     int entries = m_menulistbox->count();
0326     if (entries == 1) {
0327         rem_state = true;
0328     }
0329     else {
0330         if(entries >= 2) {
0331             rem_state = true;
0332             if(index == 0) {
0333                 down_state = true;         // index = 0
0334             }
0335             else {
0336                 if(index == entries - 1) {
0337                     sep_state = true;          // index = entries-1
0338                     up_state = true;
0339                 }
0340                 else {                             // 0 < index < entries-1
0341                     sep_state = true;
0342                     up_state = true;
0343                     down_state = true;
0344                 }
0345             }
0346         }
0347     }
0348     // don't allow two continuous spearators
0349     if(m_menulistbox->currentItem() && m_menulistbox->currentItem()->text() == "-") {
0350         sep_state = false;
0351     }
0352 
0353     // set button states
0354     m_remove->setEnabled(rem_state);
0355     m_addsep->setEnabled(sep_state);
0356     m_up->setEnabled(up_state);
0357     m_down->setEnabled(down_state);
0358 }
0359 //END UserHelpDialog
0360 
0361 //////////////////// UserHelpAddDialog ////////////////////
0362 
0363 //BEGIN UserHelpAddDialog
0364 
0365 UserHelpAddDialog::UserHelpAddDialog(QListWidget *menulistbox, QWidget *parent)
0366     : QDialog(parent)
0367     , m_menulistbox(menulistbox)
0368 {
0369     setWindowTitle(i18n("Add User Helpfile"));
0370     setModal(true);
0371 
0372     KILE_DEBUG_MAIN << "==UserHelpAddDialog::UserHelpAddDialog()===================";
0373 
0374     QVBoxLayout *mainLayout = new QVBoxLayout;
0375     setLayout(mainLayout);
0376 
0377     // layout
0378     QGroupBox *group = new QGroupBox(i18n("User Help"), this);
0379     QGridLayout *grid = new QGridLayout();
0380     group->setLayout(grid);
0381     mainLayout->addWidget(group);
0382 
0383     // menu entry
0384     QLabel *label1 = new QLabel(i18n("&Menu entry:"), group);
0385     grid->addWidget(label1, 0, 0);
0386     m_leMenuEntry = new QLineEdit(group);
0387     m_leMenuEntry->setClearButtonEnabled(true);
0388     grid->addWidget(m_leMenuEntry, 0, 1, 1, 3);
0389     label1->setBuddy(m_leMenuEntry);
0390 
0391     // help file
0392     QLabel *label2 = new QLabel(i18n("&Help file:"), group);
0393     grid->addWidget(label2, 1, 0);
0394     m_leHelpFile = new QLineEdit(group);
0395     m_leHelpFile->setReadOnly(false);
0396     m_leHelpFile->setClearButtonEnabled(true);
0397     grid->addWidget(m_leHelpFile, 1, 1);
0398     m_pbChooseFile = new QPushButton("", group);
0399     m_pbChooseFile->setObjectName("filechooser_button");
0400     m_pbChooseFile->setIcon(QIcon::fromTheme("document-open"));
0401     int buttonSize = m_leHelpFile->sizeHint().height();
0402     m_pbChooseFile->setFixedSize(buttonSize, buttonSize);
0403     m_pbChooseFile->setToolTip(i18n("Open file dialog"));
0404     grid->addWidget(m_pbChooseFile, 1, 2);
0405     label2->setBuddy(m_pbChooseFile);
0406 
0407     // fill mainLayout
0408     mainLayout->addWidget(group);
0409     mainLayout->addStretch();
0410 
0411     m_leMenuEntry->setWhatsThis(i18n("The menu entry for this help file."));
0412     m_leHelpFile->setWhatsThis(i18n("The name of the local help file or a valid WEB url."));
0413     m_pbChooseFile->setWhatsThis(i18n("Start a file dialog to choose a local help file."));
0414 
0415     connect(m_pbChooseFile, &QPushButton::clicked, this, &UserHelpAddDialog::onShowLocalFileSelection);
0416 
0417     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
0418     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0419     okButton->setDefault(true);
0420     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0421     mainLayout->addWidget(buttonBox);
0422     connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
0423     connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
0424 
0425     setFocusProxy(m_leMenuEntry);
0426     resize(500, sizeHint().height());
0427 }
0428 
0429 void UserHelpAddDialog::onShowLocalFileSelection()
0430 {
0431     QString directory = QDir::currentPath();
0432     QString filter = i18n("Websites (HTML) (*.html *.htm);;Documents (PDF, PS, DVI, EPUB) (*.ps *.pdf *.dvi *.epub);;All Files (*)");
0433 
0434     QString filename = QFileDialog::getOpenFileName(this, i18n("Select File"), directory, filter);
0435     if (filename.isEmpty()) {
0436         return;
0437     }
0438 
0439     QFileInfo fi(filename);
0440     if (!fi.exists()) {
0441         KMessageBox::error(Q_NULLPTR, i18n("File '%1' does not exist.", filename));
0442         return;
0443     }
0444     m_leHelpFile->setText(filename);
0445 }
0446 
0447 void UserHelpAddDialog::onAccepted()
0448 {
0449     m_leMenuEntry->setText(m_leMenuEntry->text().trimmed());
0450     QString urlString = m_leHelpFile->text().trimmed();
0451     m_leHelpFile->setText(urlString);
0452 }
0453 
0454 //END UserHelpAddDialog
0455 
0456 }