diff options
Diffstat (limited to 'src/loandialog.cpp')
-rw-r--r-- | src/loandialog.cpp | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/src/loandialog.cpp b/src/loandialog.cpp new file mode 100644 index 0000000..e34ecc7 --- /dev/null +++ b/src/loandialog.cpp @@ -0,0 +1,268 @@ +/*************************************************************************** + copyright : (C) 2005-2006 by Robby Stephenson + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#include "loandialog.h" +#include "borrowerdialog.h" +#include "gui/datewidget.h" +#include "gui/richtextlabel.h" +#include "collection.h" +#include "commands/addloans.h" +#include "commands/modifyloans.h" + +#include <config.h> + +#include <klocale.h> +#include <klineedit.h> +#include <kpushbutton.h> +#include <ktextedit.h> +#include <kiconloader.h> +#include <kabc/stdaddressbook.h> + +#include <qlayout.h> +#include <qhbox.h> +#include <qlabel.h> +#include <qcheckbox.h> +#include <qwhatsthis.h> + +using Tellico::LoanDialog; + +LoanDialog::LoanDialog(const Data::EntryVec& entries_, QWidget* parent_, const char* name_/*=0*/) + : KDialogBase(parent_, name_, true, i18n("Loan Dialog"), Ok|Cancel), + m_mode(Add), m_borrower(0), m_entries(entries_), m_loan(0) { + init(); +} + +LoanDialog::LoanDialog(Data::LoanPtr loan_, QWidget* parent_, const char* name_/*=0*/) + : KDialogBase(parent_, name_, true, i18n("Modify Loan"), Ok|Cancel), + m_mode(Modify), m_borrower(loan_->borrower()), m_loan(loan_) { + m_entries.append(m_loan->entry()); + + init(); + + m_borrowerEdit->setText(m_loan->borrower()->name()); + m_loanDate->setDate(m_loan->loanDate()); + if(m_loan->dueDate().isValid()) { + m_dueDate->setDate(m_loan->dueDate()); + m_addEvent->setEnabled(true); + if(m_loan->inCalendar()) { + m_addEvent->setChecked(true); + } + } + m_note->setText(m_loan->note()); +} + +void LoanDialog::init() { + QWidget* mainWidget = new QWidget(this, "LoanDialog mainWidget"); + setMainWidget(mainWidget); + QGridLayout* topLayout = new QGridLayout(mainWidget, 7, 2, 0, KDialog::spacingHint()); + + QHBox* hbox = new QHBox(mainWidget); + hbox->setSpacing(KDialog::spacingHint()); + QLabel* pixLabel = new QLabel(hbox); + pixLabel->setPixmap(DesktopIcon(QString::fromLatin1("tellico"), 64)); + pixLabel->setAlignment(Qt::AlignAuto | Qt::AlignTop); + hbox->setStretchFactor(pixLabel, 0); + + QString entryString = QString::fromLatin1("<qt><p>"); + if(m_mode == Add) { + entryString += i18n("The following items are being checked out:"); + entryString += QString::fromLatin1("</p><ol>"); + for(Data::EntryVec::ConstIterator entry = m_entries.constBegin(); entry != m_entries.constEnd(); ++entry) { + entryString += QString::fromLatin1("<li>") + entry->title() + QString::fromLatin1("</li>"); + } + } else { + entryString += i18n("The following item is on-loan:"); + entryString += QString::fromLatin1("</p><ol>"); + entryString += QString::fromLatin1("<li>") + m_loan->entry()->title() + QString::fromLatin1("</li>"); + } + entryString += QString::fromLatin1("</ol></qt>"); + GUI::RichTextLabel* entryLabel = new GUI::RichTextLabel(entryString, hbox); + hbox->setStretchFactor(entryLabel, 1); + + topLayout->addMultiCellWidget(hbox, 0, 0, 0, 1); + + QLabel* l = new QLabel(i18n("&Lend to:"), mainWidget); + topLayout->addWidget(l, 1, 0); + hbox = new QHBox(mainWidget); + hbox->setSpacing(KDialog::spacingHint()); + topLayout->addWidget(hbox, 1, 1); + m_borrowerEdit = new KLineEdit(hbox); + l->setBuddy(m_borrowerEdit); + m_borrowerEdit->completionObject()->setIgnoreCase(true); + connect(m_borrowerEdit, SIGNAL(textChanged(const QString&)), + SLOT(slotBorrowerNameChanged(const QString&))); + actionButton(Ok)->setEnabled(false); // disable until a name is entered + KPushButton* pb = new KPushButton(SmallIconSet(QString::fromLatin1("kaddressbook")), QString::null, hbox); + connect(pb, SIGNAL(clicked()), SLOT(slotGetBorrower())); + QString whats = i18n("Enter the name of the person borrowing the items from you. " + "Clicking the button allows you to select from your address book."); + QWhatsThis::add(l, whats); + QWhatsThis::add(hbox, whats); + // only enable for new loans + if(m_mode == Modify) { + m_borrowerEdit->setEnabled(false); + pb->setEnabled(false); + } + + l = new QLabel(i18n("&Loan date:"), mainWidget); + topLayout->addWidget(l, 2, 0); + m_loanDate = new GUI::DateWidget(mainWidget); + m_loanDate->setDate(QDate::currentDate()); + l->setBuddy(m_loanDate); + topLayout->addWidget(m_loanDate, 2, 1); + whats = i18n("The check-out date is the date that you lent the items. By default, " + "today's date is used."); + QWhatsThis::add(l, whats); + QWhatsThis::add(m_loanDate, whats); + // only enable for new loans + if(m_mode == Modify) { + m_loanDate->setEnabled(false); + } + + l = new QLabel(i18n("D&ue date:"), mainWidget); + topLayout->addWidget(l, 3, 0); + m_dueDate = new GUI::DateWidget(mainWidget); + l->setBuddy(m_dueDate); + topLayout->addWidget(m_dueDate, 3, 1); + // valid due dates will enable the calendar adding checkbox + connect(m_dueDate, SIGNAL(signalModified()), SLOT(slotDueDateChanged())); + whats = i18n("The due date is when the items are due to be returned. The due date " + "is not required, unless you want to add the loan to your active calendar."); + QWhatsThis::add(l, whats); + QWhatsThis::add(m_dueDate, whats); + + l = new QLabel(i18n("&Note:"), mainWidget); + topLayout->addWidget(l, 4, 0); + m_note = new KTextEdit(mainWidget); + l->setBuddy(m_note); + topLayout->addMultiCellWidget(m_note, 5, 5, 0, 1); + topLayout->setRowStretch(5, 1); + whats = i18n("You can add notes about the loan, as well."); + QWhatsThis::add(l, whats); + QWhatsThis::add(m_note, whats); + + m_addEvent = new QCheckBox(i18n("&Add a reminder to the active calendar"), mainWidget); + topLayout->addMultiCellWidget(m_addEvent, 6, 6, 0, 1); + m_addEvent->setEnabled(false); // gets enabled when valid due date is entered + QWhatsThis::add(m_addEvent, i18n("<qt>Checking this box will add a <em>To-do</em> item " + "to your active calendar, which can be viewed using KOrganizer. " + "The box is only active if you set a due date.")); + + resize(configDialogSize(QString::fromLatin1("Loan Dialog Options"))); + + KABC::AddressBook* abook = KABC::StdAddressBook::self(true); + connect(abook, SIGNAL(addressBookChanged(AddressBook*)), + SLOT(slotLoadAddressBook())); + connect(abook, SIGNAL(loadingFinished(Resource*)), + SLOT(slotLoadAddressBook())); + slotLoadAddressBook(); +} + +LoanDialog::~LoanDialog() { + saveDialogSize(QString::fromLatin1("Loan Dialog Options")); +} + +void LoanDialog::slotBorrowerNameChanged(const QString& str_) { + actionButton(Ok)->setEnabled(!str_.isEmpty()); +} + +void LoanDialog::slotDueDateChanged() { +#ifdef HAVE_KCAL + m_addEvent->setEnabled(m_dueDate->date().isValid()); +#endif +} + +void LoanDialog::slotGetBorrower() { + Data::BorrowerPtr borrower = BorrowerDialog::getBorrower(this); + if(borrower) { + m_borrowerEdit->setText(borrower->name()); + m_uid = borrower->uid(); + } +} + +void LoanDialog::slotLoadAddressBook() { + m_borrowerEdit->completionObject()->clear(); + + const KABC::AddressBook* const abook = KABC::StdAddressBook::self(true); + for(KABC::AddressBook::ConstIterator it = abook->begin(), end = abook->end(); + it != end; ++it) { + m_borrowerEdit->completionObject()->addItem((*it).realName()); + } + + // add current borrowers, too + QStringList items = m_borrowerEdit->completionObject()->items(); + Data::BorrowerVec borrowers = m_entries.begin()->collection()->borrowers(); + for(Data::BorrowerVec::ConstIterator it = borrowers.constBegin(), end = borrowers.constEnd(); + it != end; ++it) { + if(items.findIndex(it->name()) == -1) { + m_borrowerEdit->completionObject()->addItem(it->name()); + } + } +} + +KCommand* LoanDialog::createCommand() { + // first, check to see if the borrower is empty + QString name = m_borrowerEdit->text(); + if(name.isEmpty()) { + return 0; + } + + // ok, first handle creating new loans + if(m_mode == Add) { + return addLoansCommand(); + } else { + return modifyLoansCommand(); + } +} + +KCommand* LoanDialog::addLoansCommand() { + if(m_entries.isEmpty()) { + return 0; + } + + const QString name = m_borrowerEdit->text(); + + // see if there's a borrower with this name already + m_borrower = 0; + Data::BorrowerVec borrowers = m_entries.begin()->collection()->borrowers(); + for(Data::BorrowerVec::Iterator it = borrowers.begin(); it != borrowers.end(); ++it) { + if(it->name() == name) { + m_borrower = it; + break; + } + } + + if(!m_borrower) { + m_borrower = new Data::Borrower(name, m_uid); + } + + Data::LoanVec loans; + for(Data::EntryVecIt entry = m_entries.begin(); entry != m_entries.end(); ++entry) { + loans.append(new Data::Loan(entry, m_loanDate->date(), m_dueDate->date(), m_note->text())); + } + + return new Command::AddLoans(m_borrower, loans, m_addEvent->isChecked()); +} + +KCommand* LoanDialog::modifyLoansCommand() { + if(!m_loan) { + return 0; + } + + Data::LoanPtr newLoan = new Data::Loan(*m_loan); + newLoan->setDueDate(m_dueDate->date()); + newLoan->setNote(m_note->text()); + return new Command::ModifyLoans(m_loan, newLoan, m_addEvent->isChecked()); +} + +#include "loandialog.moc" |