Better wording
[kdepim.git] / kleopatra / systrayicon.cpp
blob3c40ce7a5b9ef7756e14cfad879ff3aa8d0c2095
1 /* -*- mode: c++; c-basic-offset:4 -*-
2 systemtrayicon.cpp
4 This file is part of Kleopatra, the KDE keymanager
5 Copyright (c) 2007 Klarälvdalens Datakonsult AB
7 Kleopatra 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.
12 Kleopatra is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 In addition, as a special exception, the copyright holders give
22 permission to link the code of this program with any edition of
23 the Qt library by Trolltech AS, Norway (or with modified versions
24 of Qt that use the same license as Qt), and distribute linked
25 combinations including the two. You must obey the GNU General
26 Public License in all respects for all of the code used other than
27 Qt. If you modify this file, you may extend this exception to
28 your version of the file, but you are not obligated to do so. If
29 you do not wish to do so, delete this exception statement from
30 your version.
33 #include <config-kleopatra.h>
35 #include "systrayicon.h"
37 #ifndef QT_NO_SYSTEMTRAYICON
39 #include "mainwindow.h"
40 #include "kleopatraapplication.h"
42 #include <smartcard/readerstatus.h>
44 #include <utils/kdsignalblocker.h>
46 #include <commands/importcertificatefromclipboardcommand.h>
47 #include <commands/encryptclipboardcommand.h>
48 #include <commands/signclipboardcommand.h>
49 #include <commands/decryptverifyclipboardcommand.h>
50 #include <commands/setinitialpincommand.h>
51 #include <commands/learncardkeyscommand.h>
53 #include <KIcon>
54 #include <KLocale>
55 #include <KAboutApplicationDialog>
56 #include <KAboutData>
57 #include <KComponentData>
58 #include <KWindowSystem>
60 #include <QMenu>
61 #include <QAction>
62 #include <QTimer>
63 #include <QApplication>
64 #include <QClipboard>
65 #include <QPointer>
67 #include <boost/shared_ptr.hpp>
68 #include <boost/bind.hpp>
70 #include <cassert>
72 using namespace boost;
73 using namespace Kleo;
74 using namespace Kleo::Commands;
75 using namespace Kleo::SmartCard;
77 class SysTrayIcon::Private {
78 friend class ::SysTrayIcon;
79 SysTrayIcon * const q;
80 public:
81 explicit Private( SysTrayIcon * qq );
82 ~Private();
84 private:
85 void slotAbout() {
86 if ( !aboutDialog ) {
87 aboutDialog = new KAboutApplicationDialog( KGlobal::mainComponent().aboutData() );
88 aboutDialog->setAttribute( Qt::WA_DeleteOnClose );
91 if ( aboutDialog->isVisible() )
92 aboutDialog->raise();
93 else
94 aboutDialog->show();
97 void enableDisableActions() {
98 //work around a Qt bug (seen with Qt 4.4.0, Windows): QClipBoard->mimeData() triggers QClipboard::changed(),
99 //triggering slotEnableDisableActions again
100 const KDSignalBlocker blocker( QApplication::clipboard() );
101 openCertificateManagerAction.setEnabled( !q->mainWindow() || !q->mainWindow()->isVisible() );
102 importClipboardAction.setEnabled( ImportCertificateFromClipboardCommand::canImportCurrentClipboard() );
103 encryptClipboardAction.setEnabled( EncryptClipboardCommand::canEncryptCurrentClipboard() );
104 openPGPSignClipboardAction.setEnabled( SignClipboardCommand::canSignCurrentClipboard() );
105 smimeSignClipboardAction.setEnabled( SignClipboardCommand::canSignCurrentClipboard() );
106 decryptVerifyClipboardAction.setEnabled( DecryptVerifyClipboardCommand::canDecryptVerifyCurrentClipboard() );
107 setInitialPinAction.setEnabled( anyCardHasNullPin );
108 learnCertificatesAction.setEnabled( anyCardCanLearnKeys );
110 q->setAttentionWanted( ( anyCardHasNullPin || anyCardCanLearnKeys ) && !q->attentionWindow() );
113 void startCommand( Command * cmd ) {
114 assert( cmd );
115 cmd->setParent( q->mainWindow() );
116 cmd->start();
119 void slotImportClipboard() {
120 startCommand( new ImportCertificateFromClipboardCommand( 0 ) );
123 void slotEncryptClipboard() {
124 startCommand( new EncryptClipboardCommand( 0 ) );
127 void slotOpenPGPSignClipboard() {
128 startCommand( new SignClipboardCommand( GpgME::OpenPGP, 0 ) );
131 void slotSMIMESignClipboard() {
132 startCommand( new SignClipboardCommand( GpgME::CMS, 0 ) );
135 void slotDecryptVerifyClipboard() {
136 startCommand( new DecryptVerifyClipboardCommand( 0 ) );
139 void slotSetInitialPin() {
140 SetInitialPinCommand * cmd = new SetInitialPinCommand;
141 q->setAttentionWindow( cmd->dialog() );
142 startCommand( cmd );
145 void slotLearnCertificates() {
146 LearnCardKeysCommand * cmd = new LearnCardKeysCommand( GpgME::CMS );
147 q->setAttentionWindow( cmd->dialog() );
148 startCommand( cmd );
151 private:
152 bool anyCardHasNullPin;
153 bool anyCardCanLearnKeys;
155 QMenu menu;
156 QAction openCertificateManagerAction;
157 QAction configureAction;
158 QAction aboutAction;
159 QAction quitAction;
160 QMenu clipboardMenu;
161 QAction importClipboardAction;
162 QAction encryptClipboardAction;
163 QAction smimeSignClipboardAction;
164 QAction openPGPSignClipboardAction;
165 QAction decryptVerifyClipboardAction;
166 QMenu cardMenu;
167 QAction updateCardStatusAction;
168 QAction setInitialPinAction;
169 QAction learnCertificatesAction;
171 QPointer<KAboutApplicationDialog> aboutDialog;
173 QRect mainWindowPreviousGeometry;
176 SysTrayIcon::Private::Private( SysTrayIcon * qq )
177 : q( qq ),
178 anyCardHasNullPin( false ),
179 anyCardCanLearnKeys( false ),
180 menu(),
181 openCertificateManagerAction( i18n("&Open Certificate Manager..."), q ),
182 configureAction( i18n("&Configure %1...", KGlobal::mainComponent().aboutData()->programName() ), q ),
183 aboutAction( i18n("&About %1...", KGlobal::mainComponent().aboutData()->programName() ), q ),
184 quitAction( i18n("&Shutdown Kleopatra"), q ),
185 clipboardMenu( i18n("Clipboard" ) ),
186 importClipboardAction( i18n("Certificate Import"), q ),
187 encryptClipboardAction( i18n("Encrypt..."), q ),
188 smimeSignClipboardAction( i18n("S/MIME-Sign..."), q ),
189 openPGPSignClipboardAction( i18n("OpenPGP-Sign..."), q ),
190 decryptVerifyClipboardAction( i18n("Decrypt/Verify..."), q ),
191 cardMenu( i18n("SmartCard") ),
192 updateCardStatusAction( i18n("Update Card Status"), q ),
193 setInitialPinAction( i18n("Set NetKey v3 Initial PIN..."), q ),
194 learnCertificatesAction( i18n("Learn NetKey v3 Card Certificates"), q ),
195 aboutDialog(),
196 mainWindowPreviousGeometry()
198 q->setNormalIcon( KIcon( "kleopatra" ) );
199 q->setAttentionIcon( KIcon( "secure-card" ) );
201 KDAB_SET_OBJECT_NAME( menu );
202 KDAB_SET_OBJECT_NAME( openCertificateManagerAction );
203 KDAB_SET_OBJECT_NAME( configureAction );
204 KDAB_SET_OBJECT_NAME( aboutAction );
205 KDAB_SET_OBJECT_NAME( quitAction );
206 KDAB_SET_OBJECT_NAME( clipboardMenu );
207 KDAB_SET_OBJECT_NAME( importClipboardAction );
208 KDAB_SET_OBJECT_NAME( encryptClipboardAction );
209 KDAB_SET_OBJECT_NAME( smimeSignClipboardAction );
210 KDAB_SET_OBJECT_NAME( openPGPSignClipboardAction );
211 KDAB_SET_OBJECT_NAME( decryptVerifyClipboardAction );
212 KDAB_SET_OBJECT_NAME( cardMenu );
213 KDAB_SET_OBJECT_NAME( setInitialPinAction );
214 KDAB_SET_OBJECT_NAME( learnCertificatesAction );
216 connect( &openCertificateManagerAction, SIGNAL(triggered()), qApp, SLOT(openOrRaiseMainWindow()) );
217 connect( &configureAction, SIGNAL(triggered()), qApp, SLOT(openOrRaiseConfigDialog()) );
218 connect( &aboutAction, SIGNAL(triggered()), q, SLOT(slotAbout()) );
219 connect( &quitAction, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit()) );
220 connect( &importClipboardAction, SIGNAL(triggered()), q, SLOT(slotImportClipboard()) );
221 connect( &encryptClipboardAction, SIGNAL(triggered()), q, SLOT(slotEncryptClipboard()) );
222 connect( &smimeSignClipboardAction, SIGNAL(triggered()), q, SLOT(slotSMIMESignClipboard()) );
223 connect( &openPGPSignClipboardAction, SIGNAL(triggered()), q, SLOT(slotOpenPGPSignClipboard()) );
224 connect( &decryptVerifyClipboardAction, SIGNAL(triggered()), q, SLOT(slotDecryptVerifyClipboard()) );
225 connect( &updateCardStatusAction, SIGNAL(triggered()), ReaderStatus::instance(), SLOT(updateStatus()) );
226 connect( &setInitialPinAction, SIGNAL(triggered()), q, SLOT(slotSetInitialPin()) );
227 connect( &learnCertificatesAction, SIGNAL(triggered()), q, SLOT(slotLearnCertificates()) );
229 connect( QApplication::clipboard(), SIGNAL(changed(QClipboard::Mode)),
230 q, SLOT(slotEnableDisableActions()) );
232 menu.addAction( &openCertificateManagerAction );
233 menu.addAction( &configureAction );
234 menu.addAction( &aboutAction );
235 menu.addSeparator();
236 menu.addMenu( &clipboardMenu );
237 clipboardMenu.addAction( &importClipboardAction );
238 clipboardMenu.addAction( &encryptClipboardAction );
239 clipboardMenu.addAction( &smimeSignClipboardAction );
240 clipboardMenu.addAction( &openPGPSignClipboardAction );
241 clipboardMenu.addAction( &decryptVerifyClipboardAction );
242 menu.addSeparator();
243 menu.addMenu( &cardMenu );
244 cardMenu.addAction( &updateCardStatusAction );
245 cardMenu.addAction( &setInitialPinAction );
246 cardMenu.addAction( &learnCertificatesAction );
247 menu.addSeparator();
248 menu.addAction( &quitAction );
250 q->setContextMenu( &menu );
253 SysTrayIcon::Private::~Private() {}
255 SysTrayIcon::SysTrayIcon( QObject * p )
256 : SystemTrayIcon( p ), d( new Private( this ) )
258 KGlobal::ref();
259 slotEnableDisableActions();
262 SysTrayIcon::~SysTrayIcon() {
263 KGlobal::deref();
266 void SysTrayIcon::doMainWindowSet( QWidget * mw ) {
267 if ( mw && !mw->isVisible() && d->mainWindowPreviousGeometry.isValid() )
268 mw->setGeometry( d->mainWindowPreviousGeometry );
271 void SysTrayIcon::doMainWindowClosed( QWidget * mw ) {
272 d->mainWindowPreviousGeometry = mw->geometry();
275 MainWindow * SysTrayIcon::mainWindow() const {
276 return static_cast<MainWindow*>( SystemTrayIcon::mainWindow() );
279 QDialog * SysTrayIcon::attentionWindow() const {
280 return static_cast<QDialog*>( SystemTrayIcon::attentionWindow() );
283 void SysTrayIcon::doActivated() {
284 if ( const QWidget * const aw = attentionWindow() )
285 if ( aw->isVisible() )
286 return; // ignore clicks while an attention window is open.
287 if ( d->anyCardHasNullPin )
288 d->slotSetInitialPin();
289 else if ( d->anyCardCanLearnKeys )
290 d->slotLearnCertificates();
291 else
292 KleopatraApplication::instance()->openOrRaiseMainWindow();
295 void SysTrayIcon::setAnyCardHasNullPin( bool on ) {
296 if ( d->anyCardHasNullPin == on )
297 return;
298 d->anyCardHasNullPin = on;
299 slotEnableDisableActions();
302 void SysTrayIcon::setAnyCardCanLearnKeys( bool on ) {
303 if ( d->anyCardCanLearnKeys == on )
304 return;
305 d->anyCardCanLearnKeys = on;
306 slotEnableDisableActions();
309 void SysTrayIcon::slotEnableDisableActions() {
310 d->enableDisableActions();
313 #include "moc_systrayicon.cpp"
315 #endif // QT_NO_SYSTEMTRAYICON