1 /***********************************(GPL)********************************
2 * wxHexEditor is a hex edit tool for editing massive files in Linux *
3 * Copyright (C) 2010 Erdem U. Altinyurt *
4 * *
5 * This program is free software; you can redistribute it and/or *
6 * modify it under the terms of the GNU General Public License *
7 * as published by the Free Software Foundation; either version 2 *
8 * of the License. *
9 * *
10 * This program 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 this program; *
17 * if not, write to the Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *
19 * *
20 * home : www.wxhexeditor.org *
21 * email : spamjunkeater@gmail.com *
22 *************************************************************************/
23
24
25 #include "wxHexCtrl.h"
26 #include <wx/encconv.h>
27 #include <wx/fontmap.h>
28
BEGIN_EVENT_TABLE(wxHexCtrl,wxScrolledWindow)29 BEGIN_EVENT_TABLE(wxHexCtrl,wxScrolledWindow )
30 EVT_CHAR( wxHexCtrl::OnChar )
31 EVT_SIZE( wxHexCtrl::OnSize )
32 EVT_PAINT( wxHexCtrl::OnPaint )
33 EVT_LEFT_DOWN( wxHexCtrl::OnMouseLeft )
34 //EVT_LEFT_DOWN( wxHexOffsetCtrl::OnMouseLeft )
35 //EVT_MOUSE( wxHexCtrl::OnResize)
36 EVT_RIGHT_DOWN( wxHexCtrl::OnMouseRight )
37 EVT_MENU( __idTagAddSelect__, wxHexCtrl::OnTagAddSelection )
38 EVT_MENU( __idTagEdit__, wxHexCtrl::OnTagEdit )
39 EVT_MOTION( wxHexCtrl::OnMouseMove )
40 EVT_SET_FOCUS( wxHexCtrl::OnFocus )
41 //EVT_KILL_FOCUS( wxHexCtrl::OnKillFocus ) //Not needed
42 END_EVENT_TABLE()
43
44
45 //#define _Use_Alternate_DrawText_ //For debugged drawtext for wx 2.9.x on Mac
46
47 //IMPLEMENT_DYNAMIC_CLASS(wxHexCtrl, wxScrolledWindow)
48
49 wxHexCtrl::wxHexCtrl(wxWindow *parent,
50 wxWindowID id,
51 const wxString &value,
52 const wxPoint &pos,
53 const wxSize &size,
54 long style,
55 const wxValidator& validator)
56 : wxScrolledWindow( parent, id,
57 pos, size,
58 wxSUNKEN_BORDER )
59 {
60 HexDefaultAttr = wxTextAttr(
61 wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHTTEXT ),
62 wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ),
63 wxFont(
64 10,
65 wxFONTFAMILY_MODERN, // family
66 wxFONTSTYLE_NORMAL, // style
67 wxFONTWEIGHT_BOLD,// weight
68 true, // underline
69 wxT(""), // facename
70 wxFONTENCODING_CP437) );// msdos encoding
71
72 //Need to create object before Draw operation.
73 ZebraStriping=new int;
74 *ZebraStriping=-1;
75
76 CtrlType=0;
77
78 DrawCharByChar=false;
79
80 internalBufferDC=NULL;
81 internalBufferBMP=NULL;
82
83 HexFormat = wxT("xx ");
84
85 mycaret=NULL;
86 SetSelectionStyle( HexDefaultAttr );
87
88 HexDefaultAttr = wxTextAttr(
89 //*wxBLACK, //Deprecated :p
90 wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ),
91 wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ),
92 //*wxWHITE, //Deprecated :p
93 //wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHTTEXT ),
94 wxFont(
95 10,
96 wxFONTFAMILY_MODERN, // family
97 wxFONTSTYLE_NORMAL, // style
98 wxFONTWEIGHT_NORMAL,// weight
99 false, // underline
100 wxT(""), // facename
101 wxFONTENCODING_CP437) );// msdos encoding
102
103 ClearSelection( false );
104 SetDefaultStyle( HexDefaultAttr );
105
106 m_Caret.x = m_Caret.y =
107 m_Window.x = m_Window.y = 1;
108 m_Margin.x = m_Margin.y = 0;
109 LastRightClickPosition = wxPoint(0,0);
110 select.selected = false;
111
112 CreateCaret();
113
114 // ChangeSize();
115
116 //wxCaret *caret = GetCaret();
117 if ( mycaret )
118 mycaret->Show(false);
119
120 }
~wxHexCtrl()121 wxHexCtrl::~wxHexCtrl()
122 {
123 Clear();
124 //m_text.Clear();
125 wxCaretSuspend cs(this);
126 /*
127 wxBufferedPaintDC dc( this );
128 PrepareDC( dc );
129 dc.SetFont( HexDefaultAttr.GetFont() );
130 dc.SetTextForeground( HexDefaultAttr.GetTextColour() );
131 dc.SetTextBackground( HexDefaultAttr.GetBackgroundColour() );
132 wxBrush bbrush( HexDefaultAttr.GetBackgroundColour() );
133 dc.SetBackground(bbrush );
134 dc.Clear();
135 */
136 }
137
Clear(bool RePaint,bool cursor_reset)138 void wxHexCtrl::Clear( bool RePaint, bool cursor_reset ){
139 m_text.Clear();
140 if( cursor_reset )
141 SetInsertionPoint(0);
142 OnTagHideAll();
143 ClearSelection( RePaint );
144 WX_CLEAR_ARRAY(TagArray);
145 }
146
CreateCaret()147 void wxHexCtrl::CreateCaret(){
148 wxCaret *caret = new wxCaret(this, m_CharSize.x, m_CharSize.y);
149 mycaret = caret;
150 #ifdef _DEBUG_CARET_
151 std::cout << "Caret = 0x"<< (intptr_t) caret << " - mycaret= 0x" << (intptr_t) mycaret << "m_charSize.x" << m_CharSize.x << std::endl;
152 #endif
153 SetCaret(caret);
154 caret->Move(m_Margin.x, m_Margin.x);
155 caret->Show();
156 }
157
FirstLine(bool MoveCaret)158 void wxHexCtrl::FirstLine( bool MoveCaret ){
159 m_Caret.y = 0;
160 if(MoveCaret)
161 DoMoveCaret();
162 }
163
LastLine(bool MoveCaret)164 void wxHexCtrl::LastLine( bool MoveCaret ){
165 m_Caret.y = m_Window.y - 1;
166 if ( IsDenied() )
167 NextChar( false );
168 if ( GetInsertionPoint() > GetLastPosition() ){
169 wxBell();
170 SetInsertionPoint( GetLastPosition() );
171 }
172 if(MoveCaret)
173 DoMoveCaret();
174 }
175
Home(bool MoveCaret)176 void wxHexCtrl::Home( bool MoveCaret ){
177 m_Caret.x = 0;
178 if( MoveCaret )
179 DoMoveCaret();
180 }
181
End(bool MoveCaret)182 void wxHexCtrl::End( bool MoveCaret ){
183 m_Caret.x = m_Window.x - 1;
184 if ( IsDenied() )
185 PrevChar( false );
186 if ( GetInsertionPoint() > GetLastPosition() ){
187 wxBell();
188 SetInsertionPoint( GetLastPosition() );
189 }
190 if(MoveCaret)
191 DoMoveCaret();
192 }
193
PrevChar(bool MoveCaret)194 void wxHexCtrl::PrevChar( bool MoveCaret ){
195 if ( !m_Caret.x-- ){
196 End( false );
197 PrevLine( false );
198 }
199 if ( IsDenied() )
200 PrevChar( false );
201 if( MoveCaret )
202 DoMoveCaret();
203 }
204
NextChar(bool MoveCaret)205 void wxHexCtrl::NextChar( bool MoveCaret ) {
206 if ( ++m_Caret.x == m_Window.x ){
207 Home( false );
208 NextLine( false );
209 }
210 else if ( IsDenied() )
211 NextChar( false );
212 else if ( GetInsertionPoint() > GetLastPosition() ){
213 wxBell();
214 SetInsertionPoint( GetLastPosition() );
215 }
216 if( MoveCaret )
217 DoMoveCaret();
218 }
219
PrevLine(bool MoveCaret)220 void wxHexCtrl::PrevLine( bool MoveCaret ){
221 if ( !m_Caret.y-- ){
222 m_Caret.y++;
223 Home( false );
224 wxBell();
225 }
226 if( MoveCaret )
227 DoMoveCaret();
228 }
229
NextLine(bool MoveCaret)230 void wxHexCtrl::NextLine( bool MoveCaret ){
231 if ( ++m_Caret.y == m_Window.y ) {
232 m_Caret.y--;
233 End( false );
234 wxBell();
235 }
236 else if ( GetInsertionPoint() > GetLastPosition() ){
237 wxBell();
238 SetInsertionPoint( GetLastPosition() );
239 }
240 if( MoveCaret )
241 DoMoveCaret();
242 }
243
IsDenied(int x)244 inline bool wxHexCtrl::IsDenied( int x ){ // State Of The Art :) Hex plotter function by idents avoiding some X axes :)
245 return IsDeniedCache[x];
246 }
247
IsDenied_NoCache(int x)248 inline bool wxHexCtrl::IsDenied_NoCache( int x ){ // State Of The Art :) Hex plotter function by idents avoiding some X axes :)
249 // x%=m_Window.x; // Discarding y axis noise
250 if(1){ //EXPERIMENTAL
251 if( ( ( m_Window.x - 1 ) % HexFormat.Len() == 0 ) // For avoid hex divorcings
252 && ( x == m_Window.x - 1 ))
253 return true;
254 return HexFormat[x%(HexFormat.Len())]==' ';
255 }
256
257 if( ( ( m_Window.x - 1 ) % 3 == 0 ) // For avoid hex divorcings
258 && ( x == m_Window.x - 1 ))
259 return true;
260 // if( x == 3*8 )
261 // return true;
262 return !( ( x + 1 ) % 3 ); // Byte coupling
263 }
264
xCountDenied(int x)265 int wxHexCtrl::xCountDenied( int x ){ //Counts denied character locations (spaces) on given x coordination
266 for( int i = 0, denied = 0 ; i < m_Window.x ; i++ ){
267 if( IsDenied(i) )
268 denied++;
269 if( i == x )
270 return denied;
271 }
272 return -1;
273 }
274
CharacterPerLine(bool NoCache)275 int wxHexCtrl::CharacterPerLine( bool NoCache ){ //Without spaces
276 if( !NoCache )
277 return CPL;
278 int avoid=0;
279 for ( int x = 0 ; x < m_Window.x ; x++)
280 avoid += IsDeniedCache[x];
281 CPL=m_Window.x - avoid;
282 //std::cout << "CPL: " << CPL << std::endl;
283 return ( m_Window.x - avoid );
284 }
285
GetInsertionPoint(void)286 int wxHexCtrl::GetInsertionPoint( void ){
287 return ( m_Caret.x - xCountDenied(m_Caret.x) ) + CharacterPerLine() * m_Caret.y;
288 }
289
SetInsertionPoint(unsigned int pos)290 void wxHexCtrl::SetInsertionPoint( unsigned int pos ){
291 if(pos > m_text.Length())
292 pos = m_text.Length();
293 pos = ToVisiblePosition(pos);
294 MoveCaret( wxPoint(pos%m_Window.x , pos/m_Window.x) );
295 }
296
ToVisiblePosition(int InternalPosition)297 int wxHexCtrl::ToVisiblePosition( int InternalPosition ){ // I mean for this string on hex editor "00 FC 05 C[C]" , while [] is cursor
298 if( CharacterPerLine() == 0 ) return 0; // Visible position is 8 but internal position is 11
299 int y = InternalPosition / CharacterPerLine();
300 int x = InternalPosition - y * CharacterPerLine();
301 for( int i = 0, denied = 0 ; i < m_Window.x ; i++ ){
302 if( IsDenied(i) ) denied++;
303 if( i - denied == x )
304 return ( i + y * m_Window.x );
305 }
306 //wxLogError(wxString::Format(_T("Fatal error at fx ToVisiblePosition(%d)"),InternalPosition));
307 return 0;
308 }
309
ToInternalPosition(int VisiblePosition)310 int wxHexCtrl::ToInternalPosition( int VisiblePosition ){
311 int y = VisiblePosition / m_Window.x;
312 int x = VisiblePosition - y * m_Window.x;
313 return ( x - xCountDenied(x) + y * CharacterPerLine() );
314 }
315 // 00 15 21 CC FC
316 // 55 10 49 54 [7]7
InternalPositionToVisibleCoord(int position)317 wxPoint wxHexCtrl::InternalPositionToVisibleCoord( int position ){ // Visible position is 19, Visible Coord is (9,2)
318 if( position < 0 )
319 wxLogError(wxString::Format(_T("Fatal error at fx InternalPositionToVisibleCoord(%d)"),position));
320 int x = m_Window.x? m_Window.x : 1; //prevents divide zero error;
321 int pos = ToVisiblePosition( position );
322 return wxPoint( pos - (pos / x) * x, pos / x );
323 }
324
PixelCoordToInternalPosition(wxPoint mouse)325 int wxHexCtrl::PixelCoordToInternalPosition( wxPoint mouse ){
326 mouse = PixelCoordToInternalCoord( mouse );
327 return ( mouse.x - xCountDenied(mouse.x) + mouse.y * CharacterPerLine() );
328 }
329
PixelCoordToInternalCoord(wxPoint mouse)330 wxPoint wxHexCtrl::PixelCoordToInternalCoord( wxPoint mouse ){
331 mouse.x = ( mouse.x < 0 ? 0 : mouse.x);
332 mouse.x = ( mouse.x > m_CharSize.x*m_Window.x ? m_CharSize.x*m_Window.x-1 : mouse.x);
333 mouse.y = ( mouse.y < 0 ? 0 : mouse.y);
334 mouse.y = ( mouse.y > m_CharSize.y*m_Window.y ? m_CharSize.y*m_Window.y-1 : mouse.y);
335 int x = (mouse.x - m_Margin.x) / m_CharSize.x;
336 int y = (mouse.y - m_Margin.y) / m_CharSize.y;
337 return wxPoint(x,y);
338 }
339
SetFormat(wxString fmt)340 void wxHexCtrl::SetFormat( wxString fmt ){
341 HexFormat = fmt;
342 // for(int i=0 ; i < m_Window.x+1 ; i++)
343 // IsDeniedCache[i]=IsDenied_NoCache(i);
344 }
345
GetFormat(void)346 wxString wxHexCtrl::GetFormat( void ){
347 return HexFormat;
348 }
349
SetDefaultStyle(wxTextAttr & new_attr)350 void wxHexCtrl::SetDefaultStyle( wxTextAttr& new_attr ){
351 HexDefaultAttr = new_attr;
352
353 wxClientDC dc(this);
354 dc.SetFont( HexDefaultAttr.GetFont() );
355 SetFont( HexDefaultAttr.GetFont() );
356 m_CharSize.y = dc.GetCharHeight();
357 m_CharSize.x = dc.GetCharWidth();
358
359 wxCaret *caret = GetCaret();
360 #ifdef _DEBUG_CARET_
361 std::cout << "Caret = 0x"<< (intptr_t) caret << " - mycaret= 0x" << (intptr_t) mycaret << "m_charSize.x" << m_CharSize.x << std::endl;
362 #endif
363 if ( caret )
364 caret->SetSize(m_CharSize.x, m_CharSize.y);
365 RePaint();
366 }
367
SetSelectionStyle(wxTextAttr & new_attr)368 void wxHexCtrl::SetSelectionStyle( wxTextAttr& new_attr ){
369 wxColourData clrData;
370 clrData.SetColour( new_attr.GetTextColour() );
371 select.FontClrData = clrData;
372 clrData.SetColour( new_attr.GetBackgroundColour() );
373 select.NoteClrData = clrData;
374 }
375
SetSelection(unsigned start,unsigned end)376 void wxHexCtrl::SetSelection( unsigned start, unsigned end ){
377 select.start = start;
378 select.end = end;
379 select.selected = true;
380 RePaint();
381 }
382
ClearSelection(bool repaint)383 void wxHexCtrl::ClearSelection( bool repaint ){
384 select.start = 0;
385 select.end = 0;
386 select.selected = false;
387 if( repaint )
388 RePaint();
389 }
390
MoveCaret(wxPoint p)391 void wxHexCtrl::MoveCaret(wxPoint p){
392 #ifdef _DEBUG_CARET_
393 std::cout << "MoveCaret(wxPoint) Coordinate X:Y = " << p.x << " " << p.y << std::endl;
394 #endif
395 m_Caret = p;
396 DoMoveCaret();
397 }
398
MoveCaret(int x)399 void wxHexCtrl::MoveCaret(int x){
400 #ifdef _DEBUG_CARET_
401 std::cout << "MoveCaret(ınt) = " << x << std::endl;
402 #endif
403 m_Caret.y = x/CharacterPerLine();
404 m_Caret.x = x - m_Caret.y*CharacterPerLine();
405 DoMoveCaret();
406 }
407
DoMoveCaret()408 void wxHexCtrl::DoMoveCaret(){
409 wxCaret *caret = GetCaret();
410 #ifdef _DEBUG_CARET_
411 std::cout << "Caret = 0x"<< (intptr_t) caret << " - mycaret= 0x" << (intptr_t) mycaret << "m_charSize.x" << m_CharSize.x << std::endl;
412 #endif
413 if ( caret )
414 caret->Move(m_Margin.x + m_Caret.x * m_CharSize.x,
415 m_Margin.x + m_Caret.y * m_CharSize.y);
416 }
417
CreateDC()418 inline wxMemoryDC* wxHexCtrl::CreateDC(){
419 // wxBitmap *bmp=new wxBitmap(this->GetSize().GetWidth(), this->GetSize().GetHeight());
420 // wxMemoryDC *dcTemp = new wxMemoryDC();
421 // dcTemp->SelectObject(*bmp);
422 // return dcTemp;
423 if(internalBufferDC != NULL)
424 delete internalBufferDC;
425 if(internalBufferBMP != NULL)
426 delete internalBufferBMP;
427
428 // Note that creating a 0-sized bitmap would fail, so ensure that we create
429 // at least 1*1 one.
430 wxSize sizeBmp = GetSize();
431 sizeBmp.IncTo(wxSize(1, 1));
432 internalBufferBMP= new wxBitmap(sizeBmp);
433 internalBufferDC = new wxMemoryDC();
434 internalBufferDC->SelectObject(*internalBufferBMP);
435 return internalBufferDC;
436 }
437
438 //inline wxDC* wxHexCtrl::UpdateDC(wxDC *dcTemp){
UpdateDC(wxDC * xdc)439 inline wxDC* wxHexCtrl::UpdateDC(wxDC *xdc ){
440 wxDC *dcTemp;
441 if( xdc )
442 dcTemp = xdc;
443 else if(internalBufferDC==NULL){
444 internalBufferDC = CreateDC();
445 dcTemp = internalBufferDC;
446 }
447 else
448 dcTemp = internalBufferDC;
449 //wxBufferedPaintDC *dcTemp= new wxBufferedPaintDC(this); //has problems with MacOSX
450
451 #ifdef _DEBUG_SIZE_
452 std::cout << "wxHexCtrl::Update Sizes: " << this->GetSize().GetWidth() << ":" << this->GetSize().GetHeight() << std::endl;
453 #endif
454
455 dcTemp->SetFont( HexDefaultAttr.GetFont() );
456 dcTemp->SetTextForeground( HexDefaultAttr.GetTextColour() );
457 dcTemp->SetTextBackground( HexDefaultAttr.GetBackgroundColour() ); //This will be overriden by Zebra stripping
458 wxBrush dbrush( HexDefaultAttr.GetBackgroundColour() );
459
460 dcTemp->SetBackground(dbrush );
461 dcTemp->SetBackgroundMode( wxSOLID ); // overwrite old value
462 dcTemp->Clear();
463
464 wxString line;
465 line.Alloc( m_Window.x+1 );
466 wxColour col_standart(HexDefaultAttr.GetBackgroundColour());
467
468 wxColour col_zebra(0x00FFEEEE);
469 // TODO (death#1#): Remove colour lookup for speed up
470 wxString Colour;
471 if( wxConfig::Get()->Read( _T("ColourHexBackgroundZebra"), &Colour) )
472 col_zebra.Set( Colour );
473
474 size_t textLenghtLimit = 0;
475 size_t textLength=m_text.Length();
476 // char bux[1000]; //++//
477
478 //Normal process
479 #define Hex_2_Color_Engine_Prototype 0
480 if( !Hex_2_Color_Engine_Prototype || CtrlType==2 ){
481 dcTemp->SetPen(*wxTRANSPARENT_PEN);
482 //Drawing line by line
483 for ( int y = 0 ; y < m_Window.y; y++ ){ //Draw base hex value without color tags
484 line.Empty();
485
486 //Prepare for zebra stripping
487 if (*ZebraStriping != -1 ){
488 dcTemp->SetTextBackground( (y+*ZebraStriping)%2 ? col_standart : col_zebra);
489
490 //This fills empty regions at Zebra Stripes when printed char with lower than defined
491 if(DrawCharByChar){
492 dcTemp->SetBrush( wxBrush( (y+*ZebraStriping)%2 ? col_standart : col_zebra ));
493 dcTemp->DrawRectangle( m_Margin.x, m_Margin.y + y * m_CharSize.y, m_Window.x*m_CharSize.x, m_CharSize.y);
494 }
495 }
496
497 for ( int x = 0 ; x < m_Window.x; x++ ){
498 if( IsDenied(x)){
499 line += wxT(' ');
500 //bux[x]=' ';//++//
501 continue;
502 }
503 if(textLenghtLimit >= textLength)
504 break;
505 // bux[x]=CharAt(z);//++//
506 line += CharAt(textLenghtLimit++);
507 //dcTemp->DrawText( wxString::From8BitData(&t), m_Margin.x + x*m_CharSize.x, m_Margin.y + y * m_CharSize.y );
508 }
509
510 // For encodings that have variable font with, we need to write characters one by one.
511 if(DrawCharByChar)
512 for( unsigned q = 0 ; q < line.Len() ;q++ )
513 dcTemp->DrawText( line[q], m_Margin.x + q*m_CharSize.x, m_Margin.y + y * m_CharSize.y );
514 else
515 dcTemp->DrawText( line, m_Margin.x, m_Margin.y + y * m_CharSize.y );
516 }
517 }
518 else{
519 /*** Hex to Color Engine Prototype ***/
520 char chr;
521 unsigned char chrC;
522 unsigned char R,G,B;
523 wxColour RGB;
524 int col[256];
525 //Prepare 8bit to 32Bit color table for speed
526 ///Bit 7 6 5 4 3 2 1 0
527 ///Data R R R G G G B B
528 ///OnWX B B G G G R R R
529
530 for(unsigned chrC=0;chrC<256;chrC++){
531 R=(chrC>>5)*0xFF/7;
532 G=(0x07 & (chrC>>2))*0xFF/7;
533 B=(0x03 & chrC)*0xFF/3;
534 col[chrC]=B<<16|G<<8|R;
535 }
536
537 // //Monochrome Palettes
538 // for(int chrC=0;chrC<256;chrC++){
539 // col[chrC]=chrC*0x010101; //W
540 // //col[chrC]=chrC; //R
541 // //col[chrC]=chrC<<8; //G
542 // //col[chrC]=chrC<<16; //B
543 // }
544
545 wxString RenderedHexByte;
546 for ( int y = 0 ; y < m_Window.y; y++ ){
547 for ( int x = 0 ; x < m_Window.x; ){
548 if(CtrlType==0){
549 RenderedHexByte.Empty();
550 /*while( IsDenied( x ) ){
551 RenderedHexByte=" ";
552 x++;
553 }
554 */
555 if(textLenghtLimit >= textLength)
556 break;
557
558 //First half of byte
559 RenderedHexByte += CharAt(textLenghtLimit++);
560 chr = RenderedHexByte.ToAscii()[static_cast<size_t>(0)];
561 chrC = atoh( chr ) << 4;
562
563 //Space could be here
564 int i=1;
565 while( IsDenied( x+i ) ){
566 RenderedHexByte+=wxT(" ");
567 i++;
568 }
569
570 //Second half of byte.
571 RenderedHexByte += CharAt(textLenghtLimit++);
572 chr = RenderedHexByte.ToAscii()[static_cast<size_t>(1)];
573 chrC |= atoh( chr );
574 //chrC = (atoh( RenderedHexByte.ToAscii()[0] ) << 4) | atoh( RenderedHexByte.ToAscii()[1] );
575
576 //Trailing HEX space
577 i++;
578 while( IsDenied( x+i ) ){
579 RenderedHexByte+=wxT(" ");
580 i++;
581 }
582
583 RGB.Set(col[chrC]);
584 //dcTemp->SetTextBackground( wxColour(R,G,B) );
585 dcTemp->SetTextBackground( RGB );
586 dcTemp->DrawText( RenderedHexByte, m_Margin.x + x*m_CharSize.x, m_Margin.y + y * m_CharSize.y );
587 chrC = 0;
588 x+=i;
589 }
590 //Text Coloring
591 else{
592 //Not accurate since text buffer is changed due encoding translation
593 chrC=CharAt(textLenghtLimit);
594 wxString stt=CharAt(textLenghtLimit++);
595 RGB.Set(col[chrC]);
596 dcTemp->SetTextBackground( RGB );
597 dcTemp->DrawText( stt, m_Margin.x + x*m_CharSize.x, m_Margin.y + y * m_CharSize.y );
598 x++;
599 }
600 }
601 }
602 }//Hex_2_Color_Engine_Prototype
603
604 #ifndef _Use_Graphics_Contex_ //Uding_Graphics_Context disable TAG painting at buffer.
605 int TAC = TagArray.Count();
606 if( TAC != 0 ){
607 for(int i = 0 ; i < TAC ; i++)
608 TagPainter( dcTemp, *TagArray.Item(i) );
609 }
610 if(select.selected)
611 TagPainter( dcTemp, select );
612 #endif
613 DrawCursorShadow(dcTemp);
614
615 if(ThinSeparationLines.Count() > 0)
616 for( unsigned i=0 ; i < ThinSeparationLines.Count() ; i++)
617 DrawSeperationLineAfterChar( dcTemp, ThinSeparationLines.Item(i) );
618
619 return dcTemp;
620 }
621
DrawCursorShadow(wxDC * dcTemp)622 inline void wxHexCtrl::DrawCursorShadow(wxDC* dcTemp){
623 if( m_Window.x <= 0 ||
624 FindFocus()==this)
625 return;
626
627 int y=m_CharSize.y*( m_Caret.y ) + m_Margin.y;
628 int x=m_CharSize.x*( m_Caret.x ) + m_Margin.x;
629
630 dcTemp->SetPen( *wxBLACK_PEN );
631 dcTemp->SetBrush( *wxTRANSPARENT_BRUSH );
632 dcTemp->DrawRectangle(x,y,m_CharSize.x*2+1,m_CharSize.y);
633 }
634
DrawSeperationLineAfterChar(wxDC * dcTemp,int seperationoffset)635 void wxHexCtrl::DrawSeperationLineAfterChar( wxDC* dcTemp, int seperationoffset ){
636 #ifdef _DEBUG_
637 std::cout << "DrawSeperatıonLineAfterChar(" << seperationoffset << ")" << std::endl;
638 #endif
639
640 if(m_Window.x > 0){
641 wxPoint z = InternalPositionToVisibleCoord( seperationoffset );
642 int y1=m_CharSize.y*( 1+z.y )+ m_Margin.y;
643 int y2=y1-m_CharSize.y;
644 int x1=m_CharSize.x*(z.x)+m_Margin.x;
645 int x2=m_CharSize.x*2*m_Window.x+m_Margin.x;
646
647 dcTemp->SetPen( *wxRED_PEN );
648 dcTemp->DrawLine( 0,y1,x1,y1);
649 if( z.x != 0)
650 dcTemp->DrawLine( x1,y1,x1,y2);
651 dcTemp->DrawLine( x1,y2,x2,y2);
652 }
653 }
654
655 #define _Use_Graphics_Contex_x
RePaint(void)656 void wxHexCtrl::RePaint( void ){
657 PaintMutex.Lock();
658 wxCaretSuspend cs(this);
659
660 wxDC* dcTemp = UpdateDC(); //Prepare DC
661 if( dcTemp != NULL ){
662 wxClientDC dc( this ); //Not looks working on GraphicsContext
663 ///Directly creating contentx at dc creates flicker!
664 //UpdateDC(&dc);
665
666 //dc.DrawBitmap( *internalBufferBMP, this->GetSize().GetWidth(), this->GetSize().GetHeight() ); //This does NOT work
667 #ifdef WXOSX_CARBON //wxCarbon needs +2 patch on both axis somehow.
668 dc.Blit(2, 2, this->GetSize().GetWidth(), this->GetSize().GetHeight(), dcTemp, 0, 0, wxCOPY);
669 #else
670 dc.Blit(0, 0, this->GetSize().GetWidth(), this->GetSize().GetHeight(), dcTemp, 0, 0, wxCOPY);
671 #endif //WXOSX_CARBON
672
673 #ifdef _Use_Graphics_Contex_
674 wxGraphicsContext *gc = wxGraphicsContext::Create( dc );
675 if (gc){
676 //gc->DrawBitmap( *internalBufferBMP, 0.0, 0.0, dc.GetSize().GetWidth(), dc.GetSize().GetHeight());
677 //gc->Flush();
678
679 int TAC = TagArray.Count();
680 if( TAC != 0 )
681 for(int i = 0 ; i < TAC ; i++)
682 TagPainterGC( gc, *TagArray.Item(i) );
683
684 if(select.selected)
685 TagPainterGC( gc, select );
686 delete gc;
687 }
688 else
689 std::cout << " GraphicContext returs NULL!\n";
690 #else
691
692 #endif //_Use_Graphics_Contex_
693
694 ///delete dcTemp;
695 }
696 PaintMutex.Unlock();
697 }
698
OnPaint(wxPaintEvent & WXUNUSED (event))699 void wxHexCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) ){
700 PaintMutex.Lock();
701 wxDC* dcTemp = UpdateDC(); // Prepare DC
702 if( dcTemp != NULL )
703 {
704 wxPaintDC dc( this ); //wxPaintDC because here is under native wxPaintEvent.
705 //wxAutoBufferedPaintDC dc( this );
706 ///Directly creating contentx at dc creates flicker!
707 //UpdateDC(&dc);
708
709 //dc.DrawBitmap( *internalBufferBMP, this->GetSize().GetWidth(), this->GetSize().GetHeight() ); //This does NOT work
710 dc.Blit(0, 0, this->GetSize().GetWidth(), this->GetSize().GetHeight(), dcTemp, 0, 0, wxCOPY);
711 #ifdef _Use_Graphics_Contex_
712 wxGraphicsContext *gc = wxGraphicsContext::Create( dc );
713 if (gc){
714 //gc->DrawBitmap( *internalBufferBMP, 0.0, 0.0, dc.GetSize().GetWidth(), dc.GetSize().GetHeight());
715 //gc->Flush();
716 //// // make a path that contains a circle and some lines
717 gc->SetPen( *wxRED_PEN );
718 wxGraphicsPath path = gc->CreatePath();
719 path.AddCircle( 50.0, 50.0, 50.0 );
720 path.MoveToPoint(0.0, 50.0);
721 path.AddLineToPoint(100.0, 50.0);
722 path.MoveToPoint(50.0, 0.0);
723 path.AddLineToPoint(50.0, 100.0 );
724 path.CloseSubpath();
725 path.AddRectangle(25.0, 25.0, 50.0, 50.0);
726 gc->StrokePath(path);
727
728 int TAC = TagArray.Count();
729 if( TAC != 0 )
730 for(int i = 0 ; i < TAC ; i++)
731 TagPainterGC( gc, *TagArray.Item(i) );
732
733 if(select.selected)
734 TagPainterGC( gc, select );
735
736 delete gc;
737 }
738 #endif
739 ///delete dcTemp;
740 }
741 PaintMutex.Unlock();
742 }
743
TagPainter(wxDC * DC,TagElement & TG)744 void wxHexCtrl::TagPainter( wxDC* DC, TagElement& TG ){
745 //Selection Painter
746 DC->SetFont( HexDefaultAttr.GetFont() );
747 DC->SetTextForeground( TG.FontClrData.GetColour() );
748 //// DC->SetTextBackground( TG.NoteClrData.GetColour() );
749 DC->SetTextBackground( TG.SoftColour( TG.NoteClrData.GetColour() ));
750
751 //wxBrush sbrush( TG.NoteClrData.GetColour() );
752 //wxBrush sbrush( wxColor((unsigned long) 0x0000000),wxBRUSHSTYLE_TRANSPARENT );
753
754 //preparation for wxGCDC, wxGraphicsContext req for semi transparent marking.
755
756 //wxColor a = TG.NoteClrData.GetColour();
757 //a.Set( a.Red(),a.Green(),a.Blue(), 10);
758 //wxBrush sbrush(wxBrush(a,wxBRUSHSTYLE_TRANSPARENT ));
759 //DC->SetBrush( sbrush );
760 //DC->SetBackground( sbrush );
761 //DC->SetBackgroundMode( wxSOLID ); // overwrite old value
762
763 int start = TG.start;
764 int end = TG.end;
765
766 if( start > end )
767 wxSwap( start, end );
768
769 if( start < 0 )
770 start = 0;
771
772 if ( end > ByteCapacity()*2)
773 end = ByteCapacity()*2;
774
775 // TODO (death#1#): Here problem with Text Ctrl.Use smart pointer...?
776 wxPoint _start_ = InternalPositionToVisibleCoord( start );
777 wxPoint _end_ = InternalPositionToVisibleCoord( end );
778 wxPoint _temp_ = _start_;
779
780 #ifdef _DEBUG_PAINT_
781 std::cout << "Tag paint from : " << start << " to " << end << std::endl;
782 #endif
783
784 //char bux[1024];//++//
785 for ( ; _temp_.y <= _end_.y ; _temp_.y++ ){
786 wxString line;
787 _temp_.x = ( _temp_.y == _start_.y ) ? _start_.x : 0; //calculating local line start
788 int z = ( _temp_.y == _end_.y ) ? _end_.x : m_Window.x; // and end point
789 for ( int x = _temp_.x; x < z; x++ ){ //Prepare line to write process
790 if( IsDenied(x) ){
791 if(x+1 < z){
792 line += wxT(' ');
793 //bux[x]=' ';//++//
794 //#if wxCHECK_VERSION(2,9,0) & defined( __WXOSX__ ) //OSX DrawText bug
795 // DC->DrawText( wxString::FromAscii(' '), m_Margin.x + x*m_CharSize.x, m_Margin.y + _temp_.y * m_CharSize.y );
796 //#endif
797 }
798 continue;
799 }
800 //bux[x]=CharAt(start); //++//
801 line += CharAt(start++);
802
803 //#if wxCHECK_VERSION(2,9,0) & defined( __WXOSX__ ) //OSX DrawText bug
804 // DC->DrawText( wxString::FromAscii(ch), m_Margin.x + x*m_CharSize.x, m_Margin.y + _temp_.y * m_CharSize.y );
805 //#endif
806 }
807
808 //#if !(wxCHECK_VERSION(2,9,0) & defined( __WXOSX__ )) //OSX DrawText bug
809
810 ///Cannot convert from the charset 'Windows/DOS OEM (CP 437)'!
811 // line=wxString(bux, wxCSConv(wxFONTENCODING_CP437), _temp_.y);
812 //line=wxString(line.To8BitData(), wxCSConv(wxFONTENCODING_ALTERNATIVE), line.Len());
813
814 //line=CP473toUnicode(line);
815
816 //Draw one character at a time to keep char with stable.
817 if(DrawCharByChar){
818 //DC->SetBrush( wxBrush(TG.NoteClrData.GetColour()));
819 //DC->DrawRectangle( m_Margin.x + _temp_.x*m_CharSize.x , m_Margin.y + _temp_.y * m_CharSize.y, line.Len()*m_CharSize.x, m_CharSize.y);
820
821 // if(gc){
822 // gc->SetPen( *wxRED_PEN );
823 // gc->SetBrush( wxBrush(TG.NoteClrData.GetColour()));
824 // wxGraphicsPath path = gc->CreatePath();
825 // path.AddRectangle(m_Margin.x + _temp_.x*m_CharSize.x , m_Margin.y + _temp_.y * m_CharSize.y, line.Len()*m_CharSize.x, m_CharSize.y);
826 // gc->StrokePath(path);
827 // gc->DrawRectangle( m_Margin.x + _temp_.x*m_CharSize.x , m_Margin.y + _temp_.y * m_CharSize.y, line.Len()*m_CharSize.x, m_CharSize.y);
828 // }
829
830
831 for( unsigned q = 0 ; q < line.Len() ;q++ )
832 DC->DrawText( line[q], m_Margin.x + (_temp_.x+q)*m_CharSize.x, m_Margin.y + _temp_.y * m_CharSize.y );
833 }
834 else
835 DC->DrawText( line, m_Margin.x + _temp_.x * m_CharSize.x, //Write prepared line
836 m_Margin.x + _temp_.y * m_CharSize.y );
837 //#endif
838 }
839 // if(gc) delete gc;
840 }
841
TagPainterGC(wxGraphicsContext * gc,TagElement & TG)842 void wxHexCtrl::TagPainterGC( wxGraphicsContext* gc, TagElement& TG ){
843 wxGraphicsFont wxgfont = gc->CreateFont( HexDefaultAttr.GetFont(), TG.FontClrData.GetColour() ) ;
844 gc->SetFont( wxgfont );
845 //gc->SetTextBackground( TG.SoftColour( TG.NoteClrData.GetColour() ));
846
847 int start = TG.start;
848 int end = TG.end;
849
850 if( start > end )
851 wxSwap( start, end );
852
853 if( start < 0 )
854 start = 0;
855
856 if ( end > ByteCapacity()*2 )
857 end = ByteCapacity()*2;
858
859 // TODO (death#1#): Here problem with Text Ctrl.Use smart pointer...?
860 wxPoint _start_ = InternalPositionToVisibleCoord( start );
861 wxPoint _end_ = InternalPositionToVisibleCoord( end );
862 wxPoint _temp_ = _start_;
863
864 #ifdef _DEBUG_PAINT_
865 std::cout << "Tag paint from : " << start << " to " << end << std::endl;
866 #endif
867 wxColor a;
868 a.SetRGBA( TG.NoteClrData.GetColour().GetRGB() | 80 << 24 );
869 wxBrush sbrush(wxBrush(a, wxBRUSHSTYLE_SOLID ));
870 gc->SetBrush( sbrush );
871 wxGraphicsBrush gcbrush = gc->CreateBrush( sbrush );
872 //gc->SetPen( *wxRED_PEN );
873 //Scan for each line
874 for ( ; _temp_.y <= _end_.y ; _temp_.y++ ){
875 wxString line;
876 _temp_.x = ( _temp_.y == _start_.y ) ? _start_.x : 0; //calculating local line start
877 int z = ( _temp_.y == _end_.y ) ? _end_.x : m_Window.x; // and end point
878 for ( int x = _temp_.x; x < z; x++ ){ //Prepare line to write process
879 if( IsDenied(x) ){
880 if(x+1 < z){
881 line += wxT(' ');
882 }
883 continue;
884 }
885 line += CharAt(start++);
886 }
887 //gc->DrawRectangle( m_Margin.x + _temp_.x*m_CharSize.x , m_Margin.y + _temp_.y * m_CharSize.y, line.Len()*m_CharSize.x, m_CharSize.y);
888 //gc->DrawRoundedRectangle( m_Margin.x + _temp_.x*m_CharSize.x , m_Margin.y + _temp_.y * m_CharSize.y, line.Len()*m_CharSize.x, m_CharSize.y, 0.1);
889 // gc->DrawText( line, m_Margin.x + _temp_.x * m_CharSize.x, //Write prepared line
890 // m_Margin.x + _temp_.y * m_CharSize.y );
891
892 gc->DrawText( line, m_Margin.x + _temp_.x * m_CharSize.x, //Write prepared line
893 m_Margin.x + _temp_.y * m_CharSize.y, gcbrush );
894
895 }
896 }
897
IsAllowedChar(const char & chr)898 bool wxHexCtrl::IsAllowedChar(const char& chr){
899 return isxdigit( chr );
900 }
901
OnChar(wxKeyEvent & event)902 void wxHexCtrl::OnChar( wxKeyEvent &event ){
903 #ifdef _DEBUG_
904 std::cout << "wxHexCtrl::OnChar" << std::endl;
905 #endif
906 switch (event.GetKeyCode()){
907 case WXK_LEFT:case WXK_NUMPAD_LEFT: PrevChar(); break;
908 case WXK_RIGHT:case WXK_NUMPAD_RIGHT: NextChar(); break;
909 case WXK_UP:case WXK_NUMPAD_UP: PrevLine(); break;
910 case WXK_DOWN:case WXK_NUMPAD_DOWN: NextLine(); break;
911 case WXK_HOME:case WXK_NUMPAD_HOME: Home(); break;
912 case WXK_END:case WXK_NUMPAD_END: End(); break;
913 case WXK_RETURN: Home( false ); NextLine(); break;
914 case WXK_PAGEUP:case WXK_NUMPAD_PAGEUP:
915 case WXK_PAGEDOWN:case WXK_NUMPAD_PAGEDOWN: break;
916 case WXK_DELETE:case WXK_NUMPAD_DELETE:
917 if( !IsDenied() )
918 Replace(GetInsertionPoint(),'0');
919 else
920 wxBell();
921 break;
922 case WXK_BACK:
923 if( GetInsertionPoint()!=0 ){
924 PrevChar();
925 if( !IsDenied() )
926 Replace(GetInsertionPoint(),'0');
927 }
928 else
929 wxBell();
930 break;
931 // TODO (death#3#): CTRL+X
932 default:
933 wxChar chr = event.GetKeyCode();
934 if( IsAllowedChar(chr) && !event.AltDown() && !event.ShiftDown() && !IsDenied() ){
935 // TODO (death#1#): if text selected, enter from begining!
936 // TODO (death#2#): If text Selected, than remove select first?
937 select.selected=false;
938 (chr>='a'&&chr<='z')?(chr-=('a'-'A')):(chr=chr); //Upper() for Char
939 WriteHex(chr);
940
941 //CharAt(m_Caret.x, m_Caret.y) = ch;
942 /* wxCaretSuspend cs(this);
943 wxClientDC dc(this);
944 dc.SetFont(m_font);
945 dc.SetBackgroundMode(wxSOLID); // overwrite old value
946 dc.DrawText(chr, m_Margin.x + m_Caret.x * m_CharSize.x,
947 m_Margin.x + m_Caret.y * m_CharSize.y );
948 NextChar();
949 */
950 }
951 else{
952 wxBell();
953 }
954 event.Skip();
955 break;
956
957 }//switch end
958 // wxYield();
959 // hex_selector(event);
960 // paint_selection();
961 DoMoveCaret();
962 }
963
ChangeSize()964 void wxHexCtrl::ChangeSize(){
965 unsigned gip = GetInsertionPoint();
966 wxSize size = GetClientSize();
967
968 m_Window.x = (size.x - 2*m_Margin.x) / m_CharSize.x;
969 m_Window.y = (size.y - 2*m_Margin.x) / m_CharSize.y;
970 if ( m_Window.x < 1 )
971 m_Window.x = 1;
972 if ( m_Window.y < 1 )
973 m_Window.y = 1;
974
975 for(int i=0 ; i < m_Window.x+1 ; i++)
976 IsDeniedCache[i]=IsDenied_NoCache(i);
977 CharacterPerLine( true );//Updates CPL static int
978
979 //This Resizes internal buffer!
980 CreateDC();
981
982 RePaint();
983 SetInsertionPoint( gip );
984
985 #if wxUSE_STATUSBAR
986 wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
987
988 if ( frame && frame->GetStatusBar() ){
989 wxString msg;
990 msg.Printf(_T("Panel size is (%d, %d)"), m_Window.x, m_Window.y);
991 frame->SetStatusText(msg, 1);
992 }
993 #endif // wxUSE_STATUSBAR
994 }
995 //--------WRITE FUNCTIONS-------------//
996
WriteHex(const wxString & value)997 void wxHexCtrl::WriteHex( const wxString& value ){ //write string as hex value to current position
998 Replace(GetInsertionPoint(), GetInsertionPoint()+value.Length(), value);
999 }
1000
WriteByte(const unsigned char & byte)1001 void wxHexCtrl::WriteByte( const unsigned char& byte ){ //write string as bin value to current position
1002 unsigned byte_location = GetInsertionPoint()/2;
1003 wxString buffer;
1004 buffer << (byte >> 4);
1005 buffer << (byte & 0x0F);
1006 Replace( byte_location*2,byte_location*2+2,buffer );
1007 }
1008
SetBinValue(wxString buffer,bool repaint)1009 void wxHexCtrl::SetBinValue( wxString buffer, bool repaint ){
1010 m_text.Clear();
1011 for( unsigned i=0 ; i < buffer.Length() ; i++ )
1012 m_text += wxString::Format(wxT("%02X"), static_cast<unsigned char>(buffer.at(i)));
1013 if(repaint)
1014 RePaint();
1015 }
1016
SetBinValue(char * buffer,int byte_count,bool repaint)1017 void wxHexCtrl::SetBinValue( char* buffer, int byte_count, bool repaint ){
1018 m_text.Clear();
1019 for( int i=0 ; i < byte_count ; i++ )
1020 m_text += wxString::Format(wxT("%02X"), static_cast<unsigned char>(buffer[i]));
1021 if(repaint)
1022 RePaint();
1023 }
1024
GetValue(void)1025 wxString wxHexCtrl::GetValue( void ){
1026 return m_text;
1027 }
1028
Replace(unsigned hex_location,const wxChar & value,bool repaint)1029 void wxHexCtrl::Replace(unsigned hex_location, const wxChar& value, bool repaint){
1030 if( hex_location < m_text.Length() )
1031 m_text[hex_location] = value;
1032 else{
1033 m_text << value;
1034 m_text << wxT("0");
1035 }
1036 if(repaint)
1037 RePaint();
1038 }
1039
Replace(unsigned from,unsigned to,const wxString & value)1040 void wxHexCtrl::Replace(unsigned from, unsigned to, const wxString& value){
1041 if( from >= to ) return;
1042 // TODO (death#4#): IsHEX?
1043 if (!value.IsEmpty()){
1044 // TODO (death#4#): Optimization available with use direct buffer copy
1045 for( int i = 0; static_cast<unsigned>(i) < value.Length() && from < to ; i++,from++ ){
1046 Replace( from, value[i], false );
1047 /* if( GetByteCount() <= from+i ) //add new hex char
1048 m_text << value[i];
1049 else //replace old hex
1050 m_text[from+i] = value[i];
1051 */
1052 }
1053 SetInsertionPoint( to );
1054 /* wxCaretSuspend cs(this);
1055 wxClientDC dc(this);
1056 dc.SetFont(m_font);
1057 dc.SetBackgroundMode(wxSOLID); // overwrite old value
1058 dc.DrawText(chr, m_Margin.x + m_Caret.x * m_CharSize.x,
1059 m_Margin.x + m_Caret.y * m_CharSize.y );
1060 NextChar();
1061 */
1062 RePaint();
1063 }
1064 else
1065 wxBell();
1066 }
1067
ReadByte(int byte_location)1068 char wxHexCtrl::ReadByte( int byte_location ){
1069 wxString hx;
1070 hx << m_text[ byte_location*2 ] << m_text[ byte_location*2+1 ];
1071 return static_cast<char*>(HexToBin(hx).GetData())[0];
1072 }
1073
atoh(const char hex)1074 int atoh(const char hex){
1075 return ( hex >= '0' && hex <= '9' ) ? hex -'0' :
1076 ( hex >= 'a' && hex <= 'f' ) ? hex -'a' + 10:
1077 ( hex >= 'A' && hex <= 'F' ) ? hex -'A' + 10:
1078 -1;
1079 }
1080
HexToBin(const wxString & HexValue)1081 wxMemoryBuffer wxHexCtrl::HexToBin(const wxString& HexValue){
1082 wxMemoryBuffer memodata;
1083 memodata.SetBufSize(HexValue.Length()/3+1);
1084 char bfrL, bfrH;
1085 for(unsigned int i=0 ; i < HexValue.Length() ; i+=2){
1086 if( HexValue[i] == ' ' || HexValue[i] == ',' ){ //Removes space and period chars.
1087 i--; //Means +1 after loop increament of +2. Don't put i++ due HexValue.Length() check
1088 continue;
1089 }
1090 else if ((HexValue[i] == '0' || HexValue[i] == '\\') && ( HexValue[i+1] == 'x' || HexValue[i+1] == 'X')){ //Removes "0x", "0X", "\x", "\X" strings.
1091 continue; //Means +2 by loop increament.
1092 }
1093 bfrH = atoh( HexValue[i] );
1094 bfrL = atoh( HexValue[i+1] );
1095 //Check for if it's Hexadecimal
1096 if( !(bfrH < 16 && bfrL < 16 && bfrH >= 0 && bfrL >= 0 )){
1097 wxBell();
1098 return memodata;
1099 }
1100 bfrL = bfrH << 4 | bfrL;
1101 memodata.AppendByte( bfrL );
1102 }
1103 return memodata;
1104 }
1105 //------------EVENT HANDLERS---------------//
OnFocus(wxFocusEvent & event)1106 void wxHexCtrl::OnFocus(wxFocusEvent& event ){
1107 #ifdef _DEBUG_
1108 std::cout << "wxHexCtrl::OnFocus()" << std::endl;
1109 #endif
1110 wxCaret *caret = GetCaret();
1111 #ifdef _DEBUG_CARET_
1112 std::cout << "Caret = 0x"<< (intptr_t) caret << " - mycaret= 0x" << (intptr_t) mycaret << "m_charSize.x" << m_CharSize.x << std::endl;
1113 #endif
1114 if ( caret )
1115 caret->Show(true);
1116 }
1117
OnKillFocus(wxFocusEvent & event)1118 void wxHexCtrl::OnKillFocus(wxFocusEvent& event ){
1119 #ifdef _DEBUG_
1120 std::cout << "wxHexCtrl::OnKillFocus()" << std::endl;
1121 #endif
1122 wxCaretSuspend cs(this);
1123 wxCaret *caret = GetCaret();
1124 if ( caret )
1125 caret->Show(false);
1126
1127 if( TagMutex!=NULL )
1128 if( *TagMutex ){
1129 for( unsigned i = 0 ; i < TagArray.Count() ; i++ )
1130 TagArray.Item(i)->Hide();
1131 *TagMutex = false;
1132 }
1133
1134 event.Skip();
1135 }
1136
OnSize(wxSizeEvent & event)1137 void wxHexCtrl::OnSize( wxSizeEvent &event ){
1138 #ifdef _DEBUG_SIZE_
1139 std::cout << "wxHexCtrl::OnSize X,Y" << event.GetSize().GetX() <<',' << event.GetSize().GetY() << std::endl;
1140 #endif
1141 ChangeSize();
1142 event.Skip();
1143 }
1144
OnMouseMove(wxMouseEvent & event)1145 void wxHexCtrl::OnMouseMove( wxMouseEvent& event ){
1146 #ifdef _DEBUG_MOUSE_
1147 std::cout << "wxHexCtrl::OnMouseMove Coordinate X:Y = " << event.m_x << " " << event.m_y
1148 << "\tLMR mouse button:" << event.m_leftDown << event.m_middleDown << event.m_rightDown << std::endl;
1149 #endif
1150 if(event.m_leftDown){
1151 select.end = PixelCoordToInternalPosition( event.GetPosition() );
1152 SetInsertionPoint( select.end );
1153 if(select.start != select.end)
1154 select.selected = true;
1155 else
1156 select.selected = false;
1157 #ifdef _DEBUG_SELECT_
1158 std::cout << "wxHexCtrl::Selection is " << (select.selected?"true":"false") << " from " << select.start << " to " << select.end << std::endl;
1159 #endif
1160 RePaint();
1161 }
1162 else{
1163 unsigned TagDetect = PixelCoordToInternalPosition( event.GetPosition() );
1164 TagElement *TAX;
1165 for( unsigned i = 0 ; i < TagArray.Count() ; i++ ){
1166 TAX = TagArray.Item(i);
1167 if( (TagDetect >= TAX->start ) && (TagDetect < TAX->end ) ){ //end not included!
1168 if( !(*TagMutex) && wxTheApp->IsActive() ) {
1169 *TagMutex=true;
1170 TAX->Show( this->ClientToScreen(event.GetPosition() ) , this );
1171 }
1172 break;
1173 }
1174 }
1175 }
1176 }
GetTagByPix(wxPoint PixPos)1177 TagElement* wxHexCtrl::GetTagByPix( wxPoint PixPos ){
1178 unsigned TagDetect = PixelCoordToInternalPosition( PixPos );
1179 TagElement *TAX;
1180 for( unsigned i = 0 ; i < TagArray.Count() ; i++ ){
1181 TAX = TagArray.Item(i);
1182 if( (TagDetect >= TAX->start ) && (TagDetect < TAX->end ) )
1183 return TagArray.Item(i);
1184 }
1185 return NULL;
1186 }
1187
OnMouseLeft(wxMouseEvent & event)1188 void wxHexCtrl::OnMouseLeft( wxMouseEvent& event ){
1189 SetInsertionPoint( PixelCoordToInternalPosition( event.GetPosition() ) );
1190 select.start=GetInsertionPoint();
1191 }
1192
OnMouseRight(wxMouseEvent & event)1193 void wxHexCtrl::OnMouseRight( wxMouseEvent& event ){
1194 event.Skip();
1195 LastRightClickPosition = event.GetPosition();
1196 ShowContextMenu( LastRightClickPosition );
1197 }
1198
ShowContextMenu(wxPoint pos)1199 void wxHexCtrl::ShowContextMenu( wxPoint pos ){
1200 wxMenu menu;
1201
1202 unsigned TagPosition = PixelCoordToInternalPosition( pos );
1203 TagElement *TAG;
1204 for( unsigned i = 0 ; i < TagArray.Count() ; i++ ){
1205 TAG = TagArray.Item(i);
1206 if( (TagPosition >= TAG->start ) && (TagPosition < TAG->end ) ){ //end not included!
1207 menu.Append(__idTagEdit__, _T("Tag Edit"));
1208 break;
1209 }
1210 }
1211
1212 if( select.selected ){
1213 menu.Append(__idTagAddSelect__, _T("Tag Selection"));
1214 }
1215 // menu.AppendSeparator();
1216 PopupMenu(&menu, pos);
1217 // test for destroying items in popup menus
1218 #if 0 // doesn't work in wxGTK!
1219 menu.Destroy(Menu_Popup_Submenu);
1220 PopupMenu( &menu, event.GetX(), event.GetY() );
1221 #endif // 0
1222 }
1223
OnTagEdit(wxCommandEvent & event)1224 void wxHexCtrl::OnTagEdit( wxCommandEvent& event ){
1225 TagElement *TAG;
1226 unsigned pos = PixelCoordToInternalPosition( LastRightClickPosition );
1227 for( unsigned i = 0 ; i < TagArray.Count() ; i++ ){
1228 TAG = TagArray.Item(i);
1229 if( TAG->isCover( pos ) ){
1230 TAG->Hide(); //Hide first, or BUG by double hide...
1231 TagElement TAGtemp = *TAG;
1232 TagDialog *x=new TagDialog( TAGtemp, this );
1233 switch( x->ShowModal() ){
1234 case wxID_SAVE:
1235 *TAG = TAGtemp;
1236 break;
1237 case wxID_DELETE:
1238 {
1239 delete TAG;
1240 TagArray.Remove(TAG);
1241 }
1242 break;
1243 default:
1244 break;
1245 }
1246 }
1247 }
1248 }
1249
OnTagAddSelection(wxCommandEvent & event)1250 void wxHexCtrl::OnTagAddSelection( wxCommandEvent& event ){
1251 if(select.selected){
1252 TagElement *TAG = new TagElement;
1253 TAG->start=select.start;
1254 TAG->end=select.end;
1255 TagDialog *x=new TagDialog( *TAG, this );
1256 if( x->ShowModal() == wxID_SAVE)
1257 TagArray.Add( TAG );
1258 else
1259 delete TAG;
1260 x->Destroy();
1261 }
1262 }
1263
OnTagHideAll(void)1264 void wxHexCtrl::OnTagHideAll( void ){
1265 for( unsigned i = 0 ; i < TagArray.Count() ; i++ )
1266 TagArray.Item(i)->Hide();
1267 }
1268
OnTestCall(void)1269 void wxHexCtrl::OnTestCall( void ){
1270 wxBell();
1271 wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
1272 wxString msg;
1273 if ( frame && frame->GetStatusBar() )
1274 switch(1){
1275 case 0:{ // ToVisiblePosition & ToInternalPosition fx test case
1276 for(unsigned int i = 0 ; i < m_text.Length() ; i++){
1277 if( ToInternalPosition(i) != ToInternalPosition(ToVisiblePosition(ToInternalPosition(i)))){
1278 msg.Printf(_T("To[Visible/Internal]Position fx test false at: %d"), i);
1279 break;
1280 }
1281 }
1282 std::cout << "To[Visible/Internal]Position fx test success" << std::endl;
1283 break;
1284 }
1285 case 1:{ // SetInsertionPoint & GetInsertionPoint fx test case
1286 for (int i = 0 ; i < GetLastPosition() ; i++ ){
1287 SetInsertionPoint(i);
1288 if( i != GetInsertionPoint() )
1289 std::cout << "[Set/Get]InsertionPoint false at: " << GetInsertionPoint() << i << std::endl;
1290 }
1291 std::cout << "[Set/Get]InsertionPoint fx test success" << std::endl;
1292 break;
1293 }
1294 case 2:{
1295 char x = 0;
1296 WriteByte(x);
1297 msg.Empty();
1298 msg << _T("ReadByte/WriteByte: ");
1299 if( x == ReadByte(0) )
1300 msg << _T("OK");
1301 else
1302 msg << _T("FAILED");
1303 frame->SetStatusText(msg, 0);
1304 }
1305 break;
1306 case 5:{
1307 //SetStyle(4,5,HexSelectAttr);
1308 break;
1309 }
1310 case 6:{
1311 char x[] = "0123456789000000";
1312 SetBinValue(x,16);
1313 /*
1314 msg.Empty();
1315 msg << _("ReadByte/WriteByte: ");
1316 if( x == ReadByte(0) )
1317 msg << _("OK");
1318 else
1319 msg << _("FAILED");
1320 frame->SetStatusText(msg, 0);
1321 */
1322 break;
1323 }
1324 }
1325 }
1326
1327 ///------HEXTEXTCTRL-----///
1328 /*
1329 inline wxChar CP437toUnicodeCHR( const unsigned char& chr){
1330 return CP437Table[chr];
1331 }
1332
1333 inline wxString CP437toUnicode( wxString& line ){
1334 wxString ret;
1335 for(unsigned i=0; i < line.Len() ; i++)
1336 ret+=CP437Table[line[i]];
1337 return ret;
1338 }
1339 */
Filter(const unsigned char & ch)1340 inline wxChar wxHexTextCtrl::Filter(const unsigned char& ch){
1341 return CodepageTable[ch];
1342 }
1343
FilterMBBuffer(const char * str,int Len,int fontenc)1344 inline wxString wxHexTextCtrl::FilterMBBuffer( const char *str, int Len, int fontenc ){
1345 wxString ret;
1346 //wxCSConv mcv(wxFONTENCODING_UTF8);
1347 // size_t WC2MB(char* buf, const wchar_t* psz, size_t n) const
1348 // size_t MB2WC(wchar_t* buf, const char* psz, size_t n) const
1349 wxString z;
1350 if(fontenc==wxFONTENCODING_UTF8)
1351 for( int i=0 ; i< Len ; i++){
1352 unsigned char ch = str[i];
1353 if(ch < 0x20) ret+='.'; // Control characters
1354 else if( ch >= 0x20 && ch <= 0x7E ) ret+=ch; // ASCII compatible part
1355 else if( ch == 0x7F) ret+='.'; // Control character
1356 else if( ch >= 0x80 && ch < 0xC0 ) ret+='.'; // 6 Bit Extension Region
1357 else if( ch >= 0xC0 && ch < 0xC2 ) ret+='.'; // Invalid UTF8 2 byte codes
1358 else if( ch >= 0xC2 && ch < 0xE0 ) { // 2 Byte UTF Start Codes
1359 z=wxString::FromUTF8( str+i, 2);
1360 //z=wxString( str+i, wxCSConv(wxFONTENCODING_UTF8), 2);
1361 if( z.Len() > 0){
1362 ret+=z;
1363 ret+=' ';
1364 i+=1;
1365 }
1366 else
1367 ret+='.';
1368 }
1369 else if( ch >= 0xE0 && ch < 0xF0 ){ // 3 Byte UTF Start Codes
1370 z=wxString::FromUTF8( str+i, 3);
1371 if( z.Len() > 0){
1372 ret+=z;
1373 ret+=wxT(" ");
1374 i+=2;
1375 }
1376 else
1377 ret+='.';
1378 }
1379 else if( ch >= 0xF0 && ch < 0xF5 ){ // 4 Byte UTF Start Codes
1380 // ret+=wxString(str+i, wxConvUTF8, 4);
1381 z=wxString::FromUTF8( str+i, 4);
1382 if( z.Len() > 0){
1383 ret+=z;
1384 ret+=wxT(" ");
1385 i+=3;
1386 }
1387 else
1388 ret+='.';
1389 }
1390 else if( ch >= 0xF5 && ch <=0xFF ) ret+='.'; // Invalid UTF8 4 byte codes
1391 }
1392 /*
1393 else if(fontenc==wxFONTENCODING_UTF16){
1394 for( int i=0 ; i< Len-1 ; i+=2){
1395 z=wxString ( str+i, wxCSConv(wxFONTENCODING_UTF16), 2);
1396 if(!(str[i]==0 && str[i+1]==0))
1397 ret+=z[0];
1398 else
1399 ret+=wxT(" ");
1400 }
1401 }
1402 */
1403 else if(fontenc==wxFONTENCODING_UTF16)
1404 for( int i=0 ; i< Len-1 ; i+=2)
1405 ret+=wxString( str+i, wxCSConv(wxFONTENCODING_UTF16), 2);
1406
1407 else if(fontenc==wxFONTENCODING_UTF16LE)
1408 for( int i=0 ; i< Len-1 ; i+=2)
1409 ret+=wxString( str+i, wxCSConv(wxFONTENCODING_UTF16LE), 2);
1410
1411 else if(fontenc==wxFONTENCODING_UTF16BE)
1412 for( int i=0 ; i< Len-1 ; i+=2)
1413 ret+=wxString( str+i, wxCSConv(wxFONTENCODING_UTF16BE), 2);
1414
1415 else if(fontenc==wxFONTENCODING_UTF32)
1416 for( int i=0 ; i< Len-3 ; i+=4)
1417 ret+=wxString( str+i, wxCSConv(wxFONTENCODING_UTF32), 4);
1418
1419 else if(fontenc==wxFONTENCODING_UTF32LE)
1420 for( int i=0 ; i< Len-3 ; i+=4)
1421 ret+=wxString( str+i, wxCSConv(wxFONTENCODING_UTF32LE), 4);
1422
1423 else if(fontenc==wxFONTENCODING_UTF32BE)
1424 for( int i=0 ; i< Len-3 ; i+=4)
1425 ret+=wxString( str+i, wxCSConv(wxFONTENCODING_UTF32BE), 4);
1426
1427 else if(fontenc==wxFONTENCODING_UNICODE){
1428 }
1429
1430 else if(fontenc==wxFONTENCODING_SHIFT_JIS){
1431 //wxCSConv m_SJISConv = wxCSConv(wxFONTENCODING_SHIFT_JIS); //error on linux
1432 wxCSConv SJISConv = wxCSConv(wxT("SHIFT-JIS"));
1433 for( int i=0 ; i< Len ; i++){
1434 unsigned char ch = str[i];
1435 if(ch < 0x20) ret+='.'; //Control characters
1436 else if( (ch >= 0x20 && ch <= 0x7E) || //ASCII
1437 (ch > 0xA0 && ch < 0xE0 )){ //One-byte JIS X 0208 character
1438 ret+=wxString( str+i, SJISConv, 1);
1439 //ret+='O';//for debug
1440 }
1441 else if(ch < 0x81 || ch >= 0xF0 || ch==0xA0) ret+='.'; // Void Characters
1442 else if(Len>i){ //First byte of a double-byte JIS X 0208 character
1443 ch = str[i+1]; //Fetching second character.
1444 if( ch>=0x40 && ch!=0x7F && ch<=0xFC ){ //Second byte of a double-byte JIS X 0208 character
1445 z=wxString( str+i, SJISConv, 2);
1446 if(z.Len()>0){
1447 ret+=z + wxT(" ");
1448 i++;
1449 }
1450 else
1451 ret+='.';
1452 //ret+=wxString( str+i, wxCSConv(wxFONTENCODING_SHIFT_JIS), 2);
1453 //ret+='X';//for debug
1454 }
1455 else
1456 ret+='.'; // First character is fit but second doesn't. So this is void character
1457 }
1458 }
1459 }
1460
1461 else if(fontenc==wxFONTENCODING_CP949){//"EUC-KR"
1462 for( int i=0 ; i< Len ; i++){
1463 unsigned char ch = str[i];
1464 if(ch>=0x21 && ch<=0x7E) ret+=wxChar(ch); //ASCII part
1465 else if(ch>=0xA1 && ch<=0xFE && Len>i ){ // KS X 1001 (G1, code set 1) is encoded as two bytes in GR (0xA1-0xFE)
1466 ch=str[i+1];
1467 if(ch>=0xA1 && ch<=0xFE){
1468 z=wxString( str+i, wxCSConv(wxFONTENCODING_CP949), 2);
1469 if(z.Len()>0){
1470 ret+=z + wxT(" ");
1471 i++;
1472 }
1473 else
1474 ret+='.';
1475 }
1476 else
1477 ret+='.';
1478 }
1479 else
1480 ret+='.';
1481 }
1482 }
1483
1484 else if(fontenc==wxFONTENCODING_BIG5){
1485 // wxCSConv Big5Conv = wxCSConv(wxFONTENCODING_BIG5); //Error on linux
1486 wxCSConv Big5Conv = wxCSConv(wxT("BIG5"));
1487 // First byte ("lead byte") 0x81 to 0xfe (or 0xa1 to 0xf9 for non-user-defined characters)
1488 // Second byte 0x40 to 0x7e, 0xa1 to 0xfe
1489 for( int i=0 ; i< Len ; i++){
1490 unsigned char ch = str[i];
1491 if(ch<0x20 || ch==0x7F || ch==0x80 || ch==0xFF )
1492 ret+='.';
1493 else if( (ch >= 0x81 && ch <= 0xFE) || //1.st byte
1494 (ch >= 0xA1 && ch < 0xF9 ) ){
1495 ch = str[i+1];
1496 if((ch >= 0x40 && ch <= 0x7E) || //2.nd byte
1497 (ch >= 0xA1 && ch <= 0xFE )){
1498 z=wxString(str+i, Big5Conv, 2);
1499 if( z.Len() > 0){
1500 ret+=z;
1501 ret+=wxT(" ");
1502 i+=1;
1503 }
1504 else
1505 ret+='.';
1506 }
1507 else
1508 ret+='.';
1509 }
1510 else
1511 ret+=wxString(str+i, Big5Conv, 1);
1512 }
1513 }
1514
1515 else if(fontenc==wxFONTENCODING_CP936){//"GBK"
1516 /// range byte 1 byte 2 cp GB 18030 GBK 1.0 CP936 GB 2312
1517 /// Level GBK/1 A1–A9 A1–FE 846 728 717 702 682
1518 /// Level GBK/2 B0–F7 A1–FE 6,768 6,763 6,763 6,763 6,763
1519 /// Level GBK/3 81–A0 40–FE except 7F 6,080 6,080 6,080 6,080
1520 /// Level GBK/4 AA–FE 40–A0 except 7F 8,160 8,160 8,160 8,080
1521 /// Level GBK/5 A8–A9 40–A0 except 7F 192 166 166 166
1522 /// user-defined AA–AF A1–FE 564
1523 /// user-defined F8–FE A1–FE 658
1524 /// user-defined A1–A7 40–A0 except 7F 672
1525 /// total: 23,940 21,897 21,886 21,791 7,445
1526 for( int i=0 ; i< Len ; i++){
1527 unsigned char ch1 = str[i];
1528 if(ch1>=0x21 && ch1<=0x7E) ret+=wxChar(ch1); //ASCII part
1529 else if(ch1>=0xA1 && ch1<=0xFE && Len>i ){ // KS X 1001 (G1, code set 1) is encoded as two bytes in GR (0xA1-0xFE)
1530 unsigned char ch2=str[i+1];
1531 // if(ch>=0x40 && ch<=0xFE){
1532 if(
1533 (ch1>=0xA1 && ch1<=0xA9 && ch2>=0xA1 && ch2<=0xFE ) || //GBK/1
1534 (ch1>=0xB0 && ch1<=0xF7 && ch2>=0xA1 && ch2<=0xFE ) || //GBK/2
1535 (ch1>=0x81 && ch1<=0xA0 && ch2>=0x40 && ch2<=0xFE && ch2!=0x7F) || //GBK/3
1536 (ch1>=0xAA && ch1<=0xFE && ch2>=0x40 && ch2<=0xA0 && ch2!=0x7F ) || //GBK/4
1537 (ch1>=0xA8 && ch1<=0xA9 && ch2>=0x40 && ch2<=0xA0 && ch2!=0x7F ) || //GBK/5
1538 (ch1>=0xAA && ch1<=0xAF && ch2>=0xA1 && ch2<=0xFE) || //user-defined
1539 (ch1>=0xF8 && ch1<=0xFE && ch2>=0xA1 && ch2<=0xFE) || //user-defined
1540 (ch1>=0xA1 && ch1<=0xA7 && ch2>=0x40 && ch2<=0xA0 && ch2!=0x7F) //user-defined
1541 ){
1542 z=wxString( str+i, wxCSConv(wxFONTENCODING_CP949), 2);
1543 if(z.Len()>0){
1544 ret+=z + wxT(" ");
1545 i++;
1546 }
1547 else
1548 ret+='.';
1549 }
1550 else
1551 ret+='.';
1552 }
1553 else
1554 ret+='.';
1555 }
1556 }
1557
1558 // else if(fontenc==wxFONTENCODING_GB2312)
1559 // for( int i=0 ; i< Len ; i++){
1560 // unsigned char ch = str[i];
1561 // if(ch < 0x20) ret+='.'; // Control characters
1562 // else if( ch >= 0x20 && ch <= 0x7E ) ret+=ch; // ASCII compatible part
1563 // else if(ch < 0x80) ret+='.'; // Void Characters
1564 // else { // 0x21 + 0x80
1565 // z=wxString( str+i, wxCSConv(wxFONTENCODING_GB2312), 2);
1566 // if( z.Len() > 0){
1567 // ret+=z;
1568 // if( z.Len() == 1 )
1569 // ret+=' ';
1570 // i+=1;
1571 // }
1572 // else
1573 // ret+='.';
1574 // }
1575 // }
1576
1577 else if(fontenc==wxFONTENCODING_EUC_JP){
1578 wxCSConv EUCJPConv = wxCSConv(wxFONTENCODING_EUC_JP);
1579 //wxCSConv EUCJPConv = wxCSConv(wxT("EUC-JP"));
1580
1581 ///A character from the lower half of JIS-X-0201 (ASCII, code set 0) is represented by one byte, in the range 0x21 – 0x7E.
1582 ///A character from the upper half of JIS-X-0201 (half-width kana, code set 2) is represented by two bytes, the first being 0x8E, the second in the range 0xA1 – 0xDF.
1583 ///A character from JIS-X-0208 (code set 1) is represented by two bytes, both in the range 0xA1 – 0xFE.
1584 ///A character from JIS-X-0212 (code set 3) is represented by three bytes, the first being 0x8F, the following two in the range 0xA1 – 0xFE.
1585 for( int i=0 ; i< Len ; i++){
1586 unsigned char ch = str[i];
1587 if(ch<0x20 || ch==0x7F ) ret+='.'; //Control chars
1588 else if(ch>=0x21 && ch<=0x7E) ret+=wxChar(ch); //ASCII part
1589 else if(ch==0x8E && Len > i){ //half-width kana first byte
1590 ch = str[i+1];
1591 if(ch>=0xA1 && ch<=0xDF) //half-width kana second byte
1592 ret+=wxString(str+i++, EUCJPConv, 2) + wxT(" ");
1593 else
1594 ret+='.';
1595 }
1596 else if(ch>=0xA1 && ch <=0xFE){ //JIS-X-0208 first byte
1597 ch = str[i+1];
1598 if(ch>=0xA1 && ch <=0xFE){ //JIS-X-0208 second byte
1599 z=wxString(str+i, EUCJPConv, 2);
1600 if(z.Len()>0){
1601 ret+=z + wxT(" ");
1602 i++;
1603 }
1604 else
1605 ret+='.';
1606 }
1607 else
1608 ret+='.';
1609 }
1610 else if(ch==0x8F && (Len>i+1)){ //JIS-X-0212 first byte
1611 unsigned char ch1=str[i+1];
1612 unsigned char ch2=str[i+2];
1613 if((ch1>=0xA1 && ch1<=0xFE) &&
1614 (ch2>=0xA1 && ch2<=0xFE)){ //JIS-X-0212 second byte
1615 ret+=wxString(str+i, EUCJPConv, 3) + wxT(" ");
1616 i+=2;
1617 }
1618 else
1619 ret+='.';
1620 }
1621 else
1622 ret+='.';
1623 }
1624 }
1625
1626 else if(Codepage.StartsWith(wxT("TSCII"))){
1627 /// 0x82 4Byte
1628 /// 0x87 3Byte
1629 /// 0x88->0x8B 2Byte
1630 /// 0x8C 4Byte
1631 /// 0x99->0x9C 2Byte
1632 /// 0xCA->0xFD 2Byte
1633
1634 int p;
1635 for(int i=0;i<Len;i++){
1636 p=0;
1637 if(i<0x80)
1638 ret+=Filter(str[i]);
1639 else{
1640 if(i>0x82) p+=3;
1641 if(i>0x87) p+=2;
1642 if(i>0x8B) p+=(0x8B-0x88)*1;
1643 if(i>0x8C) p+=3;
1644 if(i>0x9C) p+=(0x9C-0x99)*1;
1645 if(i>0xFD) p+=(0xFD-0xCA)*1;
1646
1647 if(i==0x82) ret+=CodepageTable.Mid(i,4);
1648 else if(i==0x87) ret+=CodepageTable.Mid(i+p,3);
1649 else if(i>=0x88 && i<=0x8B) ret+=CodepageTable.Mid((i-0x88)*2+p,2);
1650 else if(i==0x8C) ret+=CodepageTable.Mid(i+p,4);
1651 else if(i>=0x99 && i<=0x9C) ret+=CodepageTable.Mid((i-0x99)*2+p,2);
1652 else if(i>=0xCA && i<=0xFD) ret+=CodepageTable.Mid((i-0xCA)*2+p,2);
1653 else ret+=CodepageTable[p];
1654 }
1655 }
1656 }
1657
1658 return ret;
1659 }
1660
1661 //wxArrayString wxHexTextCtrl::GetSupportedEncodings(void){
1662 // return GetSupportedEncodings(void);
1663 // }
1664
GetSupportedEncodings(void)1665 wxArrayString GetSupportedEncodings(void){
1666 wxArrayString AvailableEncodings;
1667 wxString CharacterEncodings[] = {
1668 wxT("ASCII - American Standard Code for Information Interchange"),
1669 wxT("*ISCII - Indian Script Code for Information Interchange"),
1670 wxT("KOI7 Код Обмена Информацией, 7 бит"),
1671 wxT("KOI8-R Код Обмена Информацией, 8 бит"),
1672 wxT("KOI8-U Код Обмена Информацией, 8 бит"),
1673 wxT("ISO/IEC 6937"),
1674 wxT("ISO/IEC 8859-1 Latin-1 Western European"),
1675 wxT("ISO/IEC 8859-2 Latin-2 Central European"),
1676 wxT("ISO/IEC 8859-3 Latin-3 South European"),
1677 wxT("ISO/IEC 8859-4 Latin-4 North European"),
1678 wxT("ISO/IEC 8859-5 Latin/Cyrillic"),
1679 wxT("*ISO/IEC 8859-6 Latin/Arabic"),
1680 wxT("ISO/IEC 8859-7 Latin/Greek"),
1681 wxT("*ISO/IEC 8859-8 Latin/Hebrew"),
1682 wxT("ISO/IEC 8859-9 Latin/Turkish"),
1683 wxT("ISO/IEC 8859-10 Latin/Nordic"),
1684 wxT("*ISO/IEC 8859-11 Latin/Thai"),
1685 wxT("ISO/IEC 8859-13 Latin-7 Baltic Rim"),
1686 wxT("ISO/IEC 8859-14 Latin-8 Celtic"),
1687 wxT("ISO/IEC 8859-15 Latin-9"),
1688 wxT("ISO/IEC 8859-16 Latin-10 South-Eastern European"),
1689 wxT("*Windows CP874 - Thai"),
1690 wxT("Windows CP1250 - Central and Eastern European"),
1691 wxT("Windows CP1251 - Cyrillic Script"),
1692 wxT("Windows CP1252 - ANSI"),
1693 wxT("Windows CP1253 - Greek Modern"),
1694 wxT("Windows CP1254 - Turkish"),
1695 wxT("*Windows CP1255 - Hebrew"),
1696 wxT("*Windows CP1256 - Arabic"),
1697 wxT("Windows CP1257 - Baltic"),
1698 wxT("Windows CP1258 - Vietnamese"),
1699 wxT("VSCII - Vietnamese Standard Code for Information Interchange"),
1700 wxT("*TSCII - Tamil Script Code for Information Interchange"),
1701 wxT("*JIS X 0201 - Japanese Industrial Standard "),
1702 wxT("*TIS-620 - Thai Industrial Standard 620-2533"),
1703 wxT("EBCDIC 037 - IBM U.S. Canada"),
1704 wxT("EBCDIC 285 - IBM Ireland U.K."),
1705 wxT("EBCDIC 424 - IBM Hebrew"),
1706 wxT("EBCDIC 500 - IBM International"),
1707 wxT("EBCDIC 875 - IBM Greek"),
1708 wxT("EBCDIC 1026 - IBM Latin 5 Turkish"),
1709 wxT("EBCDIC 1047 - IBM Latin 1"),
1710 wxT("EBCDIC 1140 - IBM U.S. Canada with €"),
1711 wxT("EBCDIC 1146 - IBM Ireland U.K. with €"),
1712 wxT("EBCDIC 1148 - IBM International with €"),
1713 wxT("*ANSEL - American National Standard for Extended Latin"),
1714 wxT("DEC Multinational Character Set - VT220"),
1715 wxT("OEM - IBM PC/DOS CP437 - MS-DOS Latin US"),
1716 wxT("*PC/DOS CP720 - MS-DOS Arabic"),
1717 wxT("PC/DOS CP737 - MS-DOS Greek"),
1718 wxT("PC/DOS CP775 - MS-DOS Baltic Rim"),
1719 wxT("PC/DOS CP850 - MS-DOS Latin 1"),
1720 wxT("PC/DOS CP852 - MS-DOS Latin 2"),
1721 wxT("PC/DOS CP855 - MS-DOS Cyrillic"),
1722 wxT("*PC/DOS CP856 - Hebrew"),
1723 wxT("PC/DOS CP857 - MS-DOS Turkish"),
1724 wxT("PC/DOS CP858 - MS-DOS Latin 1 Update"),
1725 wxT("PC/DOS CP860 - MS-DOS Portuguese"),
1726 wxT("PC/DOS CP861 - MS-DOS Icelandic"),
1727 wxT("*PC/DOS CP862 - MS-DOS Hebrew"),
1728 wxT("PC/DOS CP863 - MS-DOS French Canada"),
1729 wxT("*PC/DOS CP864 - MS-DOS Arabic 2"),
1730 wxT("PC/DOS CP866 - MS-DOS Cyrillic Russian"),
1731 wxT("PC/DOS CP869 - MS-DOS Greek 2"),
1732 wxT("PC/DOS CP1006 - Arabic"),
1733 wxT("PC/DOS KZ-1048 - Kazakhstan"),
1734 wxT("PC/DOS MIK Code page"),
1735 wxT("PC/DOS Kamenický Encoding"),
1736 wxT("PC/DOS Mazovia Encoding"),
1737 wxT("*PC/DOS Iran System Encoding Standard"),
1738 wxT("*Big5"),
1739 wxT("*GBK - GB2312 - Guojia Biaozhun (国家标准)"),
1740 wxT("UTF8 - Universal Character Set"),
1741 wxT("UTF16 - Universal Character Set"),
1742 wxT("UTF16LE - Universal Character Set"),
1743 wxT("UTF16BE - Universal Character Set"),
1744 wxT("UTF32 - Universal Character Set"),
1745 wxT("UTF32LE - Universal Character Set"),
1746 wxT("UTF32BE - Universal Character Set"),
1747 wxT("Unicode"),
1748 wxT("*EUC-JP Extended Unix Code for Japanese"),
1749 wxT("*EUC-KR Extended Unix Code for Korean"),
1750 wxT("*Shift JIS"),
1751
1752 wxT("Macintosh CP10000 - MacRoman"),
1753 wxT("Macintosh CP10007 - MacCyrillic"),
1754 wxT("Macintosh CP10006 - MacGreek"),
1755 wxT("Macintosh CP10079 - MacIcelandic"),
1756 wxT("Macintosh CP10029 - MacLatin2"),
1757 wxT("Macintosh CP10081 - MacTurkish"),
1758
1759 #ifdef __WXMAC__
1760 wxT("Macintosh Arabic"),
1761 wxT("Macintosh Celtic"),
1762 wxT("Macintosh Central European"),
1763 wxT("Macintosh Croatian"),
1764 wxT("Macintosh Cyrillic"),
1765 wxT("Macintosh Devanagari"),
1766 wxT("Macintosh Dingbats"),
1767 wxT("Macintosh Gaelic"),
1768 wxT("Macintosh Greek"),
1769 wxT("Macintosh Gujarati"),
1770 wxT("Macintosh Gurmukhi"),
1771 wxT("Macintosh Hebrew"),
1772 wxT("Macintosh Icelandic"),
1773 wxT("Macintosh Inuit"),
1774 wxT("Macintosh Keyboard"),
1775 wxT("Macintosh Roman"),
1776 wxT("Macintosh Romanian"),
1777 wxT("Macintosh Symbol"),
1778 wxT("Macintosh Thai"),
1779 wxT("Macintosh Tibetan"),
1780 wxT("Macintosh Turkish"),
1781 wxT("Macintosh Ukraine"),
1782 #endif
1783
1784 wxT("*AtariST"),
1785 wxT("*Windows CP932 - Japanese (Shift JIS)"),
1786 wxT("*Windows CP936 - Chinese Simplified (GBK)"),
1787 wxT("*Windows CP949 - Korean (EUC-KR)"),
1788 wxT("*Windows CP950 - Chinese Traditional (Big5)")
1789 };
1790
1791 int EncCnt = sizeof( CharacterEncodings ) / sizeof( wxString );
1792 for( int i=0 ; i< EncCnt ; i++ )
1793 AvailableEncodings.Add(CharacterEncodings[i]);
1794 return AvailableEncodings;
1795 }
1796
PrepareCodepageTable(wxString codepage)1797 wxString wxHexTextCtrl::PrepareCodepageTable(wxString codepage){
1798 /****Python script for fetch Code page tables*********
1799 import urllib,sys
1800 def cpformat( a ):
1801 q = urllib.urlopen( a ).read().split('\n')
1802 w=[i.split('\t') for i in q]
1803 e=[i.split('\t') for i in q if not i.startswith('#')]
1804 r=[i[1] for i in e if len(i)>1]
1805 z=0
1806 sys.stdout.write('wxT("')
1807 for i in r[0x00:]:
1808 if not z%0x10 and z!=0:
1809 sys.stdout.write('"\\\n"')
1810 if i=='':
1811 sys.stdout.write('.')
1812 elif i[2:4]=='00':
1813 sys.stdout.write('\\x'+i[4:].upper())
1814 else:
1815 sys.stdout.write('\\x'+i[2:].upper())
1816 z+=1
1817 sys.stdout.write('" );\n')
1818
1819 a='http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT'
1820 cpformat(a)
1821 *******************************************************/
1822 Codepage=codepage;
1823 wxString newCP;
1824 FontEnc=wxFONTENCODING_ALTERNATIVE;
1825 char bf[256];
1826 #ifndef _MSC_VER
1827 if(codepage.Find(wxT("ASCII")) != wxNOT_FOUND)
1828 #endif
1829 {
1830 for (unsigned i=0; i<=0xFF ; i++){
1831 if(i<0x20 || i>=0x7F) newCP+='.'; //Control chars replaced with dot
1832 if(i>=0x20 && i<0x7F) newCP+=wxChar(i);//ASCII region
1833 }
1834 }
1835 #ifndef _MSC_VER
1836 else if(codepage.Find(wxT("ANSEL")) != wxNOT_FOUND){
1837 for (unsigned i=0; i<0xA1 ; i++){
1838 if(i<0x20 || i>=0x7F) newCP+='.'; //Control chars and voids replaced with dot
1839 if(i>=0x20 && i<0x7F) newCP+=wxChar(i);//ASCII region
1840 }
1841 newCP+=wxT( "\x0141\x00D8\x0110\x00DE\x00C6\x0152\x02B9\x00B7\x266D\x00AE\x00B1\x01A0\x01AF\x02BC."\
1842 "\x02BB\x0142\x00F8\x0111\x00FE\x00E6\x0153\x02BA\x0131\x00A3\x00F0.\x01A1\x01B0.."\
1843 "\x00B0\x2113\x2117\x00A9\x266F\x00BF\x00A1" );
1844
1845 for (unsigned i=0xC7; i<0xE0 ; i++) newCP+='.';//Void Region
1846 newCP+=wxT( "\x0303\x0300\x0301\x0302\x0303\x0304\x0306\x0307\x0308\x030C\x030A\xFE20\xFE21\x0315\x030B"\
1847 "\x0310\x0327\x0328\x0323\x0324\x0325\x0333\x0332\x0326\x031C\x032E\xFE22\xFE23..\x0313");
1848 }
1849
1850 //Indian Script Code for Information Interchange
1851 else if(codepage.Find(wxT("ISCII")) != wxNOT_FOUND){
1852 for (unsigned i=0; i<=0xA1 ; i++)
1853 newCP+=wxChar((i<0x20 || i>=0x7F) ? '.' : i);
1854 //Unicode eq of 0xD9 is \x25CC || \x00AD
1855 newCP+=wxT("\x0901\x0902\x0903\x0905\x0906\x0907\x0908\x0909\x090A\x090B"\
1856 "\x090E\x090F\x0910\x090D\x0912\x0913\x0914\x0911\x0915\x0916"\
1857 "\x0917\x0918\x0919\x091A\x091B\x091C\x091D\x091E\x091F\x0920"\
1858 "\x0921\x0922\x0923\x0924\x0925\x0926\x0927\x0928\x0929\x092A"\
1859 "\x092B\x092C\x092D\x092E\x092F\x095F\x0930\x0931\x0932\x0933"\
1860 "\x0934\x0935\x0936\x0937\x0938\x0939\x25CC\x093E\x093F\x0940"\
1861 "\x0941\x0942\x0943\x0946\x0947\x0948\x0945\x094A\x094B\x094C"\
1862 "\x0949\x094D\x093C\x0964......\x0966\x0967\x0968"
1863 "\x0969\x096A\x096B\x096C\x096D\x096E\x096F");
1864 }
1865
1866 //Tamil Script Code for Information Interchange
1867 else if(codepage.Find(wxT("TSCII")) != wxNOT_FOUND){
1868 newCP=PrepareCodepageTable(wxT("ASCII")).Mid(0,0x80);
1869 /// 0x82 4Byte
1870 /// 0x87 3Byte
1871 /// 0x88->0x8B 2Byte
1872 /// 0x8C 4Byte
1873 /// 0xCA->0xFD 2Byte
1874 /// 0x99->0x9C 2Byte
1875 newCP+=wxT( "\x0BE6\x0BE7\x0BB8\x0BCD\x0BB0\x0BC0\x0B9C\x0BB7\x0BB8\x0BB9\x0B95"\
1876 "\x0BCD\x0BB7\x0B9C\x0BCD\x0BB7\x0BCD\x0BB8\x0BCD\x0BB9\x0BCD\x0B95"\
1877 "\x0BCD\x0BB7\x0BCD\x0BE8\x0BE9\x0BEA\x0BEB\x2018\x2019\x201C\x201D"\
1878 "\x0BEC\x0BED\x0BEE\x0BEF\x0B99\x0BC1\x0B9E\x0BC1\x0B99\x0BC2\x0B9E"\
1879 "\x0BC2\x0BF0\x0BF1\x0BF2\x00A0\x0BBE\x0BBF\x0BC0\x0BC1\x0BC2\x0BC6"\
1880 "\x0BC7\x0BC8\x00A9\x0BD7\x0B85\x0B86.\x0B88\x0B89\x0B8A\x0B8E\x0B8F"\
1881 "\x0B90\x0B92\x0B93\x0B94\x0B83\x0B95\x0B99\x0B9A\x0B9E\x0B9F\x0BA3"\
1882 "\x0BA4\x0BA8\x0BAA\x0BAE\x0BAF\x0BB0\x0BB2\x0BB5\x0BB4\x0BB3\x0BB1"\
1883 "\x0BA9\x0B9F\x0BBF\x0B9F\x0BC0\x0B95\x0BC1\x0B9A\x0BC1\x0B9F\x0BC1"\
1884 "\x0BA3\x0BC1\x0BA4\x0BC1\x0BA8\x0BC1\x0BAA\x0BC1\x0BAE\x0BC1\x0BAF"\
1885 "\x0BC1\x0BB0\x0BC1\x0BB2\x0BC1\x0BB5\x0BC1\x0BB4\x0BC1\x0BB3\x0BC1"\
1886 "\x0BB1\x0BC1\x0BA9\x0BC1\x0B95\x0BC2\x0B9A\x0BC2\x0B9F\x0BC2\x0BA3"\
1887 "\x0BC2\x0BA4\x0BC2\x0BA8\x0BC2\x0BAA\x0BC2\x0BAE\x0BC2\x0BAF\x0BC2"\
1888 "\x0BB0\x0BC2\x0BB2\x0BC2\x0BB5\x0BC2\x0BB4\x0BC2\x0BB3\x0BC2\x0BB1"\
1889 "\x0BC2\x0BA9\x0BC2\x0B95\x0BCD\x0B99\x0BCD\x0B9A\x0BCD\x0B9E\x0BCD"\
1890 "\x0B9F\x0BCD\x0BA3\x0BCD\x0BA4\x0BCD\x0BA8\x0BCD\x0BAA\x0BCD\x0BAE"\
1891 "\x0BCD\x0BAF\x0BCD\x0BB0\x0BCD\x0BB2\x0BCD\x0BB5\x0BCD\x0BB4\x0BCD"\
1892 "\x0BB3\x0BCD\x0BB1\x0BCD\x0BA9\x0BCD\x0B87" );
1893 }
1894
1895 else if(codepage.Find(wxT("VSCII")) != wxNOT_FOUND){
1896 for (unsigned i=0; i<=0x7F ; i++)
1897 if( i==0x02) newCP+=wxT("\x1EB2");
1898 else if( i==0x05) newCP+=wxT("\x1EB4");
1899 else if( i==0x06) newCP+=wxT("\x1EAA");
1900 else if( i==0x14) newCP+=wxT("\x1EF6");
1901 else if( i==0x19) newCP+=wxT("\x1EF8");
1902 else if( i==0x1E) newCP+=wxT("\x1EF4");
1903 else newCP+=wxChar((i<0x20 || i>=0x7F) ? '.' : i);
1904
1905 newCP+=wxT( "\x1EA0\x1EAE\x1EB0\x1EB6\x1EA4\x1EA6\x1EA8\x1EAC\x1EBC\x1EB8"\
1906 "\x1EBE\x1EC0\x1EC2\x1EC4\x1EC6\x1ED0\x1ED2\x1ED4\x1ED6\x1ED8"\
1907 "\x1EE2\x1EDA\x1EDC\x1EDE\x1ECA\x1ECE\x1ECC\x1EC8\x1EE6\x0168"\
1908 "\x1EE4\x1EF2\x00D5\x1EAF\x1EB1\x1EB7\x1EA5\x1EA7\x1EA9\x1EAD"\
1909 "\x1EBD\x1EB9\x1EBF\x1EC1\x1EC3\x1EC5\x1EC7\x1ED1\x1ED3\x1ED5"\
1910 "\x1ED7\x1EE0\x01A0\x1ED9\x1EDD\x1EDF\x1ECB\x1EF0\x1EE8\x1EEA"\
1911 "\x1EEC\x01A1\x1EDB\x01AF\x00C0\x00C1\x00C2\x00C3\x1EA2\x0102"\
1912 "\x1EB3\x1EB5\x00C8\x00C9\x00CA\x1EBA\x00CC\x00CD\x0128\x1EF3"\
1913 "\x0110\x1EE9\x00D2\x00D3\x00D4\x1EA1\x1EF7\x1EEB\x1EED\x00D9"\
1914 "\x00DA\x1EF9\x1EF5\x00DD\x1EE1\x01B0\x00E0\x00E1\x00E2\x00E3"\
1915 "\x1EA3\x0103\x1EEF\x1EAB\x00E8\x00E9\x00EA\x1EBB\x00EC\x00ED"\
1916 "\x0129\x1EC9\x0111\x1EF1\x00F2\x00F3\x00F4\x00F5\x1ECF\x1ECD"\
1917 "\x1EE5\x00F9\x00FA\x0169\x1EE7\x00FD\x1EE3\x1EEE") ;
1918 }
1919
1920 // OEM PC/DOS
1921 else if(codepage.Find(wxT("DOS")) != wxNOT_FOUND ){
1922 //CP437 Control Symbols
1923 newCP=wxT( "\x20\x263A\x263B\x2665\x2666\x2663\x2660\x2022\x25D8\x25CB\x25D9"\
1924 "\x2642\x2640\x266A\x266B\x263C\x25BA\x25C4\x2195\x203C\x00B6\x00A7"\
1925 "\x25AC\x21A8\x2191\x2193\x2192\x2190\x221F\x2194\x25B2\x25BC" );
1926
1927 //ASCII compatible part
1928 for( unsigned i=0x20 ; i < 0x7F ; i++ )
1929 newCP += wxChar(i);
1930
1931 newCP+=wxChar(0x2302); //0x7F symbol
1932
1933 for (unsigned i=0x80; i<=0xFF ; i++)
1934 bf[i-0x80] = wxChar(i);
1935
1936 if((codepage.Find(wxT("CP437")) != wxNOT_FOUND ) || //Extended ASCII region of CP437
1937 (codepage.Find(wxT("OEM")) != wxNOT_FOUND ))
1938 // newCP+=wxString( bf, wxCSConv(wxT("CP437")), 0x80);
1939 newCP+=wxT( "\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5"\
1940 "\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\x20A7\x0192"\
1941 "\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\x2310\xAC\xBD\xBC\xA1\xAB\xBB"\
1942 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
1943 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
1944 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
1945 "\x03B1\xDF\x0393\x03C0\x03A3\x03C3\xB5\x03C4\x03A6\x0398\x03A9\x03B4\x221E\x03C6\x03B5\x2229"\
1946 "\x2261\xB1\x2265\x2264\x2320\x2321\xF7\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0" );
1947
1948 else if(codepage.Find(wxT("CP720")) != wxNOT_FOUND )
1949 // newCP+=wxString( bf, wxCSConv(wxT("CP720")), 0x80);
1950 newCP+=wxT( "..\xE9\xE2.\xE0.\xE7\xEA\xEB\xE8\xEF\xEE..."\
1951 ".\x0651\x0652\xF4\xA4\x0640\xFB\xF9\x0621\x0622\x0623\x0624\xA3\x0625\x0626\x0627"\
1952 "\x0628\x0629\x062A\x062B\x062C\x062D\x062E\x062F\x0630\x0631\x0632\x0633\x0634\x0635\xAB\xBB"\
1953 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
1954 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
1955 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
1956 "\x0636\x0637\x0638\x0639\x063A\x0641\xB5\x0642\x0643\x0644\x0645\x0646\x0647\x0648\x0649\x064A"\
1957 "\x2261\x064B\x064C\x064D\x064E\x064F\x0650\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0" );
1958
1959 else if(codepage.Find(wxT("CP737")) != wxNOT_FOUND )
1960 // newCP+=wxString( bf, wxCSConv(wxT("CP737")), 0x80);
1961 newCP+=wxT( "\x0391\x0392\x0393\x0394\x0395\x0396\x0397\x0398\x0399\x039A\x039B\x039C\x039D\x039E\x039F\x03A0"\
1962 "\x03A1\x03A3\x03A4\x03A5\x03A6\x03A7\x03A8\x03A9\x03B1\x03B2\x03B3\x03B4\x03B5\x03B6\x03B7\x03B8"\
1963 "\x03B9\x03BA\x03BB\x03BC\x03BD\x03BE\x03BF\x03C0\x03C1\x03C3\x03C2\x03C4\x03C5\x03C6\x03C7\x03C8"\
1964 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
1965 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
1966 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
1967 "\x03C9\x03AC\x03AD\x03AE\x03CA\x03AF\x03CC\x03CD\x03CB\x03CE\x0386\x0388\x0389\x038A\x038C\x038E"\
1968 "\x038F\xB1\x2265\x2264\x03AA\x03AB\xF7\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0" );
1969
1970 else if(codepage.Find(wxT("CP775")) != wxNOT_FOUND )
1971 // newCP+=wxString( bf, wxCSConv(wxT("CP775")), 0x80);
1972 newCP+=wxT( "\x0106\xFC\xE9\x0101\xE4\x0123\xE5\x0107\x0142\x0113\x0156\x0157\x012B\x0179\xC4\xC5"\
1973 "\xC9\xE6\xC6\x014D\xF6\x0122\xA2\x015A\x015B\xD6\xDC\xF8\xA3\xD8\xD7\xA4"\
1974 "\x0100\x012A\xF3\x017B\x017C\x017A\x201D\xA6\xA9\xAE\xAC\xBD\xBC\x0141\xAB\xBB"\
1975 "\x2591\x2592\x2593\x2502\x2524\x0104\x010C\x0118\x0116\x2563\x2551\x2557\x255D\x012E\x0160\x2510"\
1976 "\x2514\x2534\x252C\x251C\x2500\x253C\x0172\x016A\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x017D"\
1977 "\x0105\x010D\x0119\x0117\x012F\x0161\x0173\x016B\x017E\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
1978 "\xD3\xDF\x014C\x0143\xF5\xD5\xB5\x0144\x0136\x0137\x013B\x013C\x0146\x0112\x0145\x2019"\
1979 ".\xB1\x201C\xBE\xB6\xA7\xF7\x201E\xB0\x2219\xB7\xB9\xB3\xB2\x25A0\xA0" );
1980
1981 else if(codepage.Find(wxT("CP850")) != wxNOT_FOUND )
1982 // newCP+=wxString( bf, wxCSConv(wxT("CP850")), 0x80);
1983 newCP+=wxT( "\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5"\
1984 "\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x0192"\
1985 "\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\xAE\xAC\xBD\xBC\xA1\xAB\xBB"\
1986 "\x2591\x2592\x2593\x2502\x2524\xC1\xC2\xC0\xA9\x2563\x2551\x2557\x255D\xA2\xA5\x2510"\
1987 "\x2514\x2534\x252C\x251C\x2500\x253C\xE3\xC3\x255A\x2554\x2569\x2566\x2560\x2550\x256C\xA4"\
1988 "\xF0\xD0\xCA\xCB\xC8\x0131\xCD\xCE\xCF\x2518\x250C\x2588\x2584\xA6\xCC\x2580"\
1989 "\xD3\xDF\xD4\xD2\xF5\xD5\xB5\xFE\xDE\xDA\xDB\xD9\xFD\xDD\xAF\xB4"\
1990 ".\xB1\x2017\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\x25A0\xA0");
1991
1992 else if(codepage.Find(wxT("CP852")) != wxNOT_FOUND )
1993 // newCP+=wxString( bf, wxCSConv(wxT("CP852")), 0x80);
1994 newCP+=wxT( "\xC7\xFC\xE9\xE2\xE4\x016F\x0107\xE7\x0142\xEB\x0150\x0151\xEE\x0179\xC4\x0106"\
1995 "\xC9\x0139\x013A\xF4\xF6\x013D\x013E\x015A\x015B\xD6\xDC\x0164\x0165\x0141\xD7\x010D"\
1996 "\xE1\xED\xF3\xFA\x0104\x0105\x017D\x017E\x0118\x0119\xAC\x017A\x010C\x015F\xAB\xBB"\
1997 "\x2591\x2592\x2593\x2502\x2524\xC1\xC2\x011A\x015E\x2563\x2551\x2557\x255D\x017B\x017C\x2510"\
1998 "\x2514\x2534\x252C\x251C\x2500\x253C\x0102\x0103\x255A\x2554\x2569\x2566\x2560\x2550\x256C\xA4"\
1999 "\x0111\x0110\x010E\xCB\x010F\x0147\xCD\xCE\x011B\x2518\x250C\x2588\x2584\x0162\x016E\x2580"\
2000 "\xD3\xDF\xD4\x0143\x0144\x0148\x0160\x0161\x0154\xDA\x0155\x0170\xFD\xDD\x0163\xB4"\
2001 ".\x02DD\x02DB\x02C7\x02D8\xA7\xF7\xB8\xB0\xA8\x02D9\x0171\x0158\x0159\x25A0\xA0" );
2002
2003 else if(codepage.Find(wxT("CP855")) != wxNOT_FOUND )
2004 // newCP+=wxString( bf, wxCSConv(wxT("CP855")), 0x80);
2005 newCP+=wxT( "\x0452\x0402\x0453\x0403\x0451\x0401\x0454\x0404\x0455\x0405\x0456\x0406\x0457\x0407\x0458\x0408"\
2006 "\x0459\x0409\x045A\x040A\x045B\x040B\x045C\x040C\x045E\x040E\x045F\x040F\x044E\x042E\x044A\x042A"\
2007 "\x0430\x0410\x0431\x0411\x0446\x0426\x0434\x0414\x0435\x0415\x0444\x0424\x0433\x0413\xAB\xBB"\
2008 "\x2591\x2592\x2593\x2502\x2524\x0445\x0425\x0438\x0418\x2563\x2551\x2557\x255D\x0439\x0419\x2510"\
2009 "\x2514\x2534\x252C\x251C\x2500\x253C\x043A\x041A\x255A\x2554\x2569\x2566\x2560\x2550\x256C\xA4"\
2010 "\x043B\x041B\x043C\x041C\x043D\x041D\x043E\x041E\x043F\x2518\x250C\x2588\x2584\x041F\x044F\x2580"\
2011 "\x042F\x0440\x0420\x0441\x0421\x0442\x0422\x0443\x0423\x0436\x0416\x0432\x0412\x044C\x042C\x2116"\
2012 ".\x044B\x042B\x0437\x0417\x0448\x0428\x044D\x042D\x0449\x0429\x0447\x0427\xA7\x25A0\xA0" );
2013
2014 else if(codepage.Find(wxT("CP856")) != wxNOT_FOUND )
2015 //newCP+=wxString( bf, wxCSConv(wxT("CP856")), 0x80);
2016 newCP+=wxT( "\x05D0\x05D1\x05D2\x05D3\x05D4\x05D5\x05D6\x05D7\x05D8\x05D9\x05DA\x05DB\x05DC\x05DD\x05DE\x05DF"\
2017 "\x05E0\x05E1\x05E2\x05E3\x05E4\x05E5\x05E6\x05E7\x05E8\x05E9\x05EA.\xA3.\xD7."\
2018 ".........\xAE\xAC\xBD\xBC.\xAB\xBB"\
2019 "\x2591\x2592\x2593\x2502\x2524...\xA9\x2563\x2551\x2557\x255D\xA2\xA5\x2510"\
2020 "\x2514\x2534\x252C\x251C\x2500\x253C..\x255A\x2554\x2569\x2566\x2560\x2550\x256C\xA4"\
2021 ".........\x2518\x250C\x2588\x2584\xA6.\x2580"\
2022 "......\xB5.......\xAF\xB4"\
2023 ".\xB1\x2017\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\x25A0\xA0" );
2024
2025 else if(codepage.Find(wxT("CP857")) != wxNOT_FOUND ){
2026 // bf[0xD5-0x80]=bf[0xE7-0x80]=bf[0xF2-0x80]='.';
2027 // newCP+=wxString( bf, wxCSConv(wxT("CP857")), 0x80);
2028 // newCP[0xD5]=wxChar(0x20AC); //Euro Sign
2029 //Updated 0xD5 with euro sign
2030 newCP+=wxT( "\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\x0131\xC4\xC5"\
2031 "\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\x0130\xD6\xDC\xF8\xA3\xD8\x015E\x015F"\
2032 "\xE1\xED\xF3\xFA\xF1\xD1\x011E\x011F\xBF\xAE\xAC\xBD\xBC\xA1\xAB\xBB"\
2033 "\x2591\x2592\x2593\x2502\x2524\xC1\xC2\xC0\xA9\x2563\x2551\x2557\x255D\xA2\xA5\x2510"\
2034 "\x2514\x2534\x252C\x251C\x2500\x253C\xE3\xC3\x255A\x2554\x2569\x2566\x2560\x2550\x256C\xA4"\
2035 "\xBA\xAA\xCA\xCB\xC8\x20AC\xCD\xCE\xCF\x2518\x250C\x2588\x2584\xA6\xCC\x2580"\
2036 "\xD3\xDF\xD4\xD2\xF5\xD5\xB5.\xD7\xDA\xDB\xD9\xEC\xFF\xAF\xB4"\
2037 ".\xB1.\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\x25A0\xA0" );
2038 }
2039
2040 else if(codepage.Find(wxT("CP858")) != wxNOT_FOUND ){
2041 newCP=PrepareCodepageTable(wxT("PC/DOS CP850"));
2042 newCP[0xD5]=wxChar(0x20AC);
2043 }
2044
2045 else if(codepage.Find(wxT("CP860")) != wxNOT_FOUND )
2046 // newCP+=wxString( bf, wxCSConv(wxT("CP860")), 0x80);
2047 newCP+=wxT( "\xC7\xFC\xE9\xE2\xE3\xE0\xC1\xE7\xEA\xCA\xE8\xCD\xD4\xEC\xC3\xC2"\
2048 "\xC9\xC0\xC8\xF4\xF5\xF2\xDA\xF9\xCC\xD5\xDC\xA2\xA3\xD9\x20A7\xD3"\
2049 "\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\xD2\xAC\xBD\xBC\xA1\xAB\xBB"\
2050 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
2051 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
2052 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
2053 "\x03B1\xDF\x0393\x03C0\x03A3\x03C3\xB5\x03C4\x03A6\x0398\x03A9\x03B4\x221E\x03C6\x03B5\x2229"\
2054 "\x2261\xB1\x2265\x2264\x2320\x2321\xF7\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0" );
2055
2056 else if(codepage.Find(wxT("CP861")) != wxNOT_FOUND )
2057 // newCP+=wxString( bf, wxCSConv(wxT("CP861")), 0x80);
2058 newCP+=wxT( "\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xD0\xF0\xDE\xC4\xC5"\
2059 "\xC9\xE6\xC6\xF4\xF6\xFE\xFB\xDD\xFD\xD6\xDC\xF8\xA3\xD8\x20A7\x0192"\
2060 "\xE1\xED\xF3\xFA\xC1\xCD\xD3\xDA\xBF\x2310\xAC\xBD\xBC\xA1\xAB\xBB"\
2061 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
2062 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
2063 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
2064 "\x03B1\xDF\x0393\x03C0\x03A3\x03C3\xB5\x03C4\x03A6\x0398\x03A9\x03B4\x221E\x03C6\x03B5\x2229"\
2065 "\x2261\xB1\x2265\x2264\x2320\x2321\xF7\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0" );
2066
2067 else if(codepage.Find(wxT("CP862")) != wxNOT_FOUND )
2068 // newCP+=wxString( bf, wxCSConv(wxT("CP862")), 0x80);
2069 newCP+=wxT( "\x05D0\x05D1\x05D2\x05D3\x05D4\x05D5\x05D6\x05D7\x05D8\x05D9\x05DA\x05DB\x05DC\x05DD\x05DE\x05DF"\
2070 "\x05E0\x05E1\x05E2\x05E3\x05E4\x05E5\x05E6\x05E7\x05E8\x05E9\x05EA\xA2\xA3\xA5\x20A7\x0192"\
2071 "\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\x2310\xAC\xBD\xBC\xA1\xAB\xBB"\
2072 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
2073 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
2074 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
2075 "\x03B1\xDF\x0393\x03C0\x03A3\x03C3\xB5\x03C4\x03A6\x0398\x03A9\x03B4\x221E\x03C6\x03B5\x2229"\
2076 "\x2261\xB1\x2265\x2264\x2320\x2321\xF7\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0");
2077
2078 else if(codepage.Find(wxT("CP863")) != wxNOT_FOUND )
2079 // newCP+=wxString( bf, wxCSConv(wxT("CP863")), 0x80);
2080 newCP+=wxT( "\xC7\xFC\xE9\xE2\xC2\xE0\xB6\xE7\xEA\xEB\xE8\xEF\xEE\x2017\xC0\xA7"\
2081 "\xC9\xC8\xCA\xF4\xCB\xCF\xFB\xF9\xA4\xD4\xDC\xA2\xA3\xD9\xDB\x0192"\
2082 "\xA6\xB4\xF3\xFA\xA8\xB8\xB3\xAF\xCE\x2310\xAC\xBD\xBC\xBE\xAB\xBB"\
2083 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
2084 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
2085 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
2086 "\x03B1\xDF\x0393\x03C0\x03A3\x03C3\xB5\x03C4\x03A6\x0398\x03A9\x03B4\x221E\x03C6\x03B5\x2229"\
2087 "\x2261\xB1\x2265\x2264\x2320\x2321\xF7\x2248\xB0\x2219\xB7\x221A\x207F\xB2\x25A0\xA0");
2088
2089 else if(codepage.Find(wxT("CP864")) != wxNOT_FOUND ){
2090 //0xA7 replaced with EUR
2091 // newCP+=wxString( bf, wxCSConv(wxT("CP864")), 0x80);
2092 newCP+=wxT( "\xB0\xB7\x2219\x221A\x2592\x2500\x2502\x253C\x2524\x252C\x251C\x2534\x2510\x250C\x2514\x2518"\
2093 "\x03B2\x221E\x03C6\xB1\xBD\xBC\x2248\xAB\xBB\xFEF7\xFEF8..\xFEFB\xFEFC."\
2094 "\xA0.\xFE82\xA3\xA4\xFE84.\x20AC\xFE8E\xFE8F\xFE95\xFE99\x060C\xFE9D\xFEA1\xFEA5"\
2095 "\x0660\x0661\x0662\x0663\x0664\x0665\x0666\x0667\x0668\x0669\xFED1\x061B\xFEB1\xFEB5\xFEB9\x061F"\
2096 "\xA2\xFE80\xFE81\xFE83\xFE85\xFECA\xFE8B\xFE8D\xFE91\xFE93\xFE97\xFE9B\xFE9F\xFEA3\xFEA7\xFEA9"\
2097 "\xFEAB\xFEAD\xFEAF\xFEB3\xFEB7\xFEBB\xFEBF\xFEC1\xFEC5\xFECB\xFECF\xA6\xAC\xF7\xD7\xFEC9"\
2098 "\x0640\xFED3\xFED7\xFEDB\xFEDF\xFEE3\xFEE7\xFEEB\xFEED\xFEEF\xFEF3\xFEBD\xFECC\xFECE\xFECD\xFEE1"\
2099 "\xFE7D\x0651\xFEE5\xFEE9\xFEEC\xFEF0\xFEF2\xFED0\xFED5\xFEF5\xFEF6\xFEDD\xFED9\xFEF1\x25A0." );
2100 newCP[0x25]=wxChar(0x066A); // ARABIC PERCENT SIGN ⟨٪⟩
2101 }
2102
2103 else if(codepage.Find(wxT("CP865")) != wxNOT_FOUND ){
2104 newCP=PrepareCodepageTable(wxT("PC/DOS CP437" ));
2105 newCP[0x9B]=wxChar(0xF8);
2106 newCP[0x9D]=wxChar(0xD8);
2107 newCP[0xAF]=wxChar(0xA4);
2108 }
2109
2110 else if(codepage.Find(wxT("CP866")) != wxNOT_FOUND )
2111 // newCP+=wxString( bf, wxCSConv(wxT("CP866")), 0x80);
2112 newCP+=wxT( "\x0410\x0411\x0412\x0413\x0414\x0415\x0416\x0417\x0418\x0419\x041A\x041B\x041C\x041D\x041E\x041F"\
2113 "\x0420\x0421\x0422\x0423\x0424\x0425\x0426\x0427\x0428\x0429\x042A\x042B\x042C\x042D\x042E\x042F"\
2114 "\x0430\x0431\x0432\x0433\x0434\x0435\x0436\x0437\x0438\x0439\x043A\x043B\x043C\x043D\x043E\x043F"\
2115 "\x2591\x2592\x2593\x2502\x2524\x2561\x2562\x2556\x2555\x2563\x2551\x2557\x255D\x255C\x255B\x2510"\
2116 "\x2514\x2534\x252C\x251C\x2500\x253C\x255E\x255F\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2567"\
2117 "\x2568\x2564\x2565\x2559\x2558\x2552\x2553\x256B\x256A\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
2118 "\x0440\x0441\x0442\x0443\x0444\x0445\x0446\x0447\x0448\x0449\x044A\x044B\x044C\x044D\x044E\x044F"\
2119 "\x0401\x0451\x0404\x0454\x0407\x0457\x040E\x045E\xB0\x2219\xB7\x221A\x2116\xA4\x25A0\xA0" );
2120
2121 else if(codepage.Find(wxT("CP869")) != wxNOT_FOUND )
2122 // newCP+=wxString( bf, wxCSConv(wxT("CP869")), 0x80);
2123 newCP+=wxT( "......\x0386.\xB7\xAC\xA6\x2018\x2019\x0388\x2015\x0389"\
2124 "\x038A\x03AA\x038C..\x038E\x03AB\xA9\x038F\xB2\xB3\x03AC\xA3\x03AD\x03AE\x03AF"\
2125 "\x03CA\x0390\x03CC\x03CD\x0391\x0392\x0393\x0394\x0395\x0396\x0397\xBD\x0398\x0399\xAB\xBB"\
2126 "\x2591\x2592\x2593\x2502\x2524\x039A\x039B\x039C\x039D\x2563\x2551\x2557\x255D\x039E\x039F\x2510"\
2127 "\x2514\x2534\x252C\x251C\x2500\x253C\x03A0\x03A1\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x03A3"\
2128 "\x03A4\x03A5\x03A6\x03A7\x03A8\x03A9\x03B1\x03B2\x03B3\x2518\x250C\x2588\x2584\x03B4\x03B5\x2580"\
2129 "\x03B6\x03B7\x03B8\x03B9\x03BA\x03BB\x03BC\x03BD\x03BE\x03BF\x03C0\x03C1\x03C3\x03C2\x03C4\x0384"\
2130 ".\xB1\x03C5\x03C6\x03C7\xA7\x03C8\x0385\xB0\xA8\x03C9\x03CB\x03B0\x03CE\x25A0\xA0" );
2131
2132 else if(codepage.Find(wxT("CP1006")) != wxNOT_FOUND )
2133 // newCP+=wxString( bf, wxCSConv(wxT("CP1006")), 0x80);
2134 newCP+=wxT( "\xA0\x06F0\x06F1\x06F2\x06F3\x06F4\x06F5\x06F6\x06F7\x06F8\x06F9\x060C\x061B.\x061F\xFE81"\
2135 "\xFE8D\xFE8E\xFE8E\xFE8F\xFE91\xFB56\xFB58\xFE93\xFE95\xFE97\xFB66\xFB68\xFE99\xFE9B\xFE9D\xFE9F"\
2136 "\xFB7A\xFB7C\xFEA1\xFEA3\xFEA5\xFEA7\xFEA9\xFB84\xFEAB\xFEAD\xFB8C\xFEAF\xFB8A\xFEB1\xFEB3\xFEB5"\
2137 "\xFEB7\xFEB9\xFEBB\xFEBD\xFEBF\xFEC1\xFEC5\xFEC9\xFECA\xFECB\xFECC\xFECD\xFECE\xFECF\xFED0\xFED1"\
2138 "\xFED3\xFED5\xFED7\xFED9\xFEDB\xFB92\xFB94\xFEDD\xFEDF\xFEE0\xFEE1\xFEE3\xFB9E\xFEE5\xFEE7\xFE85"\
2139 "\xFEED\xFBA6\xFBA8\xFBA9\xFBAA\xFE80\xFE89\xFE8A\xFE8B\xFEF1\xFEF2\xFEF3\xFBB0\xFBAE\xFE7C\xFE7D" );
2140
2141 else if(codepage.Find(wxT("KZ-1048")) != wxNOT_FOUND ){
2142 newCP+=wxT( "\x0402\x0403\x201A\x0453\x201E\x2026\x2020\x2021\x20AC\x2030\x0409\x2039\x040A\x049A\x04BA\x040F"\
2143 "\x0452\x2018\x2019\x201C\x201D\x2022\x2013\x2014.\x2122\x0459\x203A\x045A\x049B\x04BB\x045F"\
2144 "\xA0\x04B0\x04B1\x04D8\xA4\x04E8\xA6\xA7\x0401\xA9\x0492\xAB\xAC.\xAE\x04AE"\
2145 "\xB0\xB1\x0406\x0456\x04E9\xB5\xB6\xB7\x0451\x2116\x0493\xBB\x04D9\x04A2\x04A3\x04AF" );
2146 for( int i=0; i<0x40; i++)
2147 newCP+=wxChar(0x0410+i);
2148 /*
2149 "\x0410\x0411\x0412\x0413\x0414\x0415\x0416\x0417\x0418\x0419\x041A\x041B\x041C\x041D\x041E\x041F"\
2150 "\x0420\x0421\x0422\x0423\x0424\x0425\x0426\x0427\x0428\x0429\x042A\x042B\x042C\x042D\x042E\x042F"\
2151 "\x0430\x0431\x0432\x0433\x0434\x0435\x0436\x0437\x0438\x0439\x043A\x043B\x043C\x043D\x043E\x043F"\
2152 "\x0440\x0441\x0442\x0443\x0444\x0445\x0446\x0447\x0448\x0449\x044A\x044B\x044C\x044D\x044E\x044F" );
2153 */
2154 }
2155 else if(codepage.Find(wxT("MIK")) != wxNOT_FOUND ){
2156 for (unsigned i=0x80; i<0xC0 ; i++)
2157 newCP += wxChar(i-0x80+0x0410);
2158
2159 newCP += wxT( "\x2514\x2534\x252C\x251C\x2500\x253C\x2563\x2551\x255A\x2554\x2569\x2566\x2560\x2550\x256C\x2510"\
2160 "\x2591\x2592\x2593\x2502\x2524\x2116\x00A7\x2557\x255D\x2518\x250C\x2588\x2584\x258C\x2590\x2580"\
2161 "\x03B1\x00DF\x0393\x03C0\x03A3\x03C3\x00B5\x03C4\x03A6\x0398\x03A9\x03B4\x221E\x03C6\x03B5\x2229"\
2162 "\x2261\x00B1\x2265\x2264\x2320\x2321\x00F7\x2248\x00B0\x2219\x00B7\x221A\x207F\x00B2\x25A0\x00A0" );
2163 }
2164
2165 else if(codepage.Find(wxT("Kamenick")) != wxNOT_FOUND ){
2166 newCP=PrepareCodepageTable(wxT("PC/DOS CP437" ));
2167 newCP=newCP.Mid(0,0x80)+
2168 +wxT( "\x010C\x00FC\x00E9\x010F\x00E4\x010E\x0164\x010D\x011B\x011A\x0139\x00CD\x013E\x013A\x00C4\x00C1"\
2169 "\x00C9\x017E\x017D\x00F4\x00F6\x00D3\x016F\x00DA\x00FD\x00D6\x00DC\x0160\x013D\x00DD\x0158\x0165"\
2170 "\x00E1\x00ED\x00F3\x00FA\x0148\x0147\x016E\x00D4\x0161\x0159\x0155\x0154\x00BC\x00A7\x00AB\x00BB")
2171 +newCP.Mid(0xB0,0xFF-0xB0);
2172 }
2173
2174 else if(codepage.Find(wxT("Mazovia")) != wxNOT_FOUND ){
2175 newCP=PrepareCodepageTable(wxT("PC/DOS CP437" ));
2176 newCP=newCP.Mid(0,0x80)+
2177 +wxT( "\x00C7\x00FC\x00E9\x00E2\x00E4\x00E0\x0105\x00E7\x00EA\x00EB\x00E8\x00EF\x00EE\x0107\x00C4\x0104"\
2178 "\x0118\x0119\x0142\x00F4\x00F6\x0106\x00FB\x00F9\x015A\x00D6\x00DC\x00A2\x0141\x00A5\x015B\x0192"\
2179 "\x0179\x017B\x00F3\x00D3\x0144\x0143\x017A\x017C\x00BF\x2310\x00AC\x00BD\x00BC\x00A1\x00AB\x00BB" )
2180 +newCP.Mid(0xB0,0xFF-0xB0);
2181 }
2182 else if(codepage.Find(wxT("Iran")) != wxNOT_FOUND ){
2183 newCP=PrepareCodepageTable(wxT("PC/DOS CP437" ));
2184 newCP=newCP.Mid(0,0x80)+
2185 +wxT( "\x06F0\x06F1\x06F2\x06F3\x06F4\x06F5\x06F6\x06F7\x06F8\x06F9\x060C\x0640\x061F\xFE81\xFE8B\x0621"\
2186 "\xFE8D\xFE8E\xFE8F\xFE91\xFB56\xFB58\xFE95\xFE97\xFE99\xFE9B\xFE9D\xFE9F\xFB7C\xFB7C\xFEA1\xFEA3"\
2187 "\xFEA5\xFEA7\x062F\x0630\x0631\x0632\x0698\xFEB1\xFEB3\xFEB5\xFEB7\xFEB9\xFEBB\xFEBD\xFEBF\x0637" )
2188 +newCP.Mid(0xB0,0xFF-0xB0);
2189 }
2190
2191 }
2192
2193 else if(codepage.Find(wxT("ISO/IEC")) != wxNOT_FOUND ){
2194 if(codepage.Find(wxT("6937")) != wxNOT_FOUND){
2195 newCP=PrepareCodepageTable(wxT("ASCII")).Mid(0,0xA0);
2196 //SHY replaced with dot (at 0xFF)
2197 newCP+=wxT( "\xA0\xA1\xA2\xA3.\xA5.\xA7\xA4\x2018\x201C\xAB\x2190\x2191\x2192\x2193"\
2198 "\xB0\xB1\xB2\xB3\xD7\xB5\xB6\xB7\xF7\x2019\x201D\xBB\xBC\xBD\xBE\xBF.\x0300\x0301"\
2199 "\x0302\x0303\x0304\x0306\x0307\x0308.\x030A\x0327.\x030B\x0328\x030C\x2015\xB9"\
2200 "\xAE\xA9\x2122\x266A\xAC\xA6....\x215B\x215C\x215D\x215E\x2126\xC6\x0110\xAA"\
2201 "\x0126.\x0132\x013F\x0141\xD8\x0152\xBA\xDE\x0166\x014A\x0149\x0138\xE6\x0111"\
2202 "\xF0\x0127\x0131\x0133\x0140\x0142\xF8\x0153\xDF\xFE\x0167\x014B.");
2203 return CodepageTable=newCP;
2204 }
2205
2206
2207 //Masking default area
2208 for (unsigned i=0; i<=0xFF ; i++)
2209 bf[i] = (i< 0x20 || i==0x7F || i==0xAD || (i>=0x80 && i<=0x9F )) ? '.' : i;
2210
2211 //Detecting exact encoding
2212 int q=codepage.Find(wxT("8859-"))+5;
2213
2214 //Filtering gaps
2215 if(codepage.Mid(q,2).StartsWith(wxT("3 "))) bf[0xA5]=bf[0xAE]=bf[0xBE]=bf[0xC3]=bf[0xD0]=bf[0xE3]=bf[0xF0]='.';
2216 else if(codepage.Mid(q,2).StartsWith(wxT("6 "))){ //Arabic
2217 for(int i=0xA1 ; i<=0xC0 ; i++) bf[i]='.';
2218 bf[0xA4]=0xA4;
2219 bf[0xAC]=0xAC;
2220 bf[0xBB]=0xBB;
2221 bf[0xBF]=0xBF;
2222 for(int i=0xDB ; i<=0xDF ; i++) bf[i]='.';
2223 for(int i=0xF3 ; i<=0xFF ; i++) bf[i]='.';
2224 }
2225 else if(codepage.Mid(q,2).StartsWith(wxT("7 "))) bf[0xAE]=bf[0xD2]=bf[0xFF]='.';
2226 else if(codepage.Mid(q,2).StartsWith(wxT("8 "))){ //Hebrew
2227 for(int i=0xBF ; i<=0xDE ; i++) bf[i]='.';
2228 for(int i=0xFB ; i<=0xFF ; i++) bf[i]='.';
2229 bf[0xA1]='.';
2230 }
2231 else if(codepage.Mid(q,2).StartsWith(wxT("11"))) bf[0xDB]=bf[0xDC]=bf[0xDD]=bf[0xDE]=bf[0xFC]=bf[0xFD]=bf[0xFE]=bf[0xFF]='.';
2232
2233 //Encoding
2234 if (codepage.Mid(q,2).StartsWith(wxT("1 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_1), 256);
2235 else if(codepage.Mid(q,2).StartsWith(wxT("2 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_2), 256);
2236 else if(codepage.Mid(q,2).StartsWith(wxT("3 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_3), 256);
2237 else if(codepage.Mid(q,2).StartsWith(wxT("4 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_4), 256);
2238 else if(codepage.Mid(q,2).StartsWith(wxT("5 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_5), 256);
2239 // Arabic Output not looks good.
2240 else if(codepage.Mid(q,2).StartsWith(wxT("6 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_6), 256);
2241 else if(codepage.Mid(q,2).StartsWith(wxT("7 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_7), 256);
2242 // Hebrew Output not looks good.
2243 else if(codepage.Mid(q,2).StartsWith(wxT("8 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_8), 256);
2244 else if(codepage.Mid(q,2).StartsWith(wxT("9 "))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_9), 256);
2245 else if(codepage.Mid(q,2).StartsWith(wxT("10"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_10), 256);
2246 else if(codepage.Mid(q,2).StartsWith(wxT("11"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_11), 256);
2247 else if(codepage.Mid(q,2).StartsWith(wxT("12"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_12), 256);
2248 else if(codepage.Mid(q,2).StartsWith(wxT("13"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_13), 256);
2249 else if(codepage.Mid(q,2).StartsWith(wxT("14"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_14), 256);
2250 else if(codepage.Mid(q,2).StartsWith(wxT("15"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_ISO8859_15), 256);
2251 else if(codepage.Mid(q,2).StartsWith(wxT("16"))){
2252 //newCP+=wxString( bf, wxCSConv(wxT("ISO8859-16")), 256);
2253 newCP=PrepareCodepageTable(wxT("ASCII")).Mid(0,0xA0);
2254 newCP+=wxT( "\xA0\x0104\x0105\x0141\x20AC\x201E\x0160\xA7\x0161\xA9\x0218\xAB\x0179\xAD\x017A\x017B"\
2255 "\xB0\xB1\x010C\x0142\x017D\x201D\xB6\xB7\x017E\x010D\x0219\xBB\x0152\x0153\x0178\x017C"\
2256 "\xC0\xC1\xC2\x0102\xC4\x0106\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"\
2257 "\x0110\x0143\xD2\xD3\xD4\x0150\xD6\x015A\x0170\xD9\xDA\xDB\xDC\x0118\x021A\xDF"\
2258 "\xE0\xE1\xE2\x0103\xE4\x0107\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF"\
2259 "\x0111\x0144\xF2\xF3\xF4\x0151\xF6\x015B\x0171\xF9\xFA\xFB\xFC\x0119\x021B\xFF" );
2260 }
2261 }
2262
2263 // Windows Code Pages
2264 else if(codepage.Find(wxT("Windows")) != wxNOT_FOUND ){
2265 if(codepage.Find(wxT("CP874")) != wxNOT_FOUND ){
2266 newCP=PrepareCodepageTable(wxT("ISO/IEC 8859-11"));
2267 unsigned char a[]="\x80\xB5\x91\x92\x93\x94\x95\x96\x97"; //Patch Index
2268 wxString b=wxT("\x20AC\x2026\x2018\x2019\x201C\x201D\x2022\x2013\x2014"); //Patch Value
2269 for(int i=0;i<9;i++)
2270 newCP[a[i]]=b[i];
2271 }
2272 else if(codepage.Find(wxT("CP932")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_CP932;//ShiftJS
2273 else if(codepage.Find(wxT("CP936")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_CP936;//GBK
2274 else if(codepage.Find(wxT("CP949")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_CP949; //EUC-KR
2275 else if(codepage.Find(wxT("CP950")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_CP950;//BIG5
2276 else{
2277 for (unsigned i=0; i<=0xFF ; i++)
2278 bf[i] = (i< 0x20 || i==0x7F || i==0xAD) ? '.' : i;
2279
2280 //Detecting Encoding
2281 char q=codepage[codepage.Find(wxT("CP125"))+5];
2282
2283 //Filtering gaps
2284 if (q=='0') bf[0x81]=bf[0x83]=bf[0x88]=bf[0x90]=bf[0x98]='.';
2285 else if(q=='1') bf[0x98]='.';
2286 else if(q=='2') bf[0x81]=bf[0x8D]=bf[0x8F]=bf[0x90]=bf[0x9D]='.';
2287 else if(q=='3') bf[0x81]=bf[0x88]=bf[0x8A]=bf[0x8C]=bf[0x8D]=
2288 bf[0x8E]=bf[0x8F]=bf[0x90]=bf[0x98]=bf[0x9A]=
2289 bf[0x9C]=bf[0x9D]=bf[0x9E]=bf[0x9F]=bf[0xAA]=bf[0xD2]=bf[0xFF]='.';
2290 else if(q=='4') bf[0x81]=bf[0x8D]=bf[0x8E]=bf[0x8F]=bf[0x90]=bf[0x9D]=bf[0x9E]='.';
2291 else if(q=='5') bf[0x81]=bf[0x88]=bf[0x8A]=bf[0x8C]=bf[0x8D]=
2292 bf[0x8E]=bf[0x8F]=bf[0x90]=bf[0x9A]=
2293 bf[0x9C]=bf[0x9D]=bf[0x9E]=bf[0x9F]=bf[0xCA]=
2294 bf[0xD9]=bf[0xDA]=bf[0xDB]=bf[0xDC]=bf[0xDD]=
2295 bf[0xDE]=bf[0xDF]=bf[0xFB]=bf[0xFC]=bf[0xFF]='.';
2296 else if(q=='7') bf[0x81]=bf[0x83]=bf[0x88]=bf[0x8A]=bf[0x8C]=
2297 bf[0x90]=bf[0x98]=bf[0x9A]=bf[0x9C]=bf[0x9F]=bf[0xA1]=bf[0xA5]='.' ;
2298
2299 //Encoding
2300 if (q=='0') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1250), 256);
2301 else if(q=='1') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1251), 256);
2302 else if(q=='2') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1252), 256);
2303 else if(q=='3') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1253), 256);
2304 else if(q=='4') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1254), 256);
2305 // Hebrew Output not looks good.
2306 else if(q=='5') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1255), 256);
2307 // Arabic Output from right issue!
2308 else if(q=='6') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1256), 256);
2309 else if(q=='7') newCP+=wxString( bf, wxCSConv(wxFONTENCODING_CP1257), 256);
2310 else if(q=='8'){ //Windows Vietnamese
2311 newCP=PrepareCodepageTable(wxT("CP1252")); //ANSI
2312 newCP[0x8A]=newCP[0x8E]=newCP[0x9A]=newCP[0x9E]='.';
2313 newCP[0xC3]=wxChar(0x0102);
2314 newCP[0xCC]='.';//wxChar(0x0300);
2315 newCP[0xD0]=wxChar(0x0110);
2316 newCP[0xD2]='.';//wxChar(0x0309);
2317 newCP[0xD5]=wxChar(0x01A0);
2318 newCP[0xDD]=wxChar(0x01AF);
2319 newCP[0xDE]='.';//wxChar(0x0303);
2320 newCP[0xE3]=wxChar(0x0103);
2321 newCP[0xEC]='.';//wxChar(0x0301);
2322 newCP[0xF0]=wxChar(0x0111);
2323 newCP[0xF2]='.';//wxChar(0x0323);
2324 newCP[0xF5]=wxChar(0x01A1);
2325 newCP[0xFD]=wxChar(0x01B0);
2326 newCP[0xFE]=wxChar(0x20AB);
2327 }
2328 }
2329 }
2330
2331 else if(codepage.Find(wxT("AtariST")) != wxNOT_FOUND ){
2332 newCP+=PrepareCodepageTable(wxT("ASCII")).Mid(0x0,0x80);
2333 newCP+=PrepareCodepageTable(wxT("DOS CP437")).Mid(0x80,0x30);
2334 newCP+=wxT( "\x00E3\x00F5\x00D8\x00F8\x0153\x0152\x00C0\x00C3\x00D5\x00A8\x00B4\x2020\x00B6\x00A9\x00AE\x2122"
2335 "\x0133\x0132\x05D0\x05D1\x05D2\x05D3\x05D4\x05D5\x05D6\x05D7\x05D8\x05D9\x05DB\x05DC\x05DE\x05E0"
2336 "\x05E1\x05E2\x05E4\x05E6\x05E7\x05E8\x05E9\x05EA\x05DF\x05DA\x05DD\x05E3\x05E5\x00A7\x2227\x221E");
2337 newCP+=PrepareCodepageTable(wxT("DOS CP437")).Mid(0xE0,0x20);
2338 newCP[0x9E]=wxChar(0x00DF);
2339 newCP[0xE1]=wxChar(0x03B2);
2340 newCP[0xEC]=wxChar(0x222E);
2341 newCP[0xEE]=wxChar(0x2208);
2342 newCP[0xFE]=wxChar(0x00B3);
2343 newCP[0xFF]=wxChar(0x00AF);
2344 }
2345
2346 else if(codepage.Find(wxT("KOI7")) != wxNOT_FOUND ){
2347 newCP=PrepareCodepageTable(wxT("ASCII")).Mid(0,0x60);
2348 newCP += wxT( "\x042E\x0410\x0411\x0426\x0414\x0415\x0424\x0413\x0425\x0418\x0419\x041A\x041B\x041C\x041D\x041E"\
2349 "\x041F\x042F\x0420\x0421\x0422\x0423\x0416\x0412\x042C\x042B\x0417\x0428\x042D\x0429\x0427.");
2350 for (unsigned i=0x80; i<=0xFF ; i++)
2351 newCP += '.';
2352 }
2353
2354 else if(codepage.Find(wxT("KOI8")) != wxNOT_FOUND ){
2355 for (unsigned i=0; i<=0xFF ; i++)
2356 bf[i] = (i<0x20 || i==0x7F) ? '.' : i;
2357 if(codepage.StartsWith(wxT("KOI8-R"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_KOI8), 256);
2358 if(codepage.StartsWith(wxT("KOI8-U"))) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_KOI8_U), 256);
2359 }
2360
2361 else if(codepage.Find(wxT("JIS X 0201")) != wxNOT_FOUND ){
2362 for (unsigned i=0; i<0xFF ; i++)
2363 if(i==0x5C)
2364 newCP += wxChar(0xA5); //JPY
2365 else if(i==0x7E)
2366 newCP += wxChar(0x203E);//Overline
2367 else if(i<0x80)
2368 newCP += ((i<0x20 || i==0x7F) ? '.' : wxChar(i));
2369 else if( i>=0xA1 && i<0xE0)
2370 newCP += wxChar(i-0xA0+0xFF60);
2371 else
2372 newCP +='.';
2373 }
2374
2375 else if(codepage.Find(wxT("TIS-620")) != wxNOT_FOUND ){
2376 newCP=PrepareCodepageTable(wxT("ISO/IEC 8859-11")); //Identical
2377 }
2378
2379 else if(codepage.Find(wxT("EBCDIC")) != wxNOT_FOUND ){
2380 //Control chars replaced with dot
2381 for (unsigned i=0; i<0x40 ; i++)
2382 newCP+=wxChar('.');
2383
2384 /// \x00AD (Soft Hypen) replaced with dot .
2385 /// \x009F (End Of File ) replaced with dot .
2386 //EBCDIC Table
2387 newCP+=wxT( "\x20\xA0\xE2\xE4\xE0\xE1\xE3\xE5\xE7\xF1\xA2\x2E\x3C\x28\x2B\x7C"\
2388 "\x26\xE9\xEA\xEB\xE8\xED\xEE\xEF\xEC\xDF\x21\x24\x2A\x29\x3B\xAC"\
2389 "\x2D\x2F\xC2\xC4\xC0\xC1\xC3\xC5\xC7\xD1\xA6\x2C\x25\x5F\x3E\x3F"\
2390 "\xF8\xC9\xCA\xCB\xC8\xCD\xCE\xCF\xCC\x60\x3A\x23\x40\x27\x3D\x22"\
2391 "\xD8\x61\x62\x63\x64\x65\x66\x67\x68\x69\xAB\xBB\xF0\xFD\xFE\xB1"\
2392 "\xB0\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\xAA\xBA\xE6\xB8\xC6\xA4"\
2393 "\xB5\x7E\x73\x74\x75\x76\x77\x78\x79\x7A\xA1\xBF\xD0\xDD\xDE\xAE"\
2394 "\x5E\xA3\xA5\xB7\xA9\xA7\xB6\xBC\xBD\xBE\x5B\x5D\xAF\xA8\xB4\xD7"\
2395 "\x7B\x41\x42\x43\x44\x45\x46\x47\x48\x49.\xF4\xF6\xF2\xF3\xF5"\
2396 "\x7D\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\xB9\xFB\xFC\xF9\xFA\xFF"\
2397 "\x5C\xF7\x53\x54\x55\x56\x57\x58\x59\x5A\xB2\xD4\xD6\xD2\xD3\xD5"\
2398 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\xB3\xDB\xDC\xD9\xDA.");
2399
2400 if(codepage.Find(wxT("037")) != wxNOT_FOUND ){
2401 //This is EBCDIC 037 Already
2402 }
2403
2404 else if(codepage.Find(wxT("285")) != wxNOT_FOUND ){
2405 unsigned char a[]="\x4A\x5B\xA1\xB0\xB1\xBA\xBC"; //Patch Index
2406 unsigned char b[]="\x24\xA3\xAF\xA2\x5B\x5E\x7E"; //Patch Value
2407 for(int i=0;i<7;i++)
2408 newCP[a[i]]=wxChar(b[i]);
2409 }
2410
2411 else if(codepage.Find(wxT("424")) != wxNOT_FOUND ){
2412 newCP.Clear();
2413 for (unsigned i=0; i<0x40 ; i++)
2414 newCP+=wxChar('.');
2415 // At 0xFF, (0x9F) replaced with .
2416 newCP+=wxT( "\x20\x05D0\x05D1\x05D2\x05D3\x05D4\x05D5\x05D6\x05D7\x05D8\xA2\x2E\x3C\x28\x2B\x7C"\
2417 "\x26\x05D9\x05DA\x05DB\x05DC\x05DD\x05DE\x05DF\x05E0\x05E1\x21\x24\x2A\x29\x3B\xAC"\
2418 "\x2D\x2F\x05E2\x05E3\x05E4\x05E5\x05E6\x05E7\x05E8\x05E9\xA6\x2C\x25\x5F\x3E\x3F"\
2419 ".\x05EA..\xA0...\x2017\x60\x3A\x23\x40\x27\x3D\x22"\
2420 ".\x61\x62\x63\x64\x65\x66\x67\x68\x69\xAB\xBB...\xB1"\
2421 "\xB0\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72...\xB8.\xA4"\
2422 "\xB5\x7E\x73\x74\x75\x76\x77\x78\x79\x7A.....\xAE"\
2423 "\x5E\xA3\xA5\xB7\xA9\xA7\xB6\xBC\xBD\xBE\x5B\x5D\xAF\xA8\xB4\xD7"\
2424 "\x7B\x41\x42\x43\x44\x45\x46\x47\x48\x49......"\
2425 "\x7D\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\xB9....."\
2426 "\x5C\xF7\x53\x54\x55\x56\x57\x58\x59\x5A\xB2....."\
2427 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\xB3....." );
2428 }
2429
2430
2431 else if(codepage.Find(wxT("500")) != wxNOT_FOUND ){
2432 unsigned char a[]="\x4A\x4F\x5A\x5F\xB0\xBA\xBB\xCA"; //Patch Index
2433 unsigned char b[]="\x5B\x21\x5D\x5E\xA2\xAC\x7C\x2E"; //Patch Value
2434 for(int i=0;i<8;i++)
2435 newCP[a[i]]=wxChar(b[i]);
2436 }
2437
2438 else if(codepage.Find(wxT("875")) != wxNOT_FOUND ){
2439 newCP=wxEmptyString;
2440 for (unsigned i=0; i<0x40 ; i++)
2441 newCP+=wxChar('.');
2442 // At 0xCA, (0xAD) replaced with .
2443 // At 0xFF, (0x9F) replaced with .
2444 // Others are 0x1A originaly, replaced with .
2445 newCP+=wxT( "\x20\x0391\x0392\x0393\x0394\x0395\x0396\x0397\x0398\x0399\x5B\x2E\x3C\x28\x2B\x21"\
2446 "\x26\x039A\x039B\x039C\x039D\x039E\x039F\x03A0\x03A1\x03A3\x5D\x24\x2A\x29\x3B\x5E"\
2447 "\x2D\x2F\x03A4\x03A5\x03A6\x03A7\x03A8\x03A9\x03AA\x03AB\x7C\x2C\x25\x5F\x3E\x3F"\
2448 "\xA8\x0386\x0388\x0389\xA0\x038A\x038C\x038E\x038F\x60\x3A\x23\x40\x27\x3D\x22"\
2449 "\x0385\x61\x62\x63\x64\x65\x66\x67\x68\x69\x03B1\x03B2\x03B3\x03B4\x03B5\x03B6"\
2450 "\xB0\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x03B7\x03B8\x03B9\x03BA\x03BB\x03BC"\
2451 "\xB4\x7E\x73\x74\x75\x76\x77\x78\x79\x7A\x03BD\x03BE\x03BF\x03C0\x03C1\x03C3"\
2452 "\xA3\x03AC\x03AD\x03AE\x03CA\x03AF\x03CC\x03CD\x03CB\x03CE\x03C2\x03C4\x03C5\x03C6\x03C7\x03C8"\
2453 "\x7B\x41\x42\x43\x44\x45\x46\x47\x48\x49.\x03C9\x0390\x03B0\x2018\x2015"\
2454 "\x7D\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\xB1\xBD.\x0387\x2019\xA6"\
2455 "\x5C.\x53\x54\x55\x56\x57\x58\x59\x5A\xB2\xA7..\xAB\xAC"\
2456 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\xB3\xA9..\xBB.");
2457 }
2458
2459 else if(codepage.Find(wxT("1026")) != wxNOT_FOUND ){
2460 newCP=wxEmptyString;
2461 for (unsigned i=0; i<0x40 ; i++)
2462 newCP+=wxChar('.');
2463 // At 0xCA, (0xAD) replaced with .
2464 // At 0xFF, (0x9F) replaced with .
2465 newCP+=wxT( "\x20\xA0\xE2\xE4\xE0\xE1\xE3\xE5\x7B\xF1\xC7\x2E\x3C\x28\x2B\x21"\
2466 "\x26\xE9\xEA\xEB\xE8\xED\xEE\xEF\xEC\xDF\x011E\x0130\x2A\x29\x3B\x5E"\
2467 "\x2D\x2F\xC2\xC4\xC0\xC1\xC3\xC5\x5B\xD1\x015F\x2C\x25\x5F\x3E\x3F"\
2468 "\xF8\xC9\xCA\xCB\xC8\xCD\xCE\xCF\xCC\x0131\x3A\xD6\x015E\x27\x3D\xDC"\
2469 "\xD8\x61\x62\x63\x64\x65\x66\x67\x68\x69\xAB\xBB\x7D\x60\xA6\xB1"\
2470 "\xB0\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\xAA\xBA\xE6\xB8\xC6\xA4"\
2471 "\xB5\xF6\x73\x74\x75\x76\x77\x78\x79\x7A\xA1\xBF\x5D\x24\x40\xAE"\
2472 "\xA2\xA3\xA5\xB7\xA9\xA7\xB6\xBC\xBD\xBE\xAC\x7C\xAF\xA8\xB4\xD7"\
2473 "\xE7\x41\x42\x43\x44\x45\x46\x47\x48\x49.\xF4\x7E\xF2\xF3\xF5"\
2474 "\x011F\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\xB9\xFB\x5C\xF9\xFA\xFF"\
2475 "\xFC\xF7\x53\x54\x55\x56\x57\x58\x59\x5A\xB2\xD4\x23\xD2\xD3\xD5"\
2476 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\xB3\xDB\x22\xD9\xDA.");
2477
2478 }
2479
2480 else if(codepage.Find(wxT("1047")) != wxNOT_FOUND ){
2481 unsigned char a[]="\x8F\xAD\xB0\xBA\xBB\xBD"; //Patch Index
2482 unsigned char b[]="\x5E\x5B\xAC\xDD\xA8\x5D"; //Patch Value
2483 for(int i=0;i<6;i++)
2484 newCP[a[i]]=wxChar(b[i]);
2485 }
2486 else if(codepage.Find(wxT("1040")) != wxNOT_FOUND ){
2487 newCP[0x9F]=wxChar(0x20AC);
2488 }
2489
2490 else if(codepage.Find(wxT("1146")) != wxNOT_FOUND ){
2491 newCP=PrepareCodepageTable( wxT("EBCDIC 285"));
2492 newCP[0x9F]=wxChar(0x20AC);
2493 }
2494
2495 else if(codepage.Find(wxT("1148")) != wxNOT_FOUND ){
2496 newCP=PrepareCodepageTable( wxT("EBCDIC 500"));
2497 newCP[0x9F]=wxChar(0x20AC);
2498 }
2499 }
2500
2501 else if(codepage.Find(wxT("Macintosh")) != wxNOT_FOUND ){
2502 //Control chars replaced with dot
2503 for (unsigned i=0; i<0x20 ; i++)
2504 newCP+=wxChar('.');
2505 //ASCII compatible part
2506 for( unsigned i=0x20 ; i < 0x7F ; i++ )
2507 newCP += wxChar(i);
2508 newCP+='.';//0xFF delete char
2509
2510 if( codepage.Find(wxT("CP10000")) != wxNOT_FOUND ) //Macintosh Roman extension table
2511 newCP+=wxT( "\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8"\
2512 "\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC"\
2513 "\x2020\xB0\xA2\xA3\xA7\x2022\xB6\xDF\xAE\xA9\x2122\xB4\xA8\x2260\xC6\xD8"\
2514 "\x221E\xB1\x2264\x2265\xA5\xB5\x2202\x2211\x220F\x03C0\x222B\xAA\xBA\x2126\xE6\xF8"\
2515 "\xBF\xA1\xAC\x221A\x0192\x2248\x2206\xAB\xBB\x2026\xA0\xC0\xC3\xD5\x0152\x0153"\
2516 "\x2013\x2014\x201C\x201D\x2018\x2019\xF7\x25CA\xFF\x0178\x2044\xA4\x2039\x203A\xFB01\xFB02"\
2517 "\x2021\xB7\x201A\x201E\x2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4"\
2518 ".\xD2\xDA\xDB\xD9\x0131\x02C6\x02DC\xAF\x02D8\x02D9\x02DA\xB8\x02DD\x02DB\x02C7" );
2519
2520 else if( codepage.Find(wxT("CP10029")) != wxNOT_FOUND ) //Macintosh Latin2 extension table
2521 newCP+=wxT( "\xC4\x0100\x0101\xC9\x0104\xD6\xDC\xE1\x0105\x010C\xE4\x010D\x0106\x0107\xE9\x0179"\
2522 "\x017A\x010E\xED\x010F\x0112\x0113\x0116\xF3\x0117\xF4\xF6\xF5\xFA\x011A\x011B\xFC"\
2523 "\x2020\xB0\x0118\xA3\xA7\x2022\xB6\xDF\xAE\xA9\x2122\x0119\xA8\x2260\x0123\x012E"\
2524 "\x012F\x012A\x2264\x2265\x012B\x0136\x2202\x2211\x0142\x013B\x013C\x013D\x013E\x0139\x013A\x0145"\
2525 "\x0146\x0143\xAC\x221A\x0144\x0147\x2206\xAB\xBB\x2026\xA0\x0148\x0150\xD5\x0151\x014C"\
2526 "\x2013\x2014\x201C\x201D\x2018\x2019\xF7\x25CA\x014D\x0154\x0155\x0158\x2039\x203A\x0159\x0156"\
2527 "\x0157\x0160\x201A\x201E\x0161\x015A\x015B\xC1\x0164\x0165\xCD\x017D\x017E\x016A\xD3\xD4"\
2528 "\x016B\x016E\xDA\x016F\x0170\x0171\x0172\x0173\xDD\xFD\x0137\x017B\x0141\x017C\x0122\x02C7" );
2529
2530
2531 else if( codepage.Find(wxT("CP10079")) != wxNOT_FOUND ) //Macintosh Icelandic extension table
2532 newCP+=wxT( "\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8"\
2533 "\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC"\
2534 "\xDD\xB0\xA2\xA3\xA7\x2022\xB6\xDF\xAE\xA9\x2122\xB4\xA8\x2260\xC6\xD8"\
2535 "\x221E\xB1\x2264\x2265\xA5\xB5\x2202\x2211\x220F\x03C0\x222B\xAA\xBA\x2126\xE6\xF8"\
2536 "\xBF\xA1\xAC\x221A\x0192\x2248\x2206\xAB\xBB\x2026\xA0\xC0\xC3\xD5\x0152\x0153"\
2537 "\x2013\x2014\x201C\x201D\x2018\x2019\xF7\x25CA\xFF\x0178\x2044\xA4\xD0\xF0\xDE\xFE"\
2538 "\xFD\xB7\x201A\x201E\x2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4"\
2539 ".\xD2\xDA\xDB\xD9\x0131\x02C6\x02DC\xAF\x02D8\x02D9\x02DA\xB8\x02DD\x02DB\x02C7" );
2540
2541
2542 else if( codepage.Find(wxT("CP10006")) != wxNOT_FOUND ) //Macintosh Greek CP10006 extension table
2543 newCP+=wxT( "\xC4\xB9\xB2\xC9\xB3\xD6\xDC\x0385\xE0\xE2\xE4\x0384\xA8\xE7\xE9\xE8"\
2544 "\xEA\xEB\xA3\x2122\xEE\xEF\x2022\xBD\x2030\xF4\xF6\xA6\xAD\xF9\xFB\xFC"\
2545 "\x2020\x0393\x0394\x0398\x039B\x039E\x03A0\xDF\xAE\xA9\x03A3\x03AA\xA7\x2260\xB0\x0387"\
2546 "\x0391\xB1\x2264\x2265\xA5\x0392\x0395\x0396\x0397\x0399\x039A\x039C\x03A6\x03AB\x03A8\x03A9"\
2547 "\x03AC\x039D\xAC\x039F\x03A1\x2248\x03A4\xAB\xBB\x2026\xA0\x03A5\x03A7\x0386\x0388\x0153"\
2548 "\x2013\x2015\x201C\x201D\x2018\x2019\xF7\x0389\x038A\x038C\x038E\x03AD\x03AE\x03AF\x03CC\x038F"\
2549 "\x03CD\x03B1\x03B2\x03C8\x03B4\x03B5\x03C6\x03B3\x03B7\x03B9\x03BE\x03BA\x03BB\x03BC\x03BD\x03BF"\
2550 "\x03C0\x03CE\x03C1\x03C3\x03C4\x03B8\x03C9\x03C2\x03C7\x03C5\x03B6\x03CA\x03CB\x0390\x03B0." );
2551
2552 else if( codepage.Find(wxT("CP10007")) != wxNOT_FOUND )//Macintosh Cyrillic extension table
2553 newCP+=wxT( "\x0410\x0411\x0412\x0413\x0414\x0415\x0416\x0417\x0418\x0419\x041A\x041B\x041C\x041D\x041E\x041F"\
2554 "\x0420\x0421\x0422\x0423\x0424\x0425\x0426\x0427\x0428\x0429\x042A\x042B\x042C\x042D\x042E\x042F"\
2555 "\x2020\xB0\xA2\xA3\xA7\x2022\xB6\x0406\xAE\xA9\x2122\x0402\x0452\x2260\x0403\x0453"\
2556 "\x221E\xB1\x2264\x2265\x0456\xB5\x2202\x0408\x0404\x0454\x0407\x0457\x0409\x0459\x040A\x045A"\
2557 "\x0458\x0405\xAC\x221A\x0192\x2248\x2206\xAB\xBB\x2026\xA0\x040B\x045B\x040C\x045C\x0455"\
2558 "\x2013\x2014\x201C\x201D\x2018\x2019\xF7\x201E\x040E\x045E\x040F\x045F\x2116\x0401\x0451\x044F"\
2559 "\x0430\x0431\x0432\x0433\x0434\x0435\x0436\x0437\x0438\x0439\x043A\x043B\x043C\x043D\x043E\x043F"\
2560 "\x0440\x0441\x0442\x0443\x0444\x0445\x0446\x0447\x0448\x0449\x044A\x044B\x044C\x044D\x044E\xA4" );
2561
2562 else if( codepage.Find(wxT("CP10081")) != wxNOT_FOUND ) //Macintosh Turkish extension table
2563 newCP+=wxT( "\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8"\
2564 "\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC"\
2565 "\x2020\xB0\xA2\xA3\xA7\x2022\xB6\xDF\xAE\xA9\x2122\xB4\xA8\x2260\xC6\xD8"\
2566 "\x221E\xB1\x2264\x2265\xA5\xB5\x2202\x2211\x220F\x03C0\x222B\xAA\xBA\x2126\xE6\xF8"\
2567 "\xBF\xA1\xAC\x221A\x0192\x2248\x2206\xAB\xBB\x2026\xA0\xC0\xC3\xD5\x0152\x0153"\
2568 "\x2013\x2014\x201C\x201D\x2018\x2019\xF7\x25CA\xFF\x0178\x011E\x011F\x0130\x0131\x015E\x015F"\
2569 "\x2021\xB7\x201A\x201E\x2030\xC2\xCA\xC1\xCB\xC8\xCD\xCE\xCF\xCC\xD3\xD4"\
2570 ".\xD2\xDA\xDB\xD9.\x02C6\x02DC\xAF\x02D8\x02D9\x02DA\xB8\x02DD\x02DB\x02C7" );
2571
2572 #ifdef __WXMAC__
2573 else{
2574 for (unsigned i=0; i<=0xFF ; i++)
2575 bf[i] = (i<0x20 || i==0x7F) ? '.' : i;
2576 if( codepage.Find(wxT("Arabic")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACARABIC), 256);
2577 if( codepage.Find(wxT("Arabic Ext")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACARABICEXT), 256);
2578 if( codepage.Find(wxT("Armanian")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACARMENIAN), 256);
2579 if( codepage.Find(wxT("Bengali")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACBENGALI), 256);
2580 if( codepage.Find(wxT("Burmese")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACBURMESE), 256);
2581 if( codepage.Find(wxT("Celtic")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACCELTIC), 256);
2582 if( codepage.Find(wxT("Central European")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACCENTRALEUR), 256);
2583 if( codepage.Find(wxT("Chinese Imperial")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACCHINESESIMP), 256);
2584 if( codepage.Find(wxT("Chinese Traditional")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACCHINESETRAD), 256);
2585 if( codepage.Find(wxT("Croatian")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACCROATIAN), 256);
2586 if( codepage.Find(wxT("Cyrillic")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACCYRILLIC), 256);
2587 if( codepage.Find(wxT("Devanagari")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACDEVANAGARI), 256);
2588 if( codepage.Find(wxT("Dingbats")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACDINGBATS), 256);
2589 if( codepage.Find(wxT("Ethiopic")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACETHIOPIC), 256);
2590 if( codepage.Find(wxT("Gaelic")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACGAELIC), 256);
2591 if( codepage.Find(wxT("Georgian")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACGEORGIAN), 256);
2592 if( codepage.Find(wxT("Greek")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACGREEK), 256);
2593 if( codepage.Find(wxT("Gujarati")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACGUJARATI), 256);
2594 if( codepage.Find(wxT("Gurmukhi")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACGURMUKHI), 256);
2595 if( codepage.Find(wxT("Hebrew")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACHEBREW), 256);
2596 if( codepage.Find(wxT("Icelandic")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACICELANDIC), 256);
2597 if( codepage.Find(wxT("Japanese")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACJAPANESE), 256);
2598 if( codepage.Find(wxT("Kannada")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACKANNADA), 256);
2599 if( codepage.Find(wxT("Keyboard")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACKEYBOARD), 256);
2600 if( codepage.Find(wxT("Khmer")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACKHMER), 256);
2601 if( codepage.Find(wxT("Korean")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACKOREAN), 256);
2602 if( codepage.Find(wxT("Laotian")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACLAOTIAN), 256);
2603 if( codepage.Find(wxT("Malajalam")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACMALAJALAM), 256);
2604 // if( codepage.Find(wxT("Min")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACMAX), 256);
2605 // if( codepage.Find(wxT("Max")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACMIN), 256);
2606 if( codepage.Find(wxT("Mongolian")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACMONGOLIAN), 256);
2607 if( codepage.Find(wxT("Oriya")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACORIYA), 256);
2608 if( codepage.Find(wxT("Roman ")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACROMAN), 256);
2609 if( codepage.Find(wxT("Romanian")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACROMANIAN), 256);
2610 if( codepage.Find(wxT("Sinhalese")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACSINHALESE), 256);
2611 if( codepage.Find(wxT("Symbol")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACSYMBOL), 256);
2612 if( codepage.Find(wxT("Tamil")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACTAMIL), 256);
2613 if( codepage.Find(wxT("Telugu")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACTELUGU), 256);
2614 if( codepage.Find(wxT("Thai")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACTHAI), 256);
2615 if( codepage.Find(wxT("Tibetan")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACTIBETAN), 256);
2616 if( codepage.Find(wxT("Turkish")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACTURKISH), 256);
2617 if( codepage.Find(wxT("Viatnamese")) != wxNOT_FOUND ) newCP+=wxString( bf, wxCSConv(wxFONTENCODING_MACVIATNAMESE), 256);
2618 }
2619 #endif// __WXMAC__
2620 }
2621
2622 else if( codepage.Find(wxT("DEC Multinational")) != wxNOT_FOUND ){
2623 newCP=PrepareCodepageTable(wxT("ISO/IEC 8859-1 "));//Warning! Watch the space after last 1
2624 unsigned char a[]="\xA0\xA4\xA6\xA8\xAC\xAD\xAE\xAF\xB4\xB8\xBE\xD0\xDE\xF0\xFD\xFE\xFF"; //Patch Index
2625 unsigned char b[]="...\xA4..........\xFF.."; //Patch Value
2626 for(int i=0;i<17;i++)
2627 newCP[a[i]]=wxChar(b[i]);
2628
2629 newCP[0xD7]=wxChar(0x0152);
2630 newCP[0xDD]=wxChar(0x0178);
2631 newCP[0xF7]=wxChar(0x0153);
2632 }
2633
2634 else if(codepage.Find(wxT("UTF8 ")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF8;
2635 else if(codepage.Find(wxT("UTF16 ")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF16;
2636 else if(codepage.Find(wxT("UTF16LE")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF16LE;
2637 else if(codepage.Find(wxT("UTF16BE")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF16BE;
2638 else if(codepage.Find(wxT("UTF32 ")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF32;
2639 else if(codepage.Find(wxT("UTF32LE")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF32LE;
2640 else if(codepage.Find(wxT("UTF32BE")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_UTF32BE;
2641 else if(codepage.Find(wxT("GB2312")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_GB2312;
2642 else if(codepage.Find(wxT("GBK")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_CP936;
2643 else if(codepage.Find(wxT("Shift JIS")) != wxNOT_FOUND )FontEnc=wxFONTENCODING_SHIFT_JIS;//CP932
2644 else if(codepage.Find(wxT("Big5")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_BIG5;//CP950
2645 else if(codepage.Find(wxT("EUC-JP")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_EUC_JP;
2646 else if(codepage.Find(wxT("EUC-KR")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_CP949; //EUC-KR
2647 // else if(codepage.StartsWith(wxT("EUC-CN"))) FontEnc=wxFONTENCODING_GB2312;
2648 //else if(codepage.Find(wxT("Linux Bulgarian")) != wxNOT_FOUND ) FontEnc=wxFONTENCODING_BULGARIAN;
2649 #endif // !_MSC_VER
2650 return CodepageTable=newCP;
2651 }
2652
Replace(unsigned text_location,const wxChar & value,bool paint)2653 void wxHexTextCtrl::Replace(unsigned text_location, const wxChar& value, bool paint){
2654 if( text_location < m_text.Length() )
2655 m_text[text_location] = Filter(value);
2656 // m_text[text_location] = value;
2657 else{
2658 m_text << Filter(value);
2659 // m_text << value;
2660 //m_text << wxT("0");
2661 }
2662 RePaint();
2663 }
2664
ChangeValue(const wxString & value,bool paint)2665 void wxHexTextCtrl::ChangeValue( const wxString& value, bool paint ){
2666 m_text = value;
2667 if( paint )
2668 RePaint();
2669 }
2670
SetBinValue(char * buffer,int len,bool paint)2671 void wxHexTextCtrl::SetBinValue( char* buffer, int len, bool paint ){
2672 m_text.Clear();
2673
2674 if(FontEnc!=wxFONTENCODING_ALTERNATIVE){
2675 ///only shows the annoying pop-up and does not do anything else.
2676 //if(not wxFontMapper::Get()->IsEncodingAvailable( FontEnc ) )
2677 // wxMessageBox(wxT("Encoding is not available!"), wxT("Error!"), wxOK|wxCENTRE );
2678 m_text << FilterMBBuffer(buffer,len,FontEnc);
2679 }
2680 else
2681 for( int i=0 ; i<len ; i++ )
2682 m_text << Filter(buffer[i]);
2683
2684 // m_text << FilterUTF8(buffer,len);
2685 // m_text=wxString(buffer, wxCSConv(wxFONTENCODING_CP1252), len);
2686 // m_text=wxString(buffer, wxCSConv(wxFONTENCODING_UTF8), len);
2687
2688 if( paint )
2689 RePaint();
2690 }
2691
SetDefaultStyle(wxTextAttr & new_attr)2692 void wxHexTextCtrl::SetDefaultStyle( wxTextAttr& new_attr ){
2693 HexDefaultAttr = new_attr;
2694
2695 wxClientDC dc(this);
2696 dc.SetFont( HexDefaultAttr.GetFont() );
2697 SetFont( HexDefaultAttr.GetFont() );
2698 m_CharSize.y = dc.GetCharHeight();
2699 m_CharSize.x = dc.GetCharWidth();
2700 if( FontEnc == wxFONTENCODING_UTF16LE ||
2701 FontEnc == wxFONTENCODING_UTF16BE ||
2702 FontEnc == wxFONTENCODING_UTF32LE ||
2703 FontEnc == wxFONTENCODING_UTF32BE
2704 ){
2705 m_CharSize.x += 5;
2706 DrawCharByChar=true;
2707 }
2708 else
2709 DrawCharByChar=false;
2710
2711 wxCaret *caret = GetCaret();
2712 #ifdef _DEBUG_CARET_
2713 std::cout << "Caret = 0x"<< (intptr_t) caret << " - mycaret= 0x" << (intptr_t) mycaret << "m_charSize.x" << m_CharSize.x << std::endl;
2714 #endif
2715 if ( caret )
2716 caret->SetSize(m_CharSize.x, m_CharSize.y);
2717
2718 RePaint();
2719 }
2720
PixelCoordToInternalPosition(wxPoint mouse)2721 int wxHexTextCtrl::PixelCoordToInternalPosition( wxPoint mouse ){
2722 mouse.x = ( mouse.x < 0 ? 0 : mouse.x);
2723 mouse.x = ( mouse.x > m_CharSize.x*m_Window.x ? m_CharSize.x*m_Window.x-1 : mouse.x);
2724 mouse.y = ( mouse.y < 0 ? 0 : mouse.y);
2725 mouse.y = ( mouse.y > m_CharSize.y*m_Window.y ? m_CharSize.y*m_Window.y-1 : mouse.y);
2726
2727 int x = (mouse.x - m_Margin.x) / m_CharSize.x;
2728 int y = (mouse.y - m_Margin.y) / m_CharSize.y;
2729 return ( x + y * CharacterPerLine() );
2730 }
2731
GetInsertionPoint(void)2732 int wxHexTextCtrl::GetInsertionPoint( void ){
2733 return m_Caret.x + CharacterPerLine() * m_Caret.y;
2734 }
2735
SetInsertionPoint(unsigned int pos)2736 void wxHexTextCtrl::SetInsertionPoint( unsigned int pos ){
2737 if(pos > m_text.Length())
2738 pos = m_text.Length();
2739 MoveCaret( wxPoint(pos%m_Window.x , pos/m_Window.x) );
2740 }
2741
ChangeSize()2742 void wxHexTextCtrl::ChangeSize(){
2743 unsigned gip = GetInsertionPoint();
2744 wxSize size = GetClientSize();
2745
2746 m_Window.x = (size.x - 2*m_Margin.x) / m_CharSize.x;
2747 m_Window.y = (size.y - 2*m_Margin.x) / m_CharSize.y;
2748 if ( m_Window.x < 1 )
2749 m_Window.x = 1;
2750 if ( m_Window.y < 1 )
2751 m_Window.y = 1;
2752
2753 //This Resizes internal buffer!
2754 CreateDC();
2755
2756 RePaint();
2757 SetInsertionPoint( gip );
2758 }
2759
DrawCursorShadow(wxDC * dcTemp)2760 void wxHexTextCtrl::DrawCursorShadow(wxDC* dcTemp){
2761 if( m_Window.x <= 0 ||
2762 FindFocus()==this )
2763 return;
2764
2765 #ifdef _DEBUG_CARET_
2766 std::cout << "wxHexTextCtrl::DrawCursorShadow(x,y) - charsize(x,y) :" << m_Caret.x << ',' << m_Caret.y << " - " << m_CharSize.x << ',' << m_CharSize.y << std::endl;
2767 #endif // _DEBUG_CARET_
2768
2769 int y=m_CharSize.y*( m_Caret.y ) + m_Margin.y;
2770 int x=m_CharSize.x*( m_Caret.x ) + m_Margin.x;
2771
2772 dcTemp->SetPen( *wxBLACK_PEN );
2773 dcTemp->SetBrush( *wxTRANSPARENT_BRUSH );
2774 dcTemp->DrawRectangle(x,y,m_CharSize.x+1,m_CharSize.y);
2775 }
2776 ///------HEXOFFSETCTRL-----///
SetValue(uint64_t position)2777 void wxHexOffsetCtrl::SetValue( uint64_t position ){
2778 SetValue( position, BytePerLine );
2779 }
2780
SetValue(uint64_t position,int byteperline)2781 void wxHexOffsetCtrl::SetValue( uint64_t position, int byteperline ){
2782 offset_position = position;
2783 BytePerLine = byteperline;
2784 m_text.Clear();
2785
2786 wxString format=GetFormatString();
2787 //not wxULongLong_t ull due no wxULongLongFmtSpec
2788 //wxLongLong_t ull = ( offset_position );
2789 uint64_t ull = ( offset_position );
2790 if( offset_mode == 's' ){//Sector Indicator!
2791 for( int i=0 ; i<LineCount() ; i++ ){
2792 m_text << wxString::Format( format, int64_t(ull/sector_size), unsigned(ull%sector_size) );
2793 ull += BytePerLine;
2794 }
2795 }
2796 else
2797 for( int i=0 ; i<LineCount() ; i++ ){
2798 m_text << wxString::Format( format, ull );
2799 ull += BytePerLine;
2800 }
2801 RePaint();
2802 }
2803
GetFormatedOffsetString(uint64_t c_offset,bool minimal)2804 wxString wxHexOffsetCtrl::GetFormatedOffsetString( uint64_t c_offset, bool minimal ){
2805 if(offset_mode=='s')
2806 return wxString::Format( GetFormatString(minimal), uint64_t(c_offset/sector_size), unsigned(c_offset%sector_size) );
2807 return wxString::Format( GetFormatString(minimal), c_offset );
2808 }
2809
GetFormatString(bool minimal)2810 wxString wxHexOffsetCtrl::GetFormatString( bool minimal ){
2811 wxString format;
2812 if(offset_mode=='s'){
2813 int sector_digit=0;
2814 int offset_digit=0;
2815 if(!minimal){
2816 while((1+offset_limit/sector_size) > pow(10,++sector_digit));
2817 while(sector_size > pow(10,++offset_digit));
2818 }
2819 #ifdef __WXMAC__
2820 format << wxT("%0") << sector_digit << wxT("llu:%0") << offset_digit << wxT("u");
2821 #else
2822 format << wxT("%0") << sector_digit << wxLongLongFmtSpec << wxT(":%0") << offset_digit;
2823 #endif
2824 return format;
2825 }
2826 format << wxT("%0") << (minimal? 0 : GetDigitCount()) << wxLongLongFmtSpec << wxChar( offset_mode );
2827 if( offset_mode=='X' )
2828 format << wxChar('h');
2829 else if ( offset_mode=='o')
2830 format << wxChar('o');
2831 return format;
2832 }
2833
OnMouseRight(wxMouseEvent & event)2834 void wxHexOffsetCtrl::OnMouseRight( wxMouseEvent& event ){
2835 switch( offset_mode ){
2836 case 'u': offset_mode = 'X'; break;
2837 case 'X': offset_mode = 'o'; break;
2838 case 'o': offset_mode = (sector_size ? 's' :'u'); break;
2839 case 's': offset_mode = 'u'; break;
2840 default : offset_mode = 'u';
2841 }
2842
2843 wxString s= wxChar( offset_mode );
2844 myConfigBase::Get()->Write( _T("LastOffsetMode"), s);
2845
2846 SetValue( offset_position );
2847 }
2848
OnMouseLeft(wxMouseEvent & event)2849 void wxHexOffsetCtrl::OnMouseLeft( wxMouseEvent& event ){
2850 wxPoint p = PixelCoordToInternalCoord( event.GetPosition() );
2851 uint64_t address = offset_position + p.y*BytePerLine;
2852 wxString adr;
2853 if(offset_mode=='s')
2854 adr = wxString::Format( GetFormatString(), (1+address/sector_size), address%sector_size);
2855 else
2856 adr = wxString::Format( GetFormatString(), address);
2857
2858 if(wxTheClipboard->Open()) {
2859 wxTheClipboard->Clear();
2860 if( !wxTheClipboard->SetData( new wxTextDataObject( adr )) )
2861 wxBell();
2862 wxTheClipboard->Flush();
2863 wxTheClipboard->Close();
2864 }
2865 }
2866
GetDigitCount(void)2867 unsigned wxHexOffsetCtrl::GetDigitCount( void ){
2868 digit_count=0;
2869 int base=0;
2870 switch( offset_mode){
2871 case 'u': base=10; break;
2872 case 'X': base=16; break;
2873 case 'o': base= 8; break;
2874 case 's': base=10; break;
2875 }
2876 if( offset_mode=='s'){
2877 int digit_count2=0;
2878 while(1+(offset_limit/sector_size) > pow(base,++digit_count));
2879 while(sector_size > pow(base,++digit_count2));
2880 digit_count+=digit_count2;
2881 }
2882
2883 while(offset_limit > pow(base,++digit_count));
2884 if( digit_count < 6)
2885 digit_count=6;
2886
2887 return digit_count;
2888 }
2889
GetLineSize(void)2890 unsigned wxHexOffsetCtrl::GetLineSize( void ){
2891 unsigned line_size = GetDigitCount();
2892 if( offset_mode=='X' || offset_mode=='o' )
2893 line_size++;
2894 return line_size;
2895 }
2896