From d370f54c47b0bfd640a61783a8823ec288c53503 Mon Sep 17 00:00:00 2001 From: Roland Knall Date: Fri, 14 Jun 2019 13:08:37 -0700 Subject: [PATCH] Qt: Fix Contextmenu for Packetlist The context menu got removed, adding it back Change-Id: Ia44a6ed576a88be5a07d76c184740a2fd9bfa844 Reviewed-on: https://code.wireshark.org/review/33602 Petri-Dish: Roland Knall Tested-by: Petri Dish Buildbot Reviewed-by: Roland Knall --- ui/qt/main_window_slots.cpp | 6 +- ui/qt/packet_list.cpp | 145 ++++++++++++++++++++++++++++++++++++ ui/qt/packet_list.h | 2 + 3 files changed, 151 insertions(+), 2 deletions(-) diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp index bb30ad7df7..6fe9d83935 100644 --- a/ui/qt/main_window_slots.cpp +++ b/ui/qt/main_window_slots.cpp @@ -2586,7 +2586,7 @@ void MainWindow::matchFieldFilter(FilterAction::Action action, FilterAction::Act { QString field_filter; - if (packet_list_->hasFocus()) { + if (packet_list_->contextMenuActive() || packet_list_->hasFocus()) { field_filter = packet_list_->getFilterFromRowAndColumn(); } else if (capture_file_.capFile() && capture_file_.capFile()->finfo_selected) { char *tmp_field = proto_construct_match_selected_string(capture_file_.capFile()->finfo_selected, @@ -2596,7 +2596,9 @@ void MainWindow::matchFieldFilter(FilterAction::Action action, FilterAction::Act } if (field_filter.isEmpty()) { - QString err = tr("No filter available. Try another item").append("."); + QString err = tr("No filter available. Try another "); + err.append(packet_list_->contextMenuActive() ? "column" : "item"); + err.append("."); main_ui_->statusBar->pushTemporaryStatus(err); return; } diff --git a/ui/qt/packet_list.cpp b/ui/qt/packet_list.cpp index 84a9035393..75f15ca7be 100644 --- a/ui/qt/packet_list.cpp +++ b/ui/qt/packet_list.cpp @@ -467,6 +467,146 @@ void PacketList::selectionChanged (const QItemSelection & selected, const QItemS } } +void PacketList::contextMenuEvent(QContextMenuEvent *event) +{ + const char *module_name = NULL; + if (cap_file_ && cap_file_->edt && cap_file_->edt->tree) { + GPtrArray *finfo_array = proto_all_finfos(cap_file_->edt->tree); + + for (guint i = finfo_array->len - 1; i > 0 ; i --) { + field_info *fi = (field_info *)g_ptr_array_index (finfo_array, i); + header_field_info *hfinfo = fi->hfinfo; + + if (!g_str_has_prefix(hfinfo->abbrev, "text") && + !g_str_has_prefix(hfinfo->abbrev, "_ws.expert") && + !g_str_has_prefix(hfinfo->abbrev, "_ws.lua") && + !g_str_has_prefix(hfinfo->abbrev, "_ws.malformed")) { + + if (hfinfo->parent == -1) { + module_name = hfinfo->abbrev; + } else { + module_name = proto_registrar_get_abbrev(hfinfo->parent); + } + break; + } + } + g_ptr_array_free(finfo_array, TRUE); + } + proto_prefs_menu_.setModule(module_name); + + QModelIndex ctxIndex = indexAt(event->pos()); + // frameData will be owned by one of the submenus, see below. + FrameInformation * frameData = + new FrameInformation(new CaptureFile(this, cap_file_), packet_list_model_->getRowFdata(ctxIndex.row())); + + ctx_menu_.clear(); + // XXX We might want to reimplement setParent() and fill in the context + // menu there. + ctx_menu_.addAction(window()->findChild("actionEditMarkPacket")); + ctx_menu_.addAction(window()->findChild("actionEditIgnorePacket")); + ctx_menu_.addAction(window()->findChild("actionEditSetTimeReference")); + ctx_menu_.addAction(window()->findChild("actionEditTimeShift")); + ctx_menu_.addAction(window()->findChild("actionEditPacketComment")); + + ctx_menu_.addSeparator(); + + ctx_menu_.addAction(window()->findChild("actionViewEditResolvedName")); + ctx_menu_.addSeparator(); + + QMenu *main_menu_item = window()->findChild("menuApplyAsFilter"); + QMenu *submenu = new QMenu(main_menu_item->title(), &ctx_menu_); + ctx_menu_.addMenu(submenu); + submenu->addAction(window()->findChild("actionAnalyzeAAFSelected")); + submenu->addAction(window()->findChild("actionAnalyzeAAFNotSelected")); + submenu->addAction(window()->findChild("actionAnalyzeAAFAndSelected")); + submenu->addAction(window()->findChild("actionAnalyzeAAFOrSelected")); + submenu->addAction(window()->findChild("actionAnalyzeAAFAndNotSelected")); + submenu->addAction(window()->findChild("actionAnalyzeAAFOrNotSelected")); + + main_menu_item = window()->findChild("menuPrepareAFilter"); + submenu = new QMenu(main_menu_item->title(), &ctx_menu_); + ctx_menu_.addMenu(submenu); + submenu->addAction(window()->findChild("actionAnalyzePAFSelected")); + submenu->addAction(window()->findChild("actionAnalyzePAFNotSelected")); + submenu->addAction(window()->findChild("actionAnalyzePAFAndSelected")); + submenu->addAction(window()->findChild("actionAnalyzePAFOrSelected")); + submenu->addAction(window()->findChild("actionAnalyzePAFAndNotSelected")); + submenu->addAction(window()->findChild("actionAnalyzePAFOrNotSelected")); + + const char *conv_menu_name = "menuConversationFilter"; + main_menu_item = window()->findChild(conv_menu_name); + conv_menu_.setTitle(main_menu_item->title()); + conv_menu_.setObjectName(conv_menu_name); + ctx_menu_.addMenu(&conv_menu_); + + const char *colorize_menu_name = "menuColorizeConversation"; + main_menu_item = window()->findChild(colorize_menu_name); + colorize_menu_.setTitle(main_menu_item->title()); + colorize_menu_.setObjectName(colorize_menu_name); + ctx_menu_.addMenu(&colorize_menu_); + + main_menu_item = window()->findChild("menuSCTP"); + submenu = new QMenu(main_menu_item->title(), &ctx_menu_); + ctx_menu_.addMenu(submenu); + submenu->addAction(window()->findChild("actionSCTPAnalyseThisAssociation")); + submenu->addAction(window()->findChild("actionSCTPShowAllAssociations")); + submenu->addAction(window()->findChild("actionSCTPFilterThisAssociation")); + + main_menu_item = window()->findChild("menuFollow"); + submenu = new QMenu(main_menu_item->title(), &ctx_menu_); + ctx_menu_.addMenu(submenu); + submenu->addAction(window()->findChild("actionAnalyzeFollowTCPStream")); + submenu->addAction(window()->findChild("actionAnalyzeFollowUDPStream")); + submenu->addAction(window()->findChild("actionAnalyzeFollowTLSStream")); + submenu->addAction(window()->findChild("actionAnalyzeFollowHTTPStream")); + + ctx_menu_.addSeparator(); + + main_menu_item = window()->findChild("menuEditCopy"); + submenu = new QMenu(main_menu_item->title(), &ctx_menu_); + ctx_menu_.addMenu(submenu); + + QAction * action = submenu->addAction(tr("Summary as Text")); + action->setData(copy_summary_text_); + connect(action, SIGNAL(triggered()), this, SLOT(copySummary())); + action = submenu->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as CSV")); + action->setData(copy_summary_csv_); + connect(action, SIGNAL(triggered()), this, SLOT(copySummary())); + action = submenu->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as YAML")); + action->setData(copy_summary_yaml_); + connect(action, SIGNAL(triggered()), this, SLOT(copySummary())); + submenu->addSeparator(); + + submenu->addAction(window()->findChild("actionEditCopyAsFilter")); + submenu->addSeparator(); + + QActionGroup * copyEntries = DataPrinter::copyActions(this, frameData); + submenu->addActions(copyEntries->actions()); + copyEntries->setParent(submenu); + frameData->setParent(submenu); + + ctx_menu_.addSeparator(); + ctx_menu_.addMenu(&proto_prefs_menu_); + decode_as_ = window()->findChild("actionAnalyzeDecodeAs"); + ctx_menu_.addAction(decode_as_); + // "Print" not ported intentionally + action = window()->findChild("actionViewShowPacketInNewWindow"); + ctx_menu_.addAction(action); + + decode_as_->setData(QVariant::fromValue(true)); + ctx_column_ = columnAt(event->x()); + + // Set menu sensitivity for the current column and set action data. + if ( frameData ) + emit frameSelected(frameData->frameNum()); + else + emit frameSelected(-1); + + ctx_menu_.exec(event->globalPos()); + ctx_column_ = -1; + decode_as_->setData(QVariant()); +} + // Auto scroll if: // - We're not at the end // - We are capturing @@ -838,6 +978,11 @@ void PacketList::writeRecent(FILE *rf) { fprintf (rf, "\n"); } +bool PacketList::contextMenuActive() +{ + return ctx_column_ >= 0 ? true : false; +} + QString PacketList::getFilterFromRowAndColumn() { frame_data *fdata; diff --git a/ui/qt/packet_list.h b/ui/qt/packet_list.h index 4eeaeadff8..48fede5c08 100644 --- a/ui/qt/packet_list.h +++ b/ui/qt/packet_list.h @@ -54,6 +54,7 @@ public: void thaw(bool restore_selection = false); void clear(); void writeRecent(FILE *rf); + bool contextMenuActive(); QString getFilterFromRowAndColumn(); void resetColorized(); QString packetComment(); @@ -69,6 +70,7 @@ public: protected: void selectionChanged(const QItemSelection & selected, const QItemSelection & deselected); + void contextMenuEvent(QContextMenuEvent *event); void timerEvent(QTimerEvent *event); void paintEvent(QPaintEvent *event); virtual void mousePressEvent (QMouseEvent *event);