File indexing completed on 2024-04-28 17:06:10

0001 /*
0002     SPDX-FileCopyrightText: 2005 Dirk Eschler <deschler@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2005-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "krresulttable.h"
0009 
0010 #include <iostream>
0011 
0012 // QtCore
0013 #include <QList>
0014 // QtGui
0015 #include <QFontDatabase>
0016 #include <QGuiApplication>
0017 // QtWidgets
0018 #include <QGridLayout>
0019 #include <QLabel>
0020 
0021 #include <KI18n/KLocalizedString>
0022 #include <kio_version.h>
0023 
0024 #include "../Archive/krarchandler.h"
0025 #include "../krservices.h"
0026 
0027 using namespace std;
0028 
0029 #define PS(x) (_supported.contains(x))
0030 
0031 KrResultTable::KrResultTable(QWidget *parent)
0032     : QWidget(parent)
0033     , _numRows(1)
0034 {
0035 }
0036 
0037 KrResultTable::~KrResultTable() = default;
0038 
0039 QGridLayout *KrResultTable::initTable()
0040 {
0041     _grid = new QGridLayout(this);
0042     _grid->setColumnStretch(_numColumns - 1, 1); // stretch last column
0043     _grid->setContentsMargins(0, 0, 0, 0);
0044     _grid->setSpacing(0);
0045 
0046     // +++ Build and add table header +++
0047     int column = 0;
0048     for (auto &_tableHeader : _tableHeaders) {
0049         _label = new QLabel(_tableHeader, this);
0050         _label->setContentsMargins(5, 5, 5, 5);
0051         _grid->addWidget(_label, 0, column);
0052 
0053         // Set font
0054         QFont defFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
0055         defFont.setPointSize(defFont.pointSize() - 1);
0056         defFont.setBold(true);
0057         _label->setFont(defFont);
0058 
0059         ++column;
0060     }
0061 
0062     return _grid;
0063 }
0064 
0065 void KrResultTable::adjustRow(QGridLayout *grid)
0066 {
0067     int i = 0;
0068     QLayoutItem *child;
0069     int col = 0;
0070 
0071     while ((child = grid->itemAt(i)) != nullptr) {
0072         // Add some space between columns
0073         child->widget()->setMinimumWidth(child->widget()->sizeHint().width() + 15);
0074 
0075         // Paint uneven rows in alternate color
0076         if (((col / _numColumns) % 2)) {
0077             child->widget()->setAutoFillBackground(true);
0078             QPalette p = QGuiApplication::palette();
0079             QPalette pal = child->widget()->palette();
0080             pal.setColor(child->widget()->backgroundRole(), p.color(QPalette::Active, QPalette::AlternateBase));
0081             child->widget()->setPalette(pal);
0082         }
0083 
0084         ++i;
0085         ++col;
0086     }
0087 }
0088 
0089 // -----------------------------------------------------------------------------
0090 // -----------------------------------------------------------------------------
0091 
0092 KrArchiverResultTable::KrArchiverResultTable(QWidget *parent)
0093     : KrResultTable(parent)
0094 {
0095     _supported = KrArcHandler::supportedPackers(); // get list of available packers
0096 
0097     Archiver *tar = new Archiver("tar", "https://www.gnu.org/", PS("tar"), true, true);
0098     Archiver *gzip = new Archiver("gzip", "https://www.gnu.org/", PS("gzip"), true, true);
0099     Archiver *bzip2 = new Archiver("bzip2", "https://www.gnu.org/", PS("bzip2"), true, true);
0100     Archiver *lzma = new Archiver("lzma", "https://tukaani.org/lzma/", PS("lzma"), true, true);
0101     Archiver *xz = new Archiver("xz", "https://tukaani.org/xz/", PS("xz"), true, true);
0102     Archiver *lha = new Archiver("lha", "https://www.gnu.org/", PS("lha"), true, true);
0103     Archiver *zip = new Archiver("zip", "http://www.info-zip.org", PS("zip"), true, false);
0104     Archiver *unzip = new Archiver("unzip", "http://www.info-zip.org", PS("unzip"), false, true);
0105     Archiver *arj = new Archiver("arj", "http://www.arjsoftware.com", PS("arj"), true, true);
0106     Archiver *unarj = new Archiver("unarj", "http://www.arjsoftware.com", PS("unarj"), false, true);
0107     Archiver *unace = new Archiver("unace", "https://web.archive.org/web/20170714193504/http://winace.com/", PS("unace"), false, true);
0108     Archiver *rar = new Archiver("rar", "https://www.rarlab.com/", PS("rar"), true, true);
0109     Archiver *unrar = new Archiver("unrar", "https://www.rarlab.com/", PS("unrar"), false, true);
0110     Archiver *rpm = new Archiver("rpm", "https://www.gnu.org/", PS("rpm"), false, true);
0111     Archiver *dpkg = new Archiver("dpkg", "https://www.dpkg.org/", PS("dpkg"), false, true);
0112     Archiver *_7z = new Archiver("7z", "https://www.7-zip.org/", PS("7z"), true, true);
0113 
0114     // Special case: arj can unpack, but unarj is preferred
0115     if (PS("arj") && PS("unarj"))
0116         arj->setIsUnpacker(false);
0117     if (PS("arj") && !PS("unarj"))
0118         unarj->setNote(i18n("unarj not found, but arj found, which will be used for unpacking"));
0119     // Special case: rar can unpack, but unrar is preferred
0120     if (PS("rar") && PS("unrar"))
0121         rar->setIsUnpacker(false);
0122     // Special case: rpm needs cpio for unpacking
0123     if (PS("rpm") && !PS("cpio"))
0124         rpm->setNote(i18n("rpm found, but cpio not found which is required for unpacking"));
0125 
0126     _tableHeaders.append(i18n("Name"));
0127     _tableHeaders.append(i18n("Found"));
0128     _tableHeaders.append(i18n("Packing"));
0129     _tableHeaders.append(i18n("Unpacking"));
0130     _tableHeaders.append(i18n("Note"));
0131     _numColumns = _tableHeaders.size();
0132 
0133     _grid = initTable();
0134 
0135     addRow(tar, _grid);
0136     addRow(gzip, _grid);
0137     addRow(bzip2, _grid);
0138     addRow(lzma, _grid);
0139     addRow(xz, _grid);
0140     addRow(lha, _grid);
0141     addRow(zip, _grid);
0142     addRow(unzip, _grid);
0143     addRow(arj, _grid);
0144     addRow(unarj, _grid);
0145     addRow(unace, _grid);
0146     addRow(rar, _grid);
0147     addRow(unrar, _grid);
0148     addRow(rpm, _grid);
0149     addRow(dpkg, _grid);
0150     addRow(_7z, _grid);
0151 
0152     delete tar;
0153     delete gzip;
0154     delete bzip2;
0155     delete lzma;
0156     delete xz;
0157     delete lha;
0158     delete zip;
0159     delete unzip;
0160     delete arj;
0161     delete unarj;
0162     delete unace;
0163     delete rar;
0164     delete unrar;
0165     delete rpm;
0166     delete dpkg;
0167     delete _7z;
0168 }
0169 
0170 KrArchiverResultTable::~KrArchiverResultTable() = default;
0171 
0172 bool KrArchiverResultTable::addRow(SearchObject *search, QGridLayout *grid)
0173 {
0174     auto *arch = dynamic_cast<Archiver *>(search);
0175 
0176     // Name column
0177     KUrlLabel *urlLabel = new KUrlLabel(arch->getWebsite(), arch->getSearchName(), this);
0178     urlLabel->setContentsMargins(5, 5, 5, 5);
0179     urlLabel->setAlignment(Qt::AlignTop);
0180     grid->addWidget(urlLabel, _numRows, 0);
0181     connect(urlLabel, QOverload<>::of(&KUrlLabel::leftClickedUrl), this, [this, urlLabel]() {
0182         KrArchiverResultTable::website(urlLabel->url());
0183     });
0184     _label = urlLabel;
0185 
0186     // Found column
0187     _label = new QLabel(arch->getPath(), this);
0188     _label->setContentsMargins(5, 5, 5, 5);
0189     grid->addWidget(_label, _numRows, 1);
0190 
0191     // Packing column
0192     _label = new QLabel(this);
0193     _label->setContentsMargins(5, 5, 5, 5);
0194     _label->setAlignment(Qt::AlignTop);
0195     if (arch->getIsPacker() && arch->getFound()) {
0196         _label->setText(i18n("enabled"));
0197         QPalette pal = _label->palette();
0198         pal.setColor(_label->foregroundRole(), "darkgreen");
0199         _label->setPalette(pal);
0200     } else if (arch->getIsPacker() && !arch->getFound()) {
0201         _label->setText(i18n("disabled"));
0202         QPalette pal = _label->palette();
0203         pal.setColor(_label->foregroundRole(), "red");
0204         _label->setPalette(pal);
0205     } else
0206         _label->setText("");
0207     grid->addWidget(_label, _numRows, 2);
0208 
0209     // Unpacking column
0210     _label = new QLabel(this);
0211     _label->setContentsMargins(5, 5, 5, 5);
0212     _label->setAlignment(Qt::AlignTop);
0213     if (arch->getIsUnpacker() && arch->getFound()) {
0214         _label->setText(i18n("enabled"));
0215         QPalette pal = _label->palette();
0216         pal.setColor(_label->foregroundRole(), "darkgreen");
0217         _label->setPalette(pal);
0218     } else if (arch->getIsUnpacker() && !arch->getFound()) {
0219         _label->setText(i18n("disabled"));
0220         QPalette pal = _label->palette();
0221         pal.setColor(_label->foregroundRole(), "red");
0222         _label->setPalette(pal);
0223     } else
0224         _label->setText("");
0225     grid->addWidget(_label, _numRows, 3);
0226 
0227     // Note column
0228     _label = new QLabel(arch->getNote(), this);
0229     _label->setContentsMargins(5, 5, 5, 5);
0230     _label->setAlignment(Qt::AlignTop);
0231     _label->setWordWrap(true); // wrap words
0232     grid->addWidget(_label, _numRows, 4);
0233 
0234     // Apply shared design elements
0235     adjustRow(_grid);
0236 
0237     // Ensure the last column takes more space
0238     _label->setMinimumWidth(300);
0239 
0240     ++_numRows;
0241     return true;
0242 }
0243 
0244 void KrArchiverResultTable::website(const QString &url)
0245 {
0246     (void)new KRun(QUrl(url), this);
0247 }
0248 
0249 // -----------------------------------------------------------------------------
0250 // -----------------------------------------------------------------------------
0251 
0252 KrToolResultTable::KrToolResultTable(QWidget *parent)
0253     : KrResultTable(parent)
0254 {
0255     _supported = KrServices::supportedTools(); // get list of available tools
0256 
0257     QList<Application *> vecDiff, vecMail, vecRename, vecChecksum;
0258     Application *kdiff3 = new Application("kdiff3", "https://www.kde.org/applications/development/kdiff3/", KrServices::cmdExist("kdiff3"));
0259     Application *kompare = new Application("kompare", "https://www.kde.org/applications/development/kompare/", KrServices::cmdExist("kompare"));
0260     Application *xxdiff = new Application("xxdiff", "http://furius.ca/xxdiff/", KrServices::cmdExist("xxdiff"));
0261     Application *thunderbird = new Application("thunderbird", "https://www.thunderbird.net/", KrServices::cmdExist("thunderbird"));
0262     Application *kmail = new Application("kmail", "https://kontact.kde.org/components/kmail.html", KrServices::cmdExist("kmail"));
0263     Application *krename = new Application("krename", "https://www.kde.org/applications/utilities/krename/", KrServices::cmdExist("krename"));
0264     Application *md5sum = new Application("md5sum", "https://www.gnu.org/software/textutils/textutils.html", KrServices::cmdExist("md5sum"));
0265 
0266     vecDiff.push_back(kdiff3);
0267     vecDiff.push_back(kompare);
0268     vecDiff.push_back(xxdiff);
0269     vecMail.push_back(thunderbird);
0270     vecMail.push_back(kmail);
0271     vecRename.push_back(krename);
0272     vecChecksum.push_back(md5sum);
0273 
0274     ApplicationGroup *diff = new ApplicationGroup(i18n("diff utility"), PS("DIFF"), vecDiff);
0275     ApplicationGroup *mail = new ApplicationGroup(i18n("email client"), PS("MAIL"), vecMail);
0276     ApplicationGroup *rename = new ApplicationGroup(i18n("batch renamer"), PS("RENAME"), vecRename);
0277     ApplicationGroup *checksum = new ApplicationGroup(i18n("checksum utility"), PS("MD5"), vecChecksum);
0278 
0279     _tableHeaders.append(i18n("Group"));
0280     _tableHeaders.append(i18n("Tool"));
0281     _tableHeaders.append(i18n("Found"));
0282     _tableHeaders.append(i18n("Status"));
0283     _numColumns = _tableHeaders.size();
0284 
0285     _grid = initTable();
0286 
0287     addRow(diff, _grid);
0288     addRow(mail, _grid);
0289     addRow(rename, _grid);
0290     addRow(checksum, _grid);
0291 
0292     delete thunderbird;
0293     delete kmail;
0294     delete kompare;
0295     delete kdiff3;
0296     delete xxdiff;
0297     delete krename;
0298     delete md5sum;
0299 
0300     delete diff;
0301     delete mail;
0302     delete rename;
0303     delete checksum;
0304 }
0305 
0306 KrToolResultTable::~KrToolResultTable() = default;
0307 
0308 bool KrToolResultTable::addRow(SearchObject *search, QGridLayout *grid)
0309 {
0310     auto *appGroup = dynamic_cast<ApplicationGroup *>(search);
0311     QList<Application *> _apps = appGroup->getAppVec();
0312 
0313     // Name column
0314     _label = new QLabel(appGroup->getSearchName(), this);
0315     _label->setContentsMargins(5, 5, 5, 5);
0316     _label->setAlignment(Qt::AlignTop);
0317     grid->addWidget(_label, _numRows, 0);
0318 
0319     // Tool column
0320     QWidget *toolBoxWidget = new QWidget(this);
0321     auto *toolBox = new QVBoxLayout(toolBoxWidget);
0322 
0323     for (auto &_app : _apps) {
0324         auto *l = new KUrlLabel(_app->getWebsite(), _app->getAppName(), toolBoxWidget);
0325         toolBox->addWidget(l);
0326 
0327         l->setAlignment(Qt::AlignLeft | Qt::AlignTop);
0328         l->setContentsMargins(5, 5, 5, 5);
0329         connect(l, QOverload<>::of(&KUrlLabel::leftClickedUrl), this, [this, l]() {
0330             KrToolResultTable::website(l->url());
0331         });
0332     }
0333     grid->addWidget(toolBoxWidget, _numRows, 1);
0334 
0335     // Found column
0336     QWidget *vboxWidget = new QWidget(this);
0337     auto *vbox = new QVBoxLayout(vboxWidget);
0338 
0339     for (auto &_app : _apps) {
0340         _label = new QLabel(_app->getPath(), vboxWidget);
0341         _label->setContentsMargins(5, 5, 5, 5);
0342         _label->setAlignment(Qt::AlignTop);
0343         vbox->addWidget(_label);
0344     }
0345     grid->addWidget(vboxWidget, _numRows, 2);
0346 
0347     // Status column
0348     _label = new QLabel(this);
0349     _label->setContentsMargins(5, 5, 5, 5);
0350     _label->setAlignment(Qt::AlignTop);
0351     if (appGroup->getFoundGroup()) {
0352         _label->setText(i18n("enabled"));
0353         QPalette pal = _label->palette();
0354         pal.setColor(_label->foregroundRole(), "darkgreen");
0355         _label->setPalette(pal);
0356     } else {
0357         _label->setText(i18n("disabled"));
0358         QPalette pal = _label->palette();
0359         pal.setColor(_label->foregroundRole(), "red");
0360         _label->setPalette(pal);
0361     }
0362     grid->addWidget(_label, _numRows, 3);
0363 
0364     // Apply shared design elements
0365     adjustRow(_grid);
0366 
0367     // Ensure the last column takes more space
0368     _label->setMinimumWidth(300);
0369 
0370     ++_numRows;
0371     return true;
0372 }
0373 
0374 void KrToolResultTable::website(const QString &url)
0375 {
0376     (void)new KRun(QUrl(url), this);
0377 }