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>
41#include <tdemessagebox.h>
44CSVDialog::CSVDialog(TQWidget* parent, TQByteArray& fileArray,
const TQString )
45 : KDialogBase(parent, 0, true, TQString(), Ok|Cancel, No, true),
55 m_fileArray(fileArray),
56 m_dialog(new DialogUI(this)),
57 m_codec( TQTextCodec::codecForName(
"UTF-8" ) )
59 setCaption( i18n(
"Import" ) );
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" );
75 m_formatList << i18n(
"Currency" );
76 m_formatList << i18n(
"Date" );
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 );
89 setMainWidget(m_dialog);
91 m_dialog->m_sheet->setSelectionMode( TQTable::Multi );
93 connect(m_dialog->m_formatComboBox, TQ_SIGNAL(activated(
const TQString& )),
94 this, TQ_SLOT(formatChanged(
const TQString& )));
95 connect(m_dialog->m_delimiterBox, TQ_SIGNAL(clicked(
int)),
96 this, TQ_SLOT(delimiterClicked(
int)));
97 connect(m_dialog->m_delimiterEdit, TQ_SIGNAL(returnPressed()),
98 this, TQ_SLOT(returnPressed()));
99 connect(m_dialog->m_delimiterEdit, TQ_SIGNAL(textChanged (
const TQString & )),
100 this, TQ_SLOT(formatChanged (
const TQString & ) ));
101 connect(m_dialog->m_comboQuote, TQ_SIGNAL(activated(
const TQString &)),
102 this, TQ_SLOT(textquoteSelected(
const TQString &)));
103 connect(m_dialog->m_sheet, TQ_SIGNAL(currentChanged(
int,
int)),
104 this, TQ_SLOT(currentCellChanged(
int,
int)));
105 connect(m_dialog->m_ignoreDuplicates, TQ_SIGNAL(stateChanged(
int)),
106 this, TQ_SLOT(ignoreDuplicatesChanged(
int)));
107 connect(m_dialog->m_updateButton, TQ_SIGNAL(clicked()),
108 this, TQ_SLOT(updateClicked()));
109 connect(m_dialog->comboBoxEncoding, TQ_SIGNAL(textChanged (
const TQString & )),
110 this, TQ_SLOT(encodingChanged (
const TQString & ) ));
113CSVDialog::~CSVDialog()
116 kapp->setOverrideCursor(TQt::waitCursor);
119void CSVDialog::loadSettings()
121 TDEConfig *config = kapp->config();
122 config->setGroup(
"CSVDialog Settings");
123 m_textquote = config->readEntry(
"textquote",
"\"")[0];
124 m_delimiter = config->readEntry(
"delimiter",
",");
125 m_ignoreDups = config->readBoolEntry(
"ignoreDups",
false);
126 const TQString codecText = config->readEntry(
"codec",
"");
129 if (!codecText.isEmpty()) {
130 m_dialog->comboBoxEncoding->setCurrentText(codecText);
131 m_codec = getCodec();
133 if (m_delimiter ==
",") m_dialog->m_radioComma->setChecked(
true);
134 else if (m_delimiter ==
"\t") m_dialog->m_radioTab->setChecked(
true);
135 else if (m_delimiter ==
" ") m_dialog->m_radioSpace->setChecked(
true);
136 else if (m_delimiter ==
";") m_dialog->m_radioSemicolon->setChecked(
true);
138 m_dialog->m_radioOther->setChecked(
true);
139 m_dialog->m_delimiterEdit->setText(m_delimiter);
141 m_dialog->m_ignoreDuplicates->setChecked(m_ignoreDups);
142 m_dialog->m_comboQuote->setCurrentItem(m_textquote ==
'\'' ? 1
143 : m_textquote ==
'"' ? 0 : 2);
146void CSVDialog::saveSettings()
148 TDEConfig *config = kapp->config();
149 config->setGroup(
"CSVDialog Settings");
150 TQString q = m_textquote;
151 config->writeEntry(
"textquote", q);
152 config->writeEntry(
"delimiter", m_delimiter);
153 config->writeEntry(
"ignoreDups", m_ignoreDups);
154 config->writeEntry(
"codec", m_dialog->comboBoxEncoding->currentText());
158void CSVDialog::fillTable( )
161 bool lastCharDelimiter =
false;
162 enum { S_START, S_QUOTED_FIELD, S_MAYBE_END_OF_QUOTED_FIELD, S_END_OF_QUOTED_FIELD,
163 S_MAYBE_NORMAL_FIELD, S_NORMAL_FIELD } state = S_START;
168 kapp->setOverrideCursor(TQt::waitCursor);
170 for (row = 0; row < m_dialog->m_sheet->numRows(); ++row)
171 for (column = 0; column < m_dialog->m_sheet->numCols(); ++column)
172 m_dialog->m_sheet->clearCell(row, column);
176 TQTextStream inputStream(m_fileArray, IO_ReadOnly);
177 kdDebug(30501) <<
"Encoding: " << m_codec->name() << endl;
178 inputStream.setCodec( m_codec );
180 bool lastCharWasCr =
false;
181 while (!inputStream.atEnd())
189 lastCharWasCr =
true;
192 else if ( x ==
'\n' && lastCharWasCr )
195 lastCharWasCr =
false;
198 else if ( x == TQChar( 0xc ) )
201 lastCharWasCr =
false;
206 lastCharWasCr =
false;
209 if ( column > maxColumn )
215 if (x == m_textquote)
217 state = S_QUOTED_FIELD;
219 else if (x == m_delimiter)
221 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
223 lastCharDelimiter =
true;
229 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
235 state = S_MAYBE_NORMAL_FIELD;
238 case S_QUOTED_FIELD :
239 if (x == m_textquote)
241 state = S_MAYBE_END_OF_QUOTED_FIELD;
248 case S_MAYBE_END_OF_QUOTED_FIELD :
249 if (x == m_textquote)
252 state = S_QUOTED_FIELD;
254 else if (x == m_delimiter || x ==
'\n')
256 setText(row - m_startRow, column - m_startCol, field);
262 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
267 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
269 lastCharDelimiter =
true;
275 state = S_END_OF_QUOTED_FIELD;
278 case S_END_OF_QUOTED_FIELD :
279 if (x == m_delimiter || x ==
'\n')
281 setText(row - m_startRow, column - m_startCol, field);
287 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
292 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
294 lastCharDelimiter =
true;
299 case S_MAYBE_NORMAL_FIELD :
300 if (x == m_textquote)
303 state = S_QUOTED_FIELD;
306 case S_NORMAL_FIELD :
307 if (x == m_delimiter || x ==
'\n')
309 setText(row - m_startRow, column - m_startCol, field);
315 if ( row > ( m_endRow - m_startRow ) && m_endRow >= 0 )
320 if ((m_ignoreDups ==
false) || (lastCharDelimiter ==
false))
322 lastCharDelimiter =
true;
331 if (x != m_delimiter)
332 lastCharDelimiter =
false;
335 if ( !field.isEmpty() )
338 setText(row - m_startRow, column - m_startCol, field);
344 adjustRows( row - m_startRow );
345 adjustCols( maxColumn - m_startCol );
346 m_dialog->m_colEnd->setMaxValue( maxColumn );
347 if ( m_endCol == -1 )
348 m_dialog->m_colEnd->setValue( maxColumn );
351 for (column = 0; column < m_dialog->m_sheet->numCols(); ++column)
353 const TQString header = m_dialog->m_sheet->horizontalHeader()->label(column);
354 if ( m_formatList.find( header ) == m_formatList.end() )
355 m_dialog->m_sheet->horizontalHeader()->setLabel(column, i18n(
"Text"));
357 m_dialog->m_sheet->adjustColumn(column);
361 kapp->restoreOverrideCursor();
364void CSVDialog::fillComboBox()
366 if ( m_endRow == -1 )
367 m_dialog->m_rowEnd->setValue( m_dialog->m_sheet->numRows() );
369 m_dialog->m_rowEnd->setValue( m_endRow );
371 if ( m_endCol == -1 )
372 m_dialog->m_colEnd->setValue( m_dialog->m_sheet->numCols() );
374 m_dialog->m_colEnd->setValue( m_endCol );
376 m_dialog->m_rowEnd->setMinValue( 1 );
377 m_dialog->m_colEnd->setMinValue( 1 );
378 m_dialog->m_rowEnd->setMaxValue( m_dialog->m_sheet->numRows() );
379 m_dialog->m_colEnd->setMaxValue( m_dialog->m_sheet->numCols() );
381 m_dialog->m_rowStart->setMinValue( 1 );
382 m_dialog->m_colStart->setMinValue( 1 );
383 m_dialog->m_rowStart->setMaxValue( m_dialog->m_sheet->numRows() );
384 m_dialog->m_colStart->setMaxValue( m_dialog->m_sheet->numCols() );
387int CSVDialog::getRows()
389 int rows = m_dialog->m_sheet->numRows();
392 if ( rows > ( m_startRow + m_endRow ) )
393 rows = m_startRow + m_endRow;
399int CSVDialog::getCols()
401 int cols = m_dialog->m_sheet->numCols();
404 if ( cols > ( m_startCol + m_endCol ) )
405 cols = m_startCol + m_endCol;
411int CSVDialog::getHeader(
int col)
413 TQString header = m_dialog->m_sheet->horizontalHeader()->label(col);
415 if (header == i18n(
"Text"))
417 else if (header == i18n(
"Number"))
419 else if (header == i18n(
"Currency"))
421 else if ( header == i18n(
"Date" ) )
423 else if ( header == i18n(
"Decimal Comma Number" ) )
425 else if ( header == i18n(
"Decimal Point Number" ) )
431TQString CSVDialog::getText(
int row,
int col)
433 return m_dialog->m_sheet->text( row, col );
436void CSVDialog::setText(
int row,
int col,
const TQString& text)
438 if ( row < 1 || col < 1 )
441 if ( ( row > ( m_endRow - m_startRow ) && m_endRow > 0 ) || ( col > ( m_endCol - m_startCol ) && m_endCol > 0 ) )
444 if ( m_dialog->m_sheet->numRows() < row )
446 m_dialog->m_sheet->setNumRows( row + 5000 );
450 if ( m_dialog->m_sheet->numCols() < col )
452 m_dialog->m_sheet->setNumCols( col );
456 m_dialog->m_sheet->setText( row - 1, col - 1, text );
462void CSVDialog::adjustRows(
int iRows)
466 m_dialog->m_sheet->setNumRows( iRows );
467 m_adjustRows =
false;
471void CSVDialog::adjustCols(
int iCols)
475 m_dialog->m_sheet->setNumCols( iCols );
476 m_adjustCols =
false;
478 if ( m_endCol == -1 )
480 if ( iCols > ( m_endCol - m_startCol ) )
481 iCols = m_endCol - m_startCol;
483 m_dialog->m_sheet->setNumCols( iCols );
488void CSVDialog::returnPressed()
490 if (m_dialog->m_delimiterBox->id(m_dialog->m_delimiterBox->selected()) != 4)
493 m_delimiter = m_dialog->m_delimiterEdit->text();
497void CSVDialog::textChanged (
const TQString & )
499 m_dialog->m_radioOther->setChecked (
true );
503void CSVDialog::formatChanged(
const TQString& newValue )
506 for (
int i = 0; i < m_dialog->m_sheet->numSelections(); ++i )
508 TQTableSelection select ( m_dialog->m_sheet->selection( i ) );
509 for (
int j = select.leftCol(); j <= select.rightCol() ; ++j )
511 m_dialog->m_sheet->horizontalHeader()->setLabel( j, newValue );
517void CSVDialog::delimiterClicked(
int id)
525 m_delimiter = m_dialog->m_delimiterEdit->text();
541void CSVDialog::textquoteSelected(
const TQString& mark)
543 if (mark == i18n(
"None"))
546 m_textquote = mark[0];
551void CSVDialog::updateClicked()
553 if ( !checkUpdateRange() )
556 m_startRow = m_dialog->m_rowStart->value() - 1;
557 m_endRow = m_dialog->m_rowEnd->value();
559 m_startCol = m_dialog->m_colStart->value() - 1;
560 m_endCol = m_dialog->m_colEnd->value();
565bool CSVDialog::checkUpdateRange()
567 if ( ( m_dialog->m_rowStart->value() > m_dialog->m_rowEnd->value() )
568 || ( m_dialog->m_colStart->value() > m_dialog->m_colEnd->value() ) )
570 KMessageBox::error(
this, i18n(
"Please check the ranges you specified. The start value must be lower than the end value." ) );
577void CSVDialog::currentCellChanged(
int,
int col)
579 const TQString header = m_dialog->m_sheet->horizontalHeader()->label(col);
580 m_dialog->m_formatComboBox->setCurrentText( header );
583void CSVDialog::ignoreDuplicatesChanged(
int)
585 if (m_dialog->m_ignoreDuplicates->isChecked())
588 m_ignoreDups =
false;
592TQTextCodec* CSVDialog::getCodec(
void)
const
594 const TQString strCodec( TDEGlobal::charsets()->encodingForName( m_dialog->comboBoxEncoding->currentText() ) );
595 kdDebug(30502) <<
"Encoding: " << strCodec << endl;
598 TQTextCodec* codec = TQTextCodec::codecForName( strCodec.utf8() );
607 codec = TDEGlobal::charsets()->codecForName( strCodec, ok );
614 kdWarning(30502) <<
"Cannot find encoding:" << strCodec << endl;
616 KMessageBox::error( 0, i18n(
"Cannot find encoding: %1").arg( strCodec ) );
623void CSVDialog::encodingChanged (
const TQString & )
625 TQTextCodec* codec = getCodec();
635#include <csvdialog.moc>