diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-03-19 15:41:08 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-03-20 13:00:17 -0400 |
| commit | 411acbaa4a1d217e731d3df0b189445117be3b26 (patch) | |
| tree | 49b5c5290058ffb98dd23ec9a7c1a49921254d15 /ui/hexeditor.h | |
| parent | ca1bc587c22928bbd7198813064c9615c3c12771 (diff) | |
Add in progress UI API headers
Diffstat (limited to 'ui/hexeditor.h')
| -rw-r--r-- | ui/hexeditor.h | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/ui/hexeditor.h b/ui/hexeditor.h new file mode 100644 index 00000000..26f877b9 --- /dev/null +++ b/ui/hexeditor.h @@ -0,0 +1,217 @@ +#pragma once + +#include <QtWidgets/QAbstractScrollArea> +#include <QtCore/QTimer> +#include "binaryninjaapi.h" +#include "viewframe.h" +#include "render.h" +#include "menus.h" +#include "statusbarwidget.h" +#include "uicontext.h" + +#define HEX_EDITOR_UPDATE_CHECK_INTERVAL 200 + +class BINARYNINJAUIAPI HexEditor : public QAbstractScrollArea, public View, public PreviewScrollHandler, + public BinaryNinja::BinaryDataNotification +{ + Q_OBJECT +public: + explicit HexEditor(BinaryViewRef data, ViewFrame* view, uint64_t startAddr = 0); + virtual ~HexEditor(); + + virtual bool canAssemble() override { return true; } + virtual bool canCompile() override { return true; } + + virtual BinaryViewRef getData() override { return m_data; } + virtual uint64_t getCurrentOffset() override; + virtual void getSelectionOffsets(uint64_t& begin, uint64_t& end) override; + virtual bool navigate(uint64_t pos) override; + + virtual void OnBinaryDataWritten(BinaryNinja::BinaryView* data, uint64_t offset, size_t len) override; + virtual void OnBinaryDataInserted(BinaryNinja::BinaryView* data, uint64_t offset, size_t len) override; + virtual void OnBinaryDataRemoved(BinaryNinja::BinaryView* data, uint64_t offset, uint64_t len) override; + + virtual void writeData(const BinaryNinja::DataBuffer& data) override; + virtual void selectAll(); + virtual void selectNone(); + + void setSelectionRange(uint64_t begin, uint64_t end); + + virtual void updateFonts() override; + + virtual StatusBarWidget* getStatusBarWidget() override; + + virtual void followPointer(); + + void setHighlightMode(HexEditorHighlightMode mode); + void setColorMode(HexEditorColorMode mode); + void setContrast(HexEditorHighlightContrast mode); + + virtual void sendWheelEvent(QWheelEvent* event) override; + + QFont getFont() override { return m_render.getFont(); } + + static void registerActions(); + +private: + class HexEditorHighlightWidget: public QLabel + { + public: + HexEditorHighlightWidget(HexEditor* parent); + + protected: + virtual void mousePressEvent(QMouseEvent* event); + virtual void enterEvent(QEvent* event); + virtual void leaveEvent(QEvent* event); + + private: + HexEditor* m_editor; + Menu m_menu; + ContextMenuManager m_contextMenuManager; + }; + + class HexEditorStatusBarWidget: public StatusBarWidget + { + public: + HexEditorStatusBarWidget(HexEditor* parent); + virtual void updateStatus() override; + + private: + HexEditor* m_editor; + HexEditorHighlightWidget* m_highlight; + }; + + struct HexEditorLine + { + bool separator; + uint64_t addr; + size_t len; + }; + + uint64_t getStart(); + uint64_t getEnd(); + uint64_t getLength(); + + void updateRanges(); + + void adjustSize(int width, int height); + + uint64_t getContiguousOffsetForAddress(uint64_t addr); + uint64_t getAddressForContiguousOffset(uint64_t offset); + + void setTopToAddress(uint64_t addr); + void refreshLines(); + void refreshAtCurrentLocation(); + bool cachePreviousLines(); + bool cacheNextLines(); + void updateCache(); + void scrollLines(int count); + + uint64_t getCursorPos(); + void setCursorPos(uint64_t pos); + void repositionCaret(); + void updateCaret(); + void bindActions(); + + std::pair<uint64_t, uint64_t> getSelectionRange(); + bool isSelectionActive(); + + void goToAddress(bool selection); + void searchRegEx(); + void findNext(); + + void inputByte(uint8_t byte); + void inputHexDigit(uint8_t digit); + + void adjustAddressAfterBackwardMovement(); + void adjustAddressAfterForwardMovement(); + + void left(size_t count, bool selecting); + void right(size_t count, bool selecting); + void up(bool selecting); + void down(bool selecting); + void pageUp(bool selecting); + void pageDown(bool selecting); + void moveToStartOfLine(bool selecting); + void moveToEndOfLine(bool selecting); + void moveToStartOfView(bool selecting); + void moveToEndOfView(bool selecting); + void toggleHexOrAscii(); + void toggleInsertMode(); + void deleteBack(); + void deleteForward(); + + BinaryViewRef m_data; + ViewFrame* m_view; + + std::vector<HexEditorLine> m_lines; + size_t m_topLine; + uint64_t m_topAddr, m_bottomAddr; + + std::vector<BNAddressRange> m_ranges; + uint64_t m_allocatedLength; + uint64_t m_scrollBarMultiplier; + int m_wheelDelta; + bool m_updatingScrollBar; + bool m_updatesRequired; + + uint64_t m_minAddr; + uint64_t m_cursorAddr, m_prevCursorAddr; + int m_cursorOffset; + uint64_t m_selectionStartAddr; + int m_cols, m_visibleRows; + int m_lastMouseX, m_lastMouseY; + bool m_selectionVisible; + bool m_cursorAscii; + bool m_caretVisible, m_caretBlink; + bool m_insertMode; + bool m_leftButtonDown; + QString m_status; + QTimer* m_cursorTimer; + QTimer* m_updateTimer; + Qt::KeyboardModifiers m_ctrl, m_command; + + RenderContext m_render; + HexEditorHighlightState m_highlightState; + + ContextMenuManager m_contextMenuManager; + +protected: + virtual void resizeEvent(QResizeEvent* event) override; + virtual void paintEvent(QPaintEvent* event) override; + virtual void focusInEvent(QFocusEvent* event) override; + virtual void focusOutEvent(QFocusEvent* event) override; + virtual void keyPressEvent(QKeyEvent* event) override; + virtual void keyReleaseEvent(QKeyEvent* event) override; + virtual void mousePressEvent(QMouseEvent* event) override; + virtual void mouseMoveEvent(QMouseEvent* event) override; + virtual void mouseReleaseEvent(QMouseEvent* event) override; + virtual bool event(QEvent* event) override; + virtual void wheelEvent(QWheelEvent* event) override; + +Q_SIGNALS: + +public Q_SLOTS: + void disassembly(); + void createFunc(); + void createFuncWithPlatform(PlatformRef platform); + +private Q_SLOTS: + void scrollBarMoved(int value); + void scrollBarAction(int action); + void cursorTimerEvent(); + void updateTimerEvent(); +}; + +class HexEditorViewType: public ViewType +{ + static HexEditorViewType* m_instance; + +public: + HexEditorViewType(); + virtual int getPriority(BinaryViewRef data, const QString& filename) override; + virtual QWidget* create(BinaryViewRef data, ViewFrame* viewFrame) override; + virtual QString getDisplayName(BinaryViewTypeRef type) override; + virtual QString getDisplayLongName(BinaryViewTypeRef type) override; + static void init(); +}; |
