aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/proto_tree.h
blob: 4fee161cc84c52b440dc420d176fd496fac93d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* proto_tree.h
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef PROTO_TREE_H
#define PROTO_TREE_H

#include <config.h>

#include <epan/proto.h>

#include "cfile.h"

#include "protocol_preferences_menu.h"

#include <ui/qt/utils/field_information.h>
#include <QTreeView>
#include <QMenu>

class ProtoTreeModel;
class ProtoNode;

class ProtoTree : public QTreeView
{
    Q_OBJECT
public:
    explicit ProtoTree(QWidget *parent = 0, epan_dissect_t *edt_fixed = 0);
    QMenu *colorizeMenu() { return &colorize_menu_; }
    void setRootNode(proto_node *root_node);
    void emitRelatedFrame(int related_frame, ft_framenum_type_t framenum_type = FT_FRAMENUM_NONE);
    void autoScrollTo(const QModelIndex &index);
    void goToHfid(int hfid);
    void clear();
    void closeContextMenu();
    void restoreSelectedField();
    QString toString(const QModelIndex &start_idx = QModelIndex()) const;

protected:

    enum {
        Name = 0,
        Description,
        Value
    } CopyInfos;

    virtual void contextMenuEvent(QContextMenuEvent *event);
    void protoTreeContextMenu(QContextMenuEvent * event);
    virtual void timerEvent(QTimerEvent *event);
    virtual void keyReleaseEvent(QKeyEvent *event);
    virtual bool eventFilter(QObject * obj, QEvent * ev);
    virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);

    QString traverseTree(const QModelIndex & rootNode, int identLevel = 0) const;

private:
    ProtoTreeModel *proto_tree_model_;
    QMenu ctx_menu_;
    QMenu conv_menu_;
    QMenu colorize_menu_;
    ProtocolPreferencesMenu proto_prefs_menu_;
    QAction *decode_as_;
    QList<QAction *> copy_actions_;
    QFont mono_font_;
    int column_resize_timer_;
    QList<QPair<int,int> > selected_hfid_path_; // row, hfinfo

    QPoint drag_start_position_;

    capture_file *cap_file_;
    epan_dissect_t *edt_;

    void saveSelectedField(QModelIndex &index);
    static void foreachTreeNode(proto_node *node, gpointer proto_tree_ptr);

signals:
    void fieldSelected(FieldInformation *);
    void openPacketInNewWindow(bool);
    void goToPacket(int);
    void relatedFrame(int, ft_framenum_type_t);
    void showProtocolPreferences(const QString module_name);
    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 syncExpanded(const QModelIndex & index);
    void syncCollapsed(const QModelIndex & index);
    void expandSubtrees();
    void collapseSubtrees();
    void expandAll();
    void collapseAll();
    void itemDoubleClicked(const QModelIndex & index);
    void selectedFieldChanged(FieldInformation *);

protected slots:
    void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
#if 0
    void ctxShowPacketBytes();
    void ctxExportPacketBytes();
#endif
    void ctxCopyVisibleItems();
    void ctxCopyAsFilter();
    void ctxCopySelectedInfo();
    void ctxOpenUrlWiki();

private slots:
    void updateContentWidth();
};

#endif // PROTO_TREE_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:
 */