diff options
author | Gerald Combs <gerald@wireshark.org> | 2012-07-21 01:21:41 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2012-07-21 01:21:41 +0000 |
commit | d6533eb467b8a3083d3e2c7a1c81a4cf8a540519 (patch) | |
tree | 7b0b5eb191419d9f7dbb66f7244411b8aecab69e /ui/qt | |
parent | 75564d57c13a2912d644a1ec95897c59175915b2 (diff) |
Add display filter and name resolution controls to the standard Qt open
file dialog. We still need to add a preview.
svn path=/trunk/; revision=43879
Diffstat (limited to 'ui/qt')
-rw-r--r-- | ui/qt/capture_file_dialog.cpp | 64 | ||||
-rw-r--r-- | ui/qt/capture_file_dialog.h | 8 | ||||
-rw-r--r-- | ui/qt/display_filter_edit.cpp | 130 | ||||
-rw-r--r-- | ui/qt/display_filter_edit.h | 15 |
4 files changed, 150 insertions, 67 deletions
diff --git a/ui/qt/capture_file_dialog.cpp b/ui/qt/capture_file_dialog.cpp index 709db0bd26..5ba4f54876 100644 --- a/ui/qt/capture_file_dialog.cpp +++ b/ui/qt/capture_file_dialog.cpp @@ -36,9 +36,17 @@ #include "packet_list_record.h" #include "cfile.h" #include "ui/win32/file_dlg_win32.h" +#else +#include "../../epan/addr_resolv.h" +#include <QGridLayout> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QLabel> +#include <QLineEdit> +#include <QCheckBox> #endif -//#include <QDebug> +#include <QDebug> #ifdef Q_WS_WIN // All of these routines are required by file_dlg_win32.c. @@ -112,9 +120,46 @@ CaptureFileDialog::CaptureFileDialog(QWidget *parent, QString &fileName, QString QFileDialog(parent), m_fileName(fileName), m_displayFilter(displayFilter) { #if !defined(Q_WS_WIN) - setLabelText(QFileDialog::FileName, tr("Wireshark: Open Capture File")); + setWindowTitle(tr("Wireshark: Open Capture File")); setNameFilters(build_file_open_type_list()); setFileMode(QFileDialog::ExistingFile); + + if (!m_fileName.isEmpty()) { + selectFile(m_fileName); + } + + // Add extra widgets + // http://qt-project.org/faq/answer/how_can_i_add_widgets_to_my_qfiledialog_instance + setOption(QFileDialog::DontUseNativeDialog, true); + QGridLayout *fdGrid = qobject_cast<QGridLayout*>(layout()); + QHBoxLayout *hBox = new QHBoxLayout(); + QVBoxLayout *controlsBox = new QVBoxLayout(); + + QLabel *dfLabel = new QLabel("Display Filter:"); + fdGrid->addWidget(dfLabel, fdGrid->rowCount(), 0, 1, 1); + + m_displayFilterEdit = new DisplayFilterEdit(this, true); + m_displayFilterEdit->setText(m_displayFilter); + fdGrid->addWidget(m_displayFilterEdit, fdGrid->rowCount() - 1, 1, 1, 1); + + fdGrid->addLayout(hBox, fdGrid->rowCount(), 1, 1, -1); + hBox->addLayout(controlsBox); + + m_macRes.setText("Enable &MAC name resolution"); + m_macRes.setChecked(gbl_resolv_flags.mac_name); + controlsBox->addWidget(&m_macRes); + + m_transportRes.setText("Enable &transport name resolution"); + m_transportRes.setChecked(gbl_resolv_flags.transport_name); + controlsBox->addWidget(&m_transportRes); + + m_networkRes.setText("Enable &network name resolution"); + m_networkRes.setChecked(gbl_resolv_flags.network_name); + controlsBox->addWidget(&m_networkRes); + + m_externalRes.setText("Use &external name resolver"); + m_externalRes.setChecked(gbl_resolv_flags.use_external_net_name_resolver); + controlsBox->addWidget(&m_externalRes); #endif } @@ -139,16 +184,21 @@ int CaptureFileDialog::exec() { #else // not Q_WS_WINDOWS int CaptureFileDialog::exec() { - QFileDialog::exec(); - m_fileName.clear(); m_displayFilter.clear(); - if (selectedFiles().length() > 0) { + if (QFileDialog::exec() && selectedFiles().length() > 0) { m_fileName.append(selectedFiles()[0]); - return 1; + m_displayFilter.append(m_displayFilterEdit->text()); + + gbl_resolv_flags.mac_name = m_macRes.isChecked(); + gbl_resolv_flags.transport_name = m_transportRes.isChecked(); + gbl_resolv_flags.network_name = m_networkRes.isChecked(); + gbl_resolv_flags.use_external_net_name_resolver = m_externalRes.isChecked(); + + return QDialog::Accepted; } else { - return 0; + return QDialog::Rejected; } } diff --git a/ui/qt/capture_file_dialog.h b/ui/qt/capture_file_dialog.h index db4a43777d..71f1a52f24 100644 --- a/ui/qt/capture_file_dialog.h +++ b/ui/qt/capture_file_dialog.h @@ -24,6 +24,8 @@ #ifndef CAPTURE_FILE_DIALOG_H #define CAPTURE_FILE_DIALOG_H +#include "display_filter_edit.h" + #include <QFileDialog> class CaptureFileDialog : public QFileDialog @@ -64,6 +66,12 @@ private: QString &m_fileName; QString &m_displayFilter; + QCheckBox m_macRes; + QCheckBox m_transportRes; + QCheckBox m_networkRes; + QCheckBox m_externalRes; + + DisplayFilterEdit* m_displayFilterEdit; signals: diff --git a/ui/qt/display_filter_edit.cpp b/ui/qt/display_filter_edit.cpp index 9f79496739..6fa400a296 100644 --- a/ui/qt/display_filter_edit.cpp +++ b/ui/qt/display_filter_edit.cpp @@ -81,16 +81,21 @@ UIMiniCancelButton::UIMiniCancelButton(QWidget *pParent /* = 0 */) // XXX - We need simplified (button- and dropdown-free) versions for use in dialogs and field-only checking. -DisplayFilterEdit::DisplayFilterEdit(QWidget *parent) : - QLineEdit(parent) +DisplayFilterEdit::DisplayFilterEdit(QWidget *parent, bool plain) : + QLineEdit(parent), m_plain(plain) { - fieldNameOnly = false; + m_fieldNameOnly = false; m_syntaxState = Empty; - emptyFilterMessage = QString(tr("Apply a display filter %1 <%2/>")).arg(UTF8_HORIZONTAL_ELLIPSIS) -.arg(DEFAULT_MODIFIER); setAccessibleName(tr("Display filter entry")); + if (m_plain) { + m_emptyFilterMessage = QString(tr("Enter a display filter %1")).arg(UTF8_HORIZONTAL_ELLIPSIS); + } else { + m_emptyFilterMessage = QString(tr("Apply a display filter %1 <%2/>")).arg(UTF8_HORIZONTAL_ELLIPSIS) + .arg(DEFAULT_MODIFIER); + } + // DFCombo // Bookmark (star) // DispalyFilterEdit @@ -101,12 +106,12 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent) : // XXX - Move bookmark and apply buttons to the toolbar a la Firefox, Chrome & Safari? // XXX - Use native buttons on OS X? - bookmarkButton = new QToolButton(this); - bookmarkButton->setCursor(Qt::ArrowCursor); - bookmarkButton->setStyleSheet( + m_bookmarkButton = new QToolButton(this); + m_bookmarkButton->setCursor(Qt::ArrowCursor); + m_bookmarkButton->setStyleSheet(QString( "QToolButton { /* all types of tool button */" " border 0 0 0 0;" - " border-right: 1px solid gray;" + " border-right: %1px solid gray;" " border-top-left-radius: 3px;" " border-bottom-left-radius: 3px;" " padding-left: 1px;" @@ -127,12 +132,13 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent) : // " stop: 0 #dadbde, stop: 1 #f6f7fa);" // "}" + ).arg(m_plain ? 0 : 1) ); - connect(bookmarkButton, SIGNAL(clicked()), this, SLOT(showDisplayFilterDialog())); + connect(m_bookmarkButton, SIGNAL(clicked()), this, SLOT(showDisplayFilterDialog())); - clearButton = new QToolButton(this); - clearButton->setCursor(Qt::ArrowCursor); - clearButton->setStyleSheet( + m_clearButton = new QToolButton(this); + m_clearButton->setCursor(Qt::ArrowCursor); + m_clearButton->setStyleSheet( "QToolButton {" " image: url(:/dfilter/dfilter_erase_normal.png);" " border: none;" @@ -145,41 +151,49 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent) : " image: url(:/dfilter/dfilter_erase_selected.png);" "}" ); - clearButton->hide(); - connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); + m_clearButton->hide(); + connect(m_clearButton, SIGNAL(clicked()), this, SLOT(clear())); connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(checkFilter(const QString&))); - applyButton = new QToolButton(this); - applyButton->setCursor(Qt::ArrowCursor); - applyButton->setStyleSheet( - "QToolButton { /* all types of tool button */" - " border 0 0 0 0;" - " border-top-right-radius: 3px;" - " border-bottom-right-radius: 3px;" - " padding-right: 1px;" - " image: url(:/dfilter/dfilter_apply_normal.png);" - "}" - - "QToolButton:hover {" - " image: url(:/dfilter/dfilter_apply_hover.png);" - "}" - "QToolButton:pressed {" - " image: url(:/dfilter/dfilter_apply_pressed.png);" - "}" - ); - connect(applyButton, SIGNAL(clicked()), this, SLOT(applyDisplayFilter())); - connect(this, SIGNAL(returnPressed()), this, SLOT(applyDisplayFilter())); + m_applyButton = NULL; + if (!m_plain) { + m_applyButton = new QToolButton(this); + m_applyButton->setCursor(Qt::ArrowCursor); + m_applyButton->setStyleSheet( + "QToolButton { /* all types of tool button */" + " border 0 0 0 0;" + " border-top-right-radius: 3px;" + " border-bottom-right-radius: 3px;" + " padding-right: 1px;" + " image: url(:/dfilter/dfilter_apply_normal.png);" + "}" + + "QToolButton:hover {" + " image: url(:/dfilter/dfilter_apply_hover.png);" + "}" + "QToolButton:pressed {" + " image: url(:/dfilter/dfilter_apply_pressed.png);" + "}" + ); + connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyDisplayFilter())); + connect(this, SIGNAL(returnPressed()), this, SLOT(applyDisplayFilter())); + } int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - QSize bksz = bookmarkButton->sizeHint(); - QSize cbsz = clearButton->sizeHint(); - QSize apsz = applyButton->sizeHint(); - syntaxStyleSheet = QString( + QSize bksz = m_bookmarkButton->sizeHint(); + QSize cbsz = m_clearButton->sizeHint(); + QSize apsz; + if (m_applyButton) { + apsz = m_applyButton->sizeHint(); + } else { + apsz.setHeight(0); apsz.setWidth(0); + } + m_syntaxStyleSheet = QString( "DisplayFilterEdit {" " padding-left: %1px;" " margin-left: %2px;" " margin-right: %3px;" - " background: transparent;" +// " background: transparent;" "}" // Should the backgrounds fade away on the right? @@ -207,7 +221,7 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent) : .arg(Invalid) .arg(Deprecated) .arg(Valid); - setStyleSheet(syntaxStyleSheet); + setStyleSheet(m_syntaxStyleSheet); } void DisplayFilterEdit::paintEvent(QPaintEvent *evt) { @@ -230,7 +244,7 @@ void DisplayFilterEdit::paintEvent(QPaintEvent *evt) { cr.setLeft(cr.left() + 2); cr.setRight(cr.right() - 2); - p.drawText(cr, Qt::AlignLeft|Qt::AlignVCenter, emptyFilterMessage); + p.drawText(cr, Qt::AlignLeft|Qt::AlignVCenter, m_emptyFilterMessage); } // else check filter syntax and set the background accordingly // XXX - Should we add little warning/error icons as well? @@ -238,13 +252,20 @@ void DisplayFilterEdit::paintEvent(QPaintEvent *evt) { void DisplayFilterEdit::resizeEvent(QResizeEvent *) { - QSize cbsz = clearButton->sizeHint(); - QSize apsz = applyButton->sizeHint(); + QSize cbsz = m_clearButton->sizeHint(); + QSize apsz; + if (m_applyButton) { + apsz = m_applyButton->sizeHint(); + } else { + apsz.setHeight(0); apsz.setWidth(0); + } int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - clearButton->move(rect().right() - frameWidth - cbsz.width() - apsz.width(), + m_clearButton->move(rect().right() - frameWidth - cbsz.width() - apsz.width(), (rect().bottom() + 1 - cbsz.height())/2); - applyButton->move(rect().right() - frameWidth - apsz.width(), - (rect().bottom() + 1 - apsz.height())/2); + if (m_applyButton) { + m_applyButton->move(rect().right() - frameWidth - apsz.width(), + (rect().bottom() + 1 - apsz.height())/2); + } } void DisplayFilterEdit::checkFilter(const QString& text) @@ -253,11 +274,11 @@ void DisplayFilterEdit::checkFilter(const QString& text) GPtrArray *depr = NULL; guchar c; - clearButton->setVisible(!text.isEmpty()); + m_clearButton->setVisible(!text.isEmpty()); popFilterSyntaxStatus(); - if (fieldNameOnly && (c = proto_check_field_name(text.toUtf8().constData()))) { + if (m_fieldNameOnly && (c = proto_check_field_name(text.toUtf8().constData()))) { m_syntaxState = Invalid; emit pushFilterSyntaxStatus(QString().sprintf("Illegal character in field name: '%c'", c)); } else if (dfilter_compile(text.toUtf8().constData(), &dfp)) { @@ -288,9 +309,10 @@ void DisplayFilterEdit::checkFilter(const QString& text) emit pushFilterSyntaxStatus(invalidMsg); } - setStyleSheet(syntaxStyleSheet); - applyButton->setEnabled(m_syntaxState == Empty || m_syntaxState == Valid); - + setStyleSheet(m_syntaxStyleSheet); + if (m_applyButton) { + m_applyButton->setEnabled(m_syntaxState == Empty || m_syntaxState == Valid); + } } void DisplayFilterEdit::showDisplayFilterDialog() @@ -314,7 +336,9 @@ void DisplayFilterEdit::applyDisplayFilter() g_free(dftext); if (cf_status == CF_OK) { - applyButton->setEnabled(false); + if (m_applyButton) { + m_applyButton->setEnabled(false); + } if (dfString.length() < 1) { // gtk_widget_set_sensitive (g_object_get_data (G_OBJECT(filter_cm), E_DFILTER_CLEAR_KEY), FALSE); // gtk_widget_set_sensitive (g_object_get_data (G_OBJECT(filter_cm), E_DFILTER_SAVE_KEY), FALSE); diff --git a/ui/qt/display_filter_edit.h b/ui/qt/display_filter_edit.h index fe0562c3c3..2c0f05dfe1 100644 --- a/ui/qt/display_filter_edit.h +++ b/ui/qt/display_filter_edit.h @@ -32,7 +32,7 @@ class DisplayFilterEdit : public QLineEdit Q_PROPERTY(SyntaxState syntaxState READ syntaxState) Q_ENUMS(SyntaxState) public: - explicit DisplayFilterEdit(QWidget *parent = 0); + explicit DisplayFilterEdit(QWidget *parent = 0, bool plain = false); enum SyntaxState { Empty, Invalid, Deprecated, Valid }; SyntaxState syntaxState() const { return m_syntaxState; } @@ -50,13 +50,14 @@ private slots: void applyDisplayFilter(); private: - bool fieldNameOnly; + bool m_plain; + bool m_fieldNameOnly; SyntaxState m_syntaxState; - QString emptyFilterMessage; - QString syntaxStyleSheet; - QToolButton *bookmarkButton; - QToolButton *clearButton; - QToolButton *applyButton; + QString m_emptyFilterMessage; + QString m_syntaxStyleSheet; + QToolButton *m_bookmarkButton; + QToolButton *m_clearButton; + QToolButton *m_applyButton; signals: void pushFilterSyntaxStatus(QString&); |