~ubuntu-branches/ubuntu/saucy/kopete/saucy-proposed

« back to all changes in this revision

Viewing changes to protocols/jabber/jabberxdatawidget.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-06-21 02:22:39 UTC
  • Revision ID: package-import@ubuntu.com-20130621022239-63l3zc8p0nf26pt6
Tags: upstream-4.10.80
ImportĀ upstreamĀ versionĀ 4.10.80

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 /*
 
2
    Copyright (c) 2008 by Igor Janssen  <alaves17@gmail.com>
 
3
 
 
4
    Kopete    (c) 2008 by the Kopete developers <kopete-devel@kde.org>
 
5
 
 
6
    *************************************************************************
 
7
    *                                                                       *
 
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.                                   *
 
12
    *                                                                       *
 
13
    *************************************************************************
 
14
 */
 
15
 
 
16
#include "jabberxdatawidget.h"
 
17
 
 
18
#include <QLabel>
 
19
#include <QCheckBox>
 
20
#include <QComboBox>
 
21
#include <QListWidget>
 
22
#include <QLineEdit>
 
23
#include <QTextEdit>
 
24
#include <KDebug>
 
25
 
 
26
//-------------------------------------------------------------------------------------------------//
 
27
class XDataWidgetField
 
28
{
 
29
public:
 
30
        XDataWidgetField(XMPP::XData::Field f)
 
31
        {
 
32
                mField = f;
 
33
        }
 
34
 
 
35
        virtual ~XDataWidgetField()
 
36
        {
 
37
        }
 
38
 
 
39
        QString labelText() const
 
40
        {
 
41
                return mField.label();
 
42
        }
 
43
 
 
44
        QString reqText() const
 
45
        {
 
46
                return "";
 
47
        }
 
48
 
 
49
        virtual XMPP::XData::Field field() const
 
50
        {
 
51
                return mField;
 
52
        }
 
53
 
 
54
        virtual bool isValid() const
 
55
        {
 
56
                return true;
 
57
        }
 
58
 
 
59
private:
 
60
        XMPP::XData::Field mField;
 
61
};
 
62
 
 
63
 
 
64
//-------------------------------------------------------------------------------------------------//
 
65
 
 
66
class BooleanField : public XDataWidgetField
 
67
{
 
68
public:
 
69
        BooleanField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
70
        XDataWidgetField(f)
 
71
        {
 
72
                check = new QCheckBox(parent);
 
73
                check->setText(labelText());
 
74
                if(f.value().count() > 0)
 
75
                {
 
76
                        QString s = f.value().first();
 
77
                        if(s == "1" || s == "true" || s == "yes")
 
78
                                check->setChecked(true);
 
79
                }
 
80
                layout->addWidget(check, row, 1, 1, 2);
 
81
 
 
82
                QLabel *req = new QLabel(reqText(), parent);
 
83
                layout->addWidget(req, row, 2);
 
84
 
 
85
                if(!f.desc().isEmpty())
 
86
                {
 
87
                        check->setToolTip(f.desc());
 
88
                        req->setToolTip(f.desc());
 
89
                }
 
90
        }
 
91
 
 
92
        virtual XMPP::XData::Field field() const
 
93
        {
 
94
                XMPP::XData::Field f = XDataWidgetField::field();
 
95
                QStringList val;
 
96
                val << QString(check->isChecked() ? "1" : "0");
 
97
                f.setValue(val);
 
98
                return f;
 
99
        }
 
100
 
 
101
protected:
 
102
        QCheckBox *check;
 
103
};
 
104
 
 
105
//-------------------------------------------------------------------------------------------------//
 
106
 
 
107
class FixedField : public XDataWidgetField
 
108
{
 
109
public:
 
110
        FixedField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
111
        XDataWidgetField(f)
 
112
        {
 
113
                QString text;
 
114
                const QStringList val = f.value();
 
115
                for(QStringList::ConstIterator it = val.begin(); it != val.end(); ++it)
 
116
                {
 
117
                        if(!text.isEmpty())
 
118
                                text += "<br>";
 
119
                        text += *it;
 
120
                }
 
121
                QLabel *label = new QLabel("<qt>" + text + "</qt>", parent);
 
122
                label->setWordWrap(true);
 
123
                layout->addWidget(label, row, 0, 1, 3);
 
124
 
 
125
                if(!f.desc().isEmpty())
 
126
                        label->setToolTip(f.desc());
 
127
        }
 
128
};
 
129
 
 
130
//-------------------------------------------------------------------------------------------------//
 
131
 
 
132
class HiddenField : public XDataWidgetField
 
133
{
 
134
public:
 
135
        HiddenField(XMPP::XData::Field f):
 
136
        XDataWidgetField(f)
 
137
        {
 
138
        }
 
139
};
 
140
 
 
141
//-------------------------------------------------------------------------------------------------//
 
142
 
 
143
class ListSingleField : public XDataWidgetField
 
144
{
 
145
public:
 
146
        ListSingleField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
147
        XDataWidgetField(f)
 
148
        {
 
149
                QLabel *label = new QLabel(labelText(), parent);
 
150
                layout->addWidget(label, row, 0);
 
151
 
 
152
                combo = new QComboBox(parent);
 
153
                layout->addWidget(combo, row, 1);
 
154
                combo->setInsertPolicy(QComboBox::NoInsert);
 
155
                QString sel;
 
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)
 
160
                {
 
161
                        QString lbl = (*it).label;
 
162
                        if(lbl.isEmpty())
 
163
                                lbl = (*it).value;
 
164
                        combo->addItem(lbl);
 
165
                        if ((*it).value == sel)
 
166
                                combo->setItemText(combo->currentIndex(), lbl);
 
167
                }
 
168
 
 
169
                QLabel *req = new QLabel(reqText(), parent);
 
170
                layout->addWidget(req, row, 2);
 
171
 
 
172
                if(!f.desc().isEmpty())
 
173
                {
 
174
                        label->setToolTip(f.desc());
 
175
                        combo->setToolTip(f.desc());
 
176
                        req->setToolTip(f.desc());
 
177
                }
 
178
        }
 
179
 
 
180
        virtual XMPP::XData::Field field() const
 
181
        {
 
182
                // TODO is value unique?
 
183
                QString lbl = combo->currentText();
 
184
                XMPP::XData::Field f = XDataWidgetField::field();
 
185
                QStringList val;
 
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 )
 
190
                        {
 
191
                                val << (*it).value;
 
192
                                break;
 
193
                        }
 
194
                f.setValue(val);
 
195
                return f;
 
196
        }
 
197
 
 
198
private:
 
199
        QComboBox *combo;
 
200
};
 
201
 
 
202
//-------------------------------------------------------------------------------------------------//
 
203
 
 
204
class ListMultiField : public XDataWidgetField
 
205
{
 
206
public:
 
207
        ListMultiField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
208
        XDataWidgetField(f)
 
209
        {
 
210
                QLabel *label = new QLabel(labelText(), parent);
 
211
                layout->addWidget(label, row, 0);
 
212
 
 
213
                list = new QListWidget(parent);
 
214
                layout->addWidget(list, row, 1);
 
215
                list->setSelectionMode(QAbstractItemView::MultiSelection);
 
216
 
 
217
                XMPP::XData::Field::OptionList opts = f.options();
 
218
                XMPP::XData::Field::OptionList::Iterator it = opts.begin();
 
219
                for(; it != opts.end(); ++it)
 
220
                {
 
221
                        QString lbl = (*it).label;
 
222
                        if(lbl.isEmpty())
 
223
                                lbl = (*it).value;
 
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);
 
230
                }
 
231
 
 
232
                QLabel *req = new QLabel(reqText(), parent);
 
233
                layout->addWidget(req, row, 2);
 
234
                if(!f.desc().isEmpty())
 
235
                {
 
236
                        label->setToolTip(f.desc());
 
237
                        list->setToolTip(f.desc());
 
238
                        req->setToolTip(f.desc());
 
239
                }
 
240
        }
 
241
 
 
242
        XMPP::XData::Field field() const
 
243
        {
 
244
                XMPP::XData::Field f = XDataWidgetField::field();
 
245
                QStringList val;
 
246
                for(int i = 0; i < list->count(); ++i)
 
247
                {
 
248
                        QListWidgetItem *item = list->item(i);
 
249
                        if(list->isItemSelected(item))
 
250
                        {
 
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)
 
255
                                {
 
256
                                        if((*it).label == lbl || (*it).value == lbl)
 
257
                                        {
 
258
                                                val << (*it).value;
 
259
                                                break;
 
260
                                        }
 
261
                                }
 
262
                        }
 
263
                }
 
264
                f.setValue(val);
 
265
                return f;
 
266
        }
 
267
 
 
268
private:
 
269
        QListWidget *list;
 
270
};
 
271
 
 
272
//-------------------------------------------------------------------------------------------------//
 
273
 
 
274
class TextMultiField : public XDataWidgetField
 
275
{
 
276
public:
 
277
        TextMultiField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
278
        XDataWidgetField(f)
 
279
        {
 
280
                QLabel *label = new QLabel(labelText(), parent);
 
281
                layout->addWidget(label, row, 0);
 
282
 
 
283
                edit = new QTextEdit(parent);
 
284
                layout->addWidget(edit, row, 1);
 
285
                QString text;
 
286
                const QStringList val = f.value();
 
287
                QStringList::ConstIterator it = val.begin();
 
288
                for(; it != val.end(); ++it)
 
289
                {
 
290
                        if(!text.isEmpty())
 
291
                                text += '\n';
 
292
                        text += *it;
 
293
                }
 
294
                edit->setText(text);
 
295
 
 
296
                QLabel *req = new QLabel(reqText(), parent);
 
297
                layout->addWidget(req, row, 2);
 
298
 
 
299
                if(!f.desc().isEmpty())
 
300
                {
 
301
                        label->setToolTip(f.desc());
 
302
                        edit->setToolTip(f.desc());
 
303
                        req->setToolTip(f.desc());
 
304
                }
 
305
        }
 
306
 
 
307
        virtual XMPP::XData::Field field() const
 
308
        {
 
309
                XMPP::XData::Field f = XDataWidgetField::field();
 
310
                f.setValue(edit->toPlainText().split('\n'));
 
311
                return f;
 
312
        }
 
313
 
 
314
protected:
 
315
        QTextEdit *edit;
 
316
};
 
317
 
 
318
//-------------------------------------------------------------------------------------------------//
 
319
 
 
320
class TextSingleField : public XDataWidgetField
 
321
{
 
322
public:
 
323
        TextSingleField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
324
        XDataWidgetField(f)
 
325
        {
 
326
                QString text;
 
327
                if(f.value().count())
 
328
                        text = f.value().first();
 
329
 
 
330
                QLabel *label = new QLabel(labelText(), parent);
 
331
                layout->addWidget(label, row, 0);
 
332
 
 
333
                edit = new QLineEdit(parent);
 
334
                edit->setText(text);
 
335
                layout->addWidget(edit, row, 1);
 
336
 
 
337
                QLabel *req = new QLabel(reqText(), parent);
 
338
                layout->addWidget(req, row, 2);
 
339
 
 
340
                if(!f.desc().isEmpty())
 
341
                {
 
342
                        label->setToolTip(f.desc());
 
343
                        edit->setToolTip(f.desc());
 
344
                        req->setToolTip(f.desc());
 
345
                }
 
346
        }
 
347
 
 
348
        virtual XMPP::XData::Field field() const
 
349
        {
 
350
                XMPP::XData::Field f = XDataWidgetField::field();
 
351
                QStringList val;
 
352
                val << edit->text();
 
353
                f.setValue(val);
 
354
                return f;
 
355
        }
 
356
 
 
357
protected:
 
358
        QLineEdit *edit;
 
359
};
 
360
 
 
361
//-------------------------------------------------------------------------------------------------//
 
362
 
 
363
class TextPrivateField : public TextSingleField
 
364
{
 
365
public:
 
366
        TextPrivateField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
367
        TextSingleField(f, row, parent, layout)
 
368
        {
 
369
                edit->setEchoMode(QLineEdit::Password);
 
370
        }
 
371
};
 
372
 
 
373
//-------------------------------------------------------------------------------------------------//
 
374
 
 
375
class JidMultiField : public TextMultiField
 
376
{
 
377
public:
 
378
        JidMultiField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
379
        TextMultiField(f, row, parent, layout)
 
380
        {
 
381
        }
 
382
 
 
383
        virtual bool isValid() const
 
384
        {
 
385
                // TODO
 
386
                return true;
 
387
        }
 
388
};
 
389
 
 
390
//-------------------------------------------------------------------------------------------------//
 
391
 
 
392
class JidSingleField : public TextSingleField
 
393
{
 
394
public:
 
395
        JidSingleField(XMPP::XData::Field f, int row, QWidget *parent, QGridLayout *layout):
 
396
        TextSingleField(f, row, parent, layout)
 
397
        {
 
398
        }
 
399
 
 
400
        virtual bool isValid() const
 
401
        {
 
402
                // TODO
 
403
                return true;
 
404
        }
 
405
};
 
406
 
 
407
//-------------------------------------------------------------------------------------------------//
 
408
 
 
409
 
 
410
 
 
411
JabberXDataWidget::JabberXDataWidget(const XMPP::XData &data, QWidget *parent) : QWidget(parent)
 
412
{
 
413
        const XMPP::XData::FieldList &f = data.fields();
 
414
        mFields.clear();
 
415
        
 
416
        int fields = 0;
 
417
        if(!data.instructions().isEmpty())
 
418
                fields++;
 
419
 
 
420
        if(f.count() == 0 && fields == 0)
 
421
                return;
 
422
 
 
423
        XMPP::XData::FieldList::ConstIterator it = f.begin();
 
424
        for(; it != f.end(); ++it)
 
425
        {
 
426
                switch((*it).type())
 
427
                {
 
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:
 
437
                                fields++;
 
438
                                break;
 
439
                        case XMPP::XData::Field::Field_Hidden:
 
440
                                break;
 
441
                }
 
442
        }
 
443
        QGridLayout *formLayout = new QGridLayout(parent);
 
444
        //formLayout->addLayout(this, fields, 3);
 
445
        //formLayout->setSizeConstraint(QLayout::SetMinimumSize);
 
446
        int row = 0;
 
447
        if(!data.instructions().isEmpty())
 
448
        {
 
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);
 
455
                row++;
 
456
        }
 
457
        it = f.begin();
 
458
        for(; it != f.end(); ++it, ++row)
 
459
        {
 
460
                XDataWidgetField *f;
 
461
                switch((*it).type())
 
462
                {
 
463
                        case XMPP::XData::Field::Field_Boolean:
 
464
                                f = new BooleanField(*it, row, this, formLayout);
 
465
                                break;
 
466
                        case XMPP::XData::Field::Field_Fixed:
 
467
                                f = new FixedField(*it, row, this, formLayout);
 
468
                                break;
 
469
                        case XMPP::XData::Field::Field_Hidden:
 
470
                                f = new HiddenField(*it);
 
471
                                break;
 
472
                        case XMPP::XData::Field::Field_JidMulti:
 
473
                                f = new JidMultiField(*it, row, this, formLayout);
 
474
                                break;
 
475
                        case XMPP::XData::Field::Field_JidSingle:
 
476
                                f = new JidSingleField(*it, row, this, formLayout);
 
477
                                break;
 
478
                        case XMPP::XData::Field::Field_ListMulti:
 
479
                                f = new ListMultiField(*it, row, this, formLayout);
 
480
                                break;
 
481
                        case XMPP::XData::Field::Field_ListSingle:
 
482
                                f = new ListSingleField(*it, row, this, formLayout);
 
483
                                break;
 
484
                        case XMPP::XData::Field::Field_TextMulti:
 
485
                                f = new TextMultiField(*it, row, this, formLayout);
 
486
                                break;
 
487
                        case XMPP::XData::Field::Field_TextPrivate:
 
488
                                f = new TextPrivateField(*it, row, this, formLayout);
 
489
                                break;
 
490
                        case XMPP::XData::Field::Field_TextSingle:
 
491
                                f = new TextSingleField(*it, row, this, formLayout);
 
492
                                break;
 
493
                }
 
494
                mFields.append(f);
 
495
        }
 
496
        //formLayout->addStretch(1);
 
497
}
 
498
 
 
499
JabberXDataWidget::~JabberXDataWidget()
 
500
{
 
501
}
 
502
 
 
503
XMPP::XData::FieldList JabberXDataWidget::fields() const
 
504
{
 
505
        XMPP::XData::FieldList f;
 
506
        for(QList<XDataWidgetField *>::ConstIterator it = mFields.constBegin(); it != mFields.constEnd(); ++it)
 
507
                f.append((*it)->field());
 
508
        return f;
 
509
}
 
510
 
 
511
bool JabberXDataWidget::isValid() const
 
512
{
 
513
        for(QList<XDataWidgetField *>::ConstIterator it = mFields.constBegin(); it != mFields.constEnd(); ++it)
 
514
                if(!(*it)->isValid())
 
515
                        return false;
 
516
        return true;
 
517
}
 
518
 
 
519
#include "jabberxdatawidget.moc"