1 /*
2  * Copyright 2017 CodiLime
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 #pragma once
18 
19 #include <QGroupBox>
20 #include <QLabel>
21 #include <QMainWindow>
22 #include <QSharedPointer>
23 #include <QSplitter>
24 #include <QStringList>
25 #include <QToolBar>
26 #include <QToolButton>
27 #include <QTreeView>
28 #include <QWidget>
29 #include <QWidgetAction>
30 
31 #include "dbif/info.h"
32 #include "dbif/types.h"
33 #include "ui/dialogs/searchdialog.h"
34 #include "ui/dockwidget.h"
35 #include "ui/fileblobmodel.h"
36 #include "ui/hexedit.h"
37 #include "visualization/base.h"
38 
39 namespace veles {
40 namespace ui {
41 
42 class HexEditWidget : public IconAwareView {
43   Q_OBJECT
44 
45  public:
46   explicit HexEditWidget(
47       MainWindowWithDetachableDockWidgets* main_window,
48       const QSharedPointer<FileBlobModel>& data_model,
49       const QSharedPointer<QItemSelectionModel>& selection_model);
50   void setParserIds(const QStringList& ids);
51   QString addressAsText(qint64 addr);
uploadAction()52   QAction* uploadAction() const { return upload_act_; }
undoAction()53   QAction* undoAction() const { return undo_act_; }
discardAction()54   QAction* discardAction() const { return discard_act_; }
findAction()55   QAction* findAction() const { return find_act_; }
findNextAction()56   QAction* findNextAction() const { return find_next_act_; }
showVisualizationAction()57   QAction* showVisualizationAction() const { return visualization_act_; }
showHexEditAction()58   QAction* showHexEditAction() const { return show_hex_edit_act_; }
showNodeTreeAction()59   QAction* showNodeTreeAction() const { return show_node_tree_act_; }
addColumnAction()60   QAction* addColumnAction() const { return add_column_act_; }
removeColumnAction()61   QAction* removeColumnAction() const { return remove_column_act_; }
62 
63  signals:
64   void showNodeTree(bool show);
65   void showMinimap(bool show);
66 
67  public slots:
68   void nodeTreeVisibilityChanged(bool visibility);
69   void minimapVisibilityChanged(bool visibility);
70 
71  private slots:
72   void parse(QAction* action);
73   void findNext();
74   void showSearchDialog();
75   void saveAs();
76   void showVisualization();
77   void openHexEditor();
78   void newBinData();
79   void enableFindNext(bool enable);
80   void selectionChanged(qint64 start_addr, qint64 selection_size);
81   void editStateChanged(bool has_changes, bool has_undo);
82   void addColumn();
83   void removeColumn();
84 
85  private:
86   void addChunk(const QString& name, const QString& type,
87                 const QString& comment, uint64_t start, uint64_t end,
88                 const QModelIndex& index = QModelIndex());
89   void setupDataModelHandlers();
90 
91   void createActions();
92   void createToolBars();
93   void initParsersMenu();
94   void createSelectionInfo();
95 
96   MainWindowWithDetachableDockWidgets* main_window_;
97 
98   QToolBar* file_tool_bar_;
99   QToolBar* edit_tool_bar_;
100   QToolBar* tools_tool_bar_;
101   QToolBar* view_tool_bar_;
102 
103   QAction* save_as_act_;
104   QAction* upload_act_;
105   QAction* undo_act_;
106   QAction* discard_act_;
107   // QAction* redo_act_;
108   QAction* find_act_;
109   QAction* find_next_act_;
110   QAction* visualization_act_;
111   QAction* show_node_tree_act_;
112   QAction* show_minimap_act_;
113   QAction* show_hex_edit_act_;
114   QAction* add_column_act_;
115   QAction* remove_column_act_;
116   QWidgetAction* auto_resize_act_;
117   QCheckBox* auto_resize_checkbox_;
118   QAction* change_edit_mode_act_;
119   QPushButton* change_edit_mode_button_;
120 
121   SearchDialog* search_dialog_;
122   HexEdit* hex_edit_;
123 
124   QSharedPointer<FileBlobModel> data_model_;
125   QSharedPointer<QItemSelectionModel> selection_model_;
126 
127   QStringList parsers_ids_;
128   QMenu parsers_menu_;
129   QLabel* selection_label_;
130 };
131 
132 }  // namespace ui
133 }  // namespace veles
134