1 /*
2   This file is part of KAddressBook.
3 
4   SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
5 
6   SPDX-License-Identifier: GPL-2.0-or-later
7 */
8 
9 #pragma once
10 
11 #include "kaddressbook_export.h"
12 #include <Akonadi/Item>
13 #include <QItemSelection>
14 #include <QWidget>
15 
16 namespace GrantleeTheme
17 {
18 class ThemeManager;
19 }
20 class QAction;
21 namespace Akonadi
22 {
23 class Collection;
24 class ContactGroupViewer;
25 class ContactViewer;
26 class ContactsFilterProxyModel;
27 class EntityMimeTypeFilterModel;
28 class EntityTreeView;
29 class Item;
30 class StandardContactActionManager;
31 class EntityTreeModel;
32 }
33 namespace PimCommon
34 {
35 class AbstractGenericPluginInterface;
36 }
37 
38 namespace KAddressBookGrantlee
39 {
40 class GrantleeContactFormatter;
41 class GrantleeContactGroupFormatter;
42 }
43 namespace KAddressBookImportExport
44 {
45 class PluginInterface;
46 }
47 class ContactSwitcher;
48 class KActionCollection;
49 class KXMLGUIClient;
50 class ModelColumnManager;
51 class QAbstractItemModel;
52 class QItemSelectionModel;
53 class QModelIndex;
54 class QSplitter;
55 class QStackedWidget;
56 class QuickSearchWidget;
57 class QActionGroup;
58 class CategorySelectWidget;
59 class CategoryFilterProxyModel;
60 class ManageShowCollectionProperties;
61 class KADDRESSBOOK_EXPORT MainWidget : public QWidget
62 {
63     Q_OBJECT
64 
65 public:
66     explicit MainWidget(KXMLGUIClient *guiClient, QWidget *parent = nullptr);
67     ~MainWidget() override;
68 
69     void updateQuickSearchText();
70     const Akonadi::Item::List collectSelectedAllContactsItem();
71 
72     /**
73      * Returns the address book collection that is currently
74      * selected by the user or an invalid collection if no
75      * address book is selected.
76      */
77     Akonadi::Collection currentAddressBook() const;
78 
79     Akonadi::Item::List selectedItems();
80     void initializePluginActions();
81 
82 public Q_SLOTS:
83     void newContact();
84     void newGroup();
85     void print();
86     void printPreview();
87     void configure();
88 
89     void handleCommandLine(const QStringList &arguments);
90 
91 private Q_SLOTS:
92     void slotImportExportActivated(PimCommon::AbstractGenericPluginInterface *interface);
93     void delayedInit();
94 
95     void itemSelected(const Akonadi::Item &item);
96     void itemSelectionChanged(const QModelIndex &, const QModelIndex &);
97     void selectFirstItem();
98 
99     void setActivateViewMode(QAction *action);
100     void setQRCodeShow(bool on);
101 
102     void restoreState();
103     void saveState();
104 
105     void slotGrantleeThemeSelected();
106     void slotGrantleeThemesUpdated();
107     void slotCheckNewCalendar(const QModelIndex &parent, int begin, int end);
108 
109     void slotDebugAkonadiSearch();
110     void slotServerSideSubscription();
111     void slotCurrentCollectionChanged(const Akonadi::Collection &col);
112     void setFocusToTreeView();
113 
114 private:
115     const Akonadi::Item::List collectSelectedAllContactsItem(QItemSelectionModel *model);
116     void initGrantleeThemeName();
117     void setupGui();
118     void setupActions(KActionCollection *);
119     bool showQRCodes();
120     void setViewMode(int mode);
121     void saveSplitterStates() const;
122     void restoreSplitterStates();
123     void initializeImportExportPlugin(KActionCollection *collection);
124     Akonadi::EntityTreeModel *entityTreeModel() const;
125 
126     QAbstractItemModel *allContactsModel();
127 
128     Akonadi::EntityMimeTypeFilterModel *mCollectionTree = nullptr;
129     Akonadi::EntityMimeTypeFilterModel *mItemTree = nullptr;
130     Akonadi::EntityMimeTypeFilterModel *mAllContactsModel = nullptr;
131     Akonadi::ContactsFilterProxyModel *mContactsFilterModel = nullptr;
132     CategoryFilterProxyModel *mCategoryFilterModel = nullptr;
133 
134     QuickSearchWidget *mQuickSearchWidget = nullptr;
135     Akonadi::EntityTreeView *mCollectionView = nullptr;
136     Akonadi::EntityTreeView *mItemView = nullptr;
137     CategorySelectWidget *mCategorySelectWidget = nullptr;
138 
139     QWidget *mDetailsPane = nullptr;
140     QStackedWidget *mDetailsViewStack = nullptr;
141     ContactSwitcher *mContactSwitcher = nullptr;
142 
143     QSplitter *mMainWidgetSplitter1 = nullptr;
144     QSplitter *mMainWidgetSplitter2 = nullptr;
145     Akonadi::ContactViewer *mContactDetails = nullptr;
146     Akonadi::ContactGroupViewer *mContactGroupDetails = nullptr;
147     QWidget *mEmptyDetails = nullptr;
148     Akonadi::StandardContactActionManager *mActionManager = nullptr;
149     QItemSelectionModel *mCollectionSelectionModel = nullptr;
150 
151     QActionGroup *mViewModeGroup = nullptr;
152 
153     ModelColumnManager *mModelColumnManager = nullptr;
154     KXMLGUIClient *mXmlGuiClient = nullptr;
155     KAddressBookGrantlee::GrantleeContactFormatter *mFormatter = nullptr;
156     KAddressBookGrantlee::GrantleeContactGroupFormatter *mGroupFormatter = nullptr;
157     GrantleeTheme::ThemeManager *mGrantleeThemeManager = nullptr;
158     QAction *mQuickSearchAction = nullptr;
159     QAction *mServerSideSubscription = nullptr;
160     QList<KAddressBookImportExport::PluginInterface *> mImportExportPluginInterfaceList;
161     ManageShowCollectionProperties *mManageShowCollectionProperties = nullptr;
162 
163     Akonadi::Item mPendingSelection;
164 };
165 
166