/* * MathPlanner 3.1.2 - Mathematical design tool. * Copyright(C) 2002 Jarmo Nikkanen * * 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. * * You should have received a copy of the GNU General Public License with this program. * */ #include "Operators.h" #include "AppControl.h" #include "Error.h" #include "Function_object.h" #include "ConfigReader.h" #include "Datastore.h" #include "Object_string.h" math_node trigono_object::Calculate() { return(value); } math_node trigono_object::Calculate(math_node val) { double re,real; int type=val.type; // Change type to complex if (type==MN_REAL && (Opr==7 || Opr==11 || Opr>20)) type=MN_COMPLEX; if (type==MN_REAL) { if (!deg_rad) re=mpl_rad(val.mpl.m.R); else re=val.mpl.m.R; switch(Opr) { case 0: real=mpl_sin(re); break; case 1: real=mpl_cos(re); break; case 2: real=mpl_tan(re); break; case 3: real=1.0/mpl_tan(re); break; case 4: real=asin(val.mpl.m.R); if (!deg_rad) real=mpl_deg(real); break; case 5: real=acos(val.mpl.m.R); if (!deg_rad) real=mpl_deg(real); break; case 6: real=atan(val.mpl.m.R); if (!deg_rad) real=mpl_deg(real); break; case 9: real=floor(val.mpl.m.R); break; case 10: real=val.mpl.m.R-floor(val.mpl.m.R); break; case 12: real=atan(1.0/val.mpl.m.R); if (deg_rad==0) real=mpl_deg(real); break; case 13: real=sinh(val.mpl.m.R); break; case 14: real=cosh(val.mpl.m.R); break; case 15: real=tanh(val.mpl.m.R); break; case 16: real=mpl_coth(val.mpl.m.R); break; case 17: real=mpl_asinh(val.mpl.m.R); break; case 18: real=mpl_acosh(val.mpl.m.R); break; case 19: real=mpl_atanh(val.mpl.m.R); break; case 20: real=mpl_acoth(val.mpl.m.R); break; default: Error_flag=true; AppControl->AddError(QObject::tr("Real numbers are not supported by this function")); break; } value.SetReal(real); return(value); } if (type==MN_COMPLEX) { switch(Opr) { case 7: value.SetComplex(mpl_cln(val.Complex())); break; case 11: value.SetComplex(mpl_clog(val.Complex())); break; case 21: real=mpl_cargz(val.Complex()); if (deg_rad==0) real=mpl_deg(real); value.SetReal(real); break; case 22: value.SetReal(mpl_cRez(val.Complex())); break; case 23: value.SetReal(mpl_cImz(val.Complex())); break; default: Error_flag=true; AppControl->AddError(QObject::tr("Complex numbers are not supported by this function")); break; } return(value); } Error_flag=true; AppControl->AddError(QObject::tr("Value type is not supported by this function")); return(value); } // This is called when multible objects are selected void trigono_object::InsertString(str_range ran,string_object *st) { if (st->RequiresParenthesis(ran)) { st->SetParenthesis(ran); SetFocus(); } } void trigono_object::Build() { // Nothing to build } void trigono_object::SeekObject(QPoint p) { SetFocus(); } bool trigono_object::AutoDeletion() { return(false); } trigono_object::trigono_object(DataStorage *msg) :m_base_object(msg) { Reset(); Opr=msg->ReadInt("tri:type"); deg_rad=msg->ReadInt("tri:deg"); margin=AppControl->Prefs->Int("Trigono_margin"); spacing=AppControl->Prefs->Int("Trigono_spacing"); if (Opr==0) strcpy(Opr_Str,"Sin"); if (Opr==1) strcpy(Opr_Str,"Cos"); if (Opr==2) strcpy(Opr_Str,"Tan"); if (Opr==3) strcpy(Opr_Str,"Cot"); if (Opr==4) strcpy(Opr_Str,"aSin"); if (Opr==5) strcpy(Opr_Str,"aCos"); if (Opr==6) strcpy(Opr_Str,"aTan"); if (Opr==7) strcpy(Opr_Str,"ln"); if (Opr==9) strcpy(Opr_Str,"Int"); if (Opr==10) strcpy(Opr_Str,"Frac"); if (Opr==11) strcpy(Opr_Str,"Log"); if (Opr==12) strcpy(Opr_Str,"aCot"); if (Opr==13) strcpy(Opr_Str,"SinH"); if (Opr==14) strcpy(Opr_Str,"CosH"); if (Opr==15) strcpy(Opr_Str,"TanH"); if (Opr==16) strcpy(Opr_Str,"CotH"); if (Opr==17) strcpy(Opr_Str,"aSinH"); if (Opr==18) strcpy(Opr_Str,"aCosH"); if (Opr==19) strcpy(Opr_Str,"aTanH"); if (Opr==20) strcpy(Opr_Str,"aCotH"); if (Opr==21) strcpy(Opr_Str,"arg"); if (Opr==22) strcpy(Opr_Str,"Re"); if (Opr==23) strcpy(Opr_Str,"Im"); Type=OT_TRIGONO_OBJECT; MainType=OMT_OPERATOR; SubObject=SUB_RIGHT; Priority=PRIORITY_TRIGONO; Bug("trogono unarchived"); } DataStorage *trigono_object::BuildStorage() { DataStorage *msg=m_base_object::BuildStorage(); msg->AddInt("tri:type",Opr); msg->AddInt("tri:deg",(int)deg_rad); return(msg); } trigono_object::trigono_object(int type,ApplicationControl *a,m_function_object *o,class string_object *str) :m_base_object(a,o,str) { Reset(); deg_rad=AppControl->Prefs->Int("AngleMode"); margin=AppControl->Prefs->Int("Trigono_margin"); spacing=AppControl->Prefs->Int("Trigono_spacing"); Opr=type; if (Opr==0) strcpy(Opr_Str,"Sin"); if (Opr==1) strcpy(Opr_Str,"Cos"); if (Opr==2) strcpy(Opr_Str,"Tan"); if (Opr==3) strcpy(Opr_Str,"Cot"); if (Opr==4) strcpy(Opr_Str,"aSin"); if (Opr==5) strcpy(Opr_Str,"aCos"); if (Opr==6) strcpy(Opr_Str,"aTan"); if (Opr==7) strcpy(Opr_Str,"ln"); if (Opr==9) strcpy(Opr_Str,"Int"); if (Opr==10) strcpy(Opr_Str,"Frac"); if (Opr==11) strcpy(Opr_Str,"Log"); if (Opr==12) strcpy(Opr_Str,"aCot"); if (Opr==13) strcpy(Opr_Str,"SinH"); if (Opr==14) strcpy(Opr_Str,"CosH"); if (Opr==15) strcpy(Opr_Str,"TanH"); if (Opr==16) strcpy(Opr_Str,"CotH"); if (Opr==17) strcpy(Opr_Str,"aSinH"); if (Opr==18) strcpy(Opr_Str,"aCosH"); if (Opr==19) strcpy(Opr_Str,"aTanH"); if (Opr==20) strcpy(Opr_Str,"aCotH"); if (Opr==21) strcpy(Opr_Str,"arg"); if (Opr==22) strcpy(Opr_Str,"Re"); if (Opr==23) strcpy(Opr_Str,"Im"); Type=OT_TRIGONO_OBJECT; MainType=OMT_OPERATOR; SubObject=SUB_RIGHT; Priority=PRIORITY_TRIGONO; } void trigono_object::CalculateBounds() { old_bounds=bounds; QFontMetrics met(string->GetFont(FONT_TYPE_OPERATOR)); bounds.ascent=met.ascent()+margin; bounds.descent=met.descent()+margin; bounds.width=met.width(QString(Opr_Str))+(spacing+margin)*2; } void trigono_object::MoveTo(QPoint p) { bounds.SetPosition(p); } void trigono_object::Draw(QPainter *paint) { paint->setPen(AppControl->GetColor(FONT_TYPE_OPERATOR)); paint->setFont(string->GetFont(FONT_TYPE_OPERATOR)); paint->drawText(bounds.Position()+QPoint(margin+spacing,0),QString(Opr_Str)); if (HasFocus()) { paint->setPen(focus_pen); paint->drawRect(bounds.Rect()); } if (Error_flag && !HasFocus()) { paint->setPen(error_pen); paint->drawRect(bounds.Rect()); } } void trigono_object::KeyReceived(key_code key) { KeyFeedback(key); } void trigono_object::KeyFeedback(key_code key) { key.insert_mode=MODE_AUTO; KeyOutput(key); } void trigono_object::MessageReceived(DataStorage *msg,int rec) { if (rec==TO_OPERATOR) { if (ISMSG(MSG_DEG)) deg_rad=0; if (ISMSG(MSG_RAD)) deg_rad=1; if (ISMSG(MSG_FUNCTION)) { Opr=msg->ReadInt("Oper"); if (Opr==0) strcpy(Opr_Str,"Sin"); if (Opr==1) strcpy(Opr_Str,"Cos"); if (Opr==2) strcpy(Opr_Str,"Tan"); if (Opr==3) strcpy(Opr_Str,"Cot"); if (Opr==4) strcpy(Opr_Str,"aSin"); if (Opr==5) strcpy(Opr_Str,"aCos"); if (Opr==6) strcpy(Opr_Str,"aTan"); if (Opr==7) strcpy(Opr_Str,"ln"); if (Opr==9) strcpy(Opr_Str,"Int"); if (Opr==10) strcpy(Opr_Str,"Frac"); if (Opr==11) strcpy(Opr_Str,"Log"); if (Opr==12) strcpy(Opr_Str,"aCot"); if (Opr==13) strcpy(Opr_Str,"SinH"); if (Opr==14) strcpy(Opr_Str,"CosH"); if (Opr==15) strcpy(Opr_Str,"TanH"); if (Opr==16) strcpy(Opr_Str,"CotH"); if (Opr==17) strcpy(Opr_Str,"aSinH"); if (Opr==18) strcpy(Opr_Str,"aCosH"); if (Opr==19) strcpy(Opr_Str,"aTanH"); if (Opr==20) strcpy(Opr_Str,"aCotH"); if (Opr==21) strcpy(Opr_Str,"arg"); if (Opr==22) strcpy(Opr_Str,"Re"); if (Opr==23) strcpy(Opr_Str,"Im"); } AppControl->CreateControlMenu(this); } } base_object_message *trigono_object::CreateControlObject() { Bug("########### trigono_mes created"); return(new trigono_mes(AppControl)); } trigono_mes::trigono_mes(ApplicationControl *a) :base_object_message(a) { hbox=new QHBox(); combo=new QComboBox(hbox); combo->insertItem(QString("Sin")); combo->insertItem(QString("Cos")); combo->insertItem(QString("Tan")); combo->insertItem(QString("Cot")); combo->insertItem(QString("aSin")); combo->insertItem(QString("aCos")); combo->insertItem(QString("aTan")); combo->insertItem(QString("ln")); combo->insertItem(QString(" ")); combo->insertItem(QString("Int")); combo->insertItem(QString("Frac")); combo->insertItem(QString("Log")); combo->insertItem(QString("aCot")); combo->insertItem(QString("SinH")); combo->insertItem(QString("CosH")); combo->insertItem(QString("TanH")); combo->insertItem(QString("CotH")); combo->insertItem(QString("aSinH")); combo->insertItem(QString("aCosH")); combo->insertItem(QString("aTanH")); combo->insertItem(QString("aCotH")); combo->insertItem(QString("arg")); combo->insertItem(QString("Re")); combo->insertItem(QString("Im")); but1=new QToolButton(hbox); but1->setText("Deg"); but1->setAutoRaise(true); but2=new QToolButton(hbox); but2->setText("Rad"); but2->setAutoRaise(true); connect(but1,SIGNAL(clicked()),this,SLOT(Button1())); connect(but2,SIGNAL(clicked()),this,SLOT(Button2())); connect(combo,SIGNAL(activated(int)),this,SLOT(Combo(int))); } void trigono_mes::ReadState(m_base_object *x) { class trigono_object *t=(class trigono_object *)x; if (t->Opr<7 || t->Opr==12 || t->Opr==21) { but1->setEnabled(true),but2->setEnabled(true); if (t->deg_rad==0) but1->setDown(true),but2->setDown(false); else but1->setDown(false),but2->setDown(true); } else { but1->setDown(false),but2->setDown(false); but1->setEnabled(false),but2->setEnabled(false); } int op=t->Opr; combo->setCurrentItem(op); } trigono_mes::~trigono_mes() { delete but1; delete combo; delete hbox; } QWidget *trigono_mes::MainWidget() { return(hbox); } void trigono_mes::Button1() { POSTMESSAGE(MSG_DEG,TO_OPERATOR); } void trigono_mes::Button2() { POSTMESSAGE(MSG_RAD,TO_OPERATOR); } void trigono_mes::Combo(int index) { DataStorage *msg=MESSAGE(MSG_FUNCTION); msg->AddInt("Oper",index); PostMessage(msg,TO_OPERATOR); }