1 /* 2 * Copyright 2004-2015, Axel Dörfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef DATA_VIEW_H 6 #define DATA_VIEW_H 7 8 9 #include <Path.h> 10 #include <String.h> 11 #include <View.h> 12 13 14 class DataEditor; 15 16 17 enum base_type { 18 kHexBase = 16, 19 kDecimalBase = 10 20 }; 21 22 23 enum view_focus { 24 kNoFocus, 25 kHexFocus, 26 kAsciiFocus 27 }; 28 29 30 class DataView : public BView { 31 public: 32 DataView(DataEditor& editor); 33 virtual ~DataView(); 34 35 virtual void DetachedFromWindow(); 36 virtual void AttachedToWindow(); 37 virtual void MessageReceived(BMessage* message); 38 virtual void Draw(BRect updateRect); 39 40 virtual void MouseDown(BPoint where); 41 virtual void MouseMoved(BPoint where, uint32 transit, 42 const BMessage* message); 43 virtual void MouseUp(BPoint where); 44 45 virtual void KeyDown(const char* bytes, int32 numBytes); 46 47 virtual void WindowActivated(bool active); 48 virtual void MakeFocus(bool focus); 49 virtual void FrameResized(float width, float height); 50 virtual void SetFont(const BFont* font, 51 uint32 properties = B_FONT_ALL); 52 virtual void GetPreferredSize(float* _width, float* _height); 53 54 bool FontSizeFitsBounds() const { return fFitFontSize; } 55 float FontSize() const; 56 void SetFontSize(float point); 57 58 void UpdateScroller(); 59 60 void MakeVisible(int32 position); 61 void SetSelection(int32 start, int32 end, 62 view_focus focus = kNoFocus); 63 void GetSelection(int32& start, int32& end); 64 void InvalidateRange(int32 start, int32 end); 65 66 base_type Base() const { return fBase; } 67 void SetBase(base_type type); 68 69 const uint8* DataAt(int32 start); 70 71 static int32 WidthForFontSize(float size); 72 73 private: 74 BRect DataBounds(bool inView = false) const; 75 BRect SelectionFrame(view_focus which, int32 start, 76 int32 end); 77 int32 PositionAt(view_focus focus, BPoint point, 78 view_focus* _newFocus = NULL); 79 80 void DrawSelectionFrame(view_focus which); 81 void DrawSelectionBlock(view_focus which, int32 start, 82 int32 end); 83 void DrawSelectionBlock(view_focus which); 84 void DrawSelection(bool frameOnly = false); 85 void SetActive(bool active); 86 void SetFocus(view_focus which); 87 88 void UpdateFromEditor(BMessage* message = NULL); 89 void ConvertLine(char* line, off_t offset, 90 const uint8* buffer, size_t size); 91 92 bool AcceptsDrop(const BMessage* message); 93 void InitiateDrag(view_focus focus); 94 void Copy(); 95 void Paste(); 96 97 DataEditor& fEditor; 98 uint8* fData; 99 size_t fDataSize; 100 off_t fFileSize; 101 size_t fSizeInView; 102 off_t fOffset; 103 float fAscent; 104 int32 fFontHeight; 105 float fCharWidth; 106 view_focus fFocus; 107 base_type fBase; 108 bool fIsActive; 109 int32 fStart, fEnd; 110 int32 fMouseSelectionStart; 111 int32 fKeySelectionStart; 112 int32 fBitPosition; 113 bool fFitFontSize; 114 int32 fDragMessageSize; 115 int32 fStoredStart, fStoredEnd; 116 }; 117 118 static const uint32 kMsgBaseType = 'base'; 119 static const uint32 kMsgUpdateData = 'updt'; 120 static const uint32 kMsgSetSelection = 'ssel'; 121 122 // observer notices 123 static const uint32 kDataViewCursorPosition = 'curs'; 124 static const uint32 kDataViewSelection = 'dsel'; 125 static const uint32 kDataViewPreferredSize = 'dvps'; 126 127 extern bool is_valid_utf8(uint8* data, size_t size); 128 129 #endif /* DATA_VIEW_H */ 130