File indexing completed on 2024-04-21 15:55:47

0001 /**************************************************************************
0002 *   Copyright (C) 2008-2018 by Michel Ludwig (michel.ludwig@kdemail.net)  *
0003 ***************************************************************************/
0004 
0005 /**************************************************************************
0006 *                                                                         *
0007 *   This program is free software; you can redistribute it and/or modify  *
0008 *   it under the terms of the GNU General Public License as published by  *
0009 *   the Free Software Foundation; either version 2 of the License, or     *
0010 *   (at your option) any later version.                                   *
0011 *                                                                         *
0012 ***************************************************************************/
0013 
0014 #include "utilities.h"
0015 
0016 #include <QApplication>
0017 #include <QDateTime>
0018 #include <QDesktopWidget>
0019 #include <QDir>
0020 #include <QFileInfo>
0021 #include <QStyle>
0022 #include <QTimer>
0023 
0024 #include <KIO/ApplicationLauncherJob>
0025 #include <KIO/JobUiDelegateFactory>
0026 #include <KJobUiDelegate>
0027 
0028 #include "kiledebug.h"
0029 
0030 ServiceRunAction::ServiceRunAction(const KService& service,
0031                                    const QList<QUrl>& urls,
0032                                    QWidget* window,
0033                                    bool tempFiles,
0034                                    const QString& suggestedFileName,
0035                                    const QByteArray& asn,
0036                                    QObject *parent)
0037     : QAction(QIcon::fromTheme(service.icon()), service.genericName(), parent),
0038       m_service(service),
0039       m_urlList(urls),
0040       m_window(window),
0041       m_tempFiles(tempFiles),
0042       m_suggestedFileName(suggestedFileName),
0043       m_asn(asn)
0044 {
0045     connect(this, SIGNAL(triggered()), this, SLOT(runService()));
0046 }
0047 
0048 ServiceRunAction::~ServiceRunAction()
0049 {
0050 }
0051 
0052 void ServiceRunAction::runService()
0053 {
0054     KService kservice(m_service);
0055     KService::Ptr servicePointer = KService::Ptr(&kservice);
0056     auto *job = new KIO::ApplicationLauncherJob(servicePointer);
0057     job->setUrls(m_urlList);
0058     job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, m_window));
0059     if (m_tempFiles) {
0060         job->setRunFlags(KIO::ApplicationLauncherJob::DeleteTemporaryFiles);
0061     }
0062     job->setSuggestedFileName(m_suggestedFileName);
0063     job->setStartupId(m_asn);
0064     job->start();
0065 }
0066 
0067 QString KileUtilities::lastModifiedFile(const QStringList& files, const QString& baseDir)
0068 {
0069     KILE_DEBUG_MAIN << "==KileUtilities::lastModifiedFile()=====" << files << "baseDir:" << baseDir;
0070 
0071     if(files.empty()) {
0072         return QString();
0073     }
0074 
0075     QStringList absoluteFileNames;
0076     if(baseDir.isEmpty()) {
0077         absoluteFileNames = files;
0078     }
0079     else {
0080         QDir basePath(baseDir);
0081         for(const QString& file : files) {
0082             absoluteFileNames.append(basePath.absoluteFilePath(file));
0083         }
0084     }
0085 
0086     QDateTime lastModifiedTime;
0087     const QString* lastModifiedFile = Q_NULLPTR;
0088 
0089     for(const QString& file : absoluteFileNames) {
0090         QFileInfo fileInfo(file);
0091         if(!fileInfo.exists()) {
0092             KILE_DEBUG_MAIN << "file does not exist:" << file << "files:" << files;
0093             continue;
0094         }
0095         QDateTime modificationTime = fileInfo.lastModified();
0096         if(!lastModifiedTime.isValid() || modificationTime > lastModifiedTime) {
0097             lastModifiedFile = &file;
0098             lastModifiedTime = modificationTime;
0099         }
0100     }
0101 
0102     if(lastModifiedFile) {
0103         return *lastModifiedFile;
0104     }
0105     else {
0106         return QString();
0107     }
0108 }
0109 
0110 void centerWidgetRelativeToParentRect(QWidget *widget, const QRect& parentRect)
0111 {
0112     QRect alignedRect = QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, widget->size(), parentRect);
0113     widget->move(alignedRect.x(), alignedRect.y());
0114 }
0115 
0116 void KileUtilities::centerWidgetRelativeToParent(QWidget *widget)
0117 {
0118     QWidget *parentWidget = widget->parentWidget();
0119     if(!parentWidget) {
0120         centerWidgetRelativeToParentRect(widget, QApplication::desktop()->availableGeometry(widget));
0121     }
0122     else {
0123         QRect parentRect(parentWidget->mapToGlobal(QPoint(0, 0)), parentWidget->size());
0124         centerWidgetRelativeToParentRect(widget, parentRect);
0125     }
0126 }
0127 
0128 void KileUtilities::scheduleCenteringOfWidget(QWidget *widget)
0129 {
0130     QTimer::singleShot(0, widget, [=] () {
0131         centerWidgetRelativeToParent(widget);
0132     });
0133 }
0134 
0135 QUrl KileUtilities::canonicalUrl(const QUrl &url)
0136 {
0137     if(!url.isLocalFile()) {
0138         return url;
0139     }
0140 
0141     QFileInfo fileInfo(url.toLocalFile());
0142 
0143     if(fileInfo.exists()) {
0144         const QString canonicalFileName  = fileInfo.canonicalFilePath();
0145         Q_ASSERT_X(!canonicalFileName.isEmpty(), "canonicalUrl", "empty although file exists!");
0146 
0147         return QUrl::fromLocalFile(canonicalFileName);
0148     }
0149     else {
0150         return QUrl::fromLocalFile(QDir::cleanPath(url.toLocalFile()));
0151     }
0152 }
0153 
0154 static inline QString getRelativeSharePath()
0155 {
0156     return QCoreApplication::applicationDirPath() + QLatin1String("/../share/kile/");
0157 }
0158 
0159 QString KileUtilities::findExecutable(const QString &executableName, const QStringList &paths)
0160 {
0161     return QStandardPaths::findExecutable(executableName, paths);
0162 }
0163 
0164 QString KileUtilities::locate(QStandardPaths::StandardLocation type, const QString &fileName,
0165                                                       QStandardPaths::LocateOptions options)
0166 {
0167     if(type == QStandardPaths::AppDataLocation || type == QStandardPaths::DataLocation) {
0168     const QString candidate = getRelativeSharePath() + fileName;
0169     if((options == QStandardPaths::LocateFile) && QFileInfo::exists(candidate)) {
0170             return candidate;
0171     }
0172         else if((options == QStandardPaths::LocateDirectory) && QDir(candidate).exists()) {
0173             return candidate;
0174         }
0175     }
0176 
0177     return QStandardPaths::locate(type, fileName, options);
0178 }
0179 
0180 QStringList KileUtilities::locateAll(QStandardPaths::StandardLocation type, const QString &fileName,
0181                                                              QStandardPaths::LocateOptions options)
0182 {
0183     QStringList toReturn;
0184     if(type == QStandardPaths::AppDataLocation || type == QStandardPaths::DataLocation) {
0185     const QString candidate = getRelativeSharePath() + fileName;
0186     if((options == QStandardPaths::LocateFile) && QFileInfo::exists(candidate)) {
0187             toReturn << candidate;
0188     }
0189         else if((options == QStandardPaths::LocateDirectory) && QDir(candidate).exists()) {
0190             toReturn << candidate;
0191         }
0192     }
0193     toReturn << QStandardPaths::locateAll(type, fileName, options);
0194 
0195     return toReturn;
0196 }
0197 
0198 QStringList KileUtilities::standardLocations(QStandardPaths::StandardLocation type)
0199 {
0200     QStringList toReturn;
0201     if(type == QStandardPaths::AppDataLocation || type == QStandardPaths::DataLocation) {
0202         toReturn << getRelativeSharePath();
0203     }
0204     toReturn << QStandardPaths::standardLocations(type);
0205 
0206     return toReturn;
0207 }
0208 
0209 QString KileUtilities::writableLocation(QStandardPaths::StandardLocation type)
0210 {
0211     return QStandardPaths::writableLocation(type);
0212 }
0213 
0214 // kate: indent-width 4; replace-tabs: true;