2
* xdata_widget.cpp - a class for displaying jabber:x:data forms
3
* Copyright (C) 2003-2004 Michail Pishchagin
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this library; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
#include "xdata_widget.h"
25
#include <qcheckbox.h>
26
#include <qcombobox.h>
28
#include <qlineedit.h>
30
#include <qobjectlist.h>
32
#include <qtextedit.h>
34
//----------------------------------------------------------------------------
36
//----------------------------------------------------------------------------
40
XDataField(XData::Field f)
48
virtual XData::Field field() const
53
QString labelText() const
55
QString text = _field.label();
61
QString reqText() const
64
if ( _field.required() )
66
if ( !_field.desc().isEmpty() ) {
74
virtual bool isValid() const
76
return field().isValid();
83
////////////////////////////////////////
85
class XDataField_Hidden : public XDataField
88
XDataField_Hidden(XData::Field f)
94
////////////////////////////////////////
96
class XDataField_Boolean : public XDataField
99
XDataField_Boolean(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
102
bool checked = false;
103
if ( f.value().count() ) {
104
QString s = f.value().first();
105
if ( s == "1" || s == "true" || s == "yes" )
109
QLabel *label = new QLabel(labelText(), parent);
110
grid->addWidget(label, row, 0);
112
check = new QCheckBox(parent);
113
check->setChecked(checked);
114
grid->addWidget(check, row, 1);
116
QLabel *req = new QLabel(reqText(), parent);
117
grid->addWidget(req, row, 2);
119
if ( !f.desc().isEmpty() ) {
120
QToolTip::add(label, f.desc());
121
QToolTip::add(check, f.desc());
122
QToolTip::add(req, f.desc());
126
XData::Field field() const
128
XData::Field f = XDataField::field();
130
val << QString( check->isChecked() ? "1" : "0" );
139
////////////////////////////////////////
141
class XDataField_Fixed : public XDataField
144
XDataField_Fixed(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
148
QStringList val = f.value();
149
QStringList::Iterator it = val.begin();
150
for ( ; it != val.end(); ++it) {
151
if ( !text.isEmpty() )
156
QLabel *fixed = new QLabel("<qt>" + text + "</qt>", parent);
157
grid->addMultiCellWidget(fixed, row, row, 0, 2);
159
if ( !f.desc().isEmpty() ) {
160
QToolTip::add(fixed, f.desc());
165
////////////////////////////////////////
167
class XDataField_TextSingle : public XDataField
170
XDataField_TextSingle(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
174
if ( f.value().count() )
175
text = f.value().first();
177
QLabel *label = new QLabel(labelText(), parent);
178
grid->addWidget(label, row, 0);
180
edit = new QLineEdit(parent);
182
grid->addWidget(edit, row, 1);
184
QLabel *req = new QLabel(reqText(), parent);
185
grid->addWidget(req, row, 2);
187
if ( !f.desc().isEmpty() ) {
188
QToolTip::add(label, f.desc());
189
QToolTip::add(edit, f.desc());
190
QToolTip::add(req, f.desc());
194
XData::Field field() const
196
XData::Field f = XDataField::field();
207
////////////////////////////////////////
209
class XDataField_TextPrivate : public XDataField_TextSingle
212
XDataField_TextPrivate(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
213
: XDataField_TextSingle(f, grid, row, parent)
215
edit->setEchoMode(QLineEdit::Password);
219
////////////////////////////////////////
221
class XDataField_JidSingle : public XDataField_TextSingle
224
XDataField_JidSingle(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
225
: XDataField_TextSingle(f, grid, row, parent)
227
// TODO: add proper validation
231
////////////////////////////////////////
233
class XDataField_ListSingle : public XDataField
236
XDataField_ListSingle(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
239
QLabel *label = new QLabel(labelText(), parent);
240
grid->addWidget(label, row, 0);
242
combo = new QComboBox(parent);
243
grid->addWidget(combo, row, 1);
244
combo->setInsertionPolicy(QComboBox::NoInsertion);
247
if ( !f.value().isEmpty() )
248
sel = f.value().first();
250
XData::Field::OptionList opts = f.options();
251
XData::Field::OptionList::Iterator it = opts.begin();
252
for ( ; it != opts.end(); ++it) {
253
QString lbl = (*it).label;
257
combo->insertItem(lbl);
258
if ( (*it).value == sel )
259
combo->setCurrentText( lbl );
262
QLabel *req = new QLabel(reqText(), parent);
263
grid->addWidget(req, row, 2);
265
if ( !f.desc().isEmpty() ) {
266
QToolTip::add(label, f.desc());
267
QToolTip::add(combo, f.desc());
268
QToolTip::add(req, f.desc());
272
XData::Field field() const
274
QString lbl = combo->currentText();
276
XData::Field f = XDataField::field();
279
XData::Field::OptionList opts = f.options();
280
XData::Field::OptionList::Iterator it = opts.begin();
281
for ( ; it != opts.end(); ++it) {
282
if ( (*it).label == lbl || (*it).value == lbl ) {
296
////////////////////////////////////////
298
class XDataField_ListMulti : public XDataField
301
XDataField_ListMulti(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
304
QLabel *label = new QLabel(labelText(), parent);
305
grid->addWidget(label, row, 0);
307
list = new QListBox(parent);
308
grid->addWidget(list, row, 1);
309
list->setSelectionMode(QListBox::Multi);
311
QListBoxText *last = 0;
312
XData::Field::OptionList opts = f.options();
313
XData::Field::OptionList::Iterator it = opts.begin();
314
for ( ; it != opts.end(); ++it) {
315
QString lbl = (*it).label;
319
QListBoxText *item = new QListBoxText(list, lbl, last);
321
QStringList val = f.value();
322
QStringList::Iterator sit = val.begin();
323
for ( ; sit != val.end(); ++sit)
324
if ( (*it).label == *sit || (*it).value == *sit )
325
list->setSelected(item, true);
330
QLabel *req = new QLabel(reqText(), parent);
331
grid->addWidget(req, row, 2);
333
if ( !f.desc().isEmpty() ) {
334
QToolTip::add(label, f.desc());
335
QToolTip::add(list, f.desc());
336
QToolTip::add(req, f.desc());
340
XData::Field field() const
342
XData::Field f = XDataField::field();
345
QListBoxItem *item = list->firstItem();
347
if ( item->isSelected() ) {
348
QString lbl = item->text();
349
XData::Field::OptionList opts = f.options();
350
XData::Field::OptionList::Iterator it = opts.begin();
351
for ( ; it != opts.end(); ++it) {
352
if ( (*it).label == lbl || (*it).value == lbl ) {
370
////////////////////////////////////////
372
class XDataField_TextMulti : public XDataField
375
XDataField_TextMulti(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
378
QLabel *label = new QLabel(labelText(), parent);
379
grid->addWidget(label, row, 0);
381
edit = new QTextEdit(parent);
382
grid->addWidget(edit, row, 1);
385
QStringList val = f.value();
386
QStringList::Iterator it = val.begin();
387
for ( ; it != val.end(); ++it) {
388
if ( !text.isEmpty() )
394
QLabel *req = new QLabel(reqText(), parent);
395
grid->addWidget(req, row, 2);
397
if ( !f.desc().isEmpty() ) {
398
QToolTip::add(label, f.desc());
399
QToolTip::add(edit, f.desc());
400
QToolTip::add(req, f.desc());
404
XData::Field field() const
406
XData::Field f = XDataField::field();
407
f.setValue( QStringList::split("\n", edit->text(), true) );
415
////////////////////////////////////////
417
class XDataField_JidMulti : public XDataField_TextMulti
420
XDataField_JidMulti(XData::Field f, QGridLayout *grid, int row, QWidget *parent)
421
: XDataField_TextMulti(f, grid, row, parent)
423
// TODO: improve validation
427
//----------------------------------------------------------------------------
429
//----------------------------------------------------------------------------
430
class XDataWidget::Private
434
fields.setAutoDelete(true);
437
typedef QPtrList<XDataField> XDataFieldList;
438
XDataFieldList fields;
441
XDataWidget::XDataWidget(QWidget *parent, const char *name)
442
: QWidget(parent, name)
447
XDataWidget::~XDataWidget()
452
XData::FieldList XDataWidget::fields() const
456
QPtrListIterator<XDataField> it (d->fields);
458
for ( ; (field = it.current()); ++it)
459
f.append( field->field() );
464
void XDataWidget::setFields(const XData::FieldList &f)
468
// delete all child widgets
469
QObjectList *objlist = queryList();
470
objlist->setAutoDelete(true);
474
QGridLayout *grid = new QGridLayout(this, 3, f.count(), 0, 3);
477
XData::FieldList::ConstIterator it = f.begin();
478
for ( ; it != f.end(); ++it, ++row) {
480
switch ( (*it).type() ) {
481
case XData::Field::Field_Boolean:
482
f = new XDataField_Boolean(*it, grid, row, this);
484
case XData::Field::Field_Fixed:
485
f = new XDataField_Fixed(*it, grid, row, this);
487
case XData::Field::Field_Hidden:
488
f = new XDataField_Hidden(*it);
490
case XData::Field::Field_JidSingle:
491
f = new XDataField_JidSingle(*it, grid, row, this);
493
case XData::Field::Field_ListMulti:
494
f = new XDataField_ListMulti(*it, grid, row, this);
496
case XData::Field::Field_ListSingle:
497
f = new XDataField_ListSingle(*it, grid, row, this);
499
case XData::Field::Field_TextMulti:
500
f = new XDataField_TextMulti(*it, grid, row, this);
502
case XData::Field::Field_JidMulti:
503
f = new XDataField_JidMulti(*it, grid, row, this);
505
case XData::Field::Field_TextPrivate:
506
f = new XDataField_TextPrivate(*it, grid, row, this);
510
f = new XDataField_TextSingle(*it, grid, row, this);