* 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.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <config.h>
#include <ui/qt/utils/variant_pointer.h>
#include <ui/qt/widgets/drag_drop_toolbar.h>
+#include "ui/qt/widgets/wireshark_file_dialog.h"
#ifdef HAVE_SOFTWARE_UPDATE
#include "ui/software_update.h"
#include "export_object_action.h"
#include "export_object_dialog.h"
#include "export_pdu_dialog.h"
-#ifdef HAVE_EXTCAP
#include "extcap_options_dialog.h"
-#endif
#include "file_set_dialog.h"
#include "filter_action.h"
#include "filter_dialog.h"
// XXX You must uncomment QT_WINEXTRAS_LIB lines in CMakeList.txt and
// cmakeconfig.h.in.
-// #if defined(QT_WINEXTRAS_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
+// #if defined(QT_WINEXTRAS_LIB)
// #include <QWinJumpList>
// #include <QWinJumpListCategory>
// #include <QWinJumpListItem>
}
#endif // HAVE_LIBPCAP
}
-void MainWindow::captureCaptureFixedStarted(capture_session *) {
-#ifdef HAVE_LIBPCAP
-#endif // HAVE_LIBPCAP
-}
+
void MainWindow::captureCaptureFixedFinished(capture_session *) {
#ifdef HAVE_LIBPCAP
}
#endif // HAVE_LIBPCAP
}
-void MainWindow::captureCaptureStopping(capture_session *) {
-#ifdef HAVE_LIBPCAP
- capture_stopping_ = true;
- setMenusForCaptureStopping();
-#endif // HAVE_LIBPCAP
-}
void MainWindow::captureCaptureFailed(capture_session *) {
#ifdef HAVE_LIBPCAP
/* Capture isn't stopping any more. */
#endif // HAVE_LIBPCAP
}
-
// Callbacks from cfile.c and file.c via CaptureFile::captureFileCallback
+void MainWindow::captureEventHandler(CaptureEvent ev)
+{
+ switch (ev.captureContext()) {
+
+ case CaptureEvent::File:
+ switch (ev.eventType()) {
+ case CaptureEvent::Opened:
+ captureFileOpened();
+ break;
+ case CaptureEvent::Closing:
+ captureFileClosing();
+ break;
+ case CaptureEvent::Closed:
+ captureFileClosed();
+ break;
+ case CaptureEvent::Started:
+ captureFileReadStarted(tr("Loading"));
+ break;
+ case CaptureEvent::Finished:
+ captureFileReadFinished();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Reload:
+ switch (ev.eventType()) {
+ case CaptureEvent::Started:
+ captureFileReadStarted(tr("Reloading"));
+ break;
+ case CaptureEvent::Finished:
+ captureFileReadFinished();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Rescan:
+ switch (ev.eventType()) {
+ case CaptureEvent::Started:
+ setMenusForCaptureFile(true);
+ captureFileReadStarted(tr("Rescanning"));
+ break;
+ case CaptureEvent::Finished:
+ captureFileReadFinished();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Retap:
+ switch (ev.eventType()) {
+ case CaptureEvent::Started:
+ freeze();
+ break;
+ case CaptureEvent::Finished:
+ thaw();
+ break;
+ case CaptureEvent::Flushed:
+ draw_tap_listeners(FALSE);
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Merge:
+ switch (ev.eventType()) {
+ case CaptureEvent::Started:
+ main_ui_->statusBar->popFileStatus();
+ main_ui_->statusBar->pushFileStatus(tr("Merging files"), QString());
+ break;
+ case CaptureEvent::Finished:
+ main_ui_->statusBar->popFileStatus();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Save:
+ switch (ev.eventType()) {
+ case CaptureEvent::Started:
+ {
+ QFileInfo file_info(ev.filePath());
+ main_ui_->statusBar->popFileStatus();
+ main_ui_->statusBar->pushFileStatus(tr("Saving %1" UTF8_HORIZONTAL_ELLIPSIS).arg(file_info.baseName()));
+ break;
+ }
+ default:
+ break;
+ }
+ break;
+
+#ifdef HAVE_LIBPCAP
+ case CaptureEvent::Capture:
+ switch (ev.eventType()) {
+ case CaptureEvent::Prepared:
+ captureCapturePrepared(ev.capSession());
+ break;
+ case CaptureEvent::Stopping:
+ capture_stopping_ = true;
+ setMenusForCaptureStopping();
+ break;
+ case CaptureEvent::Failed:
+ captureCaptureFailed(ev.capSession());
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Update:
+ switch (ev.eventType()) {
+ case CaptureEvent::Started:
+ captureCaptureUpdateStarted(ev.capSession());
+ break;
+ case CaptureEvent::Finished:
+ captureCaptureUpdateFinished(ev.capSession());
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case CaptureEvent::Fixed:
+ switch (ev.eventType()) {
+ case CaptureEvent::Finished:
+ captureCaptureFixedFinished(ev.capSession());
+ break;
+ default:
+ break;
+ }
+ break;
+#endif
+ }
+}
+
void MainWindow::captureFileOpened() {
if (capture_file_.window() != this) return;
emit setDissectedCaptureFile(capture_file_.capFile());
}
-void MainWindow::captureFileRetapStarted()
-{
- // XXX Push a status message?
- freeze();
-}
-
-void MainWindow::captureFileRetapFinished()
-{
- thaw();
-}
-
-void MainWindow::captureFileMergeStarted()
-{
- main_ui_->statusBar->popFileStatus();
- QString msg = tr("Merging files");
- QString msgtip = QString();
- main_ui_->statusBar->pushFileStatus(msg, msgtip);
-}
-
-void MainWindow::captureFileMergeFinished()
-{
- main_ui_->statusBar->popFileStatus();
-}
-
-void MainWindow::captureFileFlushTapsData()
-{
- draw_tap_listeners(FALSE);
-}
-
void MainWindow::captureFileClosing() {
setMenusForCaptureFile(true);
setForCapturedPackets(false);
#endif
}
-void MainWindow::captureFileSaveStarted(const QString &file_path)
-{
- QFileInfo file_info(file_path);
- main_ui_->statusBar->popFileStatus();
- main_ui_->statusBar->pushFileStatus(tr("Saving %1" UTF8_HORIZONTAL_ELLIPSIS).arg(file_info.baseName()));
-}
-
struct filter_expression_data
{
MainWindow* window;
dfb_action->setProperty(dfe_property_label_, QString(fe->label));
dfb_action->setProperty(dfe_property_expression_, QString(fe->expression));
+ if (data->actions_added) {
+ QFrame *sep = new QFrame();
+ sep->setEnabled(false);
+ data->window->filter_expression_toolbar_->addWidget(sep);
+ }
data->window->filter_expression_toolbar_->addAction(dfb_action);
connect(dfb_action, SIGNAL(triggered()), data->window, SLOT(displayFilterButtonClicked()));
data->actions_added = true;
data.window = this;
data.actions_added = false;
+ // Hiding and showing seems to be the only way to get the layout to
+ // work correctly in some cases. See bug 14121 for details.
+ setUpdatesEnabled(false);
+ filter_expression_toolbar_->hide();
filter_expression_toolbar_->clear();
// XXX Add a context menu for removing and changing buttons.
filter_expression_iterate_expressions(filter_expression_add_action, &data);
- if (data.actions_added) {
- main_ui_->displayFilterToolBar->adjustSize();
- }
+ filter_expression_toolbar_->show();
+ setUpdatesEnabled(true);
}
//
collect_ifaces(&global_capture_opts);
CaptureFile::globalCapFile()->window = this;
+ info_data_.ui.ui = this;
if (capture_start(&global_capture_opts, &cap_session_, &info_data_, main_window_update)) {
capture_options *capture_opts = cap_session_.capture_opts;
GString *interface_names;
}
recentMenu->clear();
-// #if defined(QT_WINEXTRAS_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
-// QWinJumpList recent_jl(this);
-// QWinJumpListCategory *recent_jlc = recent_jl.recent();
-// if (recent_jlc) {
-// recent_jlc->clear();
-// recent_jlc->setVisible(true);
-// }
-// #endif
-#if defined(Q_OS_MAC) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
+#if 0
+#if defined(QT_WINEXTRAS_LIB)
+ QWinJumpList recent_jl(this);
+ QWinJumpListCategory *recent_jlc = recent_jl.recent();
+ if (recent_jlc) {
+ recent_jlc->clear();
+ recent_jlc->setVisible(true);
+ }
+#endif
+#endif
+#if defined(Q_OS_MAC)
if (!dock_menu_) {
dock_menu_ = new QMenu();
dock_menu_->setAsDockMenu();
ra->setText(action_cf_name);
connect(ra, SIGNAL(triggered()), this, SLOT(recentActionTriggered()));
-// This is slow, at least on my VM here. The added links also open Wireshark
-// in a new window. It might make more sense to add a recent item when we
-// open a capture file.
-// #if defined(QT_WINEXTRAS_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
-// if (recent_jlc) {
-// QFileInfo fi(ri->filename);
-// QWinJumpListItem *jli = recent_jlc->addLink(
-// fi.fileName(),
-// QApplication::applicationFilePath(),
-// QStringList() << "-r" << ri->filename
-// );
-// // XXX set icon
-// jli->setWorkingDirectory(QDir::toNativeSeparators(QApplication::applicationDirPath()));
-// }
-// #endif
-#if defined(Q_OS_MAC) && QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
+/* This is slow, at least on my VM here. The added links also open Wireshark
+ * in a new window. It might make more sense to add a recent item when we
+ * open a capture file. */
+#if 0
+#if defined(QT_WINEXTRAS_LIB)
+ if (recent_jlc) {
+ QFileInfo fi(ri->filename);
+ QWinJumpListItem *jli = recent_jlc->addLink(
+ fi.fileName(),
+ QApplication::applicationFilePath(),
+ QStringList() << "-r" << ri->filename
+ );
+ // XXX set icon
+ jli->setWorkingDirectory(QDir::toNativeSeparators(QApplication::applicationDirPath()));
+ }
+#endif
+#endif
+#if defined(Q_OS_MAC)
QAction *rda = new QAction(dock_menu_);
QFileInfo fi(ri->filename);
rda->setText(fi.fileName());
next_selection_history = packet_list_->haveNextHistory();
previous_selection_history = packet_list_->havePreviousHistory();
have_frames = capture_file_.capFile()->count > 0;
- have_marked = frame_selected && capture_file_.capFile()->marked_count > 0;
+ have_marked = capture_file_.capFile()->marked_count > 0;
another_is_marked = have_marked &&
- !(capture_file_.capFile()->marked_count == 1 && capture_file_.capFile()->current_frame->flags.marked);
+ !(capture_file_.capFile()->marked_count == 1 && frame_selected && capture_file_.capFile()->current_frame->flags.marked);
have_filtered = capture_file_.capFile()->displayed_count > 0 && capture_file_.capFile()->displayed_count != capture_file_.capFile()->count;
have_ignored = capture_file_.capFile()->ignored_count > 0;
have_time_ref = capture_file_.capFile()->ref_time_count > 0;
- another_is_time_ref = frame_selected && have_time_ref &&
- !(capture_file_.capFile()->ref_time_count == 1 && capture_file_.capFile()->current_frame->flags.ref_time);
+ another_is_time_ref = have_time_ref &&
+ !(capture_file_.capFile()->ref_time_count == 1 && frame_selected && capture_file_.capFile()->current_frame->flags.ref_time);
if (capture_file_.capFile()->edt)
{
main_ui_->actionEditCopyValue->setEnabled(can_match_selected);
main_ui_->actionEditCopyAsFilter->setEnabled(can_match_selected);
- main_ui_->actionContextShowPacketBytes->setEnabled(have_packet_bytes);
+ main_ui_->actionAnalyzeShowPacketBytes->setEnabled(have_packet_bytes);
main_ui_->actionFileExportPacketBytes->setEnabled(have_packet_bytes);
main_ui_->actionViewExpandSubtrees->setEnabled(have_subtree);
+ main_ui_->actionViewCollapseSubtrees->setEnabled(have_subtree);
main_ui_->actionGoGoToLinkedPacket->setEnabled(is_framenum);
main_ui_->filterExpressionFrame->addExpression(df_combo_box_->lineEdit()->text());
}
-// On Qt4 + macOS with unifiedTitleAndToolBarOnMac set it's possible to make
-// the main window obnoxiously wide.
-
void MainWindow::displayFilterButtonClicked()
{
QAction *dfb_action = qobject_cast<QAction*>(sender());
if (!capture_file_.capFile() || !capture_file_.capFile()->finfo_selected) return;
- file_name = QFileDialog::getSaveFileName(this,
+ file_name = WiresharkFileDialog::getSaveFileName(this,
wsApp->windowTitleString(tr("Export Selected Packet Bytes")),
wsApp->lastOpenDir().canonicalPath(),
tr("Raw data (*.bin *.dat *.raw);;All Files (" ALL_FILES_WILDCARD ")")
}
}
-void MainWindow::on_actionContextShowPacketBytes_triggered()
+void MainWindow::on_actionAnalyzeShowPacketBytes_triggered()
{
ShowPacketBytesDialog *spbd = new ShowPacketBytesDialog(*this, capture_file_);
spbd->show();
}
save_title.append(wsApp->windowTitleString(tr("Export SSL Session Keys (%Ln key(s))", "", keylist_len)));
- file_name = QFileDialog::getSaveFileName(this,
+ file_name = WiresharkFileDialog::getSaveFileName(this,
save_title,
wsApp->lastOpenDir().canonicalPath(),
tr("SSL Session Keys (*.keys *.txt);;All Files (" ALL_FILES_WILDCARD ")")
void MainWindow::on_actionFilePrint_triggered()
{
- PrintDialog pdlg(this, capture_file_.capFile());
+ capture_file *cf = capture_file_.capFile();
+ g_return_if_fail(cf);
+ PrintDialog pdlg(this, cf);
pdlg.exec();
}
// Edit Menu
-void MainWindow::recursiveCopyProtoTreeItems(QTreeWidgetItem *item, QString &clip, int ident_level) {
- if (!item->isExpanded()) return;
-
- for (int i_item = 0; i_item < item->childCount(); i_item += 1) {
- clip.append(QString(" ").repeated(ident_level));
- clip.append(item->child(i_item)->text(0));
- clip.append("\n");
-
- recursiveCopyProtoTreeItems(item->child(i_item), clip, ident_level + 1);
- }
-}
-
// XXX This should probably be somewhere else.
void MainWindow::actionEditCopyTriggered(MainWindow::CopySelected selection_type)
{
}
break;
case CopyAllVisibleItems:
- for (int i_item = 0; i_item < proto_tree_->topLevelItemCount(); i_item += 1) {
- clip.append(proto_tree_->topLevelItem(i_item)->text(0));
- clip.append("\n");
-
- recursiveCopyProtoTreeItems(proto_tree_->topLevelItem(i_item), clip, 1);
- }
-
+ clip = proto_tree_->toString();
break;
case CopyAllVisibleSelectedTreeItems:
- if (proto_tree_->selectedItems().count() > 0) {
- clip.append(proto_tree_->currentItem()->text(0));
- clip.append("\n");
-
- recursiveCopyProtoTreeItems(proto_tree_->currentItem(), clip, 1);
+ if (proto_tree_->selectionModel()->hasSelection()) {
+ clip = proto_tree_->toString(proto_tree_->selectionModel()->selectedIndexes().first());
}
break;
}
freeze();
packet_list_->markFrame();
thaw();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditMarkAllDisplayed_triggered()
freeze();
packet_list_->markAllDisplayedFrames(true);
thaw();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditUnmarkAllDisplayed_triggered()
freeze();
packet_list_->markAllDisplayedFrames(false);
thaw();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditNextMark_triggered()
freeze();
packet_list_->ignoreFrame();
thaw();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditIgnoreAllDisplayed_triggered()
freeze();
packet_list_->ignoreAllDisplayedFrames(true);
thaw();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditUnignoreAllDisplayed_triggered()
freeze();
packet_list_->ignoreAllDisplayedFrames(false);
thaw();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditSetTimeReference_triggered()
{
packet_list_->setTimeReference();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditUnsetAllTimeReferences_triggered()
{
packet_list_->unsetAllTimeReferences();
+ setMenusForSelectedPacket();
}
void MainWindow::on_actionEditNextTimeReference_triggered()
cp_dialog.exec();
}
-void MainWindow::showPreferencesDialog(PreferencesDialog::PreferencesPane start_pane)
-{
- PreferencesDialog pref_dialog(this);
-
- saveWindowGeometry(); // Save in case the layout panes are rearranged
-
- pref_dialog.setPane(start_pane);
- pref_dialog.exec();
-
- // Emitting PacketDissectionChanged directly from a QDialog can cause
- // problems on macOS.
- wsApp->flushAppSignals();
-}
-
-void MainWindow::showPreferencesDialog(QString module_name)
+void MainWindow::showPreferencesDialog(QString pane_name)
{
PreferencesDialog pref_dialog(this);
saveWindowGeometry(); // Save in case the layout panes are rearranged
- pref_dialog.setPane(module_name);
+ pref_dialog.setPane(pane_name);
pref_dialog.exec();
// Emitting PacketDissectionChanged directly from a QDialog can cause
void MainWindow::on_actionEditPreferences_triggered()
{
- showPreferencesDialog();
+ showPreferencesDialog(PrefsModel::APPEARANCE_PREFERENCE_TREE_NAME);
}
// View Menu
void MainWindow::on_actionViewColorizePacketList_triggered(bool checked) {
recent.packet_list_colorize = checked;
- packet_list_enable_color(checked);
+ packet_list_recolor_packets();
packet_list_->packetListModel()->resetColorized();
}
if (!export_action)
return;
- new ExportObjectDialog(*this, capture_file_, export_action->exportObject());
+ ExportObjectDialog* export_dialog = new ExportObjectDialog(*this, capture_file_, export_action->exportObject());
+
+ connect(export_dialog->getExportObjectView(), SIGNAL(goToPacket(int)),
+ packet_list_, SLOT(goToPacket(int)));
+
}
// XXX We could probably create the analyze and prepare actions
reloadLuaPlugins();
}
-void MainWindow::openFollowStreamDialog(follow_type_t type) {
+void MainWindow::openFollowStreamDialog(follow_type_t type, int stream_num) {
FollowStreamDialog *fsd = new FollowStreamDialog(*this, capture_file_, type);
connect(fsd, SIGNAL(updateFilter(QString, bool)), this, SLOT(filterPackets(QString, bool)));
connect(fsd, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
fsd->show();
- fsd->follow(getFilter());
+ if (stream_num >= 0) {
+ // If a specific conversation was requested, then ignore any previous
+ // display filters and display all related packets.
+ fsd->follow("", true, stream_num);
+ } else {
+ fsd->follow(getFilter());
+ }
}
void MainWindow::on_actionAnalyzeFollowTCPStream_triggered()
ConversationDialog *conv_dialog = new ConversationDialog(*this, capture_file_, GPOINTER_TO_INT(userdata), arg);
connect(conv_dialog, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
this, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)));
- connect(conv_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)),
- this, SLOT(openFollowStreamDialog(follow_type_t)));
+ connect(conv_dialog, SIGNAL(openFollowStreamDialog(follow_type_t,int)),
+ this, SLOT(openFollowStreamDialog(follow_type_t,int)));
connect(conv_dialog, SIGNAL(openTcpStreamGraph(int)),
this, SLOT(openTcpStreamDialog(int)));
conv_dialog->show();
openStatisticsTreeDialog("http_srv");
}
+void MainWindow::on_actionStatisticsHTTPRequestSequences_triggered()
+{
+ openStatisticsTreeDialog("http_seq");
+}
+
void MainWindow::on_actionStatisticsPacketLengths_triggered()
{
openStatisticsTreeDialog("plen");
}
}
-#ifdef HAVE_EXTCAP
void MainWindow::extcap_options_finished(int result)
{
if (result == QDialog::Accepted) {
void MainWindow::showExtcapOptionsDialog(QString &device_name)
{
ExtcapOptionsDialog * extcap_options_dialog = ExtcapOptionsDialog::createForDevice(device_name, this);
+ extcap_options_dialog->setModal(true);
/* The dialog returns null, if the given device name is not a valid extcap device */
if (extcap_options_dialog) {
connect(extcap_options_dialog, SIGNAL(finished(int)),
extcap_options_dialog->show();
}
}
-#endif
-
-void MainWindow::on_actionContextCopyBytesHexTextDump_triggered()
-{
- QAction *ca = qobject_cast<QAction*>(sender());
- if (!ca) return;
-
- IDataPrintable * fieldInfo =
- VariantPointer<IDataPrintable>::asPtr(ca->property("idataprintable_"));
- if ( ! fieldInfo )
- return;
-
- DataPrinter printer;
- printer.toClipboard(DataPrinter::DP_HexDump, fieldInfo);
-}
-
-void MainWindow::on_actionContextCopyBytesHexDump_triggered()
-{
- QAction *ca = qobject_cast<QAction*>(sender());
- if (!ca) return;
-
- IDataPrintable * fieldInfo =
- VariantPointer<IDataPrintable>::asPtr(ca->property("idataprintable_"));
- if ( ! fieldInfo )
- return;
-
- DataPrinter printer;
- printer.toClipboard(DataPrinter::DP_HexOnly, fieldInfo);
-}
-
-void MainWindow::on_actionContextCopyBytesPrintableText_triggered()
-{
- QAction *ca = qobject_cast<QAction*>(sender());
- if (!ca) return;
-
- IDataPrintable * fieldInfo =
- VariantPointer<IDataPrintable>::asPtr(ca->property("idataprintable_"));
- if ( ! fieldInfo )
- return;
-
- DataPrinter printer;
- printer.toClipboard(DataPrinter::DP_PrintableText, fieldInfo);
-}
-
-void MainWindow::on_actionContextCopyBytesHexStream_triggered()
-{
- QAction *ca = qobject_cast<QAction*>(sender());
- if (!ca) return;
-
- IDataPrintable * fieldInfo =
- VariantPointer<IDataPrintable>::asPtr(ca->property("idataprintable_"));
- if ( ! fieldInfo )
- return;
-
- DataPrinter printer;
- printer.toClipboard(DataPrinter::DP_HexStream, fieldInfo);
-}
-
-void MainWindow::on_actionContextCopyBytesBinary_triggered()
-{
- QAction *ca = qobject_cast<QAction*>(sender());
- if (!ca) return;
-
- IDataPrintable * fieldInfo =
- VariantPointer<IDataPrintable>::asPtr(ca->property("idataprintable_"));
- if ( ! fieldInfo )
- return;
-
- DataPrinter printer;
- printer.toClipboard(DataPrinter::DP_Binary, fieldInfo);
-}
-
-void MainWindow::on_actionContextCopyBytesEscapedString_triggered()
-{
- QAction *ca = qobject_cast<QAction*>(sender());
- if (!ca) return;
-
- IDataPrintable * fieldInfo =
- VariantPointer<IDataPrintable>::asPtr(ca->property("idataprintable_"));
- if ( ! fieldInfo )
- return;
-
- DataPrinter printer;
- printer.toClipboard(DataPrinter::DP_EscapedString, fieldInfo);
-}
void MainWindow::on_actionContextWikiProtocolPage_triggered()
{
void MainWindow::filterToolbarShowPreferences()
{
- emit showPreferencesDialog(PreferencesDialog::ppFilterExpressions);
+ emit showPreferencesDialog(PrefsModel::FILTER_BUTTONS_PREFERENCE_TREE_NAME);
}
int MainWindow::uatRowIndexForFilterExpression(QString label, QString expression)