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.
koffice/kspread/plugins/calculator/kcalc.h

448 lines
12 KiB

/*
$Id: kcalc.h 466447 2005-10-02 17:54:10Z zander $
KCalc, a scientific calculator for the X window system using the
Qt widget libraries, available at no cost at http://www.troll.no
Copyright (C) 1996 Bernd Johannes Wuebben
wuebben@math.cornell.edu
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef QTCALC_H
#define QTCALC_H
#include <queue>
using std::queue;
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <qlistbox.h>
#include <qclipboard.h>
#include <qptrlist.h>
#include <qaccel.h>
#include <qtabdialog.h>
#include <qwidget.h>
#include <qtimer.h>
#include <qdialog.h>
#include <qpixmap.h>
#include <qapplication.h>
#include <qfont.h>
#include <qlabel.h>
#include <qbuttongroup.h>
#include <qcheckbox.h>
#include <qframe.h>
#include <qgroupbox.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qradiobutton.h>
#include <qtooltip.h>
#include <qstring.h>
#include <qrect.h>
#include "dlabel.h"
#include "stats.h"
// IMPORTANT this has to come after ../config.h
#include "kcalctype.h"
#define STACK_SIZE 100
#define TEMP_STACK_SIZE 1000 // the number of numbers kept in the temp stack
// which are accessible with the up and down arrow
// key
#define PRECEDENCE_INCR 20
#define FUNC_NULL 0
#define FUNC_OR 1
#define FUNC_XOR 2
#define FUNC_AND 3
#define FUNC_LSH 4
#define FUNC_RSH 5
#define FUNC_ADD 6
#define FUNC_SUBTRACT 7
#define FUNC_MULTIPLY 8
#define FUNC_DIVIDE 9
#define FUNC_MOD 10
#define FUNC_POWER 11
#define FUNC_PWR_ROOT 12
#define FUNC_INTDIV 13
#define DEC_SIZE 19
#define BOH_SIZE 16
#define DSP_SIZE 50 //25
#define DEG2RAD(x) (((2L*pi)/360L)*x)
#define GRA2RAD(x) ((pi/200L)*x)
#define RAD2DEG(x) ((360L/(2L*pi))*x)
#define RAD2GRA(x) ((200L/pi)*x)
#define POS_ZERO 1e-19L /* What we consider zero is */
#define NEG_ZERO -1e-19L /* anything between these two */
typedef CALCAMNT (*Arith)(CALCAMNT, CALCAMNT);
typedef CALCAMNT (*Prcnt)(CALCAMNT, CALCAMNT, CALCAMNT);
typedef CALCAMNT (*Trig)(CALCAMNT);
typedef enum _last_input_type {
DIGIT = 1, OPERATION = 2, RECALL = 3, PASTE = 4
} last_input_type;
typedef enum _num_base {
NB_BINARY = 2, NB_OCTAL = 8, NB_DECIMAL = 10, NB_HEX = 16
} num_base;
typedef enum _angle_type {
ANG_DEGREE = 0, ANG_RADIAN = 1, ANG_GRADIENT = 2
} angle_type;
typedef enum _item_type {
ITEM_FUNCTION, ITEM_AMOUNT
} item_type;
typedef struct _func_data {
int item_function;
int item_precedence;
} func_data;
typedef union _item_data { /* The item data */
CALCAMNT item_amount; /* an amount */
func_data item_func_data; /* or a function */
} item_data; /* called item_data */
typedef struct _item_contents { /* The item contents */
item_type s_item_type; /* a type flag */
item_data s_item_data; /* and data */
} item_contents;
typedef struct stack_item *stack_ptr;
typedef struct stack_item {
/* Contents of an item on the input stack */
stack_ptr prior_item; /* Pointer to prior item */
stack_ptr prior_type; /* Pointer to prior type */
item_contents item_value; /* The value of the item */
} stack_item; /* all called stack_item */
CALCAMNT ExecOr(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecXor(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecAnd(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecLsh(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecRsh(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecAdd(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecSubtract(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecMultiply(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecDivide(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecMod(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecPower(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecPwrRoot(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecIntDiv(CALCAMNT left_op, CALCAMNT right_op);
CALCAMNT ExecAddSubP(CALCAMNT left_op, CALCAMNT right_op, CALCAMNT result);
CALCAMNT ExecMultiplyP(CALCAMNT left_op, CALCAMNT right_op, CALCAMNT result);
CALCAMNT ExecDivideP(CALCAMNT left_op, CALCAMNT right_op, CALCAMNT result);
CALCAMNT ExecPowerP(CALCAMNT left_op, CALCAMNT right_op, CALCAMNT result);
CALCAMNT ExecPwrRootP(CALCAMNT left_op, CALCAMNT right_op, CALCAMNT result);
int UpdateStack(int run_precedence);
CALCAMNT ExecFunction(CALCAMNT left_op, int function, CALCAMNT right_op);
int cvb(char *out_str, long amount, int max_out);
void PrintStack(void);
void InitStack(void);
void PushStack(item_contents *add_item);
item_contents *PopStack(void);
item_contents *TopOfStack(void);
item_contents *TopTypeStack(item_type rqstd_type);
#define DISPLAY_AMOUNT display_data.s_item_data.item_amount
typedef struct _DefStruct{
QColor forecolor;
QColor backcolor;
int precision;
int fixedprecision;
int style;
bool fixed;
bool beep;
QFont font;
}DefStruct;
class Calculator;
class QtCalculator : public QDialog
{
Q_OBJECT
public:
QtCalculator( Calculator* _corba, QWidget *parent=0, const char *name=0 );
~QtCalculator();
void keyPressEvent( QKeyEvent *e );
void keyReleaseEvent( QKeyEvent *e );
void closeEvent( QCloseEvent *e );
void readSettings();
void writeSettings();
void set_precision();
void set_style();
void set_display_font();
void temp_stack_next();
void temp_stack_prev();
void ComputeMean();
void ComputeSin();
void ComputeStd();
void ComputeCos();
void ComputeMedean();
void ComputeTan();
void ComputeSum();
void ComputeMul();
void ComputeMin();
void ComputeMax();
void setLabel( const char *_text );
void setValue( double _value );
void setData( const QRect& _range, const char *_sheet );
void useData();
public slots:
void helpclicked();
void set_colors();
void display_selected();
void invertColors();
void selection_timed_out();
void clear_buttons();
void clear_status_label();
void setStatusLabel(const QString&);
void EnterDigit(int data);
void EnterDecimal();
void EnterStackFunction(int data);
void EnterNegate();
void EnterOpenParen();
void EnterCloseParen();
void EnterRecip();
void EnterInt();
void EnterFactorial();
void EnterSquare();
void EnterNotCmp();
void EnterHyp();
void EnterPercent();
void EnterLogr();
void EnterLogn();
void SetDeg();
void SetGra();
void SetRad();
void SetHex();
void SetOct();
void SetBin();
void SetDec();
void Deg_Selected();
void Rad_Selected();
void Gra_Selected();
void Hex_Selected();
void Dec_Selected();
void Oct_Selected();
void Bin_Selected();
void SetInverse();
void EnterEqual();
void Clear();
void ClearAll();
void RefreshCalculator(void);
void InitializeCalculator(void);
void UpdateDisplay();
void ExecSin();
void ExecCos();
void ExecTan();
void button0();
void button1();
void button2();
void button3();
void button4();
void button5();
void button6();
void button7();
void button8();
void button9();
void buttonA();
void buttonB();
void buttonC();
void buttonD();
void buttonE();
void buttonF();
void base_selected(int number);
void angle_selected(int number);
void Or();
void And();
void Shift();
void Plus();
void Minus();
void Multiply();
void Divide();
void Mod();
void Power();
void EE();
void MR();
void Mplusminus();
void MC();
void exit();
void EEtoggled(bool myboolean);
void pbinvtoggled(bool myboolean);
void pbMRtoggled(bool myboolean);
void pbAtoggled(bool myboolean);
void pbSintoggled(bool myboolean);
void pbplusminustoggled(bool myboolean);
void pbMplusminustoggled(bool myboolean);
void pbBtoggled(bool myboolean);
void pbCostoggled(bool myboolean);
void pbrecitoggled(bool myboolean);
void pbCtoggled(bool myboolean);
void pbTantoggled(bool myboolean);
void pbfactorialtoggled(bool myboolean);
void pbDtoggled(bool myboolean);
void pblogtoggled(bool myboolean);
void pbsquaretoggled(bool myboolean);
void pbEtoggled(bool myboolean);
void pblntoggled(bool myboolean);
void pbpowertoggled(bool myboolean);
void pbFtoggled(bool myboolean);
void pbMCtoggled(bool myboolean);
void pbCleartoggled(bool myboolean);
void pbACtoggled(bool myboolean);
void pb7toggled(bool myboolean);
void pb8toggled(bool myboolean);
void pb9toggled(bool myboolean);
void pbparenopentoggled(bool myboolean);
void pbparenclosetoggled(bool myboolean);
void pbandtoggled(bool myboolean);
void pb4toggled(bool myboolean);
void pb5toggled(bool myboolean);
void pb6toggled(bool myboolean);
void pbXtoggled(bool myboolean);
void pbdivisiontoggled(bool myboolean);
void pbortoggled(bool myboolean);
void pb1toggled(bool myboolean);
void pb2toggled(bool myboolean);
void pb3toggled(bool myboolean);
void pbplustoggled(bool myboolean);
void pbminustoggled(bool myboolean);
void pbshifttoggled(bool myboolean);
void pbperiodtoggled(bool myboolean);
void pb0toggled(bool myboolean);
void pbequaltoggled(bool myboolean);
void pbpercenttoggled(bool myboolean);
void pbnegatetoggled(bool myboolean);
void pbmodtoggled(bool myboolean);
void pbhyptoggled(bool myboolean);
void configclicked();
public:
DefStruct kcalcdefaults;
private:
void updateGeometry();
QTimer* selection_timer;
QLabel* statusINVLabel;
QLabel* statusHYPLabel;
QLabel* statusERRORLabel;
DLabel* calc_display;
QRadioButton* anglebutton[3];
QRadioButton* basebutton[4];
QPushButton* pbhyp;
QPushButton* pbEE;
QPushButton* pbinv;
QPushButton* pbMR;
QPushButton* pbA;
QPushButton* pbSin;
QPushButton* pbplusminus;
QPushButton* pbMplusminus;
QPushButton* pbB;
QPushButton* pbCos;
QPushButton* pbreci;
QPushButton* pbC;
QPushButton* pbTan;
QPushButton* pbfactorial;
QPushButton* pbD;
QPushButton* pblog;
QPushButton* pbsquare;
QPushButton* pbE;
QPushButton* pbln;
QPushButton* pbpower;
QPushButton* pbF;
QPushButton* pbMC;
QPushButton* pbClear;
QPushButton* pbAC;
QPushButton* pb7;
QPushButton* pb8;
QPushButton* pb9;
QPushButton* pbparenopen;
QPushButton* pbparenclose;
QPushButton* pband;
QPushButton* pb4;
QPushButton* pb5;
QPushButton* pb6;
QPushButton* pbX;
QPushButton* pbdivision;
QPushButton* pbor;
QPushButton* pb1;
QPushButton* pb2;
QPushButton* pb3;
QPushButton* pbplus;
QPushButton* pbminus;
QPushButton* pbshift;
QPushButton* pbperiod;
QPushButton* pb0;
QPushButton* pbequal;
QPushButton* pbpercent;
QPushButton* pbnegate;
QPushButton* pbmod;
QPtrList<QPushButton> mNumButtonList;
QPtrList<QPushButton> mFunctionButtonList;
QPtrList<QPushButton> mHexButtonList;
QPtrList<QPushButton> mMemButtonList;
QPtrList<QPushButton> mOperationButtonList;
bool key_pressed;
KStats stats;
QListBox *paper;
QTimer *status_timer;
QRect sheet_range;
QString sheet_name;
Calculator* corba;
QWidget *mSmallPage;
QWidget *mLargePage;
int mInternalSpacing;
};
#endif //QTCLAC_H