21#include <csvimportdialogui.h>
22#include <csvimportdialog.h>
25#include <tqcheckbox.h>
27#include <tqlineedit.h>
28#include <tqcombobox.h>
30#include <tqtextstream.h>
31#include <tqbuttongroup.h>
32#include <tqpushbutton.h>
33#include <tqradiobutton.h>
34#include <tqtextcodec.h>
36#include <tdeapplication.h>
40#include <tdemessagebox.h>
44CSVImportDialog::CSVImportDialog(TQWidget* parent, TQByteArray& fileArray)
45 : KDialogBase(parent, 0, true, TQString(), Ok|Cancel, No, true),
46 m_dialog(new DialogUI(this)),
56 m_fileArray(fileArray),
57 m_codec( TQTextCodec::codecForName(
"UTF-8" ) )
59 setCaption( i18n(
"Import Data" ) );
60 kapp->restoreOverrideCursor();
62 TQStringList encodings;
63 encodings << i18n(
"Descriptive encoding name",
"Recommended ( %1 )" ).arg(
"UTF-8" );
64 encodings << i18n(
"Descriptive encoding name",
"Locale ( %1 )" ).arg( TQTextCodec::codecForLocale()->name() );
65 encodings += TDEGlobal::charsets()->descriptiveEncodingNames();
67 const TQString description(i18n(
"Descriptive encoding name",
"Other ( %1 )"));
68 encodings << description.arg(
"Apple Roman");
69 encodings << description.arg(
"IBM 850") << description.arg(
"IBM 866");
70 encodings << description.arg(
"CP 1258");
71 m_dialog->comboBoxEncoding->insertStringList(encodings);
73 m_formatList << i18n(
"Text" );
74 m_formatList << i18n(
"Number" );
77 m_formatList << i18n(
"Decimal Comma Number" );
78 m_formatList << i18n(
"Decimal Point Number" );
79 m_dialog->m_formatComboBox->insertStringList( m_formatList );
81 m_dialog->m_sheet->setReadOnly(
true );
87 setMainWidget(m_dialog);
89 m_dialog->m_sheet->setSelectionMode( TQTable::Multi );
91 connect(m_dialog->m_formatComboBox, TQ_SIGNAL(activated(
const TQString& )),
92 this, TQ_SLOT(formatChanged(
const TQString& )));
93 connect(m_dialog->m_delimiterBox, TQ_SIGNAL(clicked(
int)),
94 this, TQ_SLOT(delimiterClicked(
int)));
95 connect(m_dialog->m_delimiterEdit, TQ_SIGNAL(returnPressed()),
96 this, TQ_SLOT(returnPressed()));
97 connect(m_dialog->m_delimiterEdit, TQ_SIGNAL(textChanged (
const TQString & )),
98 this, TQ_SLOT(formatChanged (
const TQString & ) ));
99 connect(m_dialog->m_comboQuote, TQ_SIGNAL(activated(
const TQString &)),
100 this, TQ_SLOT(textquoteSelected(
const TQString &)));
101 connect(m_dialog->m_sheet, TQ_SIGNAL(currentChanged(
int,
int)),
102 this, TQ_SLOT(currentCellChanged(
int,
int)));
103 connect(m_dialog->m_ignoreDuplicates, TQ_SIGNAL(stateChanged(
int)),
104 this, TQ_SLOT(ignoreDuplicatesChanged(
int)));
105 connect(m_dialog->m_updateButton, TQ_SIGNAL(clicked()),
106 this, TQ_SLOT(updateClicked()));
107 connect(m_dialog->comboBoxEncoding, TQ_SIGNAL(textChanged (
const TQString & )),
108 this, TQ_SLOT(encodingChanged (
const TQString & ) ));
112CSVImportDialog::~CSVImportDialog()
114 kapp->setOverrideCursor(TQt::waitCursor);
122bool CSVImportDialog::firstRowContainHeaders()
124 return m_dialog->m_firstRowHeader->isChecked();
128bool CSVImportDialog::firstColContainHeaders()
130 return m_dialog->m_firstColHeader->isChecked();
134int CSVImportDialog::rows()
136 int rows = m_dialog->m_sheet->numRows();
139 rows = m_endRow - m_startRow + 1;
145int CSVImportDialog::cols()
147 int cols = m_dialog->m_sheet->numCols();
150 cols = m_endCol - m_startCol + 1;
156TQString CSVImportDialog::text(
int row,
int col)
159 if ( row >= rows() || col >= cols())
162 return m_dialog->m_sheet->text( row - m_startRow, col - m_startCol );
169void CSVImportDialog::fillTable( )
172 bool lastCharDelimiter =
false;
173 enum { S_START, S_QUOTED_FIELD, S_MAYBE_END_OF_QUOTED_FIELD, S_END_OF_QUOTED_FIELD,
174 S_MAYBE_NORMAL_FIELD, S_NORMAL_FIELD } state = S_START;
179 kapp->setOverrideCursor(TQt::waitCursor);
181 for (row = 0; row < m_dialog->m_sheet->numRows(); ++row)
182 for (column = 0; column < m_dialog->m_sheet->numCols(); ++column)
183 m_dialog->m_sheet->clearCell(row, column);
187 TQTextStream inputStream(m_fileArray, IO_ReadOnly);
188 kdDebug(30501) <<
"Encoding: " << m_codec->name() << endl;
189 inputStream.setCodec( m_codec );
191 bool lastCharWasCr =
false;
192 while (!inputStream.atEnd())
200 lastCharWasCr =
true;
203 else if ( x ==
'\n' && lastCharWasCr )
206 lastCharWasCr =
false;
209 else if ( x == TQChar( 0xc ) )
212 lastCharWasCr =
false;
217 lastCharWasCr =
false;
220 if ( column > maxColumn )
226 if (x == m_textquote)
228 state = S_QUOTED_FIELD;
230 else if (x == m_delimiter)
232 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
234 lastCharDelimiter =
true;
240 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
246 state = S_MAYBE_NORMAL_FIELD;
249 case S_QUOTED_FIELD :
250 if (x == m_textquote)
252 state = S_MAYBE_END_OF_QUOTED_FIELD;
256 setText(row - m_startRow, column - m_startCol, field);
261 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
271 case S_MAYBE_END_OF_QUOTED_FIELD :
272 if (x == m_textquote)
275 state = S_QUOTED_FIELD;
277 else if (x == m_delimiter || x ==
'\n')
279 setText(row - m_startRow, column - m_startCol, field);
285 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
290 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
292 lastCharDelimiter =
true;
298 state = S_END_OF_QUOTED_FIELD;
301 case S_END_OF_QUOTED_FIELD :
302 if (x == m_delimiter || x ==
'\n')
304 setText(row - m_startRow, column - m_startCol, field);
310 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
315 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
317 lastCharDelimiter =
true;
323 state = S_END_OF_QUOTED_FIELD;
326 case S_MAYBE_NORMAL_FIELD :
327 if (x == m_textquote)
330 state = S_QUOTED_FIELD;
333 case S_NORMAL_FIELD :
334 if (x == m_delimiter || x ==
'\n')
336 setText(row - m_startRow, column - m_startCol, field);
342 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
347 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
349 lastCharDelimiter =
true;
358 if (x != m_delimiter)
359 lastCharDelimiter =
false;
362 if ( !field.isEmpty() )
365 setText(row - m_startRow, column - m_startCol, field);
371 adjustRows( row - m_startRow );
372 adjustCols( maxColumn - m_startCol );
373 m_dialog->m_colEnd->setMaxValue( maxColumn );
374 if ( m_endCol == -1 )
375 m_dialog->m_colEnd->setValue( maxColumn );
378 for (column = 0; column < m_dialog->m_sheet->numCols(); ++column)
380 const TQString header = m_dialog->m_sheet->horizontalHeader()->label(column);
381 if ( m_formatList.find( header ) == m_formatList.end() )
382 m_dialog->m_sheet->horizontalHeader()->setLabel(column, i18n(
"Text"));
384 m_dialog->m_sheet->adjustColumn(column);
388 kapp->restoreOverrideCursor();
391void CSVImportDialog::fillComboBox()
393 if ( m_endRow == -1 )
394 m_dialog->m_rowEnd->setValue( m_dialog->m_sheet->numRows() );
396 m_dialog->m_rowEnd->setValue( m_endRow );
398 if ( m_endCol == -1 )
399 m_dialog->m_colEnd->setValue( m_dialog->m_sheet->numCols() );
401 m_dialog->m_colEnd->setValue( m_endCol );
403 m_dialog->m_rowEnd->setMinValue( 1 );
404 m_dialog->m_colEnd->setMinValue( 1 );
405 m_dialog->m_rowEnd->setMaxValue( m_dialog->m_sheet->numRows() );
406 m_dialog->m_colEnd->setMaxValue( m_dialog->m_sheet->numCols() );
408 m_dialog->m_rowStart->setMinValue( 1 );
409 m_dialog->m_colStart->setMinValue( 1 );
410 m_dialog->m_rowStart->setMaxValue( m_dialog->m_sheet->numRows() );
411 m_dialog->m_colStart->setMaxValue( m_dialog->m_sheet->numCols() );
414int CSVImportDialog::headerType(
int col)
416 TQString header = m_dialog->m_sheet->horizontalHeader()->label(col);
418 if (header == i18n(
"Text"))
420 else if (header == i18n(
"Number"))
422 else if (header == i18n(
"Currency"))
424 else if ( header == i18n(
"Date" ) )
426 else if ( header == i18n(
"Decimal Comma Number" ) )
428 else if ( header == i18n(
"Decimal Point Number" ) )
434void CSVImportDialog::setText(
int row,
int col,
const TQString& text)
436 if ( row < 1 || col < 1 )
439 if ( ( row > ( m_endRow - m_startRow ) && m_endRow > 0 ) || ( col > ( m_endCol - m_startCol ) && m_endCol > 0 ) )
442 if ( m_dialog->m_sheet->numRows() < row )
444 m_dialog->m_sheet->setNumRows( row + 5000 );
448 if ( m_dialog->m_sheet->numCols() < col )
450 m_dialog->m_sheet->setNumCols( col );
454 m_dialog->m_sheet->setText( row - 1, col - 1, text );
460void CSVImportDialog::adjustRows(
int iRows)
464 m_dialog->m_sheet->setNumRows( iRows );
465 m_adjustRows =
false;
469void CSVImportDialog::adjustCols(
int iCols)
473 m_dialog->m_sheet->setNumCols( iCols );
474 m_adjustCols =
false;
476 if ( m_endCol == -1 )
478 if ( iCols > ( m_endCol - m_startCol ) )
479 iCols = m_endCol - m_startCol;
481 m_dialog->m_sheet->setNumCols( iCols );
486void CSVImportDialog::returnPressed()
488 if (m_dialog->m_delimiterBox->id(m_dialog->m_delimiterBox->selected()) != 4)
491 m_delimiter = m_dialog->m_delimiterEdit->text();
495void CSVImportDialog::textChanged (
const TQString & )
497 m_dialog->m_radioOther->setChecked (
true );
501void CSVImportDialog::formatChanged(
const TQString& newValue )
504 for (
int i = 0; i < m_dialog->m_sheet->numSelections(); ++i )
506 TQTableSelection select ( m_dialog->m_sheet->selection( i ) );
507 for (
int j = select.leftCol(); j <= select.rightCol() ; ++j )
509 m_dialog->m_sheet->horizontalHeader()->setLabel( j, newValue );
515void CSVImportDialog::delimiterClicked(
int id)
523 m_delimiter = m_dialog->m_delimiterEdit->text();
539void CSVImportDialog::textquoteSelected(
const TQString& mark)
541 if (mark == i18n(
"None"))
544 m_textquote = mark[0];
549void CSVImportDialog::updateClicked()
551 if ( !checkUpdateRange() )
554 m_startRow = m_dialog->m_rowStart->value() - 1;
555 m_endRow = m_dialog->m_rowEnd->value();
557 m_startCol = m_dialog->m_colStart->value() - 1;
558 m_endCol = m_dialog->m_colEnd->value();
563bool CSVImportDialog::checkUpdateRange()
565 if ( ( m_dialog->m_rowStart->value() > m_dialog->m_rowEnd->value() )
566 || ( m_dialog->m_colStart->value() > m_dialog->m_colEnd->value() ) )
568 KMessageBox::error(
this, i18n(
"Please check the ranges you specified. The start value must be lower than the end value." ) );
575void CSVImportDialog::currentCellChanged(
int,
int col)
577 const TQString header = m_dialog->m_sheet->horizontalHeader()->label(col);
578 m_dialog->m_formatComboBox->setCurrentText( header );
581void CSVImportDialog::ignoreDuplicatesChanged(
int)
583 if (m_dialog->m_ignoreDuplicates->isChecked())
586 m_ignoreDups =
false;
590TQTextCodec* CSVImportDialog::getCodec(
void)
const
592 const TQString strCodec( TDEGlobal::charsets()->encodingForName( m_dialog->comboBoxEncoding->currentText() ) );
593 kdDebug(30502) <<
"Encoding: " << strCodec << endl;
596 TQTextCodec* codec = TQTextCodec::codecForName( strCodec.utf8() );
605 codec = TDEGlobal::charsets()->codecForName( strCodec, ok );
612 kdWarning(30502) <<
"Cannot find encoding:" << strCodec << endl;
614 KMessageBox::error( 0, i18n(
"Cannot find encoding: %1").arg( strCodec ) );
621void CSVImportDialog::encodingChanged (
const TQString & )
623 TQTextCodec* codec = getCodec();
633#include <csvimportdialog.moc>