QHexEdit
qhexedit.h
1 #ifndef QHEXEDIT_H
2 #define QHEXEDIT_H
3 
4 #include <QAbstractScrollArea>
5 #include <QPen>
6 #include <QBrush>
7 
8 #include "chunks.h"
9 #include "commands.h"
10 
51 class QHexEdit : public QAbstractScrollArea
52 {
53  Q_OBJECT
54 
58  Q_PROPERTY(bool addressArea READ addressArea WRITE setAddressArea)
59 
60 
63  Q_PROPERTY(QColor addressAreaColor READ addressAreaColor WRITE setAddressAreaColor)
64 
70  Q_PROPERTY(qint64 addressOffset READ addressOffset WRITE setAddressOffset)
71 
74  Q_PROPERTY(int addressWidth READ addressWidth WRITE setAddressWidth)
75 
78  Q_PROPERTY(bool asciiArea READ asciiArea WRITE setAsciiArea)
79 
84  Q_PROPERTY(qint64 cursorPosition READ cursorPosition WRITE setCursorPosition)
85 
91  Q_PROPERTY(QByteArray data READ data WRITE setData NOTIFY dataChanged)
92 
95  Q_PROPERTY(bool highlighting READ highlighting WRITE setHighlighting)
96 
101  Q_PROPERTY(QColor highlightingColor READ highlightingColor WRITE setHighlightingColor)
102 
108  Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
109 
114  Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor)
115 
121  Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
122 
124  Q_PROPERTY(QFont font READ font WRITE setFont)
125 
126 public:
130  QHexEdit(QWidget *parent=0);
131 
132  // Access to data of qhexedit
133 
138  bool setData(QIODevice &iODevice);
139 
143  QByteArray dataAt(qint64 pos, qint64 count=-1);
144 
148  bool write(QIODevice &iODevice, qint64 pos=0, qint64 count=-1);
149 
150 
151  // Char handling
152 
158  void insert(qint64 pos, char ch);
159 
164  void remove(qint64 pos, qint64 len=1);
165 
171  void replace(qint64 pos, char ch);
172 
173 
174  // ByteArray handling
175 
181  void insert(qint64 pos, const QByteArray &ba);
182 
189  void replace(qint64 pos, qint64 len, const QByteArray &ba);
190 
191 
192  // Utility functioins
197  qint64 cursorPosition(QPoint point);
198 
201  void ensureVisible();
202 
208  qint64 indexOf(const QByteArray &ba, qint64 from);
209 
213  bool isModified();
214 
220  qint64 lastIndexOf(const QByteArray &ba, qint64 from);
221 
224  QString selectionToReadableString();
225 
229  virtual void setFont(const QFont &font);
230 
233  QString toReadableString();
234 
235 
236 public slots:
240  void redo();
241 
245  void undo();
246 
247 signals:
248 
250  void currentAddressChanged(qint64 address);
251 
253  void currentSizeChanged(qint64 size);
254 
256  void dataChanged();
257 
259  void overwriteModeChanged(bool state);
260 
261 
263 public:
264  ~QHexEdit();
265 
266  // Properties
267  bool addressArea();
268  void setAddressArea(bool addressArea);
269 
270  QColor addressAreaColor();
271  void setAddressAreaColor(const QColor &color);
272 
273  qint64 addressOffset();
274  void setAddressOffset(qint64 addressArea);
275 
276  int addressWidth();
277  void setAddressWidth(int addressWidth);
278 
279  bool asciiArea();
280  void setAsciiArea(bool asciiArea);
281 
282  qint64 cursorPosition();
283  void setCursorPosition(qint64 position);
284 
285  QByteArray data();
286  void setData(const QByteArray &ba);
287 
288  bool highlighting();
289  void setHighlighting(bool mode);
290 
291  QColor highlightingColor();
292  void setHighlightingColor(const QColor &color);
293 
294  bool overwriteMode();
295  void setOverwriteMode(bool overwriteMode);
296 
297  bool isReadOnly();
298  void setReadOnly(bool readOnly);
299 
300  QColor selectionColor();
301  void setSelectionColor(const QColor &color);
302 
303 protected:
304  // Handle events
305  void keyPressEvent(QKeyEvent *event);
306  void mouseMoveEvent(QMouseEvent * event);
307  void mousePressEvent(QMouseEvent * event);
308  void paintEvent(QPaintEvent *event);
309  void resizeEvent(QResizeEvent *);
310 
311 private:
312  // Handle selections
313  void resetSelection(qint64 pos); // set selectionStart and selectionEnd to pos
314  void resetSelection(); // set selectionEnd to selectionStart
315  void setSelection(qint64 pos); // set min (if below init) or max (if greater init)
316  int getSelectionBegin();
317  int getSelectionEnd();
318 
319  // Private utility functions
320  void init();
321  void readBuffers();
322  QString toReadable(const QByteArray &ba);
323 
324 private slots:
325  void adjust(); // recalc pixel positions
326  void dataChangedPrivate(int idx=0); // emit dataChanged() signal
327  void refresh(); // ensureVisible() and readBuffers()
328  void updateCursor(); // update blinking cursor
329 
330 private:
331  // Name convention: pixel positions start with _px
332  int _pxCharWidth, _pxCharHeight; // char dimensions (dpendend on font)
333  int _pxPosHexX; // X-Pos of HeaxArea
334  int _pxPosAdrX; // X-Pos of Address Area
335  int _pxPosAsciiX; // X-Pos of Ascii Area
336  int _pxGapAdr; // gap left from AddressArea
337  int _pxGapAdrHex; // gap between AddressArea and HexAerea
338  int _pxGapHexAscii; // gap between HexArea and AsciiArea
339  int _pxCursorWidth; // cursor width
340  int _pxSelectionSub; // offset selection rect
341  int _pxCursorX; // current cursor pos
342  int _pxCursorY; // current cursor pos
343 
344  // Name convention: absolute byte positions in chunks start with _b
345  qint64 _bSelectionBegin; // first position of Selection
346  qint64 _bSelectionEnd; // end of Selection
347  qint64 _bSelectionInit; // memory position of Selection
348  qint64 _bPosFirst; // position of first byte shown
349  qint64 _bPosLast; // position of last byte shown
350  qint64 _bPosCurrent; // current position
351 
352  // variables to store the property values
353  bool _addressArea; // left area of QHexEdit
354  QColor _addressAreaColor;
355  int _addressWidth;
356  bool _asciiArea;
357  qint64 _addressOffset;
358  bool _highlighting;
359  bool _overwriteMode;
360  QBrush _brushSelection;
361  QPen _penSelection;
362  QBrush _brushHighlighted;
363  QPen _penHighlighted;
364  bool _readOnly;
365 
366  // other variables
367  int _addrDigits; // real no of addressdigits, may be > addressWidth
368  bool _blink; // help get cursor blinking
369  QBuffer _bData; // buffer, when setup with QByteArray
370  Chunks *_chunks; // IODevice based access to data
371  QTimer _cursorTimer; // for blinking cursor
372  qint64 _cursorPosition; // absolute positioin of cursor, 1 Byte == 2 tics
373  QRect _cursorRect; // physical dimensions of cursor
374  QByteArray _data; // QHexEdit's data, when setup with QByteArray
375  QByteArray _dataShown; // data in the current View
376  QByteArray _hexDataShown; // data in view, transformed to hex
377  qint64 _lastEventSize; // size, which was emitted last time
378  QByteArray _markedShown; // marked data in view
379  bool _modified; // Is any data in editor modified?
380  int _rowsShown; // lines of text shown
381  UndoStack * _undoStack; // Stack to store edit actions for undo/redo
383 };
384 
385 #endif // QHEXEDIT_H
bool isModified()
QColor selectionColor
Definition: qhexedit.h:114
QByteArray data
Definition: qhexedit.h:91
void currentAddressChanged(qint64 address)
bool overwriteMode
Definition: qhexedit.h:108
QString selectionToReadableString()
Definition: qhexedit.h:51
QColor highlightingColor
Definition: qhexedit.h:101
bool readOnly
Definition: qhexedit.h:121
bool highlighting
Definition: qhexedit.h:95
bool asciiArea
Definition: qhexedit.h:78
void ensureVisible()
virtual void setFont(const QFont &font)
bool write(QIODevice &iODevice, qint64 pos=0, qint64 count=-1)
void dataChanged()
qint64 cursorPosition
Definition: qhexedit.h:84
void overwriteModeChanged(bool state)
void remove(qint64 pos, qint64 len=1)
void currentSizeChanged(qint64 size)
qint64 lastIndexOf(const QByteArray &ba, qint64 from)
void replace(qint64 pos, char ch)
bool setData(QIODevice &iODevice)
qint64 indexOf(const QByteArray &ba, qint64 from)
void redo()
QByteArray dataAt(qint64 pos, qint64 count=-1)
qint64 addressOffset
Definition: qhexedit.h:70
void undo()
bool addressArea
Definition: qhexedit.h:58
int addressWidth
Definition: qhexedit.h:74
QColor addressAreaColor
Definition: qhexedit.h:63
void insert(qint64 pos, char ch)
QString toReadableString()
QFont font
Definition: qhexedit.h:124