1 /**************************************************************************
2 *   Copyright (C) 2008-2018 by Michel Ludwig (michel.ludwig@kdemail.net)  *
3 ***************************************************************************/
4 
5 /**************************************************************************
6 *                                                                         *
7 *   This program is free software; you can redistribute it and/or modify  *
8 *   it under the terms of the GNU General Public License as published by  *
9 *   the Free Software Foundation; either version 2 of the License, or     *
10 *   (at your option) any later version.                                   *
11 *                                                                         *
12 ***************************************************************************/
13 
14 #include "utilities.h"
15 
16 #include <QApplication>
17 #include <QDateTime>
18 #include <QDesktopWidget>
19 #include <QDir>
20 #include <QFileInfo>
21 #include <QStyle>
22 #include <QTimer>
23 
24 #include <KRun>
25 
26 #include "kiledebug.h"
27 
ServiceRunAction(const KService & service,const QList<QUrl> & urls,QWidget * window,bool tempFiles,const QString & suggestedFileName,const QByteArray & asn,QObject * parent)28 ServiceRunAction::ServiceRunAction(const KService& service,
29                                    const QList<QUrl>& urls,
30                                    QWidget* window,
31                                    bool tempFiles,
32                                    const QString& suggestedFileName,
33                                    const QByteArray& asn,
34                                    QObject *parent)
35     : QAction(QIcon::fromTheme(service.icon()), service.genericName(), parent),
36       m_service(service),
37       m_urlList(urls),
38       m_window(window),
39       m_tempFiles(tempFiles),
40       m_suggestedFileName(suggestedFileName),
41       m_asn(asn)
42 {
43     connect(this, SIGNAL(triggered()), this, SLOT(runService()));
44 }
45 
~ServiceRunAction()46 ServiceRunAction::~ServiceRunAction()
47 {
48 }
49 
runService()50 void ServiceRunAction::runService()
51 {
52     KRun::runService(m_service, m_urlList, m_window,
53                      m_tempFiles,
54                      m_suggestedFileName,
55                      m_asn);
56 }
57 
lastModifiedFile(const QStringList & files,const QString & baseDir)58 QString KileUtilities::lastModifiedFile(const QStringList& files, const QString& baseDir)
59 {
60     KILE_DEBUG_MAIN << "==KileUtilities::lastModifiedFile()=====" << files << "baseDir:" << baseDir;
61 
62     if(files.empty()) {
63         return QString();
64     }
65 
66     QStringList absoluteFileNames;
67     if(baseDir.isEmpty()) {
68         absoluteFileNames = files;
69     }
70     else {
71         QDir basePath(baseDir);
72         Q_FOREACH(const QString& file, files) {
73             absoluteFileNames.append(basePath.absoluteFilePath(file));
74         }
75     }
76 
77     QDateTime lastModifiedTime;
78     const QString* lastModifiedFile = Q_NULLPTR;
79 
80     Q_FOREACH(const QString& file, absoluteFileNames) {
81         QFileInfo fileInfo(file);
82         if(!fileInfo.exists()) {
83             KILE_DEBUG_MAIN << "file does not exist:" << file << "files:" << files;
84             continue;
85         }
86         QDateTime modificationTime = fileInfo.lastModified();
87         if(!lastModifiedTime.isValid() || modificationTime > lastModifiedTime) {
88             lastModifiedFile = &file;
89             lastModifiedTime = modificationTime;
90         }
91     }
92 
93     if(lastModifiedFile) {
94         return *lastModifiedFile;
95     }
96     else {
97         return QString();
98     }
99 }
100 
centerWidgetRelativeToParentRect(QWidget * widget,const QRect & parentRect)101 void centerWidgetRelativeToParentRect(QWidget *widget, const QRect& parentRect)
102 {
103     QRect alignedRect = QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, widget->size(), parentRect);
104     widget->move(alignedRect.x(), alignedRect.y());
105 }
106 
centerWidgetRelativeToParent(QWidget * widget)107 void KileUtilities::centerWidgetRelativeToParent(QWidget *widget)
108 {
109     QWidget *parentWidget = widget->parentWidget();
110     if(!parentWidget) {
111         centerWidgetRelativeToParentRect(widget, QApplication::desktop()->availableGeometry(widget));
112     }
113     else {
114         QRect parentRect(parentWidget->mapToGlobal(QPoint(0, 0)), parentWidget->size());
115         centerWidgetRelativeToParentRect(widget, parentRect);
116     }
117 }
118 
scheduleCenteringOfWidget(QWidget * widget)119 void KileUtilities::scheduleCenteringOfWidget(QWidget *widget)
120 {
121     QTimer::singleShot(0, widget, [=] () {
122         centerWidgetRelativeToParent(widget);
123     });
124 }
125 
canonicalUrl(const QUrl & url)126 QUrl KileUtilities::canonicalUrl(const QUrl &url)
127 {
128     if(!url.isLocalFile()) {
129         return url;
130     }
131 
132     QFileInfo fileInfo(url.toLocalFile());
133 
134     if(fileInfo.exists()) {
135         const QString canonicalFileName  = fileInfo.canonicalFilePath();
136         Q_ASSERT_X(!canonicalFileName.isEmpty(), "canonicalUrl", "empty although file exists!");
137 
138         return QUrl::fromLocalFile(canonicalFileName);
139     }
140     else {
141         return QUrl::fromLocalFile(QDir::cleanPath(url.toLocalFile()));
142     }
143 }
144 
getRelativeSharePath()145 static inline QString getRelativeSharePath()
146 {
147     return QCoreApplication::applicationDirPath() + QLatin1String("/../share/kile/");
148 }
149 
findExecutable(const QString & executableName,const QStringList & paths)150 QString KileUtilities::findExecutable(const QString &executableName, const QStringList &paths)
151 {
152     return QStandardPaths::findExecutable(executableName, paths);
153 }
154 
locate(QStandardPaths::StandardLocation type,const QString & fileName,QStandardPaths::LocateOptions options)155 QString KileUtilities::locate(QStandardPaths::StandardLocation type, const QString &fileName,
156                                                       QStandardPaths::LocateOptions options)
157 {
158     if(type == QStandardPaths::AppDataLocation || type == QStandardPaths::DataLocation) {
159 	const QString candidate = getRelativeSharePath() + fileName;
160 	if((options == QStandardPaths::LocateFile) && QFileInfo::exists(candidate)) {
161             return candidate;
162 	}
163         else if((options == QStandardPaths::LocateDirectory) && QDir(candidate).exists()) {
164             return candidate;
165         }
166     }
167 
168     return QStandardPaths::locate(type, fileName, options);
169 }
170 
locateAll(QStandardPaths::StandardLocation type,const QString & fileName,QStandardPaths::LocateOptions options)171 QStringList KileUtilities::locateAll(QStandardPaths::StandardLocation type, const QString &fileName,
172                                                              QStandardPaths::LocateOptions options)
173 {
174     QStringList toReturn;
175     if(type == QStandardPaths::AppDataLocation || type == QStandardPaths::DataLocation) {
176 	const QString candidate = getRelativeSharePath() + fileName;
177 	if((options == QStandardPaths::LocateFile) && QFileInfo::exists(candidate)) {
178             toReturn << candidate;
179 	}
180         else if((options == QStandardPaths::LocateDirectory) && QDir(candidate).exists()) {
181             toReturn << candidate;
182         }
183     }
184     toReturn << QStandardPaths::locateAll(type, fileName, options);
185 
186     return toReturn;
187 }
188 
standardLocations(QStandardPaths::StandardLocation type)189 QStringList KileUtilities::standardLocations(QStandardPaths::StandardLocation type)
190 {
191     QStringList toReturn;
192     if(type == QStandardPaths::AppDataLocation || type == QStandardPaths::DataLocation) {
193         toReturn << getRelativeSharePath();
194     }
195     toReturn << QStandardPaths::standardLocations(type);
196 
197     return toReturn;
198 }
199 
writableLocation(QStandardPaths::StandardLocation type)200 QString KileUtilities::writableLocation(QStandardPaths::StandardLocation type)
201 {
202     return QStandardPaths::writableLocation(type);
203 }
204 
205 // kate: indent-width 4; replace-tabs: true;
206