summaryrefslogtreecommitdiffstats
path: root/kmplot/kmplot/FktDlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmplot/kmplot/FktDlg.cpp')
-rw-r--r--kmplot/kmplot/FktDlg.cpp337
1 files changed, 337 insertions, 0 deletions
diff --git a/kmplot/kmplot/FktDlg.cpp b/kmplot/kmplot/FktDlg.cpp
new file mode 100644
index 00000000..aef0b3f4
--- /dev/null
+++ b/kmplot/kmplot/FktDlg.cpp
@@ -0,0 +1,337 @@
+/*
+* KmPlot - a math. function plotter for the KDE-Desktop
+*
+* Copyright (C) 1998, 1999 Klaus-Dieter M�ler
+* 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 <qpushbutton.h>
+// #include <qpopupmenu.h>
+
+// KDE includes
+#include <kapplication.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <qcstring.h>
+#include <qcursor.h>
+#include <qheader.h>
+
+// locale includes
+#include "FktDlg.h"
+#include "FktDlg.moc"
+#include "editfunction.h"
+#include "keditparametric.h"
+#include "keditpolar.h"
+#include "MainDlg.h"
+#include "parseriface.h"
+#include "xparser.h"
+
+#include <kdebug.h>
+
+FktDlg::FktDlg( QWidget* parent, View *view ) : FktDlgData( parent, "editPlots" ), m_view(view)
+{
+ connect( cmdCopyFunction, SIGNAL( clicked() ), this, SLOT( slotCopyFunction()) );
+ connect( cmdMoveFunction, SIGNAL( clicked() ), this, SLOT( slotMoveFunction()) );
+ connect( lb_fktliste, SIGNAL( doubleClicked(QListViewItem *, const QPoint &, int)), this, SLOT(lb_fktliste_doubleClicked(QListViewItem *, const QPoint &, int)) );
+ connect( lb_fktliste, SIGNAL( clicked(QListViewItem *)), this, SLOT(lb_fktliste_clicked(QListViewItem *)));
+ connect( lb_fktliste, SIGNAL( spacePressed(QListViewItem *)), this, SLOT(lb_fktliste_spacePressed(QListViewItem *)));
+
+ lb_fktliste->addColumn( "" );
+ lb_fktliste->header()->hide();
+ lb_fktliste->setResizeMode( QListView::LastColumn );
+}
+
+FktDlg::~FktDlg()
+{
+}
+
+void FktDlg::slotDelete()
+{
+ if ( lb_fktliste->currentItem() == 0)
+ return;
+ QCheckListItem *currentItem = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ if( currentItem->text()[0] == 'x' )
+ {
+ // Delete pair of parametric function
+ int const id = getParamId( currentItem->text());
+ if ( id == -1)
+ return;
+ if ( !m_view->parser()->delfkt(id))
+ return;
+ }
+ else
+ {
+ // only one function to be deleted
+ if (!m_view->parser()->delfkt( getId( currentItem->text()) ) )
+ return;
+ }
+ lb_fktliste->takeItem( currentItem );
+ changed = true;
+ updateView();
+ if ( lb_fktliste->childCount()==0 )
+ PushButtonDel->setEnabled(false);
+}
+
+void FktDlg::lb_fktliste_doubleClicked( QListViewItem *, const QPoint &, int )
+{
+ if ( mapFromGlobal(QCursor::pos()).x() <= 40 )
+ return;
+ slotEdit();
+}
+
+void FktDlg::lb_fktliste_spacePressed( QListViewItem *item)
+{
+ if ( !item )
+ return;
+ QCheckListItem *currentItem = dynamic_cast<QCheckListItem *>(item);
+ int id;
+ if ( currentItem->text()[0] == 'x' )
+ id = getParamId(currentItem->text());
+ else
+ id = getId(currentItem->text());
+ Ufkt *function = &m_view->parser()->ufkt[ m_view->parser()->ixValue(id) ];
+ if ( id==-1 )
+ return;
+
+ function->f_mode=currentItem->isOn();
+ updateView();
+}
+
+void FktDlg::lb_fktliste_clicked( QListViewItem * item )
+{
+ if ( mapFromGlobal(QCursor::pos()).x() > 40 )
+ return;
+ lb_fktliste_spacePressed(item);
+}
+
+
+void FktDlg::slotEdit()
+{
+ QCheckListItem *currentItem = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ if ( currentItem == 0 )
+ {
+ PushButtonEdit->setEnabled(false);
+ return;
+ }
+ int const id = getId( currentItem->text().section( ";", 0, 0) ) ;
+
+ // find out the function type
+ char const prefix = m_view->parser()->ufkt[ m_view->parser()->ixValue(id) ].fstr.at(0).latin1();
+
+ if ( prefix == 'r')
+ slotEditPolar( id );
+ else if ( prefix == 'x')
+ slotEditParametric( id, m_view->parser()->ixValue(getId( currentItem->text().section( ";", 1, 1) )));
+ else
+ slotEditFunction( id );
+}
+
+int FktDlg::getId( const QString &f_str )
+{
+ for( QValueVector<Ufkt>::iterator it = m_view->parser()->ufkt.begin(); it != m_view->parser()->ufkt.end(); ++it)
+ {
+ if ( it->fstr == f_str )
+ return it->id;
+ }
+ return -1;
+}
+
+int FktDlg::getParamId( const QString &f_str)
+{
+ QString const fname = f_str.section( "(", 0, 0 );
+ for( QValueVector<Ufkt>::iterator it = m_view->parser()->ufkt.begin(); it != m_view->parser()->ufkt.end(); ++it)
+ {
+ if ( it->fname == fname )
+ return it->id;
+ }
+ return -1;
+}
+
+void FktDlg::updateView()
+{
+ m_view->drawPlot();
+}
+
+void FktDlg::slotHasSelection()
+{
+ bool const has_selection = !( lb_fktliste->currentItem() == 0 );
+ PushButtonEdit->setEnabled( has_selection );
+ PushButtonDel->setEnabled( has_selection );
+ cmdCopyFunction->setEnabled( has_selection );
+ cmdMoveFunction->setEnabled( has_selection );
+}
+
+void FktDlg::slotEditFunction( int id )
+{
+ EditFunction* editFunction = new EditFunction( m_view->parser(), this );
+ if ( id==-1 ) editFunction->setCaption(i18n( "New Function Plot" ));
+ else editFunction->setCaption(i18n( "Edit Function Plot" ));
+ editFunction->initDialog( id );
+ if( editFunction->exec() == QDialog::Accepted )
+ {
+ Ufkt *function = editFunction->functionItem();
+ QCheckListItem *item;
+ if( id == -1 ) //a new function
+ item = new QCheckListItem(lb_fktliste, function->fstr, QCheckListItem::CheckBox); //a new function
+ else //change a function
+ {
+ item = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ item->setText(0, function->fstr );
+ }
+ item->setOn(function->f_mode);
+ lb_fktliste->sort();
+ changed = true;
+ updateView();
+ }
+}
+
+void FktDlg::slotEditParametric( int x_id, int y_id)
+{
+ KEditParametric* editParametric = new KEditParametric( m_view->parser(), this );
+ if ( x_id==-1 && y_id==-1)
+ editParametric->setCaption(i18n( "New Parametric Plot" ));
+ editParametric->initDialog( x_id, y_id );
+ if( editParametric->exec() == QDialog::Accepted )
+ {
+ Ufkt *function_y = editParametric->functionItem();
+ Ufkt *function_x = &m_view->parser()->ufkt[m_view->parser()->ixValue(function_y->id - 1)]; //get the x-function
+ QCheckListItem *item;
+ if( x_id == -1 ) //a new function
+ {
+ item = new QCheckListItem(lb_fktliste, function_x->fstr+";"+function_y->fstr, QCheckListItem::CheckBox);
+ }
+ else //change a function
+ {
+ item = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ item->setText(0, function_x->fstr+";"+function_y->fstr );
+ }
+ item->setOn(function_y->f_mode);
+ lb_fktliste->sort();
+ changed = true;
+ updateView();
+ }
+}
+
+void FktDlg::slotEditPolar( int id )
+{
+ KEditPolar* editPolar = new KEditPolar( m_view->parser(), this );
+ if ( id==-1) editPolar->setCaption(i18n( "New Polar Plot" ));
+ editPolar->initDialog( id );
+ if( editPolar->exec() == QDialog::Accepted )
+ {
+ Ufkt *function = editPolar->functionItem();
+ QCheckListItem *item;
+ if( id == -1 ) // a new function
+ {
+ item = new QCheckListItem(lb_fktliste, function->fstr, QCheckListItem::CheckBox);
+ }
+ else //change a function
+ {
+ item = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ item->setText(0, function->fstr );
+ }
+ item->setOn(function->f_mode);
+ lb_fktliste->sort();
+ changed = true;
+ updateView();
+ }
+}
+
+void FktDlg::slotNewFunction()
+{
+ slotEditFunction();
+}
+
+void FktDlg::slotNewParametric()
+{
+ slotEditParametric();
+}
+
+void FktDlg::slotNewPolar()
+{
+ slotEditPolar();
+}
+
+void FktDlg::getPlots()
+{
+ lb_fktliste->clear();
+
+ // adding all yet added functions
+ for( QValueVector<Ufkt>::iterator it = m_view->parser()->ufkt.begin(); it != m_view->parser()->ufkt.end(); ++it)
+ {
+ if( it->fname.isEmpty() || it->fstr[0] == 'y' ) continue;
+ QCheckListItem *item;
+ if( it->fstr[0] == 'x' )
+ {
+ QString y = it->fstr;
+ ++it;
+ item = new QCheckListItem( lb_fktliste, y + ";" + it->fstr, QCheckListItem::CheckBox );
+ }
+ else
+ item = new QCheckListItem(lb_fktliste, it->fstr, QCheckListItem::CheckBox);
+ item->setOn(it->f_mode);
+ }
+ lb_fktliste->sort();
+}
+
+void FktDlg::slotHelp()
+{
+ kapp->invokeHelp( "", "kmplot" );
+}
+
+bool FktDlg::isChanged()
+{
+ return changed;
+}
+
+void FktDlg::showEvent ( QShowEvent * )
+{
+ changed = false;
+}
+
+void FktDlg::slotCopyFunction()
+{
+ if ( lb_fktliste->currentItem() == 0)
+ {
+ cmdCopyFunction->setEnabled(false);
+ return;
+ }
+ QCheckListItem *currentItem = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ QString const fstr = currentItem->text();
+ m_view->parser()->sendFunction(getId(fstr));
+}
+
+void FktDlg::slotMoveFunction()
+{
+ if ( lb_fktliste->currentItem() == 0)
+ {
+ cmdCopyFunction->setEnabled(false);
+ return;
+ }
+ QCheckListItem *currentItem = dynamic_cast<QCheckListItem *>(lb_fktliste->currentItem());
+ QString const fstr = currentItem->text();
+ if ( !m_view->parser()->sendFunction(getId( currentItem->text()) ) )
+ return;
+ slotDelete();
+}