2
* This file is part of HexEditor plugin for Code::Blocks Studio
3
* Copyright (C) 2008-2009 Bartlomiej Swiecki
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.
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.
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/>.
19
* $Id: HexEditPanel.cpp 5867 2009-10-20 08:34:02Z mortenmacfly $
20
* $HeadURL: svn+ssh://jenslody@svn.berlios.de/svnroot/repos/codeblocks/trunk/src/plugins/contrib/HexEditor/HexEditPanel.cpp $
23
#include "HexEditPanel.h"
24
#include "ExpressionTester.h"
25
#include "SelectStoredExpressionDlg.h"
26
#include "ExpressionExecutor.h"
27
#include "ExpressionParser.h"
28
#include "CharacterView.h"
29
#include "DigitView.h"
30
#include "HexEditLineBuffer.h"
32
#include "ExpressionTestCases.h"
33
#include "FileContentDisk.h"
34
#include "TestCasesDlg.h"
35
#include "SearchDialog.h"
37
//(*InternalHeaders(HexEditPanel)
38
#include <wx/string.h>
42
#include <wx/dcbuffer.h>
43
#include <wx/dcclient.h>
44
#include <wx/filedlg.h>
45
#include <wx/filename.h>
46
#include <wx/numdlg.h>
48
#include <wx/textdlg.h>
49
#include <wx/choicdlg.h>
52
#include <editormanager.h>
53
#include <configmanager.h>
54
#include <logmanager.h>
58
inline int NWD( int a, int b )
70
//(*IdInit(HexEditPanel)
71
const long HexEditPanel::ID_STATICTEXT1 = wxNewId();
72
const long HexEditPanel::ID_BUTTON10 = wxNewId();
73
const long HexEditPanel::ID_BUTTON9 = wxNewId();
74
const long HexEditPanel::ID_STATICLINE2 = wxNewId();
75
const long HexEditPanel::ID_BUTTON7 = wxNewId();
76
const long HexEditPanel::ID_BUTTON4 = wxNewId();
77
const long HexEditPanel::ID_BUTTON6 = wxNewId();
78
const long HexEditPanel::ID_BUTTON5 = wxNewId();
79
const long HexEditPanel::ID_STATICLINE1 = wxNewId();
80
const long HexEditPanel::ID_BUTTON1 = wxNewId();
81
const long HexEditPanel::ID_BUTTON8 = wxNewId();
82
const long HexEditPanel::ID_CHECKBOX1 = wxNewId();
83
const long HexEditPanel::ID_PANEL1 = wxNewId();
84
const long HexEditPanel::ID_SCROLLBAR1 = wxNewId();
85
const long HexEditPanel::ID_STATICTEXT2 = wxNewId();
86
const long HexEditPanel::ID_STATICTEXT3 = wxNewId();
87
const long HexEditPanel::ID_STATICTEXT4 = wxNewId();
88
const long HexEditPanel::ID_STATICTEXT5 = wxNewId();
89
const long HexEditPanel::ID_STATICTEXT6 = wxNewId();
90
const long HexEditPanel::ID_STATICTEXT7 = wxNewId();
91
const long HexEditPanel::ID_STATICTEXT8 = wxNewId();
92
const long HexEditPanel::ID_STATICTEXT9 = wxNewId();
93
const long HexEditPanel::ID_STATICTEXT10 = wxNewId();
94
const long HexEditPanel::ID_STATICTEXT11 = wxNewId();
95
const long HexEditPanel::ID_STATICTEXT12 = wxNewId();
96
const long HexEditPanel::ID_STATICTEXT13 = wxNewId();
97
const long HexEditPanel::ID_STATICTEXT14 = wxNewId();
98
const long HexEditPanel::ID_TEXTCTRL1 = wxNewId();
99
const long HexEditPanel::ID_BUTTON3 = wxNewId();
100
const long HexEditPanel::ID_BUTTON2 = wxNewId();
101
const long HexEditPanel::ID_STATICTEXT15 = wxNewId();
102
const long HexEditPanel::ID_TIMER1 = wxNewId();
103
const long HexEditPanel::ID_MENUITEM2 = wxNewId();
104
const long HexEditPanel::ID_MENUITEM1 = wxNewId();
105
const long HexEditPanel::ID_MENUITEM3 = wxNewId();
106
const long HexEditPanel::ID_MENUITEM4 = wxNewId();
107
const long HexEditPanel::ID_MENUITEM5 = wxNewId();
108
const long HexEditPanel::ID_MENUITEM6 = wxNewId();
109
const long HexEditPanel::ID_MENUITEM7 = wxNewId();
110
const long HexEditPanel::ID_MENUITEM8 = wxNewId();
111
const long HexEditPanel::ID_MENUITEM9 = wxNewId();
112
const long HexEditPanel::ID_MENUITEM11 = wxNewId();
113
const long HexEditPanel::ID_MENUITEM12 = wxNewId();
114
const long HexEditPanel::ID_MENUITEM13 = wxNewId();
115
const long HexEditPanel::ID_MENUITEM14 = wxNewId();
116
const long HexEditPanel::ID_MENUITEM15 = wxNewId();
117
const long HexEditPanel::ID_MENUITEM16 = wxNewId();
118
const long HexEditPanel::ID_MENUITEM17 = wxNewId();
119
const long HexEditPanel::ID_MENUITEM18 = wxNewId();
120
const long HexEditPanel::ID_MENUITEM32 = wxNewId();
121
const long HexEditPanel::ID_MENUITEM10 = wxNewId();
122
const long HexEditPanel::ID_MENUITEM20 = wxNewId();
123
const long HexEditPanel::ID_MENUITEM21 = wxNewId();
124
const long HexEditPanel::ID_MENUITEM22 = wxNewId();
125
const long HexEditPanel::ID_MENUITEM23 = wxNewId();
126
const long HexEditPanel::ID_MENUITEM24 = wxNewId();
127
const long HexEditPanel::ID_MENUITEM25 = wxNewId();
128
const long HexEditPanel::ID_MENUITEM26 = wxNewId();
129
const long HexEditPanel::ID_MENUITEM27 = wxNewId();
130
const long HexEditPanel::ID_MENUITEM19 = wxNewId();
131
const long HexEditPanel::ID_MENUITEM29 = wxNewId();
132
const long HexEditPanel::ID_MENUITEM30 = wxNewId();
133
const long HexEditPanel::ID_MENUITEM31 = wxNewId();
134
const long HexEditPanel::ID_MENUITEM33 = wxNewId();
135
const long HexEditPanel::ID_MENUITEM28 = wxNewId();
138
BEGIN_EVENT_TABLE(HexEditPanel,EditorBase)
139
//(*EventTable(HexEditPanel)
143
HexEditPanel::EditorsSet HexEditPanel::m_AllEditors;
145
HexEditPanel::HexEditPanel( const wxString& fileName, const wxString& title )
146
: EditorBase( (wxWindow*)Manager::Get()->GetEditorManager()->GetNotebook(), fileName )
147
, m_FileName( fileName )
151
, m_CurrentBlockStart( 0 )
152
, m_CurrentBlockEnd( 0 )
153
, m_MouseDown( false )
154
, m_ColsMode( CM_ANY )
157
--- Begin of comment which prevents calling Create() --
159
//(*Initialize(HexEditPanel)
160
Create(parent, wxID_ANY, wxDefaultPosition, wxSize(79,51), wxTAB_TRAVERSAL, _T("wxID_ANY"));
162
--- End of comment which prevents calling Create() --
165
BoxSizer1 = new wxBoxSizer(wxVERTICAL);
166
BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
167
m_Status = new wxStaticText(this, ID_STATICTEXT1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
168
BoxSizer3->Add(m_Status, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
169
Button6 = new wxButton(this, ID_BUTTON10, _("Goto"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON10"));
170
BoxSizer3->Add(Button6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
171
Button5 = new wxButton(this, ID_BUTTON9, _("Search"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON9"));
172
BoxSizer3->Add(Button5, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
173
StaticLine2 = new wxStaticLine(this, ID_STATICLINE2, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL, _T("ID_STATICLINE2"));
174
BoxSizer3->Add(StaticLine2, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
175
m_ColsModeBtn = new wxButton(this, ID_BUTTON7, _("Cols"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON7"));
176
BoxSizer3->Add(m_ColsModeBtn, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
177
m_DigitBits = new wxButton(this, ID_BUTTON4, _("Hex"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON4"));
178
BoxSizer3->Add(m_DigitBits, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
179
m_BlockSize = new wxButton(this, ID_BUTTON6, _("1B"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON6"));
180
BoxSizer3->Add(m_BlockSize, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
181
m_Endianess = new wxButton(this, ID_BUTTON5, _("BE"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON5"));
182
BoxSizer3->Add(m_Endianess, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
183
StaticLine1 = new wxStaticLine(this, ID_STATICLINE1, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL, _T("ID_STATICLINE1"));
184
BoxSizer3->Add(StaticLine1, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
185
Button1 = new wxButton(this, ID_BUTTON1, _("Calc"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON1"));
186
BoxSizer3->Add(Button1, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
187
Button4 = new wxButton(this, ID_BUTTON8, _("Test"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON8"));
188
BoxSizer3->Add(Button4, 0, wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
189
CheckBox1 = new wxCheckBox(this, ID_CHECKBOX1, _("Value preview"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX1"));
190
CheckBox1->SetValue(true);
191
BoxSizer3->Add(CheckBox1, 0, wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
192
BoxSizer1->Add(BoxSizer3, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
193
BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
194
m_DrawArea = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS|wxFULL_REPAINT_ON_RESIZE, _T("ID_PANEL1"));
195
BoxSizer2->Add(m_DrawArea, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
196
m_ContentScroll = new wxScrollBar(this, ID_SCROLLBAR1, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL, wxDefaultValidator, _T("ID_SCROLLBAR1"));
197
m_ContentScroll->SetScrollbar(0, 1, 1, 1);
198
BoxSizer2->Add(m_ContentScroll, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
199
BoxSizer1->Add(BoxSizer2, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
200
PreviewSizer = new wxBoxSizer(wxVERTICAL);
201
FlexGridSizer1 = new wxFlexGridSizer(0, 8, 5, 5);
202
FlexGridSizer1->AddGrowableCol(1);
203
FlexGridSizer1->AddGrowableCol(4);
204
FlexGridSizer1->AddGrowableCol(7);
205
StaticText1 = new wxStaticText(this, ID_STATICTEXT2, _("Byte:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
206
FlexGridSizer1->Add(StaticText1, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
207
m_ByteVal = new wxStaticText(this, ID_STATICTEXT3, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT3"));
208
FlexGridSizer1->Add(m_ByteVal, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
209
FlexGridSizer1->Add(5,5,1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
210
StaticText3 = new wxStaticText(this, ID_STATICTEXT4, _("Word:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT4"));
211
FlexGridSizer1->Add(StaticText3, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
212
m_WordVal = new wxStaticText(this, ID_STATICTEXT5, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT5"));
213
FlexGridSizer1->Add(m_WordVal, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
214
FlexGridSizer1->Add(5,5,1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
215
StaticText2 = new wxStaticText(this, ID_STATICTEXT6, _("Dword:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT6"));
216
FlexGridSizer1->Add(StaticText2, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
217
m_DwordVal = new wxStaticText(this, ID_STATICTEXT7, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT7"));
218
FlexGridSizer1->Add(m_DwordVal, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
219
StaticText4 = new wxStaticText(this, ID_STATICTEXT8, _("Float:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT8"));
220
FlexGridSizer1->Add(StaticText4, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
221
m_FloatVal = new wxStaticText(this, ID_STATICTEXT9, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT9"));
222
FlexGridSizer1->Add(m_FloatVal, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
223
FlexGridSizer1->Add(5,5,1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
224
StaticText6 = new wxStaticText(this, ID_STATICTEXT10, _("Double:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT10"));
225
FlexGridSizer1->Add(StaticText6, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
226
m_DoubleVal = new wxStaticText(this, ID_STATICTEXT11, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT11"));
227
FlexGridSizer1->Add(m_DoubleVal, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
228
FlexGridSizer1->Add(5,5,1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
229
StaticText8 = new wxStaticText(this, ID_STATICTEXT12, _("L-Double:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT12"));
230
FlexGridSizer1->Add(StaticText8, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
231
m_LDoubleVal = new wxStaticText(this, ID_STATICTEXT13, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT13"));
232
FlexGridSizer1->Add(m_LDoubleVal, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
233
PreviewSizer->Add(FlexGridSizer1, 0, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
234
BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
235
StaticText5 = new wxStaticText(this, ID_STATICTEXT14, _("Expression:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT14"));
236
BoxSizer4->Add(StaticText5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
237
m_Expression = new wxTextCtrl(this, ID_TEXTCTRL1, _("byte[ @ ]"), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER, wxDefaultValidator, _T("ID_TEXTCTRL1"));
238
BoxSizer4->Add(m_Expression, 1, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
239
Button3 = new wxButton(this, ID_BUTTON3, _("v"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON3"));
240
BoxSizer4->Add(Button3, 0, wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
241
Button2 = new wxButton(this, ID_BUTTON2, _("\?"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator, _T("ID_BUTTON2"));
242
BoxSizer4->Add(Button2, 0, wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
243
m_ExpressionVal = new wxStaticText(this, ID_STATICTEXT15, _("-9999999999"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT15"));
244
BoxSizer4->Add(m_ExpressionVal, 1, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
245
PreviewSizer->Add(BoxSizer4, 0, wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
246
BoxSizer1->Add(PreviewSizer, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
248
ReparseTimer.SetOwner(this, ID_TIMER1);
249
MenuItem2 = new wxMenuItem((&m_BaseMenu), ID_MENUITEM2, _("Bin"), wxEmptyString, wxITEM_NORMAL);
250
m_BaseMenu.Append(MenuItem2);
251
MenuItem1 = new wxMenuItem((&m_BaseMenu), ID_MENUITEM1, _("Hex"), wxEmptyString, wxITEM_NORMAL);
252
m_BaseMenu.Append(MenuItem1);
253
MenuItem3 = new wxMenuItem((&m_EndianessMenu), ID_MENUITEM3, _("Big Endian"), wxEmptyString, wxITEM_NORMAL);
254
m_EndianessMenu.Append(MenuItem3);
255
MenuItem4 = new wxMenuItem((&m_EndianessMenu), ID_MENUITEM4, _("Little Endian"), wxEmptyString, wxITEM_NORMAL);
256
m_EndianessMenu.Append(MenuItem4);
257
MenuItem5 = new wxMenuItem((&m_BlockSizeMenu), ID_MENUITEM5, _("1 Byte"), wxEmptyString, wxITEM_NORMAL);
258
m_BlockSizeMenu.Append(MenuItem5);
259
MenuItem6 = new wxMenuItem((&m_BlockSizeMenu), ID_MENUITEM6, _("2 Bytes"), wxEmptyString, wxITEM_NORMAL);
260
m_BlockSizeMenu.Append(MenuItem6);
261
MenuItem7 = new wxMenuItem((&m_BlockSizeMenu), ID_MENUITEM7, _("4 Bytes"), wxEmptyString, wxITEM_NORMAL);
262
m_BlockSizeMenu.Append(MenuItem7);
263
MenuItem8 = new wxMenuItem((&m_BlockSizeMenu), ID_MENUITEM8, _("8 Bytes"), wxEmptyString, wxITEM_NORMAL);
264
m_BlockSizeMenu.Append(MenuItem8);
265
MenuItem9 = new wxMenuItem((&m_ColsModeMenu), ID_MENUITEM9, _("Any"), wxEmptyString, wxITEM_NORMAL);
266
m_ColsModeMenu.Append(MenuItem9);
267
MenuItem10 = new wxMenu();
268
MenuItem11 = new wxMenuItem(MenuItem10, ID_MENUITEM11, _("1"), wxEmptyString, wxITEM_NORMAL);
269
MenuItem10->Append(MenuItem11);
270
MenuItem12 = new wxMenuItem(MenuItem10, ID_MENUITEM12, _("2"), wxEmptyString, wxITEM_NORMAL);
271
MenuItem10->Append(MenuItem12);
272
MenuItem13 = new wxMenuItem(MenuItem10, ID_MENUITEM13, _("3"), wxEmptyString, wxITEM_NORMAL);
273
MenuItem10->Append(MenuItem13);
274
MenuItem14 = new wxMenuItem(MenuItem10, ID_MENUITEM14, _("4"), wxEmptyString, wxITEM_NORMAL);
275
MenuItem10->Append(MenuItem14);
276
MenuItem15 = new wxMenuItem(MenuItem10, ID_MENUITEM15, _("5"), wxEmptyString, wxITEM_NORMAL);
277
MenuItem10->Append(MenuItem15);
278
MenuItem16 = new wxMenuItem(MenuItem10, ID_MENUITEM16, _("6"), wxEmptyString, wxITEM_NORMAL);
279
MenuItem10->Append(MenuItem16);
280
MenuItem17 = new wxMenuItem(MenuItem10, ID_MENUITEM17, _("7"), wxEmptyString, wxITEM_NORMAL);
281
MenuItem10->Append(MenuItem17);
282
MenuItem18 = new wxMenuItem(MenuItem10, ID_MENUITEM18, _("8"), wxEmptyString, wxITEM_NORMAL);
283
MenuItem10->Append(MenuItem18);
284
MenuItem10->AppendSeparator();
285
MenuItem32 = new wxMenuItem(MenuItem10, ID_MENUITEM32, _("Other"), wxEmptyString, wxITEM_NORMAL);
286
MenuItem10->Append(MenuItem32);
287
m_ColsModeMenu.Append(ID_MENUITEM10, _("Exactly"), MenuItem10, wxEmptyString);
288
MenuItem19 = new wxMenu();
289
MenuItem20 = new wxMenuItem(MenuItem19, ID_MENUITEM20, _("2"), wxEmptyString, wxITEM_NORMAL);
290
MenuItem19->Append(MenuItem20);
291
MenuItem21 = new wxMenuItem(MenuItem19, ID_MENUITEM21, _("3"), wxEmptyString, wxITEM_NORMAL);
292
MenuItem19->Append(MenuItem21);
293
MenuItem22 = new wxMenuItem(MenuItem19, ID_MENUITEM22, _("4"), wxEmptyString, wxITEM_NORMAL);
294
MenuItem19->Append(MenuItem22);
295
MenuItem23 = new wxMenuItem(MenuItem19, ID_MENUITEM23, _("5"), wxEmptyString, wxITEM_NORMAL);
296
MenuItem19->Append(MenuItem23);
297
MenuItem24 = new wxMenuItem(MenuItem19, ID_MENUITEM24, _("6"), wxEmptyString, wxITEM_NORMAL);
298
MenuItem19->Append(MenuItem24);
299
MenuItem25 = new wxMenuItem(MenuItem19, ID_MENUITEM25, _("7"), wxEmptyString, wxITEM_NORMAL);
300
MenuItem19->Append(MenuItem25);
301
MenuItem26 = new wxMenuItem(MenuItem19, ID_MENUITEM26, _("8"), wxEmptyString, wxITEM_NORMAL);
302
MenuItem19->Append(MenuItem26);
303
MenuItem19->AppendSeparator();
304
MenuItem27 = new wxMenuItem(MenuItem19, ID_MENUITEM27, _("Other"), wxEmptyString, wxITEM_NORMAL);
305
MenuItem19->Append(MenuItem27);
306
m_ColsModeMenu.Append(ID_MENUITEM19, _("Multiple of"), MenuItem19, wxEmptyString);
307
MenuItem28 = new wxMenu();
308
MenuItem29 = new wxMenuItem(MenuItem28, ID_MENUITEM29, _("2"), wxEmptyString, wxITEM_NORMAL);
309
MenuItem28->Append(MenuItem29);
310
MenuItem30 = new wxMenuItem(MenuItem28, ID_MENUITEM30, _("4"), wxEmptyString, wxITEM_NORMAL);
311
MenuItem28->Append(MenuItem30);
312
MenuItem31 = new wxMenuItem(MenuItem28, ID_MENUITEM31, _("8"), wxEmptyString, wxITEM_NORMAL);
313
MenuItem28->Append(MenuItem31);
314
MenuItem28->AppendSeparator();
315
MenuItem33 = new wxMenuItem(MenuItem28, ID_MENUITEM33, _("Other"), wxEmptyString, wxITEM_NORMAL);
316
MenuItem28->Append(MenuItem33);
317
m_ColsModeMenu.Append(ID_MENUITEM28, _("Power of"), MenuItem28, wxEmptyString);
318
BoxSizer1->SetSizeHints(this);
320
Connect(ID_BUTTON10,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton6Click);
321
Connect(ID_BUTTON9,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton5Click);
322
Connect(ID_BUTTON7,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::Onm_ColsModeClick);
323
Connect(ID_BUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton4Click);
324
Connect(ID_BUTTON6,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::Onm_BlockSizeClick);
325
Connect(ID_BUTTON5,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::Onm_EndianessClick);
326
Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton1Click);
327
Connect(ID_BUTTON8,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton4Click1);
328
Connect(ID_CHECKBOX1,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnCheckBox1Click);
329
m_DrawArea->Connect(wxEVT_PAINT,(wxObjectEventFunction)&HexEditPanel::OnContentPaint,0,this);
330
m_DrawArea->Connect(wxEVT_ERASE_BACKGROUND,(wxObjectEventFunction)&HexEditPanel::OnDrawAreaEraseBackground,0,this);
331
m_DrawArea->Connect(wxEVT_KEY_DOWN,(wxObjectEventFunction)&HexEditPanel::OnSpecialKeyDown,0,this);
332
m_DrawArea->Connect(wxEVT_CHAR,(wxObjectEventFunction)&HexEditPanel::OnDrawAreaKeyDown,0,this);
333
m_DrawArea->Connect(wxEVT_LEFT_DOWN,(wxObjectEventFunction)&HexEditPanel::OnDrawAreaLeftDown,0,this);
334
m_DrawArea->Connect(wxEVT_LEFT_UP,(wxObjectEventFunction)&HexEditPanel::OnDrawAreaLeftUp,0,this);
335
m_DrawArea->Connect(wxEVT_MOTION,(wxObjectEventFunction)&HexEditPanel::OnDrawAreaMouseMove,0,this);
336
m_DrawArea->Connect(wxEVT_LEAVE_WINDOW,(wxObjectEventFunction)&HexEditPanel::OnDrawAreaLeftUp,0,this);
337
m_DrawArea->Connect(wxEVT_MOUSEWHEEL,(wxObjectEventFunction)&HexEditPanel::OnContentMouseWheel,0,this);
338
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_TOP,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
339
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_BOTTOM,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
340
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_LINEUP,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
341
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_LINEDOWN,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
342
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_PAGEUP,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
343
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_PAGEDOWN,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
344
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_THUMBTRACK,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
345
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_THUMBRELEASE,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
346
Connect(ID_SCROLLBAR1,wxEVT_SCROLL_CHANGED,(wxObjectEventFunction)&HexEditPanel::OnContentScroll);
347
Connect(ID_TEXTCTRL1,wxEVT_COMMAND_TEXT_UPDATED,(wxObjectEventFunction)&HexEditPanel::Onm_ExpressionText);
348
Connect(ID_TEXTCTRL1,wxEVT_COMMAND_TEXT_ENTER,(wxObjectEventFunction)&HexEditPanel::OnExpressionTextEnter);
349
Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton3Click1);
350
Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&HexEditPanel::OnButton2Click);
351
Connect(ID_TIMER1,wxEVT_TIMER,(wxObjectEventFunction)&HexEditPanel::OnReparseTimerTrigger);
352
Connect(ID_MENUITEM2,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetBaseBin);
353
Connect(ID_MENUITEM1,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetBaseHex);
354
Connect(ID_MENUITEM3,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetEndianessBig);
355
Connect(ID_MENUITEM4,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetEndianessLittle);
356
Connect(ID_MENUITEM5,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetBlockSize1);
357
Connect(ID_MENUITEM6,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetBlockSize2);
358
Connect(ID_MENUITEM7,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetBlockSize4);
359
Connect(ID_MENUITEM8,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetBlockSize8);
360
Connect(ID_MENUITEM9,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul1);
361
Connect(ID_MENUITEM11,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue1);
362
Connect(ID_MENUITEM12,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue2);
363
Connect(ID_MENUITEM13,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue3);
364
Connect(ID_MENUITEM14,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue4);
365
Connect(ID_MENUITEM15,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue5);
366
Connect(ID_MENUITEM16,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue6);
367
Connect(ID_MENUITEM17,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue7);
368
Connect(ID_MENUITEM18,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValue8);
369
Connect(ID_MENUITEM32,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsValueOther);
370
Connect(ID_MENUITEM20,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul2);
371
Connect(ID_MENUITEM21,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul3);
372
Connect(ID_MENUITEM22,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul4);
373
Connect(ID_MENUITEM23,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul5);
374
Connect(ID_MENUITEM24,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul6);
375
Connect(ID_MENUITEM25,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul7);
376
Connect(ID_MENUITEM26,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMul8);
377
Connect(ID_MENUITEM27,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsMulOther);
378
Connect(ID_MENUITEM29,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsPower2);
379
Connect(ID_MENUITEM30,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsPower4);
380
Connect(ID_MENUITEM31,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsPower8);
381
Connect(ID_MENUITEM33,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&HexEditPanel::OnSetColsPowerOther);
384
// We connect these events manually
385
m_DrawArea->Connect( wxEVT_SIZE, (wxObjectEventFunction)&HexEditPanel::OnContentSize, 0, this );
386
m_DrawArea->SetBackgroundStyle( wxBG_STYLE_CUSTOM );
387
Connect( wxEVT_SET_FOCUS, (wxObjectEventFunction)&HexEditPanel::OnForwardFocus );
391
m_LastScrollUnits = 0;
392
m_LinesPerScrollUnit = 1;
400
if ( m_Content && m_Content->GetSize() > 0x40000000ULL )
402
// Because of the filesize we have to map scroll units
403
// to some number of lines
404
m_LinesPerScrollUnit = m_Content->GetSize() / 0x20000000ULL;
410
PropagateOffsetChange();
412
m_DrawArea->SetFocus();
414
((wxWindow*)Manager::Get()->GetEditorManager()->GetNotebook())->Layout();
417
SetTitle( m_Shortname );
419
m_AllEditors.insert( this );
423
void HexEditPanel::CreateViews()
425
for ( int i=0; i<MAX_VIEWS; ++i )
430
m_Views[ VIEW_DIGIT ] = m_DigitView = new DigitView( this );
431
m_Views[ VIEW_CHARS ] = new CharacterView( this );
432
ActivateView( m_Views[ 0 ] );
435
void HexEditPanel::ActivateView( HexEditViewBase* view )
437
if ( view == m_ActiveView ) return;
441
m_ActiveView->SetActive( false );
445
view->SetActive( true );
449
HexEditPanel::~HexEditPanel()
451
for ( int i=0; i<MAX_VIEWS; ++i )
457
m_AllEditors.erase( this );
465
//(*Destroy(HexEditPanel)
469
void HexEditPanel::SetFontSize( int size )
472
m_DrawFont = wxFont::New( size, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString, wxFONTENCODING_DEFAULT );
475
void HexEditPanel::ReadContent()
477
if ( m_Content ) delete m_Content;
479
m_Content = FileContentBase::BuildInstance( m_FileName );
482
m_ErrorString = _("Could not open the file (note that HexEditor may not be able to open big files)");
486
if ( !m_Content->ReadFile( m_FileName ) )
490
m_ErrorString = _("Could not read the file");
495
void HexEditPanel::RecalculateCoefs()
497
// Calculate size of the font
498
wxClientDC dc( this );
499
dc.GetTextExtent( _T("0123456789ABCDEF"), &m_FontX, &m_FontY, NULL, NULL, m_DrawFont );
502
// Calculate number of rows and columns in characters
503
wxSize size = m_DrawArea->GetClientSize();
504
m_Cols = size.GetWidth() / m_FontX;
505
m_Lines = size.GetHeight() / m_FontY;
507
// Calculate number of bytes in one line
508
double avgByteCharacters = 0.0;
509
int cumulativeBlockSize = 1;
510
for ( int i=0; i<MAX_VIEWS; ++i )
515
m_Views[ i ]->GetBlockSizes( blockLength, blockBytes, spacing );
517
avgByteCharacters += ( (double)( blockLength + spacing ) ) / (double)blockBytes;
518
cumulativeBlockSize = cumulativeBlockSize * blockBytes / NWD( cumulativeBlockSize, blockBytes );
521
int colsLeftForViews =
524
- 1 // ':' after offset
525
- 2 * MAX_VIEWS // spacing between views
528
int maxByteInLine = (int)( colsLeftForViews / avgByteCharacters );
530
// Now we need to find such number of bytes to be multiple of cumulativeBlockSize
531
// and try not to cross maxByteInLine
533
// Additionally we try to mach required columns count,
534
// this is a little bit naive approach but will work in generic way
535
int maxColumns = std::max( (int)(maxByteInLine / cumulativeBlockSize), 1 );
536
for ( int i=maxColumns;; i-- )
540
for ( i=maxColumns+1; i<0x1000; ++i )
542
if ( MatchColumnsCount( i ) )
551
if ( MatchColumnsCount( i ) )
558
m_ColsCount = maxColumns;
559
m_LineBytes = maxColumns * cumulativeBlockSize;
561
// Calculate column positions
562
for ( int i=0; i<MAX_VIEWS; ++i )
567
m_Views[ i ]->GetBlockSizes( blockLength, blockBytes, spacing );
568
m_ViewsCols[ i ] = ( ( m_LineBytes + blockBytes - 1 ) / blockBytes ) * ( blockLength + spacing );
572
OffsetT contentSize = m_Content ? m_Content->GetSize() : 0;
574
int totalLines = ( contentSize + m_LineBytes - 1 ) / m_LineBytes;
575
int totalUnits = ( totalLines + m_LinesPerScrollUnit - 1 ) / m_LinesPerScrollUnit;
576
int thumbLines = ( m_Lines + m_LinesPerScrollUnit - 1 ) / m_LinesPerScrollUnit;
578
m_ContentScroll->SetScrollbar(
579
m_ContentScroll->GetThumbPosition(),
585
void HexEditPanel::OnContentPaint( wxPaintEvent& event )
587
wxAutoBufferedPaintDC dc( m_DrawArea );
588
dc.SetBrush( GetBackgroundColour() );
589
dc.SetPen ( GetBackgroundColour() );
590
dc.DrawRectangle( GetClientRect() );
592
if ( !m_Content ) return;
594
dc.SetFont( *m_DrawFont );
596
OffsetT startOffs = DetectStartOffset();
598
HexEditLineBuffer buff( m_Cols );
599
char* content = new char[ m_Cols ];
601
wxColour backgrounds[ stCount ] =
603
GetBackgroundColour(),
604
wxColour( 0x70, 0x70, 0x70 ),
605
wxColour( 0xA0, 0xA0, 0xFF ),
606
wxColour( 0x80, 0x80, 0xFF ),
609
wxColour foregrounds[ stCount ] =
618
for ( OffsetT j = 0; j < m_Lines; ++j )
623
OffsetT offs = startOffs + j * m_LineBytes;
624
OffsetT offsMax = offs + m_LineBytes;
626
// Add offset to view buffer
627
for ( size_t i=8; i-->0; )
629
buff.PutChar( "0123456789ABCDEF"[ ( offs >> ( i << 2 ) ) & 0xF ] );
633
// Clamp offsets to content size
634
offs = wxMin( offs, m_Content->GetSize() );
635
offsMax = wxMin( offsMax, m_Content->GetSize() );
637
if ( offs == offsMax ) continue;
640
m_Content->Read( content, offs, offsMax - offs );
641
for ( int i=0; i<MAX_VIEWS; ++i )
644
m_Views[ i ]->PutLine( offs, buff, content, offsMax - offs );
647
buff.Draw( dc, 0, j * m_FontY, m_FontX, m_FontY, foregrounds, backgrounds );
653
void HexEditPanel::OnContentScroll( wxScrollEvent& event )
655
if ( !m_Content || !m_Content->GetSize() )
660
if ( m_ContentScroll->GetThumbPosition() == 0 )
665
else if ( m_ContentScroll->GetThumbPosition() >= m_ContentScroll->GetRange() - m_ContentScroll->GetThumbSize() )
668
int totalLines = m_Content->GetSize() / m_LineBytes;
669
m_LastScrollPos = totalLines - m_Lines + 1;
672
ClampCursorToVisibleArea();
673
m_DrawArea->Refresh();
675
m_DrawArea->SetFocus();
678
void HexEditPanel::OnContentScrollTop(wxScrollEvent& event)
680
if ( !m_Content || !m_Content->GetSize() )
687
LogManager::Get()->DebugLog( _T("Top") );
689
OnContentScroll( event );
692
void HexEditPanel::OnContentScrollBottom(wxScrollEvent& event)
694
if ( !m_Content || !m_Content->GetSize() )
699
int totalLines = m_Content->GetSize() / m_LineBytes;
700
m_LastScrollPos = totalLines - m_Lines + 1;
702
LogManager::Get()->DebugLog( _T("Top") );
704
OnContentScroll( event );
707
void HexEditPanel::OnContentSize( wxSizeEvent& event )
710
EnsureCarretVisible();
715
FileContentBase::OffsetT HexEditPanel::DetectStartOffset()
717
if ( !m_Content ) return 0;
719
int currentUnits = m_ContentScroll->GetThumbPosition();
721
if ( currentUnits < m_LastScrollUnits )
723
FileContentBase::OffsetT diff = ( m_LastScrollUnits - currentUnits ) * m_LinesPerScrollUnit;
724
if ( m_LastScrollPos < diff )
730
m_LastScrollPos -= diff;
733
else if ( currentUnits > m_LastScrollUnits )
735
m_LastScrollPos += ( currentUnits - m_LastScrollUnits ) * m_LinesPerScrollUnit;
736
FileContentBase::OffsetT maxScrollPos = ( m_Content->GetSize() + m_LineBytes - 1 ) / m_LineBytes;
737
if ( m_LastScrollPos >= maxScrollPos )
739
m_LastScrollPos = maxScrollPos-1;
743
m_LastScrollUnits = currentUnits;
745
return m_LastScrollPos * m_LineBytes;
748
void HexEditPanel::OnContentMouseWheel(wxMouseEvent& event)
750
m_ContentScroll->SetThumbPosition(
751
m_ContentScroll->GetThumbPosition() -
752
2 * event.GetWheelRotation() / event.GetWheelDelta() );
753
ClampCursorToVisibleArea();
754
m_DrawArea->Refresh();
758
void HexEditPanel::RefreshStatus()
762
m_Status->SetLabel( m_ErrorString );
766
FileContentBase::OffsetT size = m_Content->GetSize();
770
m_Status->SetLabel( _("File is empty") );
774
m_Status->SetLabel( F( _("Position: %llX / %llX ( %lld%% )"), m_Current, size-1, ( m_Current * 100 / (size-1) ) ) );
777
FileContentBase::OffsetT left = size - m_Current;
779
if ( left >= sizeof( char ) )
782
m_Content->Read( &val, m_Current, sizeof(val) );
783
m_ByteVal->SetLabel( wxString::Format(_T("%d"),(int)val) );
787
m_ByteVal->SetLabel( _T("-") );
790
if ( left >= sizeof( short ) )
793
m_Content->Read( &val, m_Current, sizeof(val) );
794
m_WordVal->SetLabel( wxString::Format(_T("%d"),(int)val) );
798
m_WordVal->SetLabel( _T("-") );
801
if ( left >= sizeof( int ) )
804
m_Content->Read( &val, m_Current, sizeof(val) );
805
m_DwordVal->SetLabel( wxString::Format(_T("%d"),(int)val) );
809
m_DwordVal->SetLabel( _T("-") );
812
if ( left >= sizeof( float ) )
815
m_Content->Read( &val, m_Current, sizeof(val) );
816
m_FloatVal->SetLabel( wxString::Format(_T("%g"), val) );
820
m_FloatVal->SetLabel( _T("-") );
823
if ( left >= sizeof( double ) )
826
m_Content->Read( &val, m_Current, sizeof(val) );
827
m_DoubleVal->SetLabel( wxString::Format(_T("%g"), val) );
831
m_DoubleVal->SetLabel( _T("-") );
834
if ( left >= sizeof( long double ) )
837
m_Content->Read( &val, m_Current, sizeof(val) );
838
if ( platform::windows )
840
// MinGW has broken support for long double
841
m_LDoubleVal->SetLabel( wxString::Format(_T("%g"), (double)val) );
845
m_LDoubleVal->SetLabel( wxString::Format(_T("%Lg"), val) );
850
m_LDoubleVal->SetLabel( _T("-") );
853
if ( m_ExpressionError.IsEmpty() )
856
Expression::Executor executor;
859
if ( !executor.Execute( m_ExpressionCode, m_Content, m_Current ) )
861
m_ExpressionVal->SetLabel( executor.ErrorDesc() );
865
// LogManager::Get()->DebugLog( F( _T("HEExpr Calculate: %d"), (int)sw.Time() ) );
866
unsigned long long uint;
870
if ( executor.GetResult( uint ) )
872
m_ExpressionVal->SetLabel( wxString::Format( _T("%llu"), uint) );
874
else if ( executor.GetResult( sint ) )
876
m_ExpressionVal->SetLabel( wxString::Format( _T("%lld"), sint ) );
878
else if ( executor.GetResult( flt ) )
880
m_ExpressionVal->SetLabel( wxString::Format( _T("%g"), (double)flt ) );
884
m_ExpressionVal->SetLabel( _T("Error") );
890
m_ExpressionVal->SetLabel( m_ExpressionError );
896
switch ( m_DigitView->GetDigitBits() )
898
case 1: m_DigitBits->SetLabel( _("Bin") ); break;
899
case 4: m_DigitBits->SetLabel( _("Hex") ); break;
900
default: m_DigitBits->SetLabel( wxString::Format( _("%d bits") , m_DigitView->GetDigitBits() ) );
903
switch ( m_DigitView->GetLittleEndian() )
905
case true: m_Endianess->SetLabel( _("LE") ); break;
906
case false: m_Endianess->SetLabel( _("BE") ); break;
909
m_BlockSize->SetLabel( wxString::Format( _("%dB"), m_DigitView->GetBlockBytes() ) );
911
switch ( m_ColsMode )
913
case CM_SPECIFIED: m_ColsModeBtn->SetLabel( wxString::Format( _("Cols: %d"), m_ColsValue ) ); break;
914
case CM_MULT: m_ColsModeBtn->SetLabel( wxString::Format( _("Cols: %d ( n * %d )"), m_ColsCount, m_ColsValue ) ); break;
915
case CM_POWER: m_ColsModeBtn->SetLabel( wxString::Format( _("Cols: %d ( n ^ %d )"), m_ColsCount, m_ColsValue ) ); break;
916
default: m_ColsModeBtn->SetLabel( wxString::Format( _("Cols: %d ( Any )"), m_ColsCount ) );
921
void HexEditPanel::OnDrawAreaKeyDown(wxKeyEvent& event)
923
if ( !m_Content || !m_Content->GetSize() ) return;
925
m_ViewNotifyContentChange = false;
926
m_ViewNotifyOffsetChange = false;
928
switch ( event.GetKeyCode() )
932
m_ActiveView->MoveLeft();
938
m_ActiveView->MoveRight();
944
m_ActiveView->MoveUp();
950
m_ActiveView->MoveDown();
956
for ( unsigned int i=0; i<m_Lines/2; i++ )
958
m_ActiveView->MoveDown();
965
for ( unsigned int i=0; i<m_Lines/2; i++ )
967
m_ActiveView->MoveUp();
974
m_ActiveView->SetActive( false );
976
for ( int i=0; i<MAX_VIEWS; ++i )
978
if ( m_ActiveView == m_Views[ i ] )
980
newViewId = ( i + 1 ) % MAX_VIEWS;
984
if ( newViewId < 0 ) newViewId = 0;
985
m_ActiveView = m_Views[ newViewId ];
986
m_ActiveView->SetActive( true );
987
m_ViewNotifyContentChange = true;
994
m_ViewNotifyOffsetChange = true;
1001
m_Current = m_Content->GetSize()-1;
1002
m_ViewNotifyOffsetChange = true;
1008
// Insert empty byte at current position
1009
FileContentBase::ExtraUndoData data(
1011
m_Current, m_ActiveView->GetCurrentPositionFlags(),
1012
m_Current, m_ActiveView->GetCurrentPositionFlags() );
1013
m_Content->Add( data, m_Current, 1, 0 );
1014
m_ViewNotifyContentChange = true;
1020
FileContentBase::ExtraUndoData data(
1022
m_Current, m_ActiveView->GetCurrentPositionFlags(),
1023
m_Current, m_ActiveView->GetCurrentPositionFlags() );
1024
m_Content->Remove( data, m_Current, 1 );
1025
m_ViewNotifyContentChange = true;
1031
m_ActiveView->PutChar( event.GetUnicodeKey() );
1036
if ( m_ViewNotifyOffsetChange )
1038
EnsureCarretVisible();
1039
PropagateOffsetChange();
1041
m_ViewNotifyContentChange = true;
1044
if ( m_ViewNotifyContentChange )
1046
m_DrawArea->Refresh();
1051
void HexEditPanel::EnsureCarretVisible()
1053
FileContentBase::OffsetT line = m_Current / m_LineBytes;
1054
FileContentBase::OffsetT startLine = DetectStartOffset() / m_LineBytes;
1055
FileContentBase::OffsetT endLine = startLine + m_Lines;
1057
if ( line < startLine )
1059
m_LastScrollPos = line;
1060
m_LastScrollUnits = line / m_LinesPerScrollUnit;
1062
m_ContentScroll->SetThumbPosition( m_LastScrollUnits );
1063
m_DrawArea->Refresh();
1065
else if ( line >= endLine )
1067
line = line - m_Lines + 1;
1069
m_LastScrollPos = line;
1070
m_LastScrollUnits = line / m_LinesPerScrollUnit;
1072
m_ContentScroll->SetThumbPosition( m_LastScrollUnits );
1073
m_DrawArea->Refresh();
1077
void HexEditPanel::ClampCursorToVisibleArea()
1079
FileContentBase::OffsetT startOffs = DetectStartOffset();
1080
FileContentBase::OffsetT endOffs = startOffs + m_LineBytes * m_Lines;
1082
bool changed = false;
1084
if ( m_Current < startOffs )
1086
m_Current = startOffs + ( m_Current % m_LineBytes );
1089
else if ( m_Current >= endOffs )
1091
m_Current = endOffs - m_LineBytes + ( m_Current % m_LineBytes );
1095
if ( m_Current >= m_Content->GetSize() )
1097
m_Current = m_Content->GetSize() - 1;
1103
PropagateOffsetChange();
1107
void HexEditPanel::PropagateOffsetChange( int flagsForCurrentView )
1109
if ( !m_Content ) return;
1111
OffsetT startOffs = DetectStartOffset();
1113
OffsetT blockStart = m_Current;
1114
OffsetT blockEnd = m_Current + 1;
1116
// First let's calculate block size
1117
for ( int i=0; i<MAX_VIEWS && m_Views[ i ]; ++i )
1119
OffsetT thisBlockStart = blockStart;
1120
OffsetT thisBlockEnd = blockEnd;
1121
m_Views[i]->CalculateBlockSize( startOffs, m_Current, thisBlockStart, thisBlockEnd );
1122
blockStart = wxMin( blockStart, thisBlockStart );
1123
blockEnd = wxMax( blockEnd, thisBlockEnd );
1126
// Next we can propagate the offset
1127
for ( int i=0; i<MAX_VIEWS && m_Views[ i ]; ++i )
1129
m_Views[i]->JumpToOffset( startOffs, m_Current, blockStart, blockEnd, ( m_Views[ i ] == m_ActiveView ) ? flagsForCurrentView : -1 );
1133
void HexEditPanel::OnDrawAreaEraseBackground(wxEraseEvent& event)
1137
void HexEditPanel::OnForwardFocus(wxFocusEvent& event)
1139
m_DrawArea->SetFocus();
1142
bool HexEditPanel::Save()
1144
bool ret = m_Content->WriteFile( GetFilename() );
1149
bool HexEditPanel::SaveAs()
1152
fname.Assign(GetFilename());
1153
ConfigManager* mgr = Manager::Get()->GetConfigManager(_T("app"));
1155
wxString Path = fname.GetPath();
1157
if(mgr && Path.IsEmpty())
1158
Path = mgr->Read(_T("/file_dialogs/save_file_as/directory"), Path);
1160
wxFileDialog dlg(Manager::Get()->GetAppWindow(),
1163
fname.GetFullName(),
1164
_T("*.*"),//m_filecontent->GetWildcard(),
1165
wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
1167
if (dlg.ShowModal() != wxID_OK) // cancelled out
1173
SetFilename(dlg.GetPath());
1177
bool HexEditPanel::GetModified() const
1179
return m_Content ? m_Content->Modified() : false;
1182
void HexEditPanel::SetModified( bool modified )
1184
if ( m_Content ) m_Content->SetModified( modified );
1187
void HexEditPanel::UpdateModified()
1189
if ( GetModified() )
1191
SetTitle( _T("*") + GetShortName() );
1195
SetTitle( GetShortName() );
1199
void HexEditPanel::SetFilename(const wxString& filename)
1201
EditorBase::SetFilename(filename);
1202
//m_Filename = filename; done by EditorBase::SetFilename
1204
fname.Assign(m_Filename);
1205
m_Shortname = fname.GetFullName();
1208
void HexEditPanel::OnDrawAreaLeftDown(wxMouseEvent& event)
1210
if ( !m_Content ) return;
1212
m_DrawArea->SetFocus();
1214
// First we need to detect what the user has clicked on
1215
int line = event.GetY() / m_FontY;
1216
int column = event.GetX() / m_FontX;
1218
// Just to prevent some weird situation
1219
line = wxMin( line, (int)m_Lines - 1 );
1220
column = wxMin( column, (int)m_Cols - 1 );
1221
line = wxMax( line, 0 );
1222
column = wxMax( column, 0 );
1224
// Detect what has been pressed
1238
for ( int i=0; i<MAX_VIEWS; ++i )
1244
if ( column < 0 ) break;
1246
if ( column < (int)m_ViewsCols[ i ] )
1248
// Clicked on the area of i-th view
1249
ActivateView( m_Views[ i ] );
1255
else if ( m_Views[ i ] == m_ActiveView )
1261
column -= m_ViewsCols[ i ];
1268
column = wxMax( column, 0 );
1269
column = wxMin( column, (int)m_ViewsCols[ viewId ] );
1272
int lineOffset = m_Views[ viewId ]->GetOffsetFromColumn( column, positionFlags );
1273
lineOffset = wxMin( lineOffset, (int)m_LineBytes - 1 );
1274
lineOffset = wxMax( lineOffset, 0 );
1276
OffsetT newCurrent = DetectStartOffset() + m_LineBytes * line + lineOffset;
1278
if ( newCurrent < m_Content->GetSize() )
1280
if ( ( newCurrent != m_Current ) || ( positionFlags != m_Views[ viewId ]->GetCurrentPositionFlags() ) )
1282
m_Current = newCurrent;
1283
PropagateOffsetChange( positionFlags );
1285
EnsureCarretVisible();
1286
m_DrawArea->Refresh();
1292
m_MouseDown = false;
1293
// Clicked somewhere after all views
1297
void HexEditPanel::OnDrawAreaLeftUp(wxMouseEvent& event)
1299
m_MouseDown = false;
1302
void HexEditPanel::OnDrawAreaMouseMove(wxMouseEvent& event)
1306
OnDrawAreaLeftDown( event );
1310
void HexEditPanel::OnCheckBox1Click(wxCommandEvent& event)
1312
if ( !m_Content ) return;
1313
BoxSizer1->Show( PreviewSizer, CheckBox1->GetValue() );
1314
m_DrawArea->SetFocus();
1318
bool HexEditPanel::CanUndo() const
1320
return m_Content ? m_Content->CanUndo() : false;
1323
bool HexEditPanel::CanRedo() const
1325
return m_Content ? m_Content->CanRedo() : false;
1328
void HexEditPanel::Undo()
1332
const FileContentBase::ExtraUndoData* extraData = m_Content->Undo();
1335
m_Current = extraData->m_PosBefore;
1336
ActivateView( extraData->m_View );
1337
PropagateOffsetChange( extraData->m_PosBeforeF );
1340
EnsureCarretVisible();
1341
m_DrawArea->Refresh();
1346
void HexEditPanel::Redo()
1350
const FileContentBase::ExtraUndoData* extraData = m_Content->Redo();
1353
m_Current = extraData->m_PosAfter;
1354
ActivateView( extraData->m_View );
1355
PropagateOffsetChange( extraData->m_PosAfterF );
1358
EnsureCarretVisible();
1359
m_DrawArea->Refresh();
1364
void HexEditPanel::OnSpecialKeyDown(wxKeyEvent& event)
1366
// LogManager::Get()->DebugLog(
1368
// _T("HexEditPanel::OnSpecialKeyDown: %d (%c%c%c)"),
1369
// (int)event.GetKeyCode(),
1370
// event.ControlDown() ? 'C':'c',
1371
// event.AltDown() ? 'A':'a',
1372
// event.CmdDown() ? 'M':'m' ) );
1374
if ( event.ControlDown() && !event.AltDown() )
1376
switch ( event.GetKeyCode() )
1378
case 'G': ProcessGoto(); return;
1379
case 'F': ProcessSearch(); return;
1386
bool HexEditPanel::IsHexEditor( EditorBase* editor )
1388
return m_AllEditors.find( editor ) != m_AllEditors.end();
1391
void HexEditPanel::CloseAllEditors()
1393
EditorsSet s = m_AllEditors;
1394
for ( EditorsSet::iterator i = s.begin(); i != s.end(); ++i )
1396
EditorManager::Get()->QueryClose( *i );
1400
assert( m_AllEditors.empty() );
1403
void HexEditPanel::ProcessGoto()
1405
if ( !m_Content ) return;
1406
if ( !m_Content->GetSize() ) return;
1410
wxString str = wxString::Format( _T("%lld"), m_Current );
1413
str = wxGetTextFromUser(
1416
"Available forms are:\n"
1417
" * Decimal ( 100 )\n"
1418
" * Hexadecimal ( 1AB, 0x1AB, 1ABh )\n"
1419
" * Offset from current ( +100, -100, +0x1AB )"),
1423
if ( str.IsEmpty() ) return;
1424
str.Trim( true ).Trim( false );
1426
// Decided to parse manually since wxString::ToULongLong does not work everywhere
1428
const wxChar* ptr = str.c_str();
1429
bool relativePlus = false;
1430
bool relativeMinus = false;
1431
bool canBeDec = true;
1432
bool canBeHex = true;
1437
if ( *ptr == _T('+') )
1439
relativePlus = true;
1442
else if ( *ptr == _T('-') )
1444
relativeMinus = true;
1448
while ( wxIsspace( *ptr ) ) ptr++;
1450
if ( ptr[0] == _T('0') && wxToupper(ptr[1]) == _T('X') )
1458
int digitVal = wxString( _T("0123456789ABCDEF") ).Find( wxToupper( *ptr++ ) );
1460
if ( digitVal == wxNOT_FOUND )
1467
if ( digitVal >= 10 ) canBeDec = false;
1469
dec = dec * 10 + digitVal;
1470
hex = hex * 0x10 + digitVal;
1472
if ( wxToupper(ptr[0]) == _T('H') && !ptr[1] )
1479
if ( canBeDec || canBeHex )
1481
OffsetT val = canBeDec ? dec : hex;
1482
OffsetT max = m_Content->GetSize() - 1;
1485
offset = m_Current + val < max ? m_Current + val : max;
1487
else if ( relativeMinus )
1489
offset = m_Current > val ? m_Current - val : 0;
1493
offset = wxMin( max, val );
1498
cbMessageBox( _("Invalid offset !!!.\n") );
1502
PropagateOffsetChange();
1504
EnsureCarretVisible();
1505
m_DrawArea->Refresh();
1508
void HexEditPanel::ProcessSearch()
1510
if ( !m_Content ) return;
1511
if ( !m_Content->GetSize() ) return;
1513
SearchDialog dlg( this, m_Content, m_Current );
1514
if ( dlg.ShowModal() == wxID_OK )
1516
m_Current = dlg.GetOffset();
1517
PropagateOffsetChange();
1519
EnsureCarretVisible();
1520
m_DrawArea->Refresh();
1523
m_DrawArea->SetFocus();
1526
void HexEditPanel::OnButton1Click(wxCommandEvent& event)
1528
ExpressionTester( 0, m_Content, m_Current).ShowModal();
1531
void HexEditPanel::ReparseExpression()
1533
Expression::Parser parser;
1534
if ( !parser.Parse( m_Expression->GetValue(), m_ExpressionCode ) )
1537
m_ExpressionError = parser.ParseErrorDesc( pos );
1541
m_ExpressionError.Clear();
1545
void HexEditPanel::OnReparseTimerTrigger(wxTimerEvent& event)
1547
ReparseExpression();
1551
void HexEditPanel::Onm_ExpressionText(wxCommandEvent& event)
1553
ReparseTimer.Start( 1000, wxTIMER_ONE_SHOT );
1556
void HexEditPanel::OnButton2Click(wxCommandEvent& event)
1558
cbMessageBox( Expression::Parser::GetHelpString() );
1561
void HexEditPanel::OnExpressionTextEnter(wxCommandEvent& event)
1563
ReparseExpression();
1565
ReparseTimer.Stop();
1568
void HexEditPanel::OnButton3Click1(wxCommandEvent& event)
1570
SelectStoredExpressionDlg dlg( this, m_Expression->GetValue() );
1571
if ( dlg.ShowModal() == wxID_OK )
1573
m_Expression->SetValue( dlg.GetExpression() );
1574
OnExpressionTextEnter(event);
1578
void HexEditPanel::OnButton4Click(wxCommandEvent& event)
1580
PopupMenu( &m_BaseMenu );
1583
void HexEditPanel::OnSetBaseHex(wxCommandEvent& event)
1585
m_DigitView->SetDigitBits( 4 );
1589
void HexEditPanel::OnSetBaseBin(wxCommandEvent& event)
1591
m_DigitView->SetDigitBits( 1 );
1595
void HexEditPanel::DisplayChanged()
1599
EnsureCarretVisible();
1600
m_DrawArea->Refresh();
1601
m_DrawArea->SetFocus();
1604
void HexEditPanel::Onm_EndianessClick(wxCommandEvent& event)
1606
PopupMenu( &m_EndianessMenu );
1609
void HexEditPanel::OnSetEndianessBig(wxCommandEvent& event)
1611
m_DigitView->SetLittleEndian( false );
1615
void HexEditPanel::OnSetEndianessLittle(wxCommandEvent& event)
1617
m_DigitView->SetLittleEndian( true );
1621
void HexEditPanel::Onm_BlockSizeClick(wxCommandEvent& event)
1623
PopupMenu( &m_BlockSizeMenu );
1626
void HexEditPanel::OnSetBlockSize1(wxCommandEvent& event)
1628
m_DigitView->SetBlockBytes( 1 );
1632
void HexEditPanel::OnSetBlockSize2(wxCommandEvent& event)
1634
m_DigitView->SetBlockBytes( 2 );
1638
void HexEditPanel::OnSetBlockSize4(wxCommandEvent& event)
1640
m_DigitView->SetBlockBytes( 4 );
1644
void HexEditPanel::OnSetBlockSize8(wxCommandEvent& event)
1646
m_DigitView->SetBlockBytes( 8 );
1650
void HexEditPanel::Onm_ColsModeClick(wxCommandEvent& event)
1652
PopupMenu( &m_ColsModeMenu );
1655
void HexEditPanel::OnSetColsMul1(wxCommandEvent& event)
1657
ColsMode( CM_MULT, 1 );
1660
void HexEditPanel::OnSetColsMul2(wxCommandEvent& event)
1662
ColsMode( CM_MULT, 2 );
1665
void HexEditPanel::OnSetColsMul3(wxCommandEvent& event)
1667
ColsMode( CM_MULT, 3 );
1670
void HexEditPanel::OnSetColsMul4(wxCommandEvent& event)
1672
ColsMode( CM_MULT, 4 );
1675
void HexEditPanel::OnSetColsMul5(wxCommandEvent& event)
1677
ColsMode( CM_MULT, 5 );
1680
void HexEditPanel::OnSetColsMul6(wxCommandEvent& event)
1682
ColsMode( CM_MULT, 6 );
1685
void HexEditPanel::OnSetColsMul7(wxCommandEvent& event)
1687
ColsMode( CM_MULT, 7 );
1690
void HexEditPanel::OnSetColsMul8(wxCommandEvent& event)
1692
ColsMode( CM_MULT, 8 );
1695
void HexEditPanel::OnSetColsMulOther(wxCommandEvent& event)
1697
long val = ::wxGetNumberFromUser( _("Enter number"), _("Enter number"), _("Colums setting"), 2, 2, 100, this );
1698
if ( val > 0 ) ColsMode( CM_MULT, val );
1701
void HexEditPanel::OnSetColsValue1(wxCommandEvent& event)
1703
ColsMode( CM_SPECIFIED, 1 );
1706
void HexEditPanel::OnSetColsValue2(wxCommandEvent& event)
1708
ColsMode( CM_SPECIFIED, 2 );
1711
void HexEditPanel::OnSetColsValue3(wxCommandEvent& event)
1713
ColsMode( CM_SPECIFIED, 3 );
1716
void HexEditPanel::OnSetColsValue4(wxCommandEvent& event)
1718
ColsMode( CM_SPECIFIED, 4 );
1721
void HexEditPanel::OnSetColsValue5(wxCommandEvent& event)
1723
ColsMode( CM_SPECIFIED, 5 );
1726
void HexEditPanel::OnSetColsValue6(wxCommandEvent& event)
1728
ColsMode( CM_SPECIFIED, 6 );
1731
void HexEditPanel::OnSetColsValue7(wxCommandEvent& event)
1733
ColsMode( CM_SPECIFIED, 7 );
1736
void HexEditPanel::OnSetColsValue8(wxCommandEvent& event)
1738
ColsMode( CM_SPECIFIED, 8 );
1741
void HexEditPanel::OnSetColsValueOther(wxCommandEvent& event)
1743
long val = ::wxGetNumberFromUser( _("Enter number"), _("Enter number"), _("Colums setting"), 1, 1, 100, this );
1744
if ( val > 0 ) ColsMode( CM_SPECIFIED, val );
1747
void HexEditPanel::OnSetColsPower2(wxCommandEvent& event)
1749
ColsMode( CM_POWER, 2 );
1752
void HexEditPanel::OnSetColsPower4(wxCommandEvent& event)
1754
ColsMode( CM_POWER, 4 );
1757
void HexEditPanel::OnSetColsPower8(wxCommandEvent& event)
1759
ColsMode( CM_POWER, 8 );
1762
void HexEditPanel::OnSetColsPowerOther(wxCommandEvent& event)
1764
long val = ::wxGetNumberFromUser( _("Enter number"), _("Enter number"), _("Colums setting"), 2, 2, 100, this );
1765
if ( val > 0 ) ColsMode( CM_POWER, val );
1768
void HexEditPanel::ColsMode(int mode, int value)
1771
m_ColsValue = value;
1773
if ( m_ColsMode == CM_MULT && m_ColsValue == 1 )
1775
m_ColsMode = CM_ANY;
1781
bool HexEditPanel::MatchColumnsCount(int colsCount)
1783
switch ( m_ColsMode )
1786
return ( colsCount % m_ColsValue ) == 0;
1789
return colsCount == m_ColsValue;
1792
while ( colsCount > 1 )
1794
if ( colsCount % m_ColsValue ) return false;
1795
colsCount /= m_ColsValue;
1804
void HexEditPanel::OnButton4Click1(wxCommandEvent& event)
1808
_("Expression parser"),
1809
_("On-Disk file edition")
1812
int index = wxGetSingleChoiceIndex( _("Select tests to perform"), _("Self tests"), sizeof( tests ) / sizeof( tests[0] ), tests, this );
1813
TestCasesBase* test = 0;
1817
case 0: test = &Expression::GetTests(); break;
1818
case 1: test = &FileContentDisk::GetTests(); break;
1821
if ( !test ) return;
1823
TestCasesDlg( this, *test ).ShowModal();
1827
void HexEditPanel::OnButton6Click(wxCommandEvent& event)
1832
void HexEditPanel::OnButton5Click(wxCommandEvent& event)