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.
tdeutils/kcalc/kcalc.cpp

2306 lines
70 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
kCalculator, a simple scientific calculator for KDE
Copyright (C) 1996-2000 Bernd Johannes Wuebben
wuebben@kde.org
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.
*/
#include "../config.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <tqbuttongroup.h>
#include <tqfont.h>
#include <tqhbuttongroup.h>
#include <tqlayout.h>
#include <tqobjectlist.h>
#include <tqradiobutton.h>
#include <tqspinbox.h>
#include <tqstyle.h>
#include <tqtooltip.h>
#include <tdeaboutdata.h>
#include <tdeaccel.h>
#include <tdeaction.h>
#include <tdeapplication.h>
#include <tdecmdlineargs.h>
#include <kcolorbutton.h>
#include <kcolordrag.h>
#include <tdeconfig.h>
#include <tdeconfigdialog.h>
#include <kdialog.h>
#include <tdefontdialog.h>
#include <tdeglobal.h>
#include <tdeglobalsettings.h>
#include <kkeydialog.h>
#include <tdemenubar.h>
#include <knotifyclient.h>
#include <knumvalidator.h>
#include <tdepopupmenu.h>
#include <kpushbutton.h>
#include <kstatusbar.h>
#include <kstdaction.h>
#include "dlabel.h"
#include "kcalc.h"
#include "kcalc_const_menu.h"
#include "version.h"
#include "general.h"
#include "colors.h"
#include "constants.h"
#include <tdeaccelmanager.h>
#include "kcalc_settings.h"
static const char description[] = I18N_NOOP("TDE Calculator");
static const char version[] = KCALCVERSION;
KCalculator::KCalculator(TQWidget *parent, const char *name)
: TDEMainWindow(parent, name), inverse(false),
hyp_mode(false), memory_num(0.0), calc_display(NULL),
mInternalSpacing(4), core()
{
/* central widget to contain all the elements */
TQWidget *central = new TQWidget(this);
setCentralWidget(central);
TDEAcceleratorManager::setNoAccel( central );
// Detect color change
connect(kapp,TQT_SIGNAL(tdedisplayPaletteChanged()), TQT_SLOT(set_colors()));
calc_display = new DispLogic(central, "display", actionCollection());
setupMainActions();
setupStatusbar();
createGUI();
// How can I make the toolBar not appear at all?
// This is not a nice solution.
toolBar()->close();
// Create Button to select BaseMode
BaseChooseGroup = new TQHButtonGroup(i18n("Base"), central);
connect(BaseChooseGroup, TQT_SIGNAL(clicked(int)), TQT_SLOT(slotBaseSelected(int)));
BaseChooseGroup->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Fixed, false);
pbBaseChoose[0] = new TQRadioButton(i18n("He&x"), BaseChooseGroup,
"Hexadecimal-Switch");
TQToolTip::add(pbBaseChoose[0], i18n("Switch base to hexadecimal."));
pbBaseChoose[1] = new TQRadioButton(i18n("&Dec"), BaseChooseGroup,
"Decimal-Switch");
TQToolTip::add(pbBaseChoose[1], i18n("Switch base to decimal."));
pbBaseChoose[2] = new TQRadioButton(i18n("&Oct"), BaseChooseGroup,
"Octal-Switch");
TQToolTip::add(pbBaseChoose[2], i18n("Switch base to octal."));
pbBaseChoose[3] = new TQRadioButton(i18n("&Bin"), BaseChooseGroup,
"Binary-Switch");
TQToolTip::add(pbBaseChoose[3], i18n("Switch base to binary."));
// Create Button to select AngleMode
pbAngleChoose = new TQPushButton(i18n("&Angle"),
central, "ChooseAngleMode-Button");
TQToolTip::add(pbAngleChoose, i18n("Choose the unit for the angle measure"));
pbAngleChoose->setAutoDefault(false);
TDEPopupMenu *angle_menu = new TDEPopupMenu(pbAngleChoose, "AngleMode-Selection-Menu");
angle_menu->insertItem(i18n("Degrees"), 0);
angle_menu->insertItem(i18n("Radians"), 1);
angle_menu->insertItem(i18n("Gradians"), 2);
angle_menu->setCheckable(true);
connect(angle_menu, TQT_SIGNAL(activated(int)), TQT_SLOT(slotAngleSelected(int)));
pbAngleChoose->setPopup(angle_menu);
pbInv = new KCalcButton("Inv", central, "Inverse-Button",
i18n("Inverse mode"));
pbInv->setAccel(Key_I);
connect(pbInv, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotInvtoggled(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbInv, TQT_SLOT(slotSetAccelDisplayMode(bool)));
pbInv->setToggleButton(true);
//
// Create Calculator Buttons
//
// First the widgets that are the parents of the buttons
mSmallPage = new TQWidget(central);
mLargePage = new TQWidget(central);
mNumericPage = setupNumericKeys(central);
setupLogicKeys(mSmallPage);
setupStatisticKeys(mSmallPage);
setupScientificKeys(mSmallPage);
setupConstantsKeys(mSmallPage);
pbMod = new KCalcButton(mSmallPage, "Modulo-Button");
pbMod->addMode(ModeNormal, "Mod", i18n("Modulo"));
pbMod->addMode(ModeInverse, "IntDiv", i18n("Integer division"));
pbMod->setAccel(Key_Colon);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
pbMod, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbMod, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbMod, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotModclicked(void)));
pbReci = new KCalcButton(mSmallPage, "Reciprocal-Button");
pbReci->addMode(ModeNormal, "1/x", i18n("Reciprocal"));
pbReci->setAccel(Key_R);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbReci, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbReci, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotReciclicked(void)));
pbFactorial = new KCalcButton(mSmallPage, "Factorial-Button");
pbFactorial->addMode(ModeNormal, "x!", i18n("Factorial"));
pbFactorial->setAccel(Key_Exclam);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbFactorial, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbFactorial, TQT_SIGNAL(clicked(void)),TQT_SLOT(slotFactorialclicked(void)));
// Representation of x^2 is moved to the function
// changeRepresentation() that paints the letters When
// pressing the INV Button a sqrt symbol will be drawn on that
// button
pbSquare = new KCalcButton(mSmallPage, "Square-Button");
pbSquare->addMode(ModeNormal, "x<sup>2</sup>", i18n("Square"), true);
pbSquare->addMode(ModeInverse, "x<sup>3</sup>", i18n("Third power"), true);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbSquare, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
pbSquare, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(pbSquare, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotSquareclicked(void)));
pbRoot = new KSquareButton(mSmallPage, "Square-Button");
pbRoot->addMode(ModeNormal, "sqrt(x)", i18n("Square root"));
pbRoot->addMode(ModeInverse, "sqrt[3](x)", i18n("Cube root"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbRoot, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
pbRoot, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(pbRoot, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotRootclicked(void)));
// Representation of x^y is moved to the function
// changeRepresentation() that paints the letters When
// pressing the INV Button y^x will be drawn on that button
pbPower = new KCalcButton(mSmallPage, "Power-Button");
pbPower->addMode(ModeNormal, "x<sup>y</sup>", i18n("x to the power of y"), true);
pbPower->addMode(ModeInverse, "x<sup>1/y</sup>", i18n("x to the power of 1/y"), true);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbPower, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
pbPower, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
pbPower->setAccel(Key_AsciiCircum);
connect(pbPower, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotPowerclicked(void)));
//
// All these layouts are needed because all the groups have their
// own size per row so we can't use one huge TQGridLayout (mosfet)
//
TQGridLayout *smallBtnLayout = new TQGridLayout(mSmallPage, 6, 4, 0,
mInternalSpacing);
TQGridLayout *largeBtnLayout = new TQGridLayout(mLargePage, 5, 2, 0,
mInternalSpacing);
TQHBoxLayout *topLayout = new TQHBoxLayout();
TQHBoxLayout *btnLayout = new TQHBoxLayout();
// bring them all together
TQVBoxLayout *mainLayout = new TQVBoxLayout(central, mInternalSpacing,
mInternalSpacing);
mainLayout->addLayout(topLayout);
mainLayout->addLayout(btnLayout);
// button layout
btnLayout->addWidget(mSmallPage, 0, AlignTop);
btnLayout->addSpacing(2*mInternalSpacing);
btnLayout->addWidget(mNumericPage, 0, AlignTop);
btnLayout->addSpacing(2*mInternalSpacing);
btnLayout->addWidget(mLargePage, 0, AlignTop);
// small button layout
smallBtnLayout->addWidget(pbStat["NumData"], 0, 0);
smallBtnLayout->addWidget(pbScientific["HypMode"], 0, 1);
smallBtnLayout->addWidget(pbLogic["AND"], 0, 2);
smallBtnLayout->addWidget(pbMod, 0, 3);
smallBtnLayout->addWidget(NumButtonGroup->find(0xA), 0, 4);
smallBtnLayout->addWidget(pbConstant[0], 0, 5);
smallBtnLayout->addWidget(pbStat["Mean"], 1, 0);
smallBtnLayout->addWidget(pbScientific["Sine"], 1, 1);
smallBtnLayout->addWidget(pbLogic["OR"], 1, 2);
smallBtnLayout->addWidget(pbReci, 1, 3);
smallBtnLayout->addWidget(NumButtonGroup->find(0xB), 1, 4);
smallBtnLayout->addWidget(pbConstant[1], 1, 5);
smallBtnLayout->addWidget(pbStat["StandardDeviation"], 2, 0);
smallBtnLayout->addWidget(pbScientific["Cosine"], 2, 1);
smallBtnLayout->addWidget(pbLogic["XOR"], 2, 2);
smallBtnLayout->addWidget(pbFactorial, 2, 3);
smallBtnLayout->addWidget(NumButtonGroup->find(0xC), 2, 4);
smallBtnLayout->addWidget(pbConstant[2], 2, 5);
smallBtnLayout->addWidget(pbStat["Median"], 3, 0);
smallBtnLayout->addWidget(pbScientific["Tangent"], 3, 1);
smallBtnLayout->addWidget(pbLogic["LeftShift"], 3, 2);
smallBtnLayout->addWidget(pbSquare, 3, 3);
smallBtnLayout->addWidget(NumButtonGroup->find(0xD), 3, 4);
smallBtnLayout->addWidget(pbConstant[3], 3, 5);
smallBtnLayout->addWidget(pbStat["InputData"], 4, 0);
smallBtnLayout->addWidget(pbScientific["Log10"], 4, 1);
smallBtnLayout->addWidget(pbLogic["RightShift"], 4, 2);
smallBtnLayout->addWidget(pbRoot, 4, 3);
smallBtnLayout->addWidget(NumButtonGroup->find(0xE), 4, 4);
smallBtnLayout->addWidget(pbConstant[4], 4, 5);
smallBtnLayout->addWidget(pbStat["ClearData"], 5, 0);
smallBtnLayout->addWidget(pbScientific["LogNatural"], 5, 1);
smallBtnLayout->addWidget(pbLogic["One-Complement"], 5, 2);
smallBtnLayout->addWidget(pbPower, 5, 3);
smallBtnLayout->addWidget(NumButtonGroup->find(0xF), 5, 4);
smallBtnLayout->addWidget(pbConstant[5], 5, 5);
smallBtnLayout->setRowStretch(0, 0);
smallBtnLayout->setRowStretch(1, 0);
smallBtnLayout->setRowStretch(2, 0);
smallBtnLayout->setRowStretch(3, 0);
smallBtnLayout->setRowStretch(4, 0);
smallBtnLayout->setRowStretch(5, 0);
// large button layout
largeBtnLayout->addWidget(pbClear, 0, 0);
largeBtnLayout->addWidget(pbAC, 0, 1);
largeBtnLayout->addWidget(pbParenOpen, 1, 0);
largeBtnLayout->addWidget(pbParenClose, 1, 1);
largeBtnLayout->addWidget(pbMemRecall, 2, 0);
largeBtnLayout->addWidget(pbMemStore, 2, 1);
largeBtnLayout->addWidget(pbMemPlusMinus, 3, 0);
largeBtnLayout->addWidget(pbMC, 3, 1);
largeBtnLayout->addWidget(pbPercent, 4, 0);
largeBtnLayout->addWidget(pbPlusMinus, 4, 1);
// top layout
topLayout->addWidget(pbAngleChoose);
topLayout->addWidget(BaseChooseGroup);
topLayout->addStretch();
topLayout->addWidget(pbInv);
mainLayout->insertWidget(0, calc_display);
mFunctionButtonList.append(pbScientific["HypMode"]);
mFunctionButtonList.append(pbInv);
mFunctionButtonList.append(pbRoot);
mFunctionButtonList.append(pbScientific["Sine"]);
mFunctionButtonList.append(pbPlusMinus);
mFunctionButtonList.append(pbScientific["Cosine"]);
mFunctionButtonList.append(pbReci);
mFunctionButtonList.append(pbScientific["Tangent"]);
mFunctionButtonList.append(pbFactorial);
mFunctionButtonList.append(pbScientific["Log10"]);
mFunctionButtonList.append(pbSquare);
mFunctionButtonList.append(pbScientific["LogNatural"]);
mFunctionButtonList.append(pbPower);
mMemButtonList.append(pbEE);
mMemButtonList.append(pbMemRecall);
mMemButtonList.append(pbMemPlusMinus);
mMemButtonList.append(pbMemStore);
mMemButtonList.append(pbMC);
mMemButtonList.append(pbClear);
mMemButtonList.append(pbAC);
mOperationButtonList.append(pbX);
mOperationButtonList.append(pbParenOpen);
mOperationButtonList.append(pbParenClose);
mOperationButtonList.append(pbLogic["AND"]);
mOperationButtonList.append(pbDivision);
mOperationButtonList.append(pbLogic["OR"]);
mOperationButtonList.append(pbLogic["XOR"]);
mOperationButtonList.append(pbPlus);
mOperationButtonList.append(pbMinus);
mOperationButtonList.append(pbLogic["LeftShift"]);
mOperationButtonList.append(pbLogic["RightShift"]);
mOperationButtonList.append(pbPeriod);
mOperationButtonList.append(pbEqual);
mOperationButtonList.append(pbPercent);
mOperationButtonList.append(pbLogic["One-Complement"]);
mOperationButtonList.append(pbMod);
set_colors();
// Show the result in the app's caption in taskbar (wishlist - bug #52858)
if (KCalcSettings::captionResult() == true)
connect(calc_display,
TQT_SIGNAL(changedText(const TQString &)),
TQT_SLOT(setCaption(const TQString &)));
calc_display->changeSettings();
set_precision();
// Switch to decimal
resetBase();
slotAngleSelected(0);
updateGeometry();
adjustSize();
setFixedSize(sizeHint());
UpdateDisplay(true);
// Read and set button groups
actionStatshow->setChecked(KCalcSettings::showStat());
slotStatshow(KCalcSettings::showStat());
actionScientificshow->setChecked(KCalcSettings::showScientific());
slotScientificshow(KCalcSettings::showScientific());
actionLogicshow->setChecked(KCalcSettings::showLogic());
slotLogicshow(KCalcSettings::showLogic());
actionConstantsShow->setChecked(KCalcSettings::showConstants());
slotConstantsShow(KCalcSettings::showConstants());
}
KCalculator::~KCalculator()
{
KCalcSettings::writeConfig();
delete calc_display;
}
void KCalculator::setupMainActions(void)
{
// file menu
KStdAction::quit(TQT_TQOBJECT(this), TQT_SLOT(close()), actionCollection());
// edit menu
KStdAction::cut(TQT_TQOBJECT(calc_display), TQT_SLOT(slotCut()), actionCollection());
KStdAction::copy(TQT_TQOBJECT(calc_display), TQT_SLOT(slotCopy()), actionCollection());
KStdAction::paste(TQT_TQOBJECT(calc_display), TQT_SLOT(slotPaste()), actionCollection());
// settings menu
actionStatshow = new TDEToggleAction(i18n("&Statistic Buttons"), 0,
actionCollection(), "show_stat");
actionStatshow->setChecked(true);
connect(actionStatshow, TQT_SIGNAL(toggled(bool)),
TQT_SLOT(slotStatshow(bool)));
actionScientificshow = new TDEToggleAction(i18n("Science/&Engineering Buttons"),
0, actionCollection(), "show_science");
actionScientificshow->setChecked(true);
connect(actionScientificshow, TQT_SIGNAL(toggled(bool)),
TQT_SLOT(slotScientificshow(bool)));
actionLogicshow = new TDEToggleAction(i18n("&Logic Buttons"), 0,
actionCollection(), "show_logic");
actionLogicshow->setChecked(true);
connect(actionLogicshow, TQT_SIGNAL(toggled(bool)),
TQT_SLOT(slotLogicshow(bool)));
actionConstantsShow = new TDEToggleAction(i18n("&Constants Buttons"), 0,
actionCollection(), "show_constants");
actionConstantsShow->setChecked(true);
connect(actionConstantsShow, TQT_SIGNAL(toggled(bool)),
TQT_SLOT(slotConstantsShow(bool)));
(void) new TDEAction(i18n("&Show All"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotShowAll()),
actionCollection(), "show_all");
(void) new TDEAction(i18n("&Hide All"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotHideAll()),
actionCollection(), "hide_all");
KStdAction::preferences(TQT_TQOBJECT(this), TQT_SLOT(showSettings()), actionCollection());
KStdAction::keyBindings(guiFactory(), TQT_SLOT(configureShortcuts()),
actionCollection());
}
void KCalculator::setupStatusbar(void)
{
// Status bar contents
statusBar()->insertFixedItem(" NORM ", 0, true);
statusBar()->setItemAlignment(0, AlignCenter);
statusBar()->insertFixedItem(" HEX ", 1, true);
statusBar()->setItemAlignment(1, AlignCenter);
statusBar()->insertFixedItem(" DEG ", 2, true);
statusBar()->setItemAlignment(2, AlignCenter);
statusBar()->insertFixedItem(" \xa0\xa0 ", 3, true); // Memory indicator
statusBar()->setItemAlignment(3, AlignCenter);
}
TQWidget* KCalculator::setupNumericKeys(TQWidget *parent)
{
TQ_CHECK_PTR(mSmallPage);
TQ_CHECK_PTR(mLargePage);
TQWidget *thisPage = new TQWidget(parent);
KCalcButton *tmp_pb;
NumButtonGroup = new TQButtonGroup(0, "Num-Button-Group");
connect(NumButtonGroup, TQT_SIGNAL(clicked(int)),
TQT_SLOT(slotNumberclicked(int)));
tmp_pb = new KCalcButton("0", thisPage, "0-Button");
tmp_pb->setAccel(Key_0);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0);
tmp_pb = new KCalcButton("1", thisPage, "1-Button");
tmp_pb->setAccel(Key_1);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 1);
tmp_pb = new KCalcButton("2", thisPage, "2-Button");
tmp_pb->setAccel(Key_2);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 2);
tmp_pb = new KCalcButton("3", thisPage, "3-Button");
tmp_pb->setAccel(Key_3);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 3);
tmp_pb = new KCalcButton("4", thisPage, "4-Button");
tmp_pb->setAccel(Key_4);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 4);
tmp_pb = new KCalcButton("5", thisPage, "5-Button");
tmp_pb->setAccel(Key_5);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 5);
tmp_pb = new KCalcButton("6", thisPage, "6-Button");
tmp_pb->setAccel(Key_6);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 6);
tmp_pb = new KCalcButton("7", thisPage, "7-Button");
tmp_pb->setAccel(Key_7);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 7);
tmp_pb = new KCalcButton("8", thisPage, "8-Button");
tmp_pb->setAccel(Key_8);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 8);
tmp_pb = new KCalcButton("9", thisPage, "9-Button");
tmp_pb->setAccel(Key_9);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 9);
pbEE = new KCalcButton(thisPage, "EE-Button");
pbEE->addMode(ModeNormal, "x<small>" "\xb7" "10</small><sup>y</sup>",
i18n("Exponent"), true);
pbEE->setAccel(Key_E);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbEE, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbEE, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotEEclicked(void)));
pbParenClose = new KCalcButton(")", mLargePage, "ParenClose-Button");
pbParenClose->setAccel(Key_ParenRight);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbParenClose, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbParenClose,TQT_SIGNAL(clicked(void)),TQT_SLOT(slotParenCloseclicked(void)));
pbX = new KCalcButton("X", thisPage, "Multiply-Button", i18n("Multiplication"));
pbX->setAccel(Key_multiply);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbX, TQT_SLOT(slotSetAccelDisplayMode(bool)));
accel()->insert("Pressed '*'", i18n("Pressed Multiplication-Button"),
0, Key_Asterisk, TQT_TQOBJECT(pbX), TQT_SLOT(animateClick()));
connect(pbX, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotXclicked(void)));
pbDivision = new KCalcButton("/", thisPage, "Division-Button", i18n("Division"));
pbDivision->setAccel(Key_Slash);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbDivision, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbDivision, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotDivisionclicked(void)));
pbPlus = new KCalcButton("+", thisPage, "Plus-Button", i18n("Addition"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbPlus, TQT_SLOT(slotSetAccelDisplayMode(bool)));
pbPlus->setAccel(Key_Plus);
connect(pbPlus, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotPlusclicked(void)));
pbMinus = new KCalcButton("-", thisPage, "Minus-Button", i18n("Subtraction"));
pbMinus->setAccel(Key_Minus);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbMinus, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbMinus, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotMinusclicked(void)));
pbPeriod = new KCalcButton(TDEGlobal::locale()->decimalSymbol(), thisPage,
"Period-Button", i18n("Decimal point"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
TQT_TQOBJECT(pbPeriod), TQT_SLOT(slotSetAccelDisplayMode(bool)));
accel()->insert("Decimal Point (Period)", i18n("Pressed Decimal Point"),
0, Key_Period, TQT_TQOBJECT(pbPeriod), TQT_SLOT(animateClick()));
accel()->insert("Decimal Point (Comma)", i18n("Pressed Decimal Point"),
0, Key_Comma, TQT_TQOBJECT(pbPeriod), TQT_SLOT(animateClick()));
connect(TQT_TQOBJECT(pbPeriod), TQT_SIGNAL(clicked(void)), TQT_SLOT(slotPeriodclicked(void)));
pbEqual = new KCalcButton("=", thisPage, "Equal-Button", i18n("Result"));
pbEqual->setAccel(Key_Enter);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
TQT_TQOBJECT(pbEqual), TQT_SLOT(slotSetAccelDisplayMode(bool)));
accel()->insert("Entered Equal", i18n("Pressed Equal-Button"),
0, Key_Equal, TQT_TQOBJECT(pbEqual), TQT_SLOT(animateClick()));
accel()->insert("Entered Return", i18n("Pressed Equal-Button"),
0, Key_Return, TQT_TQOBJECT(pbEqual), TQT_SLOT(animateClick()));
connect(TQT_TQOBJECT(pbEqual), TQT_SIGNAL(clicked(void)), TQT_SLOT(slotEqualclicked(void)));
TQGridLayout *thisLayout = new TQGridLayout(thisPage, 5, 4, 0,
mInternalSpacing);
// large button layout
thisLayout->addWidget(pbEE, 0, 0);
thisLayout->addWidget(pbDivision, 0, 1);
thisLayout->addWidget(pbX, 0, 2);
thisLayout->addWidget(pbMinus, 0, 3);
thisLayout->addWidget(NumButtonGroup->find(7), 1, 0);
thisLayout->addWidget(NumButtonGroup->find(8), 1, 1);
thisLayout->addWidget(NumButtonGroup->find(9), 1, 2);
thisLayout->addMultiCellWidget(pbPlus, 1, 2, 3, 3);
thisLayout->addWidget(NumButtonGroup->find(4), 2, 0);
thisLayout->addWidget(NumButtonGroup->find(5), 2, 1);
thisLayout->addWidget(NumButtonGroup->find(6), 2, 2);
//thisLayout->addMultiCellWidget(pbPlus, 1, 2, 3, 3);
thisLayout->addWidget(NumButtonGroup->find(1), 3, 0);
thisLayout->addWidget(NumButtonGroup->find(2), 3, 1);
thisLayout->addWidget(NumButtonGroup->find(3), 3, 2);
thisLayout->addMultiCellWidget(pbEqual, 3, 4, 3, 3);
thisLayout->addMultiCellWidget(NumButtonGroup->find(0), 4, 4, 0, 1);
thisLayout->addWidget(pbPeriod, 4, 2);
//thisLayout->addMultiCellWidget(pbEqual, 3, 4, 3, 3);
thisLayout->addColSpacing(0,10);
thisLayout->addColSpacing(1,10);
thisLayout->addColSpacing(2,10);
thisLayout->addColSpacing(3,10);
thisLayout->addColSpacing(4,10);
pbMemRecall = new KCalcButton("MR", mLargePage, "MemRecall-Button", i18n("Memory recall"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbMemRecall, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbMemRecall, TQT_SIGNAL(clicked(void)),
TQT_SLOT(slotMemRecallclicked(void)));
pbMemRecall->setDisabled(true); // At start, there is nothing in memory
pbMemPlusMinus = new KCalcButton(mLargePage, "MPlusMinus-Button");
pbMemPlusMinus->addMode(ModeNormal, "M+", i18n("Add display to memory"));
pbMemPlusMinus->addMode(ModeInverse, "M-", i18n("Subtract from memory"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
pbMemPlusMinus, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbMemPlusMinus, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbMemPlusMinus,TQT_SIGNAL(clicked(void)),
TQT_SLOT(slotMemPlusMinusclicked(void)));
pbMemStore = new KCalcButton("MS", mLargePage, "MemStore-Button",
i18n("Memory store"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbMemStore, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbMemStore, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotMemStoreclicked(void)));
pbMC = new KCalcButton("MC", mLargePage, "MemClear-Button", i18n("Clear memory"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbMC, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbMC, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotMCclicked(void)));
pbClear = new KCalcButton("C", mLargePage, "Clear-Button", i18n("Clear"));
pbClear->setAccel(Key_Prior);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
TQT_TQOBJECT(pbClear), TQT_SLOT(slotSetAccelDisplayMode(bool)));
accel()->insert("Entered 'ESC'", i18n("Pressed ESC-Button"), 0,
Key_Escape, TQT_TQOBJECT(pbClear), TQT_SLOT(animateClick()));
connect(TQT_TQOBJECT(pbClear), TQT_SIGNAL(clicked(void)), TQT_SLOT(slotClearclicked(void)));
pbAC = new KCalcButton("AC", mLargePage, "AC-Button", i18n("Clear all"));
pbAC->setAccel(Key_Delete);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbAC, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbAC, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotACclicked(void)));
pbParenOpen = new KCalcButton("(", mLargePage, "ParenOpen-Button");
pbParenOpen->setAccel(Key_ParenLeft);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbParenOpen, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbParenOpen, TQT_SIGNAL(clicked(void)),TQT_SLOT(slotParenOpenclicked(void)));
pbPercent = new KCalcButton("%", mLargePage, "Percent-Button", i18n("Percent"));
pbPercent->setAccel(Key_Percent);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbPercent, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbPercent, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotPercentclicked(void)));
pbPlusMinus = new KCalcButton("\xb1", mLargePage, "Sign-Button", i18n("Change sign"));
pbPlusMinus->setAccel(Key_Backslash);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
pbPlusMinus, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(pbPlusMinus, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotPlusMinusclicked(void)));
tmp_pb = new KCalcButton("A", mSmallPage, "A-Button");
tmp_pb->setAccel(Key_A);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0xA);
tmp_pb = new KCalcButton("B", mSmallPage, "B-Button");
tmp_pb->setAccel(Key_B);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0xB);
tmp_pb = new KCalcButton("C", mSmallPage, "C-Button");
tmp_pb->setAccel(Key_C);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0xC);
tmp_pb = new KCalcButton("D", mSmallPage, "D-Button");
tmp_pb->setAccel(Key_D);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0xD);
tmp_pb = new KCalcButton("E", mSmallPage, "E-Button");
tmp_pb->setAccel(Key_E);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0xE);
tmp_pb = new KCalcButton("F", mSmallPage, "F-Button");
tmp_pb->setAccel(Key_F);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
NumButtonGroup->insert(tmp_pb, 0xF);
return thisPage;
}
void KCalculator::setupLogicKeys(TQWidget *parent)
{
TQ_CHECK_PTR(parent);
KCalcButton *tmp_pb;
tmp_pb = new KCalcButton("AND", parent, "AND-Button", i18n("Bitwise AND"));
pbLogic.insert("AND", tmp_pb);
tmp_pb->setAccel(Key_Ampersand);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotANDclicked(void)));
tmp_pb = new KCalcButton("OR", parent, "OR-Button", i18n("Bitwise OR"));
pbLogic.insert("OR", tmp_pb);
tmp_pb->setAccel(Key_Bar);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotORclicked(void)));
tmp_pb = new KCalcButton("XOR", parent, "XOR-Button", i18n("Bitwise XOR"));
pbLogic.insert("XOR", tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotXORclicked(void)));
tmp_pb = new KCalcButton("Cmp", parent, "One-Complement-Button",
i18n("One's complement"));
pbLogic.insert("One-Complement", tmp_pb);
tmp_pb->setAccel(Key_AsciiTilde);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotNegateclicked(void)));
tmp_pb = new KCalcButton("Lsh", parent, "LeftBitShift-Button",
i18n("Left bit shift"));
tmp_pb->setAccel(Key_Less);
pbLogic.insert("LeftShift", tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)),
TQT_SLOT(slotLeftShiftclicked(void)));
tmp_pb = new KCalcButton("Rsh", parent, "RightBitShift-Button",
i18n("Right bit shift"));
tmp_pb->setAccel(Key_Greater);
pbLogic.insert("RightShift", tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)),
TQT_SLOT(slotRightShiftclicked(void)));
}
void KCalculator::setupScientificKeys(TQWidget *parent)
{
TQ_CHECK_PTR(parent);
KCalcButton *tmp_pb;
tmp_pb = new KCalcButton("Hyp", parent, "Hyp-Button", i18n("Hyperbolic mode"));
pbScientific.insert("HypMode", tmp_pb);
tmp_pb->setAccel(Key_H);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotHyptoggled(bool)));
tmp_pb->setToggleButton(true);
tmp_pb = new KCalcButton(parent, "Sin-Button");
pbScientific.insert("Sine", tmp_pb);
tmp_pb->addMode(ModeNormal, "Sin", i18n("Sine"));
tmp_pb->addMode(ModeInverse, "Asin", i18n("Arc sine"));
tmp_pb->addMode(ModeHyperbolic, "Sinh", i18n("Hyperbolic sine"));
tmp_pb->addMode(ButtonModeFlags(ModeInverse | ModeHyperbolic),
"Asinh", i18n("Inverse hyperbolic sine"));
tmp_pb->setAccel(Key_S);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotSinclicked(void)));
tmp_pb = new KCalcButton(parent, "Cos-Button");
pbScientific.insert("Cosine", tmp_pb);
tmp_pb->addMode(ModeNormal, "Cos", i18n("Cosine"));
tmp_pb->addMode(ModeInverse, "Acos", i18n("Arc cosine"));
tmp_pb->addMode(ModeHyperbolic, "Cosh", i18n("Hyperbolic cosine"));
tmp_pb->addMode(ButtonModeFlags(ModeInverse | ModeHyperbolic),
"Acosh", i18n("Inverse hyperbolic cosine"));
tmp_pb->setAccel(Key_C);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotCosclicked(void)));
tmp_pb = new KCalcButton(parent, "Tan-Button");
pbScientific.insert("Tangent", tmp_pb);
tmp_pb->addMode(ModeNormal, "Tan", i18n("Tangent"));
tmp_pb->addMode(ModeInverse, "Atan", i18n("Arc tangent"));
tmp_pb->addMode(ModeHyperbolic, "Tanh", i18n("Hyperbolic tangent"));
tmp_pb->addMode(ButtonModeFlags(ModeInverse | ModeHyperbolic),
"Atanh", i18n("Inverse hyperbolic tangent"));
tmp_pb->setAccel(Key_T);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)),TQT_SLOT(slotTanclicked(void)));
tmp_pb = new KCalcButton(parent, "Ln-Button");
tmp_pb->addMode(ModeNormal, "Ln", i18n("Natural log"));
tmp_pb->addMode(ModeInverse, "e<sup> x </sup>", i18n("Exponential function"),
true);
pbScientific.insert("LogNatural", tmp_pb);
tmp_pb->setAccel(Key_N);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotLnclicked(void)));
tmp_pb = new KCalcButton(parent, "Log-Button");
tmp_pb->addMode(ModeNormal, "Log", i18n("Logarithm to base 10"));
tmp_pb->addMode(ModeInverse, "10<sup> x </sup>", i18n("10 to the power of x"),
true);
pbScientific.insert("Log10", tmp_pb);
tmp_pb->setAccel(Key_L);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotLogclicked(void)));
}
void KCalculator::setupStatisticKeys(TQWidget *parent)
{
TQ_CHECK_PTR(parent);
KCalcButton *tmp_pb;
tmp_pb = new KCalcButton(parent, "Stat.NumData-Button");
tmp_pb->addMode(ModeNormal, "N", i18n("Number of data entered"));
tmp_pb->addMode(ModeInverse, TQString::fromUtf8("\xce\xa3")
+ "x", i18n("Sum of all data items"));
pbStat.insert("NumData", tmp_pb);
mStatButtonList.append(tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotStatNumclicked(void)));
tmp_pb = new KCalcButton(parent, "Stat.Median-Button");
tmp_pb->addMode(ModeNormal, "Med", i18n("Median"));
pbStat.insert("Median", tmp_pb);
mStatButtonList.append(tmp_pb);
TQToolTip::add(tmp_pb, i18n("Median"));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotStatMedianclicked(void)));
tmp_pb = new KCalcButton(parent, "Stat.Mean-Button");
tmp_pb->addMode(ModeNormal, "Mea", i18n("Mean"));
tmp_pb->addMode(ModeInverse, TQString::fromUtf8("\xce\xa3")
+ "x<sup>2</sup>",
i18n("Sum of all data items squared"), true);
pbStat.insert("Mean", tmp_pb);
mStatButtonList.append(tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotStatMeanclicked(void)));
tmp_pb = new KCalcButton(parent, "Stat.StandardDeviation-Button");
tmp_pb->addMode(ModeNormal, TQString::fromUtf8("σ",-1) + "<sub>N-1</sub>",
i18n("Sample standard deviation"), true);
tmp_pb->addMode(ModeInverse, TQString::fromUtf8("σ",-1) + "<sub>N</sub>",
i18n("Standard deviation"), true);
pbStat.insert("StandardDeviation", tmp_pb);
mStatButtonList.append(tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotStatStdDevclicked(void)));
tmp_pb = new KCalcButton(parent, "Stat.DataInput-Button");
tmp_pb->addMode(ModeNormal, "Dat", i18n("Enter data"));
tmp_pb->addMode(ModeInverse, "CDat", i18n("Delete last data item"));
pbStat.insert("InputData", tmp_pb);
mStatButtonList.append(tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotStatDataInputclicked(void)));
tmp_pb = new KCalcButton(parent, "Stat.ClearData-Button");
tmp_pb->addMode(ModeNormal, "CSt", i18n("Clear data store"));
pbStat.insert("ClearData", tmp_pb);
mStatButtonList.append(tmp_pb);
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(tmp_pb, TQT_SIGNAL(clicked(void)), TQT_SLOT(slotStatClearDataclicked(void)));
}
void KCalculator::setupConstantsKeys(TQWidget *parent)
{
TQ_CHECK_PTR(parent);
ConstButtonGroup = new TQButtonGroup(0, "Const-Button-Group");
connect(ConstButtonGroup, TQT_SIGNAL(clicked(int)), TQT_SLOT(slotConstclicked(int)));
KCalcConstButton *tmp_pb;
tmp_pb = new KCalcConstButton(parent, 0, "C1");
tmp_pb->setAccel(ALT + Key_1);
pbConstant[0] = tmp_pb;
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
ConstButtonGroup->insert(tmp_pb, 0);
tmp_pb = new KCalcConstButton(parent, 1, "C2");
tmp_pb->setAccel(ALT + Key_2);
pbConstant[1] = tmp_pb;
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
ConstButtonGroup->insert(tmp_pb, 1);
tmp_pb = new KCalcConstButton(parent, 2, "C3");
tmp_pb->setAccel(ALT + Key_3);
pbConstant[2] = tmp_pb;
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
ConstButtonGroup->insert(tmp_pb, 2);
tmp_pb = new KCalcConstButton(parent, 3, "C4");
tmp_pb->setAccel(ALT + Key_4);
pbConstant[3] = tmp_pb;
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
ConstButtonGroup->insert(tmp_pb, 3);
tmp_pb = new KCalcConstButton(parent, 4, "C5");
tmp_pb->setAccel(ALT + Key_5);
pbConstant[4] = tmp_pb;
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
ConstButtonGroup->insert(tmp_pb, 4);
tmp_pb = new KCalcConstButton(parent, 5, "C6");
tmp_pb->setAccel(ALT + Key_6);
pbConstant[5] = tmp_pb;
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchShowAccels(bool)),
tmp_pb, TQT_SLOT(slotSetAccelDisplayMode(bool)));
connect(TQT_TQOBJECT(this), TQT_SIGNAL(switchMode(ButtonModeFlags,bool)),
tmp_pb, TQT_SLOT(slotSetMode(ButtonModeFlags,bool)));
ConstButtonGroup->insert(tmp_pb, 5);
changeButtonNames();
// add menu with scientific constants
KCalcConstMenu *tmp_menu = new KCalcConstMenu(this);
menuBar()->insertItem(i18n("&Constants"), tmp_menu, -1, 2);
connect(tmp_menu, TQT_SIGNAL(activated(int)), this,
TQT_SLOT(slotConstantToDisplay(int)));
}
void KCalculator::slotConstantToDisplay(int constant)
{
calc_display->setAmount(KCalcConstMenu::Constants[constant].value);
UpdateDisplay(false);
}
void KCalculator::updateGeometry(void)
{
TQObjectList l;
TQSize s;
int margin;
//
// Calculator buttons
//
s.setWidth(mSmallPage->fontMetrics().width("MMMM"));
s.setHeight(mSmallPage->fontMetrics().lineSpacing());
// why this stupid cast!
l = mSmallPage->childrenListObject();
for(uint i=0; i < l.count(); i++)
{
TQObject *o = l.at(i);
if( o->isWidgetType() )
{
TQWidget *tmp_widget = dynamic_cast<TQWidget *>(o);
margin = TQApplication::style().
pixelMetric(TQStyle::PM_ButtonMargin, (tmp_widget))*2;
tmp_widget->setFixedSize(s.width()+margin, s.height()+margin);
//tmp_widget->setMinimumSize(s.width()+margin, s.height()+margin);
tmp_widget->installEventFilter( this );
tmp_widget->setAcceptDrops(true);
}
}
l = mLargePage->childrenListObject();
int h1 = (NumButtonGroup->find(0x0F))->minimumSize().height();
int h2 = static_cast<int>( (static_cast<float>(h1) + 4.0) / 5.0 );
s.setWidth(mLargePage->fontMetrics().width("MMM") +
TQApplication::style().
pixelMetric(TQStyle::PM_ButtonMargin, NumButtonGroup->find(0x0F))*2);
s.setHeight(h1 + h2);
for(uint i = 0; i < l.count(); i++)
{
TQObject *o = l.at(i);
if(o->isWidgetType())
{
TQWidget *tmp_widget = dynamic_cast<TQWidget *>(o);
tmp_widget->setFixedSize(s);
tmp_widget->installEventFilter(this);
tmp_widget->setAcceptDrops(true);
}
}
pbInv->setFixedSize(s);
pbInv->installEventFilter(this);
pbInv->setAcceptDrops(true);
l = mNumericPage->childrenListObject(); // silence please
h1 = (NumButtonGroup->find(0x0F))->minimumSize().height();
h2 = (int)((((float)h1 + 4.0) / 5.0));
s.setWidth(mLargePage->fontMetrics().width("MMM") +
TQApplication::style().
pixelMetric(TQStyle::PM_ButtonMargin, NumButtonGroup->find(0x0F))*2);
s.setHeight(h1 + h2);
for(uint i = 0; i < l.count(); i++)
{
TQObject *o = l.at(i);
if(o->isWidgetType())
{
TQWidget *tmp_widget = dynamic_cast<TQWidget *>(o);
tmp_widget->setFixedSize(s);
tmp_widget->installEventFilter(this);
tmp_widget->setAcceptDrops(true);
}
}
// Set Buttons of double size
TQSize t(s);
t.setWidth(2*s.width());
NumButtonGroup->find(0x00)->setFixedSize(t);
t = s;
t.setHeight(2*s.height());
pbEqual->setFixedSize(t);
pbPlus->setFixedSize(t);
}
void KCalculator::slotBaseSelected(int base)
{
int current_base;
// set display & statusbar (if item exist in statusbar)
switch(base)
{
case 3:
current_base = calc_display->setBase(NumBase(2));
if (statusBar()->hasItem(1)) statusBar()->changeItem("BIN",1);
calc_display->setStatusText(1, "Bin");
break;
case 2:
current_base = calc_display->setBase(NumBase(8));
if (statusBar()->hasItem(1)) statusBar()->changeItem("OCT",1);
calc_display->setStatusText(1, "Oct");
break;
case 1:
current_base = calc_display->setBase(NumBase(10));
if (statusBar()->hasItem(1)) statusBar()->changeItem("DEC",1);
calc_display->setStatusText(1, "Dec");
break;
case 0:
current_base = calc_display->setBase(NumBase(16));
if (statusBar()->hasItem(1)) statusBar()->changeItem("HEX",1);
calc_display->setStatusText(1, "Hex");
break;
default:
if (statusBar()->hasItem(1)) statusBar()->changeItem("Error",1);
calc_display->setStatusText(1, "Error");
return;
}
// Enable the buttons not available in this base
for (int i=0; i<current_base; i++)
NumButtonGroup->find(i)->setEnabled (true);
// Disable the buttons not available in this base
for (int i=current_base; i<16; i++)
NumButtonGroup->find(i)->setEnabled (false);
// Only enable the decimal point in decimal
pbPeriod->setEnabled(current_base == NB_DECIMAL);
// Only enable the x*10^y button in decimal
pbEE->setEnabled(current_base == NB_DECIMAL);
// Disable buttons that make only sense with floating point
// numbers
if(current_base != NB_DECIMAL)
{
pbScientific["HypMode"]->setEnabled(false);
pbScientific["Sine"]->setEnabled(false);
pbScientific["Cosine"]->setEnabled(false);
pbScientific["Tangent"]->setEnabled(false);
pbScientific["LogNatural"]->setEnabled(false);
pbScientific["Log10"]->setEnabled(false);
}
else
{
pbScientific["HypMode"]->setEnabled(true);
pbScientific["Sine"]->setEnabled(true);
pbScientific["Cosine"]->setEnabled(true);
pbScientific["Tangent"]->setEnabled(true);
pbScientific["LogNatural"]->setEnabled(true);
pbScientific["Log10"]->setEnabled(true);
}
}
void KCalculator::keyPressEvent(TQKeyEvent *e)
{
if ( ( e->state() & KeyButtonMask ) == 0 || ( e->state() & ShiftButton ) ) {
switch (e->key())
{
case Key_Next:
pbAC->animateClick();
break;
case Key_Slash:
case Key_division:
pbDivision->animateClick();
break;
case Key_D:
pbStat["InputData"]->animateClick(); // stat mode
break;
case Key_BracketLeft:
case Key_twosuperior:
pbSquare->animateClick();
break;
case Key_Backspace:
calc_display->deleteLastDigit();
// pbAC->animateClick();
break;
}
}
if (e->key() == Key_Control)
emit switchShowAccels(true);
}
void KCalculator::keyReleaseEvent(TQKeyEvent *e)
{
if (e->key() == Key_Control)
emit switchShowAccels(false);
}
void KCalculator::slotAngleSelected(int number)
{
pbAngleChoose->popup()->setItemChecked(0, false);
pbAngleChoose->popup()->setItemChecked(1, false);
pbAngleChoose->popup()->setItemChecked(2, false);
switch(number)
{
case 0:
_angle_mode = DegMode;
statusBar()->changeItem("DEG", 2);
pbAngleChoose->popup()->setItemChecked(0, true);
calc_display->setStatusText(2, "Deg");
break;
case 1:
_angle_mode = RadMode;
statusBar()->changeItem("RAD", 2);
pbAngleChoose->popup()->setItemChecked(1, true);
calc_display->setStatusText(2, "Rad");
break;
case 2:
_angle_mode = GradMode;
statusBar()->changeItem("GRA", 2);
pbAngleChoose->popup()->setItemChecked(2, true);
calc_display->setStatusText(2, "Gra");
break;
default: // we shouldn't ever end up here
_angle_mode = RadMode;
}
}
void KCalculator::slotEEclicked(void)
{
calc_display->newCharacter('e');
}
void KCalculator::slotInvtoggled(bool flag)
{
inverse = flag;
emit switchMode(ModeInverse, flag);
if (inverse)
{
statusBar()->changeItem("INV", 0);
calc_display->setStatusText(0, "Inv");
}
else
{
statusBar()->changeItem("NORM", 0);
calc_display->setStatusText(0, TQString());
}
}
void KCalculator::slotHyptoggled(bool flag)
{
// toggle between hyperbolic and standart trig functions
hyp_mode = flag;
emit switchMode(ModeHyperbolic, flag);
}
void KCalculator::slotMemRecallclicked(void)
{
// temp. work-around
calc_display->sendEvent(KCalcDisplay::EventReset);
calc_display->setAmount(memory_num);
UpdateDisplay(false);
}
void KCalculator::slotMemStoreclicked(void)
{
EnterEqual();
memory_num = calc_display->getAmount();
calc_display->setStatusText(3, "M");
statusBar()->changeItem("M",3);
pbMemRecall->setEnabled(true);
}
void KCalculator::slotNumberclicked(int number_clicked)
{
calc_display->EnterDigit(number_clicked);
}
void KCalculator::slotSinclicked(void)
{
if (hyp_mode)
{
// sinh or arsinh
if (!inverse)
core.SinHyp(calc_display->getAmount());
else
core.AreaSinHyp(calc_display->getAmount());
}
else
{
// sine or arcsine
if (!inverse)
switch(_angle_mode)
{
case DegMode:
core.SinDeg(calc_display->getAmount());
break;
case RadMode:
core.SinRad(calc_display->getAmount());
break;
case GradMode:
core.SinGrad(calc_display->getAmount());
break;
}
else
switch(_angle_mode)
{
case DegMode:
core.ArcSinDeg(calc_display->getAmount());
break;
case RadMode:
core.ArcSinRad(calc_display->getAmount());
break;
case GradMode:
core.ArcSinGrad(calc_display->getAmount());
break;
}
}
UpdateDisplay(true);
}
void KCalculator::slotPlusMinusclicked(void)
{
// display can only change sign, when in input mode, otherwise we
// need the core to do this.
if (!calc_display->sendEvent(KCalcDisplay::EventChangeSign))
{
core.InvertSign(calc_display->getAmount());
UpdateDisplay(true);
}
}
void KCalculator::slotMemPlusMinusclicked(void)
{
bool tmp_inverse = inverse; // store this, because next command deletes inverse
EnterEqual(); // finish calculation so far, to store result into MEM
if (!tmp_inverse) memory_num += calc_display->getAmount();
else memory_num -= calc_display->getAmount();
pbInv->setOn(false);
statusBar()->changeItem("M",3);
calc_display->setStatusText(3, "M");
pbMemRecall->setEnabled(true);
}
void KCalculator::slotCosclicked(void)
{
if (hyp_mode)
{
// cosh or arcosh
if (!inverse)
core.CosHyp(calc_display->getAmount());
else
core.AreaCosHyp(calc_display->getAmount());
}
else
{
// cosine or arccosine
if (!inverse)
switch(_angle_mode)
{
case DegMode:
core.CosDeg(calc_display->getAmount());
break;
case RadMode:
core.CosRad(calc_display->getAmount());
break;
case GradMode:
core.CosGrad(calc_display->getAmount());
break;
}
else
switch(_angle_mode)
{
case DegMode:
core.ArcCosDeg(calc_display->getAmount());
break;
case RadMode:
core.ArcCosRad(calc_display->getAmount());
break;
case GradMode:
core.ArcCosGrad(calc_display->getAmount());
break;
}
}
UpdateDisplay(true);
}
void KCalculator::slotReciclicked(void)
{
core.Reciprocal(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotTanclicked(void)
{
if (hyp_mode)
{
// tanh or artanh
if (!inverse)
core.TangensHyp(calc_display->getAmount());
else
core.AreaTangensHyp(calc_display->getAmount());
}
else
{
// tan or arctan
if (!inverse)
switch(_angle_mode)
{
case DegMode:
core.TangensDeg(calc_display->getAmount());
break;
case RadMode:
core.TangensRad(calc_display->getAmount());
break;
case GradMode:
core.TangensGrad(calc_display->getAmount());
break;
}
else
switch(_angle_mode)
{
case DegMode:
core.ArcTangensDeg(calc_display->getAmount());
break;
case RadMode:
core.ArcTangensRad(calc_display->getAmount());
break;
case GradMode:
core.ArcTangensGrad(calc_display->getAmount());
break;
}
}
UpdateDisplay(true);
}
void KCalculator::slotFactorialclicked(void)
{
core.Factorial(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotLogclicked(void)
{
if (!inverse)
core.Log10(calc_display->getAmount());
else
core.Exp10(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotSquareclicked(void)
{
if (!inverse)
core.Square(calc_display->getAmount());
else
core.Cube(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotRootclicked(void)
{
if (!inverse)
core.SquareRoot(calc_display->getAmount());
else
core.CubeRoot(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotLnclicked(void)
{
if (!inverse)
core.Ln(calc_display->getAmount());
else
core.Exp(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotPowerclicked(void)
{
if (inverse)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_PWR_ROOT);
pbInv->setOn(false);
}
else
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_POWER);
}
// temp. work-around
KNumber tmp_num = calc_display->getAmount();
calc_display->sendEvent(KCalcDisplay::EventReset);
calc_display->setAmount(tmp_num);
UpdateDisplay(false);
}
void KCalculator::slotMCclicked(void)
{
memory_num = 0;
statusBar()->changeItem(" \xa0\xa0 ",3);
calc_display->setStatusText(3, TQString());
pbMemRecall->setDisabled(true);
}
void KCalculator::slotClearclicked(void)
{
calc_display->sendEvent(KCalcDisplay::EventClear);
}
void KCalculator::slotACclicked(void)
{
core.Reset();
calc_display->sendEvent(KCalcDisplay::EventReset);
UpdateDisplay(true);
}
void KCalculator::slotParenOpenclicked(void)
{
core.ParenOpen(calc_display->getAmount());
// What behavior, if e.g.: "12(6*6)"??
//UpdateDisplay(true);
}
void KCalculator::slotParenCloseclicked(void)
{
core.ParenClose(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotANDclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_AND);
UpdateDisplay(true);
}
void KCalculator::slotXclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_MULTIPLY);
UpdateDisplay(true);
}
void KCalculator::slotDivisionclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_DIVIDE);
UpdateDisplay(true);
}
void KCalculator::slotORclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_OR);
UpdateDisplay(true);
}
void KCalculator::slotXORclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_XOR);
UpdateDisplay(true);
}
void KCalculator::slotPlusclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_ADD);
UpdateDisplay(true);
}
void KCalculator::slotMinusclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_SUBTRACT);
UpdateDisplay(true);
}
void KCalculator::slotLeftShiftclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_LSH);
UpdateDisplay(true);
}
void KCalculator::slotRightShiftclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_RSH);
UpdateDisplay(true);
}
void KCalculator::slotPeriodclicked(void)
{
calc_display->newCharacter('.');
}
void KCalculator::EnterEqual()
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_EQUAL);
UpdateDisplay(true, true);
}
void KCalculator::slotEqualclicked(void)
{
EnterEqual();
}
void KCalculator::slotPercentclicked(void)
{
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_PERCENT);
UpdateDisplay(true);
}
void KCalculator::slotNegateclicked(void)
{
core.Complement(calc_display->getAmount());
UpdateDisplay(true);
}
void KCalculator::slotModclicked(void)
{
if (inverse)
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_INTDIV);
else
core.enterOperation(calc_display->getAmount(),
CalcEngine::FUNC_MOD);
UpdateDisplay(true);
}
void KCalculator::slotStatNumclicked(void)
{
if(!inverse)
{
core.StatCount(0);
}
else
{
pbInv->setOn(false);
core.StatSum(0);
}
UpdateDisplay(true);
}
void KCalculator::slotStatMeanclicked(void)
{
if(!inverse)
core.StatMean(0);
else
{
pbInv->setOn(false);
core.StatSumSquares(0);
}
UpdateDisplay(true);
}
void KCalculator::slotStatStdDevclicked(void)
{
if(inverse)
{
// std (n-1)
core.StatStdDeviation(0);
pbInv->setOn(false);
}
else
{
// std (n)
core.StatStdSample(0);
}
UpdateDisplay(true);
}
void KCalculator::slotStatMedianclicked(void)
{
if(!inverse)
{
// std (n-1)
core.StatMedian(0);
}
else
{
// std (n)
core.StatMedian(0);
pbInv->setOn(false);
}
// it seems two different modes should be implemented, but...?
UpdateDisplay(true);
}
void KCalculator::slotStatDataInputclicked(void)
{
if(!inverse)
{
core.StatDataNew(calc_display->getAmount());
}
else
{
pbInv->setOn(false);
core.StatDataDel(0);
statusBar()->message(i18n("Last stat item erased"), 3000);
}
UpdateDisplay(true);
}
void KCalculator::slotStatClearDataclicked(void)
{
if(!inverse)
{
core.StatClearAll(0);
statusBar()->message(i18n("Stat mem cleared"), 3000);
}
else
{
pbInv->setOn(false);
UpdateDisplay(false);
}
}
void KCalculator::slotConstclicked(int button)
{
if(!inverse)
{
//set the display to the configured value of Constant Button
calc_display->setAmount(pbConstant[button]->constant());
}
else
{
pbInv->setOn(false);
KCalcSettings::setValueConstant(button, calc_display->text());
// below set new tooltip
pbConstant[button]->setLabelAndTooltip();
// work around: after storing a number, pressing a digit should start
// a new number
calc_display->setAmount(calc_display->getAmount());
}
UpdateDisplay(false);
}
void KCalculator::showSettings()
{
// Check if there is already a dialog and if so bring
// it to the foreground.
if(TDEConfigDialog::showDialog("settings"))
return;
// Create a new dialog with the same name as the above checking code.
TDEConfigDialog *dialog = new TDEConfigDialog(this, "settings", KCalcSettings::self());
dialog->enableButtonSeparator( true );
// Add the general page. Store the settings in the General group and
// use the icon package_settings.
General *general = new General(0, "General");
int maxprec = 1000;
general->kcfg_Precision->setMaxValue(maxprec);
dialog->addPage(general, i18n("General"), "package_settings", i18n("General Settings"));
TQWidget *fontWidget = new TQWidget(0,"Font");
TQVBoxLayout *fontLayout = new TQVBoxLayout(fontWidget);
TDEFontChooser *mFontChooser =
new TDEFontChooser(fontWidget, "kcfg_Font", false, TQStringList(), false, 6);
fontLayout->addWidget(mFontChooser);
dialog->addPage(fontWidget, i18n("Font"), "fonts", i18n("Select Display Font"));
// color settings
Colors *color = new Colors(0, "Color");
dialog->addPage(color, i18n("Colors"), "colors", i18n("Button & Display Colors"));
// constant settings
Constants *constant = new Constants(0, "Constant" );
tmp_const = constant;
KCalcConstMenu *tmp_menu = new KCalcConstMenu(this);
connect(tmp_menu, TQT_SIGNAL(activated(int)),
TQT_SLOT(slotChooseScientificConst0(int)));
(constant->kPushButton0)->setPopup(tmp_menu);
tmp_menu = new KCalcConstMenu(this);
connect(tmp_menu, TQT_SIGNAL(activated(int)),
TQT_SLOT(slotChooseScientificConst1(int)));
(constant->kPushButton1)->setPopup(tmp_menu);
tmp_menu = new KCalcConstMenu(this);
connect(tmp_menu, TQT_SIGNAL(activated(int)),
TQT_SLOT(slotChooseScientificConst2(int)));
(constant->kPushButton2)->setPopup(tmp_menu);
tmp_menu = new KCalcConstMenu(this);
connect(tmp_menu, TQT_SIGNAL(activated(int)),
TQT_SLOT(slotChooseScientificConst3(int)));
(constant->kPushButton3)->setPopup(tmp_menu);
tmp_menu = new KCalcConstMenu(this);
connect(tmp_menu, TQT_SIGNAL(activated(int)),
TQT_SLOT(slotChooseScientificConst4(int)));
(constant->kPushButton4)->setPopup(tmp_menu);
tmp_menu = new KCalcConstMenu(this);
connect(tmp_menu, TQT_SIGNAL(activated(int)),
TQT_SLOT(slotChooseScientificConst5(int)));
(constant->kPushButton5)->setPopup(tmp_menu);
dialog->addPage(constant, i18n("Constants"), "constants");
// When the user clicks OK or Apply we want to update our settings.
connect(dialog, TQT_SIGNAL(settingsChanged()), TQT_SLOT(updateSettings()));
// Display the dialog.
dialog->show();
}
// these 6 slots are just a quick hack, instead of setting the
// TextEdit fields in the configuration dialog, we are setting the
// Settingvalues themselves!!
void KCalculator::slotChooseScientificConst0(int option)
{
(tmp_const->kcfg_valueConstant0)->setText(KCalcConstMenu::Constants[option].value);
(tmp_const->kcfg_nameConstant0)->setText(KCalcConstMenu::Constants[option].label);
}
void KCalculator::slotChooseScientificConst1(int option)
{
(tmp_const->kcfg_valueConstant1)->setText(KCalcConstMenu::Constants[option].value);
(tmp_const->kcfg_nameConstant1)->setText(KCalcConstMenu::Constants[option].label);
}
void KCalculator::slotChooseScientificConst2(int option)
{
(tmp_const->kcfg_valueConstant2)->setText(KCalcConstMenu::Constants[option].value);
(tmp_const->kcfg_nameConstant2)->setText(KCalcConstMenu::Constants[option].label);
}
void KCalculator::slotChooseScientificConst3(int option)
{
(tmp_const->kcfg_valueConstant3)->setText(KCalcConstMenu::Constants[option].value);
(tmp_const->kcfg_nameConstant3)->setText(KCalcConstMenu::Constants[option].label);
}
void KCalculator::slotChooseScientificConst4(int option)
{
(tmp_const->kcfg_valueConstant4)->setText(KCalcConstMenu::Constants[option].value);
(tmp_const->kcfg_nameConstant4)->setText(KCalcConstMenu::Constants[option].label);
}
void KCalculator::slotChooseScientificConst5(int option)
{
(tmp_const->kcfg_valueConstant5)->setText(KCalcConstMenu::Constants[option].value);
(tmp_const->kcfg_nameConstant5)->setText(KCalcConstMenu::Constants[option].label);
}
void KCalculator::slotStatshow(bool toggled)
{
if(toggled)
{
pbStat["NumData"]->show();
pbStat["Mean"]->show();
pbStat["StandardDeviation"]->show();
pbStat["Median"]->show();
pbStat["InputData"]->show();
pbStat["ClearData"]->show();
}
else
{
pbStat["NumData"]->hide();
pbStat["Mean"]->hide();
pbStat["StandardDeviation"]->hide();
pbStat["Median"]->hide();
pbStat["InputData"]->hide();
pbStat["ClearData"]->hide();
}
adjustSize();
setFixedSize(sizeHint());
KCalcSettings::setShowStat(toggled);
}
void KCalculator::slotScientificshow(bool toggled)
{
if(toggled)
{
pbScientific["HypMode"]->show();
pbScientific["Sine"]->show();
pbScientific["Cosine"]->show();
pbScientific["Tangent"]->show();
pbScientific["Log10"]->show();
pbScientific["LogNatural"]->show();
pbAngleChoose->show();
if(!statusBar()->hasItem(2))
statusBar()->insertFixedItem(" DEG ", 2, true);
statusBar()->setItemAlignment(2, AlignCenter);
calc_display->setStatusText(2, "Deg");
slotAngleSelected(0);
}
else
{
pbScientific["HypMode"]->hide();
pbScientific["Sine"]->hide();
pbScientific["Cosine"]->hide();
pbScientific["Tangent"]->hide();
pbScientific["Log10"]->hide();
pbScientific["LogNatural"]->hide();
pbAngleChoose->hide();
if(statusBar()->hasItem(2))
statusBar()->removeItem(2);
calc_display->setStatusText(2, TQString());
}
adjustSize();
setFixedSize(sizeHint());
KCalcSettings::setShowScientific(toggled);
}
void KCalculator::slotLogicshow(bool toggled)
{
if(toggled)
{
pbLogic["AND"]->show();
pbLogic["OR"]->show();
pbLogic["XOR"]->show();
pbLogic["One-Complement"]->show();
pbLogic["LeftShift"]->show();
pbLogic["RightShift"]->show();
if(!statusBar()->hasItem(1))
statusBar()->insertFixedItem(" HEX ", 1, true);
statusBar()->setItemAlignment(1, AlignCenter);
calc_display->setStatusText(1, "Hex");
resetBase();
BaseChooseGroup->show();
for (int i=10; i<16; i++)
(NumButtonGroup->find(i))->show();
}
else
{
pbLogic["AND"]->hide();
pbLogic["OR"]->hide();
pbLogic["XOR"]->hide();
pbLogic["One-Complement"]->hide();
pbLogic["LeftShift"]->hide();
pbLogic["RightShift"]->hide();
// Hide Hex-Buttons, but first switch back to decimal
resetBase();
BaseChooseGroup->hide();
if(statusBar()->hasItem(1))
statusBar()->removeItem(1);
calc_display->setStatusText(1, TQString());
for (int i=10; i<16; i++)
(NumButtonGroup->find(i))->hide();
}
adjustSize();
setFixedSize(sizeHint());
KCalcSettings::setShowLogic(toggled);
}
void KCalculator::slotConstantsShow(bool toggled)
{
if(toggled)
{
pbConstant[0]->show();
pbConstant[1]->show();
pbConstant[2]->show();
pbConstant[3]->show();
pbConstant[4]->show();
pbConstant[5]->show();
}
else
{
pbConstant[0]->hide();
pbConstant[1]->hide();
pbConstant[2]->hide();
pbConstant[3]->hide();
pbConstant[4]->hide();
pbConstant[5]->hide();
}
adjustSize();
setFixedSize(sizeHint());
KCalcSettings::setShowConstants(toggled);
}
// This function is for setting the constant names configured in the
// kcalc settings menu. If the user doesn't enter a name for the
// constant C1 to C6 is used.
void KCalculator::changeButtonNames()
{
pbConstant[0]->setLabelAndTooltip();
pbConstant[1]->setLabelAndTooltip();
pbConstant[2]->setLabelAndTooltip();
pbConstant[3]->setLabelAndTooltip();
pbConstant[4]->setLabelAndTooltip();
pbConstant[5]->setLabelAndTooltip();
}
void KCalculator::slotShowAll(void)
{
// I wonder why "setChecked" does not emit "toggled"
if(!actionStatshow->isChecked()) actionStatshow->activate();
if(!actionScientificshow->isChecked()) actionScientificshow->activate();
if(!actionLogicshow->isChecked()) actionLogicshow->activate();
if(!actionConstantsShow->isChecked()) actionConstantsShow->activate();
}
void KCalculator::slotHideAll(void)
{
// I wonder why "setChecked" does not emit "toggled"
if(actionStatshow->isChecked()) actionStatshow->activate();
if(actionScientificshow->isChecked()) actionScientificshow->activate();
if(actionLogicshow->isChecked()) actionLogicshow->activate();
if(actionConstantsShow->isChecked()) actionConstantsShow->activate();
}
void KCalculator::updateSettings()
{
changeButtonNames();
set_colors();
set_precision();
// Show the result in the app's caption in taskbar (wishlist - bug #52858)
disconnect(calc_display, TQT_SIGNAL(changedText(const TQString &)),
this, 0);
if (KCalcSettings::captionResult())
{
connect(calc_display,
TQT_SIGNAL(changedText(const TQString &)),
TQT_SLOT(setCaption(const TQString &)));
}
else
{
setCaption(TQString());
}
calc_display->changeSettings();
updateGeometry();
resize(minimumSize());
//
// 1999-10-31 Espen Sand: Don't ask me why ;)
//
kapp->processOneEvent();
setFixedHeight(minimumHeight());
}
void KCalculator::UpdateDisplay(bool get_amount_from_core,
bool store_result_in_history)
{
if(get_amount_from_core)
{
calc_display->update_from_core(core, store_result_in_history);
}
else
{
calc_display->update();
}
pbInv->setOn(false);
}
void KCalculator::set_colors()
{
TQPushButton *p = NULL;
calc_display->changeSettings();
TQColor bg = palette().active().background();
TQPalette numPal(KCalcSettings::numberButtonsColor(), bg);
for(int i=0; i<10; i++)
{
(NumButtonGroup->find(i))->setPalette(numPal);
}
TQPalette funcPal(KCalcSettings::functionButtonsColor(), bg);
for(p = mFunctionButtonList.first(); p;
p=mFunctionButtonList.next())
{
p->setPalette(funcPal);
}
TQPalette statPal(KCalcSettings::statButtonsColor(), bg);
for(p = mStatButtonList.first(); p; p=mStatButtonList.next())
{
p->setPalette(statPal);
}
TQPalette hexPal(KCalcSettings::hexButtonsColor(), bg);
for(int i=10; i<16; i++)
{
(NumButtonGroup->find(i))->setPalette(hexPal);
}
TQPalette memPal(KCalcSettings::memoryButtonsColor(), bg);
for(p = mMemButtonList.first(); p; p=mMemButtonList.next())
{
p->setPalette(memPal);
}
TQPalette opPal(KCalcSettings::operationButtonsColor(), bg);
for(p = mOperationButtonList.first(); p;
p=mOperationButtonList.next())
{
p->setPalette(opPal);
}
}
void KCalculator::set_precision()
{
KNumber:: setDefaultFloatPrecision(KCalcSettings::precision());
UpdateDisplay(false);
}
bool KCalculator::eventFilter(TQObject *o, TQEvent *e)
{
if(e->type() == TQEvent::DragEnter)
{
TQDragEnterEvent *ev = (TQDragEnterEvent *)e;
ev->accept(KColorDrag::canDecode(ev));
return true;
}
else if(e->type() == TQEvent::DragLeave)
{
return true;
}
else if(e->type() == TQEvent::Drop)
{
if(!o->isA("KCalcButton"))
return false;
TQColor c;
TQDropEvent *ev = (TQDropEvent *)e;
if( KColorDrag::decode(ev, c))
{
TQPtrList<KCalcButton> *list;
int num_but;
if((num_but = NumButtonGroup->id((KCalcButton*)o))
!= -1)
{
TQPalette pal(c, palette().active().background());
// Was it hex-button or normal digit??
if (num_but <10)
for(int i=0; i<10; i++)
(NumButtonGroup->find(i))->setPalette(pal);
else
for(int i=10; i<16; i++)
(NumButtonGroup->find(i))->setPalette(pal);
return true;
}
else if( mFunctionButtonList.findRef((KCalcButton*)o) != -1)
{
list = &mFunctionButtonList;
}
else if( mStatButtonList.findRef((KCalcButton*)o) != -1)
{
list = &mStatButtonList;
}
else if( mMemButtonList.findRef((KCalcButton*)o) != -1)
{
list = &mMemButtonList;
}
else if( mOperationButtonList.findRef((KCalcButton*)o) != -1)
{
list = &mOperationButtonList;
}
else
return false;
TQPalette pal(c, palette().active().background());
for(KCalcButton *p = list->first(); p; p=list->next())
p->setPalette(pal);
}
return true;
}
else
{
return TDEMainWindow::eventFilter(o, e);
}
}
////////////////////////////////////////////////////////////////
// Include the meta-object code for classes in this file
//
#include "kcalc.moc"
extern "C" KDE_EXPORT int kdemain(int argc, char *argv[])
{
TDEAboutData aboutData( "kcalc", I18N_NOOP("KCalc"),
version, description, TDEAboutData::License_GPL,
I18N_NOOP("(c) 2003-2005, Klaus Niederkr" "\xc3\xbc" "ger\n"
"(c) 1996-2000, Bernd Johannes Wuebben\n"
"(c) 2000-2005, The KDE Team"));
/* Klaus Niederkrueger */
aboutData.addAuthor("Klaus Niederkr" "\xc3\xbc" "ger", 0, "kniederk@math.uni-koeln.de");
aboutData.addAuthor("Bernd Johannes Wuebben", 0, "wuebben@kde.org");
aboutData.addAuthor("Evan Teran", 0, "eteran@alum.rit.edu");
aboutData.addAuthor("Espen Sand", 0, "espen@kde.org");
aboutData.addAuthor("Chris Howells", 0, "howells@kde.org");
aboutData.addAuthor("Aaron J. Seigo", 0, "aseigo@olympusproject.org");
aboutData.addAuthor("Charles Samuels", 0, "charles@altair.dhs.org");
/* Rene Merou */
aboutData.addAuthor("Ren" "\xc3\xa9" " M" "\xc3\xa9" "rou", 0, "ochominutosdearco@yahoo.es");
TDECmdLineArgs::init(argc, argv, &aboutData);
TDEApplication app;
#if 0
app->enableSessionManagement(true);
app->setWmCommand(argv[0]);
#endif
KCalculator *calc = new KCalculator;
app.setTopWidget(calc);
calc->setCaption(TQString());
calc->show();
int exitCode = app.exec();
return(exitCode);
}