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