aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ui/qt/CMakeLists.txt4
-rw-r--r--ui/qt/Makefile.am4
-rw-r--r--ui/qt/main_window.cpp4
-rw-r--r--ui/qt/main_window.h1
-rw-r--r--ui/qt/main_window_slots.cpp15
-rw-r--r--ui/qt/proto_tree.cpp74
-rw-r--r--ui/qt/proto_tree.h11
-rw-r--r--ui/qt/utils/wireshark_mime_data.cpp53
-rw-r--r--ui/qt/utils/wireshark_mime_data.h57
-rw-r--r--ui/qt/widgets/display_filter_edit.cpp67
-rw-r--r--ui/qt/widgets/display_filter_edit.h6
-rw-r--r--ui/qt/widgets/drag_drop_toolbar.cpp32
-rw-r--r--ui/qt/widgets/drag_drop_toolbar.h2
-rw-r--r--ui/qt/widgets/drag_label.cpp53
-rw-r--r--ui/qt/widgets/drag_label.h52
15 files changed, 431 insertions, 4 deletions
diff --git a/ui/qt/CMakeLists.txt b/ui/qt/CMakeLists.txt
index 565fa0bee5..d6a0045ddf 100644
--- a/ui/qt/CMakeLists.txt
+++ b/ui/qt/CMakeLists.txt
@@ -30,6 +30,7 @@ set(WIRESHARK_WIDGET_HEADERS
widgets/display_filter_combo.h
widgets/display_filter_edit.h
widgets/drag_drop_toolbar.h
+ widgets/drag_label.h
widgets/editor_color_dialog.h
widgets/editor_file_dialog.h
widgets/elided_label.h
@@ -50,6 +51,7 @@ set(WIRESHARK_UTILS_HEADERS
utils/stock_icon.h
utils/qt_ui_utils.h
utils/tango_colors.h
+ utils/wireshark_mime_data.h
utils/variant_pointer.h
)
@@ -230,6 +232,7 @@ set(WIRESHARK_WIDGET_SRCS
widgets/display_filter_combo.cpp
widgets/display_filter_edit.cpp
widgets/drag_drop_toolbar.cpp
+ widgets/drag_label.cpp
widgets/editor_color_dialog.cpp
widgets/editor_file_dialog.cpp
widgets/elided_label.cpp
@@ -248,6 +251,7 @@ set(WIRESHARK_WIDGET_SRCS
set(WIRESHARK_UTILS_SRCS
utils/color_utils.cpp
utils/stock_icon.cpp
+ utils/wireshark_mime_data.cpp
utils/qt_ui_utils.cpp
)
diff --git a/ui/qt/Makefile.am b/ui/qt/Makefile.am
index 51da3107f9..735c849a55 100644
--- a/ui/qt/Makefile.am
+++ b/ui/qt/Makefile.am
@@ -172,6 +172,7 @@ MOC_WIDGET_HDRS = \
widgets/stock_icon_tool_button.h \
widgets/tabnav_tree_view.h \
widgets/drag_drop_toolbar.h \
+ widgets/drag_label.h \
widgets/qcustomplot.h
# Files that are utility classes with multi-purpose, but no widgets
@@ -179,6 +180,7 @@ MOC_UTILS_HDRS = \
utils/color_utils.h \
utils/stock_icon.h \
utils/qt_ui_utils.h \
+ utils/wireshark_mime_data.h \
utils/variant_pointer.h
# Files for delegates and models
@@ -486,11 +488,13 @@ WIRESHARK_QT_WIDGET_SRC = \
widgets/syntax_line_edit.cpp \
widgets/tabnav_tree_view.cpp \
widgets/drag_drop_toolbar.cpp \
+ widgets/drag_label.cpp \
widgets/qcustomplot.cpp
WIRESHARK_QT_UTILS_SRC = \
utils/color_utils.cpp \
utils/stock_icon.cpp \
+ utils/wireshark_mime_data.cpp \
utils/qt_ui_utils.cpp
WIRESHARK_QT_MODELS_SRCS = \
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index bbaced0077..9e06490ed9 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -420,6 +420,8 @@ MainWindow::MainWindow(QWidget *parent) :
this, SLOT(filterToolbarCustomMenuHandler(QPoint)));
connect(filter_expression_toolbar_, SIGNAL(actionMoved(QAction*, int, int)),
this, SLOT(filterToolbarActionMoved(QAction*, int, int)));
+ connect(filter_expression_toolbar_, SIGNAL(newFilterDropped(QString, QString)),
+ this, SLOT(filterDropped(QString, QString)));
main_ui_->displayFilterToolBar->addWidget(filter_expression_toolbar_);
@@ -653,6 +655,8 @@ MainWindow::MainWindow(QWidget *parent) :
connect(this, SIGNAL(setCaptureFile(capture_file*)),
packet_list_, SLOT(setCaptureFile(capture_file*)));
connect(this, SIGNAL(setCaptureFile(capture_file*)),
+ proto_tree_, SLOT(setCaptureFile(capture_file*)));
+ connect(this, SIGNAL(setCaptureFile(capture_file*)),
byte_view_tab_, SLOT(setCaptureFile(capture_file*)));
connect(this, SIGNAL(monospaceFontChanged(QFont)),
diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h
index 74f95da95f..1f92b00a13 100644
--- a/ui/qt/main_window.h
+++ b/ui/qt/main_window.h
@@ -367,6 +367,7 @@ private slots:
void filterToolbarDisableFilter();
void filterToolbarRemoveFilter();
void filterToolbarActionMoved(QAction * action, int oldPos, int newPos);
+ void filterDropped(QString description, QString filter);
void startInterfaceCapture(bool valid, const QString capture_filter);
diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp
index 2cced5b4c3..ee25e61e58 100644
--- a/ui/qt/main_window_slots.cpp
+++ b/ui/qt/main_window_slots.cpp
@@ -4074,6 +4074,21 @@ void MainWindow::filterToolbarEditFilter()
delete uatModel;
}
+void MainWindow::filterDropped(QString description, QString filter)
+{
+ gchar* err = NULL;
+ if ( filter.length() == 0 )
+ return;
+
+ filter_expression_new(description.toUtf8().constData(),
+ filter.toUtf8().constData(), description.toUtf8().constData(), TRUE);
+
+ uat_save(uat_get_table_by_name("Display expressions"), &err);
+ g_free(err);
+
+ filterExpressionsChanged();
+}
+
void MainWindow::filterToolbarDisableFilter()
{
gchar* err = NULL;
diff --git a/ui/qt/proto_tree.cpp b/ui/qt/proto_tree.cpp
index 32c104a724..f64ac911e7 100644
--- a/ui/qt/proto_tree.cpp
+++ b/ui/qt/proto_tree.cpp
@@ -27,8 +27,9 @@
#include <epan/prefs.h>
#include <ui/qt/utils/color_utils.h>
-
#include <ui/qt/utils/variant_pointer.h>
+#include <ui/qt/utils/wireshark_mime_data.h>
+#include <ui/qt/widgets/drag_label.h>
#include <QApplication>
#include <QContextMenuEvent>
@@ -38,6 +39,11 @@
#include <QTreeWidgetItemIterator>
#include <QUrl>
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+#include <QWindow>
+#endif
+
+
// To do:
// - Fix "apply as filter" behavior.
@@ -286,6 +292,8 @@ ProtoTree::ProtoTree(QWidget *parent) :
// have scrolled to an area with a different width at this point.
connect(verticalScrollBar(), SIGNAL(sliderReleased()),
this, SLOT(updateContentWidth()));
+
+ viewport()->installEventFilter(this);
}
void ProtoTree::closeContextMenu()
@@ -690,6 +698,70 @@ void ProtoTree::restoreSelectedField()
}
}
+void ProtoTree::setCaptureFile(capture_file *cf)
+{
+ cap_file_ = cf;
+}
+
+bool ProtoTree::eventFilter(QObject * obj, QEvent * event)
+{
+ if ( cap_file_ && event->type() != QEvent::MouseButtonPress && event->type() != QEvent::MouseMove )
+ return QTreeWidget::eventFilter(obj, event);
+
+ QMouseEvent * ev = (QMouseEvent *)event;
+
+ if ( event->type() == QEvent::MouseButtonPress )
+ {
+ if ( ev->buttons() & Qt::LeftButton )
+ {
+ dragStartPosition = ev->pos();
+ }
+ }
+ else if ( event->type() == QEvent::MouseMove )
+ {
+ if ( ( ev->buttons() & Qt::LeftButton ) && (ev->pos() - dragStartPosition).manhattanLength()
+ > QApplication::startDragDistance())
+ {
+ QTreeWidgetItem * item = itemAt(dragStartPosition);
+ if ( item )
+ {
+ field_info * fi = VariantPointer<field_info>::asPtr(item->data(0, Qt::UserRole));
+ if ( fi )
+ {
+ QString description = QString(fi->hfinfo->name);
+ QString filter = QString(proto_construct_match_selected_string(fi, cap_file_->edt));
+
+ if ( filter.length() > 0 )
+ {
+ QDrag * drag = new QDrag(this);
+ drag->setMimeData(new DisplayFilterMimeData(description, filter));
+
+ QString cmt = QString("%1 - ( %2 )").arg(description, filter);
+ DragLabel * content = new DragLabel(cmt, this);
+
+ #if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
+ qreal dpr = window()->windowHandle()->devicePixelRatio();
+ QPixmap pixmap(content->size() * dpr);
+ pixmap.setDevicePixelRatio(dpr);
+ #else
+ QPixmap pixmap(content->size());
+ #endif
+ content->render(&pixmap);
+ drag->setPixmap(pixmap);
+
+ drag->exec(Qt::CopyAction);
+
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return QTreeWidget::eventFilter(obj, event);
+}
+
+
/*
* Editor modelines
*
diff --git a/ui/qt/proto_tree.h b/ui/qt/proto_tree.h
index a27aab5faa..cf9c85369a 100644
--- a/ui/qt/proto_tree.h
+++ b/ui/qt/proto_tree.h
@@ -26,6 +26,8 @@
#include <epan/proto.h>
+#include "cfile.h"
+
#include "protocol_preferences_menu.h"
#include <QTreeWidget>
@@ -51,6 +53,8 @@ protected:
virtual void timerEvent(QTimerEvent *event);
virtual void keyReleaseEvent(QKeyEvent *event);
+ virtual bool eventFilter(QObject * obj, QEvent * ev);
+
private:
QMenu ctx_menu_;
QMenu conv_menu_;
@@ -62,6 +66,10 @@ private:
int column_resize_timer_;
QList<int> selected_field_path_;
+ QPoint dragStartPosition;
+
+ capture_file *cap_file_;
+
signals:
void protoItemSelected(const QString &);
void protoItemSelected(field_info *);
@@ -72,6 +80,9 @@ signals:
void editProtocolPreference(struct preference *pref, struct pref_module *module);
public slots:
+
+ /* Set the capture file */
+ void setCaptureFile(capture_file *cf);
void setMonospaceFont(const QFont &mono_font);
void updateSelectionStatus(QTreeWidgetItem*);
void expand(const QModelIndex & index);
diff --git a/ui/qt/utils/wireshark_mime_data.cpp b/ui/qt/utils/wireshark_mime_data.cpp
new file mode 100644
index 0000000000..7844ee3fd2
--- /dev/null
+++ b/ui/qt/utils/wireshark_mime_data.cpp
@@ -0,0 +1,53 @@
+/* wireshark_mime_data.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <utils/wireshark_mime_data.h>
+
+DisplayFilterMimeData::DisplayFilterMimeData(QString description, QString filter) :
+QMimeData(),
+description_(description),
+filter_(filter)
+{
+}
+
+QString DisplayFilterMimeData::description() const
+{
+ return description_;
+}
+
+QString DisplayFilterMimeData::filter() const
+{
+ return filter_;
+}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
+
diff --git a/ui/qt/utils/wireshark_mime_data.h b/ui/qt/utils/wireshark_mime_data.h
new file mode 100644
index 0000000000..d2b4c79e82
--- /dev/null
+++ b/ui/qt/utils/wireshark_mime_data.h
@@ -0,0 +1,57 @@
+/* wireshark_mime_data.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef UI_QT_UTILS_WIRESHARK_MIME_DATA_H_
+#define UI_QT_UTILS_WIRESHARK_MIME_DATA_H_
+
+#include <QMimeData>
+
+class DisplayFilterMimeData: public QMimeData {
+ Q_OBJECT
+public:
+
+ DisplayFilterMimeData(QString description, QString filter);
+
+ QString description() const;
+ QString filter() const;
+
+private:
+
+ QString description_;
+ QString filter_;
+
+};
+
+#endif /* UI_QT_UTILS_WIRESHARK_MIME_DATA_H_ */
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
+
diff --git a/ui/qt/widgets/display_filter_edit.cpp b/ui/qt/widgets/display_filter_edit.cpp
index 47abe3fefe..df5d1b0709 100644
--- a/ui/qt/widgets/display_filter_edit.cpp
+++ b/ui/qt/widgets/display_filter_edit.cpp
@@ -33,18 +33,21 @@
#include "filter_dialog.h"
#include <ui/qt/widgets/stock_icon_tool_button.h>
#include <ui/qt/widgets/syntax_line_edit.h>
+#include <ui/qt/utils/wireshark_mime_data.h>
#include <QAction>
#include <QAbstractItemView>
#include <QComboBox>
#include <QCompleter>
-#include <QEvent>
#include <QMenu>
#include <QMessageBox>
#include <QPainter>
#include <QStringListModel>
-
-#include <wsutil/utf8_entities.h>
+#include <QWidget>
+#include <QObject>
+#include <QDrag>
+#include <QDropEvent>
+#include <QMimeData>
// To do:
// - Get rid of shortcuts and replace them with "n most recently applied filters"?
@@ -164,6 +167,7 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent, DisplayFilterEditType type
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(updateBookmarkMenu()));
connect(wsApp, SIGNAL(displayFilterListChanged()), this, SLOT(updateBookmarkMenu()));
+
}
void DisplayFilterEdit::setDefaultPlaceholderText()
@@ -531,6 +535,63 @@ void DisplayFilterEdit::applyOrPrepareFilter()
}
}
+void DisplayFilterEdit::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (event && qobject_cast<const DisplayFilterMimeData *>(event->mimeData())) {
+ if ( event->source() != this )
+ {
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+ } else {
+ event->acceptProposedAction();
+ }
+ } else {
+ event->ignore();
+ }
+}
+
+void DisplayFilterEdit::dragMoveEvent(QDragMoveEvent *event)
+{
+ if (event && qobject_cast<const DisplayFilterMimeData *>(event->mimeData())) {
+ if ( event->source() != this )
+ {
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+ } else {
+ event->acceptProposedAction();
+ }
+ } else {
+ event->ignore();
+ }
+}
+
+void DisplayFilterEdit::dropEvent(QDropEvent *event)
+{
+ /* Moving items around */
+ if (event && qobject_cast<const DisplayFilterMimeData *>(event->mimeData())) {
+ const DisplayFilterMimeData * data = qobject_cast<const DisplayFilterMimeData *>(event->mimeData());
+
+ if ( event->source() != this )
+ {
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+
+ setText(data->filter());
+
+ // Holding down the Shift key will only prepare filter.
+ if (!(QApplication::keyboardModifiers() & Qt::ShiftModifier)) {
+ applyDisplayFilter();
+ }
+
+ } else {
+ event->acceptProposedAction();
+ }
+
+ } else {
+ event->ignore();
+ }
+}
+
/*
* Editor modelines
*
diff --git a/ui/qt/widgets/display_filter_edit.h b/ui/qt/widgets/display_filter_edit.h
index a7e57107d5..84c6307fd4 100644
--- a/ui/qt/widgets/display_filter_edit.h
+++ b/ui/qt/widgets/display_filter_edit.h
@@ -22,6 +22,8 @@
#ifndef DISPLAYFILTEREDIT_H
#define DISPLAYFILTEREDIT_H
+#include <QDrag>
+
#include <ui/qt/preferences_dialog.h>
#include <ui/qt/widgets/syntax_line_edit.h>
@@ -47,6 +49,10 @@ protected:
void focusInEvent(QFocusEvent *event) { completionFocusInEvent(event); }
void focusOutEvent(QFocusEvent *event);
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dragMoveEvent(QDragMoveEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+
public slots:
bool checkFilter();
void updateBookmarkMenu();
diff --git a/ui/qt/widgets/drag_drop_toolbar.cpp b/ui/qt/widgets/drag_drop_toolbar.cpp
index 3ebfbcecc5..aa2f0f9aeb 100644
--- a/ui/qt/widgets/drag_drop_toolbar.cpp
+++ b/ui/qt/widgets/drag_drop_toolbar.cpp
@@ -20,6 +20,7 @@
*/
#include <ui/qt/widgets/drag_drop_toolbar.h>
+#include <ui/qt/utils/wireshark_mime_data.h>
#include <QAction>
#include <QApplication>
@@ -141,6 +142,14 @@ void DragDropToolBar::dragEnterEvent(QDragEnterEvent *event)
} else {
event->acceptProposedAction();
}
+ } else if (qobject_cast<const DisplayFilterMimeData *>(event->mimeData())) {
+ if ( event->source() != this )
+ {
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+ } else {
+ event->acceptProposedAction();
+ }
} else {
event->ignore();
}
@@ -167,6 +176,14 @@ void DragDropToolBar::dragMoveEvent(QDragMoveEvent *event)
widgetForAction(action)->setStyleSheet("QWidget { border: 2px dotted grey; };");
}
}
+ } else if (qobject_cast<const DisplayFilterMimeData *>(event->mimeData())) {
+ if ( event->source() != this )
+ {
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+ } else {
+ event->acceptProposedAction();
+ }
} else {
event->ignore();
}
@@ -174,6 +191,7 @@ void DragDropToolBar::dragMoveEvent(QDragMoveEvent *event)
void DragDropToolBar::dropEvent(QDropEvent *event)
{
+ /* Moving items around */
if (event->mimeData()->hasFormat("application/x-wireshark-toolbar-entry"))
{
int oldPos = event->mimeData()->data("application/x-wireshark-toolbar-entry").toInt();
@@ -194,6 +212,20 @@ void DragDropToolBar::dropEvent(QDropEvent *event)
event->acceptProposedAction();
}
+ } else if (qobject_cast<const DisplayFilterMimeData *>(event->mimeData())) {
+ const DisplayFilterMimeData * data = qobject_cast<const DisplayFilterMimeData *>(event->mimeData());
+
+ if ( event->source() != this )
+ {
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+
+ emit newFilterDropped(data->description(), data->filter());
+
+ } else {
+ event->acceptProposedAction();
+ }
+
} else {
event->ignore();
}
diff --git a/ui/qt/widgets/drag_drop_toolbar.h b/ui/qt/widgets/drag_drop_toolbar.h
index 73e93384a1..3958a0ca33 100644
--- a/ui/qt/widgets/drag_drop_toolbar.h
+++ b/ui/qt/widgets/drag_drop_toolbar.h
@@ -37,6 +37,8 @@ public:
Q_SIGNALS:
void actionMoved(QAction * action, int oldPos, int newPos);
+ void newFilterDropped(QString description, QString filter);
+
protected:
virtual void childEvent(QChildEvent * event);
diff --git a/ui/qt/widgets/drag_label.cpp b/ui/qt/widgets/drag_label.cpp
new file mode 100644
index 0000000000..1665995692
--- /dev/null
+++ b/ui/qt/widgets/drag_label.cpp
@@ -0,0 +1,53 @@
+/* drag_label.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <ui/qt/widgets/drag_label.h>
+
+#include <QLayout>
+
+DragLabel::DragLabel(QString txt, QWidget * parent)
+: QLabel(txt, parent)
+{
+ setAutoFillBackground(true);
+ setFrameShape(QFrame::Panel);
+ setFrameShadow(QFrame::Raised);
+ setAttribute(Qt::WA_DeleteOnClose);
+ setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+
+ adjustSize();
+}
+
+DragLabel::~DragLabel() {
+ // TODO Auto-generated destructor stub
+}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/ui/qt/widgets/drag_label.h b/ui/qt/widgets/drag_label.h
new file mode 100644
index 0000000000..50618f1579
--- /dev/null
+++ b/ui/qt/widgets/drag_label.h
@@ -0,0 +1,52 @@
+/* drag_label.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef UI_QT_WIDGETS_DRAG_LABEL_H_
+#define UI_QT_WIDGETS_DRAG_LABEL_H_
+
+#include <QLabel>
+#include <QDrag>
+#include <QMimeData>
+#include <QMouseEvent>
+
+class DragLabel: public QLabel
+{
+ Q_OBJECT
+
+public:
+ explicit DragLabel(QString text, QWidget * parent = 0);
+ virtual ~DragLabel();
+};
+
+#endif /* UI_QT_WIDGETS_DRAG_LABEL_H_ */
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */