PageRenderTime 28ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/SimpleBrainFuck/MainForm.cs

http://ironbrainfuck.codeplex.com
C# | 292 lines | 253 code | 39 blank | 0 comment | 24 complexity | 9af2085eec70c701323d51a64d741e60 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Runtime.InteropServices;
  9. using System.Text;
  10. using System.Windows.Forms;
  11. using ICSharpCode.TextEditor;
  12. using ICSharpCode.TextEditor.Document;
  13. using ZackFlame.SimpleBrainFuck.Core;
  14. using ZackFlame.SimpleBrainFuck.TextResources;
  15. namespace ZackFlame.SimpleBrainFuck
  16. {
  17. public partial class MainForm : Form
  18. {
  19. readonly string Title;
  20. SimpleCoder simpleCoder = new SimpleCoder();
  21. TextAreaUpdate lastError = null;
  22. bool isSavedCode = false;
  23. bool isSavedBrainFuck = false;
  24. string codeFileName;
  25. string brainFuckFileName;
  26. public MainForm()
  27. {
  28. InitializeComponent();
  29. Title = this.Text;
  30. UpdateWindowTitle();
  31. MainForm_Resize(null, EventArgs.Empty);
  32. }
  33. private void MainForm_Shown(object sender, EventArgs e)
  34. {
  35. buttonTranslate.Focus();
  36. }
  37. private void MainForm_Resize(object sender, EventArgs e)
  38. {
  39. if (!this.ClientSize.IsEmpty)
  40. {
  41. mainSplit.SplitterDistance = (this.ClientSize.Width + leftCenterSplit.Panel2.Width) / 2;
  42. actionPanel.Top = (this.ClientSize.Height - actionPanel.Height) / 2;
  43. Padding margin = brainFuckToolStripMenuItem.Margin;
  44. margin.Left = mainSplit.SplitterDistance - codeToolStripMenuItem.Width;
  45. brainFuckToolStripMenuItem.Margin = margin;
  46. }
  47. }
  48. private void buttonHelp_Click(object sender, EventArgs e)
  49. {
  50. MessageBox.Show(string.Format(
  51. "$zero - обнуление текущей ячейки" +
  52. "{0}" +
  53. "{0}$shift k - cдвиг на k ячеек вправо или на -k ячеек влево" +
  54. "{0}" +
  55. "{0}$add k - прибавление значения ячейки n (текущей) к значению ячейки n+k" +
  56. "{0}" +
  57. "{0}$sub k - вычитает значение ячейки n (текущей) из значения ячейки n+k" +
  58. "{0}" +
  59. "{0}$move k - копирование значения ячейки n (текущей) в ячейку n+k" +
  60. "{0}с потерей (обнулением) значения ячейки n" +
  61. "{0}" +
  62. "{0}$copy k t - копирование значения ячейки n (текущей) в ячейку n+k" +
  63. "{0}c использованием промежуточной ячейки n+k+t, благодаря чему" +
  64. "{0}значение ячейки n не теряется (сохраняется)" +
  65. "{0}" +
  66. "{0}if t" +
  67. "{0} <операторы>" +
  68. "{0}else" +
  69. "{0} <операторы>" +
  70. "{0}end" +
  71. "{0} - оператор выбора на основе текущей ячейки n (если > 0, то истина)," +
  72. "{0}где n+t - служебная ячейка" +
  73. "{0}" +
  74. "{0}$repeat text k - повторяет заданную строку text k раз" +
  75. "{0}" +
  76. "{0}$value k t - компактный ввод константы k (не больше 256) с" +
  77. "{0}использованием промежуточной ячейки n+t, где n - текущая ячейка" +
  78. "{0}" +
  79. "{0}$text text - ввод строки символов text длиной len, начиная с текущей" +
  80. "{0}ячейки n, с использованием промежуточной ячейки n+len" +
  81. "{0}" +
  82. "{0}$type text t - печать строки символов text с использованием промежуточной" +
  83. "{0}ячейки n+t, где n - текущая ячейка" +
  84. "{0}" +
  85. "{0}$print k - печать строки символов длиной k (при k < 0 - печать в" +
  86. "{0}обратном порядке)", Environment.NewLine));
  87. }
  88. private void buttonTranslate_Click(object sender, EventArgs e)
  89. {
  90. if (lastError != null)
  91. {
  92. textEditorCode.Document.MarkerStrategy.RemoveAll(m => true);
  93. textEditorCode.Document.RequestUpdate(
  94. new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
  95. textEditorCode.Document.CommitUpdate();
  96. lastError = null;
  97. }
  98. try
  99. {
  100. string code = simpleCoder.Translate(textEditorCode.Document.TextContent);
  101. if (checkBoxOptimize.Checked || radioButtonUnlimited.Checked)
  102. code = code.Replace(Environment.NewLine, string.Empty);
  103. if (checkBoxOptimize.Checked)
  104. code = simpleCoder.Optimize(code);
  105. if (radioButtonFixed.Checked)
  106. code = simpleCoder.SetLineLength(code, (int)numericUpDownLineLength.Value);
  107. textEditorBrainFuck.Document.TextContent = code;
  108. textEditorBrainFuck.Document.RequestUpdate(
  109. new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
  110. textEditorBrainFuck.Document.CommitUpdate();
  111. }
  112. catch (CodeErrorException ex)
  113. {
  114. LineSegment line = textEditorCode.Document.GetLineSegment(ex.Line);
  115. textEditorCode.Document.MarkerStrategy.AddMarker(
  116. new TextMarker(line.Offset, line.Length, TextMarkerType.WaveLine));
  117. lastError = new TextAreaUpdate(TextAreaUpdateType.SingleLine, ex.Line);
  118. textEditorCode.Document.RequestUpdate(lastError);
  119. textEditorCode.Document.CommitUpdate();
  120. MessageBox.Show(string.Format("Line {0}: {1}", ex.Line + 1, ex.Message));
  121. }
  122. }
  123. private void buttonCopy_Click(object sender, EventArgs e)
  124. {
  125. try
  126. {
  127. if (textEditorBrainFuck.Document.TextLength > 0)
  128. {
  129. DataObject clipboardData = new DataObject(
  130. textEditorBrainFuck.Document.TextContent);
  131. Clipboard.SetDataObject(clipboardData, true, 5, 10);
  132. }
  133. }
  134. catch (ExternalException)
  135. {
  136. }
  137. }
  138. private void checkBoxOptimize_CheckedChanged(object sender, EventArgs e)
  139. {
  140. if (checkBoxOptimize.Checked)
  141. {
  142. if (radioButtonNoChange.Checked)
  143. radioButtonFixed.Checked = true;
  144. radioButtonNoChange.Enabled = false;
  145. }
  146. else
  147. {
  148. radioButtonNoChange.Enabled = true;
  149. }
  150. }
  151. #region Menu Strips
  152. private void createCode_Click(object sender, EventArgs e)
  153. {
  154. CreateCode();
  155. }
  156. private void openCode_Click(object sender, EventArgs e)
  157. {
  158. if (openCodeDialog.ShowDialog() == DialogResult.OK)
  159. {
  160. OpenCode(openCodeDialog.FileName);
  161. }
  162. }
  163. private void saveCode_Click(object sender, EventArgs e)
  164. {
  165. if (isSavedCode)
  166. {
  167. SaveCode(codeFileName);
  168. }
  169. else if (saveCodeDialog.ShowDialog() == DialogResult.OK)
  170. {
  171. SaveCode(saveCodeDialog.FileName);
  172. }
  173. }
  174. private void saveCodeAs_Click(object sender, EventArgs e)
  175. {
  176. if (saveCodeDialog.ShowDialog() == DialogResult.OK)
  177. {
  178. SaveCode(saveCodeDialog.FileName);
  179. }
  180. }
  181. private void exit_Click(object sender, EventArgs e)
  182. {
  183. this.Close();
  184. }
  185. private void saveBF_Click(object sender, EventArgs e)
  186. {
  187. if (isSavedBrainFuck)
  188. {
  189. SaveBrainFuck(brainFuckFileName);
  190. }
  191. else if (saveBrainFuckDialog.ShowDialog() == DialogResult.OK)
  192. {
  193. SaveBrainFuck(saveBrainFuckDialog.FileName);
  194. }
  195. }
  196. private void saveBFAs_Click(object sender, EventArgs e)
  197. {
  198. if (saveBrainFuckDialog.ShowDialog() == DialogResult.OK)
  199. {
  200. SaveBrainFuck(saveBrainFuckDialog.FileName);
  201. }
  202. }
  203. private void run_Click(object sender, EventArgs e)
  204. {
  205. brainFuckInteractiveConsole1.RunCode(textEditorBrainFuck.Document.TextContent);
  206. }
  207. private void reset_Click(object sender, EventArgs e)
  208. {
  209. brainFuckInteractiveConsole1.Reset();
  210. }
  211. #endregion
  212. private void UpdateWindowTitle()
  213. {
  214. this.Text = Title + " - " +
  215. (isSavedCode ? Path.GetFileName(codeFileName) : MainFormText.File_UntitledFile) +
  216. (isSavedBrainFuck ? " - " + Path.GetFileName(brainFuckFileName) : string.Empty);
  217. }
  218. public void CreateCode()
  219. {
  220. textEditorCode.Document.TextContent = string.Empty;
  221. textEditorCode.Document.RequestUpdate(
  222. new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
  223. textEditorCode.Document.CommitUpdate();
  224. isSavedCode = false;
  225. isSavedBrainFuck = false;
  226. UpdateWindowTitle();
  227. }
  228. public void OpenCode(string fileName)
  229. {
  230. textEditorCode.Document.TextContent = File.ReadAllText(fileName);
  231. textEditorCode.Document.RequestUpdate(
  232. new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
  233. textEditorCode.Document.CommitUpdate();
  234. isSavedCode = true;
  235. codeFileName = fileName;
  236. UpdateWindowTitle();
  237. }
  238. public void SaveCode(string fileName)
  239. {
  240. File.WriteAllText(fileName, textEditorCode.Document.TextContent);
  241. isSavedCode = true;
  242. codeFileName = fileName;
  243. UpdateWindowTitle();
  244. }
  245. public void SaveBrainFuck(string fileName)
  246. {
  247. File.WriteAllText(fileName, textEditorBrainFuck.Document.TextContent);
  248. isSavedBrainFuck = true;
  249. brainFuckFileName = fileName;
  250. UpdateWindowTitle();
  251. }
  252. }
  253. }