diff options
Diffstat (limited to 'kspread/dialogs/kspread_dlg_series.cpp')
-rw-r--r-- | kspread/dialogs/kspread_dlg_series.cpp | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/kspread/dialogs/kspread_dlg_series.cpp b/kspread/dialogs/kspread_dlg_series.cpp new file mode 100644 index 00000000..ee241617 --- /dev/null +++ b/kspread/dialogs/kspread_dlg_series.cpp @@ -0,0 +1,213 @@ +/* This file is part of the KDE project + Copyright (C) 2002-2004 Ariya Hidayat <[email protected]> + (C) 2002-2003 Norbert Andres <[email protected]> + (C) 2002 John Dailey <[email protected]> + (C) 1999-2002 Laurent Montel <[email protected]> + (C) 2001-2002 Philipp Mueller <[email protected]> + (C) 2000-2001 Werner Trobin <[email protected]> + (C) 1998-2000 Torben Weis <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + + +#include "kspread_dlg_series.h" +#include "kspread_doc.h" +#include "kspread_editors.h" +#include "kspread_sheet.h" +#include "kspread_view.h" + +#include <tqlayout.h> +#include <tdelocale.h> +#include <tqlabel.h> + +#include <tqbuttongroup.h> +#include <tqgroupbox.h> +#include <tdemessagebox.h> +#include <knumvalidator.h> + +#include <tqradiobutton.h> +#include <tqcheckbox.h> +#include <tqlineedit.h> +#include <tqwhatsthis.h> +#include <knuminput.h> + +using namespace KSpread; + +SeriesDlg::SeriesDlg( View* parent, const char* name,const TQPoint &_marker) + : KDialogBase( parent, name,TRUE,i18n("Series"),Ok|Cancel ) +{ + m_pView = parent; + marker=_marker; + TQWidget *page = new TQWidget( this ); + setMainWidget(page); + + TQBoxLayout *grid1 = new TQHBoxLayout(page); + grid1->setSpacing( spacingHint() ); + + TQButtonGroup* gb1 = new TQButtonGroup( 2, Qt::Vertical, + i18n("Insert Values"), page ); + column = new TQRadioButton( i18n("Vertical"), gb1 ); + TQWhatsThis::add(column, i18n("Insert the series vertically, one below the other") ); + row = new TQRadioButton( i18n("Horizontal"), gb1 ); + TQWhatsThis::add(row, i18n("Insert the series horizontally, from left to right") ); + + column->setChecked(true); + + TQButtonGroup* gb2 = new TQButtonGroup( 2, Qt::Vertical, + i18n("Type"), page ); + linear = new TQRadioButton( i18n("Linear (2,4,6,...)"), gb2 ); + TQWhatsThis::add(linear, i18n("Generate a series from 'start' to 'end' and for each step add " + "the value provided in step. This creates a series where each value " + "is 'step' larger than the value before it.") ); + geometric = new TQRadioButton( i18n("Geometric (2,4,8,...)"), gb2 ); + TQWhatsThis::add(geometric, i18n("Generate a series from 'start' to 'end' and for each step multiply " + "the value with the value provided in step. Using a step of 5 produces a list like: " + "5, 25, 125, 625 since 5 multiplied by 5 (step) equals 25, and that multiplied by 5 equals 125, " + "which multiplied by the same step-value of 5 equals 625.") ); + + linear->setChecked(true); + + TQGroupBox* gb = new TQGroupBox( 1, Qt::Vertical, i18n("Parameters"), page ); + TQWidget *params = new TQWidget( gb ); + TQGridLayout *params_layout = new TQGridLayout( params, 3, 2 ); + params_layout->setSpacing( spacingHint() ); + params_layout->setAutoAdd( true ); + + new TQLabel( i18n( "Start value:" ), params ); + start=new KDoubleNumInput(-999999.999, 999999.99, 0.0, 1.0, 3, params); + + new TQLabel( i18n( "Stop value:" ), params ); + end=new KDoubleNumInput(-999999.999, 999999.99, 0.0, 1.0, 3, params); + + new TQLabel( i18n( "Step value:" ), params ); + step=new KDoubleNumInput(-999999.999, 999999.99, 0.0, 1.0, 3, params); + + grid1->addWidget(gb); + + grid1->addWidget(gb1); + grid1->addWidget(gb2); + + start->setFocus(); + + connect( this, TQT_SIGNAL( okClicked() ), this, TQT_SLOT( slotOk() ) ); +} + + +void SeriesDlg::slotOk() +{ + + Series mode=Column; //same as Qt::Vertical + Series type=Linear; // same as Qt::Horizontal + TQString tmp; + double dstep, dend, dstart; + Sheet * m_pSheet; + m_pSheet = m_pView->activeSheet(); + + if(column->isChecked()) + mode = Column; + else if(row->isChecked()) + mode = Row; + + if (linear->isChecked()) + type = Linear; + else if (geometric->isChecked()) + type = Geometric; + + dstart = start->value(); + dend= end->value(); + dstep = step->value(); + if ( type == Geometric ) + { + if ( dstart < 0 || dend < 0 ) + { + KMessageBox::error( this, i18n("End and start value must be positive.") ); + return; + } + if ( dstart > dend && dstep >= 1) + { + KMessageBox::error( this, i18n("End value must be greater than the start value or the step must be less than '1'.") ); + return; + } + if ( dstart == 0 || dend == 0 || dstep == 0) + { + KMessageBox::error( this, i18n("None of the Start, Stop or Step values may be equal to zero.") ); + return; + } + if ( dstep == 1) + { + KMessageBox::error( this, i18n("Step value must be different from 1") ); + return; + } + } + + if (dstep >= 0) + { + if (linear->isChecked() && dstep == 0) + { + KMessageBox::error( this, i18n("The step value must be greater than zero; " + "otherwise, the linear series is infinite.") ); + step->setFocus(); + return; + } + /* else if (geometric->isChecked() && dstep <= 1) + { + KMessageBox::error( this, i18n("The step value must be greater than one; " + "otherwise, the geometric series is infinite.") ); + step->setFocus(); + return; + } + */ + else if ( type == Linear && dend < dstart ) + { + KMessageBox::error( this, + i18n("If the start value is greater than the end value the step must be less than zero.") ); + return; + } + } + else if (type != Linear) + { + KMessageBox::error( this, i18n("Step is negative.") ); + return; + } + else + { + if (dstart <= dend) + { + KMessageBox::error( this, + i18n("If the step is negative, the start value must be greater then the end value.") ); + return; + } + } + + // double val_end = TQMAX(dend, dstart); + // double val_start = TQMIN(dend, dstart); + m_pView->doc()->emitBeginOperation( false ); + + m_pSheet->setSeries( marker, dstart, dend, dstep, mode, type ); + + Cell * cell = m_pSheet->cellAt( marker.x(), marker.y() ); + if ( cell->text() != 0L ) + m_pView->editWidget()->setText( cell->text() ); + else + m_pView->editWidget()->setText( "" ); + + m_pView->slotUpdateView( m_pView->activeSheet() ); + accept(); +} + + +#include "kspread_dlg_series.moc" |