You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/dialogs/mymoneyqifprofileeditor.cpp

484 lines
15 KiB

/***************************************************************************
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"