OSDN Git Service

最小化時に落ちる不具合の修正,#regionの設定
[fugashi/fugashi.git] / Fugashi / MainForm.cs
1 /*\r
2  *      Fugashi Project\r
3  *\r
4  *      This software is distributed under a BSD-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 using System;\r
9 using System.Collections.Generic;\r
10 using System.ComponentModel;\r
11 using System.Data;\r
12 using System.Drawing;\r
13 using System.Text;\r
14 using System.Windows.Forms;\r
15 \r
16 namespace Fugashi\r
17 {\r
18     public partial class MainForm : Form\r
19     {\r
20         #region fields\r
21         private BitSwitch[] bits;\r
22         private int length = 4;\r
23         #endregion\r
24 \r
25         #region constructor\r
26         public MainForm()\r
27         {\r
28             InitializeComponent();\r
29 \r
30             bits = new BitSwitch[64];\r
31             foreach (Control c in table.Controls)\r
32             {\r
33                 if (c is BitSwitches4)\r
34                 {\r
35                     BitSwitches4 bs = c as BitSwitches4;\r
36                     int i = bs.StartBit;\r
37                     bits[i + 0] = bs.B0;\r
38                     bits[i + 1] = bs.B1;\r
39                     bits[i + 2] = bs.B2;\r
40                     bits[i + 3] = bs.B3;\r
41                 }\r
42             }\r
43             foreach (BitSwitch b in bits)\r
44             {\r
45                 b.StateChanged += BitChanged;\r
46             }\r
47             Font mono = new Font(FontFamily.GenericMonospace, textHex.Font.Size);\r
48             textHex.Font = mono;\r
49             textValue.Font = mono;\r
50 \r
51             PerformAutoScale();\r
52         }\r
53         #endregion\r
54 \r
55         #region event handlers\r
56 \r
57         private void MainForm_KeyDown(object sender, KeyEventArgs e)\r
58         {\r
59             if (e.Alt)\r
60             {\r
61                 switch (e.KeyCode)\r
62                 {\r
63                     case Keys.V:\r
64                         textValue.Focus();\r
65                         break;\r
66                     case Keys.H:\r
67                         textHex.Focus();\r
68                         break;\r
69                     default:\r
70                         return;\r
71                 }\r
72                 e.SuppressKeyPress = true;\r
73             }\r
74         }\r
75 \r
76         private void radioUint_CheckedChanged(object sender, EventArgs e)\r
77         {\r
78             if (radioUint.Checked)\r
79             {\r
80                 UpdateValue(GetBytes());\r
81             }\r
82         }\r
83 \r
84         private void radioInt_CheckedChanged(object sender, EventArgs e)\r
85         {\r
86             if (radioInt.Checked)\r
87             {\r
88                 UpdateValue(GetBytes());\r
89             }\r
90         }\r
91 \r
92         private void radioFloat_CheckedChanged(object sender, EventArgs e)\r
93         {\r
94             if (radioFloat.Checked)\r
95             {\r
96                 radio1B.Enabled = false;\r
97                 radio2B.Enabled = false;\r
98                 if (radio1B.Checked || radio2B.Checked)\r
99                 {\r
100                     radio4B.Checked = true;\r
101                 }\r
102                 SetForFloatingPoint(radio8B.Checked);\r
103                 UpdateValue(GetBytes());\r
104             }\r
105             else\r
106             {\r
107                 SetForInteger();\r
108                 radio1B.Enabled = true;\r
109                 radio2B.Enabled = true;\r
110             }\r
111         }\r
112 \r
113         private void MainForm_Load(object sender, EventArgs e)\r
114         {\r
115             radioUint.Checked = true;\r
116             radio4B.Checked = true;\r
117             BitChanged(null, null);\r
118         }\r
119 \r
120         private void radio8B_CheckedChanged(object sender, EventArgs e)\r
121         {\r
122             if (radio8B.Checked)\r
123             {\r
124                 SetLength(8);\r
125                 if (radioFloat.Checked)\r
126                 {\r
127                     SetForFloatingPoint(true);\r
128                     UpdateValue(GetBytes());\r
129                 }\r
130             }\r
131         }\r
132 \r
133         private void radio4B_CheckedChanged(object sender, EventArgs e)\r
134         {\r
135             if (radio4B.Checked)\r
136             {\r
137                 SetLength(4);\r
138                 if (radioFloat.Checked)\r
139                 {\r
140                     SetForFloatingPoint(false);\r
141                     UpdateValue(GetBytes());\r
142                 }\r
143             }\r
144         }\r
145 \r
146         private void radio2B_CheckedChanged(object sender, EventArgs e)\r
147         {\r
148             if (radio2B.Checked)\r
149             {\r
150                 SetLength(2);\r
151             }\r
152         }\r
153 \r
154         private void radio1B_CheckedChanged(object sender, EventArgs e)\r
155         {\r
156             if (radio1B.Checked)\r
157             {\r
158                 SetLength(1);\r
159                 UpdateValue(GetBytes());\r
160             }\r
161         }\r
162 \r
163         \r
164         private void buttonInc_Click(object sender, EventArgs e)\r
165         {\r
166             if (radioFloat.Checked)\r
167             {\r
168                 if (length == 4)\r
169                 {\r
170                     int value = BitConverter.ToInt32(GetBytes(), 0);\r
171                     if (value == -0x80000000)\r
172                     {\r
173                         value = 0;\r
174                     }\r
175                     else\r
176                     {\r
177                         value += value >= 0 ? 1 : -1;\r
178                     }\r
179                     UpdateAll(BitConverter.GetBytes(value));\r
180                 }\r
181                 else\r
182                 {\r
183                     long value = BitConverter.ToInt64(GetBytes(), 0);\r
184                     if (value == (1L << 63))\r
185                     {\r
186                         value = 0;\r
187                     }\r
188                     else\r
189                     {\r
190                         value += value >= 0 ? 1 : -1;\r
191                     }\r
192                     UpdateAll(BitConverter.GetBytes(value));\r
193                 }\r
194             }\r
195             else\r
196             {\r
197                 ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
198                 UpdateAll(BitConverter.GetBytes(++value));\r
199             }\r
200         }\r
201 \r
202         private void buttonDec_Click(object sender, EventArgs e)\r
203         {\r
204             if (radioFloat.Checked)\r
205             {\r
206                 if (length == 4)\r
207                 {\r
208                     int value = BitConverter.ToInt32(GetBytes(), 0);\r
209                     if (value == 0)\r
210                     {\r
211                         value = 1 << 31;\r
212                     }\r
213                     else\r
214                     {\r
215                         value -= value >= 0 ? 1 : -1;\r
216                     }\r
217                     UpdateAll(BitConverter.GetBytes(value));\r
218                 }\r
219                 else\r
220                 {\r
221                     long value = BitConverter.ToInt64(GetBytes(), 0);\r
222                     if (value == 0)\r
223                     {\r
224                         value = 1L << 63;\r
225                     }\r
226                     else\r
227                     {\r
228                         value -= value >= 0 ? 1 : -1;\r
229                     }\r
230                     UpdateAll(BitConverter.GetBytes(value));\r
231                 }\r
232             }\r
233             else\r
234             {\r
235                 ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
236                 UpdateAll(BitConverter.GetBytes(--value));\r
237             }\r
238         }\r
239 \r
240         private void buttonClr_Click(object sender, EventArgs e)\r
241         {\r
242             UpdateAll(BitConverter.GetBytes((ulong)0));\r
243         }\r
244 \r
245         private void buttonNot_Click(object sender, EventArgs e)\r
246         {\r
247             ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
248             UpdateAll(BitConverter.GetBytes(~value));\r
249         }\r
250 \r
251         private void buttonLsh_Click(object sender, EventArgs e)\r
252         {\r
253             ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
254             UpdateAll(BitConverter.GetBytes(value << 1));\r
255         }\r
256 \r
257         private void buttonRsh_Click(object sender, EventArgs e)\r
258         {\r
259             if (radioInt.Checked)\r
260             {\r
261                 long value = ToInt64(GetBytes());\r
262                 UpdateAll(BitConverter.GetBytes(value >> 1));\r
263             }\r
264             else\r
265             {\r
266                 ulong value = BitConverter.ToUInt64(GetBytes(), 0);\r
267                 UpdateAll(BitConverter.GetBytes(value >> 1));\r
268             }\r
269         }\r
270 \r
271         private void textHex_TextChanged(object sender, EventArgs e)\r
272         {\r
273             if (!textHex.Focused)\r
274             {\r
275                 return;\r
276             }\r
277             ulong value;\r
278             UInt64.TryParse(textHex.Text,\r
279                 System.Globalization.NumberStyles.HexNumber, null, out value);\r
280             byte[] b = BitConverter.GetBytes(value);\r
281             UpdateBits(b);\r
282             UpdateValue(b);\r
283         }\r
284 \r
285         private void textValue_TextChanged(object sender, EventArgs e)\r
286         {\r
287             string text = textValue.Text;\r
288             if (!textValue.Focused && sender != null)\r
289             {\r
290                 return;\r
291             }\r
292             byte[] b;\r
293             if (radioUint.Checked)\r
294             {\r
295                 ulong value;\r
296                 UInt64.TryParse(text, out value);\r
297                 b = BitConverter.GetBytes(value);\r
298             }\r
299             else if (radioInt.Checked)\r
300             {\r
301                 long value;\r
302                 Int64.TryParse(text, out value);\r
303                 b = BitConverter.GetBytes(value);\r
304             }\r
305             else if (radioFloat.Checked && length == 4)\r
306             {\r
307                 float value;\r
308                 Single.TryParse(text, out value);\r
309                 b = BitConverter.GetBytes(value);\r
310             }\r
311             else if (radioFloat.Checked && length == 8)\r
312             {\r
313                 double value;\r
314                 Double.TryParse(text, out value);\r
315                 b = BitConverter.GetBytes(value);\r
316             }\r
317             else\r
318             {\r
319                 throw new Exception();\r
320             }\r
321             UpdateBits(b);\r
322             UpdateHex(b);\r
323         }\r
324 \r
325         private void textValue_Leave(object sender, EventArgs e)\r
326         {\r
327             UpdateValue(GetBytes());\r
328         }\r
329 \r
330         private void textHex_Leave(object sender, EventArgs e)\r
331         {\r
332             UpdateHex(GetBytes());\r
333         }\r
334 \r
335         private void BitChanged(object sender, EventArgs e)\r
336         {\r
337             byte[] b = GetBytes();\r
338             UpdateValue(b);\r
339             UpdateHex(b);\r
340         }\r
341 \r
342         #endregion\r
343 \r
344         #region private methods\r
345 \r
346         private void SetForFloatingPoint(bool isDouble)\r
347         {\r
348             for (int i = 23; i < 31; ++i)\r
349             {\r
350                 bits[i].IsExponential = !isDouble;\r
351             }\r
352             for (int i = 52; i < 63; ++i)\r
353             {\r
354                 bits[i].IsExponential = isDouble;\r
355             }\r
356             textValue.ValidatingType = typeof(Double);\r
357         }\r
358 \r
359         private void SetForInteger()\r
360         {\r
361             for (int i = 0; i < 64; ++i)\r
362             {\r
363                 bits[i].IsExponential = false;\r
364             }\r
365             textValue.ValidatingType = typeof(long);\r
366         }\r
367 \r
368         private byte[] GetBytes()\r
369         {\r
370             byte[] b = new Byte[8];\r
371             int i = 0;\r
372             for (int j = 0; j < 8; ++j)\r
373             {\r
374                 b[j] = 0;\r
375                 i += 8;\r
376                 for (int k = 0; k < 8; ++k)\r
377                 {\r
378                     b[j] = (byte)(b[j] << 1 | (bits[--i].State ? 1 : 0));\r
379                 }\r
380                 i += 8;\r
381             }\r
382             return b;\r
383         }\r
384 \r
385         private long ToInt64(byte[] bytes)\r
386         {\r
387             switch (length)\r
388             {\r
389                 case 1:\r
390                     return (sbyte)bytes[0];\r
391                 case 2:\r
392                     return BitConverter.ToInt16(bytes, 0);\r
393                 case 4:\r
394                     return BitConverter.ToInt32(bytes, 0);\r
395                 case 8:\r
396                     return BitConverter.ToInt64(bytes, 0);\r
397             }\r
398             return 0;\r
399         }\r
400 \r
401         private ulong ToUInt64(byte[] bytes)\r
402         {\r
403             switch (length)\r
404             {\r
405                 case 1:\r
406                     return bytes[0];\r
407                 case 2:\r
408                     return BitConverter.ToUInt16(bytes, 0);\r
409                 case 4:\r
410                     return BitConverter.ToUInt32(bytes, 0);\r
411                 case 8:\r
412                     return BitConverter.ToUInt64(bytes, 0);\r
413             }\r
414             return 0;\r
415         }\r
416 \r
417         private void SetLength(int length)\r
418         {\r
419             this.length = length;\r
420             int b = length * 8;\r
421             for (int i = 8; i < b; ++i)\r
422             {\r
423                 bits[i].Enabled = true;\r
424             }\r
425             for (int i = b; i < 64; ++i)\r
426             {\r
427                 bits[i].Enabled = false;\r
428             }\r
429             if (radioFloat.Checked)\r
430             {\r
431                 textValue_TextChanged(null, null);\r
432             }\r
433             else\r
434             {\r
435                 BitChanged(null, null);\r
436             }\r
437         }\r
438 \r
439         private void UpdateValue(byte[] bytes)\r
440         {\r
441             if (radioUint.Checked)\r
442             {\r
443                 textValue.Text = ToUInt64(bytes).ToString();\r
444             }\r
445             else if (radioInt.Checked)\r
446             {\r
447                 textValue.Text = ToInt64(bytes).ToString();\r
448             }\r
449             else if (radioFloat.Checked)\r
450             {\r
451                 if (length == 4)\r
452                 {\r
453                     float value = BitConverter.ToSingle(bytes, 0);\r
454                     textValue.Text = value.ToString("g8");\r
455                 }\r
456                 else\r
457                 {\r
458                     double value = BitConverter.ToDouble(bytes, 0);\r
459                     textValue.Text = value.ToString("g17");\r
460                 }\r
461             }\r
462         }\r
463 \r
464         private void UpdateHex(byte[] bytes)\r
465         {\r
466             textHex.Text = "";\r
467             for (int i = length - 1; i >= 0; --i)\r
468             {\r
469                 textHex.Text += bytes[i].ToString("X2");\r
470             }\r
471         }\r
472 \r
473         private void UpdateBits(byte[] bytes)\r
474         {\r
475             int i = 0;\r
476             for (int j = 0; j < length; ++j)\r
477             {\r
478                 int mask = 1;\r
479                 for (int k = 0; k < 8; ++k)\r
480                 {\r
481                     bits[i++].SetStateWithoutEvent((bytes[j] & mask) != 0);\r
482                     mask <<= 1;\r
483                 }\r
484             }\r
485         }\r
486 \r
487         private void UpdateAll(byte[] bytes)\r
488         {\r
489             UpdateBits(bytes);\r
490             UpdateValue(bytes);\r
491             UpdateHex(bytes);\r
492         }\r
493 \r
494         #endregion\r
495     }\r
496 }\r