+QString SearchCriterionSelector::queryString() const
+{
+ if (m_valueWidget == 0) {
+ return QString();
+ }
+
+ const int descIndex = m_descriptionsBox->currentIndex();
+ const SearchCriterionDescription& descr = m_descriptions[descIndex];
+
+ const int compIndex = m_comparatorBox->currentIndex();
+ const SearchCriterionDescription::Comparator& comp = descr.comparators()[compIndex];
+
+ return comp.prefix + descr.identifier() + comp.operation +
+ '"' + m_valueWidget->value() + '"';
+}
+
+void SearchCriterionSelector::slotDescriptionChanged(int index)
+{
+ if (m_valueWidget != 0) {
+ m_valueWidget->hide();
+ m_layout->removeWidget(m_valueWidget);
+ m_valueWidget = 0;
+ // the value widget is obtained by the Search Criterion
+ // Selector instance and may not get deleted
+ }
+
+ // add comparator items
+ disconnect(m_comparatorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComparatorChanged(int)));
+ m_comparatorBox->clear();
+
+ const SearchCriterionDescription& description = m_descriptions[index];
+ foreach (const SearchCriterionDescription::Comparator& comp, description.comparators()) {
+ m_comparatorBox->addItem(comp.name);
+ }
+
+ // add value widget
+ m_valueWidget = description.valueWidget();
+ m_layout->insertWidget(2, m_valueWidget);
+
+ m_comparatorBox->setCurrentIndex(0);
+ slotComparatorChanged(0);
+ connect(m_comparatorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComparatorChanged(int)));
+}
+
+void SearchCriterionSelector::slotComparatorChanged(int index)
+{
+ Q_ASSERT(index >= 0);
+
+ // only show the value widget if an operation is defined by the comparator
+ const int descIndex = m_descriptionsBox->currentIndex();
+ const SearchCriterionDescription& descr = m_descriptions[descIndex];
+ const SearchCriterionDescription::Comparator& comp = descr.comparators()[index];
+ m_valueWidget->setVisible(!comp.operation.isEmpty());
+
+ emit criterionChanged();
+}
+