OSDN Git Service

be8b66c49865d206da9711893dac9ea0b1e43be6
[nt2chview/stable.git] / NT2chCtrl45 / NTResViewPanel.xaml.cs
1 using NT2chObject;\r
2 using System;\r
3 using System.Collections.Generic;\r
4 using System.Text;\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.Navigation;\r
13 using System.Windows.Shapes;\r
14 using System.IO;\r
15 using NT2chCtrl.html;\r
16 \r
17 namespace NT2chCtrl\r
18 {\r
19 \r
20     /// <summary>\r
21     /// NTResViewPanel.xaml の相互作用ロジック\r
22     /// \r
23     /// 2ぃとちゃん for Windowsのレス画面に表示される\r
24     /// コントロールを定義します。IResViewインターフェースのメソッドは\r
25     /// フレームワークから呼び出すので、削除しないで下さい。\r
26     /// また、このコントロールの名前も変更できません。\r
27     /// NTResViewPanel_util.csはアプリケーションフレームワークとの\r
28     /// インターフェースとなるヘルパーメソッドを定義してありますので\r
29     /// 編集しないで下さい。\r
30     /// フレームワークから渡される2chデータのオブジェクトについては\r
31     /// NTInterfaceDecl.csの定義を参照して下さい。\r
32     /// 基本的にNTが先頭に着くファイル名は本ファイルを除いて編集できません。\r
33     /// 本ファイルについては、IResViewインターフェースのメソッドが実装されている限り\r
34     /// 自由に由に変更できます。\r
35     /// \r
36     /// </summary>\r
37     public partial class NTResViewPanel : UserControl,\r
38         IResView , IResViewJump, IResViewSearch\r
39     {\r
40         IThread mCurrentThread = null;\r
41         //ResViewUI mResUI = null;\r
42         ThreadHistoryUI mThreadHistoryUI = null;\r
43         int mSavedPrevReadCount = 0;\r
44         ResListAdapter mResListAdapter = null;\r
45 \r
46         public NTResViewPanel()\r
47         {\r
48             InitializeComponent();\r
49         }\r
50 \r
51         private void ResViewPanel_Loaded(object sender, RoutedEventArgs e)\r
52         {\r
53             mThreadHistoryPanel.Children.Clear();\r
54             mFontSetupToolbar.Visibility = System.Windows.Visibility.Collapsed;\r
55             mAutoScrollToolbar.Visibility = System.Windows.Visibility.Collapsed;\r
56             mBtnResumeAutoPlay.Visibility = System.Windows.Visibility.Collapsed;\r
57 \r
58 #if DOTNET45\r
59             TouchSupportScrollViewer sv =\r
60                 new TouchSupportScrollViewer(mThreadMenuScrollViewer,\r
61                     mThreadHistoryPanel);\r
62 #endif\r
63         }\r
64 \r
65         /*\r
66          * 現在アクティブなスレッドを確認する為にフレームワークから\r
67          * 呼び出されます。\r
68          */\r
69         public IThread getCurrentThread()\r
70         {\r
71             return mCurrentThread;\r
72         }\r
73 \r
74 \r
75         /*\r
76          * アプリケーションフレームワークから、新しいスレッドを表示する要求が\r
77          * 有った時に呼ばれます。\r
78          */\r
79         public bool OpenThread(IThread ithread)\r
80         {\r
81             mCurrentThread = ithread;\r
82             if (ithread == null)\r
83                 return false;\r
84 \r
85             setTitle(ithread);\r
86 \r
87             if (mThreadHistoryUI != null)\r
88             {\r
89                 mThreadHistoryUI.AddButton(ithread);\r
90                 mThreadMenuScrollViewer.ScrollToTop();\r
91             }\r
92 \r
93             mResListAdapter = new ResListAdapter(this, ithread, mCommand, mUtil);\r
94 \r
95             mSavedPrevReadCount = ithread.getPrevReadCount();\r
96             if (mSavedPrevReadCount < 0)\r
97             {\r
98                 mSavedPrevReadCount = 0;\r
99             }\r
100 \r
101             mResListPanel.setAdapter(mResListAdapter, mSavedPrevReadCount);\r
102 \r
103             continueAutoScroll();\r
104 \r
105             return true;// mResUI.OpenThread(ithread, mFlowDocResView);     \r
106         }\r
107 \r
108         private const string RES_LAYOUT_HTML_FILE = @"\res_layout.html";\r
109 \r
110 \r
111         public void initResLayout(bool debug)\r
112         {\r
113             if (mCommand == null)\r
114                 return;\r
115 \r
116             string path = mCommand.GetDataPath() + RES_LAYOUT_HTML_FILE;\r
117 \r
118             string htmlSource = loadHtml(path);\r
119             //if (htmlSource == null)\r
120             //    return;\r
121             html.HtmlParser parser;\r
122             if (!ResViewCtrlState.getInstance().init(htmlSource, mCommand, out parser)\r
123                 && debug && (parser != null && parser.hasError()))\r
124             {\r
125                 \r
126                 NTScriptDebugger debugger = new NTScriptDebugger();\r
127                 debugger.ErrorMessage = parser.getErrorMessage();\r
128                 debugger.ErrorLine = parser.getErrorLine();\r
129                 debugger.ErrorSrcIndex = parser.getErrorSrcIndex();\r
130                 debugger.HtmlSource = htmlSource;\r
131 \r
132                 debugger.initParam();\r
133                 NTScriptDebugger.ShowWindow(debugger);\r
134             }\r
135 \r
136         }\r
137 \r
138         //コントロール初期化時に、これまでに閲覧したスレッドの履歴リストが渡されます。\r
139         public bool SetThreadReadHistory(List<IThreadDescription> threadDescriptionList)\r
140         {\r
141             mThreadHistoryUI = new ThreadHistoryUI(mCommand,mUtil, threadDescriptionList,\r
142                 mThreadHistoryPanel);\r
143 \r
144             /*object o; \r
145             if(getDict().TryGetValue(PREF_PARAM.RES_VIEW_ZOOM_VALUE, out o))\r
146             {\r
147                 string s = o as string;\r
148                 if (s != null)\r
149                 {\r
150                     double zoom;\r
151                     if (double.TryParse(s, out zoom))\r
152                     {\r
153                         //mFlowDocResView.Zoom = zoom;\r
154                     }\r
155                 }\r
156             }*/\r
157             return true;\r
158         }\r
159 \r
160         public void OnNotifyThreadUpdated(IBoard iboard)\r
161         {\r
162             if (mThreadHistoryUI == null)\r
163                 return;\r
164             mThreadHistoryUI.UpdateButton(iboard);\r
165 \r
166         }\r
167 \r
168         //このコントロールで管理しているスレッド閲覧リストを取得する為に呼ばれます。\r
169         public List<IThreadDescription> QueryThreadReadHistory()\r
170         {\r
171             if (mThreadHistoryUI == null)\r
172                 return null;\r
173             return mThreadHistoryUI.getCurrentList();\r
174         }\r
175         //オブジェクトがアンロードされる前に呼ばれます。\r
176         //ここで、オブジェクトの永続データーを保存して下さい。\r
177         public void SaveCurrentState()\r
178         {\r
179             //double zoom = mFlowDocResView.Zoom;\r
180             //getDict().Remove(PREF_PARAM.RES_VIEW_ZOOM_VALUE);\r
181             //getDict().Add(PREF_PARAM.RES_VIEW_ZOOM_VALUE, zoom.ToString());\r
182         }\r
183 \r
184 \r
185         public void ToggleFontSetupTool()\r
186         {\r
187             if(mFontSetupToolbar.Visibility != System.Windows.Visibility.Collapsed)\r
188                 mFontSetupToolbar.Visibility = System.Windows.Visibility.Collapsed;\r
189             else\r
190                 mFontSetupToolbar.Visibility = System.Windows.Visibility.Visible;\r
191         }\r
192 \r
193         public void ToggleAutoScroll()\r
194         {\r
195             if (mAutoScrollToolbar.Visibility != System.Windows.Visibility.Collapsed)\r
196             {\r
197                 mAutoScrollToolbar.Visibility = System.Windows.Visibility.Collapsed;\r
198                 mResListPanel.setAutoScroll(false, 0);\r
199             }\r
200             else\r
201             {\r
202                 mAutoScrollToolbar.Visibility = System.Windows.Visibility.Visible;\r
203                 mResListPanel.setAutoScroll(true, mAutoScrollSliderValue);\r
204             }\r
205         }\r
206 \r
207         public void UpdateTextSelMode(bool selMode)\r
208         {\r
209             if (null == mResListAdapter)\r
210                 return;\r
211             mResListAdapter.updateTextSelMode(selMode);\r
212         }\r
213 \r
214         void continueAutoScroll()\r
215         {\r
216             if (mAutoScrollToolbar.Visibility == System.Windows.Visibility.Visible)\r
217             {\r
218                 mAutoScrollToolbar.Visibility = System.Windows.Visibility.Visible;\r
219                 mResListPanel.setAutoScroll(true, mAutoScrollSliderValue);\r
220             }\r
221         }\r
222 \r
223         /*\r
224            *  スレッドの先頭にスクロースする要求が有った時に呼ばれます。\r
225            */\r
226         public void JumpToTop()\r
227         {\r
228             mResListPanel.setScrollItemPosition(0);\r
229         }\r
230         /*\r
231          *  スレッドの最後にスクロースする要求が有った時に呼ばれます。\r
232          */\r
233         public void JumpToBottom()\r
234         {\r
235             List<IRes> resList = mCurrentThread.getResList();\r
236             int num = resList.Count;\r
237             num--;\r
238             if (num < 0)\r
239                 num = 0;\r
240             mResListPanel.setScrollItemPosition(num);\r
241         }\r
242         /*\r
243          *  スレッドの新着にスクロースする要求が有った時に呼ばれます。\r
244          */\r
245         public void JumpToNew()\r
246         {\r
247             mResListPanel.setScrollItemPosition(mSavedPrevReadCount);\r
248         }\r
249         public void JumpTo(int position)\r
250         {\r
251             mResListPanel.setScrollItemPosition(position);\r
252         }\r
253         public void InvalidateItems()\r
254         {\r
255             mResListPanel.InvalidateItems();\r
256         }\r
257         /*\r
258          *  スレッドの新着にスクロースする要求が有った時に呼ばれます。\r
259          */\r
260         public void JumpToNextBookmark()\r
261         {\r
262             int current = mResListPanel.getCurrentPosition();\r
263             if (current < 0)\r
264                 current = 0;\r
265             int scrollTo = mResListAdapter.NextBookmark(current);\r
266             if (scrollTo < 0)\r
267                 return;\r
268 \r
269             mResListPanel.setScrollItemPosition(scrollTo);\r
270         }\r
271 \r
272         //指定された検索文字列を選択状態にして下さい。\r
273         public void SetSearchWord(string searchWord)\r
274         {\r
275             int current = mResListPanel.getCurrentPosition();\r
276             if (current < 0)\r
277                 current = 0;\r
278             mResListAdapter.SetSearchWord(searchWord, current);\r
279         }\r
280         //指定された検索文字列の後方にマッチする文字列を選択して下さい。\r
281         public void SearchNext()\r
282         {\r
283             int cursor = mResListAdapter.SearchNext();\r
284             if (cursor < 0)\r
285                 return;\r
286 \r
287             mResListPanel.setScrollItemPosition(cursor);\r
288         }\r
289         //指定された検索文字列の前方にマッチする文字列を選択して下さい。\r
290         public void SearchPrev()\r
291         {\r
292             int cursor = mResListAdapter.SearchPrev();\r
293             if (cursor < 0)\r
294                 return;\r
295 \r
296             mResListPanel.setScrollItemPosition(cursor);\r
297         }\r
298 \r
299         private void UIElementListPanel_Loaded(object sender, RoutedEventArgs e)\r
300         {\r
301             this.mResListPanel.init();\r
302         }\r
303 \r
304         private void btnFontReduce_Click(object sender, RoutedEventArgs e)\r
305         {\r
306             mResListAdapter.ZoomOut();\r
307         }\r
308 \r
309         private void btnFontEnlarge_Click(object sender, RoutedEventArgs e)\r
310         {\r
311             mResListAdapter.ZoomIn();\r
312         }\r
313 \r
314         double mAutoScrollSliderValue = 1;\r
315         private void mAutoScrollRatioSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)\r
316         {\r
317             if (mAutoScrollRatio == null)\r
318                 return;\r
319 \r
320             double val = e.NewValue;\r
321             val *= val;\r
322             val /= 100;\r
323             mAutoScrollSliderValue = val;\r
324             string s =string.Format("Current Speed x{0:0.##}", val);\r
325             mAutoScrollRatio.Text = s;\r
326 \r
327             mResListPanel.setAutoScroll(true, val);\r
328         }\r
329 \r
330         private void mBtnPauseAutoPlay_Click(object sender, RoutedEventArgs e)\r
331         {\r
332             mBtnResumeAutoPlay.Visibility = System.Windows.Visibility.Visible;\r
333             mBtnPauseAutoPlay.Visibility = System.Windows.Visibility.Collapsed;\r
334             mResListPanel.pauseAutoScroll();\r
335         }\r
336 \r
337         private void mBtnResumeAutoPlay_Click(object sender, RoutedEventArgs e)\r
338         {\r
339             mBtnResumeAutoPlay.Visibility = System.Windows.Visibility.Collapsed;\r
340             mBtnPauseAutoPlay.Visibility = System.Windows.Visibility.Visible;\r
341             mResListPanel.resumeAutoScroll();\r
342         }\r
343         private void mBtnReverseAutoPlay_Click(object sender, RoutedEventArgs e)\r
344         {\r
345             mResListPanel.toggleScrollDirection();\r
346         }\r
347 \r
348     }\r
349 \r
350     \r
351 }\r