summaryrefslogtreecommitdiffstats
path: root/kmplot/kmplot/keditparametric.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmplot/kmplot/keditparametric.cpp')
-rw-r--r--kmplot/kmplot/keditparametric.cpp345
1 files changed, 345 insertions, 0 deletions
diff --git a/kmplot/kmplot/keditparametric.cpp b/kmplot/kmplot/keditparametric.cpp
new file mode 100644
index 00000000..06b9d359
--- /dev/null
+++ b/kmplot/kmplot/keditparametric.cpp
@@ -0,0 +1,345 @@
+/*
+* KmPlot - a math. function plotter for the KDE-Desktop
+*
+* Copyright (C) 1998, 1999 Klaus-Dieter Möller
+* 2000, 2002 kd.moeller@t-online.de
+*
+* This file is part of the KDE Project.
+* KmPlot is part of the KDE-EDU Project.
+*
+* 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.
+*
+*/
+// Qt includes
+#include <qcheckbox.h>
+
+// KDE includes
+#include <kapplication.h>
+#include <kcolorbutton.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <knuminput.h>
+
+#include <kdebug.h>
+
+// local includes
+#include "keditparametric.h"
+#include "keditparametric.moc"
+#include "xparser.h"
+#include "View.h"
+
+KEditParametric::KEditParametric( XParser* parser, QWidget* parent, const char* name ) :
+ QEditParametric( parent, name ), m_parser(parser)
+{
+ connect( customMinRange, SIGNAL ( toggled(bool) ), this, SLOT( customMinRange_toggled(bool) ) );
+ connect( customMaxRange, SIGNAL ( toggled(bool) ), this, SLOT( customMaxRange_toggled(bool) ) );
+ m_updatedfunction = 0;
+}
+
+void KEditParametric::initDialog( int x_id, int y_id)
+{
+ m_x_id = x_id;
+ m_y_id = y_id;
+ if( m_x_id == -1 ) clearWidgets();
+ else setWidgets();
+}
+
+void KEditParametric::clearWidgets()
+{
+ kLineEditName->clear();
+ kLineEditXFunction->clear();
+ kLineEditYFunction->clear();
+ checkBoxHide->setChecked( false );
+ customMinRange->setChecked( false );
+ customMinRange->setChecked( false );
+ min->clear();
+ max->clear();
+ kIntNumInputLineWidth->setValue( m_parser->linewidth0 );
+ kColorButtonColor->setColor( m_parser->defaultColor(m_parser->getNextIndex() ) );
+}
+
+void KEditParametric::setWidgets()
+{
+ Ufkt *ufkt = &m_parser->ufkt[ m_parser->ixValue(m_x_id) ];
+ QString name, expression;
+ splitEquation( ufkt->fstr, name, expression );
+ kLineEditName->setText( name );
+ kLineEditXFunction->setText( expression );
+ splitEquation( m_parser->ufkt[ m_y_id ].fstr, name, expression );
+ kLineEditYFunction->setText( expression );
+ checkBoxHide->setChecked( !ufkt->f_mode );
+ if (ufkt->usecustomxmin)
+ {
+ customMinRange->setChecked(true);
+ min->setText( ufkt->str_dmin );
+ }
+ else
+ customMinRange->setChecked(false);
+
+ if (ufkt->usecustomxmax)
+ {
+ customMaxRange->setChecked(true);
+ max->setText( ufkt->str_dmax );
+ }
+ else
+ customMaxRange->setChecked(false);
+
+ kIntNumInputLineWidth->setValue( ufkt->linewidth );
+ kColorButtonColor->setColor( ufkt->color );
+}
+
+void KEditParametric::accept()
+{
+ if ( kLineEditXFunction->text().contains('y') != 0 || kLineEditYFunction->text().contains('y') != 0)
+ {
+ KMessageBox::error( this, i18n( "Recursive function not allowed"));
+ kLineEditXFunction->setFocus();
+ kLineEditXFunction->selectAll();
+ return;
+ }
+
+ // find a name not already used
+ if( kLineEditName->text().isEmpty() )
+ {
+ QString fname;
+ m_parser->fixFunctionName(fname, XParser::ParametricX, m_x_id);
+ int const pos = fname.find('(');
+ kLineEditName->setText(fname.mid(1,pos-1));
+ }
+
+ Ufkt tmp_ufkt;
+ tmp_ufkt.f_mode = !checkBoxHide->isChecked();
+
+ if( customMinRange->isChecked() )
+ {
+ tmp_ufkt.usecustomxmin = true;
+ tmp_ufkt.str_dmin = min->text();
+ tmp_ufkt.dmin = m_parser->eval( min->text() );
+ if ( m_parser->parserError())
+ {
+ min->setFocus();
+ min->selectAll();
+ return;
+ }
+ }
+ else
+ tmp_ufkt.usecustomxmin = false;
+
+ if( customMaxRange->isChecked() )
+ {
+ tmp_ufkt.usecustomxmax = true;
+ tmp_ufkt.str_dmax = max->text();
+ tmp_ufkt.dmax = m_parser->eval( max->text() );
+ if ( m_parser->parserError())
+ {
+ max->setFocus();
+ max->selectAll();
+ return;
+ }
+ if ( tmp_ufkt.usecustomxmin && tmp_ufkt.dmin >= tmp_ufkt.dmax)
+ {
+ KMessageBox::error(this,i18n("The minimum range value must be lower than the maximum range value"));
+ min->setFocus();
+ min->selectAll();
+ return;
+ }
+ }
+ else
+ tmp_ufkt.usecustomxmax = false;
+
+ tmp_ufkt.linewidth = kIntNumInputLineWidth->value();
+ tmp_ufkt.color = kColorButtonColor->color().rgb();
+ tmp_ufkt.f1_color = tmp_ufkt.f2_color = tmp_ufkt.integral_color = tmp_ufkt.color;
+ tmp_ufkt.integral_mode = 0;
+ tmp_ufkt.f1_mode = tmp_ufkt.f1_mode;
+ tmp_ufkt.f2_mode = 0;
+ tmp_ufkt.use_slider = -1;
+
+ Ufkt *added_ufkt;
+ if( m_x_id != -1 ) //when editing a function:
+ {
+ int const ix = m_parser->ixValue(m_x_id);
+ if ( ix == -1) //The function could have been deleted
+ {
+ KMessageBox::error(this,i18n("Function could not be found"));
+ return;
+ }
+ added_ufkt = &m_parser->ufkt[ix];
+ QString old_fstr = added_ufkt->fstr;
+ added_ufkt->fstr = xFunction();
+ m_parser->reparse(added_ufkt); //reparse the funcion
+ if ( m_parser->parserError() != 0)
+ {
+ added_ufkt->fstr = old_fstr;
+ m_parser->reparse(added_ufkt);
+ raise();
+ kLineEditXFunction->setFocus();
+ kLineEditXFunction->selectAll();
+ return;
+ }
+ }
+ else
+ {
+ int const id = m_parser->addfkt( xFunction() );
+ if( id == -1 )
+ {
+ m_parser->parserError();
+ raise();
+ kLineEditXFunction->setFocus();
+ kLineEditXFunction->selectAll();
+ return;
+ }
+ added_ufkt = &m_parser->ufkt.last();
+ }
+
+ //save all settings in the function now when we know no errors have appeared
+ added_ufkt->f_mode = tmp_ufkt.f_mode;
+ added_ufkt->f1_mode = tmp_ufkt.f1_mode;
+ added_ufkt->f2_mode = tmp_ufkt.f2_mode;
+ added_ufkt->integral_mode = tmp_ufkt.integral_mode;
+ added_ufkt->integral_use_precision = tmp_ufkt.integral_use_precision;
+ added_ufkt->linewidth = tmp_ufkt.linewidth;
+ added_ufkt->f1_linewidth = tmp_ufkt.f1_linewidth;
+ added_ufkt->f2_linewidth = tmp_ufkt.f2_linewidth;
+ added_ufkt->integral_linewidth = tmp_ufkt.integral_linewidth;
+ added_ufkt->str_dmin = tmp_ufkt.str_dmin;
+ added_ufkt->str_dmax = tmp_ufkt.str_dmax;
+ added_ufkt->dmin = tmp_ufkt.dmin;
+ added_ufkt->dmax = tmp_ufkt.dmax;
+ added_ufkt->str_startx = tmp_ufkt.str_startx;
+ added_ufkt->str_starty = tmp_ufkt.str_starty;
+ added_ufkt->oldx = tmp_ufkt.oldx;
+ added_ufkt->starty = tmp_ufkt.starty;
+ added_ufkt->startx = tmp_ufkt.startx;
+ added_ufkt->integral_precision = tmp_ufkt.integral_precision;
+ added_ufkt->color = tmp_ufkt.color;
+ added_ufkt->f1_color = tmp_ufkt.f1_color;
+ added_ufkt->f2_color = tmp_ufkt.f2_color;
+ added_ufkt->integral_color = tmp_ufkt.integral_color;
+ added_ufkt->use_slider = tmp_ufkt.use_slider;
+ added_ufkt->usecustomxmin = tmp_ufkt.usecustomxmin;
+ added_ufkt->usecustomxmax = tmp_ufkt.usecustomxmax;
+
+ added_ufkt = 0;
+ if( m_y_id != -1 ) //when editing a function:
+ {
+ added_ufkt = &m_parser->ufkt[m_parser->ixValue(m_y_id)];
+ QString old_fstr = added_ufkt->fstr;
+ added_ufkt->fstr = yFunction();
+ m_parser->reparse(added_ufkt); //reparse the funcion
+ if ( m_parser->parserError() != 0) //when something went wrong:
+ {
+ added_ufkt->fstr = old_fstr; //go back to the old expression
+ m_parser->reparse(added_ufkt); //reparse
+ raise();
+ kLineEditXFunction->setFocus();
+ kLineEditXFunction->selectAll();
+ return;
+ }
+ }
+ else
+ {
+ int const id = m_parser->addfkt( yFunction() );
+ if( id == -1 )
+ {
+ m_parser->parserError();
+ raise();
+ kLineEditXFunction->setFocus();
+ kLineEditXFunction->selectAll();
+ return;
+ }
+ added_ufkt = &m_parser->ufkt.last();
+ }
+
+ //save all settings in the function now when we now no errors have appeared
+ added_ufkt->f_mode = tmp_ufkt.f_mode;
+ added_ufkt->f1_mode = tmp_ufkt.f1_mode;
+ added_ufkt->f2_mode = tmp_ufkt.f2_mode;
+ added_ufkt->integral_mode = tmp_ufkt.integral_mode;
+ added_ufkt->integral_use_precision = tmp_ufkt.integral_use_precision;
+ added_ufkt->linewidth = tmp_ufkt.linewidth;
+ added_ufkt->f1_linewidth = tmp_ufkt.f1_linewidth;
+ added_ufkt->f2_linewidth = tmp_ufkt.f2_linewidth;
+ added_ufkt->integral_linewidth = tmp_ufkt.integral_linewidth;
+ added_ufkt->str_dmin = tmp_ufkt.str_dmin;
+ added_ufkt->str_dmax = tmp_ufkt.str_dmax;
+ added_ufkt->dmin = tmp_ufkt.dmin;
+ added_ufkt->dmax = tmp_ufkt.dmax;
+ added_ufkt->str_startx = tmp_ufkt.str_startx;
+ added_ufkt->str_starty = tmp_ufkt.str_starty;
+ added_ufkt->oldx = tmp_ufkt.oldx;
+ added_ufkt->starty = tmp_ufkt.starty;
+ added_ufkt->startx = tmp_ufkt.startx;
+ added_ufkt->integral_precision = tmp_ufkt.integral_precision;
+ added_ufkt->color = tmp_ufkt.color;
+ added_ufkt->f1_color = tmp_ufkt.f1_color;
+ added_ufkt->f2_color = tmp_ufkt.f2_color;
+ added_ufkt->integral_color = tmp_ufkt.integral_color;
+ added_ufkt->parameters = tmp_ufkt.parameters;
+ added_ufkt->use_slider = tmp_ufkt.use_slider;
+ added_ufkt->usecustomxmin = tmp_ufkt.usecustomxmin;
+ added_ufkt->usecustomxmax = tmp_ufkt.usecustomxmax;
+ m_updatedfunction = added_ufkt;
+
+
+ // call inherited method
+ QEditParametric::accept(); //update the function name in FktDlg
+}
+
+QString KEditParametric::xFunction()
+{
+ return "x" + kLineEditName->text() + "(t)=" + kLineEditXFunction->text();
+}
+
+void KEditParametric::splitEquation( const QString equation, QString &name, QString &expression )
+{
+ int start = 0;
+ if( equation[ 0 ] == 'x' || equation[ 0 ] == 'y' ) start++;
+ int length = equation.find( '(' ) - start;
+ name = equation.mid( start, length );
+
+ expression = equation.section( '=', 1, 1 );
+}
+
+QString KEditParametric::yFunction()
+{
+ return "y" + kLineEditName->text() + "(t)=" + kLineEditYFunction->text();
+}
+
+Ufkt * KEditParametric::functionItem()
+{
+ return m_updatedfunction;
+}
+
+void KEditParametric::slotHelp()
+{
+ kapp->invokeHelp( "", "kmplot" );
+}
+void KEditParametric::customMinRange_toggled(bool status)
+{
+ if (status)
+ min->setEnabled(true);
+ else
+ min->setEnabled(false);
+}
+
+void KEditParametric::customMaxRange_toggled(bool status)
+{
+ if (status)
+ max->setEnabled(true);
+ else
+ max->setEnabled(false);
+}