OSDN Git Service

Initial contents of nt2chview
[nt2chview/stable.git] / NT2chCtrl45 / NTScriptDebugger.xaml.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Threading;\r
5 using System.Windows;\r
6 using System.Windows.Controls;\r
7 using System.Windows.Data;\r
8 using System.Windows.Documents;\r
9 using System.Windows.Input;\r
10 using System.Windows.Media;\r
11 using System.Windows.Media.Imaging;\r
12 using System.Windows.Shapes;\r
13 using System.Windows.Threading;\r
14 \r
15 namespace NT2chCtrl\r
16 {\r
17     /// <summary>\r
18     /// NTScriptDebugger.xaml の相互作用ロジック\r
19     /// </summary>\r
20     public partial class NTScriptDebugger : Window\r
21     {\r
22         public int ErrorLine { set; get; }\r
23         public int ErrorSrcIndex { set; get; }\r
24         public string ErrorMessage { set; get; }\r
25         public string HtmlSource { get; set; }\r
26         public html.js.JsFunctionContext FuncContext { get; set; }\r
27         public NTScriptDebugger()\r
28         {\r
29             InitializeComponent();\r
30         }\r
31 \r
32         static bool mDontShowWindow = false;\r
33         static List<NTScriptDebugger> mWindows = new List<NTScriptDebugger>();\r
34         public static void ShowWindow(NTScriptDebugger wnd)\r
35         {\r
36             if (mDontShowWindow)\r
37                 return;\r
38             if (mWindows.Count == 0)\r
39             {\r
40                 wnd.Show();\r
41             }\r
42             mWindows.Add(wnd);\r
43         }\r
44 \r
45 \r
46         public void initParam()\r
47         {\r
48             //mLblHeader.Content = ErrorMessage;\r
49             //mOutputBox.AppendText(HtmlSource);\r
50             mFocusSpan = null;\r
51             string source = HtmlSource;\r
52             int length = source.Length;\r
53             int currLine = 1;\r
54             int textStart = 0;\r
55             int i = 0;\r
56             int column = -1;\r
57             for (; i < length; i++)\r
58             {\r
59                 char c = source[i];\r
60                 if (c == '\n')\r
61                 {\r
62                     string line = source.Substring(textStart, i - textStart);\r
63                     if (currLine == ErrorLine)\r
64                     {\r
65                         addLine(currLine, line, true);\r
66                         if (ErrorSrcIndex < i && textStart <= ErrorSrcIndex)\r
67                         {\r
68                             column = ErrorSrcIndex - textStart;\r
69                         }\r
70                     }\r
71                     else\r
72                     {\r
73                         addLine(currLine, line, false);\r
74                     }\r
75                     currLine++;\r
76                     textStart = i + 1;\r
77                     continue;\r
78                 }\r
79             }\r
80             if (mFocusSpan != null)\r
81             {\r
82                 Timer timer = new Timer(TimerCallback, null,1000, Timeout.Infinite);\r
83 \r
84                 //mFocusSpan.Focus();\r
85             }\r
86             string error = "(行 " + ErrorLine + " - 列 " + (column > -1 ? column.ToString() : string.Empty);\r
87             error += ")"+ ErrorMessage;\r
88 \r
89 \r
90             mLblHeader.Content = error;\r
91 \r
92             if (FuncContext != null)\r
93             {\r
94                 mBtnShowWatchWindow.IsEnabled = true;\r
95             }\r
96         }\r
97 \r
98         Span mFocusSpan = null;\r
99         private void addLine(int lineNo, string line, bool empasis)\r
100         {\r
101             Span span = new Span();\r
102             Run run = new Run(lineNo.ToString() + ": ");\r
103             span.Inlines.Add(run);\r
104             run = new Run(line);\r
105             span.Inlines.Add(run);\r
106             if (empasis)\r
107             {\r
108                 span.Background = new SolidColorBrush(Colors.DeepPink);\r
109                 span.Foreground = new SolidColorBrush(Colors.Silver);\r
110                 mFocusSpan = span;\r
111             }\r
112             mParaBody.LineStackingStrategy = LineStackingStrategy.MaxHeight;\r
113             mParaBody.Inlines.Add(span);\r
114             mParaBody.Inlines.Add(new LineBreak());\r
115         }\r
116 \r
117         private void TimerCallback(object param)\r
118         {\r
119             this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,\r
120                 (ThreadStart)delegate()\r
121             {\r
122                 mFocusSpan.Focus();\r
123             });\r
124         }\r
125 \r
126         private void NTScriptDebugger_Closed(object sender, EventArgs e)\r
127         {\r
128             if (mDontShowWindow)\r
129             {\r
130                 mWindows.Clear();\r
131                 return;\r
132             }\r
133             if (mWindows.Count > 0)\r
134             {\r
135                 mWindows.RemoveAt(0);\r
136                 if (mWindows.Count > 0)\r
137                     mWindows[0].Show();\r
138             }\r
139         }\r
140 \r
141         private void mChkDontShowWindow_Checked(object sender, RoutedEventArgs e)\r
142         {\r
143             mDontShowWindow = true;\r
144         }\r
145 \r
146         private void mChkDontShowWindow_Unchecked(object sender, RoutedEventArgs e)\r
147         {\r
148 \r
149         }\r
150 \r
151         private void mBtnClose_Click(object sender, RoutedEventArgs e)\r
152         {\r
153             Close();\r
154         }\r
155         private void mBtnShowWatchWindow_Click(object sender, RoutedEventArgs e)\r
156         {\r
157             List < DebugMemory> list;\r
158             if (FuncContext.getMemoryList(out list))\r
159             {\r
160                 NTMemoryInspectionWindow win = new NTMemoryInspectionWindow();\r
161                 win.initParam(list);\r
162                 win.ShowWindow();\r
163             }\r
164         }        \r
165     }\r
166 }\r