kexicsvwidgets.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2005 Jaroslaw Staniek <js@iidea.pl>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "kexicsvwidgets.h"
21
22#include <tqdir.h>
23#include <tqlabel.h>
24#include <tqlayout.h>
25
26#include <tdelocale.h>
27#include <klineedit.h>
28#include <kdialogbase.h>
29#include <kactivelabel.h>
30#include <kiconloader.h>
31#include <kmimetype.h>
32
33#define KEXICSV_OTHER_DELIMITER_INDEX 4
34
35KexiCSVDelimiterWidget::KexiCSVDelimiterWidget( bool lineEditOnBottom, TQWidget * parent )
36 : TQWidget(parent, "KexiCSVDelimiterWidget")
37 , m_availableDelimiters(KEXICSV_OTHER_DELIMITER_INDEX)
38
39{
40 TQBoxLayout *lyr =
41 lineEditOnBottom ?
42 (TQBoxLayout *)new TQVBoxLayout( this, 0, KDialogBase::spacingHint() )
43 : (TQBoxLayout *)new TQHBoxLayout( this, 0, KDialogBase::spacingHint() );
44
45 m_availableDelimiters[0]=KEXICSV_DEFAULT_FILE_DELIMITER;
46 m_availableDelimiters[1]=";";
47 m_availableDelimiters[2]="\t";
48 m_availableDelimiters[3]=" ";
49
50 m_combo = new KComboBox(this, "KexiCSVDelimiterComboBox");
51 m_combo->insertItem( i18n("Comma \",\"") ); //<-- KEXICSV_DEFAULT_FILE_DELIMITER
52 m_combo->insertItem( i18n( "Semicolon \";\"" ) );
53 m_combo->insertItem( i18n( "Tabulator" ) );
54 m_combo->insertItem( i18n( "Space \" \"" ) );
55 m_combo->insertItem( i18n( "Other" ) );
56 lyr->addWidget(m_combo);
57 setFocusProxy(m_combo);
58
59 m_delimiterEdit = new KLineEdit( this, "m_delimiterEdit" );
60// m_delimiterEdit->setSizePolicy( TQSizePolicy( (TQSizePolicy::SizeType)0, (TQSizePolicy::SizeType)0, 0, 0, m_delimiterEdit->sizePolicy().hasHeightForWidth() ) );
61 m_delimiterEdit->setMaximumSize( TQSize( 30, 32767 ) );
62 m_delimiterEdit->setMaxLength(1);
63 lyr->addWidget( m_delimiterEdit );
64 if (!lineEditOnBottom)
65 lyr->addStretch(2);
66
67 slotDelimiterChangedInternal(KEXICSV_DEFAULT_FILE_DELIMITER_INDEX); //this will init m_delimiter
68 connect(m_combo, TQ_SIGNAL(activated(int)),
69 this, TQ_SLOT(slotDelimiterChanged(int)));
70 connect(m_delimiterEdit, TQ_SIGNAL(returnPressed()),
71 this, TQ_SLOT(slotDelimiterLineEditReturnPressed()));
72 connect(m_delimiterEdit, TQ_SIGNAL(textChanged( const TQString & )),
73 this, TQ_SLOT(slotDelimiterLineEditTextChanged( const TQString & ) ));
74}
75
77{
78 slotDelimiterChangedInternal(index);
79 if (index==KEXICSV_OTHER_DELIMITER_INDEX)
80 m_delimiterEdit->setFocus();
81}
82
83void KexiCSVDelimiterWidget::slotDelimiterChangedInternal(int index)
84{
85 bool changed = false;
86 if (index > KEXICSV_OTHER_DELIMITER_INDEX)
87 return;
88 else if (index == KEXICSV_OTHER_DELIMITER_INDEX) {
89 changed = m_delimiter != m_delimiterEdit->text();
90 m_delimiter = m_delimiterEdit->text();
91 }
92 else {
93 changed = m_delimiter != m_availableDelimiters[index];
94 m_delimiter = m_availableDelimiters[index];
95 }
96 m_delimiterEdit->setEnabled(index == KEXICSV_OTHER_DELIMITER_INDEX);
97 if (changed)
98 emit delimiterChanged(m_delimiter);
99}
100
101void KexiCSVDelimiterWidget::slotDelimiterLineEditReturnPressed()
102{
103 if (m_combo->currentItem() != KEXICSV_OTHER_DELIMITER_INDEX)
104 return;
105 slotDelimiterChangedInternal(KEXICSV_OTHER_DELIMITER_INDEX);
106}
107
108void KexiCSVDelimiterWidget::slotDelimiterLineEditTextChanged( const TQString & )
109{
110 slotDelimiterChangedInternal(KEXICSV_OTHER_DELIMITER_INDEX);
111}
112
113void KexiCSVDelimiterWidget::setDelimiter(const TQString& delimiter)
114{
115 TQValueVector<TQString>::ConstIterator it = m_availableDelimiters.constBegin();
116 int index = 0;
117 for (; it != m_availableDelimiters.constEnd(); ++it, index++) {
118 if (*it == delimiter) {
119 m_combo->setCurrentItem(index);
120 slotDelimiterChangedInternal(index);
121 return;
122 }
123 }
124 //else: set other (custom) delimiter
125 m_delimiterEdit->setText(delimiter);
126 m_combo->setCurrentItem(KEXICSV_OTHER_DELIMITER_INDEX);
127 slotDelimiterChangedInternal(KEXICSV_OTHER_DELIMITER_INDEX);
128}
129
130//----------------------------------------------------
131
132KexiCSVTextQuoteComboBox::KexiCSVTextQuoteComboBox( TQWidget * parent )
133 : KComboBox(parent, "KexiCSVTextQuoteComboBox")
134{
135 insertItem( "\"" );
136 insertItem( "'" );
137 insertItem( i18n( "None" ) );
138}
139
140TQString KexiCSVTextQuoteComboBox::textQuote() const
141{
142 if (currentItem()==2)
143 return TQString();
144 return currentText();
145}
146
147void KexiCSVTextQuoteComboBox::setTextQuote(const TQString& textQuote)
148{
149 if (textQuote=="\"" || textQuote=="'")
150 setCurrentText(textQuote);
151 else if (textQuote.isEmpty())
152 setCurrentText(i18n( "None" ));
153}
154
155//----------------------------------------------------
156
157KexiCSVInfoLabel::KexiCSVInfoLabel( const TQString& labelText, TQWidget* parent )
158 : TQWidget(parent, "KexiCSVInfoLabel")
159{
160 TQVBoxLayout *vbox = new TQVBoxLayout( this, 0, KDialogBase::spacingHint() );
161 TQHBoxLayout *hbox = new TQHBoxLayout( this );
162 vbox->addLayout(hbox);
163 m_leftLabel = new TQLabel(labelText, this);
164 m_leftLabel->setMinimumWidth(130);
165 m_leftLabel->setSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Preferred);
166 m_leftLabel->setAlignment(TQt::AlignVCenter | TQt::AlignLeft | TQt::WordBreak);
167 hbox->addWidget(m_leftLabel);
168 m_iconLbl = new TQLabel(this);
169 m_iconLbl->setSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Preferred);
170 m_iconLbl->setAlignment(TQt::AlignVCenter | TQt::AlignLeft);
171 m_fnameLbl = new KActiveLabel(this);
172 m_fnameLbl->setFocusPolicy(TQWidget::NoFocus);
173 m_fnameLbl->setTextFormat(TQt::PlainText);
174 m_fnameLbl->setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding,1,0));
175 m_fnameLbl->setLineWidth(1);
176 m_fnameLbl->setFrameStyle(TQFrame::Box);
177 m_fnameLbl->setAlignment(TQt::AlignVCenter | TQt::AlignLeft | TQt::WordBreak);
178 hbox->addSpacing(5);
179 hbox->addWidget(m_iconLbl);
180 hbox->addWidget(m_fnameLbl, 1, TQt::AlignVCenter | TQt::AlignLeft | TQt::WordBreak);
181 hbox->addSpacing(10);
182 m_commentLbl = new KActiveLabel(this);
183 m_commentLbl->setFocusPolicy(TQWidget::NoFocus);
184 m_commentLbl->setTextFormat(TQt::PlainText);
185 m_commentLbl->setSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding);
186 m_commentLbl->setLineWidth(1);
187 m_commentLbl->setFrameStyle(TQFrame::Box);
188 m_commentLbl->setAlignment(TQt::AlignVCenter | TQt::AlignLeft | TQt::WordBreak);
189 hbox->addWidget(m_commentLbl, 0, TQt::AlignVCenter | TQt::AlignRight | TQt::WordBreak);
190
191 m_separator = new TQFrame(this);
192 m_separator->setFrameShape(TQFrame::HLine);
193 m_separator->setFrameShadow(TQFrame::Sunken);
194 vbox->addWidget(m_separator);
195}
196
197void KexiCSVInfoLabel::setFileName( const TQString& fileName )
198{
199 m_fnameLbl->setText( TQDir::convertSeparators(fileName) );
200 if (!fileName.isEmpty()) {
201 m_iconLbl->setPixmap(
202 KMimeType::pixmapForURL(KURL::fromPathOrURL(fileName), 0, TDEIcon::Desktop) );
203 }
204}
205
206void KexiCSVInfoLabel::setLabelText( const TQString& text )
207{
208 m_fnameLbl->setText( text );
209// int lines = m_fnameLbl->lines();
210// m_fnameLbl->setFixedHeight(
211// TQFontMetrics(m_fnameLbl->currentFont()).height() * lines );
212}
213
214void KexiCSVInfoLabel::setIcon(const TQString& iconName)
215{
216 m_iconLbl->setPixmap( DesktopIcon(iconName) );
217}
218
219void KexiCSVInfoLabel::setCommentText( const TQString& text )
220{
221 m_commentLbl->setText(text);
222}
223
224//----------------------------------------------------
225
226TQStringList csvMimeTypes()
227{
228 TQStringList mimetypes;
229 mimetypes << "text/x-csv" << "text/plain" << "all/allfiles";
230 return mimetypes;
231}
232
233#include "kexicsvwidgets.moc"
void slotDelimiterChanged(int idx)
only called when a delimiter was set by user directly
void setIcon(const TQString &iconName)
sets icon pixmap to iconName. Used wher setIconForFilename was false in ctor.
void setTextQuote(const TQString &textQuote)
Sets text quote. Only available are: ", ', and empty string.