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/widgets/kmymoneycalculator.h

251 lines
7.1 KiB

/***************************************************************************
kmymoneycalculator.h - description
-------------------
begin : Sat Oct 19 2002
copyright : (C) 2000-2002 by Michael Edwardes
email : mte@users.sourceforge.net
Javier Campos Morales <javi_c@users.sourceforge.net>
Felix Rodriguez <frodriguez@users.sourceforge.net>
John C <thetacoturtle@users.sourceforge.net>
Thomas Baumgart <ipwizard@users.sourceforge.net>
Kevin Tambascio <ktambascio@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 KMYMONEYCALCULATOR_H
#define KMYMONEYCALCULATOR_H
// ----------------------------------------------------------------------------
// QT Includes
#include <tqwidget.h>
#include <tqframe.h>
#include <tqlayout.h>
#include <tqgrid.h>
#include <tqlcdnumber.h>
#include <tqlineedit.h>
#include <tqlabel.h>
// ----------------------------------------------------------------------------
// KDE Includes
#include <kpushbutton.h>
// ----------------------------------------------------------------------------
// Project Includes
/**
*@author Thomas Baumgart
*/
/**
* This class implements a simple electronic calculator with the
* ability of addition, subtraction, multiplication and division
* and percentage calculation. Memory locations are not available.
*
* The first operand and operation can be loaded from an external
* source to switch from an edit-widget to the calculator widget
* without having the user to re-type the data. See setInitialValues()
* for details.
*/
class kMyMoneyCalculator : public TQFrame {
Q_OBJECT
public:
kMyMoneyCalculator(TQWidget* parent = 0, const char *name = 0);
~kMyMoneyCalculator();
/**
* This methods is used to extract the result of the last
* calculation. The fractional part is separated from the
* integral part by the character setup using setComma().
*
* @return TQString representing the result of the
* last operation
*/
const TQString result(void) const;
/**
* This method is used to set the character to be used
* as the separator between the integer and fractional part
* of an operand. Upon creation of the object, m_comma is
* set to the current locale setting of KDE's decimalSymbol.
*
* @param ch TQChar representing the character to be used
*/
void setComma(const TQChar ch) { m_comma = ch; };
/**
* This method is used to preset the first operand and start
* execution of an operation. This method is currently used
* by kMyMoneyEdit. If @p ev is 0, then no operation will be
* started.
*
* @param value reference to TQString representing the operands value
* @param ev pointer to TQKeyEvent representing the operation's key
*/
void setInitialValues(const TQString& value, TQKeyEvent* ev);
signals:
/**
* This signal is emitted, when a new result is available
*/
void signalResultAvailable();
protected:
void keyPressEvent(TQKeyEvent* ev);
/**
* This method is used to transform a double into a TQString
* and removing any trailing 0's and decimal seperators
*
* @param val reference to double value to be converted
* @return TQString object containing the converted value
*/
TQString normalizeString(const double& val);
protected slots:
/**
* This method appends the digit represented by the parameter
* to the current operand
*
* @param button integer value of the digit to be added in the
* range [0..9]
*/
void digitClicked(int button);
/**
* This methods starts the operation contained in the parameter
*
* @param button The TQt::Keycode for the button pressed or clicked
*/
void calculationClicked(int button);
/**
* This method appends a period (comma) to initialize the fractional
* part of an operand. The period is only appended once.
*/
void commaClicked(void);
/**
* This method reverses the sign of the current operand
*/
void plusminusClicked(void);
/**
* This method clears the current operand
*/
void clearClicked(void);
/**
* This method clears all registers
*/
void clearAllClicked(void);
/**
* This method executes the percent operation
*/
void percentClicked(void);
/**
* This method updates the display of the calculator with
* the text passed as argument
*
* @param str reference to TQString containing the new display contents
*/
void changeDisplay(const TQString& str);
private:
/**
* This member variable stores the current (second) operand
*/
TQString operand;
/**
* This member variable stores the last result
*/
TQString m_result;
/**
* This member variable stores the representation of the
* character to be used to separate the integer and fractional
* part of numbers. The internal representation is always a period.
*/
TQChar m_comma;
/**
* The numeric representation of a stacked first operand
*/
double op0;
/**
* The numeric representation of the first operand
*/
double op1;
/**
* This member stores the operation to be performed between
* the first and the second operand.
*/
int op;
/**
* This member stores a pending addition operation
*/
int stackedOp;
/**
* This member stores a pointer to the display area
*/
TQLabel *display;
/**
* This member array stores the pointers to the various
* buttons of the calculator. It is setup during the
* constructor of this object
*/
KPushButton *buttons[20];
/**
* This enumeration type stores the values used for the
* various keys internally
*/
enum {
/* 0-9 are used by digits */
COMMA = 10,
/*
* make sure, that PLUS through ETQUAL remain in
* the order they are. Otherwise, check the calculation
* signal mapper
*/
PLUS,
MINUS,
SLASH,
STAR,
ETQUAL,
PLUSMINUS,
PERCENT,
CLEAR,
CLEARALL,
/* insert new buttons before this line */
MAX_BUTTONS
};
/**
* This flag signals, if the operand should be replaced upon
* a digit key pressure. Defaults to false and will be set, if
* setInitialValues() is called without an operation.
*/
bool m_clearOperandOnDigit;
};
#endif