diff options
Diffstat (limited to 'kmplot/kmplot/MainDlg.cpp')
-rw-r--r-- | kmplot/kmplot/MainDlg.cpp | 830 |
1 files changed, 830 insertions, 0 deletions
diff --git a/kmplot/kmplot/MainDlg.cpp b/kmplot/kmplot/MainDlg.cpp new file mode 100644 index 00000000..c148d3a2 --- /dev/null +++ b/kmplot/kmplot/MainDlg.cpp @@ -0,0 +1,830 @@ +/* +* KmPlot - a math. function plotter for the KDE-Desktop +* +* Copyright (C) 1998, 1999 Klaus-Dieter Möller +* 2000, 2002 kdmoeller@foni.net +* +* 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 <qslider.h> +#include <qtooltip.h> + +// KDE includes +#include <dcopclient.h> +#include <kaboutdata.h> +#include <kapplication.h> +#include <kconfigdialog.h> +#include <kdebug.h> +#include <kedittoolbar.h> +#include <kio/netaccess.h> +#include <kinstance.h> +#include <klineedit.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <ktempfile.h> +#include <ktoolbar.h> + + +// local includes +#include "editfunction.h" +#include "keditparametric.h" +#include "keditpolar.h" +#include "kprinterdlg.h" +#include "kconstanteditor.h" +#include "MainDlg.h" +#include "MainDlg.moc" +#include "settings.h" +#include "settingspagecolor.h" +#include "settingspagefonts.h" +#include "settingspageprecision.h" +#include "settingspagescaling.h" +#include "ksliderwindow.h" + +class XParser; +class KmPlotIO; + +bool MainDlg::oldfileversion; + +MainDlg::MainDlg(QWidget *parentWidget, const char *, QObject *parent, const char *name) : DCOPObject( "MainDlg" ), KParts::ReadOnlyPart( parent, name ), m_recentFiles( 0 ), m_modified(false), m_parent(parentWidget) +{ + // we need an instance + setInstance( KmPlotPartFactory::instance() ); + + kdDebug() << "parentWidget->name():" << parentWidget->name() << endl; + if ( QString(parentWidget->name()).startsWith("KmPlot") ) + { + setXMLFile("kmplot_part.rc"); + m_readonly = false; + } + else + { + setXMLFile("kmplot_part_readonly.rc"); + m_readonly = true; + new BrowserExtension(this); // better integration with Konqueror + } + fdlg = 0; + coordsDialog = 0; + m_popupmenu = new KPopupMenu(parentWidget); + view = new View( m_readonly, m_modified, m_popupmenu, parentWidget ); + connect( view, SIGNAL( setStatusBarText(const QString &)), this, SLOT( setReadOnlyStatusBarText(const QString &) ) ); + setWidget( view ); + view->setFocusPolicy(QWidget::ClickFocus); + minmaxdlg = new KMinMax(view, m_parent); + view->setMinMaxDlg(minmaxdlg); + m_quickEdit = new KLineEdit( parentWidget ); + m_quickEdit->setFocus(); + QToolTip::add( m_quickEdit, i18n( "Enter a function equation, for example: f(x)=x^2" ) ); + setupActions(); + loadConstants(); + kmplotio = new KmPlotIO(view->parser()); + m_config = kapp->config(); + m_recentFiles->loadEntries( m_config ); + + // Let's create a Configure Diloag + m_settingsDialog = new KConfigDialog( parentWidget, "settings", Settings::self() ); + m_settingsDialog->setHelp("general-config"); + + // create and add the page(s) + m_generalSettings = new SettingsPagePrecision( 0, "precisionSettings", "precision" ); + m_constantsSettings = new KConstantEditor( view, 0, "constantsSettings" ); + m_settingsDialog->addPage( m_generalSettings, i18n("General"), "package_settings", i18n("General Settings") ); + m_settingsDialog->addPage( m_constantsSettings, i18n("Constants"), "editconstants", i18n("Constants") ); + // User edited the configuration - update your local copies of the + // configuration data + connect( m_settingsDialog, SIGNAL( settingsChanged() ), this, SLOT(updateSettings() ) ); + connect( view, SIGNAL( resetZoom() ), this, SLOT(resetZoom() ) ); +} + +MainDlg::~MainDlg() +{ + m_recentFiles->saveEntries( m_config ); + saveConstants(); + delete kmplotio; +} + +void MainDlg::setupActions() +{ + // standard actions + m_recentFiles = KStdAction::openRecent( this, SLOT( slotOpenRecent( const KURL& ) ), actionCollection(),"file_openrecent"); + KStdAction::print( this, SLOT( slotPrint() ), actionCollection(),"file_print" ); + KStdAction::save( this, SLOT( slotSave() ), actionCollection() ); + KStdAction::saveAs( this, SLOT( slotSaveas() ), actionCollection() ); + connect( kapp, SIGNAL( lastWindowClosed() ), kapp, SLOT( quit() ) ); + + KAction *prefs = KStdAction::preferences( this, SLOT( slotSettings() ), actionCollection()); + prefs->setText( i18n( "Configure KmPlot..." ) ); + KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection()); + KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection()); + + + // KmPlot specific actions + // file menu + ( void ) new KAction( i18n( "E&xport..." ), 0, this, SLOT( slotExport() ), actionCollection(), "export"); + + //zoom menu + m_mnuNoZoom = new KRadioAction(i18n("&No Zoom") ,"CTRL+0",view, SLOT( mnuNoZoom_clicked() ),actionCollection(),"no_zoom" ); + KRadioAction * mnuRectangular = new KRadioAction(i18n("Zoom &Rectangular"), "viewmagfit", "CTRL+1",view, SLOT( mnuRectangular_clicked() ),actionCollection(),"zoom_rectangular" ); + KRadioAction * mnuZoomIn = new KRadioAction(i18n("Zoom &In"), "viewmag+", "CTRL+2",view, SLOT( mnuZoomIn_clicked() ),actionCollection(),"zoom_in" ); + KRadioAction * mnuZoomOut = new KRadioAction(i18n("Zoom &Out"), "viewmag-", "CTRL+3",view, SLOT( mnuZoomOut_clicked() ),actionCollection(),"zoom_out" ); + KRadioAction * mnuZoomCenter = new KRadioAction(i18n("&Center Point") ,"CTRL+4",view, SLOT( mnuCenter_clicked() ),actionCollection(),"zoom_center" ); + (void ) new KAction(i18n("&Fit Widget to Trigonometric Functions") ,0,view, SLOT( mnuTrig_clicked() ),actionCollection(),"zoom_trig" ); + m_mnuNoZoom->setExclusiveGroup("zoom_modes"); + m_mnuNoZoom->setChecked(true); + mnuRectangular->setExclusiveGroup("zoom_modes"); + mnuZoomIn->setExclusiveGroup("zoom_modes"); + mnuZoomOut->setExclusiveGroup("zoom_modes"); + mnuZoomCenter->setExclusiveGroup("zoom_modes"); + + // help menu + ( void ) new KAction( i18n( "Predefined &Math Functions" ), "functionhelp", 0, this, SLOT( slotNames() ), actionCollection(), "names" ); + + // edit menu + ( void ) new KAction( i18n( "&Colors..." ), "colorize.png", 0, this, SLOT( editColors() ), actionCollection(), "editcolors" ); + ( void ) new KAction( i18n( "&Coordinate System..." ), "coords.png", 0, this, SLOT( editAxes() ), actionCollection(), "editaxes" ); + // ( void ) new KAction( i18n( "&Grid..." ), "coords.png", 0, this, SLOT( editGrid() ), actionCollection(), "editgrid" ); + ( void ) new KAction( i18n( "&Scaling..." ), "scaling", 0, this, SLOT( editScaling() ), actionCollection(), "editscaling" ); + ( void ) new KAction( i18n( "&Fonts..." ), "fonts", 0, this, SLOT( editFonts() ), actionCollection(), "editfonts" ); + + ( void ) new KAction( i18n( "Coordinate System I" ), "ksys1.png", 0, this, SLOT( slotCoord1() ), actionCollection(), "coord_i" ); + ( void ) new KAction( i18n( "Coordinate System II" ), "ksys2.png", 0, this, SLOT( slotCoord2() ), actionCollection(), "coord_ii" ); + ( void ) new KAction( i18n( "Coordinate System III" ), "ksys3.png", 0, this, SLOT( slotCoord3() ), actionCollection(), "coord_iii" ); + + // plot menu + ( void ) new KAction( i18n( "&New Function Plot..." ), "newfunction", 0, this, SLOT( newFunction() ), actionCollection(), "newfunction" ); + ( void ) new KAction( i18n( "New Parametric Plot..." ), "newparametric", 0, this, SLOT( newParametric() ), actionCollection(), "newparametric" ); + ( void ) new KAction( i18n( "New Polar Plot..." ), "newpolar", 0, this, SLOT( newPolar() ), actionCollection(), "newpolar" ); + ( void ) new KAction( i18n( "Edit Plots..." ), "editplots", 0, this, SLOT( slotEditPlots() ), actionCollection(), "editplots" ); + + // tools menu + KAction *mnuYValue = new KAction( i18n( "&Get y-Value..." ), 0, this, SLOT( getYValue() ), actionCollection(), "yvalue" ); + KAction *mnuMinValue = new KAction( i18n( "&Search for Minimum Value..." ), "minimum", 0, this, SLOT( findMinimumValue() ), actionCollection(), "minimumvalue" ); + KAction *mnuMaxValue = new KAction( i18n( "&Search for Maximum Value..." ), "maximum", 0, this, SLOT( findMaximumValue() ), actionCollection(), "maximumvalue" ); + KAction *mnuArea = new KAction( i18n( "&Calculate Integral" ), 0, this, SLOT( graphArea() ), actionCollection(), "grapharea" ); + + connect( m_quickEdit, SIGNAL( returnPressed( const QString& ) ), this, SLOT( slotQuickEdit( const QString& ) ) ); + KWidgetAction* quickEditAction = new KWidgetAction( m_quickEdit, i18n( "Quick Edit" ), 0, this, 0, actionCollection(), "quickedit" ); + quickEditAction->setWhatsThis( i18n( "Enter a simple function equation here.\n" + "For instance: f(x)=x^2\nFor more options use Functions->Edit Plots... menu." ) ); + + view->mnuSliders[0] = new KToggleAction( i18n( "Show Slider 1" ), 0, this, SLOT( toggleShowSlider0() ), actionCollection(), QString( "options_configure_show_slider_0" ).latin1() ); + view->mnuSliders[1] = new KToggleAction( i18n( "Show Slider 2" ), 0, this, SLOT( toggleShowSlider1() ), actionCollection(), QString( "options_configure_show_slider_1" ).latin1() ); + view->mnuSliders[2] = new KToggleAction( i18n( "Show Slider 3" ), 0, this, SLOT( toggleShowSlider2() ), actionCollection(), QString( "options_configure_show_slider_2" ).latin1() ); + view->mnuSliders[3] = new KToggleAction( i18n( "Show Slider 4" ), 0, this, SLOT( toggleShowSlider3() ), actionCollection(), QString( "options_configure_show_slider_3" ).latin1() ); + + // Popup menu + KAction *mnuHide = new KAction(i18n("&Hide") ,0,view, SLOT( mnuHide_clicked() ),actionCollection(),"mnuhide" ); + mnuHide->plug(m_popupmenu); + KAction *mnuRemove = new KAction(i18n("&Remove"),"editdelete", 0,view, SLOT( mnuRemove_clicked() ),actionCollection(),"mnuremove" ); + mnuRemove->plug(m_popupmenu); + KAction *mnuEdit = new KAction(i18n("&Edit"),"editplots", 0,view, SLOT( mnuEdit_clicked() ),actionCollection(),"mnuedit" ); + mnuEdit->plug(m_popupmenu); + m_popupmenu->insertSeparator(); + KAction *mnuCopy = new KAction(i18n("&Copy"), 0,view, SLOT( mnuCopy_clicked() ),actionCollection(),"mnucopy" ); + mnuCopy->plug(m_popupmenu); + KAction *mnuMove = new KAction(i18n("&Move"), 0,view, SLOT( mnuMove_clicked() ),actionCollection(),"mnumove" ); + mnuMove->plug(m_popupmenu); + m_popupmenu->insertSeparator(); + mnuYValue->plug(m_popupmenu); + mnuMinValue->plug(m_popupmenu); + mnuMaxValue->plug(m_popupmenu); + mnuArea->plug(m_popupmenu); +} +bool MainDlg::checkModified() +{ + if( m_modified ) + { + int saveit = KMessageBox::warningYesNoCancel( m_parent, i18n( "The plot has been modified.\n" + "Do you want to save it?" ), QString::null, KStdGuiItem::save(), KStdGuiItem::discard() ); + switch( saveit ) + { + case KMessageBox::Yes: + slotSave(); + if ( m_modified) // the user didn't saved the file + return false; + break; + case KMessageBox::Cancel: + return false; + } + } + return true; +} +/* +void MainDlg::slotCleanWindow() +{ + if (m_readonly) + return; + view->init(); // set globals to default + view->updateSliders(); + view->drawPlot(); +} +*/ +void MainDlg::slotSave() +{ + if ( !m_modified || m_readonly) //don't save if no changes are made or readonly is enabled + return; + if ( m_url.isEmpty() ) // if there is no file name set yet + slotSaveas(); + else + { + if ( !m_modified) //don't save if no changes are made + return; + + if ( oldfileversion) + { + if ( KMessageBox::warningContinueCancel( m_parent, i18n( "This file is saved with an old file format; if you save it, you cannot open the file with older versions of Kmplot. Are you sure you want to continue?" ), QString::null, i18n("Save New Format") ) == KMessageBox::Cancel) + return; + } + kmplotio->save( m_url.url() ); + kdDebug() << "saved" << endl; + m_modified = false; + } + +} + +void MainDlg::slotSaveas() +{ + if (m_readonly) + return; + const KURL url = KFileDialog::getSaveURL( QDir::currentDirPath(), i18n( "*.fkt|KmPlot Files (*.fkt)\n*|All Files" ), m_parent, i18n( "Save As" ) ); + + if ( !url.isEmpty() ) + { + // check if file exists and overwriting is ok. + if( !KIO::NetAccess::exists( url,false,m_parent ) || KMessageBox::warningContinueCancel( m_parent, i18n( "A file named \"%1\" already exists. Are you sure you want to continue and overwrite this file?" ).arg( url.url()), i18n( "Overwrite File?" ), KGuiItem( i18n( "&Overwrite" ) ) ) == KMessageBox::Continue ) + { + if ( !kmplotio->save( url ) ) + KMessageBox::error(m_parent, i18n("The file could not be saved") ); + else + { + m_url = url; + m_recentFiles->addURL( url ); + setWindowCaption( m_url.prettyURL(0, KURL::StripFileProtocol) ); + m_modified = false; + } + return; + } + } +} + +void MainDlg::slotExport() +{ + KURL const url = KFileDialog::getSaveURL(QDir::currentDirPath(), + i18n("*.svg|Scalable Vector Graphics (*.svg)\n" + "*.bmp|Bitmap 180dpi (*.bmp)\n" + "*.png|Bitmap 180dpi (*.png)"), m_parent, i18n("Export") ); + if(!url.isEmpty()) + { + // check if file exists and overwriting is ok. + if( KIO::NetAccess::exists(url,false,m_parent ) && KMessageBox::warningContinueCancel( m_parent, i18n( "A file named \"%1\" already exists. Are you sure you want to continue and overwrite this file?" ).arg(url.url() ), i18n( "Overwrite File?" ), KGuiItem( i18n( "&Overwrite" ) ) ) != KMessageBox::Continue ) return; + + if( url.fileName().right(4).lower()==".svg") + { + QPicture pic; + view->draw(&pic, 2); + if (url.isLocalFile() ) + pic.save( url.prettyURL(0,KURL::StripFileProtocol), "SVG"); + else + { + KTempFile tmp; + pic.save( tmp.name(), "SVG"); + if ( !KIO::NetAccess::upload(tmp.name(), url, 0) ) + KMessageBox::error(m_parent, i18n("The URL could not be saved.") ); + tmp.unlink(); + } + } + + else if( url.fileName().right(4).lower()==".bmp") + { + QPixmap pic(100, 100); + view->draw(&pic, 3); + if (url.isLocalFile() ) + pic.save( url.prettyURL(0,KURL::StripFileProtocol), "BMP"); + else + { + KTempFile tmp; + pic.save( tmp.name(), "BMP"); + if ( !KIO::NetAccess::upload(tmp.name(), url, 0) ) + KMessageBox::error(m_parent, i18n("The URL could not be saved.") ); + tmp.unlink(); + } + } + + else if( url.fileName().right(4).lower()==".png") + { + QPixmap pic(100, 100); + view->draw(&pic, 3); + if (url.isLocalFile() ) + pic.save( url.prettyURL(0,KURL::StripFileProtocol), "PNG"); + else + { + KTempFile tmp; + pic.save( tmp.name(), "PNG"); + if ( !KIO::NetAccess::upload(tmp.name(), url, 0) ) + KMessageBox::error(m_parent, i18n("The URL could not be saved.") ); + tmp.unlink(); + } + } + } +} +bool MainDlg::openFile() +{ + view->init(); + if (m_url==m_currentfile || !kmplotio->load( m_url ) ) + { + m_recentFiles->removeURL(m_url ); //remove the file from the recent-opened-file-list + m_url = ""; + return false; + } + m_currentfile = m_url; + m_recentFiles->addURL( m_url.prettyURL(0, KURL::StripFileProtocol) ); + setWindowCaption( m_url.prettyURL(0, KURL::StripFileProtocol) ); + m_modified = false; + view->updateSliders(); + view->drawPlot(); + return true; +} + +void MainDlg::slotOpenRecent( const KURL &url ) +{ + if( isModified() || !m_url.isEmpty() ) // open the file in a new window + { + QByteArray data; + QDataStream stream(data, IO_WriteOnly); + stream << url; + KApplication::kApplication()->dcopClient()->send(KApplication::kApplication()->dcopClient()->appId(), "KmPlotShell","openFileInNewWindow(KURL)", data); + return; + } + + view->init(); + if ( !kmplotio->load( url ) ) //if the loading fails + { + m_recentFiles->removeURL(url ); //remove the file from the recent-opened-file-list + return; + } + m_url = m_currentfile = url; + m_recentFiles->setCurrentItem(-1); //don't select the item in the open-recent menu + setWindowCaption( m_url.prettyURL(0, KURL::StripFileProtocol) ); + m_modified = false; + view->updateSliders(); + view->drawPlot(); +} + +void MainDlg::slotPrint() +{ + KPrinter prt( QPrinter::PrinterResolution ); + prt.setResolution( 72 ); + prt.addDialogPage( new KPrinterDlg( m_parent, "KmPlot page" ) ); + if ( prt.setup( m_parent, i18n( "Print Plot" ) ) ) + { + prt.setFullPage( true ); + view->draw(&prt, 1); + } +} + +void MainDlg::editColors() +{ + // create a config dialog and add a colors page + KConfigDialog* colorsDialog = new KConfigDialog( m_parent, "colors", Settings::self() ); + colorsDialog->setHelp("color-config"); + colorsDialog->addPage( new SettingsPageColor( 0, "colorSettings" ), i18n( "Colors" ), "colorize", i18n( "Edit Colors" ) ); + + // User edited the configuration - update your local copies of the + // configuration data + connect( colorsDialog, SIGNAL( settingsChanged() ), this, SLOT(updateSettings() ) ); + colorsDialog->show(); +} + +void MainDlg::editAxes() +{ + // create a config dialog and add a axes page + if ( !coordsDialog) + { + coordsDialog = new CoordsConfigDialog( view->parser(), m_parent); + // User edited the configuration - update your local copies of the + // configuration data + connect( coordsDialog, SIGNAL( settingsChanged() ), this, SLOT(updateSettings() ) ); + } + coordsDialog->show(); +} + +void MainDlg::editScaling() +{ + // create a config dialog and add a scaling page + KConfigDialog *scalingDialog = new KConfigDialog( m_parent, "scaling", Settings::self() ); + scalingDialog->setHelp("scaling-config"); + scalingDialog->addPage( new SettingsPageScaling( 0, "scalingSettings" ), i18n( "Scale" ), "scaling", i18n( "Edit Scaling" ) ); + // User edited the configuration - update your local copies of the + // configuration data + connect( scalingDialog, SIGNAL( settingsChanged() ), this, SLOT(updateSettings() ) ); + scalingDialog->show(); +} + +void MainDlg::editFonts() +{ + // create a config dialog and add a font page + KConfigDialog* fontsDialog = new KConfigDialog( m_parent, "fonts", Settings::self() ); + fontsDialog->setHelp("font-config"); + fontsDialog->addPage( new SettingsPageFonts( 0, "fontsSettings" ), i18n( "Fonts" ), "fonts", i18n( "Edit Fonts" ) ); + // User edited the configuration - update your local copies of the + // configuration data + connect( fontsDialog, SIGNAL( settingsChanged() ), this, SLOT(updateSettings() ) ); + fontsDialog->show(); +} + +void MainDlg::editConstants() +{ + QConstantEditor* contsDialog = new QConstantEditor(); + contsDialog->show(); +} + +void MainDlg::slotNames() +{ + kapp->invokeHelp( "func-predefined", "kmplot" ); +} + +void MainDlg::newFunction() +{ + EditFunction* editFunction = new EditFunction( view->parser(), m_parent ); + editFunction->setCaption(i18n( "New Function Plot" ) ); + editFunction->initDialog(); + if ( editFunction->exec() == QDialog::Accepted ) + { + m_modified = true; + view->updateSliders(); + view->drawPlot(); + } +} + +void MainDlg::newParametric() +{ + KEditParametric* editParametric = new KEditParametric( view->parser(), m_parent ); + editParametric->setCaption(i18n( "New Parametric Plot")); + editParametric->initDialog(); + if ( editParametric->exec() == QDialog::Accepted ) + { + m_modified = true; + view->drawPlot(); + } + +} + +void MainDlg::newPolar() +{ + KEditPolar* editPolar = new KEditPolar( view->parser(), m_parent ); + editPolar->setCaption(i18n( "New Polar Plot")); + editPolar->initDialog(); + if ( editPolar->exec() == QDialog::Accepted ) + { + m_modified = true; + view->drawPlot(); + } + +} + +void MainDlg::slotEditPlots() +{ + if ( !fdlg ) fdlg = new FktDlg( m_parent, view ); // make the dialog only if not allready done + fdlg->getPlots(); + KTempFile tmpfile; + kmplotio->save( tmpfile.name() ); + if( fdlg->exec() == QDialog::Rejected ) + { + if ( fdlg->isChanged() ) + { + view->init(); + kmplotio->load( tmpfile.name() ); + view->drawPlot(); + } + } + else if ( fdlg->isChanged() ) + { + view->updateSliders(); + m_modified = true; + } + tmpfile.unlink(); +} + +void MainDlg::slotQuickEdit(const QString& f_str_const ) +{ + //creates a valid name for the function if the user has forgotten that + QString f_str( f_str_const ); + int const pos = f_str_const.find(';'); + if (pos!=-1) + f_str = f_str.left(pos); + if (f_str.at(0)=='r') + view->parser()->fixFunctionName(f_str, XParser::Polar); + else + view->parser()->fixFunctionName(f_str); + if ( f_str.at(0)== 'x' || f_str.at(0)== 'y') + { + KMessageBox::error( m_parent, i18n("Parametric functions must be definied in the \"New Parametric Plot\"-dialog which you can find in the menubar")); + return; + } + if ( f_str.contains('y') != 0) + { + KMessageBox::error( m_parent, i18n( "Recursive function is not allowed")); + m_quickEdit->setFocus(); + m_quickEdit->selectAll(); + return; + } + + int const id = view->parser()->addfkt( f_str ); + if (id==-1) + { + view->parser()->parserError(); + m_quickEdit->setFocus(); + m_quickEdit->selectAll(); + return; + } + Ufkt *ufkt = &view->parser()->ufkt.last(); + view->parser()->prepareAddingFunction(ufkt); + + if ( pos!=-1 && !view->parser()->getext(ufkt, QString(f_str_const))) + { + m_quickEdit->setFocus(); + m_quickEdit->selectAll(); + view->parser()->Parser::delfkt( ufkt ); + return; + } + m_quickEdit->clear(); + m_modified = true; + view->drawPlot(); +} + + +void MainDlg::slotCoord1() +{ + Settings::setXRange( 0 ); + Settings::setYRange( 0 ); + m_modified = true; + view->drawPlot(); +} + +void MainDlg::slotCoord2() +{ + Settings::setXRange( 2 ); + Settings::setYRange( 0 ); + m_modified = true; + view->drawPlot(); +} + +void MainDlg::slotCoord3() +{ + Settings::setXRange( 2 ); + Settings::setYRange( 2 ); + m_modified = true; + view->drawPlot(); +} + +void MainDlg::slotSettings() +{ + // An instance of your dialog has already been created and has been cached, + // so we want to display the cached dialog instead of creating + // another one + KConfigDialog::showDialog( "settings" ); +} + +void MainDlg::updateSettings() +{ + view->getSettings(); + m_modified = true; + view->drawPlot(); +} + +void MainDlg::loadConstants() +{ + KSimpleConfig conf ("kcalcrc"); + conf.setGroup("UserConstants"); + QString tmp; + QString tmp_constant; + QString tmp_value; + char constant; + double value; + for( int i=0; ;i++) + { + tmp.setNum(i); + tmp_constant = conf.readEntry("nameConstant"+tmp," "); + tmp_value = conf.readEntry("valueConstant"+tmp," "); +// kdDebug() << "konstant: " << tmp_constant.latin1() << endl; +// kdDebug() << "value: " << value << endl; +// kdDebug() << "**************" << endl; + + if ( tmp_constant == " " || tmp_constant == " ") + return; + + constant = tmp_constant.at(0).upper().latin1(); + + if ( constant<'A' || constant>'Z') + constant = 'A'; + value = view->parser()->eval(tmp_value); + if ( view->parser()->parserError(false) ) //couln't parse the value + continue; + + if ( !view->parser()->constant.empty() ) + { + bool copy_found=false; + while (!copy_found) + { + // go through the constant list + QValueVector<Constant>::iterator it = view->parser()->constant.begin(); + while (it!= view->parser()->constant.end() && !copy_found) + { + if (constant == it->constant ) + copy_found = true; + else + ++it; + } + if ( !copy_found) + copy_found = true; + else + { + copy_found = false; + if (constant == 'Z') + constant = 'A'; + else + constant++; + } + } + } + /*kdDebug() << "**************" << endl; + kdDebug() << "C:" << constant << endl; + kdDebug() << "V:" << value << endl;*/ + + view->parser()->constant.append(Constant(constant, value) ); + } +} + +void MainDlg::saveConstants() +{ + KSimpleConfig conf ("kcalcrc"); + conf.deleteGroup("Constants"); + conf.setGroup("UserConstants"); + QString tmp; + for( int i = 0; i< (int)view->parser()->constant.size();i++) + { + tmp.setNum(i); + conf.writeEntry("nameConstant"+tmp, QString( QChar(view->parser()->constant[i].constant) ) ) ; + conf.writeEntry("valueConstant"+tmp, view->parser()->constant[i].value); + } +} + +void MainDlg::getYValue() +{ + minmaxdlg->init(2); + minmaxdlg->show(); +} + +void MainDlg::findMinimumValue() +{ + minmaxdlg->init(0); + minmaxdlg->show(); +} + +void MainDlg::findMaximumValue() +{ + minmaxdlg->init(1); + minmaxdlg->show(); +} + +void MainDlg::graphArea() +{ + minmaxdlg->init(3); + minmaxdlg->show(); +} + +void MainDlg::toggleShowSlider0() +{ + toggleShowSlider(0); +} + +void MainDlg::toggleShowSlider1() +{ + toggleShowSlider(1); +} + +void MainDlg::toggleShowSlider2() +{ + toggleShowSlider(2); +} + +void MainDlg::toggleShowSlider3() +{ + toggleShowSlider(3); +} + +void MainDlg::toggleShowSlider(int const num) +{ + // create the slider if it not exists already + if ( view->sliders[ num ] == 0 ) + { + view->sliders[ num ] = new KSliderWindow( view, num); + connect( view->sliders[num]->slider, SIGNAL( valueChanged( int ) ), view, SLOT( drawPlot() ) ); + connect( view->sliders[num], SIGNAL( windowClosed( int ) ), view, SLOT( sliderWindowClosed(int) ) ); + } + if ( !view->sliders[ num ]->isShown() ) + view->sliders[ num ]->show(); + else + view->sliders[ num ]->hide(); +} + +void MainDlg::setReadOnlyStatusBarText(const QString &text) +{ + setStatusBarText(text); +} + +void MainDlg::optionsConfigureKeys() +{ + KApplication::kApplication()->dcopClient()->send(KApplication::kApplication()->dcopClient()->appId(), "KmPlotShell","optionsConfigureKeys()", QByteArray()); +} + +void MainDlg::optionsConfigureToolbars() +{ + KApplication::kApplication()->dcopClient()->send(KApplication::kApplication()->dcopClient()->appId(), "KmPlotShell","optionsConfigureToolbars()", QByteArray()); +} + +void MainDlg::resetZoom() +{ + m_mnuNoZoom->activate(); +} + +// It's usually safe to leave the factory code alone.. with the +// notable exception of the KAboutData data +#include <kaboutdata.h> +#include <klocale.h> + +KInstance* KmPlotPartFactory::s_instance = 0L; +KAboutData* KmPlotPartFactory::s_about = 0L; + +KmPlotPartFactory::KmPlotPartFactory() + : KParts::Factory() +{} + +KmPlotPartFactory::~KmPlotPartFactory() +{ + delete s_instance; + delete s_about; + + s_instance = 0L; +} + +KParts::Part* KmPlotPartFactory::createPartObject( QWidget *parentWidget, const char *widgetName, + QObject *parent, const char *name, + const char *, const QStringList & ) +{ + // Create an instance of our Part + MainDlg* obj = new MainDlg( parentWidget, widgetName, parent, name ); + emit objectCreated( obj ); + return obj; +} + +KInstance* KmPlotPartFactory::instance() +{ + if( !s_instance ) + { + s_about = new KAboutData("kmplot",I18N_NOOP( "KmPlotPart" ), "1"); + s_instance = new KInstance(s_about); + } + return s_instance; +} + +extern "C" +{ + KDE_EXPORT void* init_libkmplotpart() + { + return new KmPlotPartFactory; + } +} + + +/// BrowserExtension class +BrowserExtension::BrowserExtension(MainDlg* parent) + : KParts::BrowserExtension( parent, "KmPlot::BrowserExtension" ) +{ + emit enableAction("print", true); + setURLDropHandlingEnabled(true); +} + +void BrowserExtension::print() +{ + static_cast<MainDlg*>(parent())->slotPrint(); +} + + |