/* * Copyright 2018 faddenSoft * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Text; using System.Windows.Forms; namespace SourceGen.Tools { public partial class AsciiChart : Form { /// /// Chart mode. Must match combo box entries. /// private enum Mode { Standard = 0, High = 1 }; /// /// Subscribe to this to be notified when the dialog closes. /// public event WindowClosing OnWindowClosing; public delegate void WindowClosing(object sender, EventArgs e); public AsciiChart() { InitializeComponent(); } private void AsciiChart_Load(object sender, EventArgs e) { int mode = AppSettings.Global.GetInt(AppSettings.ASCCH_MODE, 0); if (mode >= 0 && mode < modeComboBox.Items.Count) { modeComboBox.SelectedIndex = mode; } DrawContents(); } private void AsciiChart_FormClosed(object sender, FormClosedEventArgs e) { if (OnWindowClosing != null) { OnWindowClosing(this, e); } } private void modeComboBox_SelectedIndexChanged(object sender, EventArgs e) { AppSettings.Global.SetInt(AppSettings.ASCCH_MODE, modeComboBox.SelectedIndex); DrawContents(); } private void DrawContents() { const string hdr = "Dec Hex Chr"; const string div = " | "; const string eol = "\r\n"; Mode mode = (Mode) modeComboBox.SelectedIndex; StringBuilder sb = new StringBuilder( (hdr.Length * 4 + div.Length * 3 + eol.Length) * 32); sb.Append(hdr); sb.Append(div); sb.Append(hdr); sb.Append(div); sb.Append(hdr); sb.Append(div); sb.Append(hdr); sb.Append(eol); for (int i = 0; i < 32; i++) { DrawEntry(mode, i, sb); sb.Append(div); DrawEntry(mode, i + 32, sb); sb.Append(div); DrawEntry(mode, i + 64, sb); sb.Append(div); DrawEntry(mode, i + 96, sb); sb.Append(eol); } chartTextBox.Text = sb.ToString(); chartTextBox.SelectionStart = sb.Length; chartTextBox.SelectionLength = 0; } private void DrawEntry(Mode mode, int val, StringBuilder sb) { // Format is: Dec Hex Chr int modVal = (mode == Mode.High) ? val | 0x80 : val; sb.AppendFormat("{0,3:D} {1,3:X2} ", modVal, modVal); if (val < 0x20) { sb.Append('^'); sb.Append((char)(val + 0x40)); sb.Append(' '); } else if (val == 0x20) { sb.Append("' '"); } else if (val < 0x7f) { sb.Append(' '); sb.Append((char)val); sb.Append(' '); } else { sb.Append("DEL"); } } } }