OSDN Git Service

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