/** @file * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef BYTE_VIEW_TEXT_H #define BYTE_VIEW_TEXT_H #include #include "ui/recent.h" #include #include #include #include #include #include #include #include #include #include // XXX - Is there any reason we shouldn't add ByteViewImage, etc? class ByteViewText : public QAbstractScrollArea, public IDataPrintable { Q_OBJECT Q_INTERFACES(IDataPrintable) public: explicit ByteViewText(const QByteArray &data, packet_char_enc encoding = PACKET_CHAR_ENC_CHAR_ASCII, QWidget *parent = 0); ~ByteViewText(); virtual QSize minimumSizeHint() const; void setFormat(bytes_view_type format); bool isEmpty() const; signals: void byteHovered(int pos); void byteSelected(int pos); void byteViewSettingsChanged(); public slots: void setMonospaceFont(const QFont &mono_font); void updateByteViewSettings(); void markProtocol(int start, int length); void markField(int start, int length, bool scroll_to = true); void markAppendix(int start, int length); protected: virtual void paintEvent(QPaintEvent *); virtual void resizeEvent(QResizeEvent *); virtual void mousePressEvent (QMouseEvent * event); virtual void mouseMoveEvent (QMouseEvent * event); virtual void leaveEvent(QEvent *event); virtual void contextMenuEvent(QContextMenuEvent *event); private: // Text highlight modes. typedef enum { ModeNormal, ModeField, ModeProtocol, ModeOffsetNormal, ModeOffsetField, ModeNonPrintable } HighlightMode; QTextLayout *layout_; const QByteArray data_; void updateLayoutMetrics(); int stringWidth(const QString &line); void drawLine(QPainter *painter, const int offset, const int row_y); bool addFormatRange(QList &fmt_list, int start, int length, HighlightMode mode); bool addHexFormatRange(QList &fmt_list, int mark_start, int mark_length, int tvb_offset, int max_tvb_pos, HighlightMode mode); bool addAsciiFormatRange(QList &fmt_list, int mark_start, int mark_length, int tvb_offset, int max_tvb_pos, HighlightMode mode); void scrollToByte(int byte); void updateScrollbars(); int byteOffsetAtPixel(QPoint pos); void createContextMenu(); void updateContextMenu(); int offsetChars(bool include_pad = true); int offsetPixels(); int hexPixels(); int asciiPixels(); int totalPixels(); const QByteArray printableData() { return data_; } static const int separator_interval_; // Colors QColor offset_normal_fg_; QColor offset_field_fg_; // Data packet_char_enc encoding_; // ASCII or EBCDIC QMenu ctx_menu_; // Data highlight int hovered_byte_offset_; int marked_byte_offset_; int proto_start_; int proto_len_; int field_start_; int field_len_; int field_a_start_; int field_a_len_; bool show_offset_; // Should we show the byte offset? bool show_hex_; // Should we show the hex display? bool show_ascii_; // Should we show the ASCII display? int row_width_; // Number of bytes per line int em_width_; // Single character width and text margin. NOTE: Use fontMetrics::width for multiple characters. int line_height_; // Font line spacing QList hover_outlines_; // Hovered byte outlines. bool allow_hover_selection_; // Data selection QVector x_pos_to_column_; // Context menu actions QAction *action_allow_hover_selection_; QAction *action_bytes_hex_; QAction *action_bytes_bits_; QAction *action_bytes_enc_from_packet_; QAction *action_bytes_enc_ascii_; QAction *action_bytes_enc_ebcdic_; private slots: void copyBytes(bool); void setHexDisplayFormat(QAction *action); void setCharacterEncoding(QAction *action); void toggleHoverAllowed(bool); }; #endif // BYTE_VIEW_TEXT_H