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