1 /* 2 * This file is part of HexEditor plugin for Code::Blocks Studio 3 * Copyright (C) 2008-2009 Bartlomiej Swiecki 4 * 5 * HexEditor plugin is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * HexEditor pluging is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with HexEditor. If not, see <http://www.gnu.org/licenses/>. 17 * 18 * $Revision: 7109 $ 19 * $Id: HexEditViewBase.h 7109 2011-04-15 11:53:16Z mortenmacfly $ 20 * $HeadURL: svn://svn.code.sf.net/p/codeblocks/code/branches/release-20.xx/src/plugins/contrib/HexEditor/HexEditViewBase.h $ 21 */ 22 23 #ifndef HEXEDITVIEWBASE_H 24 #define HEXEDITVIEWBASE_H 25 26 #include "FileContentBase.h" 27 #include "HexEditLineBuffer.h" 28 29 class HexEditPanel; 30 31 32 /** \brief Base class for the view in editor area 33 * 34 * This is base interface used to represent views inside of the editor 35 * (like the hex view or character preview, I don't know anything about 36 * other usages at the momment of writing this peace of code ;) ) 37 * 38 * Offtopic: There's strange story about how this class was created 39 * I tried to make some nice solution for the problem with lack 40 * of editor's flexibility. I tied at least four solutions and 41 * I was dropping the m one after another since more problems 42 * were found while coding. Finally I was so angry about that 43 * that I said "God help me" ... and the solution was just 44 * few hours later, jumped into my mind just with all those 45 * details needed to make it work. Yeah, for me it's a proof 46 * that God really exists and that He cares about the 47 * Open-Source community :) 48 */ 49 class HexEditViewBase 50 { 51 public: 52 53 typedef FileContentBase::OffsetT OffsetT; 54 55 /** \brief Ctor */ 56 HexEditViewBase( HexEditPanel* panel ); 57 58 /** \brief Dctor */ 59 virtual ~HexEditViewBase(); 60 61 /** \brief Activate this view 62 * \return previous active state 63 */ 64 bool SetActive( bool makeMeActive = true ); 65 66 /** \brief Get the active state */ GetActive()67 bool GetActive() { return m_IsActive; } 68 69 /** \brief Calculate size of block at current offset's position */ 70 void CalculateBlockSize( 71 OffsetT screenStartOffset, 72 OffsetT currentOffset, 73 OffsetT& blockStart, 74 OffsetT& blockEnd ); 75 76 /** \brief Jump to given offset and calculate range for current data block 77 * \param screenStartOffset offset of first data byte shown on the screen 78 * \param currentOffset offset of current position 79 * \param blockStart here current block start is put and new value will be stored if wider range is required 80 * \param blockEnd here current block end is put and new value will be storeed if wider range is required 81 * \param positionFlags flags of current position (like which bit of the byte is currently edited), this 82 * argument will be -1 if called can not deduce it's value 83 */ 84 void JumpToOffset( 85 OffsetT screenStartOffset, 86 OffsetT currentOffset, 87 OffsetT blockStart, 88 OffsetT blockEnd, 89 int positionFlags ); 90 91 /** \brief Get scrren start offset */ GetScreenStartOffset()92 OffsetT GetScreenStartOffset() { return m_ScreenStartOffset; } 93 94 /** \brief Get current position offset */ GetCurrentOffset()95 OffsetT GetCurrentOffset() { return m_CurrentOffset; } 96 97 /** \brief Get flags for current offset */ GetCurrentPositionFlags()98 int GetCurrentPositionFlags() { return OnGetCurrentPositionFlags(); } 99 100 /** \brief Get block start offset */ GetBlockStartOffset()101 OffsetT GetBlockStartOffset() { return m_BlockStartOffset; } 102 103 /** \brief Get block end offset */ GetBlockEndOffset()104 OffsetT GetBlockEndOffset() { return m_BlockEndOffset; } 105 106 /** \brief Drop a character into this view 107 * \note If the view is not active, character will not be processed 108 */ 109 void PutChar( wxChar ch ); 110 111 /** \brief Move cursor left */ 112 void MoveLeft(); 113 114 /** \brief Move cursor right */ 115 void MoveRight(); 116 117 /** \brief Move cursor up */ 118 void MoveUp(); 119 120 /** \brief Move cursor down */ 121 void MoveDown(); 122 123 /** \brief Put given line into line buffer */ 124 void PutLine( OffsetT lineStartOffset, HexEditLineBuffer& buffer, char* content, int bytes ); 125 126 /** \brief Get block sizez */ 127 void GetBlockSizes( int& blockLength, int& blockBytes, int& spacing ); 128 129 /** \brief Detect offset from position in line */ 130 int GetOffsetFromColumn( int column, int& positionFlags ); 131 132 protected: 133 134 /** \brief Called when switching the active state */ 135 virtual void OnActivate( bool becomesActive ) = 0; 136 137 /** \brief Detect block start and end at given offset */ 138 virtual void OnCalculateBlockSize( OffsetT& blockStart, OffsetT& blockEnd ); 139 140 /** \brief Called when changing current cursor offset */ 141 virtual void OnOffsetChange( int positionFlags ); 142 143 /** \brief Called when fetching current position flags */ 144 virtual int OnGetCurrentPositionFlags(); 145 146 /** \brief Called when character is sent to this view */ 147 virtual void OnProcessChar( wxChar ) = 0; 148 149 /** \brief Called when moving left */ 150 virtual void OnMoveLeft() = 0; 151 152 /** \brief Called when moving right */ 153 virtual void OnMoveRight() = 0; 154 155 /** \brief Called when moving up */ 156 virtual void OnMoveUp() = 0; 157 158 /** \brief Called when moving down */ 159 virtual void OnMoveDown() = 0; 160 161 /** \brief Called when there's need to fill line buffer for this content */ 162 virtual void OnPutLine( OffsetT startOffset, HexEditLineBuffer& buff, char* content, int bytes ) = 0; 163 164 /** \brief Fetching informations about current data block sizes 165 * \param blockLength length of block in characters 166 * \param blockBytes number of bytes in one block 167 * \param spacing number of characters splitting two blocks next to each other 168 */ 169 virtual void OnGetBlockSizes( int& blockLength, int& blockBytes, int& spacing ) = 0; 170 171 /** \brief Calculate offset from the beginning of the line at given position */ 172 virtual int OnGetOffsetFromColumn( int column, int& positionFlags ) = 0; 173 174 175 /** \brief Fetch assigned file content */ 176 FileContentBase* GetContent(); 177 178 /** \brief Get length of one line */ 179 unsigned int GetLineBytes(); 180 181 /** \brief Notify about offset change 182 * \param currentOffset new current offset 183 */ 184 void OffsetChange( OffsetT currentOffset ); 185 186 /** \brief Notify about content change */ 187 void ContentChange(); 188 189 190 private: 191 192 bool m_IsActive; ///< \brief Set to true if this view is active (has keyboard focus) 193 OffsetT m_ScreenStartOffset; ///< \brief Offset of first data byte shown on the screen 194 OffsetT m_CurrentOffset; ///< \brief Offset of current byte 195 OffsetT m_BlockStartOffset; ///< \brief Start offset of current data block 196 OffsetT m_BlockEndOffset; ///< \brief End offset of current data block 197 HexEditPanel* m_Panel; ///< \brief Owning panel 198 199 }; 200 201 #endif 202