• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

kleopatra

  • sources
  • kde-4.12
  • kdepim
  • kleopatra
mainwindow_desktop.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset:4 -*-
2  mainwindow_desktop.cpp
3 
4  This file is part of Kleopatra, the KDE keymanager
5  Copyright (c) 2007 Klarälvdalens Datakonsult AB
6 
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.
11 
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.
16 
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
20 
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.
31 */
32 
33 #include <config-kleopatra.h>
34 
35 #include "mainwindow_desktop.h"
36 #include "aboutdata.h"
37 
38 #include "models/keylistmodel.h"
39 #include "models/keylistsortfilterproxymodel.h"
40 
41 #include "view/searchbar.h"
42 #include "view/tabwidget.h"
43 #include "view/keylistcontroller.h"
44 
45 #include "commands/selftestcommand.h"
46 #include "commands/importcrlcommand.h"
47 #include "commands/importcertificatefromfilecommand.h"
48 #include "commands/decryptverifyfilescommand.h"
49 #include "commands/signencryptfilescommand.h"
50 
51 #include "utils/detail_p.h"
52 #include "utils/gnupg-helper.h"
53 #include "utils/action_data.h"
54 #include "utils/classify.h"
55 #include "utils/filedialog.h"
56 
57 // from libkdepim
58 #include "progresswidget/statusbarprogresswidget.h"
59 #include "progresswidget/progressdialog.h"
60 
61 #include <KApplication>
62 #include <KActionCollection>
63 #include <KLocale>
64 #include <KTabWidget>
65 #include <KStatusBar>
66 #include <KStandardAction>
67 #include <KAction>
68 #include <KAboutData>
69 #include <KMessageBox>
70 #include <KStandardGuiItem>
71 #include <KStandardDirs>
72 #include <KShortcutsDialog>
73 #include <KXMLGUIFactory>
74 #include <KEditToolBar>
75 #include <KAboutApplicationDialog>
76 #include <kdebug.h>
77 
78 #include <QAbstractItemView>
79 #include <QFile>
80 #include <QToolBar>
81 #include <QApplication>
82 #include <QCloseEvent>
83 #include <QMenu>
84 #include <QTimer>
85 #include <QProcess>
86 #include <QPointer>
87 
88 #include <kleo/cryptobackendfactory.h>
89 #include <ui/cryptoconfigdialog.h>
90 #include <kleo/cryptoconfig.h>
91 #include <kleo/stl_util.h>
92 
93 #include <boost/bind.hpp>
94 #include <boost/shared_ptr.hpp>
95 
96 #include <vector>
97 
98 #ifdef Q_OS_WIN32
99 static const bool OS_WIN = true;
100 #else
101 static const bool OS_WIN = false;
102 #endif
103 
104 using namespace Kleo;
105 using namespace Kleo::Commands;
106 using namespace boost;
107 using namespace GpgME;
108 
109 namespace {
110 
111  static const KAboutData * aboutGpg4WinData() {
112  static const AboutGpg4WinData data;
113  return &data;
114  }
115 
116 }
117 
118 static KGuiItem KStandardGuiItem_quit() {
119  static const QString app = KGlobal::mainComponent().aboutData()->programName();
120  KGuiItem item = KStandardGuiItem::quit();
121  item.setText( i18nc( "Quit [ApplicationName]", "&Quit %1", app ) );
122  return item;
123 }
124 
125 static KGuiItem KStandardGuiItem_close() {
126  KGuiItem item = KStandardGuiItem::close();
127  item.setText( i18n("Only &Close Window" ) );
128  return item;
129 }
130 
131 static bool isQuitting = false;
132 
133 class MainWindow::Private {
134  friend class ::MainWindow;
135  MainWindow * const q;
136 
137 public:
138  explicit Private( MainWindow * qq );
139  ~Private();
140 
141  template <typename T>
142  void createAndStart() {
143  ( new T( this->currentView(), &this->controller ) )->start();
144  }
145  template <typename T>
146  void createAndStart( QAbstractItemView * view ) {
147  ( new T( view, &this->controller ) )->start();
148  }
149  template <typename T>
150  void createAndStart( const QStringList & a ) {
151  ( new T( a, this->currentView(), &this->controller ) )->start();
152  }
153  template <typename T>
154  void createAndStart( const QStringList & a, QAbstractItemView * view ) {
155  ( new T( a, view, &this->controller ) )->start();
156  }
157 
158  void closeAndQuit() {
159  const QString app = KGlobal::mainComponent().aboutData()->programName();
160  const int rc = KMessageBox::questionYesNoCancel( q,
161  i18n("%1 may be used by other applications as a service.\n"
162  "You may instead want to close this window without exiting %1.", app ),
163  i18n("Really Quit?"), KStandardGuiItem_close(), KStandardGuiItem_quit(), KStandardGuiItem::cancel(),
164  QLatin1String("really-quit-") + app.toLower() );
165  if ( rc == KMessageBox::Cancel )
166  return;
167  isQuitting = true;
168  if ( !q->close() )
169  return;
170  // WARNING: 'this' might be deleted at this point!
171  if ( rc == KMessageBox::No )
172  qApp->quit();
173  }
174  void configureToolbars() {
175  KEditToolBar dlg( q->factory() );
176  dlg.exec();
177  }
178  void editKeybindings() {
179  KShortcutsDialog::configure( q->actionCollection(), KShortcutsEditor::LetterShortcutsAllowed );
180  }
181 
182  void selfTest() {
183  createAndStart<SelfTestCommand>();
184  }
185  void configureBackend();
186 
187  void showHandbook();
188 
189  void gnupgLogViewer() {
190  if( !QProcess::startDetached(QLatin1String("kwatchgnupg") ) )
191  KMessageBox::error( q, i18n( "Could not start the GnuPG Log Viewer (kwatchgnupg). "
192  "Please check your installation." ),
193  i18n( "Error Starting KWatchGnuPG" ) );
194  }
195 
196  void gnupgAdministrativeConsole() {
197  if( !QProcess::startDetached(QLatin1String("kgpgconf") ) )
198  KMessageBox::error( q, i18n( "Could not start the GnuPG Administrative Console (kgpgconf). "
199  "Please check your installation." ),
200  i18n( "Error Starting KGpgConf" ) );
201  }
202 
203  void slotConfigCommitted();
204  void slotContextMenuRequested( QAbstractItemView *, const QPoint & p ) {
205  if ( QMenu * const menu = qobject_cast<QMenu*>( q->factory()->container( QLatin1String("listview_popup"), q ) ) )
206  menu->exec( p );
207  else
208  kDebug() << "no \"listview_popup\" <Menu> in kleopatra's ui.rc file";
209  }
210 
211  void aboutGpg4Win() {
212  ( new KAboutApplicationDialog( aboutGpg4WinData(), KAboutApplicationDialog::HideKdeVersion|KAboutApplicationDialog::HideTranslators, q ) )->show();
213  }
214 
215 private:
216  void setupActions();
217 
218  QAbstractItemView * currentView() const {
219  return ui.tabWidget.currentView();
220  }
221 
222 private:
223  Kleo::KeyListController controller;
224  bool firstShow : 1;
225 
226  struct UI {
227 
228  TabWidget tabWidget;
229 
230  explicit UI( MainWindow * q )
231  : tabWidget( q )
232  {
233  KDAB_SET_OBJECT_NAME( tabWidget );
234 
235  q->setCentralWidget(&tabWidget);
236  KPIM::ProgressDialog * progressDialog = new KPIM::ProgressDialog( q->statusBar(), q );
237  KDAB_SET_OBJECT_NAME( progressDialog );
238  progressDialog->hide();
239  KPIM::StatusbarProgressWidget * statusBarProgressWidget
240  = new KPIM::StatusbarProgressWidget( progressDialog, q->statusBar() );
241  KDAB_SET_OBJECT_NAME( statusBarProgressWidget );
242  q->statusBar()->addPermanentWidget( statusBarProgressWidget, 0 );
243  statusBarProgressWidget->show();
244  }
245  } ui;
246 };
247 
248 MainWindow::Private::Private( MainWindow * qq )
249  : q( qq ),
250  controller( q ),
251  firstShow( true ),
252  ui( q )
253 {
254  KDAB_SET_OBJECT_NAME( controller );
255 
256  AbstractKeyListModel * flatModel = AbstractKeyListModel::createFlatKeyListModel( q );
257  AbstractKeyListModel * hierarchicalModel = AbstractKeyListModel::createHierarchicalKeyListModel( q );
258 
259  KDAB_SET_OBJECT_NAME( flatModel );
260  KDAB_SET_OBJECT_NAME( hierarchicalModel );
261 
262 
263  controller.setFlatModel( flatModel );
264  controller.setHierarchicalModel( hierarchicalModel );
265  controller.setTabWidget( &ui.tabWidget );
266 
267  ui.tabWidget.setFlatModel( flatModel );
268  ui.tabWidget.setHierarchicalModel( hierarchicalModel );
269 
270  setupActions();
271 
272  connect( &controller, SIGNAL(message(QString,int)), q->statusBar(), SLOT(showMessage(QString,int)) );
273  connect( &controller, SIGNAL(contextMenuRequested(QAbstractItemView*,QPoint)),
274  q, SLOT(slotContextMenuRequested(QAbstractItemView*,QPoint)) );
275 
276  q->createGUI( QLatin1String("kleopatra.rc") );
277 
278  q->setAcceptDrops( true );
279 
280  q->setAutoSaveSettings();
281 }
282 
283 MainWindow::Private::~Private() {}
284 
285 MainWindow::MainWindow( QWidget* parent, Qt::WindowFlags flags )
286  : KXmlGuiWindow( parent, flags ), d( new Private( this ) )
287 {
288 }
289 
290 MainWindow::~MainWindow() {}
291 
292 
293 void MainWindow::Private::setupActions() {
294 
295  KActionCollection * const coll = q->actionCollection();
296 
297  KAction * const searchBarAction = new KAction( q );
298  SearchBar * const searchBar = new SearchBar( q );
299 
300  ui.tabWidget.connectSearchBar( searchBar );
301 
302  searchBarAction->setDefaultWidget( searchBar );
303  coll->addAction( QLatin1String("key_search_bar"), searchBarAction );
304 
305  const action_data action_data[] = {
306  // most have been MOVED TO keylistcontroller.cpp
307  // Tools menu
308 #ifndef Q_OS_WIN
309  { "tools_start_kwatchgnupg", i18n("GnuPG Log Viewer"), QString(),
310  "kwatchgnupg", q, SLOT(gnupgLogViewer()), QString(), false, true },
311 #endif
312 #if 0
313  { "tools_start_kgpgconf", i18n("GnuPG Administrative Console"), QString(),
314  "kgpgconf", q, SLOT(gnupgLogViewer()), QString(), false, true },
315 #endif
316  // most have been MOVED TO keylistcontroller.cpp
317 #if 0
318  { "configure_backend", i18n("Configure GnuPG Backend..."), QString(),
319  0, q, SLOT(configureBackend()), QString(), false, true },
320 #endif
321  // Settings menu
322  { "settings_self_test", i18n("Perform Self-Test"), QString(),
323  0, q, SLOT(selfTest()), QString(), false, true },
324  // Help menu
325 #ifdef Q_WS_WIN
326  { "help_about_gpg4win", i18n("About Gpg4win"), QString(),
327  "gpg4win-compact", q, SLOT(aboutGpg4Win()), QString(), false, true },
328 #endif
329  // most have been MOVED TO keylistcontroller.cpp
330  };
331 
332  make_actions_from_data( action_data, /*sizeof action_data / sizeof *action_data,*/ coll );
333 
334  if ( QAction * action = coll->action( QLatin1String("configure_backend") ) )
335  action->setMenuRole( QAction::NoRole ); //prevent Qt OS X heuristics for config* actions
336 
337  KStandardAction::close( q, SLOT(close()), coll );
338  KStandardAction::quit( q, SLOT(closeAndQuit()), coll );
339  KStandardAction::configureToolbars( q, SLOT(configureToolbars()), coll );
340  KStandardAction::keyBindings( q, SLOT(editKeybindings()), coll );
341  KStandardAction::preferences( qApp, SLOT(openOrRaiseConfigDialog()), coll );
342 
343  q->createStandardStatusBarAction();
344  q->setStandardToolBarMenuEnabled( true );
345 
346  controller.createActions( coll );
347 
348  ui.tabWidget.createActions( coll );
349 }
350 
351 void MainWindow::Private::configureBackend() {
352  Kleo::CryptoConfig * const config = Kleo::CryptoBackendFactory::instance()->config();
353  if ( !config ) {
354  KMessageBox::error( q, i18n( "Could not configure the cryptography backend (gpgconf tool not found)" ), i18n( "Configuration Error" ) );
355  return;
356  }
357 
358  Kleo::CryptoConfigDialog dlg( config );
359 
360  const int result = dlg.exec();
361 
362  // Forget all data parsed from gpgconf, so that we show updated information
363  // when reopening the configuration dialog.
364  config->clear();
365 
366  if ( result == QDialog::Accepted ) {
367 #if 0
368  // Tell other apps (e.g. kmail) that the gpgconf data might have changed
369  QDBusMessage message =
370  QDBusMessage::createSignal(QString(), "org.kde.kleo.CryptoConfig", "changed");
371  QDBusConnection::sessionBus().send(message);
372 #endif
373  }
374 }
375 
376 void MainWindow::Private::slotConfigCommitted() {
377  controller.updateConfig();
378 }
379 
380 void MainWindow::closeEvent( QCloseEvent * e ) {
381  // KMainWindow::closeEvent() insists on quitting the application,
382  // so do not let it touch the event...
383  kDebug();
384  if ( d->controller.hasRunningCommands() ) {
385  if ( d->controller.shutdownWarningRequired() ) {
386  const int ret = KMessageBox::warningContinueCancel( this, i18n("There are still some background operations ongoing. "
387  "These will be terminated when closing the window. "
388  "Proceed?"),
389  i18n("Ongoing Background Tasks") );
390  if ( ret != KMessageBox::Continue ) {
391  e->ignore();
392  return;
393  }
394  }
395  d->controller.cancelCommands();
396  if ( d->controller.hasRunningCommands() ) {
397  // wait for them to be finished:
398  setEnabled( false );
399  QEventLoop ev;
400  QTimer::singleShot( 100, &ev, SLOT(quit()) );
401  connect( &d->controller, SIGNAL(commandsExecuting(bool)), &ev, SLOT(quit()) );
402  ev.exec();
403  kWarning( d->controller.hasRunningCommands() )
404  << "controller still has commands running, this may crash now...";
405  setEnabled( true );
406  }
407  }
408  if ( isQuitting || kapp->sessionSaving() ) {
409  d->ui.tabWidget.saveViews( KGlobal::config().data() );
410  saveMainWindowSettings( KConfigGroup( KGlobal::config(), autoSaveGroup() ) );
411  e->accept();
412  } else {
413  e->ignore();
414  hide();
415  }
416 }
417 
418 void MainWindow::showEvent( QShowEvent * e ) {
419  KXmlGuiWindow::showEvent( e );
420  if ( d->firstShow ) {
421  d->ui.tabWidget.loadViews( KGlobal::config().data() );
422  d->firstShow = false;
423  }
424 
425  if ( !savedGeometry.isEmpty() ) {
426  restoreGeometry( savedGeometry );
427  }
428 
429 }
430 
431 void MainWindow::hideEvent( QHideEvent * e )
432 {
433  savedGeometry = saveGeometry();
434  KXmlGuiWindow::hideEvent( e );
435 }
436 
437 
438 void MainWindow::importCertificatesFromFile( const QStringList & files ) {
439  if ( !files.empty() )
440  d->createAndStart<ImportCertificateFromFileCommand>( files );
441 }
442 
443 
444 static QStringList extract_local_files( const QMimeData * data ) {
445  const QList<QUrl> urls = data->urls();
446  // begin workaround KDE/Qt misinterpretation of text/uri-list
447  QList<QUrl>::const_iterator end = urls.end();
448  if ( urls.size() > 1 && !urls.back().isValid() )
449  --end;
450  // end workaround
451  QStringList result;
452  std::transform( urls.begin(), end,
453  std::back_inserter( result ),
454  boost::bind( &QUrl::toLocalFile, _1 ) );
455  result.erase( std::remove_if( result.begin(), result.end(),
456  boost::bind( &QString::isEmpty, _1 ) ), result.end() );
457  return result;
458 }
459 
460 static bool can_decode_local_files( const QMimeData * data ) {
461  if ( !data )
462  return false;
463  return !extract_local_files( data ).empty();
464 }
465 
466 void MainWindow::dragEnterEvent( QDragEnterEvent * e ) {
467  kDebug();
468 
469  if ( can_decode_local_files( e->mimeData() ) )
470  e->acceptProposedAction();
471 }
472 
473 void MainWindow::dropEvent( QDropEvent * e ) {
474  kDebug();
475 
476  if ( !can_decode_local_files( e->mimeData() ) )
477  return;
478 
479  e->setDropAction( Qt::CopyAction );
480 
481  const QStringList files = extract_local_files( e->mimeData() );
482 
483  const unsigned int classification = classify( files );
484 
485  QMenu menu;
486 
487  QAction * const signEncrypt = menu.addAction( i18n("Sign/Encrypt...") );
488  QAction * const decryptVerify = mayBeAnyMessageType( classification ) ? menu.addAction( i18n("Decrypt/Verify...") ) : 0 ;
489  if ( signEncrypt || decryptVerify )
490  menu.addSeparator();
491 
492  QAction * const importCerts = mayBeAnyCertStoreType( classification ) ? menu.addAction( i18n("Import Certificates") ) : 0 ;
493  QAction * const importCRLs = mayBeCertificateRevocationList( classification ) ? menu.addAction( i18n("Import CRLs") ) : 0 ;
494  if ( importCerts || importCRLs )
495  menu.addSeparator();
496 
497  if ( !signEncrypt && !decryptVerify && !importCerts && !importCRLs )
498  return;
499 
500  menu.addAction( i18n("Cancel") );
501 
502  const QAction * const chosen = menu.exec( mapToGlobal( e->pos() ) );
503 
504  if ( !chosen )
505  return;
506 
507  if ( chosen == signEncrypt )
508  d->createAndStart<SignEncryptFilesCommand>( files );
509  else if ( chosen == decryptVerify )
510  d->createAndStart<DecryptVerifyFilesCommand>( files );
511  else if ( chosen == importCerts )
512  d->createAndStart<ImportCertificateFromFileCommand>( files );
513  else if ( chosen == importCRLs )
514  d->createAndStart<ImportCrlCommand>( files );
515 
516  e->accept();
517 }
518 
519 void MainWindow::readProperties( const KConfigGroup & cg )
520 {
521  kDebug();
522  KXmlGuiWindow::readProperties(cg);
523  savedGeometry = cg.readEntry("savedGeometry", QByteArray() );
524  if ( !savedGeometry.isEmpty() ) {
525  restoreGeometry( savedGeometry );
526  }
527 
528  if (! cg.readEntry<bool>("hidden", false))
529  show();
530 }
531 
532 void MainWindow::saveProperties( KConfigGroup & cg )
533 {
534  kDebug();
535  KXmlGuiWindow::saveProperties( cg );
536  cg.writeEntry( "hidden", isHidden() );
537  if ( isHidden() ) {
538  cg.writeEntry( "savedGeometry", savedGeometry );
539  } else {
540  cg.writeEntry( "savedGeometry", saveGeometry() );
541  }
542 }
543 
544 #include "moc_mainwindow_desktop.cpp"
flags
static const char * flags[]
Definition: readerstatus.cpp:115
MainWindow::showEvent
void showEvent(QShowEvent *e)
Definition: mainwindow_desktop.cpp:418
decryptverifyfilescommand.h
MainWindow::dropEvent
void dropEvent(QDropEvent *)
Definition: mainwindow_desktop.cpp:473
KStandardGuiItem_quit
static KGuiItem KStandardGuiItem_quit()
Definition: mainwindow_desktop.cpp:118
keylistcontroller.h
OS_WIN
static const bool OS_WIN
Definition: mainwindow_desktop.cpp:101
MainWindow::savedGeometry
QByteArray savedGeometry
Definition: mainwindow_desktop.h:50
Kleo::TabWidget
Definition: tabwidget.h:56
extract_local_files
static QStringList extract_local_files(const QMimeData *data)
Definition: mainwindow_desktop.cpp:444
Kleo::KeyListController
Definition: keylistcontroller.h:55
Kleo::Commands::DecryptVerifyFilesCommand
Definition: commands/decryptverifyfilescommand.h:45
QWidget
MainWindow::hideEvent
void hideEvent(QHideEvent *e)
Definition: mainwindow_desktop.cpp:431
classify.h
Kleo::SearchBar
Definition: searchbar.h:48
Kleo::ImportCertificateFromFileCommand
Definition: importcertificatefromfilecommand.h:42
MainWindow::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *)
Definition: mainwindow_desktop.cpp:466
AboutGpg4WinData
Definition: aboutdata.h:43
MainWindow::importCertificatesFromFile
void importCertificatesFromFile(const QStringList &files)
Definition: mainwindow_desktop.cpp:438
MainWindow::readProperties
void readProperties(const KConfigGroup &cg)
Definition: mainwindow_desktop.cpp:519
d
#define d
Definition: adduseridcommand.cpp:90
tabwidget.h
KXmlGuiWindow
isQuitting
static bool isQuitting
Definition: mainwindow_desktop.cpp:131
action_data.h
Kleo::Commands::ImportCrlCommand
Definition: importcrlcommand.h:43
keylistsortfilterproxymodel.h
aboutdata.h
KDAB_SET_OBJECT_NAME
#define KDAB_SET_OBJECT_NAME(x)
Definition: kdtoolsglobal.h:66
MainWindow::closeEvent
void closeEvent(QCloseEvent *e)
Definition: mainwindow_desktop.cpp:380
KAboutData
importcrlcommand.h
selftestcommand.h
MainWindow::saveProperties
void saveProperties(KConfigGroup &cg)
Definition: mainwindow_desktop.cpp:532
gnupg-helper.h
Kleo::action_data
Definition: action_data.h:44
Kleo::AbstractKeyListModel
Definition: keylistmodel.h:49
keylistmodel.h
Kleo::classify
unsigned int classify(const QString &filename)
Definition: classify.cpp:154
signencryptfilescommand.h
can_decode_local_files
static bool can_decode_local_files(const QMimeData *data)
Definition: mainwindow_desktop.cpp:460
searchbar.h
q
#define q
Definition: adduseridcommand.cpp:91
detail_p.h
mainwindow_desktop.h
KStandardGuiItem_close
static KGuiItem KStandardGuiItem_close()
Definition: mainwindow_desktop.cpp:125
Kleo::Commands::SignEncryptFilesCommand
Definition: commands/signencryptfilescommand.h:47
MainWindow::~MainWindow
~MainWindow()
Definition: mainwindow.cpp:100
Kleo::make_actions_from_data
void make_actions_from_data(const action_data *data, unsigned int numData, KActionCollection *collection)
Definition: action_data.cpp:66
MainWindow::MainWindow
MainWindow(QWidget *parent=0, Qt::WindowFlags flags=0)
Definition: mainwindow.cpp:52
MainWindow
Definition: kgpgconf/mainwindow.h:47
importcertificatefromfilecommand.h
QList
Definition: commands/command.h:46
filedialog.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:56:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kleopatra

Skip menu "kleopatra"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal