I wrote a very simple ASCII viewer, the idea was came from PN2.0 (Programmer notepad 2.0, 
Code: Select all
const char * const asc[] = 
{
	"001 | x01 | SOH (start of heading)",
	"002 | x02 | STX (start of text)",
	"003 | x03 | ETX (end of text)",
	"004 | x04 | EOT (end of transmission)",
	"005 | x05 | ENQ (enquiry)",
	"006 | x06 | ACK (acknowledge)",
	"007 | x07 | BEL (bell)",
	"008 | x08 | BS (backspace)",
	"009 | x09 | TAB (horizontal tab)",
	"010 | x0a | LF (NL new line/line feed)",
	"011 | x0b | VT (vertical tab)",
	"012 | x0c | FF (form feed, NP new page)",
	"013 | x0d | CR (carriage return)",
	"014 | x0e | SO (shift out)",
	"015 | x0f | SI (shift in)",
	"016 | x10 | DLE (data link escape)",
	"017 | x11 | DC1 (device control 1)",
	"018 | x12 | DC2 (device control 2)",
	"019 | x13 | DC3 (device control 3)",
	"020 | x14 | DC4 (device control 4)",
	"021 | x15 | NAK (negative acknowledge)",
	"022 | x16 | SYN (synchronous idle)",
	"023 | x17 | ETB (end of transmission)",
	"024 | x18 | CAN (cancel)",
	"025 | x19 | EM (end of medium)",
	"026 | x1a | SUB (substitute)",
	"027 | x1b | ESC (escape)",
	"028 | x1c | FS (file separator)",
	"029 | x1d | GS (group separator)",
	"030 | x1e | RS (record separator)",
	"031 | x1f | US (unit separator)",
	"032 | x20 | Space",
	"033 | x21 | !",
	"034 | x22 | \"",
	"035 | x23 | #",
	"036 | x24 | $",
	"037 | x25 | %",
	"038 | x26 | &",
	"039 | x27 | '",
	"040 | x28 | (",
	"041 | x29 | )",
	"042 | x2a | *",
	"043 | x2b | +",
	"044 | x2c | ,",
	"045 | x2d | -",
	"046 | x2e | .",
	"047 | x2f | /",
	"048 | x30 | 0",
	"049 | x31 | 1",
	"050 | x32 | 2",
	"051 | x33 | 3",
	"052 | x34 | 4",
	"053 | x35 | 5",
	"054 | x36 | 6",
	"055 | x37 | 7",
	"056 | x38 | 8",
	"057 | x39 | 9",
	"058 | x3a | :",
	"059 | x3b | ;",
	"060 | x3c | <",
	"061 | x3d | =",
	"062 | x3e | >",
	"063 | x3f | ?",
	"064 | x40 | @",
	"065 | x41 | A",
	"066 | x42 | B",
	"067 | x43 | C",
	"068 | x44 | D",
	"069 | x45 | E",
	"070 | x46 | F",
	"071 | x47 | G",
	"072 | x48 | H",
	"073 | x49 | I",
	"074 | x4a | J",
	"075 | x4b | K",
	"076 | x4c | L",
	"077 | x4d | M",
	"078 | x4e | N",
	"079 | x4f | O",
	"080 | x50 | P",
	"081 | x51 | Q",
	"082 | x52 | R",
	"083 | x53 | S",
	"084 | x54 | T",
	"085 | x55 | U",
	"086 | x56 | V",
	"087 | x57 | W",
	"088 | x58 | X",
	"089 | x59 | Y",
	"090 | x5a | Z",
	"091 | x5b | [",
	"092 | x5c | \\",
	"093 | x5d | ]",
	"094 | x5e | ^",
	"095 | x5f | _",
	"096 | x60 | `",
	"097 | x61 | a",
	"098 | x62 | b",
	"099 | x63 | c",
	"100 | x64 | d",
	"101 | x65 | e",
	"102 | x66 | f",
	"103 | x67 | g",
	"104 | x68 | h",
	"105 | x69 | i",
	"106 | x6a | j",
	"107 | x6b | k",
	"108 | x6c | l",
	"109 | x6d | m",
	"110 | x6e | n",
	"111 | x6f | o",
	"112 | x70 | p",
	"113 | x71 | q",
	"114 | x72 | r",
	"115 | x73 | s",
	"116 | x74 | t",
	"117 | x75 | u",
	"118 | x76 | v",
	"119 | x77 | w",
	"120 | x78 | x",
	"121 | x79 | y",
	"122 | x7a | z",
	"123 | x7b | {",
	"124 | x7c | |",
	"125 | x7d | }",
	"126 | x7e | ~",
	"127 | x7f | (del)"
};
ClipsPane::ClipsPane(wxWindow *parent, wxString caption)
		: wxPanel(parent), m_caption(caption)
{
	wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
	wxArrayString clips;
	clips.Add(wxT("ASCII Characters"));
	m_clips = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, clips, 0 );
	m_clips->SetSelection(0);
	mainSizer->Add(m_clips, 0, wxEXPAND|wxALL, 1);
	m_list = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SORT ); 
	mainSizer->Add( m_list, 1, wxALL|wxEXPAND, 1 );
	
	m_list->Freeze();
	for (size_t i = 0; i < sizeof(asc) / sizeof(char *); ++i)
	{
		wxString txt = _U(asc[i]);
		m_list->Append(txt);
	}
	m_list->Thaw();
	SetSizer( mainSizer );
	Layout();
}
void WorkspacePane::CreateGUIControls()
{
	wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
	SetSizer(mainSizer);
    // selected configuration:
	mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("Selected Configuration:")), 0, wxEXPAND| wxTOP|wxLEFT|wxRIGHT, 5);
	wxBoxSizer *hsz = new wxBoxSizer(wxHORIZONTAL);
	mainSizer->Add(hsz, 0, wxEXPAND|wxALL, 5);
	wxArrayString choices;
	m_workspaceConfig = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, choices, wxCB_READONLY|wxALIGN_CENTER_VERTICAL);
	m_workspaceConfig->Enable(false);
	ConnectCombo(m_workspaceConfig, WorkspacePane::OnConfigurationManagerChoice);
	hsz->Add(m_workspaceConfig, 1, wxEXPAND);
	wxButton *btn = new wxButton(this, wxID_ANY, wxT("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
	ConnectButton(btn, WorkspacePane::OnConfigurationManager);
	btn->Connect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(WorkspacePane::OnConfigurationManagerUI), NULL, this);
	hsz->Add(btn, 0, wxALIGN_CENTER_VERTICAL);
	// add static line separator
	wxStaticLine *line = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
	mainSizer->Add(line, 0, wxEXPAND);
    // add notebook for tabs
	long bookStyle = wxVB_LEFT|wxVB_FIXED_WIDTH;
	EditorConfigST::Get()->GetLongValue(wxT("WorkspaceView"), bookStyle);
	m_book = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookStyle);
	// Calculate the widthest tab (the one with the 'Workspcae' label)
	int xx, yy;
	wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
	wxWindow::GetTextExtent(wxT("Workspace"), &xx, &yy, NULL, NULL, &fnt);
	m_book->SetFixedTabWidth(xx + 20);
    m_book->SetAuiManager(m_mgr, m_caption);
	mainSizer->Add(m_book, 1, wxEXPAND | wxALL, 1);
    // create tabs (possibly detached)
	DetachedPanesInfo dpi;
	EditorConfigST::Get()->ReadObject(wxT("DetachedPanesList"), &dpi);
	wxArrayString detachedPanes = dpi.GetPanes();
	m_workspaceTab = new WorkspaceTab(m_book, wxT("Workspace"));
	ADD_WORKSPACE_PAGE(m_workspaceTab, m_workspaceTab->GetCaption());
	m_explorer = new FileExplorer(m_book, wxT("Explorer"));
	ADD_WORKSPACE_PAGE(m_explorer, m_explorer->GetCaption());
	m_winStack = new WindowStack(m_book, wxID_ANY);
	ADD_WORKSPACE_PAGE(m_winStack, wxT("Outline"));
	m_openWindowsPane = new OpenWindowsPanel(m_book, wxT("Tabs"));
	ADD_WORKSPACE_PAGE(m_openWindowsPane, m_openWindowsPane->GetCaption());
	m_clipsTab = new ClipsPane(m_book, wxT("Clips"));
	ADD_WORKSPACE_PAGE(m_clipsTab, wxT("Clips"));
	if (m_book->GetPageCount() > 0) {
		m_book->SetSelection((size_t)0);
	}
	m_mgr->Update();
}