3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include <extcap_argument.h>
28 #include <QIntValidator>
29 #include <QDoubleValidator>
31 #include <QButtonGroup>
33 #include <QRadioButton>
35 #include <QPushButton>
38 #include <QAbstractItemModel>
39 #include <QStringList>
40 #include <QStandardItem>
41 #include <QStandardItemModel>
42 #include <QItemSelectionModel>
45 #include <extcap_parser.h>
46 #include <extcap_argument_file.h>
48 class ExtArgMultiSelect : public ExtcapArgument
51 ExtArgMultiSelect(extcap_arg * argument) :
52 ExtcapArgument(argument), treeView(0), viewModel(0) {};
54 virtual QList<QStandardItem *> valueWalker(ExtcapValueList list, QStringList &defaults)
56 ExtcapValueList::iterator iter = list.begin();
57 QList<QStandardItem *> items;
59 while ( iter != list.end() )
61 QStandardItem * item = new QStandardItem((*iter).value());
62 if ( (*iter).enabled() == false )
64 item->setSelectable(false);
67 item->setSelectable(true);
69 item->setData((*iter).call(), Qt::UserRole);
70 if ((*iter).isDefault())
71 defaults << (*iter).call();
73 item->setEditable(false);
74 QList<QStandardItem *> childs = valueWalker((*iter).children(), defaults);
75 if ( childs.length() > 0 )
76 item->appendRows(childs);
85 void selectItemsWalker(QStandardItem * item, QStringList defaults)
87 QModelIndexList results;
90 if ( item->hasChildren() )
92 for (int row = 0; row < item->rowCount(); row++)
94 QStandardItem * child = item->child(row);
97 selectItemsWalker(child, defaults);
102 QString data = item->data(Qt::UserRole).toString();
104 if ( defaults.contains(data) )
106 treeView->selectionModel()->select(item->index(), QItemSelectionModel::Select);
107 index = item->index();
108 while ( index.isValid() )
110 treeView->setExpanded(index, true);
111 index = index.parent();
116 virtual QWidget * createEditor(QWidget * parent)
118 QStringList defaults;
120 QList<QStandardItem *> items = valueWalker(values, defaults);
121 if (items.length() == 0)
122 return new QWidget();
125 defaults = _default->toString().split(",", QString::SkipEmptyParts);
127 viewModel = new QStandardItemModel();
128 QList<QStandardItem *>::const_iterator iter = items.constBegin();
129 while ( iter != items.constEnd() )
131 ((QStandardItemModel *)viewModel)->appendRow((*iter));
135 treeView = new QTreeView(parent);
136 treeView->setModel(viewModel);
138 /* Shows at minimum 6 entries at most desktops */
139 treeView->setMinimumHeight(100);
140 treeView->setHeaderHidden(true);
141 treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
142 treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
144 for (int row = 0; row < viewModel->rowCount(); row++ )
145 selectItemsWalker(((QStandardItemModel*)viewModel)->item(row), defaults);
150 virtual QString value()
152 if ( viewModel == 0 )
156 QModelIndexList selected = treeView->selectionModel()->selectedIndexes();
158 if ( selected.size() <= 0 )
161 QModelIndexList::const_iterator iter = selected.constBegin();
162 while ( iter != selected.constEnd() )
164 QModelIndex index = (QModelIndex)(*iter);
166 result << viewModel->data(index, Qt::UserRole).toString();
171 return result.join(QString(","));
174 virtual QString defaultValue()
176 if ( _argument != 0 && _argument->default_complex != 0)
178 gchar * str = extcap_get_complex_as_string(_argument->default_complex);
187 QTreeView * treeView;
188 QAbstractItemModel * viewModel;
191 class ExtArgSelector : public ExtcapArgument
194 ExtArgSelector(extcap_arg * argument) :
195 ExtcapArgument(argument), boxSelection(0) {};
197 virtual QWidget * createEditor(QWidget * parent)
202 boxSelection = new QComboBox(parent);
204 if ( values.length() > 0 )
206 ExtcapValueList::const_iterator iter = values.constBegin();
208 while ( iter != values.constEnd() )
210 boxSelection->addItem((*iter).value(), (*iter).call());
211 if ( (*iter).isDefault() )
218 if ( selected > -1 && selected < boxSelection->count() )
219 boxSelection->setCurrentIndex(selected);
225 virtual QString value()
227 if ( boxSelection == 0 )
230 #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
231 QVariant data = boxSelection->currentData();
233 QVariant data = boxSelection->itemData(boxSelection->currentIndex());
236 return data.toString();
240 QComboBox * boxSelection;
243 class ExtArgRadio : public ExtcapArgument
246 ExtArgRadio(extcap_arg * argument) :
247 ExtcapArgument(argument), selectorGroup(0), callStrings(0)
251 virtual QWidget * createEditor(QWidget * parent)
255 bool anyChecked = false;
257 selectorGroup = new QButtonGroup(parent);
258 QWidget * radioButtons = new QWidget;
259 QVBoxLayout * vrLayout = new QVBoxLayout();
260 QMargins margins = vrLayout->contentsMargins();
261 vrLayout->setContentsMargins(0, 0, 0, margins.bottom());
262 if ( callStrings != 0 )
265 callStrings = new QList<QString>();
267 if ( values.length() > 0 )
269 ExtcapValueList::const_iterator iter = values.constBegin();
271 while ( iter != values.constEnd() )
273 QRadioButton * radio = new QRadioButton((*iter).value());
274 QString callString = (*iter).call();
275 callStrings->append(callString);
277 if ( _default != NULL && (*iter).isDefault() )
279 radio->setChecked(true);
282 else if (_default != NULL)
284 if ( callString.compare(_default->toString()) == 0 )
286 radio->setChecked(true);
290 selectorGroup->addButton(radio, count);
292 vrLayout->addWidget(radio);
299 /* No default was provided, and not saved value exists */
300 if ( anyChecked == false && count > 0 )
301 ((QRadioButton*)(selectorGroup->button(0)))->setChecked(true);
303 radioButtons->setLayout(vrLayout);
308 virtual QString value()
311 if ( selectorGroup == 0 || callStrings == 0 )
314 idx = selectorGroup->checkedId();
315 if ( idx > -1 && callStrings->length() > idx )
316 return callStrings->takeAt(idx);
322 QButtonGroup * selectorGroup;
323 QList<QString> * callStrings;
326 class ExtArgBool : public ExtcapArgument
329 ExtArgBool(extcap_arg * argument) :
330 ExtcapArgument(argument), boolBox(0) {};
332 virtual QWidget * createLabel(QWidget * parent)
334 return new QWidget(parent);
337 virtual QWidget * createEditor(QWidget * parent)
339 boolBox = new QCheckBox(QString().fromUtf8(_argument->display), parent);
340 if ( _argument->tooltip != NULL )
341 boolBox->setToolTip(QString().fromUtf8(_argument->tooltip));
343 if ( _argument->default_complex != NULL )
344 if ( extcap_complex_get_bool(_argument->default_complex) == (gboolean)TRUE )
345 boolBox->setCheckState(Qt::Checked);
347 if ( _default != NULL )
349 if ( _default->toString().compare("true") )
350 boolBox->setCheckState(Qt::Checked);
356 virtual QString call()
358 if ( boolBox == NULL )
361 if ( _argument->arg_type == EXTCAP_ARG_BOOLEAN )
362 return ExtcapArgument::call();
364 return QString(boolBox->checkState() == Qt::Checked ? _argument->call : "");
367 virtual QString value()
369 if ( boolBox == NULL || _argument->arg_type == EXTCAP_ARG_BOOLFLAG )
371 return QString(boolBox->checkState() == Qt::Checked ? "true" : "false");
374 virtual QString defaultValue()
376 if ( _argument != 0 && _argument->default_complex != NULL )
377 if ( extcap_complex_get_bool(_argument->default_complex) == (gboolean)TRUE )
378 return QString("true");
380 return QString("false");
387 class ExtArgText : public ExtcapArgument
390 ExtArgText(extcap_arg * argument) :
391 ExtcapArgument(argument), textBox(0)
393 _default = new QVariant(QString(""));
396 virtual QWidget * createEditor(QWidget * parent)
398 textBox = new QLineEdit(_default->toString(), parent);
400 textBox->setText(defaultValue());
402 if ( _argument->tooltip != NULL )
403 textBox->setToolTip(QString().fromUtf8(_argument->tooltip));
408 virtual QString value()
413 return textBox->text();
416 virtual QString defaultValue()
418 if ( _argument != 0 && _argument->default_complex != 0)
420 gchar * str = extcap_get_complex_as_string(_argument->default_complex);
432 class ExtArgNumber : public ExtArgText
435 ExtArgNumber(extcap_arg * argument) :
436 ExtArgText(argument) {};
438 virtual QWidget * createEditor(QWidget * parent)
440 textBox = (QLineEdit *)ExtArgText::createEditor(parent);
442 if ( _argument->arg_type == EXTCAP_ARG_INTEGER || _argument->arg_type == EXTCAP_ARG_UNSIGNED )
444 QIntValidator * textValidator = new QIntValidator(parent);
445 if ( _argument->range_start != NULL )
446 textValidator->setBottom(extcap_complex_get_int(_argument->range_start));
448 if ( _argument->arg_type == EXTCAP_ARG_UNSIGNED && textValidator->bottom() < 0 )
449 textValidator->setBottom(0);
451 if ( _argument->range_end != NULL )
452 textValidator->setTop(extcap_complex_get_int(_argument->range_end));
453 textBox->setValidator(textValidator);
455 else if ( _argument->arg_type == EXTCAP_ARG_DOUBLE )
457 QDoubleValidator * textValidator = new QDoubleValidator(parent);
458 if ( _argument->range_start != NULL )
459 textValidator->setBottom(extcap_complex_get_double(_argument->range_start));
460 if ( _argument->range_end != NULL )
461 textValidator->setTop(extcap_complex_get_double(_argument->range_end));
463 textBox->setValidator(textValidator);
466 textBox->setText(defaultValue());
471 virtual QString defaultValue()
475 if ( _argument != 0 && _argument->default_complex != NULL )
477 if ( _argument->arg_type == EXTCAP_ARG_DOUBLE )
478 result = QString::number(extcap_complex_get_double(_argument->default_complex));
479 else if ( _argument->arg_type == EXTCAP_ARG_INTEGER )
480 result = QString::number(extcap_complex_get_int(_argument->default_complex));
481 else if ( _argument->arg_type == EXTCAP_ARG_UNSIGNED )
482 result = QString::number(extcap_complex_get_uint(_argument->default_complex));
483 else if ( _argument->arg_type == EXTCAP_ARG_LONG )
484 result = QString::number(extcap_complex_get_long(_argument->default_complex));
493 ExtcapValue::~ExtcapValue() {}
495 void ExtcapValue::setChildren(ExtcapValueList children)
497 ExtcapValueList::iterator iter = children.begin();
498 while ( iter != children.end() )
500 (*iter)._depth = _depth + 1;
504 _children.append(children);
507 ExtcapArgument::ExtcapArgument(extcap_arg * argument, QObject *parent) :
508 QObject(parent), _argument(argument), _default(0)
510 if ( _argument->values != 0 )
512 ExtcapValueList elements = loadValues(QString(""));
513 if ( elements.length() > 0 )
514 values.append(elements);
518 ExtcapValueList ExtcapArgument::loadValues(QString parent)
520 if (_argument->values == 0 )
521 return ExtcapValueList();
525 ExtcapValueList elements;
527 for (walker = g_list_first((GList *)(_argument->values)); walker != NULL ; walker = walker->next)
529 v = (extcap_value *) walker->data;
530 if (v == NULL || v->display == NULL || v->call == NULL )
533 QString valParent(v->parent == 0 ? "" : QString().fromUtf8(v->parent));
535 if ( parent.compare(valParent) == 0 )
538 QString display = QString().fromUtf8(v->display);
539 QString call = QString().fromUtf8(v->call);
541 ExtcapValue element = ExtcapValue(display, call,
542 v->enabled == (gboolean)TRUE, v->is_default == (gboolean)TRUE);
544 element.setChildren(this->loadValues(call));
545 elements.append(element);
552 ExtcapArgument::~ExtcapArgument() {
553 // TODO Auto-generated destructor stub
556 QWidget * ExtcapArgument::createLabel(QWidget * parent)
558 if ( _argument == 0 || _argument->display == 0 )
561 QString text = QString().fromUtf8(_argument->display);
563 QLabel * label = new QLabel(text, parent);
564 if ( _argument->tooltip != 0 )
565 label->setToolTip(QString().fromUtf8(_argument->tooltip));
570 QWidget * ExtcapArgument::createEditor(QWidget * parent)
576 QString ExtcapArgument::call()
578 return QString(_argument->call);
581 QString ExtcapArgument::value()
586 QString ExtcapArgument::defaultValue()
591 void ExtcapArgument::setDefault(GHashTable * defaultsList)
593 if ( defaultsList != NULL && g_hash_table_size(defaultsList) > 0 )
595 GList * keys = g_hash_table_get_keys(defaultsList);
596 while ( keys != NULL )
598 if ( call().compare(QString().fromUtf8((gchar *)keys->data)) == 0 )
600 gpointer data = g_hash_table_lookup(defaultsList, keys->data);
601 QString dataStr = QString().fromUtf8((gchar *)data);
602 /* We assume an empty value but set entry must be a boolflag */
603 if ( dataStr.length() == 0 )
605 _default = new QVariant(dataStr);
613 ExtcapArgument * ExtcapArgument::create(extcap_arg * argument, GHashTable * device_defaults)
615 if ( argument == 0 || argument->display == 0 )
618 ExtcapArgument * result = 0;
620 if ( argument->arg_type == EXTCAP_ARG_STRING )
621 result = new ExtArgText(argument);
622 else if ( argument->arg_type == EXTCAP_ARG_INTEGER || argument->arg_type == EXTCAP_ARG_LONG ||
623 argument->arg_type == EXTCAP_ARG_UNSIGNED || argument->arg_type == EXTCAP_ARG_DOUBLE )
624 result = new ExtArgNumber(argument);
625 else if ( argument->arg_type == EXTCAP_ARG_BOOLEAN || argument->arg_type == EXTCAP_ARG_BOOLFLAG )
626 result = new ExtArgBool(argument);
627 else if ( argument->arg_type == EXTCAP_ARG_SELECTOR )
628 result = new ExtArgSelector(argument);
629 else if ( argument->arg_type == EXTCAP_ARG_RADIO )
630 result = new ExtArgRadio(argument);
631 else if ( argument->arg_type == EXTCAP_ARG_FILESELECT )
632 result = new ExtcapArgumentFileSelection(argument);
633 else if ( argument->arg_type == EXTCAP_ARG_MULTICHECK )
634 result = new ExtArgMultiSelect(argument);
637 /* For everything else, we just print the label */
638 result = new ExtcapArgument(argument);
641 result->setDefault(device_defaults);
652 * indent-tabs-mode: nil
655 * ex: set shiftwidth=4 tabstop=8 expandtab:
656 * :indentSize=4:tabSize=8:noTabs=true: