summaryrefslogtreecommitdiffstats
path: root/kmymoney2/widgets/transaction.h
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/widgets/transaction.h')
-rw-r--r--kmymoney2/widgets/transaction.h420
1 files changed, 420 insertions, 0 deletions
diff --git a/kmymoney2/widgets/transaction.h b/kmymoney2/widgets/transaction.h
new file mode 100644
index 0000000..060d025
--- /dev/null
+++ b/kmymoney2/widgets/transaction.h
@@ -0,0 +1,420 @@
+/***************************************************************************
+ transaction.h - description
+ -------------------
+ begin : Tue Jun 13 2006
+ copyright : (C) 2000-2006 by Thomas Baumgart
+ email : Thomas Baumgart <ipwizard@users.sourceforge.net>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef TRANSACTION_H
+#define TRANSACTION_H
+
+// ----------------------------------------------------------------------------
+// QT Includes
+
+#include <qpalette.h>
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include <kmymoney/registeritem.h>
+#include <kmymoney/mymoneytransaction.h>
+#include <kmymoney/mymoneysplit.h>
+#include <kmymoney/mymoneysecurity.h>
+#include <kmymoney/selectedtransaction.h>
+#include <kmymoney/mymoneyaccount.h>
+
+class QTable;
+class TransactionEditor;
+class TransactionEditorContainer;
+
+namespace KMyMoneyTransactionForm {
+ class TransactionForm;
+}; // namespace
+
+namespace KMyMoneyRegister {
+
+// keep the following list in sync with code in the constructor
+// of KMyMoneyRegister::Register in register.cpp
+typedef enum {
+ NumberColumn = 0,
+ DateColumn,
+ AccountColumn,
+ SecurityColumn,
+ DetailColumn,
+ ReconcileFlagColumn,
+ PaymentColumn,
+ DepositColumn,
+ QuantityColumn,
+ PriceColumn,
+ ValueColumn,
+ BalanceColumn,
+ // insert new values above this line
+ MaxColumns
+} Column;
+
+class Transaction : public RegisterItem
+{
+public:
+ Transaction(Register* parent, const MyMoneyTransaction& transaction, const MyMoneySplit& split, int uniqueId);
+ virtual ~Transaction() {}
+
+ virtual const char* className(void) { return "Transaction"; }
+
+ bool isSelectable(void) const { return true; }
+ bool isSelected(void) const { return m_selected; }
+ void setSelected(bool selected);
+
+ bool canHaveFocus(void) const { return true; }
+ bool hasFocus(void) const { return m_focus; }
+ bool hasEditorOpen(void) const { return m_inEdit; }
+
+ virtual bool isScheduled(void) const { return false; }
+
+ void setFocus(bool focus, bool updateLens = true);
+
+ bool isErronous(void) const { return m_erronous; }
+
+ virtual const QDate& sortPostDate(void) const { return m_transaction.postDate(); }
+ virtual int sortSamePostDate(void) const { return 2; }
+ virtual const QDate& sortEntryDate(void) const { return m_transaction.entryDate(); }
+ virtual const QString& sortPayee(void) const { return m_payee; }
+ virtual const MyMoneyMoney& sortValue(void) const { return m_split.shares(); }
+ virtual const QString& sortNumber(void) const { return m_split.number(); }
+ virtual const QString& sortEntryOrder(void) const { return m_uniqueId; }
+ virtual CashFlowDirection sortType(void) const { return m_split.shares().isNegative() ? Payment : Deposit; }
+ virtual const QString& sortCategory(void) const { return m_category; }
+ virtual MyMoneySplit::reconcileFlagE sortReconcileState(void) const { return m_split.reconcileFlag(); }
+
+ virtual const QString& id(void) const { return m_uniqueId; }
+ const MyMoneyTransaction& transaction(void) const { return m_transaction; }
+ const MyMoneySplit& split(void) const { return m_split; }
+
+ void setBalance(const MyMoneyMoney& balance) { m_balance = balance; }
+ const MyMoneyMoney& balance(void) const { return m_balance; }
+
+ virtual int rowHeightHint(void) const;
+
+ /**
+ * This method sets the general paramaters required for the painting of a cell
+ * in the register. These are:
+ *
+ * - background color (alternating)
+ * - background color (imported transaction)
+ * - background color (matched transaction)
+ * - background color (selected transaction)
+ * - cellRect (area covering the cell)
+ * - textRect (area covering the text)
+ * - color of the pen to do the painting of text and lines
+ *
+ * @param painter pointer to the QPainter object
+ * @param row vertical index of cell in register
+ * @param col horizontal index of cell in register
+ * @param cellRect ref to QRect object receiving the area information for the cell
+ * @param textRect ref to QRect object receiving the area information for the text
+ * @param cg ref to QColorGroup object receiving the color information to be used
+ */
+ virtual bool paintRegisterCellSetup(QPainter* painter, int& row, int& col, QRect& cellRect, QRect& textRect, QColorGroup& cg, QBrush& brush);
+
+ /**
+ * paints the focus if the current cell defined by (@a row, @a col) has the focus.
+ *
+ * @param painter pointer to the QPainter object
+ * @param row vertical index of cell in register
+ * @param col horizontal index of cell in register
+ * @param r area covering the cell
+ * @param cg the color definitions to be used
+ */
+ void paintRegisterCellFocus(QPainter* painter, int row, int col, const QRect& r, const QColorGroup& cg);
+
+ /**
+ * paints a cell of the register for the transaction. Uses paintRegisterCellSetup(), paintRegisterCellText()
+ * paintRegisterGrid(), paintRegisterIcons() and paintRegisterCellFocus() to actually do the job.
+ *
+ * @param painter pointer to the QPainter object
+ * @param row vertical index of cell in register
+ * @param col horizontal index of cell in register
+ * @param r area covering the cell
+ * @param selected unused but kept for compatibility
+ * @param cg the color definitions to be used
+ *
+ */
+ virtual void paintRegisterCell(QPainter* painter, int row, int col, const QRect& r, bool selected, const QColorGroup& cg);
+ virtual void paintRegisterCellText(QPainter* painter, int row, int col, const QRect& r, const QColorGroup& cg, int align, const QString& txt);
+ virtual void paintRegisterCellBackground(QPainter* painter, int row, int col, const QRect& r, const QBrush& backgroundBrush);
+ virtual void paintRegisterGrid(QPainter* painter, int row, int col, const QRect& r, const QColorGroup& cg) const;
+ virtual void paintRegisterIcons(QPainter* painter, int row, int col, const QRect& r, const QColorGroup& cg);
+
+ virtual void paintFormCell(QPainter* /* painter */, int /* row */, int /* col */, const QRect& /* r */, bool /* selected */, const QColorGroup& /* cg */);
+
+ virtual bool formCellText(QString& /* txt */, int& /* align */, int /* row */, int /* col */, QPainter* /* painter */) { return false; }
+ virtual void registerCellText(QString& /* txt */, int& /* align */, int /* row */, int /* col */, QPainter* /* painter */) {}
+ virtual int registerColWidth(int /* col */, const QFontMetrics& /* cellFontMetrics */) { return 0; }
+
+ /**
+ * Helper method for the above method.
+ */
+ void registerCellText(QString& txt, int row, int col);
+
+ virtual int formRowHeight(int row);
+ virtual int formRowHeight(void) const;
+
+ virtual void setupForm(KMyMoneyTransactionForm::TransactionForm* form);
+ virtual void setupFormPalette(QMap<QString, QWidget*>& editWidgets);
+ virtual void setupRegisterPalette(QMap<QString, QWidget*>& editWidgets);
+ virtual void loadTab(KMyMoneyTransactionForm::TransactionForm* form) = 0;
+
+ virtual void arrangeWidgetsInForm(QMap<QString, QWidget*>& editWidgets) = 0;
+ virtual void arrangeWidgetsInRegister(QMap<QString, QWidget*>& editWidgets) = 0;
+ virtual void tabOrderInForm(QWidgetList& tabOrderWidgets) const = 0;
+ virtual void tabOrderInRegister(QWidgetList& tabOrderWidgets) const = 0;
+
+ virtual KMyMoneyRegister::Action actionType(void) const = 0;
+
+ QWidget* focusWidget(QWidget*) const;
+ void arrangeWidget(QTable* tbl, int row, int col, QWidget* w) const;
+
+ bool haveNumberField(void) const;
+
+ bool matches(const QString&) const;
+
+ /**
+ * Checks if the mouse hovered over an area that has a tooltip associated with it.
+ * The mouse position is given in relative coordinates to the @a startRow and the
+ * @a row and @a col of the item are also passed as relative values.
+ *
+ * If a tooltip shall be shown, this method presets the rectangle @a r with the
+ * area in register coordinates and @a msg with the string that will be passed
+ * to QToolTip::tip. @a true is returned in this case.
+ *
+ * If no tooltip is available, @a false will be returned.
+ */
+ virtual bool maybeTip(const QPoint& relpos, int row, int col, QRect& r, QString& msg);
+
+ /**
+ * This method returns the number of register rows required for a certain
+ * item in expanded (@p expanded equals @a true) or collapsed (@p expanded
+ * is @a false) mode.
+ *
+ * @param expanded returns number of maximum rows required for this item to
+ * display all information (used for ledger lens and register
+ * edit mode) or the minimum number of rows required.
+ * @return number of rows required for mode selected by @p expanded
+ */
+ virtual int numRowsRegister(bool expanded) const = 0;
+
+ virtual int numRowsRegister(void) const = 0;
+
+ void leaveEditMode(void);
+ void startEditMode(void);
+
+ /**
+ * This method creates an editor for the transaction
+ */
+ virtual TransactionEditor* createEditor(TransactionEditorContainer* regForm, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate) = 0;
+
+ virtual void setVisible(bool visible);
+
+ virtual void setShowBalance(bool showBalance);
+
+ /**
+ * Return information if @a row should be shown (@a true )
+ * or hidden (@a false ) in the form. Default is true.
+ */
+ virtual bool showRowInForm(int row) const { Q_UNUSED(row) return true; }
+
+ /**
+ * Control visibility of @a row in the transaction form.
+ * Only row 0 has an effect, others return @a true.
+ */
+ virtual void setShowRowInForm(int row, bool show) { Q_UNUSED(row); Q_UNUSED(show) }
+
+ virtual void setReducedIntensity(bool reduced) { m_reducedIntensity = reduced; }
+
+protected:
+ virtual void markAsErronous(QPainter* p, int row, int col, const QRect& r);
+ virtual void markAttachment(QPainter* painter, int row, int col, const QRect& r);
+
+ /**
+ * This method converts m_split.reconcileFlag() into a readable string
+ *
+ * @param text Return textual representation e.g. "Cleared" (@a true) or just
+ * a flag e.g. "C" (@a false). Defaults to textual representation.
+ * @return Textual representation or flag as selected via @p text of the
+ * reconciliation state of the split
+ */
+ QString reconcileState(bool text = true) const;
+
+ /**
+ * Helper method to reduce a multi line memo text into a single line.
+ *
+ * @param txt QString that will receive the single line memo text
+ * @param split const reference to the split to take the memo from
+ */
+ void singleLineMemo(QString& txt, const MyMoneySplit& split) const;
+
+ virtual void setupPalette(const QPalette& palette, QMap<QString, QWidget*>& editWidgets);
+
+protected:
+ MyMoneyTransaction m_transaction;
+ MyMoneySplit m_split;
+ MyMoneyAccount m_account;
+ MyMoneyMoney m_balance;
+ QTable* m_form;
+ QString m_category;
+ QString m_payee;
+ QString m_payeeHeader;
+ QString m_categoryHeader;
+ QString m_splitCurrencyId;
+ QString m_uniqueId;
+ int m_formRowHeight;
+ bool m_selected;
+ bool m_focus;
+ bool m_erronous;
+ bool m_inEdit;
+ bool m_inRegisterEdit;
+ bool m_showBalance;
+ bool m_reducedIntensity;
+};
+
+class StdTransaction : public Transaction
+{
+public:
+ StdTransaction(Register* parent, const MyMoneyTransaction& transaction, const MyMoneySplit& split, int uniqueId);
+ virtual ~StdTransaction() {}
+
+ virtual const char* className(void) { return "StdTransaction"; }
+
+ bool formCellText(QString& txt, int& align, int row, int col, QPainter* painter = 0);
+ void registerCellText(QString& txt, int& align, int row, int col, QPainter* painter = 0);
+
+ int registerColWidth(int col, const QFontMetrics& cellFontMetrics);
+ void setupForm(KMyMoneyTransactionForm::TransactionForm* form);
+ void loadTab(KMyMoneyTransactionForm::TransactionForm* form);
+
+ int numColsForm(void) const { return 4; }
+
+ void arrangeWidgetsInForm(QMap<QString, QWidget*>& editWidgets);
+ void arrangeWidgetsInRegister(QMap<QString, QWidget*>& editWidgets);
+ void tabOrderInForm(QWidgetList& tabOrderWidgets) const;
+ void tabOrderInRegister(QWidgetList& tabOrderWidgets) const;
+ KMyMoneyRegister::Action actionType(void) const;
+
+ int numRowsRegister(bool expanded) const;
+
+ /**
+ * Provided for internal reasons. No API change. See RegisterItem::numRowsRegister()
+ */
+ int numRowsRegister(void) const { return RegisterItem::numRowsRegister(); }
+
+ TransactionEditor* createEditor(TransactionEditorContainer* regForm, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate);
+
+ /**
+ * Return information if @a row should be shown (@a true )
+ * or hidden (@a false ) in the form. Default is true.
+ */
+ virtual bool showRowInForm(int row) const;
+
+ /**
+ * Control visibility of @a row in the transaction form.
+ * Only row 0 has an effect, others return @a true.
+ */
+ virtual void setShowRowInForm(int row, bool show);
+
+protected:
+ void setupFormHeader(const QString& id);
+
+private:
+ bool m_showAccountRow;
+};
+
+class InvestTransaction : public Transaction
+{
+public:
+ InvestTransaction(Register* parent, const MyMoneyTransaction& transaction, const MyMoneySplit& split, int uniqueId);
+ virtual ~InvestTransaction() {}
+
+ virtual const QString& sortSecurity(void) const { return m_security.name(); }
+ virtual const char* className(void) { return "InvestTransaction"; }
+
+ // virtual void paintRegisterCell(QPainter* painter, int row, int col, const QRect& r, bool selected, const QColorGroup& cg);
+
+ bool formCellText(QString& txt, int& align, int row, int col, QPainter* painter = 0);
+ void registerCellText(QString& txt, int& align, int row, int col, QPainter* painter = 0);
+
+ int registerColWidth(int col, const QFontMetrics& cellFontMetrics);
+ void setupForm(KMyMoneyTransactionForm::TransactionForm* form);
+
+ /**
+ * provide NOP here as the investment transaction form does not supply a tab
+ */
+ void loadTab(KMyMoneyTransactionForm::TransactionForm* /* form */) {}
+
+ int numColsForm(void) const { return 4; }
+
+ void arrangeWidgetsInForm(QMap<QString, QWidget*>& editWidgets);
+ void arrangeWidgetsInRegister(QMap<QString, QWidget*>& editWidgets);
+ void tabOrderInForm(QWidgetList& tabOrderWidgets) const;
+ void tabOrderInRegister(QWidgetList& tabOrderWidgets) const;
+ KMyMoneyRegister::Action actionType(void) const { return KMyMoneyRegister::ActionNone; }
+
+ int numRowsRegister(bool expanded) const;
+
+ /**
+ * Provided for internal reasons. No API change. See RegisterItem::numRowsRegister()
+ */
+ int numRowsRegister(void) const { return RegisterItem::numRowsRegister(); }
+
+ TransactionEditor* createEditor(TransactionEditorContainer* regForm, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate);
+
+ void splits(MyMoneySplit& assetAccountSplit, QValueList<MyMoneySplit>& interestSplits, QValueList<MyMoneySplit>& feeSplits) const;
+
+protected:
+ bool haveShares(void) const;
+ bool haveFees(void) const;
+ bool haveInterest(void) const;
+ bool havePrice(void) const;
+ bool haveAmount(void) const;
+ bool haveAssetAccount(void) const;
+ bool haveSplitRatio(void) const;
+
+ /**
+ * Returns textual representation of the activity identified
+ * by @p type.
+ *
+ * @param txt reference to QString where to store the result
+ * @param type activity represented as investTransactionTypeE
+ */
+ void activity(QString& txt, MyMoneySplit::investTransactionTypeE type) const;
+
+private:
+ QValueList<MyMoneySplit> m_feeSplits;
+ QValueList<MyMoneySplit> m_interestSplits;
+ MyMoneySplit m_assetAccountSplit;
+ MyMoneySecurity m_security;
+ MyMoneySecurity m_currency;
+ MyMoneySplit::investTransactionTypeE m_transactionType;
+ QString m_feeCategory;
+ QString m_interestCategory;
+ MyMoneyMoney m_feeAmount;
+ MyMoneyMoney m_interestAmount;
+ MyMoneyMoney m_totalAmount;
+};
+
+}; // namespace
+
+#endif
+// vim:cin:si:ai:et:ts=2:sw=2:
+