OSDN Git Service

Initial contents of nt2chview
[nt2chview/stable.git] / NT2chView45 / MainWindow_manipulate_ctrl.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Windows;\r
5 using System.Windows.Controls;\r
6 using System.Windows.Data;\r
7 using System.Windows.Media;\r
8 using System.Windows.Documents;\r
9 \r
10 using NT2chView.NtNet;\r
11 using NT2chView.NtFile;\r
12 using NT2chView.NtHtml;\r
13 using System.Threading;\r
14 using System.Windows.Threading;\r
15 using System.Windows.Controls.Primitives;\r
16 using System.Diagnostics;\r
17 using System.Collections.ObjectModel;\r
18 using System.Windows.Media.Imaging;\r
19 using System.IO;\r
20 using System.Windows.Input;\r
21 using NT2chCtrl;\r
22 using NT2chObject;\r
23 \r
24 \r
25 namespace NT2chView\r
26 {\r
27     public partial class MainWindow : Window\r
28     {\r
29         //List<string> mFavoriteBoardList = new List<string>();\r
30         //List<string> mFavoriteThreadList = new List<string>();\r
31 \r
32         public void AddGraphic(string path)\r
33         {\r
34             tabCtrlMain.SelectedItem = tabItemGraphics;\r
35             mGraphicsPanel.AddGraphic(path);\r
36         }\r
37 \r
38         public void OpenMoviePanel(string id)\r
39         {\r
40             tabCtrlMain.SelectedItem = tabItemMovie;\r
41             mMoviePanel.NavigateYoutube(id);\r
42 \r
43         }\r
44         void constructNgTabItem(TabItem ti)\r
45         {\r
46             NTNgItems ngItem = NTNgItems.getContext();\r
47             List<string> list;// = ngItem.getNgWords();\r
48             int idx = cmbNgEditKind.SelectedIndex;\r
49             switch (idx)\r
50             {\r
51                 case 0://word\r
52                     list = ngItem.getNgWords();\r
53                     break;\r
54                 case 1: // name\r
55                     list = ngItem.getNgNames();\r
56                     break;\r
57                 case 2: // id\r
58                     list = ngItem.getNgIds();\r
59                     break;\r
60                 default:\r
61                     return;\r
62             }\r
63     \r
64             StringBuilder sb = new StringBuilder(64);\r
65             foreach (string s in list)\r
66                 sb.Append(s).Append('\n');\r
67 \r
68             if(txtNgEdit != null)\r
69                 txtNgEdit.Text = sb.ToString();\r
70 \r
71         }\r
72 \r
73         /*void removeFavoriteThread(string description)\r
74         {\r
75             if (description.Trim().Length == 0)\r
76                 return;\r
77             int len = mFavoriteThreadList.Count;\r
78             int idx = 0;\r
79             for (; idx < len; idx++)\r
80             {\r
81                 if (mFavoriteThreadList[idx].Equals(description))\r
82                     break;\r
83             }\r
84             if (idx == len)\r
85                 return;\r
86 \r
87             mFavoriteThreadList.RemoveAt(idx);\r
88             \r
89 \r
90         }\r
91         void removeFavoriteBoard(string description)\r
92         {\r
93             if (description.Trim().Length == 0)\r
94                 return;\r
95             int len = mFavoriteBoardList.Count;\r
96             int idx = 0;\r
97             for (; idx < len; idx++)\r
98             {\r
99                 if (mFavoriteBoardList[idx].Equals(description))\r
100                     break;\r
101             }\r
102             if (idx == len)\r
103                 return;\r
104 \r
105             mFavoriteBoardList.RemoveAt(idx);\r
106 \r
107         }*/\r
108 \r
109 \r
110 \r
111         public void addFavoriteBoard(string description)\r
112         {\r
113             if (description.Trim().Length == 0)\r
114                 return;\r
115 \r
116             /*foreach (string s in mFavoriteBoardList)\r
117                 if (s.Equals(description))\r
118                     return;\r
119 \r
120             //ListBoxItem item = new ListBoxItem();\r
121             //item.Tag = description;\r
122             //item.Content = description;\r
123             mFavoriteBoardList.Add(description);*/\r
124             //NTFileAccess.addFavoriteBoardToFile(description);\r
125             NTFavoriteBoard fb = mFavoriteData.addBoardByDescription(description, false);\r
126             mFavoritePanel.addBoard(fb);\r
127 \r
128         }\r
129 \r
130         public void addFavoriteThread(NTThreadTitle thread)\r
131         {\r
132             string description = thread.mDat + NTTextUtiles.YEN_VALUE[0]\r
133                 + thread.mBoard.mName + NTTextUtiles.YEN_VALUE[0]\r
134                 + thread.Title;\r
135 \r
136             if (description.Trim().Length == 0)\r
137                 return;\r
138 \r
139             string[] values = description.Split(NTTextUtiles.YEN_VALUE);\r
140             if (values.Length < 3)\r
141                 return;\r
142 \r
143             NTFavoriteThread ft = mFavoriteData.addThreadByDescription(description, false, true);\r
144             if(ft == null)\r
145                 return;\r
146 \r
147             mFavoritePanel.addThread(ft);\r
148 \r
149 \r
150             /*foreach (string s in mFavoriteThreadList)\r
151                 if (s.Equals(description))\r
152                     return;\r
153 \r
154             mFavoriteThreadList.Add(description);*/\r
155 \r
156         }\r
157 \r
158 \r
159         public void removeFavoriteThread(NTThreadTitle thread)\r
160         {\r
161             string description = thread.mDat + NTTextUtiles.YEN_VALUE[0]\r
162                 + thread.mBoard.mName + NTTextUtiles.YEN_VALUE[0]\r
163                 + thread.Title;\r
164 \r
165             if (description.Trim().Length == 0)\r
166                 return;\r
167 \r
168             string[] values = description.Split(NTTextUtiles.YEN_VALUE);\r
169             if (values.Length < 3)\r
170                 return;\r
171 \r
172             int idx = mFavoriteData.findThread(thread.getBoard().getName(), thread.getDatName(), thread.getTitle());\r
173             if (idx < 0)\r
174                 return;\r
175 \r
176             NTFavoriteThread ft = mFavoriteData.getThreadList()[idx];\r
177             if (ft == null)\r
178                 return;\r
179 \r
180             mFavoritePanel.removeThread(ft);\r
181 \r
182 \r
183             if (!mFavoriteData.removeThreadByDescription(description, true))\r
184                 return;\r
185 \r
186             /*foreach (string s in mFavoriteThreadList)\r
187                 if (s.Equals(description))\r
188                     return;\r
189 \r
190             mFavoriteThreadList.Remove(description);*/\r
191 \r
192         }\r
193 \r
194         public void appendBoardToExternalCategoryTree(NTBoard board)\r
195         {\r
196             NTCategory exCate = NTDataRoot.getExternalBoards();\r
197             mCategoryPanel.addExternalCategory(exCate);\r
198             if (mCategoryPanel.isExternalCategorySelected())\r
199             {\r
200                 mBoardPanel.BoardTable = exCate.mBoardList;\r
201             }\r
202 \r
203         }\r
204 \r
205         public void removeBoardFromExternalCategoryTree(string boardName)\r
206         {\r
207             if (mCategoryPanel.isExternalCategorySelected())\r
208             {\r
209                 NTCategory exCate = NTDataRoot.getExternalBoards();\r
210                 mBoardPanel.BoardTable = exCate.mBoardList;\r
211             }\r
212 \r
213 \r
214         }\r
215 \r
216         //static readonly string[] LIST_COLUMN_HEADERS =\r
217        // { " No. ", "スレッドタイトル", "レス数 ", " 既読 "," 未読 ", "最終取得日", "最終書込日" };\r
218        // static readonly string[] LIST_COLUMN_HEADERS_PNAME = \r
219        // { "SeqNo", "Title", "ResCnt", "ReadCnt", "RemainCnt","LastMod", "LastWrite" };\r
220 #if false    \r
221         TabItem  constructResViewTabItem(NTThreadTitle thread)\r
222         {\r
223             int idx;\r
224             if (0 <= (idx = searchThreadFromTabItems(thread)))\r
225             {\r
226                 return tabCtrlDat.Items[idx] as TabItem;\r
227             }\r
228 \r
229             StackPanel sp = new StackPanel();\r
230             sp.Orientation = Orientation.Horizontal;\r
231             sp.MaxWidth = 250;\r
232             sp.Tag = thread;\r
233             sp.Margin = new Thickness(0);\r
234             ContextMenu cm = new System.Windows.Controls.ContextMenu();\r
235             sp.ContextMenu = cm;\r
236             setThreadTabHeaderContextMenu(thread, sp.ContextMenu);\r
237 \r
238             \r
239             sp.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(threadTab_MouseLeftButtonDown);\r
240             sp.MouseEnter += sp_MouseEnter;\r
241             sp.MouseLeave += sp_MouseLeave;\r
242             TextBlock tb = new TextBlock();\r
243             string title = thread.Title.Trim();\r
244             if (title.Length > 20)\r
245                 tb.Text = title.Substring(0, 20);\r
246             else\r
247                 tb.Text = title;\r
248 \r
249             tb.Tag = tb.Text;\r
250 \r
251             tb.ContextMenu = cm;\r
252             sp.Children.Add(tb);\r
253             tb = new TextBlock();\r
254             tb.Text = "×";\r
255             tb.VerticalAlignment = System.Windows.VerticalAlignment.Center;\r
256             tb.FontSize = 8;\r
257             Button btn = new Button();\r
258             btn.Content = tb;\r
259             btn.Tag = thread;\r
260             btn.Click += new RoutedEventHandler(btnDatTabItemClose_Click);\r
261             //btn.MouseEnter += btn_MouseEnter;\r
262 \r
263             \r
264             sp.Children.Add(btn);\r
265             btn.Width = 0;\r
266             btn.Height = 0;\r
267 \r
268             TabItem tabItem = new TabItem();\r
269             tabItem.Header = sp;\r
270             tabItem.Tag = thread;\r
271 \r
272             tabItem.GotFocus += new RoutedEventHandler(tabItem_GotFocus);\r
273             tabCtrlDat.Items.Add(tabItem);\r
274 \r
275             return tabItem;\r
276         }\r
277 #endif\r
278         void sp_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)\r
279         {\r
280             StackPanel sp = sender as StackPanel;\r
281             if (sp == null)\r
282                 return;\r
283             if (sp.Children.Count < 2)\r
284                 return;\r
285             TextBlock tb = sp.Children[0] as TextBlock;\r
286             if (tb == null)\r
287                 return;\r
288             Button btn = sp.Children[1] as Button;\r
289             if (null == btn)\r
290                 return;\r
291 \r
292             string s = tb.Tag as string;\r
293             if (s != null)\r
294             {\r
295                 //if (s.Length > 20)\r
296                 //    s.Substring(0, 20);\r
297                  tb.Text = s;\r
298             }\r
299 \r
300             btn.Width = 0;\r
301             btn.Height = 0;\r
302         }\r
303 \r
304         void sp_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)\r
305         {\r
306             StackPanel sp = sender as StackPanel;\r
307             if (sp == null)\r
308                 return;\r
309             if(sp.Children.Count < 2)\r
310                 return;\r
311             TextBlock tb = sp.Children[0] as TextBlock;\r
312             if (tb == null)\r
313                 return;\r
314             Button btn = sp.Children[1] as Button;\r
315             if (null == btn)\r
316                 return;\r
317 \r
318             string s = tb.Tag as string;\r
319             if (s != null)\r
320             {\r
321                 //if (s.Length > 20)\r
322                //     s.Substring(0, 20);\r
323 \r
324                 int len = s.Length;\r
325                 //len = (len < 4) ? 2 : len - 1;\r
326                 s = s.Substring(0, --len);\r
327                 tb.Text = s;\r
328 \r
329             }\r
330 \r
331             btn.Width = 12;\r
332             btn.Height = 12;\r
333         }\r
334 \r
335        /* void btn_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)\r
336         {\r
337             Button btn = sender as Button;\r
338             if (btn == null)\r
339                 return;\r
340 \r
341             ContextMenu cm = btn.ContextMenu;\r
342             if (null == cm)\r
343                 return;\r
344 \r
345             //throw new NotImplementedException();\r
346         }*/\r
347 \r
348         DateTime mMouseMovetime = DateTime.Now;\r
349 \r
350         void document_MouseMove(object sender, MouseEventArgs e)\r
351         {\r
352             //NTDebug.l("+++ AAA +++");\r
353             DateTime dt = DateTime.Now;\r
354             TimeSpan ts = dt.Subtract(mMouseMovetime);\r
355             if(2 < ((int)(ts.TotalSeconds))){\r
356                 //NTDebug.l("+++ BBB +++");\r
357                 mMouseMovetime = DateTime.Now;\r
358             }\r
359             //throw new NotImplementedException();\r
360         }\r
361 \r
362         void UpdateThread(NTThreadTitle thread)\r
363         {\r
364             NTBoard board = thread.mBoard;\r
365             //int oldReadCnt = thread.mResCnt;\r
366 \r
367             if (board.mMachiBBS)\r
368             {\r
369                 //updateResViewTabItemMachiBBS(thread);\r
370                 return;\r
371             }\r
372 \r
373             //int idx;\r
374             //if (0 > (idx = searchThreadFromTabItems(thread)))\r
375             //{\r
376             //    return;\r
377             //}\r
378 \r
379 \r
380 \r
381             thread.mPrevReadCnt = thread.ReadCnt;\r
382 \r
383 \r
384             if (!NTHttpAccess.getDat(board.mAddress, board.mName, thread.mDat, thread.Title))\r
385             {\r
386                 NTDebug.l("getting the dat data failed.");\r
387                 return;\r
388             }\r
389 \r
390             string strDat = NTFileAccess.retrieveDatFromFile(board.mName, thread.mDat);\r
391             if (null == strDat)\r
392             {\r
393                 return;\r
394             }\r
395 \r
396 \r
397             thread.parseDat(strDat);\r
398             thread.updateReadCntOnCloud();\r
399 \r
400             int numRead;// = thread.ReadCnt;\r
401             int[] writes;\r
402             int[] bookmarkes;\r
403             string lastWrite;\r
404             NTFileAccess.retrieveDatAttrToFile(board.mName, thread.mDat,\r
405                 out numRead, out writes, out bookmarkes, out lastWrite);\r
406 \r
407 \r
408             if (thread.ReadCnt > thread.mPrevReadCnt)\r
409             {\r
410                 int wroteNo = thread.findWroteMsg(thread.mPrevReadCnt + 1);\r
411                 if (wroteNo >= 0)\r
412                 {\r
413                     thread.addWriteTag(wroteNo);\r
414                     thread.addBookmark(wroteNo);\r
415                     writes = thread.mWriteNoList.ToArray();\r
416                     bookmarkes = thread.mBookmarkList.ToArray();\r
417                     NTRes res = thread.findRes(wroteNo);\r
418                     if (res != null)\r
419                     {\r
420                         res.mWroteMsg = true;\r
421                         res.mBookmark = true;\r
422                     }\r
423 \r
424                 }\r
425             }\r
426 \r
427 \r
428             NTFileAccess.storeDatAttrToFile(board.mName, thread.mDat, thread.ResCnt, writes, bookmarkes);\r
429             thread.LastMod = DateTime.Now.ToString();\r
430 \r
431 \r
432             /*bool readNew;\r
433             if (numRead > 0 && thread.mPrevReadCnt == numRead)\r
434                 readNew = false;\r
435             else\r
436                 readNew = true;*/\r
437 \r
438 \r
439             thread.mPrevReadCnt = numRead;\r
440 \r
441             mResPanel.OpenThread(thread);\r
442 \r
443             if (numRead < thread.ResCnt)\r
444             {\r
445                 Thread th = new Thread(ResTabUpdate);\r
446                 th.Start();\r
447             }\r
448 \r
449             mFavoritePanel.OnNotifyBoardUpdate(board);\r
450 \r
451 \r
452         }\r
453         public void ResTabUpdate()\r
454         {\r
455             Thread.Sleep(1000);\r
456 \r
457             this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,\r
458                 (ThreadStart)delegate()\r
459             {\r
460                 mResPanel.JumpToNew();\r
461                 IThread ithread = mResPanel.getCurrentThread();\r
462                 NTThreadTitle thread = ithread as NTThreadTitle;\r
463                 if (thread != null)\r
464                 {\r
465                     thread.mPrevReadCnt = thread.ReadCnt;\r
466                     NTBoard board = thread.mBoard;\r
467                     if(board != null)\r
468                         mFavoritePanel.OnNotifyBoardUpdate(board);\r
469 \r
470                 }\r
471 \r
472             });\r
473 \r
474 \r
475         }\r
476 \r
477         public void NgEdit_setResSection(NTRes res)\r
478         {\r
479             tabItemNgEdit.IsSelected = true;\r
480 \r
481             string name = res.mName;\r
482             string id = res.mId;\r
483             string msg = res.mMsg;\r
484 \r
485             txtNgNameEdit.Text = name;\r
486             txtNgIdEdit.Text = id;\r
487             txtNgWordEdit.Text = NTTextFormat.removeTag(msg);// parseResMsgForNgWord(msg);\r
488 \r
489         }\r
490         void lv_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)\r
491         {\r
492             NTDebug.l("R-Button Down on LIstView.");\r
493             //throw new NotImplementedException();\r
494         }\r
495 \r
496 \r
497         void SubjectListHeader_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)\r
498         {\r
499             TextBlock tb = sender as TextBlock;\r
500             if (tb == null)\r
501                 return;\r
502 \r
503             ListView lv = tb.Tag as ListView;\r
504             if (lv == null)\r
505                 return;\r
506 \r
507             NTBoard board = lv.Tag as NTBoard;\r
508             if (board == null)\r
509                 return;\r
510 \r
511             ObservableCollection<NTThreadTitle> list = lv.ItemsSource as ObservableCollection<NTThreadTitle>;\r
512             if (list == null)\r
513                 return;\r
514 \r
515             List<NTThreadTitle> sortList = new List<NTThreadTitle>();\r
516             foreach (NTThreadTitle tt in list)\r
517                 sortList.Add(tt);\r
518 \r
519 \r
520             list.Clear();\r
521 \r
522             //board.mThreadListSortStack;\r
523             foreach (string s in board.mThreadListSortStack)\r
524             {\r
525                 if (s.Equals(tb.Text))\r
526                 {\r
527                     board.mThreadListSortStack.Remove(s);\r
528                     break;\r
529                 }\r
530             }\r
531             //board.mThreadListSortStack.Add(tb.Text);\r
532 \r
533             //foreach (string s in board.mThreadListSortStack)\r
534             //{\r
535 \r
536                 switch (tb.Text)\r
537                 {\r
538                     case " No. ":\r
539                         sortList.Sort(SubjectListSortBySeqNo);\r
540                         break;\r
541                     case "スレッドタイトル":\r
542                         sortList.Sort(SubjectListSortByTitle);\r
543                         break;\r
544                     case "レス数 ":\r
545                         sortList.Sort(SubjectListSortByResCnt);\r
546                         break;\r
547                     case " 既読 ":\r
548                         sortList.Sort(SubjectListSortByReadCnt);\r
549                         break;\r
550                     case " 未読 ":\r
551                         sortList.Sort(SubjectListSortByRemainCnt);\r
552                         break;\r
553                     case "最終取得日":\r
554                         sortList.Sort(SubjectListSortByLastMod);\r
555                         break;\r
556                     case "最終書込日":\r
557                         sortList.Sort(SubjectListSortByLastWrite);\r
558                         break;\r
559                 }\r
560             //}\r
561 \r
562             foreach (NTThreadTitle tt in sortList)\r
563                 list.Add(tt);\r
564         }\r
565 \r
566         static int SubjectListSortBySeqNo(NTThreadTitle thread1, NTThreadTitle thread2)\r
567         {\r
568             return thread1.SeqNo - thread2.SeqNo;\r
569         }\r
570 \r
571         static int SubjectListSortByTitle(NTThreadTitle thread1, NTThreadTitle thread2)\r
572         {\r
573             return thread2.Title.CompareTo(thread1.Title);\r
574         }\r
575         static int SubjectListSortByResCnt(NTThreadTitle thread1, NTThreadTitle thread2)\r
576         {\r
577             return thread2.ResCnt - thread1.ResCnt;\r
578         }\r
579         static int SubjectListSortByReadCnt(NTThreadTitle thread1, NTThreadTitle thread2)\r
580         {\r
581             return thread2.ReadCnt - thread1.ReadCnt;\r
582          }\r
583         static int SubjectListSortByRemainCnt(NTThreadTitle thread1, NTThreadTitle thread2)\r
584         {\r
585             return thread2.RemainCnt - thread1.RemainCnt;\r
586         }\r
587         static int SubjectListSortByLastMod(NTThreadTitle thread1, NTThreadTitle thread2)\r
588         {\r
589             DateTime dt1 = DateTime.MinValue;\r
590             DateTime dt2 = DateTime.MinValue;\r
591             try\r
592             {\r
593                 dt1 = DateTime.Parse(thread1.LastMod);\r
594             }\r
595             catch { }\r
596             try\r
597             {\r
598                 dt2 = DateTime.Parse(thread2.LastMod);\r
599             }\r
600             catch { }\r
601 \r
602             return dt2.CompareTo(dt1);\r
603         }\r
604 \r
605         static int SubjectListSortByLastWrite(NTThreadTitle thread1, NTThreadTitle thread2)\r
606         {\r
607             DateTime dt1 = DateTime.MinValue;\r
608             DateTime dt2 = DateTime.MinValue;\r
609             try\r
610             {\r
611                 dt1 = DateTime.Parse(thread1.LastWrite);\r
612             }\r
613             catch { }\r
614             try\r
615             {\r
616                 dt2 = DateTime.Parse(thread2.LastWrite);\r
617             }\r
618             catch { }\r
619 \r
620             return dt2.CompareTo(dt1);\r
621         }\r
622 \r
623 \r
624 \r
625         void lv_SelectionChanged(object sender, SelectionChangedEventArgs e)\r
626         {\r
627             //NTDebug.l("TEST");\r
628             ListView lv;\r
629             //lv.SelectionMode = SelectionMode.Single;\r
630             //lv.\r
631             if (!(sender is ListView))\r
632                 return;\r
633 \r
634             lv = (ListView)sender;\r
635             object o = lv.SelectedItem;\r
636             if (!(o is NTThreadTitle))\r
637                 return;\r
638 \r
639             NTThreadTitle tt = (NTThreadTitle)o;\r
640 \r
641             OpenNewThread(tt);\r
642         }\r
643 \r
644 \r
645         public bool OpenNewBoard(NTBoard board)\r
646         {\r
647             string strSubject = null;\r
648             if (!board.mDataInit)\r
649             {\r
650 \r
651                 if (!NTFileAccess.isSubjectExsists(board.mName))\r
652                     if (!NTHttpAccess.getSubject(board.mAddress, board.mName))\r
653                         return false;\r
654 \r
655                 strSubject = NTFileAccess.retrieveSubjectDataFromFile(board.mName);\r
656                 if (strSubject == null)\r
657                     return false;\r
658 \r
659                 if (!board.parseSubjectData(strSubject, mFavoriteData))\r
660                     return false;\r
661             }\r
662             return true;\r
663         }\r
664 \r
665         public void OpenNewThread(NTThreadTitle thread)\r
666         {\r
667             if (thread == null)\r
668                 return;\r
669 \r
670             bool bRet = false;\r
671             string strDat;\r
672             string strDatName = thread.mDat;\r
673 \r
674             NTBoard board = thread.mBoard;\r
675 \r
676             if (board.mMachiBBS)\r
677             {\r
678                 bRet = NTHttpAccess.getMachiBBSDat(board.mAddress, board.mName, thread.mDat, thread.Title);\r
679                 strDatName = NTHttpUtils.ridSuffixFromCgiName(thread.mDat);\r
680                 strDat = NTFileAccess.retrieveDatFromFile(board.mName, strDatName);\r
681                 if (null == strDat)\r
682                     return;\r
683             }\r
684             else\r
685             {\r
686                 if (!thread.mLocalDat)\r
687                 {\r
688                     bRet = NTHttpAccess.getDat(board.mAddress, board.mName, thread.mDat, thread.Title);\r
689                 }\r
690                 else if (NTUserPreference.MaruIsEnabled)\r
691                 {\r
692                     string sid = NTMaru.getSessionId();\r
693                     bRet = NTHttpAccess.getDatFromKako(board.mAddress, board.mName,\r
694                         thread.mDat, thread.Title, sid);\r
695                 }\r
696                 strDat = NTFileAccess.retrieveDatFromFile(board.mName, thread.mDat);\r
697                 if (null == strDat)\r
698                     return;\r
699             }\r
700 \r
701             if (thread.Title.Length == 0)\r
702             {\r
703                 string strTitle = NTFileAccess.retrieveTitleFromDat(strDat);\r
704                 if (strTitle != null)\r
705                 {\r
706                     thread.Title = strTitle;\r
707                     NTFileAccess.storeDatTitle(board.mName, strDatName/*thread.mDat*/, strTitle);\r
708                 }\r
709             }\r
710             bool cloudData = false;\r
711             if (NTUserPreference.NTCloudIsEnabled)\r
712             {\r
713                 string strThreadAttr ;\r
714                 if (NTUserPreference.NTUserCloudIsEnabled)\r
715                 {\r
716                     strThreadAttr = NTHttpAccess.UserCloudQueryAttrValue(board.mName, thread.mDat);\r
717                 }\r
718                 else\r
719                 {\r
720                     strThreadAttr = NTHttpAccess.ntQueryAttrValue(board.mName, thread.mDat);\r
721                 }\r
722                 if (strThreadAttr != null)\r
723                 {\r
724                     cloudData = true;\r
725                     thread.parseAttr(strThreadAttr);\r
726                 }\r
727             }\r
728 \r
729 \r
730             thread.mPrevReadCnt = thread.ReadCnt;\r
731 \r
732             thread.parseDat(strDat);\r
733 \r
734 \r
735             if (bRet)\r
736                 thread.updateReadCntOnCloud();\r
737 \r
738             int numRead = -1;\r
739             int[] writes;\r
740             int[] bookmarkes;\r
741             string lastWrite;\r
742             NTFileAccess.retrieveDatAttrToFile(board.mName, strDatName,//thread.mDat,\r
743                 out numRead, out writes, out bookmarkes, out lastWrite);\r
744             if (cloudData)\r
745             {\r
746                 writes = thread.mWriteNoList.ToArray();\r
747                 bookmarkes = thread.mBookmarkList.ToArray();\r
748             }\r
749             else\r
750             {\r
751                 thread.mWriteNoList.Clear();\r
752                 thread.mWriteNoList.AddRange(writes);\r
753                 thread.mBookmarkList.Clear();\r
754                 thread.mBookmarkList.AddRange(bookmarkes);\r
755 \r
756             }\r
757             thread.setupBookmark();\r
758             thread.setupWriteTag();\r
759             if (numRead < thread.ResCnt || cloudData)\r
760             {\r
761                 NTFileAccess.storeDatAttrToFile(board.mName, strDatName/*thread.mDat*/, thread.ResCnt, writes, bookmarkes);\r
762                 thread.LastMod = DateTime.Now.ToString();\r
763             }\r
764             else\r
765             {\r
766                 thread.LastMod = lastWrite;\r
767             }\r
768             thread.mPrevReadCnt = (thread.mPrevReadCnt < numRead) ? numRead : thread.mPrevReadCnt;\r
769 \r
770             \r
771             mResPanel.OpenThread(thread);\r
772 \r
773             if (numRead < thread.ResCnt)\r
774             {\r
775                 Thread th = new Thread(ResTabUpdate);\r
776                 th.Start();\r
777             }\r
778 \r
779 #if false\r
780             TabItem item = constructResViewTabItem(tt/*, true*/);\r
781             if (item != null)\r
782             {\r
783                 if (item.Content == null || tt.ResCnt > tt.ReadCnt)\r
784                 {\r
785                     string savedTitle = tt.Title;\r
786                     constructResContent(item);\r
787                     if (savedTitle.Length == 0 && tt.Title.Length > 0)\r
788                     {\r
789                         StackPanel sp = item.Header as StackPanel;\r
790                         if (sp != null)\r
791                         {\r
792                             if(sp.Children.Count > 0)\r
793                             {\r
794                                 TextBlock tb = sp.Children[0] as TextBlock;\r
795                                 if (tb != null)\r
796                                 {\r
797                                     if (tt.Title.Length > 20)\r
798                                         tb.Text = tt.Title.Substring(0, 20);\r
799                                     else\r
800                                         tb.Text = tt.Title;\r
801                                     tb.Tag = tb.Text;\r
802                                 }\r
803                             }\r
804                         }\r
805                     }\r
806                 }\r
807                 tabCtrlDat.SelectedItem = item;\r
808             }\r
809  #endif\r
810         }\r
811 \r
812        \r
813 #if false\r
814         void UpdateBoardTabItem(NTBoard board)\r
815         {\r
816 \r
817             int idx;\r
818             if (0 > (idx = searchBoardFromTabItemIndex(board)))\r
819             {\r
820                 MessageBox.Show("開かれた板が見つかりません。");\r
821                 return;\r
822             }\r
823             \r
824             TabItem ti = (TabItem)tabCtrlSubject.Items[idx];\r
825 \r
826             constructBoardTabItemContent(board, ti);\r
827 \r
828             //ti.Tag = board;\r
829 \r
830 \r
831 \r
832         }\r
833 #endif\r
834 #if false\r
835         void constructBoardTabItem(NTBoard board /*, bool fromWeb*/)\r
836         {\r
837             int idx;\r
838             if (0 <= (idx = searchBoardFromTabItemIndex(board)))\r
839             {\r
840                 tabCtrlSubject.SelectedIndex = idx;\r
841                 return;\r
842             }\r
843             /*if (fromWeb)\r
844             {\r
845                 if (!NTHttpAccess.getSubject(board.mAddress, board.mName))\r
846                     return;\r
847             }\r
848             \r
849             string strSubject = NTFileAccess.retrieveSubjectDataFromFile(board.mName);\r
850 \r
851             if (null == strSubject)\r
852                 return;\r
853             \r
854             if (!board.parseSubjectData(strSubject))\r
855                 return;\r
856             */\r
857 \r
858             TabItem tabItem = new TabItem();\r
859             StackPanel sp = new StackPanel();\r
860             sp.Orientation = Orientation.Horizontal;\r
861             sp.MaxWidth = 200;\r
862             ContextMenu cm = new System.Windows.Controls.ContextMenu();\r
863             sp.ContextMenu = cm;\r
864             setBoardTabHeaderContextMenu(board, cm);\r
865             sp.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(boardTab_MouseLeftButtonDown);\r
866             //sp.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(sp_MouseLeftButtonUp);\r
867             sp.MouseEnter +=sp_MouseEnter;\r
868             sp.MouseLeave +=sp_MouseLeave;\r
869             sp.Tag = board;\r
870             sp.Margin = new Thickness(0);\r
871 \r
872             TextBlock tb = new TextBlock();\r
873             string boardName = board.mName;\r
874             if(boardName.Length < 3)\r
875                 boardName = " " + boardName + " ";\r
876             else if(boardName.Length == 3)\r
877                 boardName = boardName + " ";\r
878             tb.Text = boardName;\r
879             tb.Tag = boardName;\r
880             sp.Children.Add(tb);\r
881             tb = new TextBlock();\r
882             tb.Text = "×";\r
883             tb.VerticalAlignment = System.Windows.VerticalAlignment.Center;\r
884             tb.FontSize = 8;\r
885             tb.Tag = board;\r
886             Button btn = new Button();\r
887             btn.Content = tb;\r
888             btn.Tag = board;\r
889             btn.Width = 0;\r
890             btn.Height = 0;\r
891             btn.Click += new RoutedEventHandler(btnSubjectTabItemClose_Click);\r
892             sp.Children.Add(btn);\r
893 \r
894             tabItem.Header = sp;\r
895             tabItem.Tag = board;\r
896             tabCtrlSubject.Items.Add(tabItem);\r
897             tabCtrlSubject.SelectionChanged += tabCtrlSubject_SelectionChanged;\r
898         }\r
899 #endif\r
900         //NTThreadTitle mSelectedThreadTitle = null;\r
901         //NTBoard mSelectedBoard = null;\r
902 \r
903 #if false\r
904         private int mDoubleCickTime = System.Windows.Forms.SystemInformation.DoubleClickTime;\r
905         private int mFirstClickTime = 0;\r
906         void boardTab_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)\r
907         {\r
908             NTDebug.l("Enterinf MouseDown");\r
909 \r
910             if (mSelectedBoard == null)\r
911             {\r
912                 if (sender is StackPanel)\r
913                 {\r
914                     StackPanel sp = (StackPanel)sender;\r
915                     if (sp.Tag is NTBoard)\r
916                     {\r
917                         mSelectedBoard = (NTBoard)sp.Tag;\r
918                         DateTime dt = DateTime.Now;\r
919                         mFirstClickTime = dt.Second*1000 + dt.Millisecond;\r
920                     }\r
921                 }\r
922             }\r
923             else\r
924             {\r
925                 DateTime dt = DateTime.Now;\r
926                 int clickTime =  dt.Second*1000 + dt.Millisecond;\r
927                 clickTime -= mFirstClickTime;\r
928                 if (clickTime <= mDoubleCickTime)\r
929                 {\r
930                     if (sender is StackPanel)\r
931                     {\r
932                         StackPanel sp = (StackPanel)sender;\r
933                         if (sp.Tag is NTBoard)\r
934                         {\r
935                             if (mSelectedBoard.Equals(sp.Tag))\r
936                             {\r
937                                 NTDebug.l("Dbl Clicked!");\r
938                                 UpdateBoardTabItem(mSelectedBoard);\r
939                             }\r
940                         }\r
941                     }\r
942                     mSelectedBoard = null;\r
943                     mFirstClickTime = 0;\r
944                 }\r
945                 else\r
946                 {\r
947                     if (sender is StackPanel)\r
948                     {\r
949                         StackPanel sp = (StackPanel)sender;\r
950                         if (sp.Tag is NTBoard)\r
951                         {\r
952                             mSelectedBoard = (NTBoard)sp.Tag;\r
953                             mFirstClickTime = dt.Second * 1000 + dt.Millisecond;\r
954                         }\r
955                     }\r
956                 }\r
957             }\r
958         }\r
959 \r
960         void threadTab_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)\r
961         {\r
962             NTDebug.l("Entering MouseDown");\r
963             if (mSelectedThreadTitle == null)\r
964             {\r
965                 if (sender is StackPanel)\r
966                 {\r
967                     StackPanel sp = (StackPanel)sender;\r
968                     if (sp.Tag is NTThreadTitle)\r
969                     {\r
970                         mSelectedThreadTitle = (NTThreadTitle)sp.Tag;\r
971                         DateTime dt = DateTime.Now;\r
972                         mFirstClickTime = dt.Second * 1000 + dt.Millisecond;\r
973                     }\r
974                 }\r
975             }\r
976             else\r
977             {\r
978                 DateTime dt = DateTime.Now;\r
979                 int clickTime = dt.Second * 1000 + dt.Millisecond;\r
980                 clickTime -= mFirstClickTime;\r
981                 if (clickTime <= mDoubleCickTime)\r
982                 {\r
983                     if (sender is StackPanel)\r
984                     {\r
985                         StackPanel sp = (StackPanel)sender;\r
986                         if (sp.Tag is NTThreadTitle)\r
987                         {\r
988                             if (mSelectedThreadTitle.Equals(sp.Tag))\r
989                             {\r
990                                 NTDebug.l("Dbl Clicked!");\r
991                                 //UpdateBoardTabItem(mSelectedBoard);\r
992                                 //updateResViewTabItem(mSelectedThreadTitle);\r
993                             }\r
994                         }\r
995                     }\r
996                     mSelectedThreadTitle = null;\r
997                     mFirstClickTime = 0;\r
998                 }\r
999                 else\r
1000                 {\r
1001                     if (sender is StackPanel)\r
1002                     {\r
1003                         StackPanel sp = (StackPanel)sender;\r
1004                         if (sp.Tag is NTThreadTitle)\r
1005                         {\r
1006                             mSelectedThreadTitle = (NTThreadTitle)sp.Tag;\r
1007                             mFirstClickTime = dt.Second * 1000 + dt.Millisecond;\r
1008                         }\r
1009                     }\r
1010                 }\r
1011             }\r
1012         }\r
1013 \r
1014         public NTThreadTitle findSelectedThreadTitle()\r
1015         {\r
1016             object o = tabCtrlDat.SelectedItem;\r
1017             TabItem item = o as TabItem;\r
1018             if(item == null)\r
1019                 return null;\r
1020 \r
1021             NTDebug.l(item.Header.ToString());\r
1022             object o2 = item.Tag;\r
1023             NTThreadTitle thread = o2 as NTThreadTitle;\r
1024             return thread;\r
1025 \r
1026         }\r
1027 #endif\r
1028 \r
1029 \r
1030         void storeOpenedBoardList()\r
1031         {\r
1032             List<IBoard> boardList = mSubjectPanel.QueryOpenedBoardList();\r
1033             if (boardList == null)\r
1034                 return;\r
1035             int cnt = boardList.Count;\r
1036             string[] list = new string[cnt];\r
1037             for (int i = 0; i < cnt; i++)\r
1038             {\r
1039                 list[i] = boardList[i].getName();\r
1040             }\r
1041             \r
1042             /*int cnt = tabCtrlSubject.Items.Count;\r
1043             string[] list = new string[cnt];\r
1044             for (int i = 0; i < cnt; i++)\r
1045             {\r
1046                 object o = tabCtrlSubject.Items[i];\r
1047 \r
1048                 if (!(o is TabItem))\r
1049                     return;\r
1050                 if (!((((TabItem)o).Tag) is NTBoard))\r
1051                     return;\r
1052 \r
1053                 NTBoard b = (NTBoard)(((TabItem)o).Tag);\r
1054                 list[i] = b.mName;\r
1055 \r
1056             }*/\r
1057             NTPersistentFileAccess.storeOpenedBoards(list);\r
1058 \r
1059         }\r
1060 #if false\r
1061         void storeOpenedThreadList()\r
1062         {\r
1063 \r
1064             int cnt = tabCtrlDat.Items.Count;\r
1065             string[] list = new string[cnt];\r
1066             for (int i = 0; i < cnt; i++)\r
1067             {\r
1068                 object o = tabCtrlDat.Items[i];\r
1069 \r
1070                 if (!(o is TabItem))\r
1071                     return;\r
1072                 if (!((((TabItem)o).Tag) is NTThreadTitle))\r
1073                     return;\r
1074 \r
1075                 NTThreadTitle tt = (NTThreadTitle)(((TabItem)o).Tag);\r
1076                 list[i] =tt.mDat + "," + tt.mBoard.mName;\r
1077 \r
1078             }\r
1079             NTPersistentFileAccess.storeOpenedThreads(list);\r
1080 \r
1081         }\r
1082 \r
1083 \r
1084         int searchBoardFromTabItemIndex(NTBoard board)\r
1085         {\r
1086             for (int i = 0; i < tabCtrlSubject.Items.Count; i++)\r
1087             {\r
1088                 object o = tabCtrlSubject.Items[i];\r
1089 \r
1090                 if (!(o is TabItem))\r
1091                     continue;\r
1092                 if (!((((TabItem)o).Tag) is NTBoard))\r
1093                     continue;\r
1094 \r
1095                 NTBoard b = (NTBoard)(((TabItem)o).Tag);\r
1096 \r
1097                 if (board.mName.Equals(b.mName))\r
1098                     return i;\r
1099             }\r
1100             return -1;\r
1101         }\r
1102 \r
1103         int searchTabItemIndexFromTabCtrl(TabControl ctrl, TabItem item)\r
1104         {\r
1105             for (int i = 0; i < ctrl.Items.Count; i++)\r
1106             {\r
1107                 if (item.Equals(tabCtrlDat.Items[i]))\r
1108                     return i;\r
1109             }\r
1110             return -1;\r
1111         }\r
1112 \r
1113         TabItem searchBoardFromTabItem(NTBoard board)\r
1114         {\r
1115             int idex = searchBoardFromTabItemIndex(board);\r
1116             if (idex < 0)\r
1117                 return null;\r
1118 \r
1119             return  tabCtrlSubject.Items[idex] as TabItem;\r
1120         }\r
1121 #endif\r
1122 \r
1123         int searchThreadFromTabItems(NTThreadTitle thread)\r
1124         {\r
1125 #if false\r
1126             for (int i = 0; i < tabCtrlDat.Items.Count; i++)\r
1127             {\r
1128                 object o = tabCtrlDat.Items[i];\r
1129 \r
1130                 if (!(o is TabItem))\r
1131                     continue;\r
1132                 if (!((((TabItem)o).Tag) is NTThreadTitle))\r
1133                     continue;\r
1134 \r
1135                 NTThreadTitle tt = (NTThreadTitle)(((TabItem)o).Tag);\r
1136 \r
1137                 if (thread.Title.Equals(tt.Title))\r
1138                     return i;\r
1139             }\r
1140 #endif\r
1141             return -1;\r
1142         }\r
1143 #if false\r
1144         public void removeThreadFromTabCtrl(NTThreadTitle tt)\r
1145         {\r
1146 \r
1147             int idx = searchThreadFromTabItems(tt);\r
1148             if (idx < 0)\r
1149                 return;\r
1150 \r
1151             tabCtrlDat.Items.RemoveAt(idx);\r
1152 \r
1153             int cnt = tabCtrlDat.Items.Count;\r
1154             if (cnt > 0)\r
1155             {\r
1156                 if (tabCtrlDat.SelectedIndex < 0)\r
1157                 {\r
1158                     tabCtrlDat.SelectedIndex = cnt - 1;\r
1159                 }\r
1160                 else\r
1161                 {\r
1162                     TabItem item = tabCtrlDat.SelectedItem as TabItem;\r
1163                     if (item == null)\r
1164                         return;\r
1165 \r
1166                     if (item.Content == null)\r
1167                         constructResContent(item);\r
1168 \r
1169 \r
1170                 }\r
1171             }\r
1172 \r
1173         }\r
1174 #endif\r
1175         public static ScrollViewer findScrollViewer(FlowDocumentScrollViewer flowDocumentScrollViewer)\r
1176         {\r
1177             if (VisualTreeHelper.GetChildrenCount(flowDocumentScrollViewer) == 0)\r
1178             {\r
1179                 return null;\r
1180             }\r
1181 \r
1182             // Border is the first child of first child of a ScrolldocumentViewer \r
1183             DependencyObject firstChild = VisualTreeHelper.GetChild(flowDocumentScrollViewer, 0);\r
1184             if (firstChild == null)\r
1185             {\r
1186                 return null;\r
1187             }\r
1188 \r
1189             Decorator border = VisualTreeHelper.GetChild(firstChild, 0) as Decorator;\r
1190 \r
1191             if (border == null)\r
1192             {\r
1193                 return null;\r
1194             }\r
1195 \r
1196             return border.Child as ScrollViewer;\r
1197         } \r
1198     }\r
1199 }\r