summaryrefslogtreecommitdiffstats
path: root/kmymoney2/dialogs/mymoneyqifprofileeditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/dialogs/mymoneyqifprofileeditor.cpp')
-rw-r--r--kmymoney2/dialogs/mymoneyqifprofileeditor.cpp483
1 files changed, 483 insertions, 0 deletions
diff --git a/kmymoney2/dialogs/mymoneyqifprofileeditor.cpp b/kmymoney2/dialogs/mymoneyqifprofileeditor.cpp
new file mode 100644
index 0000000..cc43ced
--- /dev/null
+++ b/kmymoney2/dialogs/mymoneyqifprofileeditor.cpp
@@ -0,0 +1,483 @@
+/***************************************************************************
+ kqifprofileeditor.cpp - description
+ -------------------
+ begin : Tue Dec 24 2002
+ copyright : (C) 2002 by Thomas Baumgart
+ email : thb@net-bembel.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 <qpushbutton.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qtabwidget.h>
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+#include "kdecompat.h"
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <kcombobox.h>
+#include <kurlrequester.h>
+#include <kiconloader.h>
+#include <kapplication.h>
+
+#if KDE_IS_VERSION(3,2,0)
+ #include <kinputdialog.h>
+#else
+ #include <klineeditdlg.h>
+#endif
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include "mymoneyqifprofileeditor.h"
+
+MyMoneyQifProfileNameValidator::MyMoneyQifProfileNameValidator(QObject *o, const char *name)
+ : QValidator(o, name)
+{
+}
+
+MyMoneyQifProfileNameValidator::~MyMoneyQifProfileNameValidator()
+{
+}
+
+QValidator::State MyMoneyQifProfileNameValidator::validate(QString& name, int&) const
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Profiles");
+ QStringList list = config->readListEntry("profiles");
+
+ // invalid character?
+ if(name.contains(",") != 0)
+ return QValidator::Invalid;
+
+ // would not work in this form (empty or existing name)
+ if(name.isEmpty() || list.contains(name))
+ return QValidator::Intermediate;
+
+ // is OK
+ return QValidator::Acceptable;
+}
+
+MyMoneyQifProfileEditor::MyMoneyQifProfileEditor(const bool edit, QWidget *parent, const char *name )
+ : MyMoneyQifProfileEditorDecl(parent,name),
+ m_inEdit(edit),
+ m_isDirty(false),
+ m_isAccepted(false),
+ m_selectedAmountType(0)
+{
+ // we don't need the date and amounts tab anymore, so we just hide them for now
+ profileTabs->removePage( tabMoney );
+ profileTabs->removePage( tabDate );
+
+ loadWidgets();
+ loadProfileListFromConfig();
+
+ // load button icons
+ KIconLoader* il = KGlobal::iconLoader();
+ KGuiItem newButtenItem( i18n( "&New" ),
+ QIconSet(il->loadIcon("filenew", KIcon::Small, KIcon::SizeSmall)),
+ i18n("Create a new profile"),
+ i18n("Use this to create a new QIF import/export profile"));
+ m_newButton->setGuiItem(newButtenItem);
+
+ connect(m_profileListBox, SIGNAL(highlighted(const QString&)), this, SLOT(slotLoadProfileFromConfig(const QString&)));
+ connect(m_resetButton, SIGNAL(clicked()), this, SLOT(slotReset()));
+ connect(m_okButton, SIGNAL(clicked()), this, SLOT(slotOk()));
+ connect(m_renameButton, SIGNAL(clicked()), this, SLOT(slotRename()));
+ connect(m_deleteButton, SIGNAL(clicked()), this, SLOT(slotDelete()));
+ connect(m_newButton, SIGNAL(clicked()), this, SLOT(slotNew()));
+ connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
+ connect(m_helpButton, SIGNAL(clicked()), this, SLOT(slotHelp()));
+
+ connect(m_editDescription, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setProfileDescription(const QString&)));
+ connect(m_editType, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setProfileType(const QString&)));
+ connect(m_editOpeningBalance, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setOpeningBalanceText(const QString&)));
+ connect(m_editAccountDelimiter, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setAccountDelimiter(const QString&)));
+ connect(m_editVoidMark, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setVoidMark(const QString&)));
+
+ //connect(m_editDateFormat, SIGNAL(highlighted(const QString&)), &m_profile, SLOT(setDateFormat(const QString&)));
+ connect(m_editApostrophe, SIGNAL(highlighted(const QString&)), &m_profile, SLOT(setApostropheFormat(const QString&)));
+
+ connect(m_editAmounts, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotAmountTypeSelected(QListViewItem*)));
+ connect(m_decimalBox, SIGNAL(activated(const QString&)), this, SLOT(slotDecimalChanged(const QString&)));
+ connect(m_thousandsBox, SIGNAL(activated(const QString&)), this, SLOT(slotThousandsChanged(const QString&)));
+
+ connect(m_editInputFilterLocation, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setFilterScriptImport(const QString&)));
+ connect(m_editInputFilterLocation, SIGNAL(urlSelected(const QString&)), m_editInputFilterLocation, SLOT(setURL(const QString&)));
+
+ connect(m_editInputFilterFileType, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setFilterFileType(const QString&)));
+
+ connect(m_editOutputFilterLocation, SIGNAL(textChanged(const QString&)), &m_profile, SLOT(setFilterScriptExport(const QString&)));
+ connect(m_editOutputFilterLocation, SIGNAL(urlSelected(const QString&)), m_editOutputFilterLocation, SLOT(setURL(const QString&)));
+
+ connect(m_attemptMatch, SIGNAL(toggled(bool)), &m_profile, SLOT(setAttemptMatchDuplicates(bool)));
+}
+
+MyMoneyQifProfileEditor::~MyMoneyQifProfileEditor()
+{
+ if(m_inEdit && m_isDirty && m_isAccepted) {
+ KConfig* config = KGlobal::config();
+ config->sync();
+ } else {
+ slotReset();
+ }
+ delete tabMoney;
+ delete tabDate;
+}
+
+void MyMoneyQifProfileEditor::loadWidgets(void)
+{
+ if(m_inEdit)
+ setCaption(i18n("QIF Profile Editor"));
+ else
+ setCaption(i18n("QIF Profile Selector"));
+
+ m_editDateFormat->clear();
+ m_editDateFormat->insertItem( "%d/%m/%yy" );
+ m_editDateFormat->insertItem( "%d/%mmm/%yy" );
+ m_editDateFormat->insertItem( "%d/%m/%yyyy" );
+ m_editDateFormat->insertItem( "%d/%mmm/%yyyy" );
+ m_editDateFormat->insertItem( "%d/%m%yy" );
+ m_editDateFormat->insertItem( "%d/%mmm%yy" );
+ m_editDateFormat->insertItem( "%d.%m.%yy" );
+ m_editDateFormat->insertItem( "%d.%m.%yyyy" );
+ m_editDateFormat->insertItem( "%m.%d.%yy" );
+ m_editDateFormat->insertItem( "%m.%d.%yyyy" );
+ m_editDateFormat->insertItem( "%m/%d/%yy" );
+ m_editDateFormat->insertItem( "%mmm/%d/%yy" );
+ m_editDateFormat->insertItem( "%m/%d/%yyyy" );
+ m_editDateFormat->insertItem( "%m-%d-%yyyy" );
+ m_editDateFormat->insertItem( "%mmm/%d/%yyyy" );
+ m_editDateFormat->insertItem( "%m%d%yy" );
+ m_editDateFormat->insertItem( "%mmm/%d%yy" );
+ m_editDateFormat->insertItem( "%yyyy-%mm-%dd" );
+ m_editDateFormat->insertItem( "%m/%d'%yyyy" );
+
+ m_editApostrophe->clear();
+ m_editApostrophe->insertItem( "1900-1949" );
+ m_editApostrophe->insertItem( "1900-1999" );
+ m_editApostrophe->insertItem( "2000-2099" );
+
+ m_editAmounts->setColumnAlignment(1, Qt::AlignCenter);
+ m_editAmounts->setColumnAlignment(2, Qt::AlignCenter);
+ m_editAmounts->setColumnAlignment(3, Qt::AlignCenter);
+
+ m_editAmounts->setColumnWidth(4, 0);
+ m_editAmounts->setColumnWidthMode(4, QListView::Manual);
+ m_editAmounts->setSorting(4);
+ m_editAmounts->sort();
+
+ m_decimalBox->insertItem( " " );
+ m_decimalBox->insertItem( "," );
+ m_decimalBox->insertItem( "." );
+
+ m_thousandsBox->insertItem( " " );
+ m_thousandsBox->insertItem( "," );
+ m_thousandsBox->insertItem( "." );
+
+ m_editDescription->setEnabled(m_inEdit);
+ m_editType->setEnabled(m_inEdit);
+ m_editDateFormat->setEnabled(m_inEdit);
+ m_editApostrophe->setEnabled(m_inEdit);
+ m_editAmounts->setEnabled(m_inEdit);
+ m_decimalBox->setEnabled(m_inEdit);
+ m_thousandsBox->setEnabled(m_inEdit);
+ m_editOpeningBalance->setEnabled(m_inEdit);
+ m_editAccountDelimiter->setEnabled(m_inEdit);
+ m_editVoidMark->setEnabled(m_inEdit);
+ m_editInputFilterLocation->setEnabled(m_inEdit);
+ m_editOutputFilterLocation->setEnabled(m_inEdit);
+ m_editInputFilterFileType->setEnabled(m_inEdit);
+
+ if(!m_inEdit) {
+ m_renameButton->hide();
+ m_deleteButton->hide();
+ m_resetButton->hide();
+ m_newButton->hide();
+ }
+}
+
+void MyMoneyQifProfileEditor::loadProfileListFromConfig(void)
+{
+ QFontMetrics fontMetrics(m_profileListBox->font());
+ int w = 100; // minimum is 100 pixels width for the list box
+
+ if(m_profile.isDirty()) {
+ m_profile.saveProfile();
+ m_isDirty = true;
+ }
+
+ m_profileListBox->clear();
+
+ QStringList list;
+ KConfig* config = KGlobal::config();
+ config->setGroup("Profiles");
+ list = config->readListEntry("profiles");
+
+ if(list.count() == 0) {
+ m_profile.clear();
+ m_profile.setProfileDescription(i18n("The default QIF profile"));
+ addProfile("Default");
+
+ config->setGroup("Profiles");
+ list = config->readListEntry("profiles");
+ }
+
+ list.sort();
+
+ m_profileListBox->insertStringList(list);
+ if(list.count() > 0) {
+ m_profileListBox->setSelected(0, true);
+ slotLoadProfileFromConfig(list[0]);
+ }
+ for(unsigned int i = 0; i < list.count(); ++i) {
+ int nw = fontMetrics.width(list[i]) + 10;
+ w = QMAX( w, nw );
+ }
+ w = QMIN(w, 200);
+ m_profileListBox->setMinimumWidth(w);
+}
+
+void MyMoneyQifProfileEditor::slotLoadProfileFromConfig(const QString& profile)
+{
+ QString profileName = profile;
+
+ if(m_profile.isDirty()) {
+ m_profile.saveProfile();
+ m_isDirty = true;
+ }
+
+ if(m_profileListBox->findItem(profileName, Qt::ExactMatch | Qt::CaseSensitive) == NULL) {
+ profileName = m_profileListBox->text(0);
+ }
+
+ m_profile.loadProfile("Profile-" + profileName);
+
+ QListBoxItem *lbi = m_profileListBox->findItem(profileName, Qt::ExactMatch | Qt::CaseSensitive);
+ int idx = m_profileListBox->index(lbi);
+ showProfile();
+ if(idx >= 0) {
+ m_profileListBox->setSelected(idx, true);
+ }
+}
+
+void MyMoneyQifProfileEditor::showProfile(void)
+{
+ m_editDescription->setText(m_profile.profileDescription());
+ m_editType->setText(m_profile.profileType());
+ m_editOpeningBalance->setText(m_profile.openingBalanceText());
+ m_editAccountDelimiter->setText(m_profile.accountDelimiter());
+ m_editVoidMark->setText(m_profile.voidMark());
+ m_editInputFilterLocation->setURL(m_profile.filterScriptImport());
+ m_editOutputFilterLocation->setURL(m_profile.filterScriptExport());
+ m_editInputFilterFileType->setText(m_profile.filterFileType());
+
+ m_editDateFormat->setCurrentText(m_profile.outputDateFormat());
+ m_editApostrophe->setCurrentText(m_profile.apostropheFormat());
+
+ m_attemptMatch->setChecked(m_profile.attemptMatchDuplicates());
+
+ QListViewItem* item;
+ QListViewItemIterator it(m_editAmounts);
+
+ while((item = it.current()) != 0) {
+ QChar key = item->text(1)[0];
+ item->setText(2, m_profile.amountDecimal(key));
+ item->setText(3, m_profile.amountThousands(key));
+ if(m_selectedAmountType == 0 && key == 'T' && m_inEdit) {
+ m_editAmounts->setSelected(item, true);
+ slotAmountTypeSelected(item);
+ } else if(item == m_selectedAmountType) {
+ slotAmountTypeSelected(item);
+ }
+ ++it;
+ }
+}
+
+void MyMoneyQifProfileEditor::deleteProfile(const QString& name)
+{
+ KConfig* config = KGlobal::config();
+
+ config->deleteGroup("Profile-" + name);
+
+ config->setGroup("Profiles");
+ QStringList list = config->readListEntry("profiles");
+ list.remove(name);
+
+ config->writeEntry("profiles", list);
+ m_isDirty = true;
+}
+
+void MyMoneyQifProfileEditor::addProfile(const QString& name)
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Profiles");
+ QStringList list = config->readListEntry("profiles");
+
+ list += name;
+ list.sort();
+ config->writeEntry("profiles", list);
+
+ m_profile.setProfileName("Profile-" + name);
+ m_profile.saveProfile();
+
+ m_isDirty = true;
+}
+
+void MyMoneyQifProfileEditor::slotOk(void)
+{
+ if(m_profile.isDirty())
+ m_isDirty = true;
+
+ m_profile.saveProfile();
+
+ KConfig* config = KGlobal::config();
+ config->sync();
+
+ m_isAccepted = true;
+ accept();
+}
+
+void MyMoneyQifProfileEditor::slotReset(void)
+{
+ // first flush any changes
+ m_profile.saveProfile();
+
+ KConfig* config = KGlobal::config();
+ config->rollback();
+ config->reparseConfiguration();
+
+ QString currentProfile = m_profile.profileName().mid(8);
+ loadProfileListFromConfig();
+ slotLoadProfileFromConfig(currentProfile);
+ m_isDirty = false;
+}
+
+void MyMoneyQifProfileEditor::slotRename(void)
+{
+ bool ok;
+ QString newName = enterName(ok);
+
+ if(ok == true) {
+ deleteProfile(m_profile.profileName().mid(8));
+ addProfile(newName);
+ loadProfileListFromConfig();
+ slotLoadProfileFromConfig(newName);
+ }
+}
+
+void MyMoneyQifProfileEditor::slotNew(void)
+{
+ bool ok;
+ QString newName = enterName(ok);
+
+ if(ok == true) {
+ m_profile.clear();
+ addProfile(newName);
+ loadProfileListFromConfig();
+ slotLoadProfileFromConfig(newName);
+ }
+}
+
+const QString MyMoneyQifProfileEditor::enterName(bool& ok)
+{
+ MyMoneyQifProfileNameValidator val(this, "Validator");
+#if KDE_IS_VERSION(3,2,0)
+ return KInputDialog::getText(i18n("QIF Profile Editor"),
+ i18n("Enter new profile name"),
+ QString::null,
+ &ok,
+ this,
+ 0,
+ &val,
+ 0);
+#else
+ QString rc;
+
+ // the blank in the next line as the value for the edit box is
+ // there on purpose, so that with the following call to validateAndSet
+ // the state is changed and the OK-Button is greyed
+ KLineEditDlg* dlg = new KLineEditDlg(i18n("Enter new profile name"), " ", this);
+ dlg->lineEdit()->setValidator(&val);
+ dlg->lineEdit()->validateAndSet("", 0, 0, 0);
+
+ ok = false;
+ if(dlg->exec()) {
+ ok = true;
+ }
+ rc = dlg->lineEdit()->text();
+ delete dlg;
+
+ return rc;
+#endif
+}
+
+void MyMoneyQifProfileEditor::slotDelete(void)
+{
+ QString profile = m_profile.profileName().mid(8);
+
+ if(KMessageBox::questionYesNo(this, i18n("Do you really want to delete profile '%1'?").arg(profile)) == KMessageBox::Yes) {
+ int idx = m_profileListBox->currentItem();
+ m_profile.saveProfile();
+ deleteProfile(profile);
+ loadProfileListFromConfig();
+ if(idx >= static_cast<int> (m_profileListBox->count()))
+ idx = m_profileListBox->count() - 1;
+
+ slotLoadProfileFromConfig(m_profileListBox->text(idx));
+ }
+}
+
+void MyMoneyQifProfileEditor::slotHelp(void)
+{
+ kapp->invokeHelp("details.impexp.qifimp.profile");
+}
+
+void MyMoneyQifProfileEditor::slotAmountTypeSelected(QListViewItem* item)
+{
+ m_decimalBox->setCurrentText(item->text(2));
+ m_thousandsBox->setCurrentText(item->text(3));
+ m_selectedAmountType = item;
+}
+
+void MyMoneyQifProfileEditor::slotDecimalChanged(const QString& val)
+{
+ if(m_selectedAmountType != 0) {
+ QChar key = m_selectedAmountType->text(1)[0];
+ m_profile.setAmountDecimal(key, val[0]);
+ m_selectedAmountType->setText(2, val);
+ }
+}
+
+void MyMoneyQifProfileEditor::slotThousandsChanged(const QString& val)
+{
+ if(m_selectedAmountType != 0) {
+ QChar key = m_selectedAmountType->text(1)[0];
+ m_profile.setAmountThousands(key, val[0]);
+ m_selectedAmountType->setText(3, val);
+ }
+}
+
+const QString MyMoneyQifProfileEditor::selectedProfile() const
+{
+ return m_profileListBox->currentText();
+}
+
+#include "mymoneyqifprofileeditor.moc"