2
Copyright (c) 2008 by Igor Janssen <alaves17@gmail.com>
4
Kopete (c) 2008 by the Kopete developers <kopete-devel@kde.org>
6
*************************************************************************
8
* This program is free software; you can redistribute it and/or modify *
9
* it under the terms of the GNU General Public License as published by *
10
* the Free Software Foundation; either version 2 of the License, or *
11
* (at your option) any later version. *
13
*************************************************************************
16
#include "jabberxdatawidget.h"
21
#include <QListWidget>
26
//-------------------------------------------------------------------------------------------------//
27
class XDataWidgetField
30
XDataWidgetField(XMPP::XData::Field f)
35
virtual ~XDataWidgetField()
39
QString labelText() const
41
return mField.label();
44
QString reqText() const
49
virtual XMPP::XData::Field field() const
54
virtual bool isValid() const
60
XMPP::XData::Field mField;
64
//-------------------------------------------------------------------------------------------------//
66
class BooleanField : public XDataWidgetField
69
BooleanField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
72
check = new QCheckBox(parent);
73
check->setText(labelText());
74
if(f.value().count() > 0)
76
QString s = f.value().first();
77
if(s == "1" || s == "true" || s == "yes")
78
check->setChecked(true);
80
layout->addWidget(check, row, 1, 1, 2);
82
QLabel *req = new QLabel(reqText(), parent);
83
layout->addWidget(req, row, 2);
85
if(!f.desc().isEmpty())
87
check->setToolTip(f.desc());
88
req->setToolTip(f.desc());
92
virtual XMPP::XData::Field field() const
94
XMPP::XData::Field f = XDataWidgetField::field();
96
val << QString(check->isChecked() ? "1" : "0");
105
//-------------------------------------------------------------------------------------------------//
107
class FixedField : public XDataWidgetField
110
FixedField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
114
const QStringList val = f.value();
115
for(QStringList::ConstIterator it = val.begin(); it != val.end(); ++it)
121
QLabel *label = new QLabel("<qt>" + text + "</qt>", parent);
122
label->setWordWrap(true);
123
layout->addWidget(label, row, 0, 1, 3);
125
if(!f.desc().isEmpty())
126
label->setToolTip(f.desc());
130
//-------------------------------------------------------------------------------------------------//
132
class HiddenField : public XDataWidgetField
135
HiddenField(XMPP::XData::Field f):
141
//-------------------------------------------------------------------------------------------------//
143
class ListSingleField : public XDataWidgetField
146
ListSingleField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
149
QLabel *label = new QLabel(labelText(), parent);
150
layout->addWidget(label, row, 0);
152
combo = new QComboBox(parent);
153
layout->addWidget(combo, row, 1);
154
combo->setInsertPolicy(QComboBox::NoInsert);
156
if (!f.value().isEmpty())
157
sel = f.value().first();
158
XMPP::XData::Field::OptionList opts = f.options();
159
for(XMPP::XData::Field::OptionList::Iterator it = opts.begin(); it != opts.end(); ++it)
161
QString lbl = (*it).label;
165
if ((*it).value == sel)
166
combo->setItemText(combo->currentIndex(), lbl);
169
QLabel *req = new QLabel(reqText(), parent);
170
layout->addWidget(req, row, 2);
172
if(!f.desc().isEmpty())
174
label->setToolTip(f.desc());
175
combo->setToolTip(f.desc());
176
req->setToolTip(f.desc());
180
virtual XMPP::XData::Field field() const
182
// TODO is value unique?
183
QString lbl = combo->currentText();
184
XMPP::XData::Field f = XDataWidgetField::field();
186
XMPP::XData::Field::OptionList opts = f.options();
187
XMPP::XData::Field::OptionList::Iterator it = opts.begin();
188
for ( ; it != opts.end(); ++it)
189
if ( (*it).label == lbl || (*it).value == lbl )
202
//-------------------------------------------------------------------------------------------------//
204
class ListMultiField : public XDataWidgetField
207
ListMultiField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
210
QLabel *label = new QLabel(labelText(), parent);
211
layout->addWidget(label, row, 0);
213
list = new QListWidget(parent);
214
layout->addWidget(list, row, 1);
215
list->setSelectionMode(QAbstractItemView::MultiSelection);
217
XMPP::XData::Field::OptionList opts = f.options();
218
XMPP::XData::Field::OptionList::Iterator it = opts.begin();
219
for(; it != opts.end(); ++it)
221
QString lbl = (*it).label;
224
QListWidgetItem *item = new QListWidgetItem(lbl, list);
225
QStringList val = f.value();
226
QStringList::Iterator sit = val.begin();
227
for(; sit != val.end(); sit++)
228
if((*it).label == *sit || (*it).value == *sit)
229
list->setItemSelected(item, true);
232
QLabel *req = new QLabel(reqText(), parent);
233
layout->addWidget(req, row, 2);
234
if(!f.desc().isEmpty())
236
label->setToolTip(f.desc());
237
list->setToolTip(f.desc());
238
req->setToolTip(f.desc());
242
XMPP::XData::Field field() const
244
XMPP::XData::Field f = XDataWidgetField::field();
246
for(int i = 0; i < list->count(); ++i)
248
QListWidgetItem *item = list->item(i);
249
if(list->isItemSelected(item))
251
QString lbl = item->text();
252
XMPP::XData::Field::OptionList opts = f.options();
253
XMPP::XData::Field::OptionList::Iterator it = opts.begin();
254
for(; it != opts.end(); ++it)
256
if((*it).label == lbl || (*it).value == lbl)
272
//-------------------------------------------------------------------------------------------------//
274
class TextMultiField : public XDataWidgetField
277
TextMultiField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
280
QLabel *label = new QLabel(labelText(), parent);
281
layout->addWidget(label, row, 0);
283
edit = new QTextEdit(parent);
284
layout->addWidget(edit, row, 1);
286
const QStringList val = f.value();
287
QStringList::ConstIterator it = val.begin();
288
for(; it != val.end(); ++it)
296
QLabel *req = new QLabel(reqText(), parent);
297
layout->addWidget(req, row, 2);
299
if(!f.desc().isEmpty())
301
label->setToolTip(f.desc());
302
edit->setToolTip(f.desc());
303
req->setToolTip(f.desc());
307
virtual XMPP::XData::Field field() const
309
XMPP::XData::Field f = XDataWidgetField::field();
310
f.setValue(edit->toPlainText().split('\n'));
318
//-------------------------------------------------------------------------------------------------//
320
class TextSingleField : public XDataWidgetField
323
TextSingleField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
327
if(f.value().count())
328
text = f.value().first();
330
QLabel *label = new QLabel(labelText(), parent);
331
layout->addWidget(label, row, 0);
333
edit = new QLineEdit(parent);
335
layout->addWidget(edit, row, 1);
337
QLabel *req = new QLabel(reqText(), parent);
338
layout->addWidget(req, row, 2);
340
if(!f.desc().isEmpty())
342
label->setToolTip(f.desc());
343
edit->setToolTip(f.desc());
344
req->setToolTip(f.desc());
348
virtual XMPP::XData::Field field() const
350
XMPP::XData::Field f = XDataWidgetField::field();
361
//-------------------------------------------------------------------------------------------------//
363
class TextPrivateField : public TextSingleField
366
TextPrivateField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
367
TextSingleField(f, row, parent, layout)
369
edit->setEchoMode(QLineEdit::Password);
373
//-------------------------------------------------------------------------------------------------//
375
class JidMultiField : public TextMultiField
378
JidMultiField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
379
TextMultiField(f, row, parent, layout)
383
virtual bool isValid() const
390
//-------------------------------------------------------------------------------------------------//
392
class JidSingleField : public TextSingleField
395
JidSingleField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
396
TextSingleField(f, row, parent, layout)
400
virtual bool isValid() const
407
//-------------------------------------------------------------------------------------------------//
411
JabberXDataWidget::JabberXDataWidget(const XMPP::XData &data, QWidget *parent) : QWidget(parent)
413
const XMPP::XData::FieldList &f = data.fields();
417
if(!data.instructions().isEmpty())
420
if(f.count() == 0 && fields == 0)
423
XMPP::XData::FieldList::ConstIterator it = f.begin();
424
for(; it != f.end(); ++it)
428
case XMPP::XData::Field::Field_Boolean:
429
case XMPP::XData::Field::Field_Fixed:
430
case XMPP::XData::Field::Field_JidMulti:
431
case XMPP::XData::Field::Field_JidSingle:
432
case XMPP::XData::Field::Field_ListMulti:
433
case XMPP::XData::Field::Field_ListSingle:
434
case XMPP::XData::Field::Field_TextMulti:
435
case XMPP::XData::Field::Field_TextPrivate:
436
case XMPP::XData::Field::Field_TextSingle:
439
case XMPP::XData::Field::Field_Hidden:
443
QGridLayout *formLayout = new QGridLayout(parent);
444
//formLayout->addLayout(this, fields, 3);
445
//formLayout->setSizeConstraint(QLayout::SetMinimumSize);
447
if(!data.instructions().isEmpty())
449
QLabel *instr = new QLabel(data.instructions(), parent);
450
instr->setWordWrap(true);
451
instr->setScaledContents(true);
452
instr->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
453
//connect(instr, SIGNAL(linkActivated(QString)), SLOT(linkActivated(QString)));
454
formLayout->addWidget(instr, row, 0, 1, 3);
458
for(; it != f.end(); ++it, ++row)
463
case XMPP::XData::Field::Field_Boolean:
464
f = new BooleanField(*it, row, this, formLayout);
466
case XMPP::XData::Field::Field_Fixed:
467
f = new FixedField(*it, row, this, formLayout);
469
case XMPP::XData::Field::Field_Hidden:
470
f = new HiddenField(*it);
472
case XMPP::XData::Field::Field_JidMulti:
473
f = new JidMultiField(*it, row, this, formLayout);
475
case XMPP::XData::Field::Field_JidSingle:
476
f = new JidSingleField(*it, row, this, formLayout);
478
case XMPP::XData::Field::Field_ListMulti:
479
f = new ListMultiField(*it, row, this, formLayout);
481
case XMPP::XData::Field::Field_ListSingle:
482
f = new ListSingleField(*it, row, this, formLayout);
484
case XMPP::XData::Field::Field_TextMulti:
485
f = new TextMultiField(*it, row, this, formLayout);
487
case XMPP::XData::Field::Field_TextPrivate:
488
f = new TextPrivateField(*it, row, this, formLayout);
490
case XMPP::XData::Field::Field_TextSingle:
491
f = new TextSingleField(*it, row, this, formLayout);
496
//formLayout->addStretch(1);
499
JabberXDataWidget::~JabberXDataWidget()
503
XMPP::XData::FieldList JabberXDataWidget::fields() const
505
XMPP::XData::FieldList f;
506
for(QList<XDataWidgetField *>::ConstIterator it = mFields.constBegin(); it != mFields.constEnd(); ++it)
507
f.append((*it)->field());
511
bool JabberXDataWidget::isValid() const
513
for(QList<XDataWidgetField *>::ConstIterator it = mFields.constBegin(); it != mFields.constEnd(); ++it)
514
if(!(*it)->isValid())
519
#include "jabberxdatawidget.moc"