File indexing completed on 2024-05-19 08:56:13
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 }