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.
448 lines
12 KiB
448 lines
12 KiB
15 years ago
|
/*
|
||
|
$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
|