1 /*
2     This file is part of the KDE project
3     SPDX-FileCopyrightText: 1998-2009 David Faure <faure@kde.org>
4 
5     SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6 */
7 
8 #ifndef KFILEITEMACTIONS_P_H
9 #define KFILEITEMACTIONS_P_H
10 
11 #include "kabstractfileitemactionplugin.h"
12 #include <KConfig>
13 #include <KService>
14 #include <KServiceAction>
15 #include <kfileitem.h>
16 #include <kfileitemlistproperties.h>
17 
18 #include <QActionGroup>
19 #include <QObject>
20 
21 class KFileItemActions;
22 
23 typedef QList<KServiceAction> ServiceList;
24 
25 class KFileItemActionsPrivate : public QObject
26 {
27     Q_OBJECT
28     friend class KFileItemActions;
29 
30 public:
31     explicit KFileItemActionsPrivate(KFileItemActions *qq);
32     ~KFileItemActionsPrivate() override;
33 
34     int insertServicesSubmenus(const QMap<QString, ServiceList> &list, QMenu *menu, bool isBuiltin);
35     int insertServices(const ServiceList &list, QMenu *menu, bool isBuiltin);
36 
37     // For "open with"
38     KService::List associatedApplications(const QString &traderConstraint);
39     QAction *createAppAction(const KService::Ptr &service, bool singleOffer);
40 
41     struct ServiceRank {
42         int score;
43         KService::Ptr service;
44     };
45 
46     // Inline function for sorting lists of ServiceRank
lessRank(const ServiceRank & id1,const ServiceRank & id2)47     static bool lessRank(const ServiceRank &id1, const ServiceRank &id2)
48     {
49         return id1.score < id2.score;
50     }
51 
52     QStringList listMimeTypes(const KFileItemList &items);
53     QStringList listPreferredServiceIds(const QStringList &mimeTypeList, const QStringList &excludedDesktopEntryNames, const QString &traderConstraint);
54 
55     QPair<int, QMenu *> addServiceActionsTo(QMenu *mainMenu, const QList<QAction *> &additionalActions, const QStringList &excludeList);
56     int addPluginActionsTo(QMenu *mainMenu, QMenu *actionsMenu, const QStringList &excludeList);
57     void insertOpenWithActionsTo(QAction *before, QMenu *topMenu, const QStringList &excludedDesktopEntryNames, const QString &traderConstraint);
58     static KService::List
59     associatedApplications(const QStringList &mimeTypeList, const QString &traderConstraint, const QStringList &excludedDesktopEntryNames);
60 
61     QStringList serviceMenuFilePaths();
62 
63 public Q_SLOTS:
64     void slotRunPreferredApplications();
65 
66 private:
67     void openWithByMime(const KFileItemList &fileItems);
68 
69     // Utility function which returns true if the service menu should be displayed
70     bool shouldDisplayServiceMenu(const KConfigGroup &cfg, const QString &protocol) const;
71     // Utility functions which returns true if the types for the service are set and the exclude types are not contained
72     bool checkTypesMatch(const KConfigGroup &cfg) const;
73 
74 private Q_SLOTS:
75     // For servicemenus
76     void slotExecuteService(QAction *act);
77     // For "open with" applications
78     void slotRunApplication(QAction *act);
79     void slotOpenWithDialog();
80 
81 public:
82     KFileItemActions *const q;
83     KFileItemListProperties m_props;
84     QStringList m_mimeTypeList;
85     QString m_traderConstraint;
86     KFileItemList m_fileOpenList;
87     QActionGroup m_executeServiceActionGroup;
88     QActionGroup m_runApplicationActionGroup;
89     QWidget *m_parentWidget;
90     KConfig m_config;
91     QHash<QString, KAbstractFileItemActionPlugin *> m_loadedPlugins;
92 };
93 
94 Q_DECLARE_METATYPE(KService::Ptr)
95 Q_DECLARE_METATYPE(KServiceAction)
96 
97 #endif /* KFILEITEMACTIONS_P_H */
98