summaryrefslogtreecommitdiffstats
path: root/kmymoney2/dialogs/kgpgkeyselectiondlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/dialogs/kgpgkeyselectiondlg.cpp')
-rw-r--r--kmymoney2/dialogs/kgpgkeyselectiondlg.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/kmymoney2/dialogs/kgpgkeyselectiondlg.cpp b/kmymoney2/dialogs/kgpgkeyselectiondlg.cpp
new file mode 100644
index 0000000..37ddcc5
--- /dev/null
+++ b/kmymoney2/dialogs/kgpgkeyselectiondlg.cpp
@@ -0,0 +1,149 @@
+/***************************************************************************
+ kgpgkeyselectiondlg.cpp
+ -------------------
+ copyright : (C) 2008 by Thomas Baumgart
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// ----------------------------------------------------------------------------
+// QT Includes
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+#include <klocale.h>
+#include <keditlistbox.h>
+#include <kled.h>
+
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include "kgpgkeyselectiondlg.h"
+#include <kmymoney/kgpgfile.h>
+
+KGpgKeySelectionDlg::KGpgKeySelectionDlg(QWidget *parent, const char *name) :
+ KDialogBase(parent, name, true, i18n("Select additional keys"), Ok | Cancel),
+ m_needCheckList(true),
+ m_listOk(false),
+ m_checkCount(0)
+{
+ QWidget* page = new QWidget(this);
+ setMainWidget(page);
+ QVBoxLayout* topLayout = new QVBoxLayout(page, 0, spacingHint());
+
+ m_listBox = new KEditListBox(page);
+ m_listBox->setTitle(i18n("User identification"));
+ m_listBox->setButtons( int( KEditListBox::Remove | KEditListBox::Add ) );
+ QWhatsThis::add( m_listBox, i18n( "Enter the id of the key you want to use for data encryption. This can either be an e-mail address or the hexadecimal key id. In case of the key id don't forget the leading 0x." ) );
+
+ topLayout->addWidget(m_listBox);
+
+ // add a LED for the availability of all keys
+ QHBoxLayout* ledBox = new QHBoxLayout(0, 0, 6, "ledBoxLayout");
+ m_keyLed = new KLed(page);
+ m_keyLed->setShape( KLed::Circular );
+ m_keyLed->setLook( KLed::Sunken );
+
+ ledBox->addWidget(m_keyLed);
+ ledBox->addWidget(new QLabel(i18n("Keys for all of the above user ids found"), page));
+ ledBox->addItem(new QSpacerItem( 50, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ));
+
+ topLayout->addLayout(ledBox);
+
+ connect(m_listBox, SIGNAL(changed()), this, SLOT(slotIdChanged()));
+ connect(m_listBox, SIGNAL(added(const QString&)), this, SLOT(slotKeyListChanged()));
+ connect(m_listBox, SIGNAL(removed(const QString&)), this, SLOT(slotKeyListChanged()));
+}
+
+void KGpgKeySelectionDlg::setKeys(const QStringList& list)
+{
+ m_listBox->clear();
+ m_listBox->insertStringList(list);
+ slotKeyListChanged();
+}
+
+#if 0
+void KGpgKeySelectionDlg::slotShowHelp(void)
+{
+ QString anchor = m_helpAnchor[m_criteriaTab->currentPage()];
+ if(anchor.isEmpty())
+ anchor = QString("details.search");
+
+ kapp->invokeHelp(anchor);
+}
+#endif
+
+void KGpgKeySelectionDlg::slotKeyListChanged(void)
+{
+ m_needCheckList = true;
+ slotIdChanged();
+}
+
+void KGpgKeySelectionDlg::slotIdChanged(void)
+{
+ // this looks a bit awkward. Here's why: KGPGFile::keyAvailable() starts
+ // an external task and processes UI events while it waits for the external
+ // process to finish. Thus, the first time we get here, the external process
+ // is started and the user may press a second key which calls this routine
+ // again.
+ //
+ // The second invocation is counted, but the check is not started until the
+ // first one finishes. Once the external process finishes, we check if we
+ // were called in the meantime and restart the check.
+ if(++m_checkCount == 1) {
+ while(1) {
+ // first we check the current edit field if filled
+ bool keysOk = true;
+ if(!m_listBox->currentText().isEmpty()) {
+ keysOk = KGPGFile::keyAvailable(m_listBox->currentText());
+ }
+
+ // if it is available, then scan the current list if we need to
+ if(keysOk) {
+ if(m_needCheckList) {
+ QStringList keys = m_listBox->items();
+ QStringList::const_iterator it_s;
+ for(it_s = keys.begin(); keysOk && it_s != keys.end(); ++it_s) {
+ if(!KGPGFile::keyAvailable(*it_s))
+ keysOk = false;
+ }
+ m_listOk = keysOk;
+ m_needCheckList = false;
+
+ } else {
+ keysOk = m_listOk;
+ }
+ }
+
+ // did we receive some more requests to check?
+ if(m_checkCount > 1) {
+ m_checkCount = 1;
+ continue;
+ }
+
+ m_keyLed->setState(static_cast<KLed::State>(keysOk && (m_listBox->items().count() != 0) ? KLed::On : KLed::Off));
+ enableButtonOK((m_listBox->items().count() == 0) || (m_keyLed->state() == KLed::On));
+ break;
+ }
+
+ --m_checkCount;
+ }
+}
+
+
+#include "kgpgkeyselectiondlg.moc"
+
+// vim:cin:si:ai:et:ts=2:sw=2: