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;